从Visual Studio扩展中的ProjectItem获取Roslyn SemanticModel

时间:2016-08-24 20:29:34

标签: c# visual-studio visual-studio-2015 roslyn vsx

我正在编写Visual Studio 2015扩展程序,该扩展程序会查看用户右键单击的类的内容。

我已获得ProjectItem,但您如何从中获得SemanticModel(以及SyntaxTree)?

我需要查找文件中声明的某些类型的属性。我已经编写了一个代码分析器,它为您提供了SemanticModel上下文,但我无法弄清楚如何在此处获取它。搜索天堂没有任何有用的东西。我已经找到了如何通过阅读文件内容来解析SyntaxTree,但使用SemanticModel并不容易。理想情况下,我会挂钩VS已为该文件构建的模型。

1 个答案:

答案 0 :(得分:2)

想出来。

  1. 将项目升级到目标.NET framework 4.6.2。
  2. 安装Microsoft.VisualStudio.LanguageServices NuGet package
  3. 将System.Collections.Immutable从1.2.0降级到1.1.37,否则稍后会在代码中收到MissingMethodException。
  4. 在包类Initialize方法中,抓取VisualStudioWorkspace。我将它保存在静态属性中以便稍后获取:

    var componentModel = (IComponentModel)this.GetService(typeof(SComponentModel));
    VisualStudioWorkspace = componentModel.GetService<VisualStudioWorkspace>();
    
  5. 现在,您可以从文件路径中获取带有SyntaxTree和SemanticModel的文档:

    Microsoft.CodeAnalysis.Solution solution = CreateUnitTestBoilerplateCommandPackage.VisualStudioWorkspace.CurrentSolution;
    DocumentId documentId = solution.GetDocumentIdsWithFilePath(inputFilePath).FirstOrDefault();
    var document = solution.GetDocument(documentId);
    
    SyntaxNode root = await document.GetSyntaxRootAsync();
    SemanticModel semanticModel = await document.GetSemanticModelAsync();