From b5f6eae5be2d24cd2403ac8a1c6d978b0d445daf Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 6 Oct 2024 17:53:52 +0200 Subject: [PATCH] Use reflection to invoke getCommentTree to support Java 21 & 23 (#4555) * Use reflection to invoke getCommentTree to support Java 21 & 23 Fixes https://github.com/openrewrite/rewrite/issues/4540 * Catch new exceptions from Method invoke --- .../ReloadableJava21ParserVisitor.java | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21ParserVisitor.java b/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21ParserVisitor.java index 2c59e8f8924..016248562e1 100644 --- a/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21ParserVisitor.java +++ b/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21ParserVisitor.java @@ -44,6 +44,8 @@ import javax.lang.model.element.Modifier; import javax.lang.model.element.Name; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.nio.charset.Charset; import java.nio.file.Path; import java.util.*; @@ -1664,32 +1666,42 @@ private J2 convert(Tree t) { try { String prefix = source.substring(cursor, max(((JCTree) t).getStartPosition(), cursor)); cursor += prefix.length(); - @SuppressWarnings("unchecked") J2 j = (J2) scan(t, formatWithCommentTree(prefix, (JCTree) t, docCommentTable.getCommentTree((JCTree) t))); + // Java 21 and 23 have a different return type from getCommentTree; with reflection we can support both + Method getCommentTreeMethod = DocCommentTable.class.getMethod("getCommentTree", JCTree.class); + DocCommentTree commentTree = (DocCommentTree) getCommentTreeMethod.invoke(docCommentTable, (JCTree) t); + @SuppressWarnings("unchecked") J2 j = (J2) scan(t, formatWithCommentTree(prefix, (JCTree) t, commentTree)); return j; + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { + reportJavaParsingException(ex); + throw new IllegalStateException("Failed to invoke getCommentTree method", ex); } catch (Throwable ex) { - // this SHOULD never happen, but is here simply as a diagnostic measure in the event of unexpected exceptions - StringBuilder message = new StringBuilder("Failed to convert for the following cursor stack:"); - message.append("--- BEGIN PATH ---\n"); - - List paths = stream(getCurrentPath().spliterator(), false).toList(); - for (int i = paths.size(); i-- > 0; ) { - JCTree tree = (JCTree) paths.get(i); - if (tree instanceof JCCompilationUnit) { - message.append("JCCompilationUnit(sourceFile = ").append(((JCCompilationUnit) tree).sourcefile.getName()).append(")\n"); - } else if (tree instanceof JCClassDecl) { - message.append("JCClassDecl(name = ").append(((JCClassDecl) tree).name).append(", line = ").append(lineNumber(tree)).append(")\n"); - } else if (tree instanceof JCVariableDecl) { - message.append("JCVariableDecl(name = ").append(((JCVariableDecl) tree).name).append(", line = ").append(lineNumber(tree)).append(")\n"); - } else { - message.append(tree.getClass().getSimpleName()).append("(line = ").append(lineNumber(tree)).append(")\n"); - } - } + reportJavaParsingException(ex); + throw ex; + } + } - message.append("--- END PATH ---\n"); + private void reportJavaParsingException(Throwable ex) { + // this SHOULD never happen, but is here simply as a diagnostic measure in the event of unexpected exceptions + StringBuilder message = new StringBuilder("Failed to convert for the following cursor stack:"); + message.append("--- BEGIN PATH ---\n"); - ctx.getOnError().accept(new JavaParsingException(message.toString(), ex)); - throw ex; + List paths = stream(getCurrentPath().spliterator(), false).toList(); + for (int i = paths.size(); i-- > 0; ) { + JCTree tree = (JCTree) paths.get(i); + if (tree instanceof JCCompilationUnit) { + message.append("JCCompilationUnit(sourceFile = ").append(((JCCompilationUnit) tree).sourcefile.getName()).append(")\n"); + } else if (tree instanceof JCClassDecl) { + message.append("JCClassDecl(name = ").append(((JCClassDecl) tree).name).append(", line = ").append(lineNumber(tree)).append(")\n"); + } else if (tree instanceof JCVariableDecl) { + message.append("JCVariableDecl(name = ").append(((JCVariableDecl) tree).name).append(", line = ").append(lineNumber(tree)).append(")\n"); + } else { + message.append(tree.getClass().getSimpleName()).append("(line = ").append(lineNumber(tree)).append(")\n"); + } } + + message.append("--- END PATH ---\n"); + + ctx.getOnError().accept(new JavaParsingException(message.toString(), ex)); } private JRightPadded convert(Tree t, Function suffix) {