获取ParameterSyntax的符号

本文关键字:符号 ParameterSyntax 获取 | 更新日期: 2023-09-27 18:18:08

我正在尝试写一个小Roslyn util来重命名项目中的变量/成员/参数。看来最好的做法是改名。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);
    }
  }
}

获取ParameterSyntax的符号

快速浏览Roslyn源代码,您可能必须在ParameterSyntax上使用GetDeclaredSymbol而不是GetSymbolInfo