我需要Java文件中正确的CompilationUnit,但是Eclipse jdt生成错误的ast,因为Java文件中有龙目岛。
我看到Eclipse JDT源代码,找到ASTConverter将正确的CompilationUnitDeclaration转换为错误的CompilationUnit。
org.eclipse.jdt.core.dom.ASTConverter.convert(CompilationUnitDeclaration, char[])
我发现ASTConverter使用源代码位置来获取信息,但是源代码没有。 org.eclipse.jdt.core.dom.ASTConverter.convert(StringLiteral)
public Expression convert(org.eclipse.jdt.internal.compiler.ast.StringLiteral expression) {
if (expression instanceof StringLiteralConcatenation) {
return convert((StringLiteralConcatenation) expression);
}
int length = expression.sourceEnd - expression.sourceStart + 1;
int sourceStart = expression.sourceStart;
StringLiteral literal = new StringLiteral(this.ast);
if (this.resolveBindings) {
this.recordNodes(literal, expression);
}
literal.internalSetEscapedValue(new String(this.compilationUnitSource, sourceStart, length));
literal.setSourceRange(expression.sourceStart, expression.sourceEnd - expression.sourceStart + 1);
return literal;
}
我的代码
ASTParser parser = ASTParser.newParser(AST.JLS10);
parser.setCompilerOptions(options);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setEnvironment(classpathEntries, sourcepathEntries, sourcepathEncodings, includeRunningVMBootclasspath);
parser.setResolveBindings(resolveBindings);
parser.setStatementsRecovery(false);
parser.setBindingsRecovery(true);
parser.createASTs(sourceFilePaths.toArray(new String[0]), encodings.toArray(new String[0]), wellKnownKeys,requestor, null);
源代码
package com.test;
import lombok.Setter;
@Setter
public class DataExample {
private int age;
}
正确的CompilationUnitDeclaration
package com.test;
import lombok.Setter;
public @Setter class DataExample {
private int age;
public DataExample() {
super();
}
public @java.lang.SuppressWarnings("all") void setAge(final int age) {
this.age = age;
}
}
上一代错误的CompilationUnit
package com.test;
import lombok.Setter;
@Setter public class DataExample {
@java.lang.SuppressWarnings(@Setter) void setAge( int age){
}
private int age;
}
}
ASTParser是否需要一些配置?以及如何修改ASTConverter