获取 ParameterSyntax 的符号
Get symbol for ParameterSyntax
我正在尝试编写一些 Roslyn 实用程序来重命名项目中的 variables/members/parameters。看来最好的做法是 Renamer.RenameSymbolAsync 方法。为了使用它,我需要一个解决方案和语义符号。到目前为止,我很难获得这些信息。这是我到目前为止尝试过的
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);
}
}
}
快速浏览一下 Roslyn 源代码,您可能必须在 ParameterSyntax
上使用 GetDeclaredSymbol
而不是 GetSymbolInfo
。
我正在尝试编写一些 Roslyn 实用程序来重命名项目中的 variables/members/parameters。看来最好的做法是 Renamer.RenameSymbolAsync 方法。为了使用它,我需要一个解决方案和语义符号。到目前为止,我很难获得这些信息。这是我到目前为止尝试过的
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);
}
}
}
快速浏览一下 Roslyn 源代码,您可能必须在 ParameterSyntax
上使用 GetDeclaredSymbol
而不是 GetSymbolInfo
。