Ich versuche, ein kleines Roslyn-Util zu schreiben, um Variablen/Mitglieder/Parameter im Projekt umzubenennen. Es scheint die beste Vorgehensweise ist Renamer.RenameSymbolAsync-Methode. Um es zu benutzen, brauche ich eine Lösung und ein semantisches Symbol. Bisher habe ich Schwierigkeiten, diese Informationen zu bekommen. Hier ist, was ich versuchte, so weitGet Symbol für ParameterSyntax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.FindSymbols;
using Microsoft.CodeAnalysis.MSBuild;
using Microsoft.CodeAnalysis.Rename;
using Microsoft.CodeAnalysis.Text;
namespace PlayCodeAnalysis
{
class Program
{
static void Main(string[] args)
{
var solutionPath = @"D:\Development\lams\src\Lams.sln";
var workspace = MSBuildWorkspace.Create();
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
var doc = solution.Projects.First().Documents.First();
var model = doc.GetSemanticModelAsync().Result;
var syntax = doc.GetSyntaxRootAsync().Result;
var s = syntax.DescendantNodes().OfType<ParameterSyntax>().ToList();
var symbol = model.GetSymbolInfo(s[0]).Symbol;
//Renamer.RenameSymbolAsync(solution,)
}
}
}
Das Problem, das ich habe, ist, dass symbol
endet leer zu sein, ich bin nicht sicher, warum. s
wird korrekt in eine Liste aller Parameter in der Datei aufgelöst, aber ich kann sie nicht in ein Symbol konvertieren, das an den Renamer übergeben wird.
Das Dokument, das wie folgt aussieht in diesem speziellen Fall ausgerichtet wird, und die s[0]
in diesem Fall endet inCollection
sein:
using System.Collections.Generic;
using System.Data.Entity;
using System.Threading.Tasks;
namespace System.Linq
{
public static class AsyncEnumerable
{
public static async Task<ILookup<TKey, T>> ToLookupAsync<T, TKey>(this Task<IEnumerable<T>> inCollection, Func<T, TKey> inKeySelector)
{
return (await inCollection.ConfigureAwait(false)).ToLookup(inKeySelector);
}
}
}
Korrekt. Verwenden Sie 'GetDeclaredSymbol' für Symbole in einem Deklarationskontext (z. B. wo es definiert ist). Es gibt einige, die beides sein können, aber das ist eher ein Randfall. –