繁体   English   中英

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

[英]Eclipse AST parser not preserving static import

我祈祷你一切都好。

我试图在Eclipse中为“未找到”导入编写一个QuickFix插件。 作为此过程的一部分,我正在尝试使用各种不同的导入语句类型生成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处理器,它需要知道它们在源代码中似乎可以在哪里工作。 我可以尝试手动设置所有设置位置和结束位置,但是我有点希望解析器应该这样做。

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

好吧,您难道不知道吗?-在将问题发布到Stack Overflow之前,我研究了好一天左右,然后在发布几分钟后自己找到了答案...

为了使其他任何人都受益于这个问题:缺少的链接是,“导入静态”语法仅在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.*;"

我错误地认为在对newParser()的调用中设置AST.JLS8可以newParser()此问题,但显然并非如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM