我一直想知道:自动填充如何运作?
示例:
在PhpStorm中,每当我使用类并键入->
时,它都会显示该类的所有属性和方法。它还自动完成名称空间甚至是jQuery等库中的函数。
它是否在文件上运行某种正则表达式,还是以某种方式解析它们?
答案 0 :(得分:4)
PhpStorm开发人员在这里。我想介绍一些基础知识,以防对那些想要实现自己的插件的用户有所帮助。
首先,必须使用lexer将代码分解为代码。然后使用parser构建AST(抽象语法树)和PSI(程序结构接口)。 PhpStorm有自己的词法分析器和解析器的实现。这就是PSI树在简单类中的样子。
当您键入编辑器或显式调用完成操作( Ctrl + Space )时,会调用许多completion contributors。他们打算根据光标的位置返回建议列表。
让我们考虑在字段引用中调用完成的情况。
PhpStorm知道在当前位置可以建议所有班级成员。它开始获取类引用(在我们的例子中为$class
变量)并确定其类型。如果类的变量resolves,则其类型为类' FQN(完全限定名称)。
要获取类的方法和字段,需要其PSI元素。特殊索引用于将FQN映射到适当的PhpClass
树元素。首次打开项目时,最初会构建索引,并针对每个已修改的文件进行更新。
PhpStorm从PSI元素中收集所有成员(包括父母的成员),然后从其特征中收集。它们会根据当前上下文(例如访问范围)和已输入名称的部分(f
)进行过滤。
建议显示在一个列表中,该列表按好的元素名称匹配,类型,位置等排序。键入时列表会重新排列。
当您按 Enter 插入元素时,PhpStorm会再调用一个处理程序。它知道如何将元素正确插入代码中。例如,它可以为方法添加括号或导入类引用。在我们的例子中,它足以放置括号并将光标放在它们之后,因为该方法没有参数。
基本上就是这样。值得一提的是,IntelliJ IDEA平台允许插件为上述每个步骤提供实现。因此,可以针对某些特定框架或语言改进或扩展完成。