2010-01-06 18 views
5

Pracuję nad wtyczką, która pobiera wszystkie wyliczenia w przestrzeni roboczej, która implementuje określony interfejs (IDomain), parsuje kod (za pomocą AST) dokonuje pewnych zmian w wyliczeniu i oznacza je jako przetworzone z adnotacją (@ IDomainInfo).Weird JavaCore Problem z pamięcią podręczną w języku Java

Na przykład, trzeba cos takiego:

public 
enum SomeEnum implements IDomain { 
    // ... 
} 

i generuje coś takiego:

public @IDomainInfo(domainId = 1) 
enum SomeEnum implements IDomain { 
    // Some changes here... 
} 

Ideą tego @IDomainInfo jest to, że nie mają adnotacjami teksty stałe do przetworzenia już przez wtyczkę.

Zasadniczo robię to, aby wykonać zadanie za pomocą JavaSearch API, aby znaleźć wszystkie enums implementujące IDomain (proste zadanie), a jako wynik otrzymuję listę IJavaElements (które są w rzeczywistości instancjami IType) . Następnie wywoływana jest metoda, która jest iterowana przez wynikową listę i tworzy nową listę wszystkich instancji IType, które nie są opatrzone adnotacją @IDomainInfo, a następnie przetwarzają wynikową listę: Dla każdego nieopisanego typu IType wykonuję jakąś pracę, dodawaj adnotacje do IType za pomocą znaku @ Adnotacja IDomainInfo (przy użyciu AST), a następnie zapisanie wyników do pliku (przy użyciu parametru IFile, dzięki czemu mogę zobaczyć zmiany bez odświeżania, a tak naprawdę, jeśli mam wybranie otwarte w edytorze, widzę je natychmiast odświeżone :-)

Wszystko to działa dobrze, ale jeśli otworzę wyliczenie adnotowane @IDomainInfo (tylko do testowania), usuń @IDomainInfo, zapisz plik (jestem tego pewien), a następnie wywołaj akcję, która wykonuje całą pracę, którą opisałem przedtem, kiedy dojdę do części, która filtruje anotowane IType od bez adnotacji, kod jest mniej więcej taki:

for (IType type : typeList) { 
     IAnnotation annotation = type.getAnnotation(“IDomainInfo”); 

     if (!annotation.exists()) { 
     // The annotation does not exist, so add the type to the 
     // list of elements to update and go on... 
     ret.add(type); 
     continue; 
     } 
// Something else here... 
    } 

To znaczy, że dla pliku, który właśnie zapisałem, IType wykrywa usuniętą adnotację, tak jakby wciąż tam była. Jeśli zamknę i ponownie otworzę zaćmienie wszystkich prac normalnie.

Teraz właśnie sprawdziłem i potrójnie sprawdziłem mój kod, więc jestem pewien, że nie utrzymuję starej wersji IType bez edycji z wersją adnotacji (wszystko moje IType pochodzi ze świeżej javy wywołanie wyszukiwania za każdym razem, gdy uruchomię akcję).

Pytanie brzmi: co mogę zrobić źle? Chodzi mi o to, że wiele razy czytałem JavaCore API, aby sprawdzić, czy mogę go źle użyć lub mam w nim jakąś wadę koncepcyjną, ale tak naprawdę nie mam pojęcia, to jest jak , jeśli eclipse będzie buforował IType ignorując zmiany właśnie wykonane w edytorze: -/

Jeśli ktoś ma pomysł, bym to dużo :-)

+0

Znalazłem ten wpis na blogu. Może możesz spróbować. http://samindaw.wordpress.com/2008/11/11/eclipse-plugin-giving-errors-due-to-noclassdeffound-eventhough-class-is-in--br--br-- lub------- Odblokowane-w-działających-klasach/A to (myślę, że to jest "to" rozwiązanie): http://www.eclipsezone.com/eclipse/forums/t61566.html Cześć, –

Odpowiedz

0

Kiedy i jak się nazywa twój plugin docenić? Czy zarejestrowałeś moduł nasłuchujący zasobów lub czy jest to program do tworzenia projektów lub coś innego? Jeśli jest wywoływana przez detektor zasobów, to wtyczka może odczytać "kopię pierwotną" dla Twojego IType, która nie została jeszcze zapisana. W związku z tym zmiany są nadal w kopii roboczej.

Powiązane problemy