2016-11-16 9 views
0

私はプロジェクトの変数/メンバー/パラメータの名前を変更するために少しRoslynユーティリティを書こうとしています。これは、アクションの最善の策はRenamer.RenameSymbolAsyncメソッドだと思われます。それを使うためには、私は解決策とセマンティックシンボルが必要です。これまで私はこの情報を得るのに苦労しています。ここに私がいる問題はsymbolが空になってしまうということである私がこれまで試したどの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,) 

    } 
    } 
} 

だ、私はなぜわかりません。 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

ロザリン源で一目から、あなたが使用する必要がありますParameterSyntaxGetSymbolInfoの代わりにGetDeclaredSymbolとなります。

+0

正解。宣言しているコンテキスト(例えば定義されている場所)のシンボルには 'GetDeclaredSymbol'を使います。両方になることができるものもありますが、それはエッジゲーゼのほうがはるかです。 –

関連する問題