diff --git a/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17ParserVisitor.java b/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17ParserVisitor.java index 1e811987d5b..7acdf489bcd 100644 --- a/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17ParserVisitor.java +++ b/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17ParserVisitor.java @@ -43,6 +43,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.*; @@ -1666,32 +1668,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, 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) { 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 3fbf0f3060c..6368c640680 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 @@ -21,7 +21,6 @@ import com.sun.source.util.TreePathScanner; import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.tree.DCTree; import com.sun.tools.javac.tree.DocCommentTable; import com.sun.tools.javac.tree.EndPosTable; import com.sun.tools.javac.tree.JCTree; @@ -1668,7 +1667,7 @@ private J2 convert(Tree t) { cursor += prefix.length(); // 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); + DocCommentTree commentTree = (DocCommentTree) getCommentTreeMethod.invoke(docCommentTable, t); @SuppressWarnings("unchecked") J2 j = (J2) scan(t, formatWithCommentTree(prefix, (JCTree) t, commentTree)); return j; } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { @@ -2009,7 +2008,7 @@ private ReloadableJava21ModifierResults sortedModifiersAndAnnotations(ModifiersT } else { leadingAnnotations.add(annotation); } - i = cursor -1; + i = cursor - 1; lastAnnotationPosition = cursor; continue; }