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

问题描述 投票:0回答:1

我祈祷你很好。

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

启动解析器并生成AST的代码非常简单。但是,我发现解析器不遵循导入的“static”关键字。因此,如果我在生成的AST上找到ImportDeclaration,即使源包含“import static ...”,它的isStatic()属性也将为false,如果我转储CompilationUnit的内容,我可以看到“static”关键字已被丢弃。

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而不是通过解析器来解决这个问题。然后我可以在ImportDeclaration上调用“setStatic(true)”来设置它的静态标志。这会生成正确的结构:

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处理器,它需要知道它们在源中的位置。我可以尝试手动设置所有的设置和结束位置,但我有点希望这是解析器应该做的事情。

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

java eclipse eclipse-jdt
1个回答
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()会照顾到这一点,但显然它没有。

© www.soinside.com 2019 - 2024. All rights reserved.