【问题标题】:Access Invocations reference using Roslyn使用 Roslyn 的访问调用参考
【发布时间】:2017-07-09 06:09:54
【问题描述】:

我想使用 Roslyn 创建一个 Visual Studio Extension(VSIX)。此扩展应该找到所有调用,然后查找它们的定义以分析在它们上定义的属性。方法的定义可以在解决方案中的任何位置。

我的第一堂课是这样的:

namespace MainProject
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(BusinessProject.Calc.AddNumbers(5, 8));
        }
    }
}

我的第二堂课是这样的:

namespace BusinessProject
{
    public class Calc
    {
        [CustomAttr("Do something")]
        public static long AddNumbers(int a, int b)
        {
            return a + b;
        }
    }
}

在上面的示例中,在 Program 类中,我调用了 AddNumbers 方法。我想 1) 分析代码,2) 找到这个调用,3) 获取类 Calc 中引用方法的所有属性,4) 处理属性参数,5) 然后发出警告/错误如果需要的话。 我可以通过 RegisterCodeBlockAction 分析当前类以查找所有调用,但我不能做的是访问整个解决方案以查找调用的定义,然后访问引用的属性。

如何在RegiserCodeBlockAction中访问整个解决方案?

【问题讨论】:

    标签: c# visual-studio roslyn


    【解决方案1】:

    你调用了错误的方法。

    您实际上希望分析器在每个方法调用上运行,而不是在每个代码块上运行。
    因此,您应该调用RegisterSyntaxNodeAction,并传递SyntaxKind.InvocationExpression

    然后它会通过InvocationExpressionSyntax 给您打电话,其中包含您需要的所有信息(主要在语义模型中)。

    【讨论】:

    • 感谢您的建议,但是如何访问该方法的定义?可以在解决方案的任何位置声明此方法。
    【解决方案2】:

    正如@SLaks 在他的评论中提到的,通过使用 SemanticModel.Compilation.SyntaxTrees,我们可以访问解决方案中的所有源代码。我找到了方法及其参数。但这有一个问题,您无法使用 SemanticModel.GetTypeInfo 获取对象的 TypeInfo。您必须创建一个新的语义模型,如下所示:

    foreach (var tree in context.SemanticModel.Compilation.SyntaxTrees)
    {
        var compilation = CSharpCompilation.Create("MyCompilation",
                        syntaxTrees: new[] { tree }, references: new List<MetadataReference>());
        var syntaxRoot = tree.GetRoot();
        var model = compilation.GetSemanticModel(tree);
        var targetMethod = syntaxRoot.DescendantNodes().OfType<MethodDeclarationSyntax>().FirstOrDefault(f => f.Identifier.ToString() == "Class name to find");
        if (targetMethod == null)
            continue;
    
        var typeInfo = model.GetTypeInfo(targetMethod.First().ParameterList.Parameters[i].ChildNodes().First());
        // Do any thing with typeInfo
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      相关资源
      最近更新 更多