2010-01-06 8 views
5

Estoy desarrollando un complemento que toma todas las enumeraciones en el espacio de trabajo que implementa cierta interfaz (IDomain) analiza el código (Usando AST) hace algunas modificaciones sobre la enumeración y la marca como procesada con una anotación (@ IDomainInfo).Weird JavaCore Problema de caché IType

Por ejemplo, se tarda calle detrás de esta manera:

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

y genera algo como esto:

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

La idea detrás de la @IDomainInfo es que las enumeraciones anotados no tienen que ser procesados ​​más por el complemento.

Básicamente lo que hago para lograr la tarea es realizar una búsqueda con JavaSearch API para encontrar todas las enumeraciones que implementan IDomain (tarea fácil), y como resultado obtengo una lista de IJavaElements (que en realidad son instancias de IType) . Luego llamo a un método que recorre la lista resultante y crea una nueva lista de todas las instancias de IType que no están anotadas con @IDomainInfo y luego procesa la lista resultante: Para que cada IType no anotado trabaje, anote el IType con el @ Anotación de IDomainInfo (usando AST) y luego guarde los resultados en el archivo (usando IFile, para que pueda ver los cambios sin actualizar, y de hecho, si tengo la enumeración abierta en el editor, la actualizo al instante :-)

Todo funciona bien, pero si abro una enumeración @IDomainInfo anotada (solo para probar), entonces elimino @IDomainInfo, guardo el archivo (estoy seguro) y luego llamo a la acción que hace todo el trabajo que describí antes, cuando llego a la parte que filtra los tipos de letra anotados de los que no tienen anotaciones, el código es algo como esto:

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

Bueno, resulta que para el archivo que acabo de guardar, el IType detecta la anotación que acabo de eliminar, como si todavía estuviera allí. Si cierro y vuelvo a abrir Eclipse todo funciona normalmente.

Ahora, acabo de verificar y verificar mi código por tres veces, así que estoy seguro de que no voy a mantener una copia obsoleta del antiguo IType sin editar con la versión de anotación (todos mis IType provienen de una versión Java nueva buscar llamada cada vez que ejecuto la acción).

Entonces la pregunta es, ¿qué podría estar haciendo mal? Quiero decir, acabo de leer la API de JavaCore muchas veces para comprobar si podría estar usando mal o si tengo algún defecto conceptual pero realmente no tengo ni idea, es como si eclipse estaría almacenando en caché el IT ignorando los cambios Acabo de hecho en el editor de: -/

Si alguien tiene una idea de lo agradecería mucho :-)

+0

He encontrado esta publicación en el blog. Quizás lo intentes. http://samindaw.wordpress.com/2008/11/11/eclipse-plugin-giving-errors-due-to-noclassdeffound-eventhough-class-is-in-the-library-or-issued-fixed-not- reflect-in-the-running-classes/Y esto (creo que esta es "la" solución): http://www.eclipsezone.com/eclipse/forums/t61566.html Adiós, –

Respuesta

0

cuándo o cómo se llama su plugin? ¿Registraste un oyente de recursos o es un creador de proyectos o algo más? Si un escucha de recursos lo llama, es posible que su complemento esté leyendo la "copia primaria" para su IType, que aún no se ha guardado. Por lo tanto, sus cambios aún se encuentran en la Copia de trabajo.

Cuestiones relacionadas