【问题标题】:Visual Studio Language Service with C# intellisense使用 C# 智能感知的 Visual Studio 语言服务
【发布时间】:2026-02-22 00:45:01
【问题描述】:

去年我为 Visual Studio 编写了一个语言服务,它为 NHaml 文件添加了语法高亮:http://github.com/snappycode/hamleditor

为了澄清,NHaml 是一种 html 模板语言,它可以像 aspx 文件一样混合代码元素。这个插件增加了对编辑 NHaml 文件的 IDE 的支持,但基本上只增加了语法高亮。

我想知道是否有人知道如何像现在在 aspx 文件中那样将内联 c# intellisense 添加到服务中。我希望不用自己专门为插件编写整个 c# 语法就可以做到这一点。

有没有人写过混合语言的语言服务?

更新: 看起来火花视图引擎的家伙在这里取得了一些进展,我正在研究他们的实施

【问题讨论】:

  • 在查看 spark 视图引擎代码时有没有发现什么有用的东西?
  • 是的,看起来他们已经降级到 C++ whereslou.com/2008/12/03/ivsintellisenseless 我要去看看我是否可以在 c# 中实现这一点,但是有一些疯狂的无证接口需要支持
  • 是的,降级到 ATL COM 有助于处理这种情况,因为您可以跟踪对象上的 QueryInterface 调用以收集有关 VS 期望的提示。还有另一个不错的技巧,您可以获取对象引用并为注册表中的每个 IID 调用 QI,以尽可能多地发现它的公开接口。我不知道在 C# 中进行这种 COM 级探索的方法。
  • 这在 VS2010 中会变得更容易吗?根据我阅读的内容(不记得来源),他们努力使创建插件更容易。

标签: visual-studio plugins intellisense nhaml


【解决方案1】:

我检查了 Spark View Engine,他们似乎制作了一个通用的 ATL 东西(称为 SparkLanguagePackageLib),实际上似乎不包含任何 Spark 特定的东西。它似乎只是一个需要以下内容的通用 C# 智能感知库:

  • 原代码
  • 从原始代码生成的 C# 源代码
  • 两者之间的位置映射(例如,第 2 行 pos 5 上的代码在输出中映射到第 4 行 pos 10 等)
  • 其他一些东西,比如绘画(?)

然后你可以调用:

events.OnGenerated(
    primaryText, // original source code
    entry.SourceCode, // generated sourcecode
    cMappings, // mappings between the two
    ref mappings[0], // ?
    cPaints, // ?
    ref paints[0]); // ?

我试图在那个 C++ 库中找到特定于 Spark 的东西,但我找不到任何东西:所有与 spark 相关的东西都被拆分为一个单独的 C# 代码文件。我认为这很好,因为:

  • 您无需编辑 C++ 文件
  • 如果安装了 spark 视图引擎的智能感知支持,其他视图引擎也可以使用它
  • 您只需要创建一个类,该类在原始 naml 文件和生成的 C# 对应文件之间进行映射。

顺便说一句。你还在研究这个 NHaml Intellisense 库吗?如果没有,我会尝试修补他们的实现,希望它可以轻松转换为 NHaml。

【讨论】:

  • 这方面有什么更新吗?有没有人成功地将 spark 类移植到 nhaml 中?
  • cMapping 是映射数组的大小参数,ref [0] 是互操作的数组地址。与 cPaints 和 Paints 相同。映射是完全正确的 - 它是每个小窗口的子字符串偏移对数组,其中模板中的代码显示为生成文件中的代码。 Paint 是原始源中的子字符串偏移和颜色类型的数组。该信息用于为其余的非代码文本着色。老实说,最大的痛苦是重新编写解析/生成代码以继续并捕获所有输入/输出文本偏移量。
  • @loudej:感谢您的澄清! @Martijn:我已经设法将这些东西重写为 NHaml,但不幸的是 NHaml 使用了一种替代 Spark 的解析/代码生成方法,所以我必须了解它是如何工作的。我不想用太多东西让它膨胀。
【解决方案2】:

【讨论】:

    【解决方案3】:

    我终于设法修改代码以支持 NHaml。一点也不难。不幸的是,原来的 NHaml 库不支持所有需要的东西,所以我不得不为 NHaml 创建一个新的解析器。它不支持所有的结构,但它支持大多数(足以使 NHaml 编程更容易)

    下载:http://github.com/sztupy/nhamlsense

    截屏:http://www.youtube.com/watch?v=8jTZ2zC9eYc

    【讨论】:

      【解决方案4】:

      您可以通过创建或修改 usertype.dat 文件轻松add keywords。检查here 以获取有关附加到特定文件扩展名的一些说明。这可能会让您至少完成部分工作,而无需重做完整的 c# 语法。

      (事实上,在这种情况下,我不确定您所说的“语法突出显示”到底是什么意思。我敢肯定,例如,您可以在编辑器中免费获得大括号匹配突出显示)。

      【讨论】:

      • 上下文是他为 Visual Studio 开发了一个插件,该插件提供语法高亮(漂亮的颜色),提供大括号匹配,您必须解析代码,并在视觉上告诉工作室大括号对/元组的位置是。