Visual Studio语言服务与C#智能感知

9
去年我为Visual Studio编写了一个语言服务,为NHaml文件添加了语法高亮:http://github.com/snappycode/hamleditor
NHaml是一种HTML模板语言,可以像aspx文件一样混合代码元素。该插件为IDE添加了对编辑NHaml文件的支持,但基本上只添加了语法高亮。
我想知道是否有人知道如何像在aspx文件中一样添加内联C#智能感知到该服务。我希望这可以在不为插件编写整个特定于C#语法的语法分析器的情况下实现。
有人编写过混合语言的语言服务吗?
更新: 看起来Spark视图引擎的开发人员在这方面已经取得了一些进展,我正在调查他们的实现。

当你查看 Spark 视图引擎代码时,有没有发现任何有用的东西? - Jake
是的,看起来他们转向了 C++。http://whereslou.com/2008/12/03/ivsintellisenseless 我将尝试在C#中让它运行,但需要支持一些疯狂的未记录接口。 - whatupdave
是的,降级到ATL COM对于掌握情况非常有帮助,因为您可以跟踪对象上的QueryInterface调用以收集有关VS期望的提示。还有另一个不错的技巧,您可以获取对象引用并在注册表中为每个IID调用QI,以发现尽可能多的公开接口。我不知道如何在C#中进行此类COM级别的探索。 - loudej
在VS2010中,这会变得更容易吗?据我所读(不记得来源),他们花了精力使创建插件变得更加容易。 - Boris Callens
4个回答

2
我查看了Spark View Engine,他们似乎已经制作了一个通用的ATL库(叫做SparkLanguagePackageLib),实际上似乎并不包含任何特定于Spark的内容。它似乎只是一个通用的C#智能感知库,需要以下内容:
  • 原始代码
  • 从原始代码生成的C#源代码
  • 两者之间的位置映射(例如第2行第5个位置的代码在输出中映射为第4行第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视图引擎的Intellisense支持,它也可以被其他视图引擎使用
  • 您只需要创建一个类,将原始nhaml文件与其生成的C#副本进行映射。

顺便问一下,您还在继续开发这个NHaml Intellisense库吗?如果没有,我将尝试修补他们的实现,希望可以轻松转换为NHaml。


这个有任何更新吗?有没有人成功地将Spark类移植到NHaml? - Martijn Laarman
cMapping是映射数组的大小参数,ref [0]是与interop相关的数组地址。cPaints和paints也是如此。映射正好是为每个小窗口中的子字符串偏移对创建的数组,在该窗口中,模板中的代码显示为生成文件中的代码。Paint是原始源中子字符串偏移和颜色类型的数组。该信息用于给其余的非代码文本着色。老实说,最大的痛苦是重新设计解析/生成代码以继续并捕获所有输入/输出文本偏移量。 - loudej
@loudej:感谢澄清!@Martijn:我已经成功将这些东西重写为NHaml,但不幸的是NHaml使用了与Spark不同的替代解析/代码生成方法,所以我必须学习它的工作原理。我不想用太多东西来膨胀它。 - SztupY

1

我终于成功修改了代码以支持NHaml。这并不难。不幸的是,原始的NHaml库并不支持所需的所有内容,因此我不得不为NHaml创建一个新的解析器。它并不支持所有结构,但它支持大部分(足以使NHaml编程更容易)

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

演示视频链接:http://www.youtube.com/watch?v=8jTZ2zC9eYc



0

您可以通过创建或修改usertype.dat文件来轻松添加关键字。请查看这里以获取有关附加到特定文件扩展名的说明。这可能会让您至少完成部分工作,而无需重新制作完整的C#语法。

(实际上,我不确定您在此上下文中确切指的是“语法高亮”。例如,我确定编辑器中的大括号匹配高亮显示是免费的)。


他开发了一个为Visual Studio提供语法高亮(漂亮的颜色)的插件,为了提供括号匹配,你需要解析代码,并告诉Visual Studio哪些是括号对/元组。 - Simeon Pilgrim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接