visual-studio - 如何在 Visual Studio 扩展的代码编辑器中获取有关鼠标位置下的单词的信息

标签 visual-studio roslyn visual-studio-extensions vsix vssdk

我正在尝试通过一些尝试来学习如何创建 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/

相关文章:

c# - Roslyn - 如何在另一个语句之前和之后添加一个语句

c# - netstandard 代码生成器 Microsoft.Data.SqlClient 抛出 FileNotFound System.Security.Principal.Windows,Version=4.1.1.0

c# - Roslyn 中事件的 “raise” 访问器是什么?

c# - Visual Studio 项目模板支持新的 csproj 格式

c# - VSIX - XmlEditingScope.Complete() 上的死锁

visual-studio - 尝试调试发布版本时重新启用警告?

visual-studio - 无法登录 Azure 以使用 Visual Studio 2013 进行发布

visual-studio - 无法在 Visual Studio 2013 中打开团队基础构建过程模板

c# - 使用 filecodemodel 添加属性

visual-studio-2012 - 如何获取 Visual Studio 当前使用的颜色主题