Eclipse JDT AST:使用嵌套成员解析类的问题

时间:2012-06-12 09:22:41

标签: java eclipse eclipse-plugin abstract-syntax-tree eclipse-jdt

我想对Java源代码进行一些静态代码分析。对于解析,我使用Eclipse之外的Eclipse JDT(3.6)ASTParser,代码如下:

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及其方法。其余的课 - 就像 <{1}}或getInstance遗失。

获得的doNothing包含字段CompilationUnit,其中包含以下内容 三个问题:

  • DefaultProblem(id = 141):Pb(240)语法错误,插入“}”以完成ClassBody
  • DefaultProblem(id = 143):Pb(240)语法错误,插入“}”以完成ClassBody
  • DefaultProblem(id = 164):Pb(240)语法错误,插入“}”以完成MethodBody

我在上面提到的类中看不到任何语法错误 problems

1 个答案:

答案 0 :(得分:0)

你能仔细检查'readSourceFile'的内容吗?我的猜测是没有'\ n'或新行字符。缺少新行字符会导致第一条评论后的所有行成为评论本身的一部分。