我正在尝试通过一些尝试来学习如何创建 Visual Studio 扩展。
我想在代码编辑器(c#)中获取有关鼠标下单词的所有信息,但我不知道该怎么做。我不想自己分析代码,因为必须有一个机制,因为所有这些信息都在工具提示中(也许足以捕获工具提示数据)。
为了更清楚地说明这一点:
-如果您将鼠标悬停在变量上,我想知道这个词是一个变量,我也想知道这个变量的名称和类型。对于任何其他类型、接口(interface)等都相同
-如果您将鼠标悬停在“var”关键字上,我想知道这个单词是“var”关键字,并且我想知道它的类型。
-如果您将鼠标悬停在“List[Domain.Example.TestClass]”等泛型内部的类上,我想获得等于“TestClass”的类型
与工具提示中的内容基本相同。
我试图使用“IQuickInfoSource”,它允许我获取光标下的单词,但我不知道如何获取任何其他数据。
我还尝试了“IMouseProcessorProvider”,最终得到了相同的结果,我能够获取当前单词但任何其他信息。
你能告诉我如何实现这一目标吗?或者至少为我指明了正确的方向,因为很难找到任何有关 Visual Studio 扩展的正确文档。如果您需要更多信息,请询问。
提前致谢。
最佳答案
几个小时后我终于实现了我想要的目标。如果有人尝试做同样的事情,那么您可以找到以下步骤。
我使用“Roslyn”来获取这些信息,因此我需要下载“Microsoft.CodeAnalysis”等 nuget 包。
我还使用 IMouseProcessorProvider 来响应鼠标事件:
[Export(typeof(IMouseProcessorProvider))]
[Order]
[ContentType("CSharp")]
[Name("MouseNavigation")]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
internal class MouseNavigationProvider : IMouseProcessorProvider
之后使用以下代码,我能够获取类型信息
SnapshotPoint caretPosition = _textView.Caret.Position.BufferPosition;
Document document = caretPosition.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
SemanticModel semanticModel = document.GetSemanticModelAsync().Result;
if (semanticModel == null)
return null;
TypeInfo typeInfo;
SyntaxNode expressionNode = document.GetSyntaxRootAsync().Result.FindToken(caretPosition).Parent;
if (expressionNode is VariableDeclaratorSyntax)
{
SyntaxNode childNode = expressionNode.ChildNodes()?.FirstOrDefault()
?.ChildNodes()?.FirstOrDefault();
typeInfo = semanticModel.GetTypeInfo(childNode);
}
else if (expressionNode is ClassDeclarationSyntax)
{
throw new NotImplementedException();
}
else
{
// NOTE: This probably should be changed for specific type of syntax, but right now it is only for testing purposes
typeInfo = semanticModel.GetTypeInfo(expressionNode);
if (typeInfo.Type == null)
{
expressionNode = expressionNode.Parent;
typeInfo = semanticModel.GetTypeInfo(expressionNode);
}
}
关于visual-studio - 如何在 Visual Studio 扩展的代码编辑器中获取有关鼠标位置下的单词的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47077832/