2012-12-10 14 views
16

Sto provando a generare codice sorgente Java con JDT/AST. Ora ho MethodDeclaration e voglio aggiungere uno snippet di codice (da un'altra fonte) al corpo del metodo. Lo snippet di codice può contenere qualsiasi codice Java, , anche se il codice sintatticamente non è valido. Non riesco proprio a trovare il modo di farlo.Come aggiungere uno snippet di codice al corpo del metodo con JDT/AST

Con JCodeModel si utilizza JBlock#directStatement(String s) method.

C'è un modo per farlo con JDT/AST?

+2

Le manipolazioni AST generalmente richiedono alberi sintatticamente validi. Se hai un codice non valido per il metodo, in generale, non avrai una struttura valida da inserire e non sarai in grado di farlo, o sarai in grado di farlo ma otterrai solo un albero senza senso come risultato. –

+0

Ok, JST/AST non sembra essere lo strumento giusto allora ... – Morrandir

+0

Perché è necessario inserire un codice non valido? –

risposta

9

Poiché si dispone di un albero ben formato per il resto dell'applicazione e si desidera inserire testo non ben formato in un punto particolare, non è possibile farlo con i meccanismi di inserimento del nodo dell'albero standard. .

Ciò che importa è che si produca del testo per il testo del programma valido con il frammento inserito in al posto giusto. Da qualche parte in là deve esserci un pezzo di logica che stampa l'AST come testo. Quello che devi fare è chiedere che l'AST sia stampato come testo e catturarlo nel mezzo di quel processo, nel punto preciso necessario, per inserire il tuo testo arbitrario.

Il nostro software DMS Reengineering Toolkit ha inserito/esci i nodi del nodo di stampa nella sua prettyprinter per consentire questo tipo di operazioni.

Se queste cose non esistono in JDT/AST, puoi provare a modificare la sua prettyprinter per darti quel gancio. In alternativa, potresti prendere in considerazione la modifica di JDT/AST aggiungendo un altro tipo di nodo dell'albero che non fa parte del set standard, che semplicemente contiene testo arbitrario ma agisce come un nodo del metodo. Presumibilmente ogni nodo controlla ciò che è stampato; quindi potresti definire il prettyprinting per quel nodo dell'albero, per farlo pubblicare il suo testo.

Una soluzione davvero hacky finale: inserire un AST perfettamente valido in cui il testo arbitrario andrà, contenente qualche parte un identificatore fasullo con un nome univoco, ad esempio, ZZZ. Quindi, stampare AST su una stringa e post-elaborare la stringa per sostituire gli alberi fasulli contenenti il ​​nome univoco con il testo utente effettivo.

+0

Grazie mille! :-) – Morrandir

3

Per prima cosa è necessario analizzare lo snippet di codice in un AST. È possibile utilizzare l'API ASTParser per questo scopo.

È possibile ottenere i problemi di compilazione di un'unità di compilazione (vedere CompilationUnit.getProblems()).

Ci sono un paio di modi per modify Java code using JDT. Ti suggerirei di prendere in considerazione l'API ASTRewrite per modificare il corpo di un metodo.

+0

Bene, ho controllato il riferimento API prima, ma non sono riuscito a trovare un modo per aggiungere uno snippet di codice arbitrario. Considera che lo snippet di codice potrebbe contenere codice sintatticamente non valido. (Ho appena aggiunto questo alla domanda originale ...) – Morrandir

+0

È possibile analizzare lo snippet di codice arbitrario. Quindi, inserire i nodi AST risultanti nel nodo AST del corpo del metodo. Il parser di Eclipse tollera in una certa misura gli errori di sintassi. – reprogrammer

+0

"In una certa misura" non è abbastanza purtroppo. :( – Morrandir

Problemi correlati