6

正如Eclipse文档所建议的,我有一个编译每个源文件的org.eclipse.core.resources.IncrementalProjectBuilder,另外我还有一个可以编辑每个源文件的org.eclipse.ui.editors.text.TextEditor。每个源文件都被编译到它自己的编译单元中,但它可以引用其他(已编译的)源文件的类型。使用Eclipse构建DSL时,增量编译的最佳方法是什么?

两项任务,也是它重要的是:

  1. 编译(确保我们实际上正在使用的类型存在)
  2. 自动完成(查找的类型,所以我们可以看到什么样的属性/方法是存在的)

为了做到这一点,我想存储在内存中的所有编译类型的表示(下面称为我的“类型存储”)。

我的问题是双重的:

  1. 任务一个以上由编辑的建设者和任务二进行。为了让他们都可以访问这个类型的商店,我应该在他们都可以访问的地方创建一个静态存储,或者Eclipse是否提供了一个更好的方法来处理这个问题?请注意,这是eclipse,而不是我,在需要时实例化构建器和编辑器。

  2. 打开eclipse时,我不想重建整个项目,所以我可以重新填充我的类型存储。到目前为止,我的最佳解决方案是将此数据保存在某处,然后从中重新填充我的商店(可能在项目打开时)。这是其他增量编译器通常这样做的吗?我相信Java的方法是使用一个特殊的解析器,从类文件中有效地提取这些数据。

任何见解将非常感激。这是我的第一个DSL。

回答

2

这是一个有趣的问题,并没有一个简单的解决方案。我将尝试描述一个潜在的解决方案,并且更详细地描述JDT如何完成增量编译。

首先,一些关于JDT:

是,JDT不读类文件将其部分资料,但仅限于没有源代码库。而这些信息实际上仅用于编辑协助(内容协助,导航等)。

JDT通过跟踪编译单元之间的依赖关系来计算增量编译。此状态信息存储在磁盘上,并在每次编译后检索和更新。

作为一个更完整的例子,假设在完整构建之后,JDT确定A.java依赖于依赖于C.java的B.java。

如果在C.java中有一个10结构变化(结构变化是可以影响外部文件的变化(例如,添加/删除非私有字段或方法)),则B.java将重新编译。 A.java将而不是重新编译,因为在B.java中没有结构变化。

上JDT如何运作该位澄清之后,这里有一些可能的问题的答案:

  1. 是。这必须通过静态可访问的全局对象完成。 JDT通过JavaCore和JavaModelManager对象执行此操作。如果你不想使用全局单例,那么你可以通过你的插件的Bundle激活器实例访问你的类型商店。 e4项目确实允许依赖注入,这可能会更好(但不是真正的核心Eclipse API的一部分)。
  2. 我认为坚持文件系统上的信息是你最好的选择。确定增量编译依赖性的唯一真正方法是进行完整构建,因此您需要将信息保存在某处。再次,这是JDT如何做到的。这些信息存储在org.eclipse.core.resources插件某处的工作空间目录.metadata中。你可以看看org.eclipse.jdt.internal.core.builder.State类来查看实现。

因此,这可能不是您正在寻找的答案,但我认为这是解决您的问题的最有前途的方法。

+0

感谢您的详细解释。我认为你或多或少证实了我应该如何实现的怀疑,但了解Java插件如何解决问题很有用。 – 2011-04-25 08:00:52

相关问题