当项目中的龙目岛时,Eclipse JDT生成错误的ast

时间:2019-01-11 07:23:19

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

我需要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

0 个答案:

没有答案