2012-12-10 8 views
16

Próbuję wygenerować kod źródłowy Java za pomocą JDT/AST. Mam teraz MethodDeclaration i chcę dodać fragment kodu (z innego źródła) do treści metody. Fragment kodu może zawierać dowolny kod Java, nawet składniowy nieprawidłowy kod. Po prostu nie mogę znaleźć sposobu, żeby to zrobić.Jak dodać fragment kodu do treści metody za pomocą JDT/AST

Przy użyciu JCodeModel można użyć JBlock#directStatement(String s) method.

Czy można to zrobić za pomocą JDT/AST?

+2

Manipulacje AST na ogół wymagają drzew składniowo poprawnych. Jeśli masz niepoprawny kod dla metody, generalnie nie będziesz mieć poprawnego drzewa do wstawienia i nie będziesz w stanie tego zrobić, lub będziesz w stanie to zrobić, ale otrzymasz tylko bezsensowne drzewo jako wynik. –

+0

OK, JST/AST nie wydaje się być właściwym narzędziem ... – Morrandir

+0

Dlaczego musisz wstawić nieprawidłowy kod? –

Odpowiedz

9

Ponieważ masz dobrze uformowane drzewo dla pozostałej części aplikacji i chcesz wstawić nieprecyzyjnie sformatowany tekst w określonym miejscu, nie możesz tego zrobić za pomocą standardowych mechanizmów wstawiania węzłów drzewa .

Ważne jest, aby utworzyć tekst dla poprawnego tekstu programu z wstawionym fragmentem we właściwym miejscu. Gdzieś tam musi być kawałek logiki, który wypisuje AST jako tekst. Musisz poprosić AST o drukowanie w formie tekstu i przechwycić go w środku tego procesu, dokładnie w tym miejscu, aby wstawić dowolny tekst.

Nasz zestaw narzędzi do projektowania repozytoriów DMS wprowadził/wyłączył haczyki węzła drukującego w swoim ślicznym podajniku, aby umożliwić tego rodzaju zdarzenia.

Jeśli takie rzeczy nie istnieją w JDT/AST, możesz spróbować zmodyfikować swój ładny wskaźnik, aby uzyskać ten hak. Alternatywnie można rozważyć modyfikację JDT/AST przez dodanie innego typu węzła drzewa, który nie jest częścią standardowego zestawu, który po prostu posiada dowolny tekst, ale działa jak węzeł metody. Przypuszczalnie każdy węzeł kontroluje to, co jest drukowane; wtedy możesz zdefiniować ładne drukowanie dla tego węzła drzewa, aby spowodować wydrukowanie jego tekstu.

Ostateczne, naprawdę odlotowe rozwiązanie: wstaw idealnie poprawny AST, w którym znajduje się dowolny tekst, zawierający gdzieś fałszywy identyfikator z unikalną nazwą, np. ZZZ. Następnie wydrukuj AST na łańcuchu i postprocesuj ciąg znaków, aby zastąpić fałszywe drzewa zawierające unikatową nazwę rzeczywistym tekstem użytkownika.

+0

Wielkie dzięki! :-) – Morrandir

3

Najpierw należy przeanalizować fragment kodu w AST. Do tego celu można użyć interfejsu API ASTParser.

Możliwe jest uzyskanie problemów kompilacji jednostki kompilacji (patrz CompilationUnit.getProblems()).

Istnieje kilka sposobów na modify Java code using JDT. Proponuję, abyś rozważył interfejs API ASTRewrite w celu zmodyfikowania treści metody.

+0

Sprawdziłem wcześniej odwołanie do interfejsu API, ale nie mogłem znaleźć sposobu na dodanie dowolnego fragmentu kodu. Weźmy pod uwagę, że fragment kodu może zawierać składniowy nieprawidłowy kod. (Właśnie dodałem to do pierwotnego pytania ...). – Morrandir

+0

Możesz przeanalizować dowolny fragment kodu. Następnie wstaw wynikowe węzły AST do węzła AST korpusu metody. Analizator składni Eclipse w pewnym stopniu toleruje błędy składni. – reprogrammer

+0

"W pewnym stopniu" niestety nie wystarcza. :( – Morrandir