簡體   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