diff --git a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/CatchSpecificity.java b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/CatchSpecificity.java index 52e8d6bc4..efe67cfd0 100644 --- a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/CatchSpecificity.java +++ b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/CatchSpecificity.java @@ -252,12 +252,12 @@ private boolean isTypeValid(Type instanceOfTarget, VisitorState state) { @Nullable private static String unwrapBlock(StatementTree statement, VisitorState state) { - if (statement.getKind() == Tree.Kind.BLOCK) { + if (statement instanceof BlockTree blockStatement) { CharSequence source = state.getSourceCode(); if (source == null) { return null; } - BlockTree blockStatement = (BlockTree) statement; + List statements = blockStatement.getStatements(); if (statements.isEmpty()) { return ""; diff --git a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/ImplicitPublicBuilderConstructor.java b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/ImplicitPublicBuilderConstructor.java index de3488031..6ae49d842 100644 --- a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/ImplicitPublicBuilderConstructor.java +++ b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/ImplicitPublicBuilderConstructor.java @@ -28,7 +28,7 @@ import com.sun.source.tree.ClassTree; import com.sun.source.tree.MethodTree; import com.sun.source.tree.Tree; -import com.sun.source.tree.Tree.Kind; +import com.sun.source.tree.VariableTree; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.MethodSymbol; import com.sun.tools.javac.tree.JCTree; @@ -72,7 +72,7 @@ public Description matchClass(ClassTree tree, VisitorState state) { + 1; for (Tree member : tree.getMembers()) { - if (member.getKind() == Kind.VARIABLE) { + if (member instanceof VariableTree) { int endPosition = state.getEndPosition(member); if (endPosition > constructorPosition) { constructorPosition = endPosition; diff --git a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/LoggerEnclosingClass.java b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/LoggerEnclosingClass.java index 1422a7fa1..717f0ca83 100644 --- a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/LoggerEnclosingClass.java +++ b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/LoggerEnclosingClass.java @@ -27,9 +27,9 @@ import com.google.errorprone.matchers.method.MethodMatchers; import com.google.errorprone.util.ASTHelpers; import com.sun.source.tree.ExpressionTree; +import com.sun.source.tree.IdentifierTree; import com.sun.source.tree.MemberSelectTree; import com.sun.source.tree.MethodInvocationTree; -import com.sun.source.tree.Tree; import com.sun.source.tree.VariableTree; import com.sun.tools.javac.code.Symbol; @@ -72,7 +72,7 @@ public Description matchVariable(VariableTree tree, VisitorState state) { return Description.NO_MATCH; } if (!memberSelectTree.getIdentifier().contentEquals("class") - || memberSelectTree.getExpression().getKind() != Tree.Kind.IDENTIFIER) { + || !(memberSelectTree.getExpression() instanceof IdentifierTree)) { return Description.NO_MATCH; } diff --git a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/OptionalFlatMapOfNullable.java b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/OptionalFlatMapOfNullable.java index 3b0b73a7b..a2250ab8f 100644 --- a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/OptionalFlatMapOfNullable.java +++ b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/OptionalFlatMapOfNullable.java @@ -61,10 +61,10 @@ public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState } ExpressionTree functionParameter = ASTHelpers.stripParentheses(tree.getArguments().get(0)); - if (functionParameter.getKind() != Tree.Kind.LAMBDA_EXPRESSION) { + if (!(functionParameter instanceof LambdaExpressionTree lambdaExpressionTree)) { return Description.NO_MATCH; } - LambdaExpressionTree lambdaExpressionTree = (LambdaExpressionTree) functionParameter; + Optional maybeExpression = finalExpression(lambdaExpressionTree); if (!maybeExpression.isPresent()) { return Description.NO_MATCH; diff --git a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/OptionalOrElseGetValue.java b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/OptionalOrElseGetValue.java index f7b956c50..4e8064275 100644 --- a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/OptionalOrElseGetValue.java +++ b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/OptionalOrElseGetValue.java @@ -33,7 +33,6 @@ import com.sun.source.tree.LiteralTree; import com.sun.source.tree.MemberSelectTree; import com.sun.source.tree.MethodInvocationTree; -import com.sun.source.tree.Tree; @AutoService(BugChecker.class) @BugPattern( @@ -55,11 +54,10 @@ public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState ExpressionTree orElseGetArg = tree.getArguments().get(0); - if (orElseGetArg.getKind() != Tree.Kind.LAMBDA_EXPRESSION) { + if (!(orElseGetArg instanceof LambdaExpressionTree lambdaExpressionTree)) { return Description.NO_MATCH; } - LambdaExpressionTree lambdaExpressionTree = (LambdaExpressionTree) orElseGetArg; LambdaExpressionTree.BodyKind bodyKind = lambdaExpressionTree.getBodyKind(); if (bodyKind != LambdaExpressionTree.BodyKind.EXPRESSION) { diff --git a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/RawTypes.java b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/RawTypes.java index f3a7b77ad..1bc83fcd1 100644 --- a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/RawTypes.java +++ b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/RawTypes.java @@ -105,8 +105,8 @@ private Description testType(Tree type, VisitorState state) { + "where necessary, such as when interacting with older library code.") .build(); } - if (type.getKind() == Tree.Kind.PARAMETERIZED_TYPE) { - return testTypes(((ParameterizedTypeTree) type).getTypeArguments(), state); + if (type instanceof ParameterizedTypeTree parameterizedTypeTree) { + return testTypes(parameterizedTypeTree.getTypeArguments(), state); } return Description.NO_MATCH; } diff --git a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/StrictUnusedVariable.java b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/StrictUnusedVariable.java index fa6a6138b..d03e443df 100644 --- a/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/StrictUnusedVariable.java +++ b/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/StrictUnusedVariable.java @@ -460,11 +460,11 @@ private static ImmutableList buildUnusedVarFixes( SuggestedFix.Builder fix = SuggestedFix.builder().setShortDescription("remove unused variable"); for (TreePath usagePath : usagePaths) { StatementTree statement = (StatementTree) usagePath.getLeaf(); - if (statement.getKind() == Tree.Kind.VARIABLE) { + if (statement instanceof VariableTree variableTree) { if (getSymbol(statement).getKind() == ElementKind.PARAMETER) { continue; } - VariableTree variableTree = (VariableTree) statement; + ExpressionTree initializer = variableTree.getInitializer(); if (hasSideEffect(initializer) && TOP_LEVEL_EXPRESSIONS.contains(initializer.getKind())) { if (varKind == ElementKind.FIELD) { @@ -491,8 +491,8 @@ private static ImmutableList buildUnusedVarFixes( fix.merge(SuggestedFixes.replaceIncludingComments(usagePath, replacement, state)); } continue; - } else if (statement.getKind() == Tree.Kind.EXPRESSION_STATEMENT) { - JCTree tree = (JCTree) ((ExpressionStatementTree) statement).getExpression(); + } else if (statement instanceof ExpressionStatementTree expressionStatementTree) { + JCTree tree = (JCTree) expressionStatementTree.getExpression(); if (tree instanceof CompoundAssignmentTree compoundAssignmentTree) { if (hasSideEffect(compoundAssignmentTree.getExpression())) { @@ -832,7 +832,7 @@ private FilterUsedVariables(Map unusedElements, ListMultimap` section + // of the pom (like a bom would). We need this as when there are error-prone breaks, if the version of + // error-prone is forced to be the same between the error-prone running this build and the error-prone being + // used for compilation, we can't move past the breaks as our baseline-error-prones in this build are broken by + // the new version of error-prone. So we force error-prone in this build back to the version that + // baseline-error-prone expects while still using the new error-prone for compilation. + // This trick could conceivable be used for suppressible-error-prone consumers in the gradle-suppressible-error-prone + // plugin, but this would stop the version of error_prone_core etc lining up with error_prone_annotation(s) that + // is being used by dependencies, which is less than ideal. + // If baseline-error-prone was ever moved out of the gradle-baseline repo, this would not be needed in + // gradle-baseline anymore. + errorprone enforcedPlatform('com.palantir.baseline:baseline-error-prone') + } + } + apply plugin: 'com.palantir.java-format' apply plugin: 'com.palantir.jakarta-package-alignment' diff --git a/changelog/@unreleased/pr-3165.v2.yml b/changelog/@unreleased/pr-3165.v2.yml new file mode 100644 index 000000000..c6cf7b243 --- /dev/null +++ b/changelog/@unreleased/pr-3165.v2.yml @@ -0,0 +1,11 @@ +type: fix +fix: + description: |- + Upgrade error-prone to 2.40.0 and stop errors of the form when error-prone >2.39.0 is used: + + ``` + java.lang.NoSuchMethodError: 'java.util.Optional com.google.errorprone.util.ASTHelpers.findSuperMethod(com.sun.tools.javac.code.Symbol$MethodSymbol, com.sun.tools.javac.code.Types)' + at com.palantir.baseline.errorprone.ThrowSpecificity.matchMethod(ThrowSpecificity.java:68) + ``` + links: + - https://github.com/palantir/gradle-baseline/pull/3165 diff --git a/gradle-baseline-java/src/main/java/com/palantir/baseline/extensions/BaselineErrorProneExtension.java b/gradle-baseline-java/src/main/java/com/palantir/baseline/extensions/BaselineErrorProneExtension.java index 1038c5351..36793a40d 100644 --- a/gradle-baseline-java/src/main/java/com/palantir/baseline/extensions/BaselineErrorProneExtension.java +++ b/gradle-baseline-java/src/main/java/com/palantir/baseline/extensions/BaselineErrorProneExtension.java @@ -84,14 +84,17 @@ public abstract class BaselineErrorProneExtension { // Built-in checks "ArrayEquals", "BadImport", + "BooleanLiteral", "LongDoubleConversion", "LoopOverCharArray", "MissingBraces", "MissingOverride", "NarrowCalculation", "ObjectsHashCodePrimitive", + "PreferInstanceofOverGetKind", "ProtectedMembersInFinalClass", "PatternMatchingInstanceof", + "UnnecessaryQualifier", "UnnecessaryParentheses", "ZoneIdOfZ"); diff --git a/versions.lock b/versions.lock index fc8d56246..6b16e91d0 100644 --- a/versions.lock +++ b/versions.lock @@ -18,13 +18,13 @@ com.google.auto.service:auto-service:1.1.1 (1 constraints: 0505f435) com.google.auto.service:auto-service-annotations:1.1.1 (2 constraints: 8a20341c) com.google.auto.value:auto-value-annotations:1.10.4 (3 constraints: ac2df2f5) com.google.code.findbugs:jsr305:3.0.2 (2 constraints: 9e14e59e) -com.google.errorprone:error_prone_annotation:2.38.0 (3 constraints: d338ebf0) -com.google.errorprone:error_prone_annotations:2.38.0 (13 constraints: 8bcd885a) -com.google.errorprone:error_prone_check_api:2.38.0 (2 constraints: bc255f00) -com.google.errorprone:error_prone_core:2.38.0 (1 constraints: 3f054f3b) -com.google.googlejavaformat:google-java-format:1.24.0 (2 constraints: b025d4fe) +com.google.errorprone:error_prone_annotation:2.40.0 (3 constraints: be384fec) +com.google.errorprone:error_prone_annotations:2.40.0 (13 constraints: 76cd2d36) +com.google.errorprone:error_prone_check_api:2.40.0 (2 constraints: ae25a0fe) +com.google.errorprone:error_prone_core:2.40.0 (1 constraints: 38053b3b) +com.google.googlejavaformat:google-java-format:1.27.0 (2 constraints: b6258eff) com.google.guava:failureaccess:1.0.3 (2 constraints: f3154f13) -com.google.guava:guava:33.4.8-jre (21 constraints: 5d88e8f1) +com.google.guava:guava:33.4.8-jre (21 constraints: 5188b0c9) com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava (1 constraints: bd17c918) com.google.inject:guice:5.1.0 (1 constraints: e20b61f3) com.google.j2objc:j2objc-annotations:3.0.0 (1 constraints: 150aeab4) @@ -103,7 +103,7 @@ com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.19.1 (1 constraints: ea13 com.fasterxml.jackson.module:jackson-module-afterburner:2.19.1 (1 constraints: 3f054b3b) com.github.stefanbirkner:system-rules:1.19.0 (1 constraints: 3d05443b) com.google.auto.value:auto-value:1.10 (1 constraints: e711f8e8) -com.google.errorprone:error_prone_test_helpers:2.38.0 (1 constraints: 3f054f3b) +com.google.errorprone:error_prone_test_helpers:2.40.0 (1 constraints: 38053b3b) com.google.jimfs:jimfs:1.3.0 (1 constraints: 5a141061) com.google.testing.compile:compile-testing:0.21.0 (1 constraints: 89149575) com.google.truth:truth:1.4.0 (2 constraints: 72265a6a) diff --git a/versions.props b/versions.props index 29a4d7b78..f588e2a8e 100644 --- a/versions.props +++ b/versions.props @@ -14,7 +14,7 @@ org.slf4j:* = 2.0.17 org.immutables:* = 2.11.0 org.ow2.asm:asm = 9.8 com.google.code.findbugs:jsr305 = 3.0.2 -com.google.errorprone:error_prone_* = 2.38.0 +com.google.errorprone:error_prone_* = 2.40.0 com.googlecode.java-diff-utils:diffutils = 1.3.0 com.puppycrawl.tools:checkstyle = 10.26.1 com.palantir.gradle.utils:* = 0.15.0