【问题标题】:Eclipse AST parser not preserving static importEclipse AST 解析器不保留静态导入
【发布时间】:2018-08-10 07:33:32
【问题描述】:

我祈祷你一切都好。

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

启动解析器并生成 AST 的代码非常简单。但是,我发现解析器不支持导入的“静态”关键字。因此,如果我在生成的 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】:

    好吧,你不知道吗 - 我在 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 会解决这个问题,但显然它没有。

    【讨论】:

    • 你拯救了一天。感谢您分享您的知识!
    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2018-09-17
    • 2020-11-02
    • 2010-09-22
    相关资源
    最近更新 更多