Eclipse JDT AST: problemas al analizar una clase con miembros anidados

Me gustaría hacer un análisis de código estático para el código fuente de Java. Para analizar, uso Eclipse JDT (3.6) ASTParser fuera de Eclipse con el siguiente código:

private static final Map<String, String> COMPILER_OPTIONS;

static {
    COMPILER_OPTIONS = new HashMap<String, String>(JavaCore.getOptions());
    COMPILER_OPTIONS.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_6);
    COMPILER_OPTIONS.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_6);
    COMPILER_OPTIONS.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_6);
}

private CompilationUnit parseReadSourceFileIfPossible(String readSourceFile) {
    CompilationUnit result = null;
    if (isPossibleToParse(readSourceFile)) {
        final ASTParser parser = createAndConfigureParser();
        parser.setSource(readSourceFile.toCharArray());
        result = (CompilationUnit) parser.createAST(null);
    }
    return result;
}

private ASTParser createAndConfigureParser() {
    final ASTParser result = ASTParser.newParser(AST.JLS3);
    result.setKind(ASTParser.K_COMPILATION_UNIT);
    result.setCompilerOptions(COMPILER_OPTIONS); return result;
}

Para las clases Java "normales", este enfoque funciona perfectamente bien. Sin embargo, si analizo la siguiente clase (ValidUnrestrictedComponent), el analizador se encuentra con problemas.

package valid;

import de.htwg_konstanz.joi.annotations.JoiComponten;

@JoiComponent
public final class ValidUnrestrictedComponent {

    private static final class Implementation implements TestInterface {

        @Override
        public int doSomething() {
            // TODO Auto-generated method stub
            return 0;
        }
    }

    private ValidUnrestrictedComponent() {
        throw new AssertionError();
    }

    public static Implementation getInstance() {
        return new Implementation();
    }

    private static void getNothing() {
      // Nothing to do here
    }

    private void doNothing() {
      // Nothing to do here
    }

}

Recibo un objeto de tipo CompilationUnit, sin embargo, solo contiene el miembro anidado Implementation y su método. El resto de la clase, como getInstance or doNothing no se encuentra.

El obtenido CompilationUnit contiene un campo problems con los siguientes tres problemas:

  • DefaultProblem (id=141): Pb(240) Error de sintaxis, inserte "}" para completar ClassBody
  • DefaultProblem (id=143): Pb(240) Error de sintaxis, inserte "}" para completar ClassBody
  • DefaultProblem (id=164): Pb(240) Error de sintaxis, inserte "}" para completar MethodBody

No puedo ver ningún error de sintaxis en la clase mencionada anteriormente ValidUnrestrictedComponent.

preguntado el 12 de junio de 12 a las 10:06

1 Respuestas

¿Puedes verificar dos veces el contenido de 'readSourceFile'? Supongo que no hay '\n' o caracteres de nueva línea en eso. Si faltan caracteres de nueva línea, todas las líneas posteriores al primer comentario se convertirán en parte del propio comentario.

Respondido el 13 de junio de 12 a las 09:06

¡Gracias Deepak Azad! Eran los separadores de línea que faltaban. - JFFF

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.