gpt4 book ai didi

c# - 通用智能感知的全新完整实现

转载 作者:IT王子 更新时间:2023-10-29 03:44:43 25 4
gpt4 key购买 nike

我有兴趣为 SQL 和 C# 编写一个通用的启用 Intellisense 的编辑器(等,如果可能的话!)。我想在 C# 中将其作为覆盖或扩展的 WPF richTextBox 类型控件来执行。我知道有很多示例项目可用,并且我已经实现了自己的基本版本;但我遇到的大多数例子(实际上是我自己的)只是基本的。

几个代码示例是:

  • DIY Intellisense By yetanotherchris
  • CodeTextBox - another RichTextBox control with syntax highlighting and Intellisense By Tamas Honfi

  • 然而,我发现了一个很好的 SQL 编辑器示例,带有 Intellisense QueryCommander SQL Editor By Mikael Håkansson这似乎运作良好。 Microsoft 必须使用命令关键字的 XML 库,但我的问题是:Microsoft 如何(详细地)实现他们的 Intellisense(as-you-type Intellisense)以及我创建自己的相同标准有多难?

    编辑 A:一年过去了,我已经设法开发了我自己的带有基本智能感知的编辑器控件,主要是为了我自己的“享受”。我想我会回来提供一份免费可用的 .NET 项目列表,这些项目帮助我进行了自己的开发,并且可以开箱即用且免费:
  • ICSharpCode (WinForms)
  • AvalonEdit (WPF)
  • ScintillaNET (WinForms)
  • Query Commander [for example of intellisense implementation] (WinForms)


  • 编辑 B:提出问题 15 个月后,我仍在寻找新的改进编辑器。这个不错。。。
  • RoslynPAD很酷!


  • 编辑 C:从问题开始 2 年以上,我发现了以下项目,均使用 WPF 并由 AvalonEdit 支持。
  • CodeCompletion for AvalonEdit使用 NRefactory。这个项目非常好,并且使用 NRefactory 完整实现了智能感知。
  • ScriptCS ScriptCS 使使用简单的文本编辑器编写和执行 C# 变得容易。
  • 最佳答案

    How (in detail) do Microsoft implement their as-you-type Intellisense?



    我可以将它描述到您想命名的任何详细程度,但我没有时间进行简短的解释。我将解释我们如何在 Roslyn 中做到这一点。

    首先,我们使用可以有效表示编辑的数据结构构建 token 流的不可变模型,因为显然编辑正是将有很多的。

    使其持久重用高效的关键在于表示标记的字符长度,而不是它们在编辑缓冲区中的字符位置;请记住,文件末尾的标记将在每次编辑时更改位置,但标记的长度不会改变。 如果你想在极大的文件上有效率,你必须不惜一切代价最小化总重新词法的数量。

    一旦您拥有一个可以处理插入和删除以构建不可变标记流而无需每次都重新对整个文件进行词法分析的不可变模型,您就必须做同样的事情,但要进行语法分析。这实际上是一个相当困难的问题。如果您还没有,我建议您获得计算机科学的本科或研究生学位,重点是解析器理论。我们得到了博士的帮助,他们在解析器理论方面做了论文,以设计算法的这一特定部分。

    然后,显然,构建一个可以分析 C# 的语法分析器。请记住,它必须分析损坏的 C#,而不是正确的 C#; IntelliSense 必须在程序处于非编译状态时工作。因此,首先要对具有良好错误恢复特性的语法进行修改。

    好的,现在您有了一个解析器,它可以有效地进行语法分析,而无需重新词法分析或重新解析除编辑区域之外的任何内容,大多数情况下,这意味着您可以在击键之间进行工作。我忘了提及,当然,如果分析发生的时间比两次击键之间的时间长,您需要想出一些机制来在执行所有这些分析时不阻塞 UI 线程。 C# 5 的新“async/await”特性应该会对此有所帮助。 (我可以从个人经验告诉你:小心任务和取消 token 的扩散。如果你不小心,可能会进入有数万个取消任务待处理的状态,而且速度并不快。 )

    现在您已经有了语法分析,您需要构建一个语义分析器。由于您只是在执行 IntelliSense,因此它不需要是一个特别复杂的语义分析器。 (我们的语义分析器必须做适合从正确程序生成代码的分析,以及从错误程序中纠正错误分析。)但当然,它也必须对损坏的程序进行良好的语义分析,这确实大大增加了复杂性。

    我的建议是首先构建一个“顶级”语义分析器,再次使用一个不可变模型,该模型可以从编辑到编辑保持源代码中声明类型的状态。顶级分析器处理任何不是语句或表达式的内容:类型声明、指令、命名空间、方法声明、构造函数、析构函数等等。当编译器生成元数据时,构成程序“形状”的东西。

    元数据!我忘记了元数据。您需要一个元数据阅读器。显然,您需要能够在引用库中类型的表达式上生成 IntelliSense。我建议使用 CCI 库作为元数据阅读器,而不是 Reflection。由于您只使用 IntelliSense,显然您不需要元数据编写器。

    无论如何,一旦有了顶级语义分析器,就可以编写语句和表达式语义分析器来分析给定语句中的表达式类型。特别注意名称查找和重载解析算法。方法类型推断将特别棘手,尤其是在 LINQ 查询中。

    一旦你掌握了所有这些,IntelliSense 引擎应该很容易;只需计算当前光标位置的表达式类型并适当显示下拉列表。

    how hard would it be for me to create my own of the same standard?



    好吧,我们有一个团队,称其为十人,可能需要花费五年的时间才能从头到尾完成整个事情。但是,除了 IntelliSense 引擎之外,我们还有很多工作要做。这可能只是工作的 40%。哦,现在我想起来了,其中一半的人都在研究 VB。但是这些人平均可能有五到十年从事此类工作的经验,因此如果您以前从未这样做过,他们会比您更快地完成这项工作。

    因此,假设您需要花费大约 10 到 20 年的全职工作,单独工作,才能为 C# 构建 Roslyn 质量的 IntelliSense 引擎,该引擎可以在两次击键之间的时间内对大型程序进行可接受的接近正确的分析。

    显然,如果您需要先攻读博士学位,则需要更长的时间。

    或者,您可以简单地 使用 Roslyn,因为这就是它的用途 .这可能会花费您几个小时,但您不会从中获得乐趣。这很有趣!

    您可以在此处下载预览版:

    http://www.microsoft.com/download/en/details.aspx?id=27746

    关于c# - 通用智能感知的全新完整实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9556026/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com