如何从 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 概念(ITextSnapshot
、ITextBuffer
等)和 Roslyn 概念(Document
、SourceText
等)之间进行映射在此处找到的扩展方法: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 文件,我将使用它。
我正在尝试编写一个 Visual Studio 扩展,它将分析编辑器中显示的 C# 代码,并可能根据我发现的内容更新代码。这将按需(通过菜单项),而不是使用分析器和代码修复。
网上有很多例子和示例,但都是从示例中硬编码的源代码开始,或者创建一个新文档,或者查看VS解决方案中的每个文件打开。如何从活动编辑器访问源代码 window?
首先,您需要安装 Microsoft.CodeAnalysis.EditorFeatures.Text
包。
然后需要添加合适的using语句:
using Microsoft.CodeAnalysis.Text;
现在您可以在 Visual Studio 概念(ITextSnapshot
、ITextBuffer
等)和 Roslyn 概念(Document
、SourceText
等)之间进行映射在此处找到的扩展方法: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 在
@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 文件,我将使用它。