gpt4 book ai didi

visual-studio-2015 - 从VSIX命令调用Roslyn

转载 作者:行者123 更新时间:2023-12-04 13:22:40 30 4
gpt4 key购买 nike

从EnvDTE.ProjectItem获取Roslyn的SyntaxTree的最佳方法是什么?我找到了另一种方法(将罗斯林的文档转换为ProjectItem)。

我从打开的文档中调用了VSIX命令,我想在那里尝试Roslyn的语法树。

这段代码有效,但对我来说很尴尬:

    var pi = GetProjectItem();
var piName = pi.get_FileNames(1);

var componentModel = (IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel));
var workspace = componentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>();
var ids = workspace.GetOpenDocumentIds();
var id1 = ids.First(id => workspace.GetFilePath(id) == piName);

Microsoft.CodeAnalysis.Solution sln = workspace.CurrentSolution;
var doc = sln.GetDocument(id1);
//var w = await doc.GetSyntaxTreeAsync();
Microsoft.CodeAnalysis.SyntaxTree syntaxTree;
if (doc.TryGetSyntaxTree(out syntaxTree))

有没有更好的方法来从事件文档中获取罗斯林的文档?

最佳答案

您可以使用workspace.CurrentSolution.GetDocumentIdsWithFilePath()来获取与文件路径匹配的DocumentId。通过它,您可以使用workspace.CurrentSolution.GetDocument()获取文档本身。

private Document GetActiveDocument()
{
var dte = Package.GetGlobalService(typeof(DTE)) as DTE;
var activeDocument = dte?.ActiveDocument;
if (activeDocument == null) return null;

var componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
var workspace = (Workspace) componentModel.GetService<VisualStudioWorkspace>();

var documentid = workspace.CurrentSolution.GetDocumentIdsWithFilePath(activeDocument.FullName).FirstOrDefault();
if (documentid == null) return null;

return workspace.CurrentSolution.GetDocument(documentid);
}

关于visual-studio-2015 - 从VSIX命令调用Roslyn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31808766/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com