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

时间:2015-12-11 11:26:43

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

方案

我想仅在插入符号位于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 ,但是如果没有说明性的代码示例,我对此非常感兴趣。

1 个答案:

答案 0 :(得分:2)

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

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