我正在编写Visual Studio 2015扩展程序,该扩展程序会查看用户右键单击的类的内容。
我已获得ProjectItem
,但您如何从中获得SemanticModel
(以及SyntaxTree
)?
我需要查找文件中声明的某些类型的属性。我已经编写了一个代码分析器,它为您提供了SemanticModel
上下文,但我无法弄清楚如何在此处获取它。搜索天堂没有任何有用的东西。我已经找到了如何通过阅读文件内容来解析SyntaxTree
,但使用SemanticModel
并不容易。理想情况下,我会挂钩VS已为该文件构建的模型。
答案 0 :(得分:2)
想出来。
在包类Initialize
方法中,抓取VisualStudioWorkspace。我将它保存在静态属性中以便稍后获取:
var componentModel = (IComponentModel)this.GetService(typeof(SComponentModel));
VisualStudioWorkspace = componentModel.GetService<VisualStudioWorkspace>();
现在,您可以从文件路径中获取带有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();