From 7e724223102ca5fa5b38727aeb736f0cd8f8af8c Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Thu, 25 Sep 2025 07:51:08 -0700 Subject: [PATCH] Merge Java21InputAstVisitor into JavaInputAstVisitor In preparation for raising the minimum supported JDK version to JDK 21. PiperOrigin-RevId: 811349632 --- core/pom.xml | 25 ---- .../googlejavaformat/java/Formatter.java | 21 +--- .../java/JavaInputAstVisitor.java | 65 ++++++++++- .../java/java21/Java21InputAstVisitor.java | 107 ------------------ .../META-INF/native-image/reflect-config.json | 9 -- 5 files changed, 60 insertions(+), 167 deletions(-) delete mode 100644 core/src/main/java/com/google/googlejavaformat/java/java21/Java21InputAstVisitor.java diff --git a/core/pom.xml b/core/pom.xml index 5b6bbb4d7..3b106cf71 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -223,31 +223,6 @@ - - jdk17 - - [17,21) - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - **/Java21InputAstVisitor.java - - - - - maven-javadoc-plugin - - com.google.googlejavaformat.java.java21 - - - - - native diff --git a/core/src/main/java/com/google/googlejavaformat/java/Formatter.java b/core/src/main/java/com/google/googlejavaformat/java/Formatter.java index e3b2b3235..5d9ac76ad 100644 --- a/core/src/main/java/com/google/googlejavaformat/java/Formatter.java +++ b/core/src/main/java/com/google/googlejavaformat/java/Formatter.java @@ -150,14 +150,7 @@ public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOExcept } OpsBuilder builder = new OpsBuilder(javaInput, javaOutput); // Output the compilation unit. - JavaInputAstVisitor visitor; - if (Runtime.version().feature() >= 21) { - visitor = - createVisitor( - "com.google.googlejavaformat.java.java21.Java21InputAstVisitor", builder, options); - } else { - visitor = new JavaInputAstVisitor(builder, options.indentationMultiplier()); - } + JavaInputAstVisitor visitor = new JavaInputAstVisitor(builder, options.indentationMultiplier()); visitor.scan(unit, null); builder.sync(javaInput.getText().length()); builder.drain(); @@ -167,18 +160,6 @@ public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOExcept javaOutput.flush(); } - private static JavaInputAstVisitor createVisitor( - final String className, final OpsBuilder builder, final JavaFormatterOptions options) { - try { - return Class.forName(className) - .asSubclass(JavaInputAstVisitor.class) - .getConstructor(OpsBuilder.class, int.class) - .newInstance(builder, options.indentationMultiplier()); - } catch (ReflectiveOperationException e) { - throw new LinkageError(e.getMessage(), e); - } - } - static boolean errorDiagnostic(Diagnostic input) { if (input.getKind() != Diagnostic.Kind.ERROR) { return false; diff --git a/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java b/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java index f21f86a5c..1336ad0e1 100644 --- a/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java +++ b/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java @@ -97,7 +97,10 @@ import com.sun.source.tree.CompilationUnitTree; import com.sun.source.tree.CompoundAssignmentTree; import com.sun.source.tree.ConditionalExpressionTree; +import com.sun.source.tree.ConstantCaseLabelTree; import com.sun.source.tree.ContinueTree; +import com.sun.source.tree.DeconstructionPatternTree; +import com.sun.source.tree.DefaultCaseLabelTree; import com.sun.source.tree.DirectiveTree; import com.sun.source.tree.DoWhileLoopTree; import com.sun.source.tree.EmptyStatementTree; @@ -125,6 +128,8 @@ import com.sun.source.tree.OpensTree; import com.sun.source.tree.ParameterizedTypeTree; import com.sun.source.tree.ParenthesizedTree; +import com.sun.source.tree.PatternCaseLabelTree; +import com.sun.source.tree.PatternTree; import com.sun.source.tree.PrimitiveTypeTree; import com.sun.source.tree.ProvidesTree; import com.sun.source.tree.RequiresTree; @@ -359,6 +364,12 @@ private boolean inExpression() { @Override public Void scan(Tree tree, Void unused) { + // Pre-visit AST for preview features, since com.sun.source.tree.AnyPattern can't be + // accessed directly without --enable-preview. + if (tree instanceof JCTree.JCAnyPattern) { + visitJcAnyPattern((JCTree.JCAnyPattern) tree); + return null; + } inExpression.addLast(tree instanceof ExpressionTree || inExpression.peekLast()); int previous = builder.depth(); try { @@ -2001,7 +2012,7 @@ public Void visitCase(CaseTree node, Void unused) { builder.close(); } - final ExpressionTree guard = getGuard(node); + final ExpressionTree guard = node.getGuard(); if (guard != null) { builder.breakToFill(" "); token("when"); @@ -2041,10 +2052,6 @@ public Void visitCase(CaseTree node, Void unused) { return null; } - protected ExpressionTree getGuard(final CaseTree node) { - return null; - } - @Override public Void visitSwitch(SwitchTree node, Void unused) { sync(node); @@ -3775,7 +3782,11 @@ protected int declareOne( } protected void variableName(Name name) { - visit(name); + if (name.isEmpty()) { + token("_"); + } else { + visit(name); + } } private void maybeAddDims(Deque> annotations) { @@ -4153,4 +4164,46 @@ public Void visitSwitchExpression(SwitchExpressionTree node, Void aVoid) { visitSwitch(node.getExpression(), node.getCases()); return null; } + + @Override + public Void visitDefaultCaseLabel(DefaultCaseLabelTree node, Void unused) { + token("default"); + return null; + } + + @Override + public Void visitPatternCaseLabel(PatternCaseLabelTree node, Void unused) { + scan(node.getPattern(), null); + return null; + } + + @Override + public Void visitConstantCaseLabel(ConstantCaseLabelTree node, Void aVoid) { + scan(node.getConstantExpression(), null); + return null; + } + + @Override + public Void visitDeconstructionPattern(DeconstructionPatternTree node, Void unused) { + scan(node.getDeconstructor(), null); + builder.open(plusFour); + token("("); + builder.breakOp(); + boolean afterFirstToken = false; + for (PatternTree pattern : node.getNestedPatterns()) { + if (afterFirstToken) { + token(","); + builder.breakOp(" "); + } + afterFirstToken = true; + scan(pattern, null); + } + builder.close(); + token(")"); + return null; + } + + private void visitJcAnyPattern(JCTree.JCAnyPattern unused) { + token("_"); + } } diff --git a/core/src/main/java/com/google/googlejavaformat/java/java21/Java21InputAstVisitor.java b/core/src/main/java/com/google/googlejavaformat/java/java21/Java21InputAstVisitor.java deleted file mode 100644 index 029da8e04..000000000 --- a/core/src/main/java/com/google/googlejavaformat/java/java21/Java21InputAstVisitor.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2023 The google-java-format Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.googlejavaformat.java.java21; - -import com.google.googlejavaformat.OpsBuilder; -import com.google.googlejavaformat.java.JavaInputAstVisitor; -import com.sun.source.tree.CaseTree; -import com.sun.source.tree.ConstantCaseLabelTree; -import com.sun.source.tree.DeconstructionPatternTree; -import com.sun.source.tree.DefaultCaseLabelTree; -import com.sun.source.tree.ExpressionTree; -import com.sun.source.tree.PatternCaseLabelTree; -import com.sun.source.tree.PatternTree; -import com.sun.source.tree.Tree; -import com.sun.tools.javac.tree.JCTree; -import javax.lang.model.element.Name; - -/** - * Extends {@link JavaInputAstVisitor} with support for AST nodes that were added or modified in - * Java 21. - */ -public class Java21InputAstVisitor extends JavaInputAstVisitor { - - public Java21InputAstVisitor(OpsBuilder builder, int indentMultiplier) { - super(builder, indentMultiplier); - } - - @Override - protected ExpressionTree getGuard(final CaseTree node) { - return node.getGuard(); - } - - @Override - public Void visitDefaultCaseLabel(DefaultCaseLabelTree node, Void unused) { - token("default"); - return null; - } - - @Override - public Void visitPatternCaseLabel(PatternCaseLabelTree node, Void unused) { - scan(node.getPattern(), null); - return null; - } - - @Override - public Void visitConstantCaseLabel(ConstantCaseLabelTree node, Void aVoid) { - scan(node.getConstantExpression(), null); - return null; - } - - @Override - public Void visitDeconstructionPattern(DeconstructionPatternTree node, Void unused) { - scan(node.getDeconstructor(), null); - builder.open(plusFour); - token("("); - builder.breakOp(); - boolean afterFirstToken = false; - for (PatternTree pattern : node.getNestedPatterns()) { - if (afterFirstToken) { - token(","); - builder.breakOp(" "); - } - afterFirstToken = true; - scan(pattern, null); - } - builder.close(); - token(")"); - return null; - } - - @Override - protected void variableName(Name name) { - if (name.isEmpty()) { - token("_"); - } else { - visit(name); - } - } - - @Override - public Void scan(Tree tree, Void unused) { - // Pre-visit AST for preview features, since com.sun.source.tree.AnyPattern can't be - // accessed directly without --enable-preview. - if (tree instanceof JCTree.JCAnyPattern) { - visitJcAnyPattern((JCTree.JCAnyPattern) tree); - return null; - } else { - return super.scan(tree, null); - } - } - - private void visitJcAnyPattern(JCTree.JCAnyPattern unused) { - token("_"); - } -} diff --git a/core/src/main/resources/META-INF/native-image/reflect-config.json b/core/src/main/resources/META-INF/native-image/reflect-config.json index 89577c035..2c6580345 100644 --- a/core/src/main/resources/META-INF/native-image/reflect-config.json +++ b/core/src/main/resources/META-INF/native-image/reflect-config.json @@ -2,14 +2,5 @@ { "name": "com.sun.tools.javac.parser.UnicodeReader", "allDeclaredMethods": true - }, - { - "name": "com.google.googlejavaformat.java.java21.Java21InputAstVisitor", - "methods": [ - { - "name": "", - "parameterTypes": ["com.google.googlejavaformat.OpsBuilder", "int"] - } - ] } ]