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