diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4fd6b80b..db66fda4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: continue-on-error: ${{ matrix.experimental }} steps: - name: Install Harden-Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index db02c168..da27af8b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Install Harden-Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: disable-sudo: true egress-policy: block @@ -40,13 +40,13 @@ jobs: java-distribution: temurin maven-version: 3.9.9 - name: Initialize CodeQL - uses: github/codeql-action/init@f6091c0113d1dcf9b98e269ee48e8a7e51b7bdd4 # v3.28.5 + uses: github/codeql-action/init@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 with: languages: ${{ matrix.language }} - name: Perform minimal build if: matrix.language == 'java' run: mvn -T1C clean package -DskipTests -Dverification.skip - name: Perform CodeQL analysis - uses: github/codeql-action/analyze@f6091c0113d1dcf9b98e269ee48e8a7e51b7bdd4 # v3.28.5 + uses: github/codeql-action/analyze@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 with: category: /language:${{ matrix.language }} diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml index 6eb92e72..29a8e913 100644 --- a/.github/workflows/deploy-website.yml +++ b/.github/workflows/deploy-website.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Install Harden-Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: disable-sudo: true egress-policy: block @@ -43,7 +43,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - - uses: ruby/setup-ruby@28c4deda893d5a96a6b2d958c5b47fc18d65c9d3 # v1.213.0 + - uses: ruby/setup-ruby@32110d4e311bd8996b2a82bf2a43b714ccc91777 # v1.221.0 with: working-directory: ./website bundler-cache: true @@ -75,7 +75,7 @@ jobs: url: ${{ steps.deployment.outputs.page_url }} steps: - name: Install Harden-Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/openssf-scorecard.yml b/.github/workflows/openssf-scorecard.yml index 79380aa5..33bcb630 100644 --- a/.github/workflows/openssf-scorecard.yml +++ b/.github/workflows/openssf-scorecard.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Install Harden-Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: disable-sudo: true egress-policy: block @@ -42,12 +42,12 @@ jobs: with: persist-credentials: false - name: Run OpenSSF Scorecard analysis - uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 with: results_file: results.sarif results_format: sarif publish_results: ${{ github.ref == 'refs/heads/master' }} - name: Update GitHub's code scanning dashboard - uses: github/codeql-action/upload-sarif@f6091c0113d1dcf9b98e269ee48e8a7e51b7bdd4 # v3.28.5 + uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 with: sarif_file: results.sarif diff --git a/.github/workflows/pitest-analyze-pr.yml b/.github/workflows/pitest-analyze-pr.yml index f8ca08db..78677bff 100644 --- a/.github/workflows/pitest-analyze-pr.yml +++ b/.github/workflows/pitest-analyze-pr.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Install Harden-Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: disable-sudo: true egress-policy: block @@ -38,7 +38,7 @@ jobs: - name: Aggregate Pitest reports run: mvn pitest-git:aggregate -DkilledEmoji=":tada:" -DmutantEmoji=":zombie:" -DtrailingText="Mutation testing report by [Pitest](https://pitest.org/). Review any surviving mutants by inspecting the line comments under [_Files changed_](${{ github.event.number }}/files)." - name: Upload Pitest reports as artifact - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: pitest-reports path: ./target/pit-reports-ci diff --git a/.github/workflows/pitest-update-pr.yml b/.github/workflows/pitest-update-pr.yml index 07cf77ed..48111d26 100644 --- a/.github/workflows/pitest-update-pr.yml +++ b/.github/workflows/pitest-update-pr.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Install Harden-Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/run-integration-tests.yml b/.github/workflows/run-integration-tests.yml index f6aff3fa..c1263e31 100644 --- a/.github/workflows/run-integration-tests.yml +++ b/.github/workflows/run-integration-tests.yml @@ -22,7 +22,7 @@ jobs: integration-test: [ "checkstyle", "metrics", "prometheus-java-client" ] steps: - name: Install Harden-Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: disable-sudo: true egress-policy: block @@ -55,7 +55,7 @@ jobs: run: xvfb-run "./integration-tests/${{ matrix.integration-test }}.sh" "${{ runner.temp }}/artifacts" - name: Upload artifacts on failure if: ${{ failure() }} - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: "integration-test-${{ matrix.integration-test }}" path: "${{ runner.temp }}/artifacts" diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 43939c74..1302cf5c 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Install Harden-Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: disable-sudo: true egress-policy: block diff --git a/cdg-pitest-licence.txt b/arcmutate-licence.txt similarity index 100% rename from cdg-pitest-licence.txt rename to arcmutate-licence.txt diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/OptionalRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/OptionalRules.java index cc8928aa..2e5fcaf4 100644 --- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/OptionalRules.java +++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/OptionalRules.java @@ -282,6 +282,8 @@ final class OptionalRules { // XXX: The rewritten `filter`/`map` expression may be more performant than its replacement. See // https://github.com/palantir/gradle-baseline/pull/2946. (There are plans to pair Refaster rules // with JMH benchmarks; this would be a great use case.) + // XXX: Perhaps `stream.mapMulti(Optional::ifPresent)` is what we should use. See + // https://github.com/palantir/gradle-baseline/pull/2996. static final class StreamFlatMapOptional { @BeforeTemplate Stream before(Stream> stream) { diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/PrimitiveRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/PrimitiveRules.java index b034ec73..ce4b3a35 100644 --- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/PrimitiveRules.java +++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/PrimitiveRules.java @@ -8,12 +8,15 @@ import com.google.common.primitives.Floats; import com.google.common.primitives.Ints; import com.google.common.primitives.Longs; import com.google.common.primitives.Shorts; +import com.google.common.primitives.UnsignedBytes; import com.google.common.primitives.UnsignedInts; import com.google.common.primitives.UnsignedLongs; import com.google.errorprone.refaster.Refaster; import com.google.errorprone.refaster.annotation.AfterTemplate; import com.google.errorprone.refaster.annotation.AlsoNegation; import com.google.errorprone.refaster.annotation.BeforeTemplate; +import java.util.Arrays; +import java.util.Comparator; import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation; /** Refaster rules related to expressions dealing with primitives. */ @@ -525,10 +528,7 @@ final class PrimitiveRules { } } - /** - * Prefer JDK's {@link Integer#toUnsignedString(int,int)} over third-party or more verbose - * alternatives. - */ + /** Prefer JDK's {@link Integer#toUnsignedString(int,int)} over third-party alternatives. */ static final class IntegerToUnsignedStringWithRadix { @BeforeTemplate String before(int i, int radix) { @@ -541,10 +541,7 @@ final class PrimitiveRules { } } - /** - * Prefer JDK's {@link Long#toUnsignedString(long,int)} over third-party or more verbose - * alternatives. - */ + /** Prefer JDK's {@link Long#toUnsignedString(long,int)} over third-party alternatives. */ static final class LongToUnsignedStringWithRadix { @BeforeTemplate String before(long i, int radix) { @@ -556,4 +553,49 @@ final class PrimitiveRules { return Long.toUnsignedString(i, radix); } } + + /** Prefer JDK's {@link Arrays#compareUnsigned(byte[], byte[])} over third-party alternatives. */ + // XXX: This rule will yield non-compilable code if the result of the replaced expression is + // dereferenced. Investigate how to make this safe. + static final class ArraysCompareUnsignedBytes { + @BeforeTemplate + Comparator before() { + return UnsignedBytes.lexicographicalComparator(); + } + + @AfterTemplate + Comparator after() { + return Arrays::compareUnsigned; + } + } + + /** Prefer JDK's {@link Arrays#compareUnsigned(int[], int[])} over third-party alternatives. */ + // XXX: This rule will yield non-compilable code if the result of the replaced expression is + // dereferenced. Investigate how to make this safe. + static final class ArraysCompareUnsignedInts { + @BeforeTemplate + Comparator before() { + return UnsignedInts.lexicographicalComparator(); + } + + @AfterTemplate + Comparator after() { + return Arrays::compareUnsigned; + } + } + + /** Prefer JDK's {@link Arrays#compareUnsigned(long[], long[])} over third-party alternatives. */ + // XXX: This rule will yield non-compilable code if the result of the replaced expression is + // dereferenced. Investigate how to make this safe. + static final class ArraysCompareUnsignedLongs { + @BeforeTemplate + Comparator before() { + return UnsignedLongs.lexicographicalComparator(); + } + + @AfterTemplate + Comparator after() { + return Arrays::compareUnsigned; + } + } } diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ReactorRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ReactorRules.java index c919c97f..7eb3af75 100644 --- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ReactorRules.java +++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ReactorRules.java @@ -939,7 +939,11 @@ final class ReactorRules { static final class MonoThen { @BeforeTemplate Mono<@Nullable Void> before(Mono mono) { - return Refaster.anyOf(mono.ignoreElement().then(), mono.flux().then()); + return Refaster.anyOf( + mono.ignoreElement().then(), + mono.flux().then(), + Mono.when(mono), + Mono.whenDelayError(mono)); } @AfterTemplate @@ -1078,10 +1082,12 @@ final class ReactorRules { // rule. Consider introducing an Error Prone check for this. static final class MonoSingleOptional { @BeforeTemplate - Mono> before(Mono mono) { + Mono> before(Mono mono, Optional optional, Mono> alternate) { return Refaster.anyOf( mono.flux().collect(toOptional()), - mono.map(Optional::of).defaultIfEmpty(Optional.empty()), + mono.map(Optional::of), + mono.singleOptional().defaultIfEmpty(optional), + mono.singleOptional().switchIfEmpty(alternate), mono.transform(Mono::singleOptional)); } @@ -2174,6 +2180,22 @@ final class ReactorRules { } } + /** + * Don't propagate {@link Mono} cancellations to upstream cache value computations, as completion + * of such computations may benefit concurrent or subsequent cache usages. + */ + static final class MonoFromFutureAsyncLoadingCacheGetAll { + @BeforeTemplate + Mono> before(AsyncLoadingCache cache, Iterable keys) { + return Mono.fromFuture(() -> cache.getAll(keys)); + } + + @AfterTemplate + Mono> after(AsyncLoadingCache cache, Iterable keys) { + return Mono.fromFuture(() -> cache.getAll(keys), /* suppressCancel= */ true); + } + } + /** * Prefer {@link Flux#fromStream(Supplier)} over {@link Flux#fromStream(Stream)}, as the former * yields a {@link Flux} that is more likely to behave as expected when subscribed to more than diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/SuggestedFixRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/SuggestedFixRules.java index 801417ee..d4954191 100644 --- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/SuggestedFixRules.java +++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/SuggestedFixRules.java @@ -1,5 +1,6 @@ package tech.picnic.errorprone.refasterrules; +import com.google.errorprone.VisitorState; import com.google.errorprone.fixes.SuggestedFix; import com.google.errorprone.refaster.annotation.AfterTemplate; import com.google.errorprone.refaster.annotation.BeforeTemplate; @@ -65,16 +66,18 @@ final class SuggestedFixRules { } } - /** Prefer {@link SuggestedFix#swap(Tree, Tree)} over more contrived alternatives. */ + /** + * Prefer {@link SuggestedFix#swap(Tree, Tree, VisitorState)} over more contrived alternatives. + */ static final class SuggestedFixSwap { @BeforeTemplate - SuggestedFix before(Tree tree1, Tree tree2) { - return SuggestedFix.builder().swap(tree1, tree2).build(); + SuggestedFix before(Tree tree1, Tree tree2, VisitorState state) { + return SuggestedFix.builder().swap(tree1, tree2, state).build(); } @AfterTemplate - SuggestedFix after(Tree tree1, Tree tree2) { - return SuggestedFix.swap(tree1, tree2); + SuggestedFix after(Tree tree1, Tree tree2, VisitorState state) { + return SuggestedFix.swap(tree1, tree2, state); } } diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/TestNGToAssertJRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/TestNGToAssertJRules.java index ea335d65..e3b2a0cd 100644 --- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/TestNGToAssertJRules.java +++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/TestNGToAssertJRules.java @@ -66,6 +66,7 @@ import tech.picnic.errorprone.refaster.annotation.TypeMigration; */ "assertEqualsDeep(Map, Map)", "assertEqualsDeep(Map, Map, String)", + "assertEqualsDeep(Set, Set)", "assertEqualsDeep(Set, Set, String)", // XXX: Add migrations for the methods below. "assertEqualsNoOrder(Collection, Collection)", @@ -299,6 +300,7 @@ final class TestNGToAssertJRules { } } + @SuppressWarnings("java:S1448" /* Each variant requires a separate `@BeforeTemplate` method. */) static final class AssertEqual { @BeforeTemplate void before(boolean actual, boolean expected) { @@ -482,6 +484,7 @@ final class TestNGToAssertJRules { } } + @SuppressWarnings("java:S1448" /* Each variant requires a separate `@BeforeTemplate` method. */) static final class AssertEqualWithMessage { @BeforeTemplate void before(boolean actual, String message, boolean expected) { @@ -588,6 +591,11 @@ final class TestNGToAssertJRules { assertEquals(actual, expected, message); } + @BeforeTemplate + void before(long actual, String message, Long expected) { + assertEquals(actual, expected, message); + } + @BeforeTemplate void before(Long actual, String message, long expected) { assertEquals(actual, expected, message); diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/PrimitiveRulesTestInput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/PrimitiveRulesTestInput.java index 419f4c9c..3d045f1e 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/PrimitiveRulesTestInput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/PrimitiveRulesTestInput.java @@ -9,8 +9,10 @@ import com.google.common.primitives.Floats; import com.google.common.primitives.Ints; import com.google.common.primitives.Longs; import com.google.common.primitives.Shorts; +import com.google.common.primitives.UnsignedBytes; import com.google.common.primitives.UnsignedInts; import com.google.common.primitives.UnsignedLongs; +import java.util.Comparator; import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase; final class PrimitiveRulesTest implements RefasterRuleCollectionTestCase { @@ -25,6 +27,7 @@ final class PrimitiveRulesTest implements RefasterRuleCollectionTestCase { Ints.class, Longs.class, Shorts.class, + UnsignedBytes.class, UnsignedInts.class, UnsignedLongs.class); } @@ -222,4 +225,16 @@ final class PrimitiveRulesTest implements RefasterRuleCollectionTestCase { String testLongToUnsignedStringWithRadix() { return UnsignedLongs.toString(1, 2); } + + Comparator testArraysCompareUnsignedBytes() { + return UnsignedBytes.lexicographicalComparator(); + } + + Comparator testArraysCompareUnsignedInts() { + return UnsignedInts.lexicographicalComparator(); + } + + Comparator testArraysCompareUnsignedLongs() { + return UnsignedLongs.lexicographicalComparator(); + } } diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/PrimitiveRulesTestOutput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/PrimitiveRulesTestOutput.java index f111b028..404738ef 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/PrimitiveRulesTestOutput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/PrimitiveRulesTestOutput.java @@ -9,8 +9,11 @@ import com.google.common.primitives.Floats; import com.google.common.primitives.Ints; import com.google.common.primitives.Longs; import com.google.common.primitives.Shorts; +import com.google.common.primitives.UnsignedBytes; import com.google.common.primitives.UnsignedInts; import com.google.common.primitives.UnsignedLongs; +import java.util.Arrays; +import java.util.Comparator; import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase; final class PrimitiveRulesTest implements RefasterRuleCollectionTestCase { @@ -25,6 +28,7 @@ final class PrimitiveRulesTest implements RefasterRuleCollectionTestCase { Ints.class, Longs.class, Shorts.class, + UnsignedBytes.class, UnsignedInts.class, UnsignedLongs.class); } @@ -222,4 +226,16 @@ final class PrimitiveRulesTest implements RefasterRuleCollectionTestCase { String testLongToUnsignedStringWithRadix() { return Long.toUnsignedString(1, 2); } + + Comparator testArraysCompareUnsignedBytes() { + return Arrays::compareUnsigned; + } + + Comparator testArraysCompareUnsignedInts() { + return Arrays::compareUnsigned; + } + + Comparator testArraysCompareUnsignedLongs() { + return Arrays::compareUnsigned; + } } diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestInput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestInput.java index cf6a9fe7..fe4c9dcf 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestInput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestInput.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; @@ -341,7 +342,11 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { } ImmutableSet> testMonoThen() { - return ImmutableSet.of(Mono.just("foo").ignoreElement().then(), Mono.just("bar").flux().then()); + return ImmutableSet.of( + Mono.just("foo").ignoreElement().then(), + Mono.just("bar").flux().then(), + Mono.when(Mono.just("baz")), + Mono.whenDelayError(Mono.just("qux"))); } ImmutableSet> testFluxThen() { @@ -387,8 +392,10 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { ImmutableSet>> testMonoSingleOptional() { return ImmutableSet.of( Mono.just("foo").flux().collect(toOptional()), - Mono.just("bar").map(Optional::of).defaultIfEmpty(Optional.empty()), - Mono.just("baz").transform(Mono::singleOptional)); + Mono.just("bar").map(Optional::of), + Mono.just("baz").singleOptional().defaultIfEmpty(Optional.empty()), + Mono.just("quux").singleOptional().switchIfEmpty(Mono.just(Optional.empty())), + Mono.just("quuz").transform(Mono::singleOptional)); } Mono testMonoCast() { @@ -745,6 +752,11 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { return Mono.fromFuture(() -> ((AsyncLoadingCache) null).get(0)); } + Mono> testMonoFromFutureAsyncLoadingCacheGetAll() { + return Mono.fromFuture( + () -> ((AsyncLoadingCache) null).getAll(ImmutableSet.of())); + } + Flux testFluxFromStreamSupplier() { return Flux.fromStream(Stream.of(1)); } diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestOutput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestOutput.java index f32cd717..e48cca28 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestOutput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestOutput.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; @@ -339,7 +340,11 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { } ImmutableSet> testMonoThen() { - return ImmutableSet.of(Mono.just("foo").then(), Mono.just("bar").then()); + return ImmutableSet.of( + Mono.just("foo").then(), + Mono.just("bar").then(), + Mono.just("baz").then(), + Mono.just("qux").then()); } ImmutableSet> testFluxThen() { @@ -383,7 +388,9 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { return ImmutableSet.of( Mono.just("foo").singleOptional(), Mono.just("bar").singleOptional(), - Mono.just("baz").singleOptional()); + Mono.just("baz").singleOptional(), + Mono.just("quux").singleOptional(), + Mono.just("quuz").singleOptional()); } Mono testMonoCast() { @@ -719,6 +726,11 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { return Mono.fromFuture(() -> ((AsyncLoadingCache) null).get(0), true); } + Mono> testMonoFromFutureAsyncLoadingCacheGetAll() { + return Mono.fromFuture( + () -> ((AsyncLoadingCache) null).getAll(ImmutableSet.of()), true); + } + Flux testFluxFromStreamSupplier() { return Flux.fromStream(() -> Stream.of(1)); } diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/SuggestedFixRulesTestInput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/SuggestedFixRulesTestInput.java index 4d6c7ccd..d93fcc1f 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/SuggestedFixRulesTestInput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/SuggestedFixRulesTestInput.java @@ -1,5 +1,6 @@ package tech.picnic.errorprone.refasterrules; +import com.google.errorprone.VisitorState; import com.google.errorprone.fixes.SuggestedFix; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.Tree; @@ -23,7 +24,9 @@ final class SuggestedFixRulesTest implements RefasterRuleCollectionTestCase { } SuggestedFix testSuggestedFixSwap() { - return SuggestedFix.builder().swap((Tree) null, (ExpressionTree) null).build(); + return SuggestedFix.builder() + .swap((Tree) null, (ExpressionTree) null, (VisitorState) null) + .build(); } SuggestedFix testSuggestedFixPrefixWith() { diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/SuggestedFixRulesTestOutput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/SuggestedFixRulesTestOutput.java index 15671e43..70f3b3d9 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/SuggestedFixRulesTestOutput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/SuggestedFixRulesTestOutput.java @@ -1,5 +1,6 @@ package tech.picnic.errorprone.refasterrules; +import com.google.errorprone.VisitorState; import com.google.errorprone.fixes.SuggestedFix; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.Tree; @@ -23,7 +24,7 @@ final class SuggestedFixRulesTest implements RefasterRuleCollectionTestCase { } SuggestedFix testSuggestedFixSwap() { - return SuggestedFix.swap((Tree) null, (ExpressionTree) null); + return SuggestedFix.swap((Tree) null, (ExpressionTree) null, (VisitorState) null); } SuggestedFix testSuggestedFixPrefixWith() { diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/TestNGToAssertJRulesTestInput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/TestNGToAssertJRulesTestInput.java index 8ee347f9..79fc2850 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/TestNGToAssertJRulesTestInput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/TestNGToAssertJRulesTestInput.java @@ -155,8 +155,7 @@ final class TestNGToAssertJRulesTest implements RefasterRuleCollectionTestCase { assertEquals(Integer.valueOf(0), 1, "corge"); assertEquals(Integer.valueOf(0), Integer.valueOf(1), "grault"); assertEquals(0L, 1L, "garply"); - // XXX: Ambiguous method call, as the relevant overload is missing. See testng-team/testng#3199. - // assertEquals(0L, Long.valueOf(1), "waldo"); + assertEquals(0L, Long.valueOf(1), "waldo"); assertEquals(Long.valueOf(0), 1L, "fred"); assertEquals(Long.valueOf(0), Long.valueOf(1), "plugh"); assertEquals(0.0F, 1.0F, "xyzzy"); diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/TestNGToAssertJRulesTestOutput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/TestNGToAssertJRulesTestOutput.java index 139caf08..da7539d0 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/TestNGToAssertJRulesTestOutput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/TestNGToAssertJRulesTestOutput.java @@ -160,8 +160,7 @@ final class TestNGToAssertJRulesTest implements RefasterRuleCollectionTestCase { assertThat(Integer.valueOf(0)).withFailMessage("corge").isEqualTo(1); assertThat(Integer.valueOf(0)).withFailMessage("grault").isEqualTo(Integer.valueOf(1)); assertThat(0L).withFailMessage("garply").isEqualTo(1L); - // XXX: Ambiguous method call, as the relevant overload is missing. See testng-team/testng#3199. - // assertEquals(0L, Long.valueOf(1), "waldo"); + assertThat(0L).withFailMessage("waldo").isEqualTo(Long.valueOf(1)); assertThat(Long.valueOf(0)).withFailMessage("fred").isEqualTo(1L); assertThat(Long.valueOf(0)).withFailMessage("plugh").isEqualTo(Long.valueOf(1)); assertThat(0.0F).withFailMessage("xyzzy").isEqualTo(1.0F); diff --git a/error-prone-guidelines/src/main/java/tech/picnic/errorprone/guidelines/bugpatterns/ExhaustiveRefasterTypeMigration.java b/error-prone-guidelines/src/main/java/tech/picnic/errorprone/guidelines/bugpatterns/ExhaustiveRefasterTypeMigration.java index ada6b19c..4a3d6ebe 100644 --- a/error-prone-guidelines/src/main/java/tech/picnic/errorprone/guidelines/bugpatterns/ExhaustiveRefasterTypeMigration.java +++ b/error-prone-guidelines/src/main/java/tech/picnic/errorprone/guidelines/bugpatterns/ExhaustiveRefasterTypeMigration.java @@ -46,7 +46,6 @@ import java.util.Set; import java.util.function.Consumer; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; -import javax.lang.model.element.Modifier; import org.jspecify.annotations.Nullable; import tech.picnic.errorprone.utils.SourceCode; @@ -102,7 +101,8 @@ public final class ExhaustiveRefasterTypeMigration extends BugChecker implements AnnotationTree migrationAnnotation = migrationAnnotations.onlyMatchingNode(); AnnotationMirror annotationMirror = ASTHelpers.getAnnotationMirror(migrationAnnotation); TypeSymbol migratedType = getMigratedType(annotationMirror); - if (migratedType.asType().isPrimitive() || !(migratedType instanceof ClassSymbol)) { + if (migratedType.asType().isPrimitive() + || !(migratedType instanceof ClassSymbol migratedClass)) { return buildDescription(migrationAnnotation) .setMessage(String.format("Migration of type '%s' is unsupported", migratedType)) .build(); @@ -111,7 +111,7 @@ public final class ExhaustiveRefasterTypeMigration extends BugChecker implements ImmutableList methodsClaimedUnmigrated = getMethodsClaimedUnmigrated(annotationMirror); ImmutableList unmigratedMethods = getMethodsDefinitelyUnmigrated( - tree, (ClassSymbol) migratedType, signatureOrder(methodsClaimedUnmigrated), state); + tree, migratedClass, signatureOrder(methodsClaimedUnmigrated), state); if (unmigratedMethods.equals(methodsClaimedUnmigrated)) { return Description.NO_MATCH; @@ -160,17 +160,11 @@ public final class ExhaustiveRefasterTypeMigration extends BugChecker implements .getValue().stream().map(a -> a.getValue().toString()).collect(toImmutableList()); } - // XXX: Once only JDK 14 and above are supported, change the - // `m.getModifiers().contains(Modifier.PUBLIC)` check to just `m.isPublic()`. private static ImmutableList getMethodsDefinitelyUnmigrated( ClassTree tree, ClassSymbol migratedType, Comparator comparator, VisitorState state) { Set publicMethods = Streams.stream( - ASTHelpers.scope(migratedType.members()) - .getSymbols( - m -> - m.getModifiers().contains(Modifier.PUBLIC) - && m instanceof MethodSymbol)) + migratedType.members().getSymbols(m -> m.isPublic() && m instanceof MethodSymbol)) .map(MethodSymbol.class::cast) .collect(toCollection(HashSet::new)); diff --git a/error-prone-utils/src/test/java/tech/picnic/errorprone/utils/SourceCodeTest.java b/error-prone-utils/src/test/java/tech/picnic/errorprone/utils/SourceCodeTest.java index bf75359f..79120be1 100644 --- a/error-prone-utils/src/test/java/tech/picnic/errorprone/utils/SourceCodeTest.java +++ b/error-prone-utils/src/test/java/tech/picnic/errorprone/utils/SourceCodeTest.java @@ -305,14 +305,7 @@ final class SourceCodeTest { @Override public Description matchLiteral(LiteralTree tree, VisitorState state) { - // XXX: The character conversion is a workaround for the fact that `ASTHelpers#constValue` - // returns an `Integer` value for `char` constants. return Optional.ofNullable(ASTHelpers.constValue(tree)) - .map( - constant -> - ASTHelpers.isSubtype(ASTHelpers.getType(tree), state.getSymtab().charType, state) - ? (char) (int) constant - : constant) .map(constant -> describeMatch(tree, addComment(tree, constant, state))) .orElse(Description.NO_MATCH); } diff --git a/integration-tests/metrics-expected-changes.patch b/integration-tests/metrics-expected-changes.patch index edf493d9..b5abee8d 100644 --- a/integration-tests/metrics-expected-changes.patch +++ b/integration-tests/metrics-expected-changes.patch @@ -89,15 +89,63 @@ } return new CollectdReporter( registry, -@@ -302,7 +297,7 @@ public class CollectdReporter extends ScheduledReporter { +@@ -177,7 +172,7 @@ public class CollectdReporter extends ScheduledReporter { + } + } + +- private static final Logger LOG = LoggerFactory.getLogger(CollectdReporter.class); ++ private static final Logger LOGGER = LoggerFactory.getLogger(CollectdReporter.class); + private static final String REPORTER_NAME = "collectd-reporter"; + private static final String FALLBACK_HOST_NAME = "localhost"; + private static final String COLLECTD_TYPE_GAUGE = "gauge"; +@@ -224,7 +219,7 @@ public class CollectdReporter extends ScheduledReporter { + try { + return InetAddress.getLocalHost().getHostName(); + } catch (Exception e) { +- LOG.error("Failed to lookup local host name: {}", e.getMessage(), e); ++ LOGGER.error("Failed to lookup local host name: {}", e.getMessage(), e); + return FALLBACK_HOST_NAME; + } + } +@@ -263,7 +258,7 @@ public class CollectdReporter extends ScheduledReporter { + serializeTimer(metaData.plugin(entry.getKey().getKey()), entry.getValue()); + } + } catch (IOException e) { +- LOG.warn("Unable to report to Collectd", e); ++ LOGGER.warn("Unable to report to Collectd", e); + } finally { + disconnect(sender); + } +@@ -279,7 +274,7 @@ public class CollectdReporter extends ScheduledReporter { + try { + sender.disconnect(); + } catch (Exception e) { +- LOG.warn("Error disconnecting from Collectd", e); ++ LOGGER.warn("Error disconnecting from Collectd", e); + } + } + +@@ -302,9 +297,9 @@ public class CollectdReporter extends ScheduledReporter { try { writer.write(metaData, value); } catch (RuntimeException e) { - LOG.warn("Failed to process metric '" + metaData.getPlugin() + "': " + e.getMessage()); -+ LOG.warn("Failed to process metric '{}': {}", metaData.getPlugin(), e.getMessage()); ++ LOGGER.warn("Failed to process metric '{}': {}", metaData.getPlugin(), e.getMessage()); } catch (IOException e) { - LOG.error("Failed to send metric to collectd", e); +- LOG.error("Failed to send metric to collectd", e); ++ LOGGER.error("Failed to send metric to collectd", e); } + } + +@@ -314,7 +309,7 @@ public class CollectdReporter extends ScheduledReporter { + } else if (metric.getValue() instanceof Boolean) { + write(metaData.typeInstance("value").get(), ((Boolean) metric.getValue()) ? 1 : 0); + } else { +- LOG.warn( ++ LOGGER.warn( + "Failed to process metric '{}'. Unsupported gauge of type: {} ", + metaData.get().getPlugin(), + metric.getValue().getClass().getName()); @@ -336,9 +331,9 @@ public class CollectdReporter extends ScheduledReporter { private void serializeHistogram(MetaData.Builder metaData, Histogram metric) { final Snapshot snapshot = metric.getSnapshot(); @@ -476,26 +524,6 @@ } /** ---- a/metrics-core/src/main/java/io/dropwizard/metrics5/CsvReporter.java -+++ b/metrics-core/src/main/java/io/dropwizard/metrics5/CsvReporter.java -@@ -179,7 +179,7 @@ public class CsvReporter extends ScheduledReporter { - } - } - -- private static final Logger LOGGER = LoggerFactory.getLogger(CsvReporter.class); -+ private static final Logger LOG = LoggerFactory.getLogger(CsvReporter.class); - - private final File directory; - private final Locale locale; -@@ -391,7 +391,7 @@ public class CsvReporter extends ScheduledReporter { - } - } - } catch (IOException e) { -- LOGGER.warn("Error writing to {}", name, e); -+ LOG.warn("Error writing to {}", name, e); - } - } - --- a/metrics-core/src/main/java/io/dropwizard/metrics5/ExponentialMovingAverages.java +++ b/metrics-core/src/main/java/io/dropwizard/metrics5/ExponentialMovingAverages.java @@ -17,9 +17,9 @@ public class ExponentialMovingAverages implements MovingAverages { @@ -990,6 +1018,15 @@ import java.util.Locale; import java.util.Set; import java.util.SortedMap; +@@ -24,7 +27,7 @@ import org.slf4j.LoggerFactory; + */ + public abstract class ScheduledReporter implements Closeable, Reporter { + +- private static final Logger LOG = LoggerFactory.getLogger(ScheduledReporter.class); ++ private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledReporter.class); + + /** A simple named thread factory. */ + @SuppressWarnings("NullableProblems") @@ -128,7 +131,7 @@ public abstract class ScheduledReporter implements Closeable, Reporter { durationUnit, executor, @@ -1040,6 +1077,33 @@ protected ScheduledFuture getScheduledFuture( long initialDelay, long period, TimeUnit unit, Runnable runnable) { return getScheduledFuture(initialDelay, period, unit, runnable, this.executor); +@@ -225,7 +224,7 @@ public abstract class ScheduledReporter implements Closeable, Reporter { + try { + report(); + } catch (Throwable ex) { +- LOG.error( ++ LOGGER.error( + "Exception thrown from {}#report. Exception was suppressed.", + ScheduledReporter.this.getClass().getSimpleName(), + ex); +@@ -250,7 +249,7 @@ public abstract class ScheduledReporter implements Closeable, Reporter { + try { + report(); + } catch (Exception e) { +- LOG.warn("Final reporting of metrics failed.", e); ++ LOGGER.warn("Final reporting of metrics failed.", e); + } + } + +@@ -261,7 +260,7 @@ public abstract class ScheduledReporter implements Closeable, Reporter { + executor.shutdownNow(); // Cancel currently executing tasks + // Wait a while for tasks to respond to being cancelled + if (!executor.awaitTermination(1, TimeUnit.SECONDS)) { +- LOG.warn("ScheduledExecutorService did not terminate."); ++ LOGGER.warn("ScheduledExecutorService did not terminate."); + } + } + } catch (InterruptedException ie) { --- a/metrics-core/src/main/java/io/dropwizard/metrics5/SharedMetricRegistries.java +++ b/metrics-core/src/main/java/io/dropwizard/metrics5/SharedMetricRegistries.java @@ -1,5 +1,7 @@ @@ -1200,32 +1264,15 @@ import java.util.ArrayList; import java.util.List; -@@ -15,8 +14,8 @@ import org.junit.jupiter.api.Test; +@@ -15,7 +14,7 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -class CachedGaugeTest { -- private static final Logger LOGGER = LoggerFactory.getLogger(CachedGaugeTest.class); +final class CachedGaugeTest { -+ private static final Logger LOG = LoggerFactory.getLogger(CachedGaugeTest.class); + private static final Logger LOGGER = LoggerFactory.getLogger(CachedGaugeTest.class); private static final int THREAD_COUNT = 10; private static final long RUNNING_TIME_MILLIS = TimeUnit.SECONDS.toMillis(10); - -@@ -100,12 +99,12 @@ class CachedGaugeTest { - Integer newValue = shortTimeoutGauge.getValue(); - - if (newValue == null) { -- LOGGER.warn("Cached gauge returned null value"); -+ LOG.warn("Cached gauge returned null value"); - return false; - } - - if (newValue < lastValue) { -- LOGGER.error( -+ LOG.error( - "Cached gauge returned stale value, last: {}, new: {}", - lastValue, - newValue); @@ -122,7 +121,7 @@ class CachedGaugeTest { } @@ -1899,29 +1946,16 @@ assertThat(histogram.getSnapshot()).isEqualTo(snapshot); --- a/metrics-core/src/test/java/io/dropwizard/metrics5/InstrumentedExecutorServiceTest.java +++ b/metrics-core/src/test/java/io/dropwizard/metrics5/InstrumentedExecutorServiceTest.java -@@ -19,10 +19,9 @@ import org.junit.jupiter.api.Test; +@@ -19,7 +19,7 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -class InstrumentedExecutorServiceTest { +final class InstrumentedExecutorServiceTest { -- private static final Logger LOGGER = -- LoggerFactory.getLogger(InstrumentedExecutorServiceTest.class); -+ private static final Logger LOG = LoggerFactory.getLogger(InstrumentedExecutorServiceTest.class); - private ExecutorService executor; - private MetricRegistry registry; - private InstrumentedExecutorService instrumentedExecutorService; -@@ -48,7 +47,7 @@ class InstrumentedExecutorServiceTest { - void tearDown() throws Exception { - instrumentedExecutorService.shutdown(); - if (!instrumentedExecutorService.awaitTermination(2, TimeUnit.SECONDS)) { -- LOGGER.error("InstrumentedExecutorService did not terminate."); -+ LOG.error("InstrumentedExecutorService did not terminate."); - } - } - -@@ -115,8 +114,8 @@ class InstrumentedExecutorServiceTest { + private static final Logger LOGGER = + LoggerFactory.getLogger(InstrumentedExecutorServiceTest.class); +@@ -115,8 +115,8 @@ class InstrumentedExecutorServiceTest { assertThat(idle.getSnapshot().size()).isEqualTo(1); } @@ -1931,7 +1965,7 @@ void reportsTasksInformationForThreadPoolExecutor() throws Exception { executor = new ThreadPoolExecutor(4, 16, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(32)); -@@ -180,7 +179,7 @@ class InstrumentedExecutorServiceTest { +@@ -180,7 +180,7 @@ class InstrumentedExecutorServiceTest { } @Test @@ -1940,7 +1974,7 @@ executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1)); instrumentedExecutorService = new InstrumentedExecutorService(executor, registry, "tp"); -@@ -207,7 +206,7 @@ class InstrumentedExecutorServiceTest { +@@ -207,7 +207,7 @@ class InstrumentedExecutorServiceTest { } @Test @@ -1949,7 +1983,7 @@ executor = new ThreadPoolExecutor(4, 16, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(32)); instrumentedExecutorService = new InstrumentedExecutorService(executor, registry, "stp"); -@@ -236,8 +235,8 @@ class InstrumentedExecutorServiceTest { +@@ -236,8 +236,8 @@ class InstrumentedExecutorServiceTest { MetricRegistry.name("stp", "tasks.capacity")); } @@ -1959,7 +1993,7 @@ void reportsTasksInformationForForkJoinPool() throws Exception { executor = Executors.newWorkStealingPool(4); instrumentedExecutorService = new InstrumentedExecutorService(executor, registry, "fjp"); -@@ -291,7 +290,7 @@ class InstrumentedExecutorServiceTest { +@@ -291,7 +291,7 @@ class InstrumentedExecutorServiceTest { } @Test @@ -1970,17 +2004,15 @@ --- a/metrics-core/src/test/java/io/dropwizard/metrics5/InstrumentedScheduledExecutorServiceTest.java +++ b/metrics-core/src/test/java/io/dropwizard/metrics5/InstrumentedScheduledExecutorServiceTest.java -@@ -13,8 +13,8 @@ import org.junit.jupiter.api.Test; +@@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -class InstrumentedScheduledExecutorServiceTest { -- private static final Logger LOGGER = +final class InstrumentedScheduledExecutorServiceTest { -+ private static final Logger LOG = + private static final Logger LOGGER = LoggerFactory.getLogger(InstrumentedScheduledExecutorServiceTest.class); - private final ScheduledExecutorService scheduledExecutor = @@ -35,17 +35,17 @@ class InstrumentedScheduledExecutorServiceTest { private final Histogram percentOfPeriod = registry.histogram("xs.scheduled.percent-of-period"); @@ -2338,15 +2370,6 @@ assertThat(completed.getCount()).isNotEqualTo(0); assertThat(duration.getCount()).isNotEqualTo(0); assertThat(duration.getSnapshot().size()).isNotEqualTo(0); -@@ -322,7 +322,7 @@ class InstrumentedScheduledExecutorServiceTest { - void tearDown() throws Exception { - instrumentedScheduledExecutor.shutdown(); - if (!instrumentedScheduledExecutor.awaitTermination(2, TimeUnit.SECONDS)) { -- LOGGER.error("InstrumentedScheduledExecutorService did not terminate."); -+ LOG.error("InstrumentedScheduledExecutorService did not terminate."); - } - } - } --- a/metrics-core/src/test/java/io/dropwizard/metrics5/InstrumentedThreadFactoryTest.java +++ b/metrics-core/src/test/java/io/dropwizard/metrics5/InstrumentedThreadFactoryTest.java @@ -11,7 +11,7 @@ import java.util.concurrent.TimeUnit; @@ -3801,15 +3824,6 @@ import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; -@@ -29,7 +32,7 @@ public class Graphite implements GraphiteSender { - private Writer writer; - private int failures; - -- private static final Logger LOGGER = LoggerFactory.getLogger(Graphite.class); -+ private static final Logger LOG = LoggerFactory.getLogger(Graphite.class); - - /** - * Creates a new client which connects to the given address using the default {@link @@ -63,13 +66,9 @@ public class Graphite implements GraphiteSender { * @param charset the character set used by the server */ @@ -3837,24 +3851,6 @@ InetSocketAddress address = this.address; // the previous dns retry logic did not work, as address.getAddress would always return the // cached value -@@ -178,7 +175,7 @@ public class Graphite implements GraphiteSender { - writer.close(); - } - } catch (IOException ex) { -- LOGGER.debug("Error closing writer", ex); -+ LOG.debug("Error closing writer", ex); - } finally { - this.writer = null; - } -@@ -188,7 +185,7 @@ public class Graphite implements GraphiteSender { - socket.close(); - } - } catch (IOException ex) { -- LOGGER.debug("Error closing socket", ex); -+ LOG.debug("Error closing socket", ex); - } finally { - this.socket = null; - } --- a/metrics-graphite/src/main/java/io/dropwizard/metrics5/graphite/GraphiteRabbitMQ.java +++ b/metrics-graphite/src/main/java/io/dropwizard/metrics5/graphite/GraphiteRabbitMQ.java @@ -1,5 +1,6 @@ @@ -3923,39 +3919,7 @@ this.addMetricAttributesAsTags = false; this.floatingPointFormatter = DEFAULT_FP_FORMATTER; } -@@ -249,7 +247,7 @@ public class GraphiteReporter extends ScheduledReporter { - } - } - -- private static final Logger LOGGER = LoggerFactory.getLogger(GraphiteReporter.class); -+ private static final Logger LOG = LoggerFactory.getLogger(GraphiteReporter.class); - // the Carbon plaintext format is pretty underspecified, but it seems like it just wants - // US-formatted digits - private static final DoubleFunction DEFAULT_FP_FORMATTER = -@@ -430,12 +428,12 @@ public class GraphiteReporter extends ScheduledReporter { - } - graphite.flush(); - } catch (IOException e) { -- LOGGER.warn("Unable to report to Graphite", graphite, e); -+ LOG.warn("Unable to report to Graphite", graphite, e); - } finally { - try { - graphite.close(); - } catch (IOException e1) { -- LOGGER.warn("Error closing Graphite", graphite, e1); -+ LOG.warn("Error closing Graphite", graphite, e1); - } - } - } -@@ -448,16 +446,16 @@ public class GraphiteReporter extends ScheduledReporter { - try { - graphite.close(); - } catch (IOException e) { -- LOGGER.debug("Error disconnecting from Graphite", graphite, e); -+ LOG.debug("Error disconnecting from Graphite", graphite, e); - } - } - } +@@ -455,9 +453,9 @@ public class GraphiteReporter extends ScheduledReporter { private void reportTimer(MetricName name, Timer timer, long timestamp) throws IOException { final Snapshot snapshot = timer.getSnapshot(); @@ -4017,15 +3981,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import java.io.BufferedWriter; -@@ -48,7 +49,7 @@ public class PickledGraphite implements GraphiteSender { - QUOTE = '\'', - LF = '\n'; - -- private static final Logger LOGGER = LoggerFactory.getLogger(PickledGraphite.class); -+ private static final Logger LOG = LoggerFactory.getLogger(PickledGraphite.class); - private static final int DEFAULT_BATCH_SIZE = 100; - - private int batchSize; @@ -173,9 +174,7 @@ public class PickledGraphite implements GraphiteSender { @Override @@ -4046,17 +4001,6 @@ try { byte[] payload = pickleMetrics(metrics); byte[] header = ByteBuffer.allocate(4).putInt(payload.length).array(); -@@ -260,8 +259,8 @@ public class PickledGraphite implements GraphiteSender { - outputStream.write(payload); - outputStream.flush(); - -- if (LOGGER.isDebugEnabled()) { -- LOGGER.debug("Wrote {} metrics", metrics.size()); -+ if (LOG.isDebugEnabled()) { -+ LOG.debug("Wrote {} metrics", metrics.size()); - } - } catch (IOException e) { - this.failures++; --- a/metrics-graphite/src/test/java/io/dropwizard/metrics5/graphite/GraphiteRabbitMQTest.java +++ b/metrics-graphite/src/test/java/io/dropwizard/metrics5/graphite/GraphiteRabbitMQTest.java @@ -8,7 +8,6 @@ import static org.mockito.Mockito.anyString; @@ -4475,15 +4419,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -@@ -27,7 +29,7 @@ import org.slf4j.LoggerFactory; - - /** A registry for health checks. */ - public class HealthCheckRegistry { -- private static final Logger LOGGER = LoggerFactory.getLogger(HealthCheckRegistry.class); -+ private static final Logger LOG = LoggerFactory.getLogger(HealthCheckRegistry.class); - private static final int ASYNC_EXECUTOR_POOL_SIZE = 2; - - private final ConcurrentMap healthChecks; @@ -92,9 +94,8 @@ public class HealthCheckRegistry { public void register(String name, HealthCheck healthCheck) { HealthCheck registered; @@ -4514,13 +4449,7 @@ } /** -@@ -217,12 +218,12 @@ public class HealthCheckRegistry { - try { - results.put(entry.getKey(), entry.getValue().get()); - } catch (Exception e) { -- LOGGER.warn("Error executing health check {}", entry.getKey(), e); -+ LOG.warn("Error executing health check {}", entry.getKey(), e); - results.put(entry.getKey(), HealthCheck.Result.unhealthy(e)); +@@ -222,7 +223,7 @@ public class HealthCheckRegistry { } } @@ -5357,39 +5286,6 @@ } /** -@@ -196,7 +196,7 @@ public class InfluxDbReporter extends GarbageFreeScheduledReporter { - } - } - -- private static final Logger LOGGER = LoggerFactory.getLogger(InfluxDbReporter.class); -+ private static final Logger LOG = LoggerFactory.getLogger(InfluxDbReporter.class); - private static final String VALUE = "value"; - - private final Clock clock; -@@ -279,12 +279,12 @@ public class InfluxDbReporter extends GarbageFreeScheduledReporter { - } - sender.flush(); - } catch (IOException e) { -- LOGGER.warn("Unable to report to InfluxDb", sender, e); -+ LOG.warn("Unable to report to InfluxDb", sender, e); - } finally { - try { - sender.disconnect(); - } catch (IOException e) { -- LOGGER.warn("Error disconnecting InfluxDb", sender, e); -+ LOG.warn("Error disconnecting InfluxDb", sender, e); - } - } - } -@@ -297,7 +297,7 @@ public class InfluxDbReporter extends GarbageFreeScheduledReporter { - try { - sender.close(); - } catch (IOException e) { -- LOGGER.debug("Error disconnecting from InfluxDb", e); -+ LOG.debug("Error disconnecting from InfluxDb", e); - } - } - } --- a/metrics-influxdb/src/main/java/io/dropwizard/metrics5/influxdb/InfluxDbUdpSender.java +++ b/metrics-influxdb/src/main/java/io/dropwizard/metrics5/influxdb/InfluxDbUdpSender.java @@ -1,5 +1,7 @@ @@ -6065,15 +5961,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; -@@ -33,7 +33,7 @@ public class JCacheGaugeSet implements MetricSet { - private static final String M_BEAN_COORDINATES = - "javax.cache:type=CacheStatistics,CacheManager=*,Cache=*"; - -- private static final Logger LOGGER = LoggerFactory.getLogger(JCacheGaugeSet.class); -+ private static final Logger LOG = LoggerFactory.getLogger(JCacheGaugeSet.class); - - @Override - public Map getMetrics() { @@ -52,7 +52,7 @@ public class JCacheGaugeSet implements MetricSet { } } @@ -6083,15 +5970,6 @@ } private Set getCacheBeans() { -@@ -60,7 +60,7 @@ public class JCacheGaugeSet implements MetricSet { - return ManagementFactory.getPlatformMBeanServer() - .queryMBeans(ObjectName.getInstance(M_BEAN_COORDINATES), null); - } catch (MalformedObjectNameException e) { -- LOGGER.error("Unable to retrieve {}. Are JCache statistics enabled?", M_BEAN_COORDINATES); -+ LOG.error("Unable to retrieve {}. Are JCache statistics enabled?", M_BEAN_COORDINATES); - throw new RuntimeException(e); - } - } --- a/metrics-jcache/src/test/java/JCacheGaugeSetTest.java +++ b/metrics-jcache/src/test/java/JCacheGaugeSetTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.AfterEach; @@ -8461,11 +8339,11 @@ private static final char[] QUOTABLE_CHARS = new char[] {',', '=', ':', '"'}; - private static final Logger LOGGER = LoggerFactory.getLogger(JmxReporter.class); -+ private static final Logger LOG = LoggerFactory.getLogger(DefaultObjectNameFactory.class); ++ private static final Logger LOGGER = LoggerFactory.getLogger(DefaultObjectNameFactory.class); @Override public ObjectName createName(String type, String domain, MetricName name) { -@@ -38,14 +38,13 @@ public class DefaultObjectNameFactory implements ObjectNameFactory { +@@ -38,9 +38,8 @@ public class DefaultObjectNameFactory implements ObjectNameFactory { || shouldQuote(objectName.getKeyProperty("type"))) { properties.put("type", ObjectName.quote(type)); } @@ -8476,12 +8354,6 @@ } catch (MalformedObjectNameException e) { try { return new ObjectName(domain, "name", ObjectName.quote(name.getKey())); - } catch (MalformedObjectNameException e1) { -- LOGGER.warn("Unable to register {} {}", type, name, e1); -+ LOG.warn("Unable to register {} {}", type, name, e1); - throw new RuntimeException(e1); - } - } --- a/metrics-jmx/src/main/java/io/dropwizard/metrics5/jmx/JmxReporter.java +++ b/metrics-jmx/src/main/java/io/dropwizard/metrics5/jmx/JmxReporter.java @@ -1,5 +1,9 @@ @@ -8542,147 +8414,6 @@ return this; } -@@ -159,7 +160,7 @@ public class JmxReporter implements Reporter, Closeable { - } - } - -- private static final Logger LOGGER = LoggerFactory.getLogger(JmxReporter.class); -+ private static final Logger LOG = LoggerFactory.getLogger(JmxReporter.class); - - @SuppressWarnings("UnusedDeclaration") - public interface MetricMBean { -@@ -570,9 +571,9 @@ public class JmxReporter implements Reporter, Closeable { - registerMBean(new JmxGauge(gauge, objectName), objectName); - } - } catch (InstanceAlreadyExistsException e) { -- LOGGER.debug("Unable to register gauge", e); -+ LOG.debug("Unable to register gauge", e); - } catch (JMException e) { -- LOGGER.warn("Unable to register gauge", e); -+ LOG.warn("Unable to register gauge", e); - } - } - -@@ -582,9 +583,9 @@ public class JmxReporter implements Reporter, Closeable { - final ObjectName objectName = createName("gauges", name); - unregisterMBean(objectName); - } catch (InstanceNotFoundException e) { -- LOGGER.debug("Unable to unregister gauge", e); -+ LOG.debug("Unable to unregister gauge", e); - } catch (MBeanRegistrationException e) { -- LOGGER.warn("Unable to unregister gauge", e); -+ LOG.warn("Unable to unregister gauge", e); - } - } - -@@ -596,9 +597,9 @@ public class JmxReporter implements Reporter, Closeable { - registerMBean(new JmxCounter(counter, objectName), objectName); - } - } catch (InstanceAlreadyExistsException e) { -- LOGGER.debug("Unable to register counter", e); -+ LOG.debug("Unable to register counter", e); - } catch (JMException e) { -- LOGGER.warn("Unable to register counter", e); -+ LOG.warn("Unable to register counter", e); - } - } - -@@ -608,9 +609,9 @@ public class JmxReporter implements Reporter, Closeable { - final ObjectName objectName = createName("counters", name); - unregisterMBean(objectName); - } catch (InstanceNotFoundException e) { -- LOGGER.debug("Unable to unregister counter", e); -+ LOG.debug("Unable to unregister counter", e); - } catch (MBeanRegistrationException e) { -- LOGGER.warn("Unable to unregister counter", e); -+ LOG.warn("Unable to unregister counter", e); - } - } - -@@ -622,9 +623,9 @@ public class JmxReporter implements Reporter, Closeable { - registerMBean(new JmxHistogram(histogram, objectName), objectName); - } - } catch (InstanceAlreadyExistsException e) { -- LOGGER.debug("Unable to register histogram", e); -+ LOG.debug("Unable to register histogram", e); - } catch (JMException e) { -- LOGGER.warn("Unable to register histogram", e); -+ LOG.warn("Unable to register histogram", e); - } - } - -@@ -634,9 +635,9 @@ public class JmxReporter implements Reporter, Closeable { - final ObjectName objectName = createName("histograms", name); - unregisterMBean(objectName); - } catch (InstanceNotFoundException e) { -- LOGGER.debug("Unable to unregister histogram", e); -+ LOG.debug("Unable to unregister histogram", e); - } catch (MBeanRegistrationException e) { -- LOGGER.warn("Unable to unregister histogram", e); -+ LOG.warn("Unable to unregister histogram", e); - } - } - -@@ -649,9 +650,9 @@ public class JmxReporter implements Reporter, Closeable { - new JmxMeter(meter, objectName, timeUnits.rateFor(name.getKey())), objectName); - } - } catch (InstanceAlreadyExistsException e) { -- LOGGER.debug("Unable to register meter", e); -+ LOG.debug("Unable to register meter", e); - } catch (JMException e) { -- LOGGER.warn("Unable to register meter", e); -+ LOG.warn("Unable to register meter", e); - } - } - -@@ -661,9 +662,9 @@ public class JmxReporter implements Reporter, Closeable { - final ObjectName objectName = createName("meters", name); - unregisterMBean(objectName); - } catch (InstanceNotFoundException e) { -- LOGGER.debug("Unable to unregister meter", e); -+ LOG.debug("Unable to unregister meter", e); - } catch (MBeanRegistrationException e) { -- LOGGER.warn("Unable to unregister meter", e); -+ LOG.warn("Unable to unregister meter", e); - } - } - -@@ -681,9 +682,9 @@ public class JmxReporter implements Reporter, Closeable { - objectName); - } - } catch (InstanceAlreadyExistsException e) { -- LOGGER.debug("Unable to register timer", e); -+ LOG.debug("Unable to register timer", e); - } catch (JMException e) { -- LOGGER.warn("Unable to register timer", e); -+ LOG.warn("Unable to register timer", e); - } - } - -@@ -693,9 +694,9 @@ public class JmxReporter implements Reporter, Closeable { - final ObjectName objectName = createName("timers", name); - unregisterMBean(objectName); - } catch (InstanceNotFoundException e) { -- LOGGER.debug("Unable to unregister timer", e); -+ LOG.debug("Unable to unregister timer", e); - } catch (MBeanRegistrationException e) { -- LOGGER.warn("Unable to unregister timer", e); -+ LOG.warn("Unable to unregister timer", e); - } - } - -@@ -708,9 +709,9 @@ public class JmxReporter implements Reporter, Closeable { - try { - unregisterMBean(name); - } catch (InstanceNotFoundException e) { -- LOGGER.debug("Unable to unregister metric", e); -+ LOG.debug("Unable to unregister metric", e); - } catch (MBeanRegistrationException e) { -- LOGGER.warn("Unable to unregister metric", e); -+ LOG.warn("Unable to unregister metric", e); - } - } - registered.clear(); --- a/metrics-jmx/src/test/java/io/dropwizard/metrics5/jmx/DefaultObjectNameFactoryTest.java +++ b/metrics-jmx/src/test/java/io/dropwizard/metrics5/jmx/DefaultObjectNameFactoryTest.java @@ -7,7 +7,7 @@ import io.dropwizard.metrics5.MetricName; @@ -9002,21 +8733,7 @@ import java.util.HashMap; import java.util.Map; import javax.management.JMException; -@@ -19,7 +20,7 @@ import org.slf4j.LoggerFactory; - *

These JMX objects are only available on Java 7 and above. - */ - public class BufferPoolMetricSet implements MetricSet { -- private static final Logger LOGGER = LoggerFactory.getLogger(BufferPoolMetricSet.class); -+ private static final Logger LOG = LoggerFactory.getLogger(BufferPoolMetricSet.class); - private static final String[] ATTRIBUTES = {"Count", "MemoryUsed", "TotalCapacity"}; - private static final String[] NAMES = {"count", "used", "capacity"}; - private static final String[] POOLS = {"direct", "mapped"}; -@@ -43,10 +44,10 @@ public class BufferPoolMetricSet implements MetricSet { - gauges.put( - MetricRegistry.name(pool, name), new JmxAttributeGauge(mBeanServer, on, attribute)); - } catch (JMException ignored) { -- LOGGER.debug("Unable to load buffer pool MBeans, possibly running on Java 6"); -+ LOG.debug("Unable to load buffer pool MBeans, possibly running on Java 6"); +@@ -47,6 +48,6 @@ public class BufferPoolMetricSet implements MetricSet { } } } diff --git a/integration-tests/metrics-expected-warnings.txt b/integration-tests/metrics-expected-warnings.txt index 401c709f..61810502 100644 --- a/integration-tests/metrics-expected-warnings.txt +++ b/integration-tests/metrics-expected-warnings.txt @@ -9,9 +9,9 @@ metrics-collectd/src/main/java/io/dropwizard/metrics5/collectd/PacketWriter.java metrics-core/src/main/java/io/dropwizard/metrics5/CsvReporter.java:[390,35] [FormatStringConcatenation] Defer string concatenation to the invoked method metrics-core/src/main/java/io/dropwizard/metrics5/InstrumentedExecutorService.java:[244,25] [try] auto-closeable resource durationContext is never referenced in body of corresponding try statement metrics-core/src/main/java/io/dropwizard/metrics5/InstrumentedExecutorService.java:[266,25] [try] auto-closeable resource context is never referenced in body of corresponding try statement -metrics-graphite/src/main/java/io/dropwizard/metrics5/graphite/GraphiteReporter.java:[431,14] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) -metrics-graphite/src/main/java/io/dropwizard/metrics5/graphite/GraphiteReporter.java:[436,16] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) -metrics-graphite/src/main/java/io/dropwizard/metrics5/graphite/GraphiteReporter.java:[449,17] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) +metrics-graphite/src/main/java/io/dropwizard/metrics5/graphite/GraphiteReporter.java:[431,17] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) +metrics-graphite/src/main/java/io/dropwizard/metrics5/graphite/GraphiteReporter.java:[436,19] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) +metrics-graphite/src/main/java/io/dropwizard/metrics5/graphite/GraphiteReporter.java:[449,20] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) metrics-healthchecks/src/test/java/io/dropwizard/metrics5/health/HealthCheckTest.java:[189,46] [TimeZoneUsage] Derive the current time from an existing `Clock` Spring bean, and don't rely on a `Clock`'s time zone metrics-healthchecks/src/test/java/io/dropwizard/metrics5/health/HealthCheckTest.java:[203,46] [TimeZoneUsage] Derive the current time from an existing `Clock` Spring bean, and don't rely on a `Clock`'s time zone metrics-httpclient/src/test/java/io/dropwizard/metrics5/httpclient/HttpClientMetricNameStrategiesTest.java:[124,22] [deprecation] rewriteURI(URI,HttpHost,boolean) in URIUtils has been deprecated @@ -26,8 +26,8 @@ metrics-httpclient5/src/main/java/io/dropwizard/metrics5/httpclient5/Instrumente metrics-httpclient5/src/main/java/io/dropwizard/metrics5/httpclient5/InstrumentedHttpRequestExecutor.java:[49,4] [deprecation] HttpRequestExecutor(Timeout,ConnectionReuseStrategy,Http1StreamListener) in HttpRequestExecutor has been deprecated metrics-httpclient5/src/test/java/io/dropwizard/metrics5/httpclient5/InstrumentedHttpClientsTest.java:[46,10] [deprecation] execute(ClassicHttpRequest) in HttpClient has been deprecated metrics-httpclient5/src/test/java/io/dropwizard/metrics5/httpclient5/InstrumentedHttpClientsTest.java:[68,12] [deprecation] execute(ClassicHttpRequest) in HttpClient has been deprecated -metrics-influxdb/src/main/java/io/dropwizard/metrics5/influxdb/InfluxDbReporter.java:[282,14] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) -metrics-influxdb/src/main/java/io/dropwizard/metrics5/influxdb/InfluxDbReporter.java:[287,16] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) +metrics-influxdb/src/main/java/io/dropwizard/metrics5/influxdb/InfluxDbReporter.java:[282,17] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) +metrics-influxdb/src/main/java/io/dropwizard/metrics5/influxdb/InfluxDbReporter.java:[287,19] [Slf4jLogStatement] Log statement contains 0 placeholders, but specifies 1 matching argument(s) metrics-jakarta-servlets/src/test/java/io/dropwizard/metrics5/servlets/HealthCheckServletTest.java:[31,67] [TimeZoneUsage] Derive the current time from an existing `Clock` Spring bean, and don't rely on a `Clock`'s time zone metrics-jdbi3/src/test/java/io/dropwizard/metrics5/jdbi3/strategies/SmartNameStrategyTest.java:[18,10] [deprecation] InstrumentedTimingCollector in io.dropwizard.metrics5.jdbi3 has been deprecated metrics-jdbi3/src/test/java/io/dropwizard/metrics5/jdbi3/strategies/SmartNameStrategyTest.java:[24,20] [deprecation] InstrumentedTimingCollector in io.dropwizard.metrics5.jdbi3 has been deprecated diff --git a/integration-tests/metrics.sh b/integration-tests/metrics.sh index 812a4a12..229ed79e 100755 --- a/integration-tests/metrics.sh +++ b/integration-tests/metrics.sh @@ -8,11 +8,7 @@ repository='https://github.com/dropwizard/metrics.git' revision='v5.0.0-rc22' additional_build_flags='' additional_source_directories='' -# XXX: Minimize the diff by including -# `-XepOpt:Slf4jLoggerDeclaration:CanonicalStaticLoggerName=LOGGER` once such -# flags are supported in patch mode. See -# https://github.com/google/error-prone/pull/4699. -shared_error_prone_flags='-XepExcludedPaths:.*/target/generated-sources/.*' +shared_error_prone_flags='-XepExcludedPaths:.*/target/generated-sources/.* -XepOpt:Slf4jLoggerDeclaration:CanonicalStaticLoggerName=LOGGER' patch_error_prone_flags='' validation_error_prone_flags='' validation_build_flags='' diff --git a/pom.xml b/pom.xml index 761a4dfe..929d8371 100644 --- a/pom.xml +++ b/pom.xml @@ -204,22 +204,22 @@ that need to be referenced only once should *not* be listed here. --> 1.1.1 1.11.0 - 1.999.2-test-speed-up-refaster - ${version.error-prone-orig}-picnic-4 - 2.36.0 + ${version.error-prone-orig} + ${version.error-prone-orig}-picnic-1 + 2.37.0 0.1.28 1.0 17 1.37 3.9.9 - 5.15.2 + 5.16.1 1.0.1 - 0.12.3 - 1.1.4 - 1.22.1 + 0.12.4 + 2.1.0 + 1.24.1 3.2.3 @@ -273,7 +273,7 @@ com.fasterxml.jackson jackson-bom - 2.18.2 + 2.18.3 pom import @@ -372,14 +372,14 @@ io.micrometer micrometer-bom - 1.14.3 + 1.14.5 pom import io.projectreactor reactor-bom - 2024.0.2 + 2024.0.4 pom import @@ -396,7 +396,7 @@ io.swagger.core.v3 swagger-annotations - 2.2.28 + 2.2.29 jakarta.servlet @@ -431,7 +431,7 @@ net.bytebuddy byte-buddy - 1.17.0 + 1.17.2 @@ -1583,24 +1584,24 @@ - com.groupcdg + com.arcmutate + base + 1.3.2 + + + com.arcmutate + pitest-accelerator-junit5 + 1.2.0 + + + com.arcmutate pitest-git-plugin ${version.pitest-git} - - com.groupcdg.arcmutate - base - 1.2.2 - - - com.groupcdg.pitest - pitest-accelerator-junit5 - 1.0.6 - org.pitest pitest-junit5-plugin - 1.2.1 + 1.2.2 @@ -1975,9 +1976,7 @@ -XepOpt:NullAway:AssertsEnabled=true -XepOpt:NullAway:CheckOptionalEmptiness=true -XepOpt:Nullness:Conservative=false - -XepOpt:StatementSwitchToExpressionSwitch:EnableAssignmentSwitchConversion=true -XepOpt:StatementSwitchToExpressionSwitch:EnableDirectConversion=true - -XepOpt:StatementSwitchToExpressionSwitch:EnableReturnSwitchConversion=true ${error-prone.patch-args} ${error-prone.self-check-args} diff --git a/refaster-support/src/main/java/tech/picnic/errorprone/refaster/matchers/IsEmpty.java b/refaster-support/src/main/java/tech/picnic/errorprone/refaster/matchers/IsEmpty.java index d61cd180..dfd3e7f7 100644 --- a/refaster-support/src/main/java/tech/picnic/errorprone/refaster/matchers/IsEmpty.java +++ b/refaster-support/src/main/java/tech/picnic/errorprone/refaster/matchers/IsEmpty.java @@ -118,11 +118,12 @@ public final class IsEmpty implements Matcher { } private boolean isEmptyCollectionConstructor(ExpressionTree tree, VisitorState state) { - if (!(tree instanceof NewClassTree) || !MUTABLE_COLLECTION_TYPE.matches(tree, state)) { + if (!(tree instanceof NewClassTree newClassTree) + || !MUTABLE_COLLECTION_TYPE.matches(tree, state)) { return false; } - List arguments = ((NewClassTree) tree).getArguments(); + List arguments = newClassTree.getArguments(); if (arguments.stream().allMatch(a -> EMPTY_COLLECTION_CONSTRUCTOR_ARGUMENT.matches(a, state))) { /* * This is a default constructor, or a constructor that creates an empty collection using diff --git a/refaster-test-support/src/main/java/tech/picnic/errorprone/refaster/test/RefasterRuleCollection.java b/refaster-test-support/src/main/java/tech/picnic/errorprone/refaster/test/RefasterRuleCollection.java index 99673e20..183a3e50 100644 --- a/refaster-test-support/src/main/java/tech/picnic/errorprone/refaster/test/RefasterRuleCollection.java +++ b/refaster-test-support/src/main/java/tech/picnic/errorprone/refaster/test/RefasterRuleCollection.java @@ -6,6 +6,7 @@ import static com.google.common.collect.ImmutableSet.toImmutableSet; import static com.google.common.collect.ImmutableSortedSet.toImmutableSortedSet; import static com.google.errorprone.BugPattern.LinkType.NONE; import static com.google.errorprone.BugPattern.SeverityLevel.ERROR; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Comparator.naturalOrder; import static tech.picnic.errorprone.refaster.runner.Refaster.INCLUDED_RULES_PATTERN_FLAG; @@ -17,6 +18,7 @@ import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Iterables; import com.google.common.collect.Range; import com.google.common.collect.Sets; +import com.google.common.io.Resources; import com.google.errorprone.BugCheckerRefactoringTestHelper; import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode; import com.google.errorprone.BugPattern; @@ -38,6 +40,9 @@ import com.sun.source.util.TreeScanner; import com.sun.tools.javac.tree.EndPosTable; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.util.Position; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -124,13 +129,15 @@ public final class RefasterRuleCollection extends BugChecker implements Compilat */ public static void validate(Class clazz) { String className = clazz.getSimpleName(); + String inputResource = className + "TestInput.java"; + String outputResource = className + "TestOutput.java"; BugCheckerRefactoringTestHelper.newInstance(RefasterRuleCollection.class, clazz) .setArgs( "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", "-XepOpt:" + RULE_COLLECTION_FLAG + '=' + className) - .addInput(className + "TestInput.java") - .addOutput(className + "TestOutput.java") + .addInputLines(inputResource, loadResource(clazz, inputResource)) + .addOutputLines(outputResource, loadResource(clazz, outputResource)) .doTest(TestMode.TEXT_MATCH); } @@ -247,6 +254,15 @@ public final class RefasterRuleCollection extends BugChecker implements Compilat return value.substring(index + 1); } + private static String loadResource(Class contextClass, String resource) { + URL url = Resources.getResource(contextClass, resource); + try { + return Resources.toString(url, UTF_8); + } catch (IOException e) { + throw new UncheckedIOException("Cannot find resource: " + url, e); + } + } + private class UnexpectedMatchReporter extends TreeScanner<@Nullable Void, VisitorState> { private final ImmutableRangeMap indexedMatches;