2016-11-16 50 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'作为符号(例如定义的位置)。有一些可以是两个,但更多的是一个边缘。 –