JetBrains的GoLand如何找到接口的实现?

How does GoLand of JetBrains find the implementations of interface?

据我所知,它是基于Guru for vim-go寻找需要编译整个项目的实现或用法为前提。否则,GoLand 不需要这样做,但是怎么做呢?

GoLand 依靠其之上的 IntelliJ Platform and a set of custom written tooling bundled as a custom language plugin 来处理索引、解析、导航和编辑代码。

虽然这项任务看起来微不足道,但 GoLand 使用了一些技巧来更有效地执行它。让我们一步一步来探索它是如何工作的。

  1. 第一次打开项目时,IDE 执行所谓的索引。特别是,它存储所有方法和方法规范名称以及它们的参数数量。
  2. 在搜索开始时,GoLand 获取接口的方法规范,并找到参数数量最多的方法规范。这是一个性能优化。其背后的想法是具有许多参数的方法在代码中出现的频率较低,因此 IDE 只需要检查其中的几个。
  3. 是时候使用索引了。对于选择的方法规范,IDE 找到所有对应的方法。范围被考虑在内,因此对于私有接口,例如,它要小得多。
  4. 对于每个方法,GoLand 解析它的类型并检查它是否实现了接口。这是考虑所有接口方法规范的时刻。
  5. 不仅结构可以实现接口,其他接口也可以。作为接下来的步骤,IDE 查找所有对应的方法规范,即具有相同名称和参数个数的方法规范。有一个单独的索引负责这个。
  6. 对于每个方法规范,都会获取并检查其接口。这次不涉及解决方案,因为它足以遍历语法树以找到任意方法规范的接口。

算法基本上就是这样。还有一些实现细节可以使其运行得更快,但它们不会影响结果。