Roslyn:通过 2 个不同文档的 SyntaxWalker

Roslyn: SyntaxWalker through 2 different documents

我有两个不同项目的解决方案。我使用 SyntaxWalker 来处理 ProjectA.Class1 中的一些内容。然而,ProjectA.Class1 有引用 ProjectB.Class2.

有没有办法让语法遍历器也可以通过外部遍历类?当 类 在同一个项目中但在不同的文件(文档)中时,我什至无法做到这一点。它总是通过同一份文件。如果 类 都在同一个文件中,那么它就可以工作。如果我将它们提取到单独的,它不会...

我正在开发测试覆盖率工具。用户在 VS 中单击该方法,然后:

  1. 我使用重写器为每个分支添加静态变量。
  2. 我 运行 代码,以便在分支被覆盖时设置静态变量。

我想知道我应该如何配置语法 walker\rewriter 以识别同一解决方案中的其他 类。

您将需要访问符号 API。我尝试遵循的一个简单的经验法则:

  • 语法 API 适用于单个文件
  • 符号 API 允许您处理跨文件的信息。

您在评论中提到您想要遍历方法并找出有关每个方法声明的一些信息。这是一些(天真的)代码,应该让你开始使用符号 API.

我假设您可以访问您正在分析的 Project

Project myProject;
public void ProcessMethod(MethodDeclarationSyntax method)
{
    //Get the semantic model
    var filePath = method.SyntaxTree.FilePath;
    var containingDocument = myProject.Documents.Where(n => n.FilePath == filePath).Single();
    var model = containingDocument.GetSemanticModelAsync().Result;

    //...
    //Do your processing on the current method here...
    //...

    //Process the invoked methods.
    var invocations = method.DescendantNodes().OfType<InvocationExpressionSyntax>();
    foreach(var invocation in invocations)
    {
        var invokedSymbol = model.GetSymbolInfo(invocation).Symbol; //Might be null
        var invokedSymbolSyntax = (MethodDeclarationSyntax)invokedSymbol.DeclaringSyntaxReferences.First().GetSyntax(); //Partial methods might be declared in multiple places
        ProcessMethod(invokedSymbolSyntax);
    }
}

注:

  • 这种方法不处理构造函数、析构函数、属性、表达式体成员和我忘记的任何其他成员。但这应该足以让您入门并向您介绍符号 API.
  • 递归会咬你。
  • 您不会处理接口的实现。为此,您必须查看 SymbolFinder