如何从Visual Studio编辑器中检索文本以与Roslyn SyntaxTree一起使用?

时间:2017-08-12 17:47:20

标签: c# visual-studio-2017 roslyn visual-studio-sdk

我正在尝试编写一个Visual Studio扩展,它将分析编辑器中显示的C#代码,并可能根据我找到的内容更新代码。这将是按需(通过菜单项),而不是使用分析器和代码修复。

互联网上有许多示例和示例,但它们都是从样本中硬编码的源代码开始,或者创建新文档,或查看打开的VS解决方案中的每个文件。如何从活动编辑器窗口访问源代码?

2 个答案:

答案 0 :(得分:0)

首先,您需要安装Microsoft.CodeAnalysis.EditorFeatures.Text包。

然后你需要添加适当的using语句:

 using Microsoft.CodeAnalysis.Text;

现在,您可以使用此处的扩展方法在Visual Studio概念(ITextSnapshotITextBuffer等)和Roslyn概念(DocumentSourceText等)之间进行映射:http://source.roslyn.io/#Microsoft.CodeAnalysis.EditorFeatures.Text/Extensions.cs

例如:

ITextSnapshot snapshot = ... //Get this from Visual Studio
var documents = snapshot.GetRelatedDocuments(); //There may be more than one

答案 1 :(得分:0)

在对原始问题的评论中,@ SJP在Calling Roslyn from VSIX Command给出了@Frank Bakker回答问题的链接。这确实有效。

@JoshVarty在上面的回答中提供了一个方向的暗示。我将其与@ user1912383提供的代码结合起来how to get an IWpfTextView来回答问题Find an IVsTextView or IWpfTextView for a given ProjectItem, in 2010 RC extension。这是我提出的代码:

var componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
var textManager = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager));
IVsTextView activeView = null;
ErrorHandler.ThrowOnFailure(textManager.GetActiveView(1, null, out activeView));
var editorAdapter = componentModel.GetService<IVsEditorAdaptersFactoryService>();
var textView = editorAdapter.GetWpfTextView(activeView);
var document  = Extensions.GetRelatedDocuments(textView.TextBuffer).FirstOrDefault();

在上述@ user1912383代码之后的评论中,@ kman提到这不适用于.sql文件等文档类型。但它确实适用于我将使用的.cs文件。