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

相關問題