如何从 Visual Studio 编辑器检索文本以用于 Roslyn SyntaxTree?

How do I retrieve text from the Visual Studio editor for use with Roslyn SyntaxTree?

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

网上有很多例子和示例,但都是从示例中硬编码的源代码开始,或者创建一个新文档,或者查看VS解决方案中的每个文件打开。如何从活动编辑器访问源代码 window?

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

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

 using Microsoft.CodeAnalysis.Text;

现在您可以在 Visual Studio 概念(ITextSnapshotITextBuffer 等)和 Roslyn 概念(DocumentSourceText 等)之间进行映射在此处找到的扩展方法:https://github.com/dotnet/roslyn/blob/master/src/EditorFeatures/Text/Extensions.cs

例如:

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

在对我的原始问题的评论中,@SJP 对@Frank Bakker 在 的问题的回答给出了 link。这确实按概述工作。

@JoshVarty 在上面的回答中提供了前进方向的提示。我将它与@user1912383 为 how to get an IWpfTextView answering the question 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  = (textView.TextBuffer.ContentType.TypeName.Equals("CSharp"))
            ? textView : null;

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