2016-11-16 60 views
0

我正在嘗試寫一個Roslyn util來重命名項目中的變量/成員/參數。看來最好的行動方式是Renamer.RenameSymbolAsync方法。爲了使用它,我需要一個解決方案和語義符號。到目前爲止,我很難得到這些信息。這是我試過到目前爲止獲取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,) 

    } 
    } 
} 

我遇到的問題是,symbol最終是空的,我不知道爲什麼。 s正確解析文件中所有參數的列表,但無法將其轉換爲符號以傳入重命名器。

正在被有針對性的在這種特殊情況下的文件看起來是這樣的,在這種情況下,s[0]最終被inCollection

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

回答

2

從在羅斯林源一瞥,你可能必須使用GetDeclaredSymbol而不是ParameterSyntax上的GetSymbolInfo

+0

正確。在聲明的上下文中使用'GetDeclaredSymbol'作爲符號(例如定義的位置)。有一些可以是兩個,但更多的是一個邊緣。 –