智能感知和自动完成如何工作?

g3m*_*ini 1 regex intellisense code-completion visual-studio phpstorm

我一直在想:自动完成是如何工作的?

示例: 在 PhpStorm 中,每当我使用类并键入时,->它都会向我显示该类的所有属性和方法。它还自动完成命名空间甚至是 jQuery 等库中的函数。

它是在文件上运行某种正则表达式,还是以某种方式解析它们?

art*_*spb 5

PhpStorm 开发人员在这里。我想了解一些基础知识,以防它对那些想要实现自己的插件的人有所帮助。

首先,必须使用词法分析器将代码分解为标记。然后使用解析器构建 AST(抽象语法树)和 PSI(程序结构接口)。PhpStorm 有自己的词法分析器和解析器实现。这就是简单类的 PSI 树的样子。

PSI树

当您在编辑器中键入或显式调用完成操作 ( Ctrl+ Space) 时,将调用许多完成贡献者。它们旨在根据光标的位置返回建议列表。

让我们考虑在字段引用内调用完成的情况。

字段参考

PhpStorm 知道在当前位置可以建议所有类成员。它开始获取一个类引用($class在我们的例子中是变量)并确定它的类型。如果变量解析为类,则其类型是类的 FQN(完全限定名称)。

要获取类的方法和字段,需要其 PSI 元素。特殊索引用于将 FQN 映射到适当的PhpClass树元素。索引最初是在第一次打开项目时构建的,并针对每个修改过的文件进行更新。

PhpStorm 从 PSI 元素(包括父元素)中收集所有成员,然后从其特征中收集。它们根据当前上下文(例如访问范围)和已键入名称的部分 ( f) 进行过滤。

代码补全

建议显示在一个列表中,该列表按元素名称的匹配程度、类型、位置等排序。当您键入时,列表会重新排列。

当您按下Enter以插入一个元素时,PhpStorm 会再调用一个处理程序。它知道如何正确地将元素插入到代码中。例如,它可以为方法添加括号或导入类引用。在我们的例子中,因为该方法没有参数,所以在括号后面放置一个光标就足够了。

结果

基本上就是这样。值得一提的是,IntelliJ IDEA 平台允许插件为上述每个步骤提供一个实现。因此,可以针对某些特定框架或语言改进或扩展完成。