2016-07-28 64 views
1

我面臨以下問題:我需要開發自定義Lombok註釋處理程序,並且這些處理程序應該將相當複雜的方法注入到對象中。由於這是一個研究項目,該方法的內容可能會改變,我正在尋找一種方法來自動執行一些手動任務。將Java代碼轉換爲Eclipse和Javac AST注入語句

正如在post中所描述的那樣,創建自定義處理程序過程中的最大痛苦是兩次實現兩次,一次是Eclipse,一次是Javac,AST注入代碼添加方法語句。

所以我的問題是:有沒有任何工具/項目需要輸入一個Java文件和一個想要注入的方法名稱,並輸出將要插入的Java代碼(用於Eclipse和Javac)這個方法進入處理程序?

+0

爲什麼你需要這樣做兩次?你爲什麼不運行一次「龍目島」進程,在哪裏運行它,並且完成它? –

+0

正如我所說的,我想要使用註釋插入的代碼可能會有很大差異。我想自動執行程序以生成AST修改 – Julien

+0

是的,我瞭解有關AST修改的一點。你沒有解釋爲什麼你想在兩個不同的地方實施AST修改。 –

回答

1

也許你正在以不方便的方式討論這個問題。根據你所說的話,你需要一個工具來插入註解特定的代碼,在註釋中插入代碼。你想使用Lombok,因爲它提供了編寫自定義程序鉤子的能力,以便在每個註釋中攻擊AST。你似乎在抱怨編寫這種鉤子帶來的不便。

如果您使用具有源到源轉換的Program Transformation System,則可以使用非程序性且易於理解的方式對這些「掛鉤」進行編碼。源對源變換表述是這樣的:

 if you see *thispattern*, replace it by *thatpattern* 

(我叫建立DMS具有這些特性的程序變換系統,看到我的生物)。一個DMS源到源變換插入呼叫記錄中標記的記錄方法可能是:

domain Java~v8; 
    rule insert_call_logging(p: access_declarations, 
          t: type, 
          m: IDENTIFIER, 
          a: arguments, 
          s:statements): 
       method_declaration -> method_declaration 
    " @LogCalls \p \t \m(\a) { \b } " 
     -> " \p \t \m(\a) { Log(\tostring\(\m\)); \b } "; 

規則insert_call_logging識別方法metavariable 結合的方法名,並結合該方法的其他部分給其他元變量。該邁達克,並幫助 規則處理器從規則語言的語法區分Java語法。

什麼這個規則做的是尋找那些專門註釋LogCalls的方法,並通過更換其中註釋消失的方法以及方法名稱(\ tostring(\ m))的文本字符串的日誌記錄調用已作爲方法主體中的第一條語句插入。

直接表示模式意味着您不必編寫大量自定義代碼來上下查看/更改結構的語法樹;就是這樣因爲你太瞭解AST的形狀了,所以在實踐中很痛苦。

直接在模式 中包含註釋信號,您不必將自定義代碼附加到註釋處理器;除非您表達的特定註釋存在,否則規則本身不會觸發。

這條規則可能不夠複雜,但如果需要的話,您可以編寫更復雜的規則。這可以讓你插入任意複雜的東西,或以任意複雜的方式改變代碼結構。

有幾個PTS在那裏,能夠在不同程度上做到這一點。(可以說,Lombok就是其中之一,因爲它不會執行源代碼到源代碼的轉換)。

1

您可以看看實驗lombok.ast項目。

它還有一個模板解析器,您可以用其他ast替換特殊節點。

它是實驗性的,關於如何使用它沒有很多文檔。 github項目的所有者可能會幫助你。

披露:我是一名龍目島開發人員。