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
}
}
type のオブジェクトを受け取りましたが、ネストされたメンバーとそのメソッドCompilationUnit
のみが含まれています。Implementation
クラスの残りの部分 – いいね
getInstance
、またはdoNothing
欠落しています。
得られた には、次の 3 つの問題CompilationUnit
があるフィールドが含まれています。problems
- DefaultProblem (id=141): Pb(240) 構文エラーです。「}」を挿入して ClassBody を完成させてください
- DefaultProblem (id=143): Pb(240) 構文エラーです。「}」を挿入して ClassBody を完成させてください
- DefaultProblem (id=164): Pb(240) 構文エラー、"}" を挿入して MethodBody を完成させてください
上記のクラスに構文エラーは見られません
ValidUnrestrictedComponent
。