Eclipse JDT AST: проблемы с анализом класса с вложенными элементами

Я хотел бы сделать статический анализ кода для исходного кода Java. Для синтаксического анализа я использую Eclipse JDT (3.6) ASTParser вне Eclipse со следующим кодом:

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

Для "обычных" классов Java этот подход прекрасно работает. Однако, если я разбираю следующий класс (ValidUnrestrictedComponent), синтаксический анализатор сталкивается с проблемами.

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
    }

}

Я получаю объект типа CompilationUnit, однако он содержит только вложенный элемент Implementation и его метод. Остальной класс — например, getInstance или doNothing — отсутствует.

Полученный CompilationUnit содержит поле problems со следующими тремя проблемами:

  • DefaultProblem (id=141): Pb(240) Синтаксическая ошибка, вставьте "}" для завершения ClassBody
  • DefaultProblem (id=143): Pb(240) Синтаксическая ошибка, вставьте "}" для завершения ClassBody
  • DefaultProblem (id=164): Pb(240) Синтаксическая ошибка, вставьте "}" для завершения MethodBody

Я не вижу никаких синтаксических ошибок в вышеупомянутом классе ValidUnrestrictedComponent.


person JFFF    schedule 12.06.2012    source источник


Ответы (1)


Можете ли вы дважды проверить содержимое «readSourceFile»? Я предполагаю, что в этом нет '\n' или символов новой строки. Отсутствие символов новой строки приведет к тому, что все строки после первого комментария станут частью самого комментария.

person Deepak Azad    schedule 13.06.2012
comment
Спасибо Дипак Азад! Это были отсутствующие разделители строк. - person JFFF; 15.06.2012