2010-01-06 5 views
5

Ich entwickle ein Plugin, das alle Enums im Arbeitsbereich übernimmt, die bestimmte Schnittstelle implementiert (IDomain) analysiert den Code (Using AST) macht einige Änderungen über die Enumeration und markiert sie als mit einer Annotation verarbeitet (@ IDomainInfo).Weird JavaCore IType Cache-Problem

Zum Beispiel dauert es someting wie folgt aus:

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

und erzeugt so etwas wie dieses:

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

Die Idee hinter der @IDomainInfo ist, dass mit Anmerkungen versehene Aufzählungen haben nicht mehr verarbeitet werden durch das Plugin.

Grundsätzlich, was ich tue, um die Aufgabe zu erfüllen, ist eine Suche mit JavaSearch API, um alle enums zu finden, die IDomain implementieren (einfache Aufgabe), und als Ergebnis bekomme ich eine Liste von IJavaElements (die tatsächlich Instanzen von IType sind) . Dann rufe ich eine Methode auf, die durch die resultierende Liste iteriert und eine neue Liste aller IType-Instanzen erstellt, die nicht mit @IDomainInfo kommentiert sind, und dann die resultierende Liste verarbeiten: Für jeden nicht kommentierten IType etwas arbeiten, den IType mit dem @ annotieren IDomainInfo Annotation (mit AST) und dann speichern Sie die Ergebnisse in Datei (mit IFile, damit ich die Änderungen ohne Aktualisierung sehen kann, und in der Tat, wenn ich die Enum im Editor geöffnet habe, sehe ich es sofort aktualisiert :-)

Alles, was funktioniert, aber wenn ich eine @ IDomainInfo annotierte enum öffnen (nur zum Testen), dann entfernen Sie die @ IDomainInfo, speichern Sie die Datei (ich bin mir sicher) und rufen Sie dann die Aktion, die alle beschriebenen Job tut Vorher, wenn ich zu dem Teil komme, der annotierte IType von nicht annotierten Typen filtert, ist der Code ungefähr so:

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... 
    } 

Nun, es ergibt sich, dass für die Datei, die ich gerade gespeichert habe, der IType die Anmerkung entdeckt, die ich gerade entfernt habe, als ob sie immer noch da wäre. Wenn ich Eclipse schließe und wieder öffne, funktioniert alles normal.

Jetzt habe ich einfach meinen Code überprüft und verdreifacht, also bin ich mir sicher, dass ich keine veraltete Kopie des alten IType unbearbeitet mit der Annotation-Version aufbewahre (alle meine IType kommen aus einem frischen Java Suchanruf jedes Mal, wenn ich die Aktion starte).

Die Frage ist also, was könnte ich falsch machen? Ich meine, ich habe gerade die JavaCore API viele Male gelesen, um zu überprüfen, ob ich es falsch benutze oder wenn ich einen konzeptionellen Fehler habe, aber ich habe wirklich keine Ahnung, es ist wie , wenn Eclipse den IType zwischenspeichert und die Änderungen ignoriert ich habe gerade im Editor gemacht: -/

Wenn jemand eine Idee hat ich es viel :-)

schätzen würde
+0

Ich habe diesen Blogeintrag gefunden. Vielleicht kannst du es versuchen. http://samindaw.wordpress.com/2008/11/11/eclipse-plugin-giving-errors-due-to-noclassdeffound-efthough-klasse-is-in-the-library-or-issued-fixed-not- reflected-in-the-running-classes/Und das (ich denke, das ist "die" Lösung): http://www.eclipsezone.com/eclipse/forums/t61566.html Tschüss, –

Antwort

0

Wann oder wie ist Ihre Plugin namens? Haben Sie einen Ressourcen-Listener registriert oder handelt es sich um einen Projekt-Builder oder etwas anderes? Wenn es von einem Ressourcen-Listener aufgerufen wird, liest das Plugin möglicherweise die primäre Kopie für Ihren IT-Typ, die noch nicht gespeichert wurde. Daher sind Ihre Änderungen immer noch in der Arbeitskopie.