6

正如 Eclipse 文档所建议的那样,我有一个org.eclipse.core.resources.IncrementalProjectBuilder可以编译每个源文件的文件,并且我也有一个org.eclipse.ui.editors.text.TextEditor可以单独编辑每个源文件的文件。每个源文件都被编译到自己的编译单元中,但它可以引用其他(已经编译的)源文件的类型。

两个重要的任务是:

  1. 编译(以确保我们使用的类型确实存在)
  2. 自动完成(查找类型,以便我们查看其上存在哪些属性/方法)

为此,我想将所有已编译类型的表示形式存储在内存中(以下称为我的“类型存储”)。

我的问题有两个:

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

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

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

4

1 回答 1

2

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

首先,关于 JDT:

是的,JDT 确实会读取类文件以获取其某些信息,但仅限于没有源代码的库。而且这些信息实际上只用于编辑辅助(内容辅助、导航等)。

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

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

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

在对 JDT 的工作原理进行了一些说明之后,以下是您的问题的一些可能答案:

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

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

于 2011-04-23T21:22:37.123 回答