IDE从哪里获得完成候选人?

Amu*_*umu 2 ide autocomplete

哪里?有人可以给我这些流行语言的IDE中的源检索方法示例:

  • C/C++(Visual Studio,Eclipse):他们是否使用静态分析(内置于IDE中) - 基于项目根(包含配置文件,即包含路径)来检索候选?或者他们使用编译器后端获取源,即clang?像Visual Studio这样的IDE如何像Window API那样获得系统范围内的完成候选者并且如此快速地完成?
  • Java(Netbean,Eclipse):同样,他们在JDK中使用任何java二进制文件(java,javac ...)还是内置的静态解析器?
  • Javascript:与上面相同

Ily*_*hin 5

主要的IDE,如Visual Studio,Eclipse和IntelliJ Idea使用索引方法:解析所有项目文件并存储可能的完成符号(即方法名称).因此,当用户按下Ctrl + Space以调用完成列表时,编辑器会查找存储的符号以过滤最合适的候选项.

这些源代码解析器名为" 增量解析器 ",它们通过两个特性与普通解析器区分开来:

  1. 增量解析器不断工作.它必须始终与源代码的语法保持联系.因此,完成符号候选者的索引始终是最新的.
  2. 最终用户对源代码所做的小而频繁的更改应该被编入索引,而不会有任何明显的时间延迟.

增量解析器通过使用某种形式的缓存来实现这些目标.这个可视化演示说明了它们的工作原理:增量JSON解析器.我建议你试一试.

您也可能有兴趣阅读这些来源:

  1. 关于IntelliJ Idea中的源代码索引体系结构的文章:IntelliJ Idea中的语言插件.
  2. Eclipse内置Java增量解析器:Eclipse JDT.

不幸的是,实际上缺乏构建自己的增量解析器的工具.大多数IDE的核心解析器都是硬编码的,它们不共享任何常用方法.我上面提到的演示是使用不同的增量解析器库的罕见例外之一--Papa Carlo用于在Java,Scala和JavaScript中构建解析器.另一个例子是Parsley - Clojure语言的增量解析库.