也許你正在以不方便的方式討論這個問題。根據你所說的話,你需要一個工具來插入註解特定的代碼,在註釋中插入代碼。你想使用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就是其中之一,因爲它不會執行源代碼到源代碼的轉換)。
爲什麼你需要這樣做兩次?你爲什麼不運行一次「龍目島」進程,在哪裏運行它,並且完成它? –
正如我所說的,我想要使用註釋插入的代碼可能會有很大差異。我想自動執行程序以生成AST修改 – Julien
是的,我瞭解有關AST修改的一點。你沒有解釋爲什麼你想在兩個不同的地方實施AST修改。 –