【问题标题】:Determine if the caret is in a comment block with Visual Studio SDK使用 Visual Studio SDK 确定插入符号是否位于注释块中
【发布时间】:2015-12-11 11:26:43
【问题描述】:

场景


我希望仅当插入符号位于 Xml 注释块中时才在自定义菜单中启用命令

''' ... If caret is here, in a Vb.Net Xml comment block.

/// ... If caret is here, in a C# Xml comment block.

然后,预期结果的伪代码:

C#:

private void CmdExample_BeforeQueryStatus(object sender, EventArgs e) {
    // Enable this command only if the caret is in a Xml comment block.
    ((OleMenuCommand)sender).Enabled = IsCaretInXmlComment?();
}

Vb:

Private Sub CmdExample_BeforeQueryStatus(ByVal sender As Object, ByVal e As EventArgs) _
Handles cmdExample.BeforeQueryStatus

    ' Enable this command only if the caret is in a Xml comment block.
    DirectCast(sender, OleMenuCommand).Enabled = IsCaretInXmlComment?()

End Sub

问题


只是,我怎么能做到呢?在 Vb.Net 或 C# 中。

研究


我不知道该怎么做,所以我对 vsCMElement 枚举的值进行了反复试验,因为我看到了类似的 here,但是CodeElement2.Kind 属性总是抛出 NullReferenceException

C#:

TextPoint tp = 
    ((TextSelection)MyDte.ActiveDocument.Selection).ActivePoint;

CodeElement2 ce = 
    MyDte.ActiveDocument.ProjectItem.FileCodeModel.
          CodeElementFromPoint(tp, vsCMElement.vsCMElementOther);

Vb:

Dim tp As TextPoint = 
    CType(MyDte.ActiveDocument.Selection, TextSelection).ActivePoint

Dim ce As CodeElement2 =
    MyDte.ActiveDocument.ProjectItem.FileCodeModel.
          CodeElementFromPoint(tp, vsCMElement.vsCMElementOther)

我也发现了这个 question,但是没有说明性的代码示例,我对此非常迷茫。

【问题讨论】:

  • 引导答案的两个问题:您要使用哪种语言进行检测?即,如果打开,什么类型的文件很重要?另外,您需要针对的 Visual Studio 最低版本是多少?
  • @Jason Malinowski 感谢您的评论。我正在 Vb.Net 中开发扩展,这里是安装程序:visualstudiogallery.msdn.microsoft.com/…,这里是源代码:mediafire.com/download/kih2744ii5il1rf/…,但是我可以翻译 C# 示例。该扩展应适用于 Vb 和 C# 注释块检测。什么类型的文件?:当然是 Vb 和 C# 源文件,并且仅适用于当前代码编辑器窗口中的活动文档(并非所有打开的文档)。我的目标是 Visual Studio 2013 SDK。
  • 检测活动文档及其语言是我过去解决的问题,我只需要帮助确定插入符号位置是否在 VB.Net 或 C# 类型的 XML 注释块中,活动文档文件的类型真的无关紧要,我更愿意对此进行任何过滤,因为无论出于何种原因,文本文件 (.txt) 都可能包含带有 xml cmets 的 VB 或 C# 的代码示例。
  • 我忘了提到我正在寻找一种比从插入符号位置获取线更一致的方法,修剪线,然后检测前三个字符是“'''”还是“ ///”。我想检测该块是否是完全限定的 Xml 注释块(这意味着,带有开始和结束 xml 标记)
  • 您仍然希望定位的最低版本是 2012 年?既然 Roslyn 在那里,这在 2015 年更容易,但这会破坏兼容性。

标签: c# .net vb.net visual-studio-extensions visual-studio-sdk


【解决方案1】:

如果您的目标是 Visual Studio 2015 或更高版本,最好的方法是使用 Roslyn。有了它,您可以获得语法树,然后确定您是否在评论中。如果您查看我们对IsEntirelyWithinSingleLineDocComment 的实现,您会看到我们今天是如何做到的。如果您是 Roslyn 的新手,已经有一些问题可以帮助您获得语法树。

如果您需要定位低于该值的版本,那么自 Roslyn 于 2012 年首次发布以来,您就遇到了麻烦。一种常见的方法是询问分类信息,以确定某事是否是评论。分类是驱动您在编辑器中看到的文本着色的原因。如果您的文件获得ITextBuffer,则可以MEF 导入IClassifierAggregatorService 并要求分类,然后过滤到文档注释类型。 Noah Richard's original spell check sample 是一个很好的例子。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
相关资源
最近更新 更多