在DiagnosticAnalyzer的操作回调中,如何获取派生SyntaxNode的文档或项目?

时间:2019-04-14 01:54:37

标签: roslyn-code-analysis

我正在编写DiagnosticAnalyzer,并为SyntaxNode注册一个SyntaxKind.Attribute操作。该属性为项目中的其他文件命名。

例如,正在分析的代码可能包括

[RelatedFile("otherFileName.foo")] interface Whatever {...}

在我的分析回调中,我希望能够从要分析的项目的角度访问相关文件的内容。因此,我需要:

  1. SyntaxNode中提取文件名。我可以做到的。
  2. 获取一个对象,该对象描述包含所分析代码的文档。 我不知道该怎么做。
  3. 获取描述包含所分析代码的项目的对象。 我不知道该怎么做。
  4. 找出项目中是否包含具有指定名称的文档。我可以做到的。
  5. 打开并解析或更新该文件的内容。我想我可以做到。

我陷入了步骤(2)和(3)。 (是的,我可能不一定严格执行步骤2,但我仍然想知道如何做。)

SyntaxNodeAnalysisContext参数中,我可以得到Workspace对象,从Solution对象中,并从Project对象的集合中得到。但是我看不到将特定的SyntaxNode与它所来自的ProjectDocument关联起来的方法。

任何有关如何执行此操作的想法将不胜感激。

1 个答案:

答案 0 :(得分:0)

我找到了:

Workspace workspace = ...;
SyntaxNode node = ...;
Document document = workspace.Solution.GetDocument(node.SyntaxTree);
Project project = document.Project;

我不知道为什么我没有更早看到它。