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