【问题标题】:How to find symbol for MethodGroup in Roslyn 2.0如何在 Roslyn 2.0 中查找 MethodGroup 的符号
【发布时间】:2017-04-18 15:13:03
【问题描述】:

我正在尝试使用 Roslyn 来识别方法组引用背后的符号。在早期版本的 Roslyn 中使用 SemanticModel.GetSymbolInfo 可以正常工作,但在最新版本中找不到符号。执行此映射的正确方法是什么?

var ws = new AdhocWorkspace();
var proj = ws.AddProject("test", "C#")
    .AddMetadataReference(MetadataReference.CreateFromFile(typeof(object).Assembly.Location));
proj = proj.WithParseOptions(proj.ParseOptions.WithFeatures(new Dictionary<string, string> { { "IOperation", "true" }}));
var doc = proj.AddDocument("test.cs", SourceText.From(@"namespace Test {
    public class Program
    {
        public static void Main()
        {
            Func<int> x = Foo; // want to map Foo to one of the methods below!
        }

        private static int Foo() => 7;

        private static int Foo(int x) => 8
    }
}"));
proj = doc.Project;

var compilation = proj.GetCompilationAsync().Result;
var tree = doc.GetSyntaxTreeAsync().Result;
var model = compilation.GetSemanticModel(tree);
var fooToken = tree.GetRoot().DescendantTokens()
    .First(t => t.Text.ToString() == "Foo");

Console.WriteLine(model.GetSymbolInfo(fooToken.Parent).Symbol); // null
Console.WriteLine(model.GetMemberGroup(fooToken.Parent).Length); // 2

作为示例,显示 GetMemberGroup 确实返回结果,但它返回两种 Foo() 方法的结果,而不是我引用的特定方法。

如何提取准确的引用符号?

【问题讨论】:

    标签: c# .net roslyn microsoft.codeanalysis


    【解决方案1】:

    下面的代码有几个语法错误。

    namespace Test
    {
        public class Program
        {
            public static void Main()
            {
                Func<int> x = Foo; // want to map Foo to one of the methods below!
            }
    
            private static int Foo() => 7;
    
            private static int Foo(int x) => 8
        }
    }
    

    您需要为 System 添加一个 using 或将 Func&lt;int&gt; 完全限定为 System.Func&lt;int&gt;int Foo(int x) =&gt; 8 最后也缺少分号。由于这些错误,重载解析失败。检查为什么没有选择符号的最简单方法是查看候选原因,如下所示:model.GetSymbolInfo(fooToken.Parent).CandidateReason,它将告诉您存在重载解析失败。也可以拨打compilation.GetDiagnostics()查看代码中存在哪些错误。

    如果我们纠正这些错误,重载解析就会成功

    var ws = new AdhocWorkspace();
    var proj = ws.AddProject("test", "C#")
                    .AddMetadataReference(
                        MetadataReference.CreateFromFile(typeof(object).Assembly.Location));
    proj = proj.WithParseOptions(proj.ParseOptions
        .WithFeatures(new Dictionary<string, string> { ["IOperation"] = "true" }));
    var doc = proj.AddDocument("test.cs", SourceText.From(@"using System;
    namespace Test {
        public class Program{
            public static void Main(){
                Func<int> x = Foo;
            }
            private static int Foo() => 7;
            private static int Foo(int x) => 8;
        }
    }"));
    proj = doc.Project;
    
    var compilation = proj.GetCompilationAsync().GetAwaiter().GetResult();
    var tree = doc.GetSyntaxTreeAsync().GetAwaiter().GetResult();
    var model = compilation.GetSemanticModel(tree);
    var fooToken = tree.GetRoot().DescendantTokens().First(t => t.Text == "Foo");
    Console.WriteLine(model.GetSymbolInfo(fooToken.Parent).Symbol);
    Console.WriteLine(model.GetMemberGroup(fooToken.Parent).Length);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2015-10-05
      • 2018-01-01
      • 2015-09-03
      • 1970-01-01
      相关资源
      最近更新 更多