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.
fonte
2012-12-16 06:46:33
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. –
Ok, JST/AST non sembra essere lo strumento giusto allora ... – Morrandir
Perché è necessario inserire un codice non valido? –