无法使用SyntaxTree获取GetDocument

时间:2014-04-30 23:12:25

标签: c# roslyn

我正在尝试在解决方案中找到类型的所有引用。我的起点是文件(当前光标位置)内的跨度,如110:116。看看Roslyn的样本我发现我需要SymbolFinder.FindReferencesAsync(theType, solution)。我为测试解决方案创建了File-> NewProject,然后尝试了:

  1. 创建语法树
  2. 加载解决方案
  3. 使用树找到Document //我在这里失败,返回null
  4. 提取ISymbol(theType)//如何?
  5. 我无法格式化代码belo,因此可以在此处找到更易于阅读的屏幕截图:

    enter image description here

    string fileContent = 
        @"using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        namespace APISampleUnitTestsCS
        {
            class Class1
            {
            }
        }";
    
    // it doesn;t matter if I supply or not the 2 and 3 parameters
    var tree = SyntaxFactory.ParseSyntaxTree(fileContent, "thePathTo_fileContent", new CSharpParseOptions());
    
    MSBuildWorkspace workspace = MSBuildWorkspace.Create();
    // Open the solution within the workspace.
    Microsoft.CodeAnalysis.Solution originalSolution = workspace.OpenSolutionAsync(dte.Solution.FileName).Result;
    
    // document is null
    var document = originalSolution.GetDocument(tree);
    
    //var textSpan = new Microsoft.CodeAnalysis.Text.TextSpan(textExtent.Span.Span.Start, asd.Span.Span.Length);
    var textSpan = new Microsoft.CodeAnalysis.Text.TextSpan(110, 116); //these values are for stackoverlow question
    
    // at least I can get TypeDeclarationSyntax. But how to extraxt the ISymbol???
    var tt = tree.GetRoot().FindNode(textSpan) as Microsoft.CodeAnalysis.CSharp.Syntax.TypeDeclarationSyntax;
    

1 个答案:

答案 0 :(得分:4)

solution.GetDocument(syntaxTree)为您提供了在调用GetSyntaxTreeAsync时为您提供语法树的文档。你无法将它传递给任意语法树 - 只有你从某个文档中获得的语​​法树。这只是一个方便的帮助,可以“返回”来自文件的文件。

我不确定你要从代码片段做什么,所以我要做三个猜测:

  1. 如果您正在尝试分析该解决方案中已有的文件,您应该使用originalSolution中的解决方案对象并在那里找到文件文档。

  2. 如果您想进行分析,就像将其他树也添加到您的文档中一样,您可以调用Solution.AddDocument()将其添加为文档,然后您可以从那里进行分析。请记住Roslyn是不可变的,当你致电Solution.AddDocument时,你会得到一个新的分析解决方案,所以坚持它给你的东西!

  3. 如果你要做的就是找到一个你已经知道的符号,请考虑在解决方案中找到包含该类型的项目,调用GetCompilationAsync,然后调用{{ 1}}或遍历名称空间以获取您的类型符号。