Eclipse AST解析器不保留静态导入

时间:2018-03-02 05:06:26

标签: java eclipse eclipse-jdt

我祈祷你很好。

我正在尝试在Eclipse中编写一个QuickFix插件,用于"未找到"进口。作为其中的一部分,我试图生成一个具有各种不同import语句类型的AST。我试图避免设置一个完整的Eclipse工作区来执行测试。

启动解析器并生成AST的代码非常简单。但是,我发现解析器不支持"静态"关键字在进口上。因此,如果我在生成的AST上找到ImportDeclaration,它的isStatic()属性将为false,即使源包含" import static ...",如果我转储CompilationUnit的内容,我可以看到那个"静态"关键字已被删除。

ASTParser parser = ASTParser.newParser(AST.JLS8);
parser.setSource("import static java.util.Collections.*;".toCharArray());
CompilationUnit cu = (CompilationUnit)parser.createAST(null);
System.err.println(cu); // prints "import java.util.Collections.*;"*

我试图通过直接生成AST而不是通过解析器来解决这个问题。然后我可以调用" setStatic(true)"在ImportDeclaration上设置其静态标志。这会生成正确的结构:

AST ast = AST.newAST(AST.JLS8);
CompilationUnit cu = ast.newCompilationUnit();
ImportDeclaration dec = ast.newImportDeclaration();
dec.setName(ast.newName("java.util.Collections"));
dec.setStatic(true);
dec.setOnDemand(true);
cu.imports().add(dec);
System.err.println(cu); //  prints "import static java.util.Collections.*;"

但是,dec.getStartPosition()设置为-1,dec.getLength()返回0,可能是因为它们不对应任何特定来源。这会弄乱我的QuickFix处理器,它需要知道它们在源中的位置。我可以尝试手动设置所有的设置和结束位置,但我有点希望解析器应该做什么。

有什么建议吗?它是一个我缺少的简单解析器配置选项吗?

1 个答案:

答案 0 :(得分:0)

嗯,你不知道吗 - 我在将这个问题发布在Stack Overflow上之后好好研究了这一天,然后在发布后几分钟就找到答案......

为了其他任何应该偶然发现这个问题的人的利益:缺少的链接是“import static”语法仅在Java 1.5及更高版本中可用,并且默认情况下编译器使用较低的java版本(可能是1.0) ?)。将以下代码添加到我的第一个示例中修复了问题:

ASTParser parser = ASTParser.newParser(AST.JLS8);
Map options = JavaCore.getOptions(); // New!
JavaCore.setComplianceOptions(JavaCore.VERSION_1_5, options); // New!
parser.setCompilerOptions(options); // New!
parser.setSource("import static java.util.Collections.*;".toCharArray());
CompilationUnit cu = (CompilationUnit)parser.createAST(null);
System.err.println(cu); // prints "import static java.util.Collections.*;"

我错误地认为在AST.JLS8的调用中设置newParser()会照顾到这一点,但显然它没有。