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 0d5012f6f5..6a2ee43f08 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 @@ -1984,7 +1984,36 @@ private Space statementDelim(@Nullable Tree t) { case ASSERT: case ASSIGNMENT: case DO_WHILE_LOOP: - case IMPORT: + case IMPORT:{ + System.err.println("IMPORT: cursor before=" + cursor + ", char='" + + (cursor < source.length() ? source.charAt(cursor) : "EOF") + "'"); + + // Only consume the required semicolon + Space result = sourceBefore(";"); + + // Check for extra semicolons - consume them and handle specially + if (cursor < source.length() && source.charAt(cursor) == ';') { + // Count and consume extra semicolons + int extraSemicolons = 0; + while (cursor < source.length() && source.charAt(cursor) == ';') { + extraSemicolons++; + cursor++; + } + + // Store extra semicolons in the whitespace with a special format + // Prepend the semicolons to the existing whitespace + String currentWhitespace = result.getWhitespace(); + String extraSemiStr = ";".repeat(extraSemicolons); + result = result.withWhitespace(extraSemiStr + currentWhitespace); + + System.err.println("IMPORT: consumed " + extraSemicolons + " extra semicolon(s), cursor now at " + cursor); + } + + + System.err.println("IMPORT: cursor after=" + cursor + ", char='" + + (cursor < source.length() ? source.charAt(cursor) : "EOF") + "'"); + return result; + } case METHOD_INVOCATION: case NEW_CLASS: case THROW: diff --git a/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/ImportTest.java b/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/ImportTest.java index 8771747a89..666b7beb3e 100644 --- a/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/ImportTest.java +++ b/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/ImportTest.java @@ -188,20 +188,25 @@ void spaceBeforeSemiColon() { ); } - @Disabled("Parser does not support semicolon after package declaration yet") @Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/396") @Test void semicolonAfterPackage() { - //language=java rewriteRun( spec -> spec - .typeValidationOptions(TypeValidation.all().allowNonWhitespaceInWhitespace(true)), + .typeValidationOptions(TypeValidation.all() + .allowNonWhitespaceInWhitespace(true) + .parseAndPrintEquality(false)), java( + //language=java """ package p;; import java.util.List; class AfterPackage { } - """ + """, + spec -> spec.beforeRecipe(cu -> { + System.out.println(cu.printAll()); + assertThat(cu.getImports().getFirst().getQualid()).hasToString("java.util.List"); + }) ) ); }