Eclipse AST 解析器不保留静态导入
Eclipse AST parser not preserving static import
祝你一切安好
我正在尝试在 Eclipse 中为 "not found" 导入编写一个 QuickFix 插件。作为其中的一部分,我正在尝试生成具有各种不同导入语句类型的 AST。我试图避免设置一个成熟的 Eclipse 工作区来执行测试。
启动解析器并生成 AST 的代码非常简单。但是,我发现解析器不支持导入中的 "static" 关键字。因此,如果我在生成的 AST 上找到一个 ImportDeclaration,它的 isStatic() 属性 将是假的,即使源包含 "import static ...",如果我转储 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()
returns 0,大概是因为它们不对应于任何特定来源。这弄乱了我的 QuickFix 处理器,它需要知道它们在源代码中的什么地方工作。我可以尝试手动设置所有设置和结束位置,但我有点希望解析器应该这样做。
有什么建议吗?它是我缺少的简单解析器配置选项吗?
好吧,你不知道吗 - 在将问题发布到 Stack Overflow 之前,我对此进行了大约一天的研究,然后在发布几分钟后自己找到了答案...
为了其他任何偶然发现这个问题的人的利益:缺少的 link 是 "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.*;"
我错误地认为在调用 newParser()
时设置 AST.JLS8
会解决这个问题,但显然不会。
祝你一切安好
我正在尝试在 Eclipse 中为 "not found" 导入编写一个 QuickFix 插件。作为其中的一部分,我正在尝试生成具有各种不同导入语句类型的 AST。我试图避免设置一个成熟的 Eclipse 工作区来执行测试。
启动解析器并生成 AST 的代码非常简单。但是,我发现解析器不支持导入中的 "static" 关键字。因此,如果我在生成的 AST 上找到一个 ImportDeclaration,它的 isStatic() 属性 将是假的,即使源包含 "import static ...",如果我转储 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()
returns 0,大概是因为它们不对应于任何特定来源。这弄乱了我的 QuickFix 处理器,它需要知道它们在源代码中的什么地方工作。我可以尝试手动设置所有设置和结束位置,但我有点希望解析器应该这样做。
有什么建议吗?它是我缺少的简单解析器配置选项吗?
好吧,你不知道吗 - 在将问题发布到 Stack Overflow 之前,我对此进行了大约一天的研究,然后在发布几分钟后自己找到了答案...
为了其他任何偶然发现这个问题的人的利益:缺少的 link 是 "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.*;"
我错误地认为在调用 newParser()
时设置 AST.JLS8
会解决这个问题,但显然不会。