From 96cd3cd549c786297345f43b4f502420586dbcbc Mon Sep 17 00:00:00 2001 From: Rawi01 Date: Sat, 8 Apr 2023 09:47:31 +0200 Subject: [PATCH] [jdk21][fixes #3393] Support changed JCImport.qualid type --- src/core/lombok/javac/JavacImportList.java | 6 +++--- .../lombok/javac/handlers/JavacHandlerUtil.java | 2 +- src/delombok/lombok/delombok/PrettyPrinter.java | 8 +++++--- src/utils/lombok/javac/Javac.java | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/core/lombok/javac/JavacImportList.java b/src/core/lombok/javac/JavacImportList.java index d498c2ab..85ec31fb 100644 --- a/src/core/lombok/javac/JavacImportList.java +++ b/src/core/lombok/javac/JavacImportList.java @@ -50,7 +50,7 @@ public class JavacImportList implements ImportList { @Override public String getFullyQualifiedNameForSimpleNameNoAliasing(String unqualified) { for (JCTree def : defs) { if (!(def instanceof JCImport)) continue; - JCTree qual = ((JCImport) def).qualid; + JCTree qual = Javac.getQualid((JCImport) def); if (!(qual instanceof JCFieldAccess)) continue; String simpleName = ((JCFieldAccess) qual).name.toString(); if (simpleName.equals(unqualified)) { @@ -68,7 +68,7 @@ public class JavacImportList implements ImportList { for (JCTree def : defs) { if (!(def instanceof JCImport)) continue; if (((JCImport) def).staticImport) continue; - JCTree qual = ((JCImport) def).qualid; + JCTree qual = Javac.getQualid((JCImport) def); if (!(qual instanceof JCFieldAccess)) continue; String simpleName = ((JCFieldAccess) qual).name.toString(); if (!"*".equals(simpleName)) continue; @@ -87,7 +87,7 @@ public class JavacImportList implements ImportList { for (JCTree def : defs) { if (!(def instanceof JCImport)) continue; if (((JCImport) def).staticImport) continue; - JCTree qual = ((JCImport) def).qualid; + JCTree qual = Javac.getQualid((JCImport) def); if (!(qual instanceof JCFieldAccess)) continue; String simpleName = ((JCFieldAccess) qual).name.toString(); if (!"*".equals(simpleName)) continue; diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java index 78c7caf5..d093e890 100644 --- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java +++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java @@ -561,7 +561,7 @@ public class JavacHandlerUtil { if (!(def instanceof JCImport)) continue; JCImport imp0rt = (JCImport) def; if (imp0rt.staticImport) continue; - if (!imp0rt.qualid.toString().equals(name)) continue; + if (!Javac.getQualid(imp0rt).toString().equals(name)) continue; JavacAugments.JCImport_deletable.set(imp0rt, true); } } diff --git a/src/delombok/lombok/delombok/PrettyPrinter.java b/src/delombok/lombok/delombok/PrettyPrinter.java index 35dd9d76..bcf19f43 100644 --- a/src/delombok/lombok/delombok/PrettyPrinter.java +++ b/src/delombok/lombok/delombok/PrettyPrinter.java @@ -92,6 +92,7 @@ import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Position; import lombok.javac.CommentInfo; +import lombok.javac.Javac; import lombok.javac.PackageName; import lombok.permit.Permit; import lombok.javac.CommentInfo.EndConnection; @@ -485,8 +486,9 @@ public class PrettyPrinter extends JCTree.Visitor { } @Override public void visitImport(JCImport tree) { - if (tree.qualid instanceof JCFieldAccess) { - JCFieldAccess fa = ((JCFieldAccess) tree.qualid); + JCTree qualid = Javac.getQualid(tree); + if (qualid instanceof JCFieldAccess) { + JCFieldAccess fa = ((JCFieldAccess) qualid); if (fa.name.length() == 1 && fa.name.contentEquals("*")) { if (fa.selected instanceof JCFieldAccess) { JCFieldAccess lombokExperimental = (JCFieldAccess) fa.selected; @@ -500,7 +502,7 @@ public class PrettyPrinter extends JCTree.Visitor { aPrint("import "); if (tree.staticImport) print("static "); - print(tree.qualid); + print(qualid); println(";", tree); } diff --git a/src/utils/lombok/javac/Javac.java b/src/utils/lombok/javac/Javac.java index 5a6165b1..1c9bed09 100644 --- a/src/utils/lombok/javac/Javac.java +++ b/src/utils/lombok/javac/Javac.java @@ -51,6 +51,7 @@ import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.tree.JCTree.JCExpression; import com.sun.tools.javac.tree.JCTree.JCFieldAccess; import com.sun.tools.javac.tree.JCTree.JCIdent; +import com.sun.tools.javac.tree.JCTree.JCImport; import com.sun.tools.javac.tree.JCTree.JCLiteral; import com.sun.tools.javac.tree.JCTree.JCVariableDecl; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; @@ -275,6 +276,19 @@ public class Javac { } } + /** + * In some versions, the field's type is {@code JCTree}, in others it is {@code JCFieldAccess}, which at the JVM level are not the same. + */ + private static final Field JCIMPORT_QUALID = Permit.permissiveGetField(JCImport.class, "qualid"); + + public static JCTree getQualid(JCImport tree) { + try { + return (JCTree) JCIMPORT_QUALID.get(tree); + } catch (IllegalAccessException e) { + throw sneakyThrow(e.getCause()); + } + } + public static Object getDocComments(JCCompilationUnit cu) { try { return JCCOMPILATIONUNIT_DOCCOMMENTS.get(cu);