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

时间:2015-06-21 17:59:24

标签: roslyn

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

是否有办法允许语法walker遍历外部类?当两个类都在同一个项目中但在不同的文件(文档)中时,我甚至无法做到。它总是通过相同的文件。如果两个类都在同一个文件中,那么它可以工作。如果我将它们提取为单独的,它就不会......

我正在研究测试覆盖率工具。用户单击VS中的方法,然后:

  1. 我使用重写器为每个分支添加静态变量。
  2. 我运行代码,以便在覆盖分支时设置静态变量。
  3. 我想知道如何配置语法walker \ rewriter来识别同一解决方案中的其他类。

1 个答案:

答案 0 :(得分:0)

您将需要访问Symbol API。我试图通过一个简单的经验法则:

  • 语法API适用于单个文件
  • Symbol 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