Delphi 10.4中的新增功能:重新设计了Code Insight

2020-05-17

以下中文由谷歌翻译而来。


在10.4版中,我们重新设计了代码完成和其他功能。这是十年来对IDE的最重要的改变之一。

Code Insight是什么意思?

首先,一些背景。如果您熟悉Code Insight,请跳过...

Code Insight是我们在编辑器中提供的一组IDE生产力功能的名称。就本博客而言,这些功能是:

  • 代码完成预测您要键入的内容的下拉列表框。在标识符后键入句点(.)或按Ctrl + Space时出现

  • 参数完成显示的提示显示方法的参数,包括重载方法的多个变体。方法括号内Ctrl + Shift +空格。

  • 查找声明:右键单击标识符,然后单击查找声明,它将带您到定义该方法,变量,类型等的位置。您还可以按住Control键并将鼠标移到编辑器上,并且适用的标识符将变成超链接,您可以单击这些超链接来找到它们的声明,即代码浏览

  • 工具提示将鼠标悬停在变量或类型上,将显示有关其的信息。有时,其中包括XMLDoc,称为Help Insight(我们需要在文档中澄清名称。)

  • Error Insight 在编译之前显示代码中的错误。这些也被称为“红色弯曲”,这是许多人的首选术语-代码下的红色之字形线。错误也显示在“ 结构”视图的“错误”节点中

这些功能已经在Delphi中提供了很多年。编写IDE时,此类功能对您来说是一个关键的好处。代码完成特别节省了很多键入工作,而错误洞察力可以帮助您在花费时间进行编译之前确保代码能够正常工作。

经典代码提示

随着语言的发展和时间的流逝,这些功能不再总是能像我们期望的那样发挥作用。这项技术在引入时是最先进的,但是我们今天可以做出一定的改进。

通常会看到有关虚假错误的错误报告(即,当源代码实际上是完全正确的代码时,在编辑器中或在“结构”视图中报告的错误。)或者IDE在主线程中起作用,因此在响应时不会响应按键它正在显示代码完成列表。(您只能按Escape取消。)有时,对于大型项目,计算代码完成数据可能会在IDE中占用大量内存。此外,这些功能还通过多个代码解析器实现:代码完成和错误洞察力对代码的理解不同。最后,在调试时禁用了代码洞察功能,因此,如果您在调试时编写代码,则无法获得生产力的帮助。

我们不希望这种情况继续下去。我们对10.4的目标是:

  • 使Code Insight 异步 -即在另一个线程或另一个进程(或两者)上运行,以便即使您在后台工作,IDE也会在您键入时始终响应

  • 减少或什至完全删除(您可以看到它的去向)从IDE中完成代码的潜在内存使用量

  • 确保Error Insight始终给出正确的结果 -也就是说,它应准确给出编译器将要给出的错误,并且正确的代码不应显示任何错误

  • 帮助我们进一步在IDE中为Delphi源提供单个解析器,从而使“单一事实源”或对IDE中Delphi代码的含义有单一理解

  • 现代化Delphi的代码工具方法以使用现代技术

  • 并同时解决代码完成中的许多错误

  • 并添加至少一个代码完成功能...等待!同时添加两个新的代码完成功能!

所有这些都在Delphi 10.4中。

激动吗 我们是。这是十五年来对Delphi IDE的最大,最好的变化之一。

(不必担心-如果需要,经典代码洞察力仍然存在,并提供了一些新的错误修复,并且可以根据需要在10.4中启用。)

Delphi 10.4中的Code Insight技术

在10.4中,上述代码洞察功能是使用“ LSP服务器”实现的。您可能已经听说过这项技术,但是如果没有,LSP就是指语言服务器协议,它是一种标准化的方法,可以为多种语言实现类似代码洞察的功能。IDE与“语言服务器”对话,“语言服务器”是一个小型助手应用程序,用于计算并生成IDE显示的信息。它使用定义的协议来执行此操作,这就是语言服务器协议。

换句话说,当您执行诸如打开项目或在文件中键入击键之类的操作时,IDE现在会与助手应用程序进行对话,并且IDE会定期向其询问问题,例如:“此位置的完成结果是什么? ?”。该助手应用程序会跟踪您的代码,并发送回任何问题的答案,以及在此过程中在代码中遇到的任何错误。

我们的服务器应用围绕编译器构建,使用编译器作为服务来提供LSP结果。这意味着IDE向您显示的所有数据(包括“红色波浪状”错误)都是来自编译器本身的数据。

这意味着几件事:

  • 与另一个进程的通信是异步的。在IDE中,它是在另一个线程中实现的。您可以继续输入,甚至关闭文件或打开其他项目,而IDE则在等待听回所请求的数据

  • 这项工作是在另一个过程中完成的。这意味着用于计算结果的所有内存使用都不再在IDE本身中。IDE拥有更多的内存,并且助手应用程序可以使用其全部内存空间来专门提供结果

  • 它使用适用于多种语言的现代标准化协议

  • 您在屏幕上看到的就是编译器看到的。这意味着它应该是准确的。如果您的代码可以编译,您将不会看到任何Error Insight错误。相反,如果在代码或“结构”视图中确实看到红色的波浪形下划线,则代码将无法编译。

  • 您可以在调试时获得代码完成。

这些都是非常好的东西。

但是足够的文字。让我们看看它的实际效果!

现代Delphi代码洞察力

很难在博客中显示响应能力。在这些静态屏幕截图中,仅假设您正在键入并且您永远不会看到Windows等待光标。

当我们发布10.4时,想象力将变为现实!

调试时的代码洞察

第一个新功能是一个很大的功能,不需要很多单词。您可以在调试时使用Code Insight。

是否想同时调试您的应用并键入代码,并获得代码完成?您可以。

是的,您看到的是正确的-在您积极调试应用程序时,代码完成和错误洞察都可以正常工作。

完成结果

获得代码完成与10.3.3中的相同,除了IDE在10.4中保持响应。但是,我们添加了另一个新功能,使您可以通过代码完成更轻松地找到所需的内容。 在10.4中,代码完成现在将显示比过去更有用的结果-但仍将10.3.3的项保留在结果列表的顶部。

是10.3.3的代码完成,在VCL TButton实例后键入“ act”:

请注意,10.3.3显示的结果很少-实际上只有一个。经典代码完成仅列出您输入的内容开头的项目

这是10.4的操作(针对双关语),用于完成相同的操作:

在10.4中,代码完成功能列出了所有包含您键入内容的项目。其他IDE也可以这样做,例如Visual Studio,但是直到现在,Delphi的列表仍然有限。这很有用,因为它允许您搜索完成。

例如,假设您记得一个控件具有一个something-Rect属性,但是您不记得它被调用了什么。在10.3.3中,您必须使用Google。在10.4中,只需输入“ rect”,您将看到:

您可以通过键入来探索代码。

获得更多结果可能并不总是您所追求的,并且您可能只希望期望从习惯中键入的内容开始。默认情况下,为了使行为接近10.3.3中您所熟悉的行为,我们对完成列表进行排序,以便将所有以-开始的标识符放在所有包含标识符的上方。换句话说,该列表将给出与10.3.3相同的结果,但会附加其他结果。如果您不想使用,则不需要使用它们。它们位于10.3.3向您显示的项目之后。

如果您想要像其他IDE一样的行为,将所有结果一起列出,我们可以进行设置:当前是一个注册表项,但可以将其公开为UI。这意味着,如果您习惯了VSCode所提供的功能,也可以做到。

在10.4中,对所有以您一起键入的内容开头的项目进行排序。这是您在10.3.3中看到的内容,并且是10.4中的默认值。在10.4中,仅按范围排序,以便一起显示包含您键入内容的所有项目。这与Visual Studio或其他IDE更相似,并且默认情况下处于禁用状态。

在完成清单中选择

代码补全会自动按照以下顺序为您选择列表中的最佳项目(因此您可以按Enter或Space或'。'或类似的按钮来选择该项目并保持编码):

  • 与您输入的内容完全匹配。如果没有匹配项:

  • 以您输入的内容开头的项目中,最短的标识符。如果没有开始项:

  • 在包含您键入内容的项目中,最短的标识符

将开始优先于-包含意味着完成列表将自动选择“父项”而不是“ SetParent”。选择最短的匹配意味着它将在“ ParentFont”上选择“ Parent”。(您可以在上面的屏幕截图中看到它。)通常,我们发现此匹配项与您最有可能键入的内容相匹配。当然,您可以滚动并按上下箭头以选择所需的任何内容。

错误洞察

请注意,在这些屏幕截图中,您可以看到实时的Error Insight,并在您键入时更新。部分类型的标识符“ pare”(不是有效的代码)正确地用红色下划线标记。(当您从完成列表中选择一个项目时,下划线将消失。)Error Insight结果来自编译器本身,并准确反映并报告编译器看到的内容。

您永远不会在编辑器或“结构”窗格中看到不正确的错误。您在屏幕上看到的是准确的。

多进程架构

以下内容对于功能而言并不重要,但可能会使您在技术上感兴趣。

我提到过LSP服务器是作为一个单独的进程运行的,它具有许多好处,包括用于代码洞察的专用4GB内存地址空间。如果您查看Windows任务管理器中运行的10.4,将看到多个DelphiLSP进程。第一个控制多个代理,我们有一个专门提供完成和其他结果的代理,还有一个专门提供错误洞察的代理。

据我所知,我们是唯一使用多进程架构的LSP服务器。

质量

在实施此功能时,我们还发现并解决了过去影响代码完成的许多问题。

下一步

新的代码完成不同于10.3.3和更早版本的代码完成。我们一直在努力使它尽可能相似,其中包括一些调整,例如对开头进行排序(以其他项目开头的项目),以使您在首次使用它时熟悉它。我们希望在几分钟之内您会习惯于不要再回到10.3.3了!但是我们不想完全一样地提出这一点:您会发现差异。

Delphi 10.4中新的Code Insight解决了很多问题,并使使用IDE也给您带来了更加愉悦和响应迅速的体验。更不用说额外的结果,它可能非常有用。我们计划继续努力,以实现上述目标。但是,在10.4中,我们和Beta测试人员发现它是IDE的重要补充。

此外,我们甚至添加了两个新功能:允许您通过代码完成来探索代码,以及在调试时使用包括代码完成和其他Code Insight功能在内的Code Insight。

我们对此功能感到非常兴奋。异步。响应式IDE。现代协议。支持其他语言。调试时代码完成。好东西 我们等不及您获得10.4并亲自尝试。

基于LSP的新CodeInsight非常出色。这将彻底改变产品。



阅读541