2016-11-16 2 views
0

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); 
    } 
    } 
} 

Antwort

2

Von einem kurzen Blick auf die Quelle Roslyn, können Sie verwenden, um GetDeclaredSymbol anstelle von GetSymbolInfo auf der ParameterSyntax.

+0

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. –