使用Visual Studio SDK确定插入符号是否在注释块中

本文关键字:是否 注释 符号 插入 Studio Visual SDK 使用 | 更新日期: 2023-09-27 18:26:34

场景


只有当插入符号在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枚举的值进行了反复尝试,因为我在这里看到了类似的,但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)

我还发现了这个问题,但是如果没有一个说明性的代码示例,我对此感到非常困惑。

使用Visual Studio SDK确定插入符号是否在注释块中

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

如果你需要的目标版本低于这个版本,那么自2012年Roslyn首次发布以来,你就遇到了麻烦。一种常见的方法是询问分类信息,以确定某个内容是否为评论。分类是驱动您在编辑器中看到的文本着色的因素。如果您的文件得到了ITextBuffer,那么您可以MEF导入IClassifierAggregatorService并要求分类,然后过滤到文档注释类型。诺亚·理查德的原始拼写检查样本就是一个很好的例子。