我有兴趣为SQL和C#编写一个通用的Intellisense启用编辑器(如果可能,等等!)。我想在C#中将其作为重写或扩展的WPF richTextBox类型控件。我知道有很多可用的示例项目,我已经实现了我自己的基本版本;但我遇到的大多数例子(实际上是我自己的)都是基本的。
一些代码示例如下:
但是,我发现了一个使用Intellisense QueryCommander SQL Editor By Mikael Håkansson的SQL编辑器的一个很好的例子,它似乎运行良好。 Microsoft必须使用命令关键字的XML库,但我的问题是:Microsoft如何(详细地)实现他们的智能感知(as-you-type Intellisense)以及创建我自己的同一标准有多难?
编辑答:一年过去了,我已经设法用基本的智能感知开发我自己的编辑器控件,主要是为了我自己的“享受”。我想我会回来提供一个免费提供的.NET项目列表,帮助我自己开发,可以开箱即用,免费:
编辑B:提问后15个月,我仍在寻找新的改进编辑。这个很好......
编辑C:问题2年以上,我发现了以下项目,两者都使用WPF并由AvalonEdit支持。
微软如何(详细)实现他们的类型智能感知?
我可以将它描述为您想要命名的任何详细程度,但我没有时间进行简短的解释。我将解释我们如何在Roslyn中做到这一点。
首先,我们使用可以有效表示编辑的数据结构构建令牌流的不可变模型,因为显然编辑正是将会有很多内容。
使持久重用有效的关键见解是表示令牌的字符长度,而不是编辑缓冲区中的字符位置;请记住,文件末尾的标记将在每次编辑时更改位置,但标记的长度不会更改。如果您希望在极大文件上有效,则必须不惜一切代价最大限度地减少总修复次数。
一旦你有一个可以处理插入和删除的不可变模型来构建一个不可变的令牌流,而不是每次都重新整理整个文件,你就必须做同样的事情,但是要进行语法分析。这实际上是一个相当困难的问题。我建议你获得计算机科学的本科或研究生学位,重点是解析器理论,如果你还没有。我们获得了博士论文的人的帮助,他们在解析器理论上做了他们的论文来设计这个算法的特定位。
然后,显然,构建一个可以分析C#的语法分析器。记住,它必须分析破碎的C#,而不是正确的C#;当程序处于非编译状态时,IntelliSense必须工作。因此,首先提出具有良好错误恢复特性的语法修改。
好了,所以现在你已经有了一个解析器,它可以有效地进行语法分析,而不需要重新编译或重新解析除编辑区域之外的任何东西,大多数情况下,这意味着你可以在击键之间完成工作。我忘了提及,当然你需要提出一些机制来阻止UI线程,而在进行所有这些分析时,如果分析发生的时间要比两次击键之间的时间长。 C#5的新“异步/等待”功能应该有所帮助。 (我可以从个人经验告诉你:小心任务的扩散和取消令牌。如果你粗心大意,就有可能进入一个有数万个被取消的任务待定的状态,这并不快。 )
现在您已经进行了语法分析,您需要构建一个语义分析器。由于您只是在进行智能感知,因此它不需要是一个特别复杂的语义分析器。 (我们的语义分析器必须进行适合于从正确的程序生成代码并从错误的程序中纠正错误分析的分析。)当然,它还必须对损坏的程序进行良好的语义分析,这确实会大大增加复杂性。
我的建议是从构建“顶级”语义分析器开始,再次使用不可变模型,该模型可以将源代码中声明的代码类型的状态从编辑保持到编辑。顶级分析器处理的不是语句或表达式:类型声明,指令,命名空间,方法声明,构造函数,析构函数等。编译器生成元数据时构成程序“形状”的东西。
元数据!我忘记了元数据。你需要一个元数据阅读器。显然,您需要能够在引用库中类型的表达式上生成IntelliSense。我建议使用CCI库作为元数据阅读器,而不是反射。由于您只是在进行智能感知,显然您不需要元数据编写器。
无论如何,一旦你有一个顶级语义分析器,那么你可以编写一个语句和表达式语义分析器来分析给定语句中表达式的类型。特别注意名称查找和重载解析算法。方法类型推断将特别棘手,尤其是在LINQ查询中。
一旦掌握了所有这些,智能感知引擎应该很容易;只需计算当前光标位置的表达式类型并适当显示下拉列表。
我创建自己的同一标准有多难?
好吧,我们有一个团队,称之为十个人,并且它可能需要,将它称为五年,以便从头到尾完成所有事情。但我们还有很多工作要做,而不仅仅是IntelliSense引擎。这可能只占工作的40%。哦,有一半的人在VB上工作,现在我想起来了。但是那些人平均可能有五到十年的工作经验,所以如果你以前从未这样做过,他们会比你更快。
因此,假设您需要大约十到二十年的全职工作,独自工作,为C#构建一个Roslyn品质的IntelliSense引擎,可以在击键之间对大型程序进行可接受 - 接近正确的分析。
显然,如果你需要先做博士,那就更长了。
或者,您可以简单地使用Roslyn,因为它就是它的用途。这可能需要几个小时,但你不能自己做到这一点。它很有趣!
您可以在此处下载预览版:
这是微软通常会产生很好结果的领域 - 微软的开发人员工具真的很棒。销售他们的开发人员工具以及销售Windows以获得最佳的智能感知具有明显的商业优势,因此微软有必要将他所描述的资源用于他非常详细的答案中。不过,我认为值得指出一些事情:
我的观点并不是将微软描述为效率低下的公司。我的观点是,微软做出了大量关于从招聘,团队组织到设计和实施的决策,这些决策始于对盈利能力和风险的假设,而这些假设根本不适用于非Microsoft的公司。
就智能感知而言,有各种各样的方法来思考这个问题。微软正在制作一个非常通用,可重复使用的解决方案,它不仅解决了智能感知,还针对代码导航,重构以及代码分析的各种其他用途。如果您的唯一目标是让开发人员轻松输入代码而不必输入太多内容,则无需以相同的方式执行操作。定位该功能不需要多年的努力,如果您不仅仅提供API,还可以执行各种创造性的事情,但实际上您也可以控制UI。