Compare commits

...

204 Commits

Author SHA1 Message Date
Gijs de Jong
c8c354617d update submodules 2023-10-13 16:26:57 +02:00
Gijs de Jong
0a0c09c447 Clean up action 2023-10-13 16:20:43 +02:00
Gijs de Jong
2cd6b2dc15 Add on-demand integration test workflow 2023-10-13 16:08:55 +02:00
Gijs de Jong
8846614513 Improve integration scripts 2023-10-13 16:00:53 +02:00
Gijs de Jong
9af80ce1ae Skip StaticImport Lexigraphical sort 2023-10-13 16:00:53 +02:00
Gijs de Jong
df89f6d83b Add calcite integration test 2023-10-13 16:00:53 +02:00
Gijs de Jong
0bcd6f081f Finalise processing module 2023-10-13 16:00:52 +02:00
Gijs de Jong
bcd33f42e5 druid progress 2023-10-13 16:00:52 +02:00
Gijs de Jong
f3a6f35fd4 Initial druid integration test 2023-10-13 16:00:52 +02:00
Gijs de Jong
d9a687de4a Finalize dropwizard/metrics integration test 2023-10-13 16:00:52 +02:00
Gijs de Jong
87bc9492b1 Add metrics as integration test 2023-10-13 16:00:52 +02:00
Gijs de Jong
397a299db6 Finalise guava integration test! 2023-10-13 16:00:52 +02:00
Gijs de Jong
1a077529c7 update init patch 2023-10-13 16:00:52 +02:00
Gijs de Jong
07d7c8aad2 Update init.patch 2023-10-13 16:00:51 +02:00
Gijs de Jong
7ffceb5e41 Add suppressions for Preconditions rule 2023-10-13 16:00:51 +02:00
Gijs de Jong
9af5031ea2 update guava patches 2023-10-13 16:00:51 +02:00
Gijs de Jong
c445f0cce9 update guava init patch 2023-10-13 16:00:51 +02:00
Gijs de Jong
42acd1a192 add guava 2023-10-13 16:00:51 +02:00
Gijs de Jong
b91ae01c26 Add expected warnings file 2023-10-13 16:00:51 +02:00
Gijs de Jong
d3e5b20a05 Update checkstyle integration test 2023-10-13 16:00:51 +02:00
Gijs de Jong
65a13c84b4 Update checkstyle to 10.9.3 2023-10-13 16:00:50 +02:00
Stephan Schroevers
696999505f WIP: Introduce Checkstyle integration test 2023-10-13 16:00:50 +02:00
Vincent Koeman
4e2ceeb252 Introduce StreamOf{1,2,3,4,5} Refaster rules (#814) 2023-10-11 17:52:52 +02:00
Picnic-Bot
05809b1c85 Upgrade Byte Buddy 1.14.8 -> 1.14.9 (#827)
See:
- https://github.com/raphw/byte-buddy/releases/tag/byte-buddy-1.14.9
- https://github.com/raphw/byte-buddy/compare/byte-buddy-1.14.8...byte-buddy-1.14.9
2023-10-11 09:14:28 +02:00
Stephan Schroevers
75679396df Introduce PatternRules Refaster rule collection (#771)
While there, configure `StaticImport` to not require static importing of
`com.google.common.base.Predicates.contains`.

The new rules triggered cleanup of some `CompilationTestHelper` usages.

See google/guava#6483.
2023-10-11 08:36:26 +02:00
Picnic-Bot
f1882caf88 Upgrade pitest-maven-plugin 1.15.0 -> 1.15.1 (#830)
See:
- https://github.com/hcoles/pitest/releases/tag/1.15.1
- https://github.com/hcoles/pitest/compare/1.15.0...1.15.1
2023-10-11 08:18:44 +02:00
Picnic-Bot
605d045760 Upgrade ossf/scorecard-action v2.2.0 -> v2.3.0 (#821)
See:
- https://github.com/ossf/scorecard-action/releases/tag/v2.3.0
2023-10-10 09:22:48 +02:00
Rick Ossendrijver
b492a4afd3 Fix and enable ClassRules Refaster rule collection tests (#826) 2023-10-10 08:37:43 +02:00
Phil Werli
583e51c9b0 Introduce {Mono,Flux}OfType Refaster rules (#810) 2023-10-09 11:57:36 +02:00
Vincent Koeman
9ada0783dd Introduce Flux{Empty,Just} Refaster rules (#815) 2023-10-09 11:30:50 +02:00
Picnic-Bot
7ed3e63d2e Upgrade CodeQL v2.21.9 -> v2.22.0 (#824)
See:
- https://github.com/github/codeql-action/blob/main/CHANGELOG.md
- https://github.com/github/codeql-action/compare/v2.21.9...v2.22.0
2023-10-09 11:20:56 +02:00
Picnic-Bot
465f83b855 Upgrade Arcmutate 1.2.0 -> 1.2.1 (#818) 2023-10-09 10:42:34 +02:00
Picnic-Bot
24f8b2f499 Upgrade Google Java Format 1.18.0 -> 1.18.1 (#819)
See:
- https://github.com/google/google-java-format/releases/tag/v1.18.1
- https://github.com/google/google-java-format/compare/v1.18.0...v1.18.1
2023-10-09 10:33:52 +02:00
Picnic-Bot
f466c75bf3 Upgrade ruby/setup-ruby v1.152.0 -> v1.155.0 (#825)
See:
- https://github.com/ruby/setup-ruby/releases/tag/v1.155.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.154.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.153.0
2023-10-09 09:31:53 +02:00
Stephan Schroevers
c48db5202c Introduce additional Mockito Refaster rules (#777) 2023-10-09 09:23:47 +02:00
Picnic-Bot
629cb577ea Upgrade Immutables Annotations 2.9.3 -> 2.10.0 (#823)
See:
- https://github.com/immutables/immutables/releases/tag/2.10.0
- https://github.com/immutables/immutables/compare/2.9.3...2.10.0
2023-10-09 09:06:03 +02:00
Picnic-Bot
b13d445e56 Upgrade Mockito 5.5.0 -> 5.6.0 (#820)
See:
- https://github.com/mockito/mockito/releases/tag/v5.6.0
- https://github.com/mockito/mockito/compare/v5.5.0...v5.6.0
2023-10-09 08:05:29 +02:00
Stephan Schroevers
b1683a31e9 Introduce ClassRules Refaster rule collection (#811) 2023-10-09 07:42:02 +02:00
Vincent Koeman
ffe4db2cf8 Extend StepVerifierLastStepVerifyErrorClass Refaster rule (#813) 2023-10-08 16:22:36 +02:00
Stephan Schroevers
da5eea8329 Introduce assorted Reactor Refaster rules (#763) 2023-10-06 21:45:22 +02:00
Stephan Schroevers
5596b584ac [maven-release-plugin] prepare for next development iteration 2023-10-04 16:40:37 +02:00
Stephan Schroevers
4800522a09 [maven-release-plugin] prepare release v0.14.0 2023-10-04 16:40:37 +02:00
Stephan Schroevers
9a77a3f35f Drop ScheduledTransactionTrace check (#788)
As well as any other references to New Relic.
2023-10-04 15:30:13 +02:00
Picnic-Bot
ef75b80e7b Upgrade Error Prone 2.21.1 -> 2.22.0 (#800)
See:
- https://github.com/google/error-prone/releases/tag/v2.22.0
- https://github.com/google/error-prone/compare/v2.21.1...v2.22.0
- https://github.com/PicnicSupermarket/error-prone/compare/v2.21.1-picnic-1...v2.22.0-picnic-1
2023-10-04 14:43:27 +02:00
Picnic-Bot
7c618f7e2d Upgrade sonar-maven-plugin 3.9.1.2184 -> 3.10.0.2594 (#792)
See:
- https://github.com/SonarSource/sonar-scanner-maven/releases/tag/3.10.0.2594
- https://github.com/SonarSource/sonar-scanner-maven/compare/3.9.1.2184...3.10.0.2594
2023-10-04 13:44:51 +02:00
Stephan Schroevers
c03ead9e5d Upgrade JDKs used by GitHub Actions builds (#780)
Summary of changes:
- Use JDK 11.0.20 instead of 11.0.19.
- Use JDK 17.0.8 instead of 17.0.7.
- Use JDK 20.0.2 instead of 20.0.1.

See:
- https://www.oracle.com/java/technologies/javase/11-0-20-relnotes.html
- https://www.oracle.com/java/technologies/javase/17-0-8-relnotes.html
- https://www.oracle.com/java/technologies/javase/20-0-2-relnotes.html
2023-10-04 11:22:16 +02:00
Picnic-Bot
8fd87a5b6b Upgrade SLF4J 2.0.7 -> 2.0.9 (#778)
See:
- https://www.slf4j.org/news.html
- https://github.com/qos-ch/slf4j/compare/v_2.0.7...v_2.0.9
2023-10-04 10:59:37 +02:00
Picnic-Bot
82025a729f Upgrade fmt-maven-plugin 2.20 -> 2.21.1 (#804)
See:
- https://github.com/spotify/fmt-maven-plugin/releases/tag/2.21
- https://github.com/spotify/fmt-maven-plugin/releases/tag/2.21.1
- https://github.com/spotify/fmt-maven-plugin/compare/fmt-maven-plugin-2.20...2.21.1
2023-10-04 10:29:27 +02:00
Picnic-Bot
7d912d1b04 Upgrade Swagger 2.2.15 -> 2.2.16 (#795)
See:
- https://github.com/swagger-api/swagger-core/releases/tag/v2.2.16
- https://github.com/swagger-api/swagger-core/compare/v2.2.15...v2.2.16
2023-10-04 08:45:30 +02:00
Picnic-Bot
a726514e98 Upgrade AspectJ 1.9.20 -> 1.9.20.1 (#781)
See:
- https://github.com/eclipse-aspectj/aspectj/releases/tag/V1_9_20_1
- https://github.com/eclipse/org.aspectj/compare/V1_9_20...V1_9_20_1
2023-10-04 08:36:58 +02:00
Picnic-Bot
aa7de5777c Upgrade Spring 5.3.29 -> 5.3.30 (#791)
See:
- https://github.com/spring-projects/spring-framework/releases/tag/v5.3.30
- https://github.com/spring-projects/spring-framework/compare/v5.3.29...v5.3.30
2023-10-04 08:25:50 +02:00
Picnic-Bot
6e6efb3c13 Upgrade Project Reactor 2022.0.10 -> 2022.0.11 (#789)
See:
- https://github.com/reactor/reactor/releases/tag/2022.0.11
- https://github.com/reactor/reactor/compare/2022.0.10...2022.0.11
2023-10-03 16:54:15 +02:00
Picnic-Bot
03fd050eae Upgrade AutoValue 1.10.3 -> 1.10.4 (#784)
See:
- https://github.com/google/auto/releases/tag/auto-value-1.10.4
- https://github.com/google/auto/compare/auto-value-1.10.3...auto-value-1.10.4
2023-10-03 16:42:00 +02:00
Picnic-Bot
d1467e0424 Upgrade actions/upload-artifact v3.1.2 -> v3.1.3 (#782)
See:
- https://github.com/actions/upload-artifact/releases/tag/v3.1.3
2023-10-03 16:08:59 +02:00
Picnic-Bot
a2e32ed147 Upgrade maven-enforcer-plugin 3.4.0 -> 3.4.1 (#787)
See:
- https://github.com/apache/maven-enforcer/releases/tag/enforcer-3.4.1
- https://github.com/apache/maven-enforcer/compare/enforcer-3.4.0...enforcer-3.4.1
2023-10-03 15:58:07 +02:00
Picnic-Bot
258708e6a8 Upgrade New Relic Java Agent 8.5.0 -> 8.6.0 (#785)
See:
- https://github.com/newrelic/newrelic-java-agent/releases/tag/v8.6.0
- https://github.com/newrelic/newrelic-java-agent/compare/v8.5.0...v8.6.0
2023-10-03 13:23:08 +02:00
Picnic-Bot
67106a9725 Upgrade actions/setup-java v3.12.0 -> v3.13.0 (#798)
See:
- https://github.com/actions/setup-java/releases/tag/v3.13.0
2023-10-03 13:14:33 +02:00
Picnic-Bot
f979576ab5 Upgrade maven-javadoc-plugin 3.5.0 -> 3.6.0 (#793)
See:
- https://github.com/apache/maven-javadoc-plugin/releases/tag/maven-javadoc-plugin-3.6.0
- https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.5.0...maven-javadoc-plugin-3.6.0
2023-10-03 12:53:51 +02:00
Picnic-Bot
aa3fd03569 Upgrade dawidd6/action-download-artifact v2.27.0 -> v2.28.0 (#796)
See:
- https://github.com/dawidd6/action-download-artifact/compare/v2.27.0...v2.28.0
2023-10-03 11:59:38 +02:00
Picnic-Bot
5602251667 Upgrade actions/checkout v3.6.0 -> v4.1.0 (#779)
See:
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v410
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v400
2023-10-03 11:51:20 +02:00
Picnic-Bot
05cb6387b9 Upgrade Checkstyle 10.12.3 -> 10.12.4 (#807)
See:
- https://checkstyle.sourceforge.io/releasenotes.html
- https://github.com/checkstyle/checkstyle/releases/tag/checkstyle-10.12.4
- https://github.com/checkstyle/checkstyle/compare/checkstyle-10.12.3...checkstyle-10.12.4
2023-10-03 11:38:31 +02:00
Picnic-Bot
4e242a5b11 Upgrade Byte Buddy 1.14.7 -> 1.14.8 (#790)
See:
- https://github.com/raphw/byte-buddy/releases/tag/byte-buddy-1.14.8
- https://github.com/raphw/byte-buddy/compare/byte-buddy-1.14.7...byte-buddy-1.14.8
2023-10-03 10:31:08 +02:00
Picnic-Bot
87297c9a1d Upgrade versions-maven-plugin 2.16.0 -> 2.16.1 (#797)
See:
- https://github.com/mojohaus/versions/releases/tag/2.16.1
- https://github.com/mojohaus/versions-maven-plugin/compare/2.16.0...2.16.1
2023-10-03 10:17:14 +02:00
Picnic-Bot
15ff85c4ea Upgrade Checker Framework Annotations 3.38.0 -> 3.39.0 (#808)
See:
- https://github.com/typetools/checker-framework/releases/tag/checker-framework-3.39.0
- https://github.com/typetools/checker-framework/compare/checker-framework-3.38.0...checker-framework-3.39.0
2023-10-03 10:00:24 +02:00
Picnic-Bot
2c8469fa93 Upgrade Google Java Format 1.17.0 -> 1.18.0 (#809)
See:
- https://github.com/google/google-java-format/releases/tag/v1.18.0
- https://github.com/google/google-java-format/compare/v1.17.0...v1.18.0
2023-10-03 09:28:21 +02:00
Picnic-Bot
f4e0fd2cc3 Upgrade Modernizer Maven Plugin 2.6.0 -> 2.7.0 (#801)
See:
- https://github.com/gaul/modernizer-maven-plugin/releases/tag/modernizer-maven-plugin-2.7.0
- https://github.com/gaul/modernizer-maven-plugin/compare/modernizer-maven-plugin-2.6.0...modernizer-maven-plugin-2.7.0
2023-10-03 08:55:08 +02:00
Picnic-Bot
34fd692064 Upgrade pitest-maven-plugin 1.14.4 -> 1.15.0 (#803)
See:
- https://github.com/hcoles/pitest/releases/tag/1.15.0
- https://github.com/hcoles/pitest/compare/1.14.4...1.15.0
2023-10-03 08:07:16 +02:00
Stephan Schroevers
26bc7e6e8e Disallow autovalue.shaded.* imports (#774) 2023-10-02 18:00:57 +02:00
Picnic-Bot
56cb86a7e1 Upgrade Checker Framework Annotations 3.37.0 -> 3.38.0 (#773)
See:
- https://github.com/typetools/checker-framework/releases/tag/checker-framework-3.38.0
- https://github.com/typetools/checker-framework/compare/checker-framework-3.37.0...checker-framework-3.38.0
2023-10-02 17:43:17 +02:00
Picnic-Bot
19cd802ec5 Upgrade NullAway 0.10.12 -> 0.10.14 (#776)
See:
- https://github.com/uber/NullAway/blob/master/CHANGELOG.md
- https://github.com/uber/NullAway/releases/tag/v0.10.13
- https://github.com/uber/NullAway/releases/tag/v0.10.14
- https://github.com/uber/NullAway/compare/v0.10.12...v0.10.14
2023-10-02 16:29:33 +02:00
Picnic-Bot
1fabb26ed2 Upgrade Spring Boot 2.7.15 -> 2.7.16 (#799)
See:
- https://github.com/spring-projects/spring-boot/releases/tag/v2.7.16
- https://github.com/spring-projects/spring-boot/compare/v2.7.15...v2.7.16
2023-10-02 16:17:58 +02:00
Picnic-Bot
c1ced1e962 Upgrade CodeQL v2.21.4 -> v2.21.9 (#786)
See:
- https://github.com/github/codeql-action/blob/main/CHANGELOG.md
- https://github.com/github/codeql-action/compare/v2.21.4...v2.21.9
2023-10-02 09:57:34 +02:00
Picnic-Bot
030ed25be8 Upgrade Forbidden APIs plugin 3.5.1 -> 3.6 (#806)
See:
- https://github.com/policeman-tools/forbidden-apis/wiki/Changes
- https://github.com/policeman-tools/forbidden-apis/compare/3.5.1...3.6
2023-10-02 09:20:01 +02:00
Picnic-Bot
ee0c04a44e Upgrade Arcmutate 1.1.3 -> 1.2.0 (#805) 2023-10-02 07:10:41 +02:00
Stephan Schroevers
87f79dae60 Introduce additional equality Refaster rules (#765) 2023-09-01 15:17:33 +02:00
Stephan Schroevers
1f4a68416f Introduce assorted Optional Refaster rules (#764)
While there, move the `OptionalOrElseGet` Refaster rule test code to the
correct location.
2023-09-01 11:42:13 +02:00
Picnic-Bot
c98fe9273d Upgrade Pitest Git plugins 1.1.1 -> 1.1.2 (#772) 2023-09-01 09:11:09 +02:00
Stephan Schroevers
8b5d1803e4 Introduce CollectionContains Refaster rule (#766) 2023-08-31 15:46:43 +02:00
Stephan Schroevers
507a19d10e Introduce FileRules Refaster rule collection (#767) 2023-08-31 08:58:11 +02:00
Picnic-Bot
43fcbb770d Upgrade Checkstyle 10.12.2 -> 10.12.3 (#769)
See:
- https://checkstyle.sourceforge.io/releasenotes.html
- https://github.com/checkstyle/checkstyle/releases/tag/checkstyle-10.12.3
- https://github.com/checkstyle/checkstyle/compare/checkstyle-10.12.2...checkstyle-10.12.3
2023-08-30 10:13:01 +02:00
Stephan Schroevers
7779631320 Introduce StreamIterate Refaster rule (#762) 2023-08-29 09:08:43 +02:00
Stephan Schroevers
48e2f57cb6 [maven-release-plugin] prepare for next development iteration 2023-08-28 19:22:11 +03:00
Stephan Schroevers
352829c61f [maven-release-plugin] prepare release v0.13.0 2023-08-28 19:22:11 +03:00
Picnic-Bot
37d95605b0 Upgrade Byte Buddy 1.14.6 -> 1.14.7 (#768)
See:
- https://github.com/raphw/byte-buddy/releases/tag/byte-buddy-1.14.7
- https://github.com/raphw/byte-buddy/compare/byte-buddy-1.14.6...byte-buddy-1.14.7
2023-08-28 10:06:30 +02:00
Stephan Schroevers
6131599d9d Introduce mutation test script for changed code (#757)
While there, optimize the existing `run-mutation-tests.sh` script.
2023-08-28 09:43:06 +02:00
Picnic-Bot
9c158f11d4 Upgrade maven-enforcer-plugin 3.3.0 -> 3.4.0 (#759)
See:
- https://github.com/apache/maven-enforcer/releases/tag/enforcer-3.4.0
- https://github.com/apache/maven-enforcer/compare/enforcer-3.3.0...enforcer-3.4.0
2023-08-25 22:23:19 +02:00
Picnic-Bot
be818486bd Upgrade Mockito 5.4.0 -> 5.5.0 (#758)
See:
- https://github.com/mockito/mockito/releases/tag/v5.5.0
- https://github.com/mockito/mockito/compare/v5.4.0...v5.5.0
2023-08-25 22:05:51 +02:00
Picnic-Bot
1e80097bee Upgrade Spring Boot 2.7.14 -> 2.7.15 (#760)
See:
- https://github.com/spring-projects/spring-boot/releases/tag/v2.7.15
- https://github.com/spring-projects/spring-boot/compare/v2.7.14...v2.7.15
2023-08-25 21:14:26 +02:00
Picnic-Bot
431c3e67ac Upgrade actions/checkout v3.5.3 -> v3.6.0 (#761)
See:
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v360
2023-08-25 09:34:35 +02:00
Picnic-Bot
e612631cb8 Upgrade AspectJ 1.9.19 -> 1.9.20 (#755)
See:
- https://github.com/eclipse-aspectj/aspectj/releases/tag/V1_9_20
- https://github.com/eclipse/org.aspectj/compare/V1_9_19...V1_9_20
2023-08-17 21:34:51 +02:00
Picnic-Bot
a6bce960cb Upgrade AutoValue 1.10.2 -> 1.10.3 (#752)
See:
- https://github.com/google/auto/releases/tag/auto-value-1.10.3
- https://github.com/google/auto/compare/auto-value-1.10.2...auto-value-1.10.3
2023-08-17 17:12:33 +02:00
Picnic-Bot
e19c2de99d Upgrade pitest-maven-plugin 1.14.3 -> 1.14.4 (#756)
See:
- https://github.com/hcoles/pitest/releases/tag/1.14.4
- https://github.com/hcoles/pitest/compare/1.14.3...1.14.4
2023-08-17 10:36:59 +02:00
Picnic-Bot
7b193f2fd5 Upgrade Byte Buddy 1.14.5 -> 1.14.6 (#753)
See:
- https://github.com/raphw/byte-buddy/releases/tag/byte-buddy-1.14.6
- https://github.com/raphw/byte-buddy/compare/byte-buddy-1.14.5...byte-buddy-1.14.6
2023-08-16 09:24:45 +02:00
Picnic-Bot
852442b55b Upgrade Project Reactor 2022.0.9 -> 2022.0.10 (#754)
See:
- https://github.com/reactor/reactor/releases/tag/2022.0.10
- https://github.com/reactor/reactor/compare/2022.0.9...2022.0.10
2023-08-16 09:02:16 +02:00
Rick Ossendrijver
d758fab524 Have Renovate file GitHub CodeQL upgrade PRs once every four weeks (#745)
While there, match on the `depName` of `ruby/setup-ruby`.
2023-08-15 14:08:52 +02:00
Picnic-Bot
88ed3ea9a9 Upgrade CodeQL v2.21.3 -> v2.21.4 (#751)
See:
- https://github.com/github/codeql-action/blob/main/CHANGELOG.md
- https://github.com/github/codeql-action/compare/v2.21.3...v2.21.4
2023-08-15 11:58:32 +02:00
Giovanni Zotta
7fb0e551d4 Introduce VerifyOnlyElementInFlux Refaster rule (#617) 2023-08-14 14:05:14 +02:00
Mohamed Sameh
4af7b21bf5 Introduce NestedPublishers check (#642)
And introduce a few utility methods that simplify `Tree`- and `Type`-based
matching, allowing the existing (and similar) `NestedOptionals` check to be
simplified as well.
2023-08-14 10:30:45 +02:00
Picnic-Bot
fc5f3bd4cc Upgrade Pitest Git plugins 1.1.0 -> 1.1.1 (#750) 2023-08-14 08:52:14 +02:00
Mohamed Sameh
35a5944b81 Introduce {Flux,{Double,Int,Long,}Stream}TakeWhile Refaster rules (#727) 2023-08-12 15:36:43 +02:00
Picnic-Bot
17cc8e0c31 Upgrade CodeQL v2.21.2 -> v2.21.3 (#746)
See:
- https://github.com/github/codeql-action/blob/main/CHANGELOG.md
- https://github.com/github/codeql-action/compare/v2.21.2...v2.21.3
2023-08-12 14:39:33 +02:00
Picnic-Bot
b5ba4fa208 Upgrade actions/deploy-pages v2.0.3 -> v2.0.4 (#747)
See:
- https://github.com/actions/deploy-pages/releases/tag/v2.0.4
2023-08-12 14:28:35 +02:00
Picnic-Bot
26b941bbc5 Upgrade Guava 32.1.1-jre -> 32.1.2-jre (#735)
See:
- https://github.com/google/guava/releases/tag/v32.1.2
- https://github.com/google/guava/compare/v32.1.1...v32.1.2
2023-08-12 14:18:05 +02:00
Picnic-Bot
eb3b540537 Upgrade pitest-maven-plugin 1.14.2 -> 1.14.3 (#748)
See:
- https://github.com/hcoles/pitest/releases/tag/1.14.3
- https://github.com/hcoles/pitest/compare/1.14.2...1.14.3
2023-08-12 14:05:50 +02:00
Picnic-Bot
6a11b59517 Upgrade CodeQL v2.20.3 -> v2.21.2 (#722)
See:
- https://github.com/github/codeql-action/blob/main/CHANGELOG.md
- https://github.com/github/codeql-action/compare/v2.20.3...v2.21.2
2023-08-07 11:47:08 +02:00
Picnic-Bot
62abd51f4d Upgrade errorprone-slf4j 0.1.18 -> 0.1.20 (#741)
See:
- https://github.com/KengoTODA/errorprone-slf4j/releases/tag/v0.1.19
- https://github.com/KengoTODA/errorprone-slf4j/releases/tag/v0.1.20
- https://github.com/KengoTODA/errorprone-slf4j/compare/v0.1.18...v0.1.20
2023-08-07 07:24:39 +02:00
Rick Ossendrijver
67a128a9b6 Fix typos in CanonicalSyntaxAnnotation source (#738) 2023-08-06 16:18:29 +02:00
Picnic-Bot
526227e8ed Upgrade Error Prone 2.21.0 -> 2.21.1 (#743)
See:
- https://github.com/google/error-prone/releases/tag/v2.21.1
- https://github.com/google/error-prone/compare/v2.21.0...v2.21.1
- https://github.com/PicnicSupermarket/error-prone/compare/v2.21.0-picnic-1...v2.21.1-picnic-1
2023-08-06 16:06:25 +02:00
Picnic-Bot
c2e837819e Upgrade Pitest Git plugins 1.0.12 -> 1.1.0 (#742) 2023-08-06 11:15:07 +02:00
Picnic-Bot
fd70be081e Upgrade Arcmutate 1.1.2 -> 1.1.3 (#739) 2023-08-05 20:13:27 +02:00
Picnic-Bot
2c47244571 Upgrade NullAway 0.10.11 -> 0.10.12 (#740)
See:
- https://github.com/uber/NullAway/blob/master/CHANGELOG.md
- https://github.com/uber/NullAway/releases/tag/v0.10.12
- https://github.com/uber/NullAway/compare/v0.10.11...v0.10.12
2023-08-05 13:27:26 +02:00
Picnic-Bot
8375f1650f Upgrade Error Prone 2.20.0 -> 2.21.0 (#737)
See:
- https://github.com/google/error-prone/releases/tag/v2.21.0
- https://github.com/google/error-prone/compare/v2.20.0...v2.21.0
- https://github.com/PicnicSupermarket/error-prone/compare/v2.20.0-picnic-1...v2.21.0-picnic-1
2023-08-03 11:06:33 +02:00
Picnic-Bot
c4daa04ce1 Upgrade Checker Framework Annotations 3.36.0 -> 3.37.0 (#736)
See:
- https://github.com/typetools/checker-framework/releases/tag/checker-framework-3.37.0
- https://github.com/typetools/checker-framework/compare/checker-framework-3.36.0...checker-framework-3.37.0
2023-08-03 10:36:41 +02:00
Picnic-Bot
08f0e52104 Upgrade sortpom-maven-plugin 3.2.1 -> 3.3.0 (#731)
See:
- https://github.com/Ekryd/sortpom/wiki/Versions
- https://github.com/Ekryd/sortpom/releases/tag/sortpom-parent-3.3.0
- https://github.com/Ekryd/sortpom/compare/sortpom-parent-3.2.1...sortpom-parent-3.3.0
2023-08-02 14:39:18 +02:00
Picnic-Bot
10070bd4c8 Upgrade JUnit 5 5.9.3 -> 5.10.0 (#729)
See:
- https://junit.org/junit5/docs/current/release-notes/
- https://github.com/junit-team/junit5/releases/tag/r5.10.0-M1
- https://github.com/junit-team/junit5/releases/tag/r5.10.0-RC1
- https://github.com/junit-team/junit5/releases/tag/r5.10.0-RC2
- https://github.com/junit-team/junit5/releases/tag/r5.10.0
- https://github.com/junit-team/junit5/compare/r5.9.3...r5.10.0
2023-08-01 15:54:26 +02:00
Picnic-Bot
3c38fd3495 Upgrade actions/setup-java v3.11.0 -> v3.12.0 (#730)
See https://github.com/actions/setup-java/releases/tag/v3.12.0
2023-08-01 09:54:17 +02:00
Picnic-Bot
d54ec83844 Upgrade New Relic Java Agent 8.4.0 -> 8.5.0 (#732)
See:
- https://github.com/newrelic/newrelic-java-agent/releases/tag/v8.5.0
- https://github.com/newrelic/newrelic-java-agent/compare/v8.4.0...v8.5.0
2023-08-01 08:12:06 +02:00
Philip Leonard
e03d0de366 Introduce MongoDBTextFilterUsage check (#649) 2023-07-31 17:19:39 +02:00
Picnic-Bot
b40c5d61b9 Upgrade Checkstyle 10.12.1 -> 10.12.2 (#734)
See:
- https://checkstyle.sourceforge.io/releasenotes.html
- https://github.com/checkstyle/checkstyle/releases/tag/checkstyle-10.12.2
- https://github.com/checkstyle/checkstyle/compare/checkstyle-10.12.1...checkstyle-10.12.2
2023-07-31 12:54:47 +02:00
Picnic-Bot
6d27e46baf Upgrade Spring 5.3.28 -> 5.3.29 (#723)
See:
- https://github.com/spring-projects/spring-framework/releases/tag/v5.3.29
- https://github.com/spring-projects/spring-framework/compare/v5.3.28...v5.3.29
2023-07-24 08:15:30 +02:00
Picnic-Bot
8f48497322 Upgrade Spring Boot 2.7.13 -> 2.7.14 (#726)
See:
- https://github.com/spring-projects/spring-boot/releases/tag/v2.7.14
- https://github.com/spring-projects/spring-boot/compare/v2.7.13...v2.7.14
2023-07-23 12:41:36 +02:00
Stephan Schroevers
38554be3d1 Upgrade Error Prone fork v2.20.0-picnic-1 -> v2.20.0-picnic-2 (#725)
This new release is a workaround for jitpack/jitpack.io#5741.

See https://github.com/PicnicSupermarket/error-prone/compare/v2.20.0-picnic-1...v2.20.0-picnic-2
2023-07-19 09:16:40 +02:00
Picnic-Bot
28cdb91913 Upgrade Project Reactor 2022.0.8 -> 2022.0.9 (#721)
See:
- https://github.com/reactor/reactor/releases/tag/2022.0.9
- https://github.com/reactor/reactor/compare/2022.0.8...2022.0.9
2023-07-13 11:19:52 +02:00
Picnic-Bot
bd6693d23e Upgrade actions/deploy-pages v2.0.2 -> v2.0.3 (#718)
See:
- https://github.com/actions/deploy-pages/releases/tag/v2.0.3
2023-07-11 12:51:40 +02:00
Picnic-Bot
a3ec76845a Upgrade actions/upload-pages-artifact v1.0.9 -> v2.0.0 (#720)
See:
- https://github.com/actions/upload-pages-artifact/releases/tag/v2.0.0
- https://github.com/actions/upload-pages-artifact/releases/tag/v1.0.10
2023-07-11 08:55:31 +02:00
Picnic-Bot
e3b310761d Upgrade Swagger 2.2.14 -> 2.2.15 (#717)
See:
- https://github.com/swagger-api/swagger-core/releases/tag/v2.2.15
- https://github.com/swagger-api/swagger-core/compare/v2.2.14...v2.2.15
2023-07-10 08:55:50 +02:00
Picnic-Bot
774052f13a Upgrade CodeQL v2.20.2 -> v2.20.3 (#715)
See:
- https://github.com/github/codeql-action/blob/main/CHANGELOG.md
- https://github.com/github/codeql-action/compare/v2.20.2...v2.20.3
2023-07-07 15:11:45 +02:00
Picnic-Bot
bad7684639 Upgrade Arcmutate 1.1.1 -> 1.1.2 (#714) 2023-07-07 10:40:15 +02:00
Picnic-Bot
dd72b5a08a Upgrade Checker Framework Annotations 3.35.0 -> 3.36.0 (#711)
See:
- https://github.com/typetools/checker-framework/releases/tag/checker-framework-3.36.0
- https://github.com/typetools/checker-framework/compare/checker-framework-3.35.0...checker-framework-3.36.0
2023-07-06 11:15:26 +02:00
Picnic-Bot
3eb30c5f93 Upgrade Guava 32.0.1-jre -> 32.1.1-jre (#705)
See:
- https://github.com/google/guava/releases/tag/v32.1.0
- https://github.com/google/guava/releases/tag/v32.1.1
- https://github.com/google/guava/compare/v32.0.1...v32.1.1
2023-07-06 10:22:56 +02:00
Picnic-Bot
2cc0539f8f Upgrade CodeQL v2.20.1 -> v2.20.2 (#707)
See:
- https://github.com/github/codeql-action/blob/main/CHANGELOG.md
- https://github.com/github/codeql-action/compare/v2.20.1...v2.20.2
2023-07-06 09:38:52 +02:00
Picnic-Bot
9210c30a0a Upgrade Pitest JUnit 5 Accelerator 1.0.5 -> 1.0.6 (#709) 2023-07-06 08:48:05 +02:00
Picnic-Bot
ba362ed460 Upgrade license-maven-plugin 2.1.0 -> 2.2.0 (#712)
See:
- https://github.com/mojohaus/license-maven-plugin/releases/tag/2.2.0
- https://github.com/mojohaus/license-maven-plugin/compare/2.1.0...2.2.0
2023-07-05 17:59:46 +02:00
Picnic-Bot
ab33adfab8 Upgrade Arcmutate 1.1.0 -> 1.1.1 (#708) 2023-07-05 17:48:22 +02:00
Rick Ossendrijver
006665ee6d Introduce MonoSingle Refaster rule (#703) 2023-07-05 13:54:49 +02:00
Picnic-Bot
08c49b9a58 Upgrade Pitest Git plugins 1.0.11 -> 1.0.12 (#710) 2023-07-05 13:42:54 +02:00
Picnic-Bot
777aa970f1 Upgrade ruby/setup-ruby v1.126.0 -> v1.152.0 (#706)
See:
- https://github.com/ruby/setup-ruby/releases/tag/v1.152.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.151.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.150.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.149.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.148.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.147.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.146.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.145.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.144.2
- https://github.com/ruby/setup-ruby/releases/tag/v1.144.1
- https://github.com/ruby/setup-ruby/releases/tag/v1.144.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.143.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.142.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.141.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.140.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.139.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.138.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.137.2
- https://github.com/ruby/setup-ruby/releases/tag/v1.137.1
- https://github.com/ruby/setup-ruby/releases/tag/v1.137.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.136.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.135.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.134.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.133.2
- https://github.com/ruby/setup-ruby/releases/tag/v1.133.1
- https://github.com/ruby/setup-ruby/releases/tag/v1.133.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.132.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.131.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.130.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.129.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.128.0
- https://github.com/ruby/setup-ruby/releases/tag/v1.127.0
2023-07-05 12:18:29 +02:00
Picnic-Bot
a040310870 Upgrade AutoValue 1.10.1 -> 1.10.2 (#704)
See:
- https://github.com/google/auto/releases/tag/auto-value-1.10.2
- https://github.com/google/auto/compare/auto-value-1.10.1...auto-value-1.10.2
2023-06-30 12:59:26 +02:00
Picnic-Bot
d6ab366f31 Upgrade CodeQL v2.2.11 -> v2.20.1 (#670)
See:
- https://github.com/github/codeql-action/blob/main/CHANGELOG.md
- https://github.com/github/codeql-action/compare/v2.20.0...v2.20.1
- https://github.com/github/codeql-action/compare/v2.3.6...v2.20.0
- https://github.com/github/codeql-action/compare/v2.3.5...v2.3.6
- https://github.com/github/codeql-action/compare/v2.3.4...v2.3.5
- https://github.com/github/codeql-action/compare/v2.3.3...v2.3.4
- https://github.com/github/codeql-action/compare/v2.3.2...v2.3.3
- https://github.com/github/codeql-action/compare/v2.3.1...v2.3.2
- https://github.com/github/codeql-action/compare/v2.3.0...v2.3.1
- https://github.com/github/codeql-action/compare/v2.2.12...v2.3.0
- https://github.com/github/codeql-action/compare/v2.2.11...v2.2.12
2023-06-28 13:20:53 +02:00
Picnic-Bot
d9fefa6824 Upgrade Swagger 2.2.13 -> 2.2.14 (#702)
See:
- https://github.com/swagger-api/swagger-core/releases/tag/v2.2.14
- https://github.com/swagger-api/swagger-core/compare/v2.2.13...v2.2.14
2023-06-27 08:28:08 +02:00
Picnic-Bot
c8b3a6df82 Upgrade pitest-maven-plugin 1.14.1 -> 1.14.2 (#696)
See:
- https://github.com/hcoles/pitest/releases/tag/1.14.2
- https://github.com/hcoles/pitest/compare/1.14.1...1.14.2
2023-06-26 12:07:21 +02:00
Picnic-Bot
782a790def Upgrade NullAway 0.10.10 -> 0.10.11 (#695)
See:
- https://github.com/uber/NullAway/blob/master/CHANGELOG.md
- https://github.com/uber/NullAway/compare/v0.10.10...v0.10.11
2023-06-26 11:31:05 +02:00
Picnic-Bot
706b5f401f Upgrade Checkstyle 10.12.0 -> 10.12.1 (#699)
See:
- https://checkstyle.sourceforge.io/releasenotes.html
- https://github.com/checkstyle/checkstyle/releases/tag/checkstyle-10.12.1
- https://github.com/checkstyle/checkstyle/compare/checkstyle-10.12.0...checkstyle-10.12.1
2023-06-26 11:20:21 +02:00
Picnic-Bot
9f500fd5bb Upgrade ossf/scorecard-action v2.1.3 -> v2.2.0 (#697)
And link to the new scorecard report page.

See:
- https://github.com/ossf/scorecard-action/releases/tag/v2.2.0
- https://github.com/ossf/scorecard-action/compare/v2.1.3...v2.2.0
2023-06-26 09:50:25 +02:00
Picnic-Bot
f541cd2e52 Upgrade Swagger 2.2.12 -> 2.2.13 (#698)
See:
- https://github.com/swagger-api/swagger-core/releases/tag/v2.2.13
- https://github.com/swagger-api/swagger-core/compare/v2.2.12...v2.2.13
2023-06-26 09:20:25 +02:00
Picnic-Bot
fc862aad94 Upgrade maven-clean-plugin 3.2.0 -> 3.3.1 (#693)
See:
- https://issues.apache.org/jira/issues/?jql=project%20%3D%20MCLEAN%20AND%20fixVersion%20%3E%203.2.0%20AND%20fixVersion%20%3C%3D%203.3.1
- https://github.com/apache/maven-clean-plugin/compare/maven-clean-plugin-3.2.0...maven-clean-plugin-3.3.1
2023-06-23 17:47:37 +02:00
Picnic-Bot
42810bc00c Upgrade Spring Boot 2.7.12 -> 2.7.13 (#694)
See:
- https://github.com/spring-projects/spring-boot/releases/tag/v2.7.13
- https://github.com/spring-projects/spring-boot/compare/v2.7.12...v2.7.13
2023-06-23 11:11:10 +02:00
Picnic-Bot
f17d736356 Upgrade AutoCommon 1.2.1 -> 1.2.2 (#681)
See:
- https://github.com/google/auto/releases/tag/auto-common-1.2.2
- https://github.com/google/auto/compare/auto-common-1.2.1...auto-common-1.2.2
2023-06-23 10:32:40 +02:00
Picnic-Bot
705acc9164 Upgrade Spring 5.3.27 -> 5.3.28 (#687)
See:
- https://github.com/spring-projects/spring-framework/releases/tag/v5.3.28
- https://github.com/spring-projects/spring-framework/compare/v5.3.27...v5.3.28
2023-06-23 10:19:13 +02:00
Picnic-Bot
bb969a8b80 Upgrade Mockito 5.3.1 -> 5.4.0 (#689)
See:
- https://github.com/mockito/mockito/releases/tag/v5.4.0
- https://github.com/mockito/mockito/compare/v5.3.1...v5.4.0
2023-06-23 10:09:55 +02:00
Picnic-Bot
c5a700c555 Upgrade Truth 1.1.4 -> 1.1.5 (#688)
See:
- https://github.com/google/truth/releases/tag/v1.1.5
- https://github.com/google/truth/compare/v1.1.4...v1.1.5
2023-06-23 09:56:42 +02:00
Picnic-Bot
2837a04433 Upgrade New Relic Java Agent 8.3.0 -> 8.4.0 (#690)
See:
- https://github.com/newrelic/newrelic-java-agent/releases/tag/v8.4.0
- https://github.com/newrelic/newrelic-java-agent/compare/v8.3.0...v8.4.0
2023-06-22 11:55:19 +02:00
Picnic-Bot
74222e8fa5 Upgrade Arcmutate 1.0.5 -> 1.1.0 (#692) 2023-06-22 09:25:43 +02:00
Stephan Schroevers
dc36ff2c0b [maven-release-plugin] prepare for next development iteration 2023-06-21 21:15:38 +02:00
Stephan Schroevers
09208aa49a [maven-release-plugin] prepare release v0.12.0 2023-06-21 21:15:38 +02:00
Stephan Schroevers
b81ec973a1 Upgrade Error Prone 2.19.1 -> 2.20.0 (#685)
Summary of key changes:
- The `MissingRefasterAnnotation` check was contributed to Error Prone,
  and so is deleted here (multiple checks with the same name are not
  supported).
- Similarly, Error Prone now supports the `-XepAllSuggestionsAsWarnings`
  flag out of the box. So the `ErrorProneFork` class is deleted, as it
  has currently no further use.

While there, include a tweak to `run-mutation-tests.sh`.

Fixes #686.

See:
- https://github.com/google/error-prone/releases/tag/v2.20.0
- https://github.com/google/error-prone/compare/v2.19.1...v2.20.0
- https://github.com/PicnicSupermarket/error-prone/compare/v2.19.1-picnic-1...v2.20.0-picnic-1
2023-06-20 15:52:26 +02:00
Picnic-Bot
8fb57b5bab Upgrade actions/upload-artifact v3.1.1 -> v3.1.2 (#664)
See:
- https://github.com/actions/upload-artifact/releases/tag/v3.1.2
2023-06-20 09:01:33 +02:00
Picnic-Bot
f4aaa5852c Upgrade dawidd6/action-download-artifact v2.24.2 -> v2.27.0 (#669)
See:
- https://github.com/dawidd6/action-download-artifact/compare/v2.26.1...v2.27.0
- https://github.com/dawidd6/action-download-artifact/compare/v2.26.0...v2.26.1
- https://github.com/dawidd6/action-download-artifact/compare/v2.25.0...v2.26.0
- https://github.com/dawidd6/action-download-artifact/compare/v2.24.4...v2.25.0
- https://github.com/dawidd6/action-download-artifact/compare/v2.24.3...v2.24.4
- https://github.com/dawidd6/action-download-artifact/compare/v2.24.2...v2.24.3
2023-06-19 11:54:34 +02:00
Picnic-Bot
2148b7ede4 Upgrade actions/upload-pages-artifact v1.0.5 -> v1.0.9 (#665)
See:
- https://github.com/actions/upload-pages-artifact/releases/tag/v1.0.9
- https://github.com/actions/upload-pages-artifact/releases/tag/v1.0.8
- https://github.com/actions/upload-pages-artifact/releases/tag/v1.0.7
- https://github.com/actions/upload-pages-artifact/releases/tag/v1.0.6
2023-06-19 11:30:48 +02:00
Picnic-Bot
b2320779e7 Upgrade actions/configure-pages v2.1.3 -> v3.0.6 (#673)
See:
- https://github.com/actions/configure-pages/releases/tag/v3.0.6
- https://github.com/actions/configure-pages/releases/tag/v3.0.5
- https://github.com/actions/configure-pages/releases/tag/v3.0.4
- https://github.com/actions/configure-pages/releases/tag/v3.0.3
- https://github.com/actions/configure-pages/releases/tag/v3.0.2
- https://github.com/actions/configure-pages/releases/tag/v3.0.1
- https://github.com/actions/configure-pages/releases/tag/v3.0.0
2023-06-19 11:13:20 +02:00
Picnic-Bot
ef0d65d360 Upgrade actions/deploy-pages v1.2.8 -> v2.0.2 (#674)
See:
- https://github.com/actions/deploy-pages/releases/tag/v2.0.2
- https://github.com/actions/deploy-pages/releases/tag/v2.0.1
- https://github.com/actions/deploy-pages/releases/tag/v2.0.0
2023-06-19 11:01:54 +02:00
Picnic-Bot
d29fde8856 Upgrade actions/checkout v3.1.0 -> v3.5.3 (#667)
See:
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v353
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v352
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v351
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v350
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v340
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v330
- https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v320
2023-06-19 09:18:01 +02:00
Picnic-Bot
524c7efb48 Upgrade actions/deploy-pages v1.2.3 -> v1.2.8 (#663)
See:
- https://github.com/actions/deploy-pages/releases/tag/v1.2.8
- https://github.com/actions/deploy-pages/releases/tag/v1.2.7
- https://github.com/actions/deploy-pages/releases/tag/v1.2.6
- https://github.com/actions/deploy-pages/releases/tag/v1.2.5
- https://github.com/actions/deploy-pages/releases/tag/v1.2.4
2023-06-19 08:56:31 +02:00
Picnic-Bot
a62acfd7b5 Upgrade Project Reactor 2022.0.7 -> 2022.0.8 (#683)
See:
- https://github.com/reactor/reactor/releases/tag/2022.0.8
- https://github.com/reactor/reactor/compare/2022.0.7...2022.0.8
2023-06-16 16:16:06 +02:00
Picnic-Bot
c40e1d6691 Upgrade actions/setup-java v3.8.0 -> v3.11.0 (#668)
See:
- https://github.com/actions/setup-java/releases/tag/v3.9.0
- https://github.com/actions/setup-java/releases/tag/v3.10.0
- https://github.com/actions/setup-java/releases/tag/v3.11.0
2023-06-16 15:35:04 +02:00
Picnic-Bot
57a22bf9de Upgrade Swagger 2.2.11 -> 2.2.12 (#684)
See:
- https://github.com/swagger-api/swagger-core/releases/tag/v2.2.12
- https://github.com/swagger-api/swagger-core/compare/v2.2.11...v2.2.12
2023-06-16 15:12:15 +02:00
Picnic-Bot
ec982fe011 Upgrade AutoService 1.1.0 -> 1.1.1 (#682)
See:
- https://github.com/google/auto/releases/tag/auto-service-1.1.1
- https://github.com/google/auto/compare/auto-service-1.1.0...auto-service-1.1.1
2023-06-14 12:35:41 +02:00
Picnic-Bot
1860e24e65 Upgrade Guava 32.0.0-jre -> 32.0.1-jre (#677)
See:
- https://github.com/google/guava/releases/tag/v32.0.1
- https://github.com/google/guava/compare/v32.0.0...v32.0.1
2023-06-12 19:04:31 +02:00
Picnic-Bot
cce248c306 Upgrade Surefire 3.1.0 -> 3.1.2 (#666)
See:
- https://issues.apache.org/jira/issues/?jql=project%20%3D%20SUREFIRE%20AND%20fixVersion%20%3E%203.1.0%20AND%20fixVersion%20%3C%3D%203.1.2
- https://github.com/apache/maven-surefire/releases/tag/surefire-3.1.2
- https://github.com/apache/maven-surefire/compare/surefire-3.1.0...surefire-3.1.2
2023-06-12 11:56:20 +02:00
Picnic-Bot
96aca8ea2b Upgrade versions-maven-plugin 2.15.0 -> 2.16.0 (#678)
See:
- https://github.com/mojohaus/versions/releases/tag/2.16.0
- https://github.com/mojohaus/versions-maven-plugin/compare/2.15.0...2.16.0
2023-06-10 14:21:16 +02:00
Picnic-Bot
70d2bf9016 Upgrade license-maven-plugin 2.0.1 -> 2.1.0 (#671)
See:
- https://github.com/mojohaus/license-maven-plugin/releases/tag/2.1.0
- https://github.com/mojohaus/license-maven-plugin/compare/2.0.1...2.1.0
2023-06-08 14:25:34 +02:00
Rick Ossendrijver
cee3c58d07 Configure Renovate to pin GitHub Action digests (#675) 2023-06-08 10:23:05 +02:00
Picnic-Bot
c141ebe05d Upgrade swagger-annotations 2.2.10 -> 2.2.11 (#657)
See:
- https://github.com/swagger-api/swagger-core/releases/tag/v2.2.11
- https://github.com/swagger-api/swagger-core/compare/v2.2.10...v2.2.11
2023-06-07 11:40:15 +02:00
Picnic-Bot
f5a8c412af Upgrade Byte Buddy 1.14.4 -> 1.14.5 (#658)
See:
- https://github.com/raphw/byte-buddy/releases/tag/byte-buddy-1.14.5
- https://github.com/raphw/byte-buddy/compare/byte-buddy-1.14.4...byte-buddy-1.14.5
2023-06-07 10:48:54 +02:00
Picnic-Bot
93440826ed Upgrade Arcmutate 1.0.4 -> 1.0.5 (#656) 2023-06-07 08:02:44 +02:00
Picnic-Bot
80dcae319e Upgrade Jackson 2.15.1 -> 2.15.2 (#652)
See:
- https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.15.2
- https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.15.1...jackson-bom-2.15.2
2023-06-06 16:30:09 +02:00
Picnic-Bot
7371d03db8 Upgrade Truth 1.1.3 -> 1.1.4 (#653)
See:
- https://github.com/google/truth/releases/tag/v1.1.4
- https://github.com/google/truth/compare/release_1_1_3...v1.1.4
2023-06-06 09:47:09 +02:00
Picnic-Bot
c6b98e61ff Upgrade maven-release-plugin 3.0.0 -> 3.0.1 (#662)
See:
- https://issues.apache.org/jira/issues/?jql=project%20%3D%20MRELEASE%20AND%20fixVersion%20%3E%203.0.0%20AND%20fixVersion%20%3C%3D%203.0.1
- https://github.com/apache/maven-release/releases/tag/maven-release-3.0.1
- https://github.com/apache/maven-release/compare/maven-release-3.0.0...maven-release-3.0.1
2023-06-06 08:34:35 +02:00
Picnic-Bot
ce8f9f60c8 Upgrade New Relic Java Agent 8.2.0 -> 8.3.0 (#659)
See:
- https://github.com/newrelic/newrelic-java-agent/releases/tag/v8.3.0
- https://github.com/newrelic/newrelic-java-agent/compare/v8.2.0...v8.3.0
2023-06-06 07:50:01 +02:00
Picnic-Bot
cdf27acd9c Upgrade Checker Framework Annotations 3.34.0 -> 3.35.0 (#660)
See:
- https://github.com/typetools/checker-framework/releases/tag/checker-framework-3.35.0
- https://github.com/typetools/checker-framework/compare/checker-framework-3.34.0...checker-framework-3.35.0
2023-06-06 07:40:05 +02:00
Picnic-Bot
49e5fd1273 Upgrade extra-enforcer-rules 1.6.2 -> 1.7.0 (#661)
See:
- https://github.com/mojohaus/extra-enforcer-rules/releases/tag/1.7.0
- https://github.com/mojohaus/extra-enforcer-rules/compare/1.6.2...1.7.0
2023-06-06 07:20:46 +02:00
Picnic-Bot
5085db25c0 Upgrade Guava 31.1-jre -> 32.0.0-jre (#650)
See:
- https://guava.dev/releases/32.0.0-jre/api/diffs/
- https://github.com/google/guava/releases/tag/v32.0.0
- https://github.com/google/guava/compare/v31.1...v32.0.0
2023-05-30 16:49:11 +02:00
Picnic-Bot
125d24bc13 Upgrade Checkstyle 10.11.0 -> 10.12.0 (#651)
See:
- https://checkstyle.sourceforge.io/releasenotes.html
- https://github.com/checkstyle/checkstyle/releases/tag/checkstyle-10.12.0
- https://github.com/checkstyle/checkstyle/compare/checkstyle-10.11.0...checkstyle-10.12.0
2023-05-30 08:44:15 +02:00
Picnic-Bot
ea02144bff Upgrade pitest-maven-plugin 1.14.0 -> 1.14.1 (#648)
See:
- https://github.com/hcoles/pitest/releases/tag/1.14.1
- https://github.com/hcoles/pitest/compare/1.14.0...1.14.1
2023-05-26 10:13:47 +02:00
Luke Prananta
cc2c49edc3 Introduce OptionalOrElseGet Refaster rule (#527)
While there, introduce `IsLikelyTrivialComputation` Matcher.
2023-05-26 09:19:51 +02:00
Stephan Schroevers
8bc878a05c Improve AbstractMatcherTestChecker (#599)
These changes enable testing of a wider range of `Matcher` implementations. In
a nutshell:
- The `Matcher` under test is now passed `VisitorState` instances with an
  accurate `TreePath`.
- The `Matcher` under test is no longer consulted for method select and cast
  type expressions, mirroring Refaster behavior.
2023-05-26 08:29:26 +02:00
Picnic-Bot
b399ef8910 Upgrade Spring Boot 2.7.11 -> 2.7.12 (#637)
See:
- https://github.com/spring-projects/spring-boot/releases/tag/v2.7.12
- https://github.com/spring-projects/spring-boot/compare/v2.7.11...v2.7.12
2023-05-24 19:03:38 +02:00
Picnic-Bot
7dba641a79 Upgrade pitest-junit5-plugin 1.1.2 -> 1.2.0 (#638)
See https://github.com/pitest/pitest-junit5-plugin/compare/1.1.2...1.2.0
2023-05-24 17:20:57 +02:00
Picnic-Bot
da1528129f Upgrade maven-source-plugin 3.2.1 -> 3.3.0 (#643)
See:
- https://issues.apache.org/jira/issues/?jql=project%20%3D%20MSOURCES%20AND%20fixVersion%20%3E%203.2.1%20AND%20fixVersion%20%3C%3D%203.3.0
- https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.2.1...maven-source-plugin-3.3.0
2023-05-24 17:08:20 +02:00
Picnic-Bot
d0bbc5c14b Upgrade pitest-maven-plugin 1.13.1 -> 1.14.0 (#633)
See:
- https://github.com/hcoles/pitest/releases/tag/1.13.2
- https://github.com/hcoles/pitest/releases/tag/1.14.0
- https://github.com/hcoles/pitest/compare/1.13.1...1.14.0
2023-05-24 16:30:06 +02:00
Picnic-Bot
da532c79c7 Upgrade Pitest Git plugins 1.0.10 -> 1.0.11 (#634) 2023-05-24 16:10:58 +02:00
Picnic-Bot
04e2900a48 Upgrade git-commit-id-maven-plugin 5.0.0 -> 6.0.0 (#635)
See:
- https://github.com/git-commit-id/git-commit-id-maven-plugin/releases/tag/v6.0.0
- https://github.com/git-commit-id/git-commit-id-maven-plugin/compare/v5.0.0...v6.0.0
2023-05-24 16:00:11 +02:00
Picnic-Bot
f097095398 Upgrade AutoService 1.0.1 -> 1.1.0 (#647)
See:
- https://github.com/google/auto/releases/tag/auto-service-1.0.2
- https://github.com/google/auto/releases/tag/auto-service-1.1.0
- https://github.com/google/auto/compare/auto-service-1.0.1...auto-service-1.1.0
2023-05-24 13:25:40 +02:00
Philip Leonard
c53a3f64b6 Qualify non-static TestMode imports across BugChecker test classes (#630)
Prefer non-static imports and qualification of
`BugCheckerRefactoringTestHelper#TestMode` members across bug checker test
classes.
2023-05-23 09:31:59 +02:00
Picnic-Bot
cdfcecc204 Upgrade maven-dependency-plugin 3.5.0 -> 3.6.0 (#646)
See:
- https://issues.apache.org/jira/issues/?jql=project%20%3D%20MDEP%20AND%20fixVersion%20%3E%203.5.0%20AND%20fixVersion%20%3C%3D%203.6.0
- https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.5.0...maven-dependency-plugin-3.6.0
2023-05-23 08:43:31 +02:00
Picnic-Bot
4f4b3fb865 Upgrade maven-checkstyle-plugin 3.2.2 -> 3.3.0 (#645)
See:
- https://issues.apache.org/jira/issues/?jql=project%20%3D%20MCHECKSTYLE%20AND%20fixVersion%20%3E%203.2.2%20AND%20fixVersion%20%3C%3D%203.3.0
- https://github.com/apache/maven-checkstyle-plugin/compare/maven-checkstyle-plugin-3.2.2...maven-checkstyle-plugin-3.3.0
2023-05-23 07:32:41 +02:00
Picnic-Bot
cce36d24df Upgrade TestNG 7.7.1 -> 7.8.0 (#639)
See:
- https://github.com/testng-team/testng/releases/tag/7.8.0
- https://github.com/testng-team/testng/compare/7.7.1...7.8.0
2023-05-22 08:39:36 +02:00
Picnic-Bot
3bbae43da8 Upgrade swagger-annotations 1.6.10 -> 1.6.11 (#629)
See:
- https://github.com/swagger-api/swagger-core/releases/tag/v1.6.11
- https://github.com/swagger-api/swagger-core/compare/v1.6.10...v1.6.11
2023-05-17 13:18:26 +02:00
Picnic-Bot
3217a6974d Upgrade swagger-annotations 2.2.9 -> 2.2.10 (#628)
See:
- https://github.com/swagger-api/swagger-core/releases/tag/v2.2.10
- https://github.com/swagger-api/swagger-core/compare/v2.2.9...v2.2.10
2023-05-17 12:19:30 +02:00
Picnic-Bot
7b71e4ea3e Upgrade Jackson 2.15.0 -> 2.15.1 (#631)
See:
- https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.15.1
- https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.15.0...jackson-bom-2.15.1
2023-05-17 11:28:55 +02:00
Stephan Schroevers
3df6dc957d [maven-release-plugin] prepare for next development iteration 2023-05-16 17:38:46 +02:00
Stephan Schroevers
a1ecd816ff [maven-release-plugin] prepare release v0.11.1 2023-05-16 17:38:46 +02:00
Stephan Schroevers
03af05889a Make ThirdPartyLibrary compatible with -source 8 (#627)
When targeting Java 8, `unnamedModule` is not properly initialized,
causing an NPE when trying to load a class from it. In that context
`noModule` should be used instead.

Fixes #626.
2023-05-16 09:53:52 +02:00
Stephan Schroevers
f52a93cc4e [maven-release-plugin] prepare for next development iteration 2023-05-14 17:09:09 +02:00
120 changed files with 199245 additions and 856 deletions

View File

@@ -42,7 +42,7 @@ Please replace this sentence with log output, if applicable.
<!-- Please complete the following information: -->
- Operating system (e.g. MacOS Monterey).
- Java version (i.e. `java --version`, e.g. `17.0.7`).
- Java version (i.e. `java --version`, e.g. `17.0.8`).
- Error Prone version (e.g. `2.18.0`).
- Error Prone Support version (e.g. `0.9.0`).

View File

@@ -10,16 +10,16 @@ jobs:
strategy:
matrix:
os: [ ubuntu-22.04 ]
jdk: [ 11.0.19, 17.0.7, 20.0.1 ]
jdk: [ 11.0.20, 17.0.8, 20.0.2 ]
distribution: [ temurin ]
experimental: [ false ]
include:
- os: macos-12
jdk: 17.0.7
jdk: 17.0.8
distribution: temurin
experimental: false
- os: windows-2022
jdk: 17.0.7
jdk: 17.0.8
distribution: temurin
experimental: false
runs-on: ${{ matrix.os }}
@@ -31,11 +31,11 @@ jobs:
# additionally enabling all checks defined in this project and any Error
# Prone checks available only from other artifact repositories.
- name: Check out code
uses: actions/checkout@v3.1.0
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
with:
persist-credentials: false
- name: Set up JDK
uses: actions/setup-java@v3.8.0
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3.13.0
with:
java-version: ${{ matrix.jdk }}
distribution: ${{ matrix.distribution }}

View File

@@ -22,23 +22,23 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v3.1.0
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
with:
persist-credentials: false
- name: Set up JDK
uses: actions/setup-java@v3.8.0
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3.13.0
with:
java-version: 17.0.7
java-version: 17.0.8
distribution: temurin
cache: maven
- name: Initialize CodeQL
uses: github/codeql-action/init@v2.2.11
uses: github/codeql-action/init@2cb752a87e96af96708ab57187ab6372ee1973ab # v2.22.0
with:
languages: ${{ matrix.language }}
- name: Perform minimal build
if: matrix.language == 'java'
run: mvn -T1C clean install -DskipTests -Dverification.skip
- name: Perform CodeQL analysis
uses: github/codeql-action/analyze@v2.2.11
uses: github/codeql-action/analyze@2cb752a87e96af96708ab57187ab6372ee1973ab # v2.22.0
with:
category: /language:${{ matrix.language }}

View File

@@ -12,15 +12,15 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v3.1.0
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
with:
persist-credentials: false
- uses: ruby/setup-ruby@v1.126.0
- uses: ruby/setup-ruby@d37167af451eb51448db3354e1057b75c4b268f7 # v1.155.0
with:
working-directory: ./website
bundler-cache: true
- name: Configure Github Pages
uses: actions/configure-pages@v2.1.3
uses: actions/configure-pages@f156874f8191504dae5b037505266ed5dda6c382 # v3.0.6
- name: Generate documentation
run: ./generate-docs.sh
- name: Build website with Jekyll
@@ -32,7 +32,7 @@ jobs:
# "Refaster rules" terminology on our website and in the code.
run: bundle exec htmlproofer --disable_external true --check-external-hash false ./_site
- name: Upload website as artifact
uses: actions/upload-pages-artifact@v1.0.5
uses: actions/upload-pages-artifact@a753861a5debcf57bf8b404356158c8e1e33150c # v2.0.0
with:
path: ./website/_site
deploy:
@@ -48,4 +48,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1.2.3
uses: actions/deploy-pages@9dbe3824824f8a1377b8e298bafde1a50ede43e5 # v2.0.4

36
.github/workflows/integration-test.yml vendored Normal file
View File

@@ -0,0 +1,36 @@
name: On-demand integration test
on:
# run action every time a new comment is created
issue_comment:
types: [ created ]
permissions:
contents: read
jobs:
on_demand_integration_test:
name: On-demand integration test
# Only run the integration test if the created comment is on a pull request
# and contains the string `/integration-test`
if: |
github.event.issue.pull_request &&
contains(github.event.comment.body, '/integration-test')
# XXX TODO: Device matrix?
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1
with:
submodules: 'recursive'
persist-credentials: false
- name: Set up JDK
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3.13.0
with:
# XXX TODO: java version matrix?
java-version: 17.0.8
distribution: temurin
cache: maven
- name: Display build environment details
run: mvn --version
- name: Install error-prone-support snapshot
run: mvn -T1C install -DskipTests -Dverification.skip
- name: Run integration test
run: echo "running integration test"

View File

@@ -21,16 +21,16 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v3.1.0
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
with:
persist-credentials: false
- name: Run OpenSSF Scorecard analysis
uses: ossf/scorecard-action@v2.1.3
uses: ossf/scorecard-action@483ef80eb98fb506c348f7d62e28055e49fe2398 # v2.3.0
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@v2.2.11
uses: github/codeql-action/upload-sarif@2cb752a87e96af96708ab57187ab6372ee1973ab # v2.22.0
with:
sarif_file: results.sarif

View File

@@ -12,14 +12,14 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v3.1.0
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
with:
fetch-depth: 2
persist-credentials: false
- name: Set up JDK
uses: actions/setup-java@v3.8.0
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3.13.0
with:
java-version: 17.0.7
java-version: 17.0.8
distribution: temurin
cache: maven
- name: Run Pitest
@@ -32,7 +32,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@v3.1.1
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: pitest-reports
path: ./target/pit-reports-ci

View File

@@ -20,17 +20,17 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v3.1.0
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
with:
persist-credentials: false
- name: Set up JDK
uses: actions/setup-java@v3.8.0
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3.13.0
with:
java-version: 17.0.7
java-version: 17.0.8
distribution: temurin
cache: maven
- name: Download Pitest analysis artifact
uses: dawidd6/action-download-artifact@v2.24.2
uses: dawidd6/action-download-artifact@268677152d06ba59fcec7a7f0b5d961b6ccd7e1e # v2.28.0
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
name: pitest-reports

View File

@@ -16,14 +16,14 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v3.1.0
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
with:
fetch-depth: 0
persist-credentials: false
- name: Set up JDK
uses: actions/setup-java@v3.8.0
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3.13.0
with:
java-version: 17.0.7
java-version: 17.0.8
distribution: temurin
cache: maven
- name: Create missing `test` directory

15
.gitmodules vendored Normal file
View File

@@ -0,0 +1,15 @@
[submodule "integration-tests/checkstyle"]
path = integration-tests/checkstyle
url = git@github.com:checkstyle/checkstyle.git
[submodule "integration-tests/guava"]
path = integration-tests/guava
url = https://github.com/google/guava
[submodule "integration-tests/metrics"]
path = integration-tests/metrics
url = https://github.com/dropwizard/metrics
[submodule "integration-tests/druid"]
path = integration-tests/druid
url = https://github.com/apache/druid
[submodule "integration-tests/calcite"]
path = integration-tests/calcite
url = https://github.com/apache/calcite

View File

@@ -1,5 +1,8 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"helpers:pinGitHubActionDigests"
],
"packageRules": [
{
"matchPackagePatterns": [
@@ -9,10 +12,11 @@
"separateMinorPatch": true
},
{
"matchPackagePatterns": [
"^ruby\\/setup-ruby$"
"matchDepNames": [
"github/codeql-action",
"ruby/setup-ruby"
],
"schedule": "* * 1 * *"
"schedule": "every 4 weeks on Monday"
}
],
"reviewers": [

View File

@@ -80,6 +80,6 @@ Some pointers:
[error-prone-support-developing]: https://github.com/PicnicSupermarket/error-prone-support/tree/master#-developing-error-prone-support
[error-prone-support-full-build]: https://github.com/PicnicSupermarket/error-prone-support/blob/master/run-full-build.sh
[error-prone-support-issues]: https://github.com/PicnicSupermarket/error-prone-support/issues
[error-prone-support-mutation-tests]: https://github.com/PicnicSupermarket/error-prone-support/blob/master/run-mutation-tests.sh
[error-prone-support-mutation-tests]: https://github.com/PicnicSupermarket/error-prone-support/blob/master/run-branch-mutation-tests.sh
[error-prone-support-patch]: https://github.com/PicnicSupermarket/error-prone-support/blob/master/apply-error-prone-suggestions.sh
[error-prone-support-pulls]: https://github.com/PicnicSupermarket/error-prone-support/pulls

View File

@@ -223,10 +223,13 @@ Other highly relevant commands:
Before running this command, make sure to have installed the project (`mvn
clean install`) and make sure that the current working directory does not
contain unstaged or uncommited changes.
- [`./run-mutation-tests.sh`][script-run-mutation-tests] runs mutation tests
using [Pitest][pitest]. The results can be reviewed by opening the respective
`target/pit-reports/index.html` files. For more information check the [PIT
Maven plugin][pitest-maven].
- [`./run-branch-mutation-tests.sh`][script-run-branch-mutation-tests] uses
[Pitest][pitest] to run mutation tests against code that is modified relative
to the upstream default branch. The results can be reviewed by opening the
respective `target/pit-reports/index.html` files. One can use
[`./run-mutation-tests.sh`][script-run-mutation-tests] to run mutation tests
against _all_ code in the current working directory. For more information
check the [PIT Maven plugin][pitest-maven].
When running the project's tests in IntelliJ IDEA, you might see the following
error:
@@ -283,7 +286,7 @@ channel; please see our [security policy][security] for details.
[openssf-best-practices-badge]: https://bestpractices.coreinfrastructure.org/projects/7199/badge
[openssf-best-practices-checklist]: https://bestpractices.coreinfrastructure.org/projects/7199
[openssf-scorecard-badge]: https://img.shields.io/ossf-scorecard/github.com/PicnicSupermarket/error-prone-support?label=openssf%20scorecard
[openssf-scorecard-report]: https://api.securityscorecards.dev/projects/github.com/PicnicSupermarket/error-prone-support
[openssf-scorecard-report]: https://securityscorecards.dev/viewer/?uri=github.com/PicnicSupermarket/error-prone-support
[picnic-blog-ep-post]: https://blog.picnic.nl/picnic-loves-error-prone-producing-high-quality-and-consistent-java-code-b8a566be6886
[picnic-blog]: https://blog.picnic.nl
[pitest-badge]: https://img.shields.io/badge/-Mutation%20tested%20with%20PIT-blue.svg
@@ -296,6 +299,7 @@ channel; please see our [security policy][security] for details.
[reproducible-builds-badge]: https://img.shields.io/badge/Reproducible_Builds-ok-success?labelColor=1e5b96
[reproducible-builds-report]: https://github.com/jvm-repo-rebuild/reproducible-central/blob/master/content/tech/picnic/error-prone-support/error-prone-support/README.md
[script-apply-error-prone-suggestions]: https://github.com/PicnicSupermarket/error-prone-support/blob/master/apply-error-prone-suggestions.sh
[script-run-branch-mutation-tests]: https://github.com/PicnicSupermarket/error-prone-support/blob/master/run-branch-mutation-tests.sh
[script-run-full-build]: https://github.com/PicnicSupermarket/error-prone-support/blob/master/run-full-build.sh
[script-run-mutation-tests]: https://github.com/PicnicSupermarket/error-prone-support/blob/master/run-mutation-tests.sh
[security]: https://github.com/PicnicSupermarket/error-prone-support/blob/master/SECURITY.md

View File

@@ -5,7 +5,7 @@
<parent>
<groupId>tech.picnic.error-prone-support</groupId>
<artifactId>error-prone-support</artifactId>
<version>0.11.0</version>
<version>0.14.1-SNAPSHOT</version>
</parent>
<artifactId>documentation-support</artifactId>

View File

@@ -125,9 +125,6 @@ The following is a list of checks we'd like to see implemented:
statement. Idem for other exception types.
- A Guava-specific check that replaces simple anonymous `CacheLoader` subclass
declarations with `CacheLoader.from(someLambda)`.
- A Spring-specific check that enforces that methods with the `@Scheduled`
annotation are also annotated with New Relic's `@Trace` annotation. Such
methods should ideally not also represent Spring MVC endpoints.
- A Spring-specific check that enforces that `@RequestMapping` annotations,
when applied to a method, explicitly specify one or more target HTTP methods.
- A Spring-specific check that looks for classes in which all `@RequestMapping`

View File

@@ -5,7 +5,7 @@
<parent>
<groupId>tech.picnic.error-prone-support</groupId>
<artifactId>error-prone-support</artifactId>
<version>0.11.0</version>
<version>0.14.1-SNAPSHOT</version>
</parent>
<artifactId>error-prone-contrib</artifactId>
@@ -81,11 +81,6 @@
<artifactId>guava</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.newrelic.agent.java</groupId>
<artifactId>newrelic-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
@@ -176,6 +171,11 @@
<artifactId>mockito-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.reactivestreams</groupId>
<artifactId>reactive-streams</artifactId>

View File

@@ -91,8 +91,8 @@ public final class CanonicalAnnotationSyntax extends BugChecker implements Annot
ExpressionTree arg = args.get(0);
if (state.getSourceForNode(arg) == null) {
/*
* The annotation argument isn't doesn't have a source representation, e.g. because `value`
* isn't assigned to explicitly.
* The annotation argument doesn't have a source representation, e.g. because `value` isn't
* assigned explicitly.
*/
return Optional.empty();
}

View File

@@ -59,6 +59,7 @@ import tech.picnic.errorprone.bugpatterns.util.SourceCode;
public final class FormatStringConcatenation extends BugChecker
implements MethodInvocationTreeMatcher {
private static final long serialVersionUID = 1L;
/**
* AssertJ exposes varargs {@code fail} methods with a {@link Throwable}-accepting overload, the
* latter of which should not be flagged.
@@ -68,6 +69,7 @@ public final class FormatStringConcatenation extends BugChecker
.anyClass()
.withAnyName()
.withParameters(String.class.getName(), Throwable.class.getName());
// XXX: Drop some of these methods if we use Refaster to replace some with others.
private static final Matcher<ExpressionTree> ASSERTJ_FORMAT_METHOD =
anyOf(

View File

@@ -76,6 +76,7 @@ public final class LexicographicalAnnotationAttributeListing extends BugChecker
private static final String FLAG_PREFIX = "LexicographicalAnnotationAttributeListing:";
private static final String INCLUDED_ANNOTATIONS_FLAG = FLAG_PREFIX + "Includes";
private static final String EXCLUDED_ANNOTATIONS_FLAG = FLAG_PREFIX + "Excludes";
/**
* The splitter applied to string-typed annotation arguments prior to lexicographical sorting. By
* splitting on {@code =}, strings that represent e.g. inline Spring property declarations are
@@ -219,7 +220,10 @@ public final class LexicographicalAnnotationAttributeListing extends BugChecker
private static AnnotationAttributeMatcher createAnnotationAttributeMatcher(
ErrorProneFlags flags) {
return AnnotationAttributeMatcher.create(
flags.getList(INCLUDED_ANNOTATIONS_FLAG), excludedAnnotations(flags));
flags.get(INCLUDED_ANNOTATIONS_FLAG).isPresent()
? Optional.of(flags.getListOrEmpty(INCLUDED_ANNOTATIONS_FLAG))
: Optional.empty(),
excludedAnnotations(flags));
}
private static ImmutableList<String> excludedAnnotations(ErrorProneFlags flags) {

View File

@@ -46,6 +46,7 @@ import tech.picnic.errorprone.bugpatterns.util.SourceCode;
public final class LexicographicalAnnotationListing extends BugChecker
implements MethodTreeMatcher {
private static final long serialVersionUID = 1L;
/**
* A comparator that minimally reorders {@link AnnotationType}s, such that declaration annotations
* are placed before type annotations.

View File

@@ -1,59 +0,0 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.errorprone.BugPattern.LinkType.CUSTOM;
import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
import static com.google.errorprone.BugPattern.StandardTags.LIKELY_ERROR;
import static com.google.errorprone.matchers.ChildMultiMatcher.MatchType.AT_LEAST_ONE;
import static com.google.errorprone.matchers.Matchers.annotations;
import static com.google.errorprone.matchers.Matchers.anyOf;
import static com.google.errorprone.matchers.Matchers.isType;
import static tech.picnic.errorprone.bugpatterns.util.Documentation.BUG_PATTERNS_BASE_URL;
import com.google.auto.service.AutoService;
import com.google.errorprone.BugPattern;
import com.google.errorprone.VisitorState;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.ClassTreeMatcher;
import com.google.errorprone.matchers.Description;
import com.google.errorprone.matchers.MultiMatcher;
import com.google.errorprone.util.ASTHelpers;
import com.sun.source.tree.AnnotationTree;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.MethodTree;
import com.sun.source.tree.Tree;
/** A {@link BugChecker} that flags likely missing Refaster annotations. */
@AutoService(BugChecker.class)
@BugPattern(
summary = "The Refaster rule contains a method without any Refaster annotations",
link = BUG_PATTERNS_BASE_URL + "MissingRefasterAnnotation",
linkType = CUSTOM,
severity = WARNING,
tags = LIKELY_ERROR)
public final class MissingRefasterAnnotation extends BugChecker implements ClassTreeMatcher {
private static final long serialVersionUID = 1L;
private static final MultiMatcher<Tree, AnnotationTree> REFASTER_ANNOTATION =
annotations(
AT_LEAST_ONE,
anyOf(
isType("com.google.errorprone.refaster.annotation.Placeholder"),
isType("com.google.errorprone.refaster.annotation.BeforeTemplate"),
isType("com.google.errorprone.refaster.annotation.AfterTemplate")));
/** Instantiates a new {@link MissingRefasterAnnotation} instance. */
public MissingRefasterAnnotation() {}
@Override
public Description matchClass(ClassTree tree, VisitorState state) {
long methodTypes =
tree.getMembers().stream()
.filter(member -> member.getKind() == Tree.Kind.METHOD)
.map(MethodTree.class::cast)
.filter(method -> !ASTHelpers.isGeneratedConstructor(method))
.map(method -> REFASTER_ANNOTATION.matches(method, state))
.distinct()
.count();
return methodTypes < 2 ? Description.NO_MATCH : buildDescription(tree).build();
}
}

View File

@@ -0,0 +1,47 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.errorprone.BugPattern.LinkType.CUSTOM;
import static com.google.errorprone.BugPattern.SeverityLevel.SUGGESTION;
import static com.google.errorprone.BugPattern.StandardTags.PERFORMANCE;
import static com.google.errorprone.matchers.method.MethodMatchers.staticMethod;
import static tech.picnic.errorprone.bugpatterns.util.Documentation.BUG_PATTERNS_BASE_URL;
import com.google.auto.service.AutoService;
import com.google.errorprone.BugPattern;
import com.google.errorprone.VisitorState;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.MethodInvocationTreeMatcher;
import com.google.errorprone.matchers.Description;
import com.google.errorprone.matchers.Matcher;
import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.MethodInvocationTree;
/**
* A {@link BugChecker} that flags usages of MongoDB {@code $text} filter usages.
*
* @see <a href="https://www.mongodb.com/docs/manual/text-search/">MongoDB Text Search</a>
*/
@AutoService(BugChecker.class)
@BugPattern(
summary =
"Avoid MongoDB's `$text` filter operator, as it can trigger heavy queries and even cause the server to run out of memory",
link = BUG_PATTERNS_BASE_URL + "MongoDBTextFilterUsage",
linkType = CUSTOM,
severity = SUGGESTION,
tags = PERFORMANCE)
public final class MongoDBTextFilterUsage extends BugChecker
implements MethodInvocationTreeMatcher {
private static final long serialVersionUID = 1L;
private static final Matcher<ExpressionTree> MONGO_FILTERS_TEXT_METHOD =
staticMethod().onClass("com.mongodb.client.model.Filters").named("text");
/** Instantiates a new {@link MongoDBTextFilterUsage} instance. */
public MongoDBTextFilterUsage() {}
@Override
public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
return MONGO_FILTERS_TEXT_METHOD.matches(tree, state)
? describeMatch(tree)
: Description.NO_MATCH;
}
}

View File

@@ -4,6 +4,7 @@ import static com.google.errorprone.BugPattern.LinkType.CUSTOM;
import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
import static com.google.errorprone.BugPattern.StandardTags.FRAGILE_CODE;
import static tech.picnic.errorprone.bugpatterns.util.Documentation.BUG_PATTERNS_BASE_URL;
import static tech.picnic.errorprone.bugpatterns.util.MoreMatchers.isSubTypeOf;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.generic;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.raw;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.subOf;
@@ -14,14 +15,19 @@ import com.google.errorprone.VisitorState;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.MethodInvocationTreeMatcher;
import com.google.errorprone.matchers.Description;
import com.google.errorprone.matchers.Matcher;
import com.google.errorprone.suppliers.Supplier;
import com.google.errorprone.suppliers.Suppliers;
import com.google.errorprone.util.ASTHelpers;
import com.sun.source.tree.MethodInvocationTree;
import com.sun.source.tree.Tree;
import com.sun.tools.javac.code.Type;
import java.util.Optional;
/** A {@link BugChecker} that flags nesting of {@link Optional Optionals}. */
// XXX: Extend this checker to also flag method return types and variable/field types.
// XXX: Consider generalizing this checker and `NestedPublishers` to a single `NestedMonad` check,
// which e.g. also flags nested `Stream`s. Alternatively, combine these and other checkers into an
// even more generic `ConfusingType` checker.
@AutoService(BugChecker.class)
@BugPattern(
summary =
@@ -33,19 +39,16 @@ import java.util.Optional;
public final class NestedOptionals extends BugChecker implements MethodInvocationTreeMatcher {
private static final long serialVersionUID = 1L;
private static final Supplier<Type> OPTIONAL = Suppliers.typeFromClass(Optional.class);
private static final Supplier<Type> OPTIONAL_OF_OPTIONAL =
VisitorState.memoize(generic(OPTIONAL, subOf(raw(OPTIONAL))));
private static final Matcher<Tree> IS_OPTIONAL_OF_OPTIONAL =
isSubTypeOf(VisitorState.memoize(generic(OPTIONAL, subOf(raw(OPTIONAL)))));
/** Instantiates a new {@link NestedOptionals} instance. */
public NestedOptionals() {}
@Override
public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
Type type = OPTIONAL_OF_OPTIONAL.get(state);
if (type == null || !state.getTypes().isSubtype(ASTHelpers.getType(tree), type)) {
return Description.NO_MATCH;
}
return describeMatch(tree);
return IS_OPTIONAL_OF_OPTIONAL.matches(tree, state)
? describeMatch(tree)
: Description.NO_MATCH;
}
}

View File

@@ -0,0 +1,63 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.errorprone.BugPattern.LinkType.CUSTOM;
import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
import static com.google.errorprone.BugPattern.StandardTags.FRAGILE_CODE;
import static com.google.errorprone.matchers.Matchers.typePredicateMatcher;
import static com.google.errorprone.predicates.TypePredicates.allOf;
import static com.google.errorprone.predicates.TypePredicates.not;
import static tech.picnic.errorprone.bugpatterns.util.Documentation.BUG_PATTERNS_BASE_URL;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypePredicates.hasTypeParameter;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypePredicates.isSubTypeOf;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.generic;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.raw;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.subOf;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.type;
import com.google.auto.service.AutoService;
import com.google.errorprone.BugPattern;
import com.google.errorprone.VisitorState;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.MethodInvocationTreeMatcher;
import com.google.errorprone.matchers.Description;
import com.google.errorprone.matchers.Matcher;
import com.google.errorprone.suppliers.Supplier;
import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.MethodInvocationTree;
import com.sun.tools.javac.code.Type;
/**
* A {@link BugChecker} that flags {@code Publisher<? extends Publisher>} instances, unless the
* nested {@link org.reactivestreams.Publisher} is a {@link reactor.core.publisher.GroupedFlux}.
*/
// XXX: See the `NestedOptionals` check for some ideas on how to generalize this kind of checker.
@AutoService(BugChecker.class)
@BugPattern(
summary =
"Avoid `Publisher`s that emit other `Publishers`s; "
+ "the resultant code is hard to reason about",
link = BUG_PATTERNS_BASE_URL + "NestedPublishers",
linkType = CUSTOM,
severity = WARNING,
tags = FRAGILE_CODE)
public final class NestedPublishers extends BugChecker implements MethodInvocationTreeMatcher {
private static final long serialVersionUID = 1L;
private static final Supplier<Type> PUBLISHER = type("org.reactivestreams.Publisher");
private static final Matcher<ExpressionTree> IS_NON_GROUPED_PUBLISHER_OF_PUBLISHERS =
typePredicateMatcher(
allOf(
isSubTypeOf(generic(PUBLISHER, subOf(raw(PUBLISHER)))),
not(
hasTypeParameter(
0, isSubTypeOf(raw(type("reactor.core.publisher.GroupedFlux")))))));
/** Instantiates a new {@link NestedPublishers} instance. */
public NestedPublishers() {}
@Override
public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
return IS_NON_GROUPED_PUBLISHER_OF_PUBLISHERS.matches(tree, state)
? describeMatch(tree)
: Description.NO_MATCH;
}
}

View File

@@ -1,94 +0,0 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.errorprone.BugPattern.LinkType.CUSTOM;
import static com.google.errorprone.BugPattern.SeverityLevel.ERROR;
import static com.google.errorprone.BugPattern.StandardTags.LIKELY_ERROR;
import static com.google.errorprone.matchers.ChildMultiMatcher.MatchType.AT_LEAST_ONE;
import static com.google.errorprone.matchers.Matchers.annotations;
import static com.google.errorprone.matchers.Matchers.hasAnnotation;
import static com.google.errorprone.matchers.Matchers.isType;
import static tech.picnic.errorprone.bugpatterns.util.Documentation.BUG_PATTERNS_BASE_URL;
import com.google.auto.common.AnnotationMirrors;
import com.google.auto.service.AutoService;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.errorprone.BugPattern;
import com.google.errorprone.VisitorState;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.MethodTreeMatcher;
import com.google.errorprone.fixes.SuggestedFix;
import com.google.errorprone.fixes.SuggestedFixes;
import com.google.errorprone.matchers.Description;
import com.google.errorprone.matchers.Matcher;
import com.google.errorprone.matchers.MultiMatcher;
import com.google.errorprone.util.ASTHelpers;
import com.sun.source.tree.AnnotationTree;
import com.sun.source.tree.MethodTree;
import com.sun.source.tree.Tree;
import tech.picnic.errorprone.bugpatterns.util.ThirdPartyLibrary;
/**
* A {@link BugChecker} that flags methods with Spring's {@code @Scheduled} annotation that lack New
* Relic Agent's {@code @Trace(dispatcher = true)}.
*/
@AutoService(BugChecker.class)
@BugPattern(
summary = "Scheduled operation must start a new New Relic transaction",
link = BUG_PATTERNS_BASE_URL + "ScheduledTransactionTrace",
linkType = CUSTOM,
severity = ERROR,
tags = LIKELY_ERROR)
public final class ScheduledTransactionTrace extends BugChecker implements MethodTreeMatcher {
private static final long serialVersionUID = 1L;
private static final String TRACE_ANNOTATION_FQCN = "com.newrelic.api.agent.Trace";
private static final Matcher<Tree> IS_SCHEDULED =
hasAnnotation("org.springframework.scheduling.annotation.Scheduled");
private static final MultiMatcher<Tree, AnnotationTree> TRACE_ANNOTATION =
annotations(AT_LEAST_ONE, isType(TRACE_ANNOTATION_FQCN));
/** Instantiates a new {@link ScheduledTransactionTrace} instance. */
public ScheduledTransactionTrace() {}
@Override
public Description matchMethod(MethodTree tree, VisitorState state) {
if (!ThirdPartyLibrary.NEW_RELIC_AGENT_API.isIntroductionAllowed(state)
|| !IS_SCHEDULED.matches(tree, state)) {
return Description.NO_MATCH;
}
ImmutableList<AnnotationTree> traceAnnotations =
TRACE_ANNOTATION.multiMatchResult(tree, state).matchingNodes();
if (traceAnnotations.isEmpty()) {
/* This method completely lacks the `@Trace` annotation; add it. */
return describeMatch(
tree,
SuggestedFix.builder()
.addImport(TRACE_ANNOTATION_FQCN)
.prefixWith(tree, "@Trace(dispatcher = true)")
.build());
}
AnnotationTree traceAnnotation = Iterables.getOnlyElement(traceAnnotations);
if (isCorrectAnnotation(traceAnnotation)) {
return Description.NO_MATCH;
}
/*
* The `@Trace` annotation is present but does not specify `dispatcher = true`. Add or update
* the `dispatcher` annotation element.
*/
return describeMatch(
traceAnnotation,
SuggestedFixes.updateAnnotationArgumentValues(
traceAnnotation, state, "dispatcher", ImmutableList.of("true"))
.build());
}
private static boolean isCorrectAnnotation(AnnotationTree traceAnnotation) {
return Boolean.TRUE.equals(
AnnotationMirrors.getAnnotationValue(
ASTHelpers.getAnnotationMirror(traceAnnotation), "dispatcher")
.getValue());
}
}

View File

@@ -155,6 +155,7 @@ public final class StaticImport extends BugChecker implements MemberSelectTreeMa
@VisibleForTesting
static final ImmutableSetMultimap<String, String> STATIC_IMPORT_EXEMPTED_MEMBERS =
ImmutableSetMultimap.<String, String>builder()
.put("com.google.common.base.Predicates", "contains")
.put("com.mongodb.client.model.Filters", "empty")
.putAll(
"java.util.Collections",

View File

@@ -16,10 +16,7 @@ public final class Flags {
* provided, or if the flag's value is the empty string.
*/
public static ImmutableList<String> getList(ErrorProneFlags errorProneFlags, String name) {
return errorProneFlags
.getList(name)
.map(ImmutableList::copyOf)
.filter(flags -> !flags.equals(ImmutableList.of("")))
.orElseGet(ImmutableList::of);
ImmutableList<String> list = errorProneFlags.getListOrEmpty(name);
return list.equals(ImmutableList.of("")) ? ImmutableList.of() : list;
}
}

View File

@@ -17,6 +17,7 @@ public final class JavaKeywords {
*/
private static final ImmutableSet<String> BOOLEAN_AND_NULL_LITERALS =
ImmutableSet.of("true", "false", "null");
/**
* List of all reserved keywords in the Java language.
*
@@ -76,6 +77,7 @@ public final class JavaKeywords {
"void",
"volatile",
"while");
/**
* List of all contextual keywords in the Java language.
*
@@ -100,6 +102,7 @@ public final class JavaKeywords {
"var",
"with",
"yield");
/** List of all keywords in the Java language. */
private static final ImmutableSet<String> ALL_KEYWORDS =
Sets.union(RESERVED_KEYWORDS, CONTEXTUAL_KEYWORDS).immutableCopy();

View File

@@ -18,6 +18,7 @@ import java.util.regex.Pattern;
public final class MethodMatcherFactory {
private static final Splitter ARGUMENT_TYPE_SPLITTER =
Splitter.on(',').trimResults().omitEmptyStrings();
// XXX: Check whether we can use a parser for "standard" Java signatures here. Maybe
// `sun.reflect.generics.parser.SignatureParser`?
@SuppressWarnings("java:S5998" /* In practice there will be only modest recursion. */)

View File

@@ -34,6 +34,7 @@ public final class MoreJUnitMatchers {
anyOf(
isType("org.junit.jupiter.api.Test"),
hasMetaAnnotation("org.junit.jupiter.api.TestTemplate")));
/** Matches JUnit Jupiter setup and teardown methods. */
public static final MultiMatcher<MethodTree, AnnotationTree> SETUP_OR_TEARDOWN_METHOD =
annotations(
@@ -43,6 +44,7 @@ public final class MoreJUnitMatchers {
isType("org.junit.jupiter.api.AfterEach"),
isType("org.junit.jupiter.api.BeforeAll"),
isType("org.junit.jupiter.api.BeforeEach")));
/**
* Matches methods that have a {@link org.junit.jupiter.params.provider.MethodSource} annotation.
*/

View File

@@ -1,11 +1,14 @@
package tech.picnic.errorprone.bugpatterns.util;
import static com.google.errorprone.matchers.Matchers.typePredicateMatcher;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypePredicates.hasAnnotation;
import com.google.errorprone.matchers.Matcher;
import com.google.errorprone.matchers.Matchers;
import com.google.errorprone.predicates.TypePredicate;
import com.google.errorprone.util.ASTHelpers;
import com.google.errorprone.suppliers.Supplier;
import com.sun.source.tree.AnnotationTree;
import com.sun.tools.javac.code.Symbol;
import com.sun.source.tree.Tree;
import com.sun.tools.javac.code.Type;
/**
* A collection of general-purpose {@link Matcher}s.
@@ -25,15 +28,21 @@ public final class MoreMatchers {
* @return A {@link Matcher} that matches trees with the specified meta-annotation.
*/
public static <T extends AnnotationTree> Matcher<T> hasMetaAnnotation(String annotationType) {
TypePredicate typePredicate = hasAnnotation(annotationType);
return (tree, state) -> {
Symbol sym = ASTHelpers.getSymbol(tree);
return sym != null && typePredicate.apply(sym.type, state);
};
return typePredicateMatcher(hasAnnotation(annotationType));
}
// XXX: Consider moving to a `MoreTypePredicates` utility class.
private static TypePredicate hasAnnotation(String annotationClassName) {
return (type, state) -> ASTHelpers.hasAnnotation(type.tsym, annotationClassName, state);
/**
* Returns a {@link Matcher} that determines whether the type of a given {@link Tree} is a subtype
* of the type returned by the specified {@link Supplier}.
*
* <p>This method differs from {@link Matchers#isSubtypeOf(Supplier)} in that it does not perform
* type erasure.
*
* @param <T> The type of tree to match against.
* @param type The {@link Supplier} that returns the type to match against.
* @return A {@link Matcher} that matches trees with the specified type.
*/
public static <T extends Tree> Matcher<T> isSubTypeOf(Supplier<Type> type) {
return typePredicateMatcher(MoreTypePredicates.isSubTypeOf(type));
}
}

View File

@@ -0,0 +1,63 @@
package tech.picnic.errorprone.bugpatterns.util;
import com.google.errorprone.VisitorState;
import com.google.errorprone.predicates.TypePredicate;
import com.google.errorprone.predicates.TypePredicates;
import com.google.errorprone.suppliers.Supplier;
import com.google.errorprone.util.ASTHelpers;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.util.List;
/**
* A collection of general-purpose {@link TypePredicate}s.
*
* <p>These methods are additions to the ones found in {@link TypePredicates}.
*/
// XXX: The methods in this class are tested only indirectly. Consider adding a dedicated test
// class, or make sure that each method is explicitly covered by a tested analog in `MoreMatchers`.
public final class MoreTypePredicates {
private MoreTypePredicates() {}
/**
* Returns a {@link TypePredicate} that matches types that are annotated with the indicated
* annotation type.
*
* @param annotationType The fully-qualified name of the annotation type.
* @return A {@link TypePredicate} that matches appropriate types.
*/
public static TypePredicate hasAnnotation(String annotationType) {
return (type, state) -> ASTHelpers.hasAnnotation(type.tsym, annotationType, state);
}
/**
* Returns a {@link TypePredicate} that matches subtypes of the type returned by the specified
* {@link Supplier}.
*
* @implNote This method does not use {@link ASTHelpers#isSubtype(Type, Type, VisitorState)}, as
* that method performs type erasure.
* @param bound The {@link Supplier} that returns the type to match against.
* @return A {@link TypePredicate} that matches appropriate subtypes.
*/
public static TypePredicate isSubTypeOf(Supplier<Type> bound) {
Supplier<Type> memoizedType = VisitorState.memoize(bound);
return (type, state) -> {
Type boundType = memoizedType.get(state);
return boundType != null && state.getTypes().isSubtype(type, boundType);
};
}
/**
* Returns a {@link TypePredicate} that matches generic types with a type parameter that matches
* the specified {@link TypePredicate} at the indicated index.
*
* @param index The index of the type parameter to match against.
* @param predicate The {@link TypePredicate} to match against the type parameter.
* @return A {@link TypePredicate} that matches appropriate generic types.
*/
public static TypePredicate hasTypeParameter(int index, TypePredicate predicate) {
return (type, state) -> {
List<Type> typeArguments = type.getTypeArguments();
return typeArguments.size() > index && predicate.apply(typeArguments.get(index), state);
};
}
}

View File

@@ -4,7 +4,10 @@ import com.google.errorprone.VisitorState;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.suppliers.Supplier;
import com.sun.tools.javac.code.ClassFinder;
import com.sun.tools.javac.code.Source;
import com.sun.tools.javac.code.Symbol.CompletionFailure;
import com.sun.tools.javac.code.Symbol.ModuleSymbol;
import com.sun.tools.javac.code.Symtab;
import com.sun.tools.javac.util.Name;
/**
@@ -29,13 +32,6 @@ public enum ThirdPartyLibrary {
* @see <a href="https://github.com/google/guava">Guava on GitHub</a>
*/
GUAVA("com.google.common.collect.ImmutableList"),
/**
* New Relic's Java agent API.
*
* @see <a href="https://github.com/newrelic/newrelic-java-agent/tree/main/newrelic-api">New Relic
* Java agent API on GitHub</a>
*/
NEW_RELIC_AGENT_API("com.newrelic.api.agent.Agent"),
/**
* VMWare's Project Reactor.
*
@@ -86,9 +82,15 @@ public enum ThirdPartyLibrary {
private static boolean canLoadClass(String className, VisitorState state) {
ClassFinder classFinder = ClassFinder.instance(state.context);
Symtab symtab = state.getSymtab();
// XXX: Drop support for targeting Java 8 once the oldest supported JDK drops such support.
ModuleSymbol module =
Source.instance(state.context).compareTo(Source.JDK9) < 0
? symtab.noModule
: symtab.unnamedModule;
Name binaryName = state.binaryNameFromClassname(className);
try {
classFinder.loadClass(state.getSymtab().unnamedModule, binaryName);
classFinder.loadClass(module, binaryName);
return true;
} catch (
@SuppressWarnings("java:S1166" /* Not exceptional. */)

View File

@@ -103,8 +103,7 @@ final class AssortedRules {
}
@AfterTemplate
@Nullable
T after(Iterator<T> iterator, T defaultValue) {
@Nullable T after(Iterator<T> iterator, T defaultValue) {
return Iterators.getNext(iterator, defaultValue);
}
}

View File

@@ -0,0 +1,65 @@
package tech.picnic.errorprone.refasterrules;
import com.google.errorprone.refaster.Refaster;
import com.google.errorprone.refaster.annotation.AfterTemplate;
import com.google.errorprone.refaster.annotation.BeforeTemplate;
import java.util.function.Predicate;
import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation;
/** Refaster rules related to expressions dealing with classes. */
@OnlineDocumentation
final class ClassRules {
private ClassRules() {}
/** Prefer {@link Class#isInstance(Object)} over more contrived alternatives. */
static final class ClassIsInstance<T, S> {
@BeforeTemplate
boolean before(Class<T> clazz, S object) {
return clazz.isAssignableFrom(object.getClass());
}
@AfterTemplate
boolean after(Class<T> clazz, S object) {
return clazz.isInstance(object);
}
}
/** Prefer using the {@code instanceof} keyword over less idiomatic alternatives. */
static final class Instanceof<T, S> {
@BeforeTemplate
boolean before(S object) {
return Refaster.<T>clazz().isInstance(object);
}
@AfterTemplate
boolean after(S object) {
return Refaster.<T>isInstance(object);
}
}
/** Prefer {@link Class#isInstance(Object)} method references over more verbose alternatives. */
static final class ClassLiteralIsInstancePredicate<T, S> {
@BeforeTemplate
Predicate<S> before() {
return o -> Refaster.<T>isInstance(o);
}
@AfterTemplate
Predicate<S> after() {
return Refaster.<T>clazz()::isInstance;
}
}
/** Prefer {@link Class#isInstance(Object)} method references over more verbose alternatives. */
static final class ClassReferenceIsInstancePredicate<T, S> {
@BeforeTemplate
Predicate<S> before(Class<T> clazz) {
return o -> clazz.isInstance(o);
}
@AfterTemplate
Predicate<S> after(Class<T> clazz) {
return clazz::isInstance;
}
}
}

View File

@@ -74,6 +74,19 @@ final class CollectionRules {
}
}
/** Prefer {@link Collection#contains(Object)} over more contrived alternatives. */
static final class CollectionContains<T, S> {
@BeforeTemplate
boolean before(Collection<T> collection, S value) {
return collection.stream().anyMatch(value::equals);
}
@AfterTemplate
boolean after(Collection<T> collection, S value) {
return collection.contains(value);
}
}
/**
* Don't call {@link Iterables#addAll(Collection, Iterable)} when the elements to be added are
* already part of a {@link Collection}.
@@ -164,6 +177,8 @@ final class CollectionRules {
}
/** Prefer {@link ArrayList#ArrayList(Collection)} over the Guava alternative. */
@SuppressWarnings(
"NonApiType" /* Matching against `List` would unnecessarily constrain the rule. */)
static final class NewArrayListFromCollection<T> {
@BeforeTemplate
ArrayList<T> before(Collection<T> collection) {

View File

@@ -277,4 +277,16 @@ final class DoubleStreamRules {
return stream.allMatch(e -> test(e));
}
}
static final class DoubleStreamTakeWhile {
@BeforeTemplate
DoubleStream before(DoubleStream stream, DoublePredicate predicate) {
return stream.takeWhile(predicate).filter(predicate);
}
@AfterTemplate
DoubleStream after(DoubleStream stream, DoublePredicate predicate) {
return stream.takeWhile(predicate);
}
}
}

View File

@@ -1,11 +1,16 @@
package tech.picnic.errorprone.refasterrules;
import static java.util.function.Predicate.not;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
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 com.google.errorprone.refaster.annotation.MayOptionallyUse;
import com.google.errorprone.refaster.annotation.Placeholder;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation;
@@ -131,4 +136,62 @@ final class EqualityRules {
return a == b;
}
}
/**
* Don't pass a lambda expression to {@link Predicate#not(Predicate)}; instead push the negation
* into the lambda expression.
*/
abstract static class PredicateLambda<T> {
@Placeholder(allowsIdentity = true)
abstract boolean predicate(@MayOptionallyUse T value);
@BeforeTemplate
Predicate<T> before() {
return not(v -> predicate(v));
}
@AfterTemplate
Predicate<T> after() {
return v -> !predicate(v);
}
}
/** Avoid contrived ways of handling {@code null} values during equality testing. */
static final class EqualsLhsNullable<T, S> {
@BeforeTemplate
boolean before(T value1, S value2) {
return Optional.ofNullable(value1).equals(Optional.of(value2));
}
@AfterTemplate
boolean after(T value1, S value2) {
return value2.equals(value1);
}
}
/** Avoid contrived ways of handling {@code null} values during equality testing. */
static final class EqualsRhsNullable<T, S> {
@BeforeTemplate
boolean before(T value1, S value2) {
return Optional.of(value1).equals(Optional.ofNullable(value2));
}
@AfterTemplate
boolean after(T value1, S value2) {
return value1.equals(value2);
}
}
/** Avoid contrived ways of handling {@code null} values during equality testing. */
static final class EqualsLhsAndRhsNullable<T, S> {
@BeforeTemplate
boolean before(T value1, S value2) {
return Optional.ofNullable(value1).equals(Optional.ofNullable(value2));
}
@AfterTemplate
boolean after(T value1, S value2) {
return Objects.equals(value1, value2);
}
}
}

View File

@@ -0,0 +1,43 @@
package tech.picnic.errorprone.refasterrules;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.errorprone.refaster.annotation.AfterTemplate;
import com.google.errorprone.refaster.annotation.BeforeTemplate;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation;
/** Refaster rules related to expressions dealing with files. */
@OnlineDocumentation
final class FileRules {
private FileRules() {}
/** Prefer {@link Files#readString(Path, Charset)} over more contrived alternatives. */
static final class FilesReadStringWithCharset {
@BeforeTemplate
String before(Path path, Charset charset) throws IOException {
return new String(Files.readAllBytes(path), charset);
}
@AfterTemplate
String after(Path path, Charset charset) throws IOException {
return Files.readString(path, charset);
}
}
/** Prefer {@link Files#readString(Path)} over more verbose alternatives. */
static final class FilesReadString {
@BeforeTemplate
String before(Path path) throws IOException {
return Files.readString(path, UTF_8);
}
@AfterTemplate
String after(Path path) throws IOException {
return Files.readString(path);
}
}
}

View File

@@ -290,4 +290,16 @@ final class IntStreamRules {
return stream.allMatch(e -> test(e));
}
}
static final class IntStreamTakeWhile {
@BeforeTemplate
IntStream before(IntStream stream, IntPredicate predicate) {
return stream.takeWhile(predicate).filter(predicate);
}
@AfterTemplate
IntStream after(IntStream stream, IntPredicate predicate) {
return stream.takeWhile(predicate);
}
}
}

View File

@@ -290,4 +290,16 @@ final class LongStreamRules {
return stream.allMatch(e -> test(e));
}
}
static final class LongStreamTakeWhile {
@BeforeTemplate
LongStream before(LongStream stream, LongPredicate predicate) {
return stream.takeWhile(predicate).filter(predicate);
}
@AfterTemplate
LongStream after(LongStream stream, LongPredicate predicate) {
return stream.takeWhile(predicate);
}
}
}

View File

@@ -33,14 +33,12 @@ final class MapRules {
static final class MapGetOrNull<K, V, T> {
@BeforeTemplate
@Nullable
V before(Map<K, V> map, T key) {
@Nullable V before(Map<K, V> map, T key) {
return map.getOrDefault(key, null);
}
@AfterTemplate
@Nullable
V after(Map<K, V> map, T key) {
@Nullable V after(Map<K, V> map, T key) {
return map.get(key);
}
}

View File

@@ -5,10 +5,12 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import com.google.errorprone.refaster.Refaster;
import com.google.errorprone.refaster.annotation.AfterTemplate;
import com.google.errorprone.refaster.annotation.BeforeTemplate;
import com.google.errorprone.refaster.annotation.UseImportPolicy;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.verification.VerificationMode;
import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation;
@@ -50,4 +52,30 @@ final class MockitoRules {
return verify(mock);
}
}
static final class InvocationOnMockGetArguments {
@BeforeTemplate
Object before(InvocationOnMock invocation, int i) {
return invocation.getArguments()[i];
}
@AfterTemplate
Object after(InvocationOnMock invocation, int i) {
return invocation.getArgument(i);
}
}
static final class InvocationOnMockGetArgumentsWithTypeParameter<T> {
@BeforeTemplate
@SuppressWarnings("unchecked")
T before(InvocationOnMock invocation, int i) {
return Refaster.anyOf(
invocation.getArgument(i, Refaster.<T>clazz()), (T) invocation.getArgument(i));
}
@AfterTemplate
T after(InvocationOnMock invocation, int i) {
return invocation.<T>getArgument(i);
}
}
}

View File

@@ -50,8 +50,7 @@ final class MultimapRules {
*/
static final class MultimapGet<K, V> {
@BeforeTemplate
@Nullable
Collection<V> before(Multimap<K, V> multimap, K key) {
@Nullable Collection<V> before(Multimap<K, V> multimap, K key) {
return Refaster.anyOf(multimap.asMap(), Multimaps.asMap(multimap)).get(key);
}

View File

@@ -8,6 +8,7 @@ import com.google.errorprone.refaster.Refaster;
import com.google.errorprone.refaster.annotation.AfterTemplate;
import com.google.errorprone.refaster.annotation.BeforeTemplate;
import com.google.errorprone.refaster.annotation.MayOptionallyUse;
import com.google.errorprone.refaster.annotation.NotMatches;
import com.google.errorprone.refaster.annotation.Placeholder;
import com.google.errorprone.refaster.annotation.UseImportPolicy;
import java.util.Comparator;
@@ -19,6 +20,7 @@ import java.util.function.Supplier;
import java.util.stream.Stream;
import org.jspecify.annotations.Nullable;
import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation;
import tech.picnic.errorprone.refaster.matchers.IsLikelyTrivialComputation;
/** Refaster rules related to expressions dealing with {@link Optional}s. */
@OnlineDocumentation
@@ -98,6 +100,20 @@ final class OptionalRules {
}
}
/** Prefer {@link Optional#equals(Object)} over more contrived alternatives. */
static final class OptionalEqualsOptional<T, S> {
@BeforeTemplate
boolean before(Optional<T> optional, S value) {
return Refaster.anyOf(
optional.filter(value::equals).isPresent(), optional.stream().anyMatch(value::equals));
}
@AfterTemplate
boolean after(Optional<T> optional, S value) {
return optional.equals(Optional.of(value));
}
}
/**
* Don't use the ternary operator to extract the first element of a possibly-empty {@link
* Iterator} as an {@link Optional}.
@@ -118,7 +134,7 @@ final class OptionalRules {
/** Prefer {@link Optional#filter(Predicate)} over usage of the ternary operator. */
// XXX: This rule may introduce a compilation error: the `test` expression may reference a
// non-effectively final variable, which is not allowed in the replacement lambda expression.
// Maybe our `Refaster` checker should test `compilesWithFix`?
// Review whether a `@Matcher` can be used to avoid this.
abstract static class TernaryOperatorOptionalPositiveFiltering<T> {
@Placeholder
abstract boolean test(T value);
@@ -138,7 +154,7 @@ final class OptionalRules {
/** Prefer {@link Optional#filter(Predicate)} over usage of the ternary operator. */
// XXX: This rule may introduce a compilation error: the `test` expression may reference a
// non-effectively final variable, which is not allowed in the replacement lambda expression.
// Maybe our `Refaster` checker should test `compilesWithFix`?
// Review whether a `@Matcher` can be used to avoid this.
abstract static class TernaryOperatorOptionalNegativeFiltering<T> {
@Placeholder
abstract boolean test(T value);
@@ -161,6 +177,7 @@ final class OptionalRules {
*/
static final class MapOptionalToBoolean<T> {
@BeforeTemplate
@SuppressWarnings("OptionalOrElseGet" /* Rule is confused by `Refaster#anyOf` usage. */)
boolean before(Optional<T> optional, Function<? super T, Boolean> predicate) {
return optional.map(predicate).orElse(Refaster.anyOf(false, Boolean.FALSE));
}
@@ -224,6 +241,28 @@ final class OptionalRules {
}
}
/**
* Prefer {@link Optional#orElseGet(Supplier)} over {@link Optional#orElse(Object)} if the
* fallback value is not the result of a trivial computation.
*/
// XXX: This rule may introduce a compilation error: the `value` expression may reference a
// non-effectively final variable, which is not allowed in the replacement lambda expression.
// Review whether a `@Matcher` can be used to avoid this.
// XXX: Once `MethodReferenceUsage` is "production ready", replace
// `@NotMatches(IsLikelyTrivialComputation.class)` with `@Matches(RequiresComputation.class)` (and
// reimplement the matcher accordingly).
static final class OptionalOrElseGet<T> {
@BeforeTemplate
T before(Optional<T> optional, @NotMatches(IsLikelyTrivialComputation.class) T value) {
return optional.orElse(value);
}
@AfterTemplate
T after(Optional<T> optional, T value) {
return optional.orElseGet(() -> value);
}
}
/**
* Flatten a stream of {@link Optional}s using {@link Optional#stream()}, rather than using one of
* the more verbose alternatives.
@@ -325,10 +364,14 @@ final class OptionalRules {
Optional<T> before(Optional<T> optional1, Optional<T> optional2) {
// XXX: Note that rewriting the first and third variant will change the code's behavior if
// `optional2` has side-effects.
// XXX: Note that rewriting the first, third and fourth variant will introduce a compilation
// error if `optional2` is not effectively final. Review whether a `@Matcher` can be used to
// avoid this.
return Refaster.anyOf(
optional1.map(Optional::of).orElse(optional2),
optional1.map(Optional::of).orElseGet(() -> optional2),
Stream.of(optional1, optional2).flatMap(Optional::stream).findFirst());
Stream.of(optional1, optional2).flatMap(Optional::stream).findFirst(),
optional1.isPresent() ? optional1 : optional2);
}
@AfterTemplate
@@ -394,12 +437,22 @@ final class OptionalRules {
}
}
// XXX: Add a rule for:
// `optional.flatMap(x -> pred(x) ? Optional.empty() : Optional.of(x))` and variants.
// (Maybe canonicalize the inner expression. Maybe we rewrite already.)
/** Prefer {@link Optional#stream()} over more contrived alternatives. */
static final class OptionalStream<T> {
@BeforeTemplate
Stream<T> before(Optional<T> optional) {
return Refaster.anyOf(
optional.map(Stream::of).orElse(Stream.empty()),
optional.map(Stream::of).orElseGet(Stream::empty));
}
@AfterTemplate
Stream<T> after(Optional<T> optional) {
return optional.stream();
}
}
// XXX: Add a rule for:
// `optional.map(Stream::of).orElse(Stream.empty())`
// `optional.map(Stream::of).orElseGet(Stream::empty)`
// -> `optional.stream()`
// `optional.flatMap(x -> pred(x) ? Optional.empty() : Optional.of(x))` and variants.
// (Maybe canonicalize the inner expression. Maybe we rewrite it already.)
}

View File

@@ -0,0 +1,46 @@
package tech.picnic.errorprone.refasterrules;
import static com.google.common.base.Predicates.containsPattern;
import com.google.common.base.Predicates;
import com.google.errorprone.refaster.annotation.AfterTemplate;
import com.google.errorprone.refaster.annotation.BeforeTemplate;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation;
/** Refaster rules related to code dealing with regular expressions. */
@OnlineDocumentation
final class PatternRules {
private PatternRules() {}
/** Prefer {@link Pattern#asPredicate()} over non-JDK alternatives. */
// XXX: This rule could also replace `s -> pattern.matcher(s).find()`, though the lambda
// expression may match functional interfaces other than `Predicate`. If we do add such a rule, we
// should also add a rule that replaces `s -> pattern.matcher(s).matches()` with
// `pattern.asMatchPredicate()`.
static final class PatternAsPredicate {
@BeforeTemplate
Predicate<CharSequence> before(Pattern pattern) {
return Predicates.contains(pattern);
}
@AfterTemplate
Predicate<String> after(Pattern pattern) {
return pattern.asPredicate();
}
}
/** Prefer {@link Pattern#asPredicate()} over non-JDK alternatives. */
static final class PatternCompileAsPredicate {
@BeforeTemplate
Predicate<CharSequence> before(String pattern) {
return containsPattern(pattern);
}
@AfterTemplate
Predicate<String> after(String pattern) {
return Pattern.compile(pattern).asPredicate();
}
}
}

View File

@@ -247,11 +247,43 @@ final class ReactorRules {
}
}
/** Prefer {@link Flux#zipWithIterable(Iterable)} over more contrived alternatives. */
static final class FluxZipWithIterable<T, S> {
@BeforeTemplate
Flux<Tuple2<T, S>> before(Flux<T> flux, Iterable<S> iterable) {
return Flux.zip(flux, Flux.fromIterable(iterable));
}
@AfterTemplate
Flux<Tuple2<T, S>> after(Flux<T> flux, Iterable<S> iterable) {
return flux.zipWithIterable(iterable);
}
}
/** Prefer {@link Flux#zipWithIterable(Iterable, BiFunction)} over more contrived alternatives. */
static final class FluxZipWithIterableBiFunction<T, S, R> {
@BeforeTemplate
Flux<R> before(
Flux<T> flux,
Iterable<S> iterable,
BiFunction<? super T, ? super S, ? extends R> function) {
return flux.zipWith(Flux.fromIterable(iterable), function);
}
@AfterTemplate
Flux<R> after(
Flux<T> flux,
Iterable<S> iterable,
BiFunction<? super T, ? super S, ? extends R> function) {
return flux.zipWithIterable(iterable, function);
}
}
/**
* Prefer {@link Flux#zipWithIterable(Iterable)} with a chained combinator over {@link
* Flux#zipWithIterable(Iterable, BiFunction)}, as the former generally yields more readable code.
*/
static final class FluxZipWithIterable<T, S, R> {
static final class FluxZipWithIterableMapFunction<T, S, R> {
@BeforeTemplate
Flux<R> before(Flux<T> flux, Iterable<S> iterable, BiFunction<T, S, R> combinator) {
return flux.zipWithIterable(iterable, combinator);
@@ -328,7 +360,10 @@ final class ReactorRules {
static final class MonoThenReturn<T, S> {
@BeforeTemplate
Mono<S> before(Mono<T> mono, S object) {
return mono.then(Mono.just(object));
return Refaster.anyOf(
mono.ignoreElement().thenReturn(object),
mono.then().thenReturn(object),
mono.then(Mono.just(object)));
}
@AfterTemplate
@@ -391,6 +426,74 @@ final class ReactorRules {
}
}
/** Prefer {@link Flux#empty()} over more contrived alternatives. */
// XXX: In combination with the `IsEmpty` matcher introduced by
// https://github.com/PicnicSupermarket/error-prone-support/pull/744, the non-varargs overloads of
// most methods referenced here can be rewritten as well. Additionally, some invocations of
// methods such as `Flux#fromIterable`, `Flux#fromArray` and `Flux#justOrEmpty` can also be
// rewritten.
static final class FluxEmpty<T, S extends Comparable<? super S>> {
@BeforeTemplate
Flux<T> before(
int prefetch,
Function<? super Object[], ? extends T> combinator,
Comparator<? super T> comparator) {
return Refaster.anyOf(
Flux.concat(),
Flux.concatDelayError(),
Flux.firstWithSignal(),
Flux.just(),
Flux.merge(),
Flux.merge(prefetch),
Flux.mergeComparing(comparator),
Flux.mergeComparing(prefetch, comparator),
Flux.mergeComparingDelayError(prefetch, comparator),
Flux.mergeDelayError(prefetch),
Flux.mergePriority(comparator),
Flux.mergePriority(prefetch, comparator),
Flux.mergePriorityDelayError(prefetch, comparator),
Flux.mergeSequential(),
Flux.mergeSequential(prefetch),
Flux.mergeSequentialDelayError(prefetch),
Flux.zip(combinator),
Flux.zip(combinator, prefetch));
}
@BeforeTemplate
Flux<T> before(int prefetch, Function<Object[], T> combinator) {
return Refaster.anyOf(
Flux.combineLatest(combinator), Flux.combineLatest(combinator, prefetch));
}
@BeforeTemplate
Flux<S> before() {
return Refaster.anyOf(Flux.mergeComparing(), Flux.mergePriority());
}
@BeforeTemplate
Flux<Integer> before(int start) {
return Flux.range(start, 0);
}
@AfterTemplate
Flux<T> after() {
return Flux.empty();
}
}
/** Prefer {@link Flux#just(Object)} over more contrived alternatives. */
static final class FluxJust {
@BeforeTemplate
Flux<Integer> before(int start) {
return Flux.range(start, 1);
}
@AfterTemplate
Flux<Integer> after(int start) {
return Flux.just(start);
}
}
/** Don't unnecessarily transform a {@link Mono} to an equivalent instance. */
static final class MonoIdentity<T> {
@BeforeTemplate
@@ -401,7 +504,7 @@ final class ReactorRules {
@BeforeTemplate
Mono<@Nullable Void> before2(Mono<@Nullable Void> mono) {
return mono.then();
return Refaster.anyOf(mono.ignoreElement(), mono.then());
}
// XXX: Replace this rule with an extension of the `IdentityConversion` rule, supporting
@@ -418,6 +521,19 @@ final class ReactorRules {
}
}
/** Don't unnecessarily transform a {@link Mono} to a {@link Flux} to expect exactly one item. */
static final class MonoSingle<T> {
@BeforeTemplate
Mono<T> before(Mono<T> mono) {
return mono.flux().single();
}
@AfterTemplate
Mono<T> after(Mono<T> mono) {
return mono.single();
}
}
/** Don't unnecessarily pass an empty publisher to {@link Flux#switchIfEmpty(Publisher)}. */
static final class FluxSwitchIfEmptyOfEmptyPublisher<T> {
@BeforeTemplate
@@ -435,6 +551,7 @@ final class ReactorRules {
/** Prefer {@link Flux#concatMap(Function)} over more contrived alternatives. */
static final class FluxConcatMap<T, S> {
@BeforeTemplate
@SuppressWarnings("NestedPublishers")
Flux<S> before(Flux<T> flux, Function<? super T, ? extends Publisher<? extends S>> function) {
return Refaster.anyOf(
flux.flatMap(function, 1),
@@ -451,6 +568,7 @@ final class ReactorRules {
/** Prefer {@link Flux#concatMap(Function, int)} over more contrived alternatives. */
static final class FluxConcatMapWithPrefetch<T, S> {
@BeforeTemplate
@SuppressWarnings("NestedPublishers")
Flux<S> before(
Flux<T> flux,
Function<? super T, ? extends Publisher<? extends S>> function,
@@ -470,14 +588,46 @@ final class ReactorRules {
}
}
/** Avoid contrived alternatives to {@link Mono#flatMapIterable(Function)}. */
static final class MonoFlatMapIterable<T, S> {
@BeforeTemplate
Flux<S> before(Mono<T> mono, Function<? super T, ? extends Iterable<? extends S>> function) {
return Refaster.anyOf(
mono.map(function).flatMapIterable(identity()), mono.flux().concatMapIterable(function));
}
@AfterTemplate
Flux<S> after(Mono<T> mono, Function<? super T, ? extends Iterable<? extends S>> function) {
return mono.flatMapIterable(function);
}
}
/**
* Prefer {@link Flux#concatMapIterable(Function)} over {@link Flux#flatMapIterable(Function)}, as
* the former has equivalent semantics but a clearer name.
* Prefer {@link Mono#flatMapIterable(Function)} to flatten a {@link Mono} of some {@link
* Iterable} over less efficient alternatives.
*/
static final class MonoFlatMapIterableIdentity<T, S extends Iterable<T>> {
@BeforeTemplate
Flux<T> before(Mono<S> mono) {
return mono.flatMapMany(Flux::fromIterable);
}
@AfterTemplate
@UseImportPolicy(STATIC_IMPORT_ALWAYS)
Flux<T> after(Mono<S> mono) {
return mono.flatMapIterable(identity());
}
}
/**
* Prefer {@link Flux#concatMapIterable(Function)} over alternatives with less clear syntax or
* semantics.
*/
static final class FluxConcatMapIterable<T, S> {
@BeforeTemplate
Flux<S> before(Flux<T> flux, Function<? super T, ? extends Iterable<? extends S>> function) {
return flux.flatMapIterable(function);
return Refaster.anyOf(
flux.flatMapIterable(function), flux.map(function).concatMapIterable(identity()));
}
@AfterTemplate
@@ -487,14 +637,16 @@ final class ReactorRules {
}
/**
* Prefer {@link Flux#concatMapIterable(Function, int)} over {@link Flux#flatMapIterable(Function,
* int)}, as the former has equivalent semantics but a clearer name.
* Prefer {@link Flux#concatMapIterable(Function, int)} over alternatives with less clear syntax
* or semantics.
*/
static final class FluxConcatMapIterableWithPrefetch<T, S> {
@BeforeTemplate
Flux<S> before(
Flux<T> flux, Function<? super T, ? extends Iterable<? extends S>> function, int prefetch) {
return flux.flatMapIterable(function, prefetch);
return Refaster.anyOf(
flux.flatMapIterable(function, prefetch),
flux.map(function).concatMapIterable(identity(), prefetch));
}
@AfterTemplate
@@ -726,7 +878,7 @@ final class ReactorRules {
static final class MonoThen<T> {
@BeforeTemplate
Mono<@Nullable Void> before(Mono<T> mono) {
return mono.flux().then();
return Refaster.anyOf(mono.ignoreElement().then(), mono.flux().then());
}
@AfterTemplate
@@ -735,6 +887,128 @@ final class ReactorRules {
}
}
/** Avoid vacuous invocations of {@link Flux#ignoreElements()}. */
static final class FluxThen<T> {
@BeforeTemplate
Mono<@Nullable Void> before(Flux<T> flux) {
return flux.ignoreElements().then();
}
@BeforeTemplate
Mono<@Nullable Void> before2(Flux<@Nullable Void> flux) {
return flux.ignoreElements();
}
@AfterTemplate
Mono<@Nullable Void> after(Flux<T> flux) {
return flux.then();
}
}
/** Avoid vacuous invocations of {@link Mono#ignoreElement()}. */
static final class MonoThenEmpty<T> {
@BeforeTemplate
Mono<@Nullable Void> before(Mono<T> mono, Publisher<@Nullable Void> publisher) {
return mono.ignoreElement().thenEmpty(publisher);
}
@AfterTemplate
Mono<@Nullable Void> after(Mono<T> mono, Publisher<@Nullable Void> publisher) {
return mono.thenEmpty(publisher);
}
}
/** Avoid vacuous invocations of {@link Flux#ignoreElements()}. */
static final class FluxThenEmpty<T> {
@BeforeTemplate
Mono<@Nullable Void> before(Flux<T> flux, Publisher<@Nullable Void> publisher) {
return flux.ignoreElements().thenEmpty(publisher);
}
@AfterTemplate
Mono<@Nullable Void> after(Flux<T> flux, Publisher<@Nullable Void> publisher) {
return flux.thenEmpty(publisher);
}
}
/** Avoid vacuous invocations of {@link Mono#ignoreElement()}. */
static final class MonoThenMany<T, S> {
@BeforeTemplate
Flux<S> before(Mono<T> mono, Publisher<S> publisher) {
return mono.ignoreElement().thenMany(publisher);
}
@AfterTemplate
Flux<S> after(Mono<T> mono, Publisher<S> publisher) {
return mono.thenMany(publisher);
}
}
/**
* Prefer explicit invocation of {@link Mono#flux()} over implicit conversions from {@link Mono}
* to {@link Flux}.
*/
static final class MonoThenMonoFlux<T, S> {
@BeforeTemplate
Flux<S> before(Mono<T> mono1, Mono<S> mono2) {
return mono1.thenMany(mono2);
}
@AfterTemplate
Flux<S> after(Mono<T> mono1, Mono<S> mono2) {
return mono1.then(mono2).flux();
}
}
/** Avoid vacuous invocations of {@link Flux#ignoreElements()}. */
static final class FluxThenMany<T, S> {
@BeforeTemplate
Flux<S> before(Flux<T> flux, Publisher<S> publisher) {
return flux.ignoreElements().thenMany(publisher);
}
@AfterTemplate
Flux<S> after(Flux<T> flux, Publisher<S> publisher) {
return flux.thenMany(publisher);
}
}
/** Avoid vacuous invocations of {@link Mono#ignoreElement()}. */
static final class MonoThenMono<T, S> {
@BeforeTemplate
Mono<S> before(Mono<T> mono1, Mono<S> mono2) {
return mono1.ignoreElement().then(mono2);
}
@BeforeTemplate
Mono<@Nullable Void> before2(Mono<T> mono1, Mono<@Nullable Void> mono2) {
return mono1.thenEmpty(mono2);
}
@AfterTemplate
Mono<S> after(Mono<T> mono1, Mono<S> mono2) {
return mono1.then(mono2);
}
}
/** Avoid vacuous invocations of {@link Flux#ignoreElements()}. */
static final class FluxThenMono<T, S> {
@BeforeTemplate
Mono<S> before(Flux<T> flux, Mono<S> mono) {
return flux.ignoreElements().then(mono);
}
@BeforeTemplate
Mono<@Nullable Void> before2(Flux<T> flux, Mono<@Nullable Void> mono) {
return flux.thenEmpty(mono);
}
@AfterTemplate
Mono<S> after(Flux<T> flux, Mono<S> mono) {
return flux.then(mono);
}
}
/** Prefer {@link Mono#singleOptional()} over more contrived alternatives. */
// XXX: Consider creating a plugin that flags/discourages `Mono<Optional<T>>` method return
// types, just as we discourage nullable `Boolean`s and `Optional`s.
@@ -779,9 +1053,36 @@ final class ReactorRules {
}
}
/** Prefer {@link Mono#ofType(Class)} over more contrived alternatives. */
static final class MonoOfType<T, S> {
@BeforeTemplate
Mono<S> before(Mono<T> mono, Class<S> clazz) {
return mono.filter(clazz::isInstance).cast(clazz);
}
@AfterTemplate
Mono<S> after(Mono<T> mono, Class<S> clazz) {
return mono.ofType(clazz);
}
}
/** Prefer {@link Flux#ofType(Class)} over more contrived alternatives. */
static final class FluxOfType<T, S> {
@BeforeTemplate
Flux<S> before(Flux<T> flux, Class<S> clazz) {
return flux.filter(clazz::isInstance).cast(clazz);
}
@AfterTemplate
Flux<S> after(Flux<T> flux, Class<S> clazz) {
return flux.ofType(clazz);
}
}
/** Prefer {@link Mono#flatMap(Function)} over more contrived alternatives. */
static final class MonoFlatMap<S, T> {
@BeforeTemplate
@SuppressWarnings("NestedPublishers")
Mono<T> before(Mono<S> mono, Function<? super S, ? extends Mono<? extends T>> function) {
return mono.map(function).flatMap(identity());
}
@@ -795,8 +1096,31 @@ final class ReactorRules {
/** Prefer {@link Mono#flatMapMany(Function)} over more contrived alternatives. */
static final class MonoFlatMapMany<S, T> {
@BeforeTemplate
Flux<T> before(Mono<S> mono, Function<? super S, ? extends Publisher<? extends T>> function) {
return mono.map(function).flatMapMany(identity());
@SuppressWarnings("NestedPublishers")
Flux<T> before(
Mono<S> mono,
Function<? super S, ? extends Publisher<? extends T>> function,
boolean delayUntilEnd,
int maxConcurrency,
int prefetch) {
return Refaster.anyOf(
mono.map(function).flatMapMany(identity()),
mono.flux().concatMap(function),
mono.flux().concatMap(function, prefetch),
mono.flux().concatMapDelayError(function),
mono.flux().concatMapDelayError(function, prefetch),
mono.flux().concatMapDelayError(function, delayUntilEnd, prefetch),
mono.flux().flatMap(function, maxConcurrency),
mono.flux().flatMap(function, maxConcurrency, prefetch),
mono.flux().flatMapDelayError(function, maxConcurrency, prefetch),
mono.flux().flatMapSequential(function, maxConcurrency),
mono.flux().flatMapSequential(function, maxConcurrency, prefetch),
mono.flux().flatMapSequentialDelayError(function, maxConcurrency, prefetch));
}
@BeforeTemplate
Flux<T> before(Mono<S> mono, Function<? super S, Publisher<? extends T>> function) {
return mono.flux().switchMap(function);
}
@AfterTemplate
@@ -1180,6 +1504,22 @@ final class ReactorRules {
}
}
/**
* Do not unnecessarily {@link Flux#filter(Predicate) filter} the result of {@link
* Flux#takeWhile(Predicate)} using the same {@link Predicate}.
*/
static final class FluxTakeWhile<T> {
@BeforeTemplate
Flux<T> before(Flux<T> flux, Predicate<? super T> predicate) {
return flux.takeWhile(predicate).filter(predicate);
}
@AfterTemplate
Flux<T> after(Flux<T> flux, Predicate<? super T> predicate) {
return flux.takeWhile(predicate);
}
}
/**
* Prefer {@link Flux#collect(Collector)} with {@link ImmutableList#toImmutableList()} over
* alternatives that do not explicitly return an immutable collection.
@@ -1299,6 +1639,23 @@ final class ReactorRules {
}
}
/** Avoid list collection when verifying that a {@link Flux} emits exactly one value. */
// XXX: This rule assumes that the matched collector does not drop elements. Consider introducing
// a `@Matches(DoesNotDropElements.class)` or `@NotMatches(MayDropElements.class)` guard.
static final class FluxAsStepVerifierExpectNext<T, L extends List<T>> {
@BeforeTemplate
StepVerifier.Step<L> before(Flux<T> flux, Collector<? super T, ?, L> listCollector, T object) {
return flux.collect(listCollector)
.as(StepVerifier::create)
.assertNext(list -> assertThat(list).containsExactly(object));
}
@AfterTemplate
StepVerifier.Step<T> after(Flux<T> flux, T object) {
return flux.as(StepVerifier::create).expectNext(object);
}
}
/** Prefer {@link StepVerifier.LastStep#verifyComplete()} over more verbose alternatives. */
static final class StepVerifierLastStepVerifyComplete {
@BeforeTemplate
@@ -1331,6 +1688,7 @@ final class ReactorRules {
Duration before(StepVerifier.LastStep step, Class<T> clazz) {
return Refaster.anyOf(
step.expectError(clazz).verify(),
step.verifyErrorMatches(clazz::isInstance),
step.verifyErrorSatisfies(t -> assertThat(t).isInstanceOf(clazz)));
}

View File

@@ -20,6 +20,7 @@ import static java.util.stream.Collectors.summingDouble;
import static java.util.stream.Collectors.summingInt;
import static java.util.stream.Collectors.summingLong;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Streams;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.errorprone.refaster.Refaster;
@@ -45,6 +46,7 @@ import java.util.function.Predicate;
import java.util.function.ToDoubleFunction;
import java.util.function.ToIntFunction;
import java.util.function.ToLongFunction;
import java.util.function.UnaryOperator;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -639,4 +641,102 @@ final class StreamRules {
return Streams.concat(Refaster.asVarargs(stream));
}
}
static final class StreamTakeWhile<T> {
@BeforeTemplate
Stream<T> before(Stream<T> stream, Predicate<? super T> predicate) {
return stream.takeWhile(predicate).filter(predicate);
}
@AfterTemplate
Stream<T> after(Stream<T> stream, Predicate<? super T> predicate) {
return stream.takeWhile(predicate);
}
}
/**
* Prefer {@link Stream#iterate(Object, Predicate, UnaryOperator)} over more contrived
* alternatives.
*/
static final class StreamIterate<T> {
@BeforeTemplate
Stream<T> before(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next) {
return Stream.iterate(seed, next).takeWhile(hasNext);
}
@AfterTemplate
Stream<T> after(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next) {
return Stream.iterate(seed, hasNext, next);
}
}
/** Prefer {@link Stream#of(Object)} over more contrived alternatives. */
// XXX: Generalize this and similar rules using an Error Prone check.
static final class StreamOf1<T> {
@BeforeTemplate
Stream<T> before(T e1) {
return ImmutableList.of(e1).stream();
}
@AfterTemplate
Stream<T> after(T e1) {
return Stream.of(e1);
}
}
/** Prefer {@link Stream#of(Object[])} over more contrived alternatives. */
// XXX: Generalize this and similar rules using an Error Prone check.
static final class StreamOf2<T> {
@BeforeTemplate
Stream<T> before(T e1, T e2) {
return ImmutableList.of(e1, e2).stream();
}
@AfterTemplate
Stream<T> after(T e1, T e2) {
return Stream.of(e1, e2);
}
}
/** Prefer {@link Stream#of(Object[])} over more contrived alternatives. */
// XXX: Generalize this and similar rules using an Error Prone check.
static final class StreamOf3<T> {
@BeforeTemplate
Stream<T> before(T e1, T e2, T e3) {
return ImmutableList.of(e1, e2, e3).stream();
}
@AfterTemplate
Stream<T> after(T e1, T e2, T e3) {
return Stream.of(e1, e2, e3);
}
}
/** Prefer {@link Stream#of(Object[])} over more contrived alternatives. */
// XXX: Generalize this and similar rules using an Error Prone check.
static final class StreamOf4<T> {
@BeforeTemplate
Stream<T> before(T e1, T e2, T e3, T e4) {
return ImmutableList.of(e1, e2, e3, e4).stream();
}
@AfterTemplate
Stream<T> after(T e1, T e2, T e3, T e4) {
return Stream.of(e1, e2, e3, e4);
}
}
/** Prefer {@link Stream#of(Object[])} over more contrived alternatives. */
// XXX: Generalize this and similar rules using an Error Prone check.
static final class StreamOf5<T> {
@BeforeTemplate
Stream<T> before(T e1, T e2, T e3, T e4, T e5) {
return ImmutableList.of(e1, e2, e3, e4, e5).stream();
}
@AfterTemplate
Stream<T> after(T e1, T e2, T e3, T e4, T e5) {
return Stream.of(e1, e2, e3, e4, e5);
}
}
}

View File

@@ -1,7 +1,5 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.common.base.Predicates.containsPattern;
import com.google.errorprone.BugCheckerRefactoringTestHelper;
import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode;
import com.google.errorprone.CompilationTestHelper;
@@ -12,7 +10,7 @@ final class AmbiguousJsonCreatorTest {
void identification() {
CompilationTestHelper.newInstance(AmbiguousJsonCreator.class, getClass())
.expectErrorMessage(
"X", containsPattern("`JsonCreator.Mode` should be set for single-argument creators"))
"X", m -> m.contains("`JsonCreator.Mode` should be set for single-argument creators"))
.addSourceLines(
"Container.java",
"import com.fasterxml.jackson.annotation.JsonCreator;",

View File

@@ -1,8 +1,7 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode.TEXT_MATCH;
import com.google.errorprone.BugCheckerRefactoringTestHelper;
import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode;
import com.google.errorprone.CompilationTestHelper;
import org.junit.jupiter.api.Test;
@@ -54,6 +53,6 @@ final class AssertJIsNullTest {
" assertThat(\"foo\").isNull();",
" }",
"}")
.doTest(TEXT_MATCH);
.doTest(TestMode.TEXT_MATCH);
}
}

View File

@@ -1,14 +1,12 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.containsPattern;
import static com.google.common.base.Predicates.not;
import static com.google.errorprone.BugCheckerRefactoringTestHelper.FixChoosers.SECOND;
import static com.google.errorprone.BugCheckerRefactoringTestHelper.FixChoosers.THIRD;
import com.google.errorprone.BugCheckerRefactoringTestHelper;
import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode;
import com.google.errorprone.CompilationTestHelper;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.reactivestreams.Publisher;
import reactor.core.CorePublisher;
@@ -20,10 +18,7 @@ final class FluxImplicitBlockTest {
CompilationTestHelper.newInstance(FluxImplicitBlock.class, getClass())
.expectErrorMessage(
"X",
and(
containsPattern("SuppressWarnings"),
containsPattern("toImmutableList"),
containsPattern("toList")))
m -> Stream.of("SuppressWarnings", "toImmutableList", "toList").allMatch(m::contains))
.addSourceLines(
"A.java",
"import com.google.common.collect.ImmutableList;",
@@ -63,7 +58,7 @@ final class FluxImplicitBlockTest {
void identificationWithoutGuavaOnClasspath() {
CompilationTestHelper.newInstance(FluxImplicitBlock.class, getClass())
.withClasspath(CorePublisher.class, Flux.class, Publisher.class)
.expectErrorMessage("X", not(containsPattern("toImmutableList")))
.expectErrorMessage("X", m -> !m.contains("toImmutableList"))
.addSourceLines(
"A.java",
"import reactor.core.publisher.Flux;",

View File

@@ -1,89 +0,0 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.common.base.Predicates.containsPattern;
import com.google.errorprone.CompilationTestHelper;
import org.junit.jupiter.api.Test;
final class MissingRefasterAnnotationTest {
@Test
void identification() {
CompilationTestHelper.newInstance(MissingRefasterAnnotation.class, getClass())
.expectErrorMessage(
"X",
containsPattern("The Refaster rule contains a method without any Refaster annotations"))
.addSourceLines(
"A.java",
"import com.google.errorprone.refaster.annotation.AfterTemplate;",
"import com.google.errorprone.refaster.annotation.AlsoNegation;",
"import com.google.errorprone.refaster.annotation.BeforeTemplate;",
"import java.util.Map;",
"",
"class A {",
" // BUG: Diagnostic matches: X",
" static final class MethodLacksBeforeTemplateAnnotation {",
" @BeforeTemplate",
" boolean before1(String string) {",
" return string.equals(\"\");",
" }",
"",
" // @BeforeTemplate is missing",
" boolean before2(String string) {",
" return string.length() == 0;",
" }",
"",
" @AfterTemplate",
" @AlsoNegation",
" boolean after(String string) {",
" return string.isEmpty();",
" }",
" }",
"",
" // BUG: Diagnostic matches: X",
" static final class MethodLacksAfterTemplateAnnotation {",
" @BeforeTemplate",
" boolean before(String string) {",
" return string.equals(\"\");",
" }",
"",
" // @AfterTemplate is missing",
" boolean after(String string) {",
" return string.isEmpty();",
" }",
" }",
"",
" // BUG: Diagnostic matches: X",
" abstract class MethodLacksPlaceholderAnnotation<K, V> {",
" // @Placeholder is missing",
" abstract V function(K key);",
"",
" @BeforeTemplate",
" void before(Map<K, V> map, K key) {",
" if (!map.containsKey(key)) {",
" map.put(key, function(key));",
" }",
" }",
"",
" @AfterTemplate",
" void after(Map<K, V> map, K key) {",
" map.computeIfAbsent(key, k -> function(k));",
" }",
" }",
"",
" static final class ValidRefasterRule {",
" @BeforeTemplate",
" void unusedPureFunctionCall(Object o) {",
" o.toString();",
" }",
" }",
"",
" static final class NotARefasterRule {",
" @Override",
" public String toString() {",
" return \"This is not a Refaster rule\";",
" }",
" }",
"}")
.doTest();
}
}

View File

@@ -0,0 +1,26 @@
package tech.picnic.errorprone.bugpatterns;
import com.google.errorprone.CompilationTestHelper;
import org.junit.jupiter.api.Test;
final class MongoDBTextFilterUsageTest {
@Test
void identification() {
CompilationTestHelper.newInstance(MongoDBTextFilterUsage.class, getClass())
.addSourceLines(
"A.java",
"import com.mongodb.client.model.Filters;",
"import com.mongodb.client.model.TextSearchOptions;",
"",
"class A {",
" void m() {",
" Filters.eq(\"foo\", \"bar\");",
" // BUG: Diagnostic contains:",
" Filters.text(\"foo\");",
" // BUG: Diagnostic contains:",
" Filters.text(\"foo\", new TextSearchOptions());",
" }",
"}")
.doTest();
}
}

View File

@@ -36,19 +36,4 @@ final class NestedOptionalsTest {
"}")
.doTest();
}
@Test
void identificationOptionalTypeNotLoaded() {
CompilationTestHelper.newInstance(NestedOptionals.class, getClass())
.addSourceLines(
"A.java",
"import java.time.Duration;",
"",
"class A {",
" void m() {",
" Duration.ofSeconds(1);",
" }",
"}")
.doTest();
}
}

View File

@@ -0,0 +1,37 @@
package tech.picnic.errorprone.bugpatterns;
import com.google.errorprone.CompilationTestHelper;
import org.junit.jupiter.api.Test;
final class NestedPublishersTest {
@Test
void identification() {
CompilationTestHelper.newInstance(NestedPublishers.class, getClass())
.addSourceLines(
"A.java",
"import org.reactivestreams.Publisher;",
"import reactor.core.publisher.Flux;",
"import reactor.core.publisher.GroupedFlux;",
"import reactor.core.publisher.Mono;",
"",
"class A {",
" void m() {",
" Mono.empty();",
" Flux.just(1);",
" Flux.just(1, 2).groupBy(i -> i).map(groupedFlux -> (GroupedFlux) groupedFlux);",
"",
" // BUG: Diagnostic contains:",
" Mono.just(Mono.empty());",
" // BUG: Diagnostic contains:",
" Flux.just(Flux.empty());",
" // BUG: Diagnostic contains:",
" Mono.just((Flux) Flux.just(1));",
" // BUG: Diagnostic contains:",
" Flux.just((Publisher) Mono.just(1));",
" // BUG: Diagnostic contains:",
" Mono.just(1).map(Mono::just);",
" }",
"}")
.doTest();
}
}

View File

@@ -1,8 +1,7 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode.TEXT_MATCH;
import com.google.errorprone.BugCheckerRefactoringTestHelper;
import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode;
import com.google.errorprone.CompilationTestHelper;
import org.junit.jupiter.api.Test;
@@ -145,6 +144,6 @@ final class NonEmptyMonoTest {
" Mono.just(2).hasElement();",
" }",
"}")
.doTest(TEXT_MATCH);
.doTest(TestMode.TEXT_MATCH);
}
}

View File

@@ -1,105 +0,0 @@
package tech.picnic.errorprone.bugpatterns;
import com.google.errorprone.BugCheckerRefactoringTestHelper;
import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode;
import com.google.errorprone.CompilationTestHelper;
import org.junit.jupiter.api.Test;
import org.springframework.scheduling.annotation.Scheduled;
final class ScheduledTransactionTraceTest {
@Test
void identification() {
CompilationTestHelper.newInstance(ScheduledTransactionTrace.class, getClass())
.addSourceLines(
"A.java",
"import com.newrelic.api.agent.Trace;",
"import org.springframework.scheduling.annotation.Scheduled;",
"",
"class A {",
" void notScheduled() {}",
"",
" @Scheduled(fixedDelay = 1)",
" // BUG: Diagnostic contains:",
" void scheduledButNotTraced() {}",
"",
" @Scheduled(fixedDelay = 1)",
" // BUG: Diagnostic contains:",
" @Trace",
" void scheduledButImproperlyTraced1() {}",
"",
" @Scheduled(fixedDelay = 1)",
" // BUG: Diagnostic contains:",
" @Trace(dispatcher = false)",
" void scheduledButImproperlyTraced2() {}",
"",
" @Scheduled(fixedDelay = 1)",
" @Trace(dispatcher = true)",
" void scheduledAndProperlyTraced() {}",
"}")
.doTest();
}
@Test
void identificationWithoutNewRelicAgentApiOnClasspath() {
CompilationTestHelper.newInstance(ScheduledTransactionTrace.class, getClass())
.withClasspath(Scheduled.class)
.addSourceLines(
"A.java",
"import org.springframework.scheduling.annotation.Scheduled;",
"",
"class A {",
" @Scheduled(fixedDelay = 1)",
" void scheduledButNotTraced() {}",
"}")
.doTest();
}
@Test
void replacement() {
BugCheckerRefactoringTestHelper.newInstance(ScheduledTransactionTrace.class, getClass())
.addInputLines(
"A.java",
"import com.newrelic.api.agent.Trace;",
"import org.springframework.scheduling.annotation.Scheduled;",
"",
"class A {",
" @Scheduled(fixedDelay = 1)",
" void scheduledButNotTraced() {}",
"",
" @Scheduled(fixedDelay = 1)",
" @Trace",
" void scheduledButImproperlyTraced1() {}",
"",
" @Scheduled(fixedDelay = 1)",
" @Trace(dispatcher = false)",
" void scheduledButImproperlyTraced2() {}",
"",
" @Scheduled(fixedDelay = 1)",
" @Trace(leaf = true)",
" void scheduledButImproperlyTraced3() {}",
"}")
.addOutputLines(
"A.java",
"import com.newrelic.api.agent.Trace;",
"import org.springframework.scheduling.annotation.Scheduled;",
"",
"class A {",
" @Trace(dispatcher = true)",
" @Scheduled(fixedDelay = 1)",
" void scheduledButNotTraced() {}",
"",
" @Scheduled(fixedDelay = 1)",
" @Trace(dispatcher = true)",
" void scheduledButImproperlyTraced1() {}",
"",
" @Scheduled(fixedDelay = 1)",
" @Trace(dispatcher = true)",
" void scheduledButImproperlyTraced2() {}",
"",
" @Scheduled(fixedDelay = 1)",
" @Trace(dispatcher = true, leaf = true)",
" void scheduledButImproperlyTraced3() {}",
"}")
.doTest(TestMode.TEXT_MATCH);
}
}

View File

@@ -1,7 +1,5 @@
package tech.picnic.errorprone.bugpatterns;
import static com.google.common.base.Predicates.containsPattern;
import com.google.errorprone.BugCheckerRefactoringTestHelper;
import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode;
import com.google.errorprone.CompilationTestHelper;
@@ -12,8 +10,8 @@ final class StringJoinTest {
void identification() {
CompilationTestHelper.newInstance(StringJoin.class, getClass())
.expectErrorMessage(
"valueOf", containsPattern("Prefer `String#valueOf` over `String#format`"))
.expectErrorMessage("join", containsPattern("Prefer `String#join` over `String#format`"))
"valueOf", m -> m.contains("Prefer `String#valueOf` over `String#format`"))
.expectErrorMessage("join", m -> m.contains("Prefer `String#join` over `String#format`"))
.addSourceLines(
"A.java",
"import java.util.Formattable;",

View File

@@ -1,21 +1,29 @@
package tech.picnic.errorprone.bugpatterns.util;
import static com.google.errorprone.BugPattern.SeverityLevel.ERROR;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.generic;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.subOf;
import static tech.picnic.errorprone.bugpatterns.util.MoreTypes.type;
import com.google.common.collect.ImmutableSet;
import com.google.errorprone.BugPattern;
import com.google.errorprone.CompilationTestHelper;
import com.google.errorprone.VisitorState;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.AnnotationTreeMatcher;
import com.google.errorprone.bugpatterns.BugChecker.MethodInvocationTreeMatcher;
import com.google.errorprone.matchers.Description;
import com.google.errorprone.matchers.Matcher;
import com.google.errorprone.suppliers.Supplier;
import com.sun.source.tree.AnnotationTree;
import com.sun.source.tree.MethodInvocationTree;
import com.sun.source.tree.Tree;
import org.junit.jupiter.api.Test;
final class MoreMatchersTest {
@Test
void hasMetaAnnotation() {
CompilationTestHelper.newInstance(TestMatcher.class, getClass())
CompilationTestHelper.newInstance(HasMetaAnnotationTestChecker.class, getClass())
.addSourceLines(
"A.java",
"import org.junit.jupiter.api.AfterAll;",
@@ -47,9 +55,59 @@ final class MoreMatchersTest {
.doTest();
}
/** A {@link BugChecker} that delegates to {@link MoreMatchers#hasMetaAnnotation(String)} . */
@Test
void isSubTypeOf() {
CompilationTestHelper.newInstance(IsSubTypeOfTestChecker.class, getClass())
.addSourceLines(
"A.java",
"import com.google.common.collect.ImmutableList;",
"import com.google.common.collect.ImmutableSet;",
"import com.google.common.collect.ImmutableSortedSet;",
"",
"class A {",
" void m() {",
" ImmutableSet.of(\"foo\");",
" ImmutableSortedSet.of(\"foo\");",
" ImmutableList.of(\"foo\");",
" ImmutableList.of(1);",
" ImmutableList.of(1.0);",
" ImmutableList.of((Number) 1);",
"",
" // BUG: Diagnostic contains:",
" ImmutableSet.of(1);",
" // BUG: Diagnostic contains:",
" ImmutableSet.of(1.0);",
" // BUG: Diagnostic contains:",
" ImmutableSet.of((Number) 1);",
" // BUG: Diagnostic contains:",
" ImmutableSortedSet.of(1);",
" // BUG: Diagnostic contains:",
" ImmutableSortedSet.of(1.0);",
" // BUG: Diagnostic contains:",
" ImmutableSortedSet.of((Number) 1);",
" }",
"}")
.doTest();
}
@Test
void isSubTypeOfBoundTypeUnknown() {
CompilationTestHelper.newInstance(IsSubTypeOfTestChecker.class, getClass())
.withClasspath()
.addSourceLines(
"A.java",
"class A {",
" void m() {",
" System.out.println(toString());",
" }",
"}")
.doTest();
}
/** A {@link BugChecker} that delegates to {@link MoreMatchers#hasMetaAnnotation(String)}. */
@BugPattern(summary = "Interacts with `MoreMatchers` for testing purposes", severity = ERROR)
public static final class TestMatcher extends BugChecker implements AnnotationTreeMatcher {
public static final class HasMetaAnnotationTestChecker extends BugChecker
implements AnnotationTreeMatcher {
private static final long serialVersionUID = 1L;
private static final Matcher<AnnotationTree> DELEGATE =
MoreMatchers.hasMetaAnnotation("org.junit.jupiter.api.TestTemplate");
@@ -59,4 +117,19 @@ final class MoreMatchersTest {
return DELEGATE.matches(tree, state) ? describeMatch(tree) : Description.NO_MATCH;
}
}
/** A {@link BugChecker} that delegates to {@link MoreMatchers#isSubTypeOf(Supplier)}. */
@BugPattern(summary = "Interacts with `MoreMatchers` for testing purposes", severity = ERROR)
public static final class IsSubTypeOfTestChecker extends BugChecker
implements MethodInvocationTreeMatcher {
private static final long serialVersionUID = 1L;
private static final Matcher<Tree> DELEGATE =
MoreMatchers.isSubTypeOf(
generic(type(ImmutableSet.class.getName()), subOf(type(Number.class.getName()))));
@Override
public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
return DELEGATE.matches(tree, state) ? describeMatch(tree) : Description.NO_MATCH;
}
}
}

View File

@@ -23,7 +23,7 @@ final class ThirdPartyLibraryTest {
CompilationTestHelper.newInstance(TestChecker.class, getClass())
.addSourceLines(
"A.java",
"// BUG: Diagnostic contains: ASSERTJ: true, GUAVA: true, NEW_RELIC_AGENT_API: true, REACTOR: true",
"// BUG: Diagnostic contains: ASSERTJ: true, GUAVA: true, REACTOR: true",
"class A {}")
.doTest();
}
@@ -34,16 +34,14 @@ final class ThirdPartyLibraryTest {
.addSourceLines(
"A.java",
"import com.google.common.collect.ImmutableList;",
"import com.newrelic.api.agent.Agent;",
"import org.assertj.core.api.Assertions;",
"import reactor.core.publisher.Flux;",
"",
"// BUG: Diagnostic contains: ASSERTJ: true, GUAVA: true, NEW_RELIC_AGENT_API: true, REACTOR: true",
"// BUG: Diagnostic contains: ASSERTJ: true, GUAVA: true, REACTOR: true",
"class A {",
" void m(Class<?> clazz) {",
" m(Assertions.class);",
" m(ImmutableList.class);",
" m(Agent.class);",
" m(Flux.class);",
" }",
"}")
@@ -56,7 +54,7 @@ final class ThirdPartyLibraryTest {
.withClasspath(ImmutableList.class, Flux.class)
.addSourceLines(
"A.java",
"// BUG: Diagnostic contains: ASSERTJ: false, GUAVA: true, NEW_RELIC_AGENT_API: false, REACTOR: true",
"// BUG: Diagnostic contains: ASSERTJ: false, GUAVA: true, REACTOR: true",
"class A {}")
.doTest();
}
@@ -67,7 +65,7 @@ final class ThirdPartyLibraryTest {
.withClasspath()
.addSourceLines(
"A.java",
"// BUG: Diagnostic contains: ASSERTJ: false, GUAVA: false, NEW_RELIC_AGENT_API: false, REACTOR:",
"// BUG: Diagnostic contains: ASSERTJ: false, GUAVA: false, REACTOR:",
"// false",
"class A {}")
.doTest();
@@ -82,8 +80,8 @@ final class ThirdPartyLibraryTest {
.addSourceLines(
"A.java",
String.format(
"// BUG: Diagnostic contains: ASSERTJ: %s, GUAVA: true, NEW_RELIC_AGENT_API: %s, REACTOR: true",
ignoreClassPath, ignoreClassPath),
"// BUG: Diagnostic contains: ASSERTJ: %s, GUAVA: true, REACTOR: true",
ignoreClassPath),
"class A {}")
.doTest();
}

View File

@@ -36,10 +36,12 @@ final class RefasterRulesTest {
AssortedRules.class,
BigDecimalRules.class,
BugCheckerRules.class,
ClassRules.class,
CollectionRules.class,
ComparatorRules.class,
DoubleStreamRules.class,
EqualityRules.class,
FileRules.class,
ImmutableListRules.class,
ImmutableListMultimapRules.class,
ImmutableMapRules.class,
@@ -59,6 +61,7 @@ final class RefasterRulesTest {
MultimapRules.class,
NullRules.class,
OptionalRules.class,
PatternRules.class,
PreconditionsRules.class,
PrimitiveRules.class,
ReactorRules.class,

View File

@@ -0,0 +1,26 @@
package tech.picnic.errorprone.refasterrules;
import com.google.common.collect.ImmutableSet;
import java.io.IOException;
import java.util.function.Predicate;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
final class ClassRulesTest implements RefasterRuleCollectionTestCase {
boolean testClassIsInstance() throws IOException {
return CharSequence.class.isAssignableFrom("foo".getClass());
}
ImmutableSet<Boolean> testInstanceof() throws IOException {
Class<?> clazz = CharSequence.class;
return ImmutableSet.of(CharSequence.class.isInstance("foo"), clazz.isInstance("bar"));
}
Predicate<String> testClassLiteralIsInstancePredicate() throws IOException {
return s -> s instanceof CharSequence;
}
Predicate<String> testClassReferenceIsInstancePredicate() throws IOException {
Class<?> clazz = CharSequence.class;
return s -> clazz.isInstance(s);
}
}

View File

@@ -0,0 +1,26 @@
package tech.picnic.errorprone.refasterrules;
import com.google.common.collect.ImmutableSet;
import java.io.IOException;
import java.util.function.Predicate;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
final class ClassRulesTest implements RefasterRuleCollectionTestCase {
boolean testClassIsInstance() throws IOException {
return CharSequence.class.isInstance("foo");
}
ImmutableSet<Boolean> testInstanceof() throws IOException {
Class<?> clazz = CharSequence.class;
return ImmutableSet.of("foo" instanceof CharSequence, clazz.isInstance("bar"));
}
Predicate<String> testClassLiteralIsInstancePredicate() throws IOException {
return CharSequence.class::isInstance;
}
Predicate<String> testClassReferenceIsInstancePredicate() throws IOException {
Class<?> clazz = CharSequence.class;
return clazz::isInstance;
}
}

View File

@@ -36,6 +36,10 @@ final class CollectionRulesTest implements RefasterRuleCollectionTestCase {
return ImmutableSet.of(Iterables.size(ImmutableSet.of(1)), ImmutableSet.of(2).asList().size());
}
boolean testCollectionContains() {
return ImmutableSet.of("foo").stream().anyMatch("bar"::equals);
}
boolean testCollectionAddAllToCollectionExpression() {
return Iterables.addAll(new ArrayList<>(), ImmutableSet.of("foo"));
}

View File

@@ -36,6 +36,10 @@ final class CollectionRulesTest implements RefasterRuleCollectionTestCase {
return ImmutableSet.of(ImmutableSet.of(1).size(), ImmutableSet.of(2).size());
}
boolean testCollectionContains() {
return ImmutableSet.of("foo").contains("bar");
}
boolean testCollectionAddAllToCollectionExpression() {
return new ArrayList<>().addAll(ImmutableSet.of("foo"));
}

View File

@@ -96,4 +96,8 @@ final class DoubleStreamRulesTest implements RefasterRuleCollectionTestCase {
boolean testDoubleStreamAllMatch2() {
return DoubleStream.of(1).noneMatch(n -> !(n > 1));
}
DoubleStream testDoubleStreamTakeWhile() {
return DoubleStream.of(1, 2, 3).takeWhile(i -> i < 2).filter(i -> i < 2);
}
}

View File

@@ -95,4 +95,8 @@ final class DoubleStreamRulesTest implements RefasterRuleCollectionTestCase {
boolean testDoubleStreamAllMatch2() {
return DoubleStream.of(1).allMatch(n -> n > 1);
}
DoubleStream testDoubleStreamTakeWhile() {
return DoubleStream.of(1, 2, 3).takeWhile(i -> i < 2);
}
}

View File

@@ -1,16 +1,20 @@
package tech.picnic.errorprone.refasterrules;
import static java.util.function.Predicate.not;
import com.google.common.collect.BoundType;
import com.google.common.collect.ImmutableSet;
import java.math.RoundingMode;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
final class EqualityRulesTest implements RefasterRuleCollectionTestCase {
@Override
public ImmutableSet<Object> elidedTypesAndStaticImports() {
return ImmutableSet.of(Objects.class);
return ImmutableSet.of(Objects.class, Optional.class, not(null));
}
ImmutableSet<Boolean> testPrimitiveOrReferenceEquality() {
@@ -60,4 +64,20 @@ final class EqualityRulesTest implements RefasterRuleCollectionTestCase {
!(3.0 != 4.0),
!(BoundType.OPEN != BoundType.CLOSED));
}
Predicate<String> testPredicateLambda() {
return not(v -> v.isEmpty());
}
boolean testEqualsLhsNullable() {
return Optional.ofNullable("foo").equals(Optional.of("bar"));
}
boolean testEqualsRhsNullable() {
return Optional.of("foo").equals(Optional.ofNullable("bar"));
}
boolean testEqualsLhsAndRhsNullable() {
return Optional.ofNullable("foo").equals(Optional.ofNullable("bar"));
}
}

View File

@@ -1,16 +1,20 @@
package tech.picnic.errorprone.refasterrules;
import static java.util.function.Predicate.not;
import com.google.common.collect.BoundType;
import com.google.common.collect.ImmutableSet;
import java.math.RoundingMode;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
final class EqualityRulesTest implements RefasterRuleCollectionTestCase {
@Override
public ImmutableSet<Object> elidedTypesAndStaticImports() {
return ImmutableSet.of(Objects.class);
return ImmutableSet.of(Objects.class, Optional.class, not(null));
}
ImmutableSet<Boolean> testPrimitiveOrReferenceEquality() {
@@ -60,4 +64,20 @@ final class EqualityRulesTest implements RefasterRuleCollectionTestCase {
3.0 == 4.0,
BoundType.OPEN == BoundType.CLOSED);
}
Predicate<String> testPredicateLambda() {
return v -> !v.isEmpty();
}
boolean testEqualsLhsNullable() {
return "bar".equals("foo");
}
boolean testEqualsRhsNullable() {
return "foo".equals("bar");
}
boolean testEqualsLhsAndRhsNullable() {
return Objects.equals("foo", "bar");
}
}

View File

@@ -0,0 +1,17 @@
package tech.picnic.errorprone.refasterrules;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
final class FileRulesTest implements RefasterRuleCollectionTestCase {
String testFilesReadStringWithCharset() throws IOException {
return new String(Files.readAllBytes(Paths.get("foo")), StandardCharsets.ISO_8859_1);
}
String testFilesReadString() throws IOException {
return Files.readString(Paths.get("foo"), StandardCharsets.UTF_8);
}
}

View File

@@ -0,0 +1,17 @@
package tech.picnic.errorprone.refasterrules;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
final class FileRulesTest implements RefasterRuleCollectionTestCase {
String testFilesReadStringWithCharset() throws IOException {
return Files.readString(Paths.get("foo"), StandardCharsets.ISO_8859_1);
}
String testFilesReadString() throws IOException {
return Files.readString(Paths.get("foo"));
}
}

View File

@@ -100,4 +100,8 @@ final class IntStreamRulesTest implements RefasterRuleCollectionTestCase {
boolean testIntStreamAllMatch2() {
return IntStream.of(1).noneMatch(n -> !(n > 1));
}
IntStream testIntStreamTakeWhile() {
return IntStream.of(1, 2, 3).takeWhile(i -> i < 2).filter(i -> i < 2);
}
}

View File

@@ -99,4 +99,8 @@ final class IntStreamRulesTest implements RefasterRuleCollectionTestCase {
boolean testIntStreamAllMatch2() {
return IntStream.of(1).allMatch(n -> n > 1);
}
IntStream testIntStreamTakeWhile() {
return IntStream.of(1, 2, 3).takeWhile(i -> i < 2);
}
}

View File

@@ -100,4 +100,8 @@ final class LongStreamRulesTest implements RefasterRuleCollectionTestCase {
boolean testLongStreamAllMatch2() {
return LongStream.of(1).noneMatch(n -> !(n > 1));
}
LongStream testLongStreamTakeWhile() {
return LongStream.of(1, 2, 3).takeWhile(i -> i < 2).filter(i -> i < 2);
}
}

View File

@@ -99,4 +99,8 @@ final class LongStreamRulesTest implements RefasterRuleCollectionTestCase {
boolean testLongStreamAllMatch2() {
return LongStream.of(1).allMatch(n -> n > 1);
}
LongStream testLongStreamTakeWhile() {
return LongStream.of(1, 2, 3).takeWhile(i -> i < 2);
}
}

View File

@@ -5,6 +5,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import com.google.common.collect.ImmutableSet;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.verification.VerificationMode;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
@@ -21,4 +22,14 @@ final class MockitoRulesTest implements RefasterRuleCollectionTestCase {
Object testVerifyOnce() {
return verify(mock(Object.class), times(1));
}
Object testInvocationOnMockGetArguments() {
return ((InvocationOnMock) null).getArguments()[0];
}
ImmutableSet<Number> testInvocationOnMockGetArgumentsWithTypeParameter() {
return ImmutableSet.of(
((InvocationOnMock) null).getArgument(0, Integer.class),
(Double) ((InvocationOnMock) null).getArgument(1));
}
}

View File

@@ -6,6 +6,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import com.google.common.collect.ImmutableSet;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.verification.VerificationMode;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
@@ -22,4 +23,14 @@ final class MockitoRulesTest implements RefasterRuleCollectionTestCase {
Object testVerifyOnce() {
return verify(mock(Object.class));
}
Object testInvocationOnMockGetArguments() {
return ((InvocationOnMock) null).getArgument(0);
}
ImmutableSet<Number> testInvocationOnMockGetArgumentsWithTypeParameter() {
return ImmutableSet.of(
((InvocationOnMock) null).<Integer>getArgument(0),
((InvocationOnMock) null).<Double>getArgument(1));
}
}

View File

@@ -35,6 +35,12 @@ final class OptionalRulesTest implements RefasterRuleCollectionTestCase {
return Optional::get;
}
ImmutableSet<Boolean> testOptionalEqualsOptional() {
return ImmutableSet.of(
Optional.of("foo").filter("bar"::equals).isPresent(),
Optional.of("baz").stream().anyMatch("qux"::equals));
}
ImmutableSet<Optional<String>> testOptionalFirstIteratorElement() {
return ImmutableSet.of(
ImmutableSet.of("foo").iterator().hasNext()
@@ -73,6 +79,13 @@ final class OptionalRulesTest implements RefasterRuleCollectionTestCase {
return Optional.of("foo").orElseGet(() -> Optional.of("bar").orElseThrow());
}
ImmutableSet<String> testOptionalOrElseGet() {
return ImmutableSet.of(
Optional.of("foo").orElse("bar"),
Optional.of("baz").orElse(toString()),
Optional.of("qux").orElse(String.valueOf(true)));
}
ImmutableSet<Object> testStreamFlatMapOptional() {
return ImmutableSet.of(
Stream.of(Optional.empty()).filter(Optional::isPresent).map(Optional::orElseThrow),
@@ -99,7 +112,8 @@ final class OptionalRulesTest implements RefasterRuleCollectionTestCase {
return ImmutableSet.of(
Optional.of("foo").map(Optional::of).orElse(Optional.of("bar")),
Optional.of("baz").map(Optional::of).orElseGet(() -> Optional.of("qux")),
Stream.of(Optional.of("quux"), Optional.of("quuz")).flatMap(Optional::stream).findFirst());
Stream.of(Optional.of("quux"), Optional.of("quuz")).flatMap(Optional::stream).findFirst(),
Optional.of("corge").isPresent() ? Optional.of("corge") : Optional.of("grault"));
}
ImmutableSet<Optional<String>> testOptionalIdentity() {
@@ -119,4 +133,10 @@ final class OptionalRulesTest implements RefasterRuleCollectionTestCase {
Optional<String> testOptionalMap() {
return Optional.of(1).stream().map(String::valueOf).findAny();
}
ImmutableSet<Stream<String>> testOptionalStream() {
return ImmutableSet.of(
Optional.of("foo").map(Stream::of).orElse(Stream.empty()),
Optional.of("bar").map(Stream::of).orElseGet(Stream::empty));
}
}

View File

@@ -35,6 +35,12 @@ final class OptionalRulesTest implements RefasterRuleCollectionTestCase {
return Optional::orElseThrow;
}
ImmutableSet<Boolean> testOptionalEqualsOptional() {
return ImmutableSet.of(
Optional.of("foo").equals(Optional.of("bar")),
Optional.of("baz").equals(Optional.of("qux")));
}
ImmutableSet<Optional<String>> testOptionalFirstIteratorElement() {
return ImmutableSet.of(
stream(ImmutableSet.of("foo").iterator()).findFirst(),
@@ -70,6 +76,13 @@ final class OptionalRulesTest implements RefasterRuleCollectionTestCase {
return Optional.of("foo").or(() -> Optional.of("bar")).orElseThrow();
}
ImmutableSet<String> testOptionalOrElseGet() {
return ImmutableSet.of(
Optional.of("foo").orElse("bar"),
Optional.of("baz").orElse(toString()),
Optional.of("qux").orElseGet(() -> String.valueOf(true)));
}
ImmutableSet<Object> testStreamFlatMapOptional() {
return ImmutableSet.of(
Stream.of(Optional.empty()).flatMap(Optional::stream),
@@ -96,7 +109,8 @@ final class OptionalRulesTest implements RefasterRuleCollectionTestCase {
return ImmutableSet.of(
Optional.of("foo").or(() -> Optional.of("bar")),
Optional.of("baz").or(() -> Optional.of("qux")),
Optional.of("quux").or(() -> Optional.of("quuz")));
Optional.of("quux").or(() -> Optional.of("quuz")),
Optional.of("corge").or(() -> Optional.of("grault")));
}
ImmutableSet<Optional<String>> testOptionalIdentity() {
@@ -112,4 +126,8 @@ final class OptionalRulesTest implements RefasterRuleCollectionTestCase {
Optional<String> testOptionalMap() {
return Optional.of(1).map(String::valueOf);
}
ImmutableSet<Stream<String>> testOptionalStream() {
return ImmutableSet.of(Optional.of("foo").stream(), Optional.of("bar").stream());
}
}

View File

@@ -0,0 +1,22 @@
package tech.picnic.errorprone.refasterrules;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableSet;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
final class PatternRulesTest implements RefasterRuleCollectionTestCase {
@Override
public ImmutableSet<Object> elidedTypesAndStaticImports() {
return ImmutableSet.of(Predicates.class);
}
Predicate<?> testPatternAsPredicate() {
return Predicates.contains(Pattern.compile("foo"));
}
Predicate<?> testPatternCompileAsPredicate() {
return Predicates.containsPattern("foo");
}
}

View File

@@ -0,0 +1,22 @@
package tech.picnic.errorprone.refasterrules;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableSet;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
final class PatternRulesTest implements RefasterRuleCollectionTestCase {
@Override
public ImmutableSet<Object> elidedTypesAndStaticImports() {
return ImmutableSet.of(Predicates.class);
}
Predicate<?> testPatternAsPredicate() {
return Pattern.compile("foo").asPredicate();
}
Predicate<?> testPatternCompileAsPredicate() {
return Pattern.compile("foo").asPredicate();
}
}

View File

@@ -98,7 +98,16 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
return Flux.just("foo", "bar").zipWith(Flux.just(1, 2), String::repeat);
}
Flux<String> testFluxZipWithIterable() {
Flux<Tuple2<String, Integer>> testFluxZipWithIterable() {
return Flux.zip(Flux.just("foo", "bar"), Flux.fromIterable(ImmutableSet.of(1, 2)));
}
Flux<String> testFluxZipWithIterableBiFunction() {
return Flux.just("foo", "bar")
.zipWith(Flux.fromIterable(ImmutableSet.of(1, 2)), String::repeat);
}
Flux<String> testFluxZipWithIterableMapFunction() {
return Flux.just("foo", "bar").zipWithIterable(ImmutableSet.of(1, 2), String::repeat);
}
@@ -118,8 +127,11 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
return Flux.error(() -> ((Supplier<RuntimeException>) null).get());
}
Mono<String> testMonoThenReturn() {
return Mono.empty().then(Mono.just("foo"));
ImmutableSet<Mono<String>> testMonoThenReturn() {
return ImmutableSet.of(
Mono.just(1).ignoreElement().thenReturn("foo"),
Mono.just(2).then().thenReturn("bar"),
Mono.just(3).then(Mono.just("baz")));
}
Flux<Integer> testFluxTake() {
@@ -136,15 +148,51 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
Flux.just("baz").switchIfEmpty(Flux.just("qux")));
}
ImmutableSet<Flux<?>> testFluxEmpty() {
return ImmutableSet.of(
Flux.concat(),
Flux.concatDelayError(),
Flux.firstWithSignal(),
Flux.just(),
Flux.merge(),
Flux.merge(1),
Flux.mergeComparing((a, b) -> 0),
Flux.mergeComparing(1, (a, b) -> 0),
Flux.mergeComparingDelayError(1, (a, b) -> 0),
Flux.mergeDelayError(1),
Flux.mergePriority((a, b) -> 0),
Flux.mergePriority(1, (a, b) -> 0),
Flux.mergePriorityDelayError(1, (a, b) -> 0),
Flux.mergeSequential(),
Flux.mergeSequential(1),
Flux.mergeSequentialDelayError(1),
Flux.zip(v -> v),
Flux.zip(v -> v, 1),
Flux.combineLatest(v -> v),
Flux.combineLatest(v -> v, 1),
Flux.mergeComparing(),
Flux.mergePriority(),
Flux.range(0, 0));
}
Flux<Integer> testFluxJust() {
return Flux.range(0, 1);
}
ImmutableSet<Mono<?>> testMonoIdentity() {
return ImmutableSet.of(
Mono.just(1).switchIfEmpty(Mono.empty()),
Mono.just(2).flux().next(),
Mono.just(3).flux().singleOrEmpty(),
Mono.<Void>empty().ignoreElement(),
Mono.<Void>empty().then(),
Mono.<ImmutableList<String>>empty().map(ImmutableList::copyOf));
}
Mono<Integer> testMonoSingle() {
return Mono.just(1).flux().single();
}
ImmutableSet<Flux<Integer>> testFluxSwitchIfEmptyOfEmptyPublisher() {
return ImmutableSet.of(
Flux.just(1).switchIfEmpty(Mono.empty()), Flux.just(2).switchIfEmpty(Flux.empty()));
@@ -164,12 +212,26 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
Flux.just(3).map(Mono::just).concatMap(identity(), 5));
}
Flux<Integer> testFluxConcatMapIterable() {
return Flux.just(1, 2).flatMapIterable(ImmutableList::of);
ImmutableSet<Flux<Integer>> testMonoFlatMapIterable() {
return ImmutableSet.of(
Mono.just(1).map(ImmutableSet::of).flatMapIterable(identity()),
Mono.just(2).flux().concatMapIterable(ImmutableSet::of));
}
Flux<Integer> testFluxConcatMapIterableWithPrefetch() {
return Flux.just(1, 2).flatMapIterable(ImmutableList::of, 3);
Flux<Integer> testMonoFlatMapIterableIdentity() {
return Mono.just(ImmutableSet.of(1)).flatMapMany(Flux::fromIterable);
}
ImmutableSet<Flux<Integer>> testFluxConcatMapIterable() {
return ImmutableSet.of(
Flux.just(1).flatMapIterable(ImmutableList::of),
Flux.just(2).map(ImmutableList::of).concatMapIterable(identity()));
}
ImmutableSet<Flux<Integer>> testFluxConcatMapIterableWithPrefetch() {
return ImmutableSet.of(
Flux.just(1).flatMapIterable(ImmutableList::of, 3),
Flux.just(2).map(ImmutableList::of).concatMapIterable(identity(), 3));
}
Flux<String> testMonoFlatMapToFlux() {
@@ -247,8 +309,45 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
Flux.concat(Mono.just("baz")));
}
Mono<Void> testMonoThen() {
return Mono.just("foo").flux().then();
ImmutableSet<Mono<Void>> testMonoThen() {
return ImmutableSet.of(Mono.just("foo").ignoreElement().then(), Mono.just("bar").flux().then());
}
ImmutableSet<Mono<Void>> testFluxThen() {
return ImmutableSet.of(
Flux.just("foo").ignoreElements().then(), Flux.<Void>empty().ignoreElements());
}
Mono<Void> testMonoThenEmpty() {
return Mono.just("foo").ignoreElement().thenEmpty(Mono.empty());
}
Mono<Void> testFluxThenEmpty() {
return Flux.just("foo").ignoreElements().thenEmpty(Mono.empty());
}
Flux<String> testMonoThenMany() {
return Mono.just("foo").ignoreElement().thenMany(Flux.just("bar"));
}
Flux<String> testMonoThenMonoFlux() {
return Mono.just("foo").thenMany(Mono.just("bar"));
}
Flux<String> testFluxThenMany() {
return Flux.just("foo").ignoreElements().thenMany(Flux.just("bar"));
}
ImmutableSet<Mono<?>> testMonoThenMono() {
return ImmutableSet.of(
Mono.just("foo").ignoreElement().then(Mono.just("bar")),
Mono.just("baz").thenEmpty(Mono.<Void>empty()));
}
ImmutableSet<Mono<?>> testFluxThenMono() {
return ImmutableSet.of(
Flux.just("foo").ignoreElements().then(Mono.just("bar")),
Flux.just("baz").thenEmpty(Mono.<Void>empty()));
}
ImmutableSet<Mono<Optional<String>>> testMonoSingleOptional() {
@@ -265,12 +364,33 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
return Flux.just(1).map(Number.class::cast);
}
Mono<Number> testMonoOfType() {
return Mono.just(1).filter(Number.class::isInstance).cast(Number.class);
}
Flux<Number> testFluxOfType() {
return Flux.just(1).filter(Number.class::isInstance).cast(Number.class);
}
Mono<String> testMonoFlatMap() {
return Mono.just("foo").map(Mono::just).flatMap(identity());
}
Flux<String> testMonoFlatMapMany() {
return Mono.just("foo").map(Mono::just).flatMapMany(identity());
ImmutableSet<Flux<Integer>> testMonoFlatMapMany() {
return ImmutableSet.of(
Mono.just(1).map(Mono::just).flatMapMany(identity()),
Mono.just(2).flux().concatMap(Mono::just),
Mono.just(3).flux().concatMap(Mono::just, 2),
Mono.just(4).flux().concatMapDelayError(Mono::just),
Mono.just(5).flux().concatMapDelayError(Mono::just, 2),
Mono.just(6).flux().concatMapDelayError(Mono::just, false, 2),
Mono.just(7).flux().flatMap(Mono::just, 2),
Mono.just(8).flux().flatMap(Mono::just, 2, 3),
Mono.just(9).flux().flatMapDelayError(Mono::just, 2, 3),
Mono.just(10).flux().flatMapSequential(Mono::just, 2),
Mono.just(11).flux().flatMapSequential(Mono::just, 2, 3),
Mono.just(12).flux().flatMapSequentialDelayError(Mono::just, 2, 3),
Mono.just(13).flux().switchMap(Mono::just));
}
ImmutableSet<Flux<String>> testConcatMapIterableIdentity() {
@@ -378,6 +498,10 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
return Flux.just(1, 4, 3, 2).sort(reverseOrder()).filter(i -> i % 2 == 0);
}
Flux<Integer> testFluxTakeWhile() {
return Flux.just(1, 2, 3).takeWhile(i -> i % 2 == 0).filter(i -> i % 2 == 0);
}
Mono<List<Integer>> testFluxCollectToImmutableList() {
return Flux.just(1).collectList();
}
@@ -414,6 +538,13 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
StepVerifier.create(Mono.just("baz")).expectNextMatches("qux"::equals));
}
StepVerifier.Step<?> testFluxAsStepVerifierExpectNext() {
return Flux.just(1)
.collect(toImmutableList())
.as(StepVerifier::create)
.assertNext(list -> assertThat(list).containsExactly(2));
}
Duration testStepVerifierLastStepVerifyComplete() {
return StepVerifier.create(Mono.empty()).expectComplete().verify();
}
@@ -426,7 +557,9 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
return ImmutableSet.of(
StepVerifier.create(Mono.empty()).expectError(IllegalArgumentException.class).verify(),
StepVerifier.create(Mono.empty())
.verifyErrorSatisfies(t -> assertThat(t).isInstanceOf(IllegalStateException.class)));
.verifyErrorMatches(IllegalStateException.class::isInstance),
StepVerifier.create(Mono.empty())
.verifyErrorSatisfies(t -> assertThat(t).isInstanceOf(AssertionError.class)));
}
Duration testStepVerifierLastStepVerifyErrorMatches() {

View File

@@ -102,7 +102,15 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
.map(TupleUtils.function(String::repeat));
}
Flux<String> testFluxZipWithIterable() {
Flux<Tuple2<String, Integer>> testFluxZipWithIterable() {
return Flux.just("foo", "bar").zipWithIterable(ImmutableSet.of(1, 2));
}
Flux<String> testFluxZipWithIterableBiFunction() {
return Flux.just("foo", "bar").zipWithIterable(ImmutableSet.of(1, 2), String::repeat);
}
Flux<String> testFluxZipWithIterableMapFunction() {
return Flux.just("foo", "bar")
.zipWithIterable(ImmutableSet.of(1, 2))
.map(function(String::repeat));
@@ -124,8 +132,11 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
return Flux.error(((Supplier<RuntimeException>) null));
}
Mono<String> testMonoThenReturn() {
return Mono.empty().thenReturn("foo");
ImmutableSet<Mono<String>> testMonoThenReturn() {
return ImmutableSet.of(
Mono.just(1).thenReturn("foo"),
Mono.just(2).thenReturn("bar"),
Mono.just(3).thenReturn("baz"));
}
Flux<Integer> testFluxTake() {
@@ -141,15 +152,51 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
Flux.just("foo").defaultIfEmpty("bar"), Flux.just("baz").defaultIfEmpty("qux"));
}
ImmutableSet<Flux<?>> testFluxEmpty() {
return ImmutableSet.of(
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty(),
Flux.empty());
}
Flux<Integer> testFluxJust() {
return Flux.just(0);
}
ImmutableSet<Mono<?>> testMonoIdentity() {
return ImmutableSet.of(
Mono.just(1),
Mono.just(2),
Mono.just(3),
Mono.<Void>empty(),
Mono.<Void>empty(),
Mono.<ImmutableList<String>>empty());
}
Mono<Integer> testMonoSingle() {
return Mono.just(1).single();
}
ImmutableSet<Flux<Integer>> testFluxSwitchIfEmptyOfEmptyPublisher() {
return ImmutableSet.of(Flux.just(1), Flux.just(2));
}
@@ -168,12 +215,26 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
Flux.just(3).concatMap(Mono::just, 5));
}
Flux<Integer> testFluxConcatMapIterable() {
return Flux.just(1, 2).concatMapIterable(ImmutableList::of);
ImmutableSet<Flux<Integer>> testMonoFlatMapIterable() {
return ImmutableSet.of(
Mono.just(1).flatMapIterable(ImmutableSet::of),
Mono.just(2).flatMapIterable(ImmutableSet::of));
}
Flux<Integer> testFluxConcatMapIterableWithPrefetch() {
return Flux.just(1, 2).concatMapIterable(ImmutableList::of, 3);
Flux<Integer> testMonoFlatMapIterableIdentity() {
return Mono.just(ImmutableSet.of(1)).flatMapIterable(identity());
}
ImmutableSet<Flux<Integer>> testFluxConcatMapIterable() {
return ImmutableSet.of(
Flux.just(1).concatMapIterable(ImmutableList::of),
Flux.just(2).concatMapIterable(ImmutableList::of));
}
ImmutableSet<Flux<Integer>> testFluxConcatMapIterableWithPrefetch() {
return ImmutableSet.of(
Flux.just(1).concatMapIterable(ImmutableList::of, 3),
Flux.just(2).concatMapIterable(ImmutableList::of, 3));
}
Flux<String> testMonoFlatMapToFlux() {
@@ -246,8 +307,42 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
Mono.just("foo").flux(), Mono.just("bar").flux(), Mono.just("baz").flux());
}
Mono<Void> testMonoThen() {
return Mono.just("foo").then();
ImmutableSet<Mono<Void>> testMonoThen() {
return ImmutableSet.of(Mono.just("foo").then(), Mono.just("bar").then());
}
ImmutableSet<Mono<Void>> testFluxThen() {
return ImmutableSet.of(Flux.just("foo").then(), Flux.<Void>empty().then());
}
Mono<Void> testMonoThenEmpty() {
return Mono.just("foo").thenEmpty(Mono.empty());
}
Mono<Void> testFluxThenEmpty() {
return Flux.just("foo").thenEmpty(Mono.empty());
}
Flux<String> testMonoThenMany() {
return Mono.just("foo").thenMany(Flux.just("bar"));
}
Flux<String> testMonoThenMonoFlux() {
return Mono.just("foo").then(Mono.just("bar")).flux();
}
Flux<String> testFluxThenMany() {
return Flux.just("foo").thenMany(Flux.just("bar"));
}
ImmutableSet<Mono<?>> testMonoThenMono() {
return ImmutableSet.of(
Mono.just("foo").then(Mono.just("bar")), Mono.just("baz").then(Mono.<Void>empty()));
}
ImmutableSet<Mono<?>> testFluxThenMono() {
return ImmutableSet.of(
Flux.just("foo").then(Mono.just("bar")), Flux.just("baz").then(Mono.<Void>empty()));
}
ImmutableSet<Mono<Optional<String>>> testMonoSingleOptional() {
@@ -262,12 +357,33 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
return Flux.just(1).cast(Number.class);
}
Mono<Number> testMonoOfType() {
return Mono.just(1).ofType(Number.class);
}
Flux<Number> testFluxOfType() {
return Flux.just(1).ofType(Number.class);
}
Mono<String> testMonoFlatMap() {
return Mono.just("foo").flatMap(Mono::just);
}
Flux<String> testMonoFlatMapMany() {
return Mono.just("foo").flatMapMany(Mono::just);
ImmutableSet<Flux<Integer>> testMonoFlatMapMany() {
return ImmutableSet.of(
Mono.just(1).flatMapMany(Mono::just),
Mono.just(2).flatMapMany(Mono::just),
Mono.just(3).flatMapMany(Mono::just),
Mono.just(4).flatMapMany(Mono::just),
Mono.just(5).flatMapMany(Mono::just),
Mono.just(6).flatMapMany(Mono::just),
Mono.just(7).flatMapMany(Mono::just),
Mono.just(8).flatMapMany(Mono::just),
Mono.just(9).flatMapMany(Mono::just),
Mono.just(10).flatMapMany(Mono::just),
Mono.just(11).flatMapMany(Mono::just),
Mono.just(12).flatMapMany(Mono::just),
Mono.just(13).flatMapMany(Mono::just));
}
ImmutableSet<Flux<String>> testConcatMapIterableIdentity() {
@@ -371,6 +487,10 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
return Flux.just(1, 4, 3, 2).filter(i -> i % 2 == 0).sort(reverseOrder());
}
Flux<Integer> testFluxTakeWhile() {
return Flux.just(1, 2, 3).takeWhile(i -> i % 2 == 0);
}
Mono<List<Integer>> testFluxCollectToImmutableList() {
return Flux.just(1).collect(toImmutableList());
}
@@ -405,6 +525,10 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
StepVerifier.create(Mono.just("baz")).expectNext("qux"));
}
StepVerifier.Step<?> testFluxAsStepVerifierExpectNext() {
return Flux.just(1).as(StepVerifier::create).expectNext(2);
}
Duration testStepVerifierLastStepVerifyComplete() {
return StepVerifier.create(Mono.empty()).verifyComplete();
}
@@ -416,7 +540,8 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase {
ImmutableSet<Duration> testStepVerifierLastStepVerifyErrorClass() {
return ImmutableSet.of(
StepVerifier.create(Mono.empty()).verifyError(IllegalArgumentException.class),
StepVerifier.create(Mono.empty()).verifyError(IllegalStateException.class));
StepVerifier.create(Mono.empty()).verifyError(IllegalStateException.class),
StepVerifier.create(Mono.empty()).verifyError(AssertionError.class));
}
Duration testStepVerifierLastStepVerifyErrorMatches() {

View File

@@ -20,6 +20,7 @@ import static java.util.stream.Collectors.summingDouble;
import static java.util.stream.Collectors.summingInt;
import static java.util.stream.Collectors.summingLong;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Streams;
import java.util.DoubleSummaryStatistics;
@@ -36,6 +37,7 @@ final class StreamRulesTest implements RefasterRuleCollectionTestCase {
@Override
public ImmutableSet<Object> elidedTypesAndStaticImports() {
return ImmutableSet.of(
ImmutableList.class,
Objects.class,
Streams.class,
counting(),
@@ -258,4 +260,32 @@ final class StreamRulesTest implements RefasterRuleCollectionTestCase {
Stream.of(Stream.of(1), Stream.of(2)).flatMap(identity()),
Stream.of(Stream.of(3), Stream.of(4)).flatMap(v -> v));
}
Stream<Integer> testStreamTakeWhile() {
return Stream.of(1, 2, 3).takeWhile(i -> i < 2).filter(i -> i < 2);
}
Stream<Integer> testStreamIterate() {
return Stream.iterate(0, i -> i + 1).takeWhile(i -> i < 10);
}
Stream<Integer> testStreamOf1() {
return ImmutableList.of(1).stream();
}
Stream<Integer> testStreamOf2() {
return ImmutableList.of(1, 2).stream();
}
Stream<Integer> testStreamOf3() {
return ImmutableList.of(1, 2, 3).stream();
}
Stream<Integer> testStreamOf4() {
return ImmutableList.of(1, 2, 3, 4).stream();
}
Stream<Integer> testStreamOf5() {
return ImmutableList.of(1, 2, 3, 4, 5).stream();
}
}

View File

@@ -21,6 +21,7 @@ import static java.util.stream.Collectors.summingDouble;
import static java.util.stream.Collectors.summingInt;
import static java.util.stream.Collectors.summingLong;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Streams;
import java.util.Arrays;
@@ -38,6 +39,7 @@ final class StreamRulesTest implements RefasterRuleCollectionTestCase {
@Override
public ImmutableSet<Object> elidedTypesAndStaticImports() {
return ImmutableSet.of(
ImmutableList.class,
Objects.class,
Streams.class,
counting(),
@@ -258,4 +260,32 @@ final class StreamRulesTest implements RefasterRuleCollectionTestCase {
return ImmutableSet.of(
Streams.concat(Stream.of(1), Stream.of(2)), Streams.concat(Stream.of(3), Stream.of(4)));
}
Stream<Integer> testStreamTakeWhile() {
return Stream.of(1, 2, 3).takeWhile(i -> i < 2);
}
Stream<Integer> testStreamIterate() {
return Stream.iterate(0, i -> i < 10, i -> i + 1);
}
Stream<Integer> testStreamOf1() {
return Stream.of(1);
}
Stream<Integer> testStreamOf2() {
return Stream.of(1, 2);
}
Stream<Integer> testStreamOf3() {
return Stream.of(1, 2, 3);
}
Stream<Integer> testStreamOf4() {
return Stream.of(1, 2, 3, 4);
}
Stream<Integer> testStreamOf5() {
return Stream.of(1, 2, 3, 4, 5);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,183 @@
diff --git a/build.gradle.kts b/build.gradle.kts
index a9a6c0692..3695e9d9f 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -91,7 +91,8 @@ fun reportsForHumans() = !(System.getenv()["CI"]?.toBoolean() ?: false)
val skipJavadoc by props()
val enableMavenLocal by props()
val enableGradleMetadata by props()
-val werror by props(true) // treat javac warnings as errors
+// disable, as error prone will be producing lots of warnings
+val werror by props(false) // treat javac warnings as errors
// Inherited from stage-vote-release-plugin: skipSign, useGpgCmd
// Inherited from gradle-extensions-plugin: slowSuiteLogThreshold=0L, slowTestLogThreshold=2000L
@@ -510,8 +511,8 @@ fun com.github.autostyle.gradle.BaseFormatExtension.license() {
plugins.withType<JavaPlugin> {
configure<JavaPluginConvention> {
- sourceCompatibility = JavaVersion.VERSION_1_8
- targetCompatibility = JavaVersion.VERSION_1_8
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
}
configure<JavaPluginExtension> {
consistentResolution {
@@ -548,6 +549,7 @@ fun com.github.autostyle.gradle.BaseFormatExtension.license() {
if (!skipAutostyle) {
autostyle {
java {
+ googleJavaFormat()
filter.exclude(*javaccGeneratedPatterns +
"**/test/java/*.java" +
"**/RelRule.java" /** remove as part of CALCITE-4831 **/)
@@ -640,7 +642,7 @@ fun com.github.autostyle.gradle.BaseFormatExtension.license() {
replace("hamcrest: nullValue", "org.hamcrest.Matchers.nullValue", "org.hamcrest.CoreMatchers.nullValue")
replace("hamcrest: sameInstance", "org.hamcrest.core.IsSame.sameInstance", "org.hamcrest.CoreMatchers.sameInstance")
replace("hamcrest: startsWith", "org.hamcrest.core.StringStartsWith.startsWith", "org.hamcrest.CoreMatchers.startsWith")
- replaceRegex("hamcrest: size", "\\.size\\(\\), (is|equalTo)\\(", ", hasSize\\(")
+ // replaceRegex("hamcrest: size", "\\.size\\(\\), (is|equalTo)\\(", ", hasSize\\(")
custom("((() preventer", 1) { contents: String ->
ParenthesisBalancer.apply(contents)
}
@@ -685,17 +687,26 @@ fun com.github.autostyle.gradle.BaseFormatExtension.license() {
if (enableErrorprone) {
apply(plugin = "net.ltgt.errorprone")
+ repositories {
+ mavenLocal()
+ }
+
+ val errorProneFlags = System.getProperty("error-prone.flags")
+ val errorProneSupportVersion = System.getProperty("error-prone-support.version")
+
dependencies {
"errorprone"("com.google.errorprone:error_prone_core:${"errorprone".v}")
+ "annotationProcessor"("tech.picnic.error-prone-support:error-prone-contrib:$errorProneSupportVersion")
+ "annotationProcessor"("tech.picnic.error-prone-support:refaster-runner:$errorProneSupportVersion")
"annotationProcessor"("com.google.guava:guava-beta-checker:1.0")
}
tasks.withType<JavaCompile>().configureEach {
options.errorprone {
+ allErrorsAsWarnings.set(true)
disableWarningsInGeneratedCode.set(true)
errorproneArgs.add("-XepExcludedPaths:.*/javacc/.*")
- enable(
- "MethodCanBeStatic"
- )
+ errorproneArgs.addAll(errorProneFlags.toString().split(" "))
+ errorproneArgs.add("-XepOpt:Refaster:NamePattern=^((?!((JUnitTo)?AssertJ)).*)")
disable(
"ComplexBooleanConstant",
"EqualsGetClass",
@@ -704,7 +715,12 @@ fun com.github.autostyle.gradle.BaseFormatExtension.license() {
"MutableConstantField",
"ReferenceEquality",
"SameNameButDifferent",
- "TypeParameterUnusedInFormals"
+ "TypeParameterUnusedInFormals",
+ "CollectorMutability",
+ "MethodCanBeStatic",
+ "StaticImport",
+ "LexicographicalAnnotationListing",
+ "LexicographicalAnnotationAttributeListing"
)
// Analyze issues, and enable the check
disable(
diff --git a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
index 3cd45f455..1887d0a54 100644
--- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
+++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
@@ -1463,6 +1463,8 @@ private AggregateOnCalcToAggregateUnifyRule() {
operand(MutableAggregate.class, target(0)), 1);
}
+
+ @SuppressWarnings("MapEntryComparingByKey")
@Override protected @Nullable UnifyResult apply(UnifyRuleCall call) {
final MutableAggregate query = (MutableAggregate) call.query;
final MutableCalc qInput = (MutableCalc) query.getInput();
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
index 29b26adb3..5de5d25cd 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
@@ -621,6 +621,7 @@ private static String traitDiff(RelTraitSet original, RelTraitSet desired) {
.collect(Collectors.joining(", ", "[", "]"));
}
+ @SuppressWarnings("MapEntryComparingByValue")
public RelNode visit(
RelNode p,
int ordinal,
diff --git a/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java b/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java
index cb34fe3d5..5dbae21f5 100644
--- a/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java
+++ b/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java
@@ -324,10 +324,12 @@ private static class EmptyImmutableIntList extends ImmutableIntList {
return a;
}
+ @SuppressWarnings("ImmutableListOf")
@Override public Iterator<Integer> iterator() {
return Collections.<Integer>emptyList().iterator();
}
+ @SuppressWarnings("ImmutableListOf")
@Override public ListIterator<Integer> listIterator() {
return Collections.<Integer>emptyList().listIterator();
}
diff --git a/gradle.properties b/gradle.properties
index 3b0776230..42cfa56f3 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -53,7 +53,7 @@ com.google.protobuf.version=0.8.10
de.thetaphi.forbiddenapis.version=3.5.1
jacoco.version=0.8.10
kotlin.version=1.7.10
-net.ltgt.errorprone.version=1.3.0
+net.ltgt.errorprone.version=3.1.0
me.champeau.gradle.jmh.version=0.5.3
org.jetbrains.gradle.plugin.idea-ext.version=0.5
org.nosphere.apache.rat.version=0.7.0
@@ -75,7 +75,7 @@ kotlin.stdlib.default.dependency=false
checkerframework.version=3.10.0
checkstyle.version=8.28
spotbugs.version=3.1.11
-errorprone.version=2.5.1
+errorprone.version=HEAD-SNAPSHOT
# The property is used in https://github.com/wildfly/jandex regression testing, so avoid renaming
jandex.version=2.2.3.Final
@@ -109,7 +109,7 @@ foodmart-data-hsqldb.version=0.5
foodmart-data-json.version=0.4
foodmart-queries.version=0.4.1
geode-core.version=1.15.1
-guava.version=19.0
+guava.version=31.1-jre
h2.version=2.1.210
hadoop.version=2.7.5
hamcrest-date.version=2.0.4
diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java
index 482a30757..1b22df621 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java
@@ -417,6 +417,7 @@ public static <T> boolean equals(T t0, T t1) {
* above.
*/
@Deprecated // to be removed before 2.0
+ @SuppressWarnings("RequireNonNullStatement")
public static <T> T requireNonNull(T o) {
if (o == null) {
throw new NullPointerException();
diff --git a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java
index d78fab432..449c2ebdd 100644
--- a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java
+++ b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java
@@ -98,6 +98,7 @@
* @see SqlParserFixture
* @see SqlParserListFixture
*/
+@SuppressWarnings("JUnitClassModifiers")
public class SqlParserTest {
/**
* List of reserved keywords.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,253 @@
diff --git a/pom.xml b/pom.xml
index 0f453706b..a478db73f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -233,7 +233,8 @@
<junit.version>5.9.1</junit.version>
<forbiddenapis.version>3.4</forbiddenapis.version>
<json-schema-validator.version>1.2.0</json-schema-validator.version>
- <error-prone.version>2.15.0</error-prone.version>
+ <error-prone.version>v2.17.0-picnic-3</error-prone.version>
+ <error-prone-support.version>0.7.0</error-prone-support.version>
<checkerframework.version>3.27.0</checkerframework.version>
</properties>
@@ -333,6 +334,12 @@
<version>1.1.3</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <version>3.24.1</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>nl.jqno.equalsverifier</groupId>
<artifactId>equalsverifier</artifactId>
@@ -2322,15 +2329,25 @@
<arg>-Xpkginfo:always</arg>
<arg>-XDcompilePolicy=simple</arg>
<arg>
- -Xplugin:ErrorProne
+ -Xplugin:ErrorProne ${error-prone.flags}
</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
- <groupId>com.google.errorprone</groupId>
+ <groupId>com.github.PicnicSupermarket.error-prone</groupId>
<artifactId>error_prone_core</artifactId>
<version>${error-prone.version}</version>
</path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>error-prone-contrib</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>refaster-runner</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
</annotationProcessorPaths>
</configuration>
</execution>
@@ -2375,15 +2392,26 @@
<arg>-XDcompilePolicy=simple</arg>
<arg>
-Xplugin:ErrorProne \
- -XepExcludedPaths:.*[\\/]resources[\\/].*
+ -XepExcludedPaths:.*[\\/]resources[\\/].* \
+ ${error-prone.flags}
</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
- <groupId>com.google.errorprone</groupId>
+ <groupId>com.github.PicnicSupermarket.error-prone</groupId>
<artifactId>error_prone_core</artifactId>
<version>${error-prone.version}</version>
</path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>error-prone-contrib</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>refaster-runner</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
</annotationProcessorPaths>
</configuration>
</execution>
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinter.java b/src/main/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinter.java
index de390a42c..a0ff7a866 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinter.java
@@ -63,6 +63,7 @@ public final class DetailNodeTreeStringPrinter {
* @return DetailNode tree
* @throws IllegalArgumentException if there is an error parsing the Javadoc.
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static DetailNode parseJavadocAsDetailNode(DetailAST blockComment) {
final JavadocDetailNodeParser parser = new JavadocDetailNodeParser();
final ParseStatus status = parser.parseJavadocAsDetailNode(blockComment);
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/PackageObjectFactory.java b/src/main/java/com/puppycrawl/tools/checkstyle/PackageObjectFactory.java
index bec9669bf..2ad0f4467 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/PackageObjectFactory.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/PackageObjectFactory.java
@@ -300,6 +300,7 @@ public class PackageObjectFactory implements ModuleFactory {
* @return the map of third party Checkstyle module names to the set of their fully qualified
* names
*/
+ @SuppressWarnings("CollectorMutability")
private Map<String, Set<String>> generateThirdPartyNameToFullModuleName(ClassLoader loader) {
Map<String, Set<String>> returnValue;
try {
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/SarifLogger.java b/src/main/java/com/puppycrawl/tools/checkstyle/SarifLogger.java
index 399893f40..aa93aca80 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/SarifLogger.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/SarifLogger.java
@@ -140,6 +140,7 @@ public class SarifLogger extends AutomaticBean implements AuditListener {
@Override
public void auditFinished(AuditEvent event) {
final String version = SarifLogger.class.getPackage().getImplementationVersion();
+ @SuppressWarnings("IdentityConversion")
final String rendered = report
.replace(VERSION_PLACEHOLDER, String.valueOf(version))
.replace(RESULTS_PLACEHOLDER, String.join(",\n", results));
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalCatchCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalCatchCheck.java
index fd1d9d729..d5d891d6e 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalCatchCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalCatchCheck.java
@@ -152,6 +152,7 @@ public final class IllegalCatchCheck extends AbstractCheck {
public static final String MSG_KEY = "illegal.catch";
/** Specify exception class names to reject. */
+ @SuppressWarnings("CollectorMutability")
private final Set<String> illegalClassNames = Arrays.stream(new String[] {"Exception", "Error",
"RuntimeException", "Throwable", "java.lang.Error", "java.lang.Exception",
"java.lang.RuntimeException", "java.lang.Throwable", }).collect(Collectors.toSet());
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalThrowsCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalThrowsCheck.java
index d00cd2fdf..4a0d9220d 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalThrowsCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalThrowsCheck.java
@@ -159,10 +159,12 @@ public final class IllegalThrowsCheck extends AbstractCheck {
public static final String MSG_KEY = "illegal.throw";
/** Specify names of methods to ignore. */
+ @SuppressWarnings("CollectorMutability")
private final Set<String> ignoredMethodNames =
Arrays.stream(new String[] {"finalize", }).collect(Collectors.toSet());
/** Specify throw class names to reject. */
+ @SuppressWarnings("CollectorMutability")
private final Set<String> illegalClassNames = Arrays.stream(
new String[] {"Error", "RuntimeException", "Throwable", "java.lang.Error",
"java.lang.RuntimeException", "java.lang.Throwable", })
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/AbstractModuleTestSupport.java b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractModuleTestSupport.java
index 157e65406..239c2ecc6 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/AbstractModuleTestSupport.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractModuleTestSupport.java
@@ -553,6 +553,7 @@ public abstract class AbstractModuleTestSupport extends AbstractPathTestSupport
*/
protected static String[] removeSuppressed(String[] actualViolations,
String... suppressedViolations) {
+ @SuppressWarnings("CollectorMutability")
final List<String> actualViolationsList =
Arrays.stream(actualViolations).collect(Collectors.toList());
actualViolationsList.removeAll(Arrays.asList(suppressedViolations));
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/CheckerTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/CheckerTest.java
index 8fee6bfed..7e20a1580 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/CheckerTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/CheckerTest.java
@@ -90,6 +90,7 @@ import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
* @noinspectionreason ClassWithTooManyDependencies - complex tests require a large number
* of imports
*/
+@SuppressWarnings("JUnitClassModifiers")
public class CheckerTest extends AbstractModuleTestSupport {
@TempDir
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/ConfigurationLoaderTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/ConfigurationLoaderTest.java
index 72881222e..9e81ede00 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/ConfigurationLoaderTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/ConfigurationLoaderTest.java
@@ -46,6 +46,7 @@ import com.puppycrawl.tools.checkstyle.internal.utils.TestUtil;
/**
* Unit test for ConfigurationLoader.
*/
+@SuppressWarnings("JUnitClassModifiers")
public class ConfigurationLoaderTest extends AbstractPathTestSupport {
@Override
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/JavaAstVisitorTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/JavaAstVisitorTest.java
index 5280ab216..2b984fe89 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/JavaAstVisitorTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/JavaAstVisitorTest.java
@@ -106,6 +106,7 @@ public class JavaAstVisitorTest extends AbstractModuleTestSupport {
.map(Method::getName)
.collect(Collectors.toSet());
+ @SuppressWarnings("CollectorMutability")
final Set<String> filteredVisitMethodNames = Arrays.stream(visitMethods)
.filter(method -> method.getName().contains("visit"))
.filter(method -> method.getModifiers() == Modifier.PUBLIC)
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/PackageObjectFactoryTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/PackageObjectFactoryTest.java
index 41636ec4b..9ada7757d 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/PackageObjectFactoryTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/PackageObjectFactoryTest.java
@@ -98,6 +98,7 @@ public class PackageObjectFactoryTest {
public void testCtorNullPackageException1() {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try {
+ @SuppressWarnings("ImmutableSetOf1")
final Object test = new PackageObjectFactory(Collections.singleton(null), classLoader);
assertWithMessage("Exception is expected but got " + test).fail();
}
@@ -126,6 +127,7 @@ public class PackageObjectFactoryTest {
public void testCtorNullPackageException3() {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try {
+ @SuppressWarnings("ImmutableSetOf1")
final Object test = new PackageObjectFactory(Collections.singleton(null), classLoader,
TRY_IN_ALL_REGISTERED_PACKAGES);
assertWithMessage("Exception is expected but got " + test).fail();
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/TreeWalkerTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/TreeWalkerTest.java
index da5d8f2af..4b6f85e95 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/TreeWalkerTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/TreeWalkerTest.java
@@ -79,6 +79,7 @@ import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
* @noinspectionreason ClassWithTooManyDependencies - complex tests require a
* large number of imports
*/
+@SuppressWarnings("JUnitClassModifiers")
public class TreeWalkerTest extends AbstractModuleTestSupport {
@TempDir
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/XpathRegressionTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/XpathRegressionTest.java
index 2e5ce578c..ebf661993 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/XpathRegressionTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/XpathRegressionTest.java
@@ -180,6 +180,7 @@ public class XpathRegressionTest extends AbstractModuleTestSupport {
@Test
public void validateIncompatibleJavadocCheckNames() throws IOException {
// subclasses of AbstractJavadocCheck
+ @SuppressWarnings("CollectorMutability")
final Set<Class<?>> abstractJavadocCheckNames = CheckUtil.getCheckstyleChecks()
.stream()
.filter(AbstractJavadocCheck.class::isAssignableFrom)
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CheckUtil.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CheckUtil.java
index ae779e07b..55f68955e 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CheckUtil.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CheckUtil.java
@@ -78,6 +78,7 @@ public final class CheckUtil {
* @param checks class instances.
* @return a set of simple names.
*/
+ @SuppressWarnings("CollectorMutability")
public static Set<String> getSimpleNames(Set<Class<?>> checks) {
return checks.stream().map(check -> {
String name = check.getSimpleName();

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,136 @@
diff --git a/config/archunit-store/slices-should-be-free-of-cycles-suppressions b/config/archunit-store/slices-should-be-free-of-cycles-suppressions
index 476efc1b9..4eab67306 100644
--- a/config/archunit-store/slices-should-be-free-of-cycles-suppressions
+++ b/config/archunit-store/slices-should-be-free-of-cycles-suppressions
@@ -1351,8 +1351,8 @@ Cycle detected: Slice checks.javadoc -> \
- Constructor <com.puppycrawl.tools.checkstyle.checks.javadoc.AtclauseOrderCheck.<init>()> calls method <com.puppycrawl.tools.checkstyle.utils.TokenUtil.asBitSet([I)> in (AtclauseOrderCheck.java:177)\
- Method <com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTagContinuationIndentationCheck.visitJavadocToken(com.puppycrawl.tools.checkstyle.api.DetailNode)> calls method <com.puppycrawl.tools.checkstyle.utils.JavadocUtil.getNextSibling(com.puppycrawl.tools.checkstyle.api.DetailNode)> in (JavadocTagContinuationIndentationCheck.java:177)\
- Method <com.puppycrawl.tools.checkstyle.checks.javadoc.RequireEmptyLineBeforeBlockTagGroupCheck.isAnotherTagBefore(com.puppycrawl.tools.checkstyle.api.DetailNode)> calls method <com.puppycrawl.tools.checkstyle.utils.JavadocUtil.getPreviousSibling(com.puppycrawl.tools.checkstyle.api.DetailNode)> in (RequireEmptyLineBeforeBlockTagGroupCheck.java:177)\
+ - Method <com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocNodeImpl.toString()> calls method <com.puppycrawl.tools.checkstyle.utils.JavadocUtil.getTokenName(int)> in (JavadocNodeImpl.java:178)\
- Method <com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTagInfo$8.isValidOn(com.puppycrawl.tools.checkstyle.api.DetailAST)> calls method <com.puppycrawl.tools.checkstyle.utils.ScopeUtil.isLocalVariableDef(com.puppycrawl.tools.checkstyle.api.DetailAST)> in (JavadocTagInfo.java:178)\
- - Method <com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocNodeImpl.toString()> calls method <com.puppycrawl.tools.checkstyle.utils.JavadocUtil.getTokenName(int)> in (JavadocNodeImpl.java:179)\
- Method <com.puppycrawl.tools.checkstyle.checks.javadoc.AbstractJavadocCheck.setJavadocTokens([Ljava.lang.String;)> calls method <com.puppycrawl.tools.checkstyle.utils.JavadocUtil.getTokenId(java.lang.String)> in (AbstractJavadocCheck.java:181)\
- Method <com.puppycrawl.tools.checkstyle.checks.javadoc.RequireEmptyLineBeforeBlockTagGroupCheck.isAnotherTagBefore(com.puppycrawl.tools.checkstyle.api.DetailNode)> calls method <com.puppycrawl.tools.checkstyle.utils.JavadocUtil.getPreviousSibling(com.puppycrawl.tools.checkstyle.api.DetailNode)> in (RequireEmptyLineBeforeBlockTagGroupCheck.java:183)\
- Method <com.puppycrawl.tools.checkstyle.checks.javadoc.NonEmptyAtclauseDescriptionCheck.hasOnlyEmptyText(com.puppycrawl.tools.checkstyle.api.DetailNode)> calls method <com.puppycrawl.tools.checkstyle.utils.CommonUtil.isBlank(java.lang.String)> in (NonEmptyAtclauseDescriptionCheck.java:185)\
diff --git a/pom.xml b/pom.xml
index e47bd227e..304b565ed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -230,10 +230,12 @@
<pitest.junit5.plugin.version>1.1.2</pitest.junit5.plugin.version>
<pitest.accelerator.junit5.plugin.version>1.0.4</pitest.accelerator.junit5.plugin.version>
<sonar.test.exclusions>**/test/resources/**/*,**/it/resources/**/*</sonar.test.exclusions>
+ <assertj.version>3.24.2</assertj.version>
<junit.version>5.9.2</junit.version>
<forbiddenapis.version>3.4</forbiddenapis.version>
<json-schema-validator.version>1.2.0</json-schema-validator.version>
- <error-prone.version>2.18.0</error-prone.version>
+ <error-prone.version>2.18.0-picnic-1</error-prone.version>
+ <error-prone-support.version>0.9.0</error-prone-support.version>
<checkerframework.version>3.27.0</checkerframework.version>
</properties>
@@ -277,6 +279,12 @@
</dependency>
<!-- test scope stuff -->
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <version>${assertj.version}</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
@@ -2308,15 +2316,25 @@
<arg>-Xpkginfo:always</arg>
<arg>-XDcompilePolicy=simple</arg>
<arg>
- -Xplugin:ErrorProne
+ -Xplugin:ErrorProne ${error-prone.flags}
</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
- <groupId>com.google.errorprone</groupId>
+ <groupId>com.github.PicnicSupermarket.error-prone</groupId>
<artifactId>error_prone_core</artifactId>
<version>${error-prone.version}</version>
</path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>error-prone-contrib</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>refaster-runner</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
</annotationProcessorPaths>
</configuration>
</execution>
@@ -2361,15 +2379,26 @@
<arg>-XDcompilePolicy=simple</arg>
<arg>
-Xplugin:ErrorProne \
- -XepExcludedPaths:.*[\\/]resources[\\/].*
+ -XepExcludedPaths:.*[\\/]resources[\\/].* \
+ ${error-prone.flags}
</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
- <groupId>com.google.errorprone</groupId>
+ <groupId>com.github.PicnicSupermarket.error-prone</groupId>
<artifactId>error_prone_core</artifactId>
<version>${error-prone.version}</version>
</path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>error-prone-contrib</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>refaster-runner</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
</annotationProcessorPaths>
</configuration>
</execution>
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinter.java b/src/main/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinter.java
index 61c59b613..9019964ad 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinter.java
@@ -63,6 +63,7 @@ public final class DetailNodeTreeStringPrinter {
* @return DetailNode tree
* @throws IllegalArgumentException if there is an error parsing the Javadoc.
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static DetailNode parseJavadocAsDetailNode(DetailAST blockComment) {
final JavadocDetailNodeParser parser = new JavadocDetailNodeParser();
final ParseStatus status = parser.parseJavadocAsDetailNode(blockComment);
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocNodeImpl.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocNodeImpl.java
index fd90c4259..0c1b4f141 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocNodeImpl.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocNodeImpl.java
@@ -20,7 +20,6 @@
package com.puppycrawl.tools.checkstyle.checks.javadoc;
import java.util.Arrays;
-import java.util.Objects;
import java.util.Optional;
import com.puppycrawl.tools.checkstyle.api.DetailNode;
@@ -180,7 +179,7 @@ public class JavadocNodeImpl implements DetailNode {
+ ", text='" + text + '\''
+ ", lineNumber=" + lineNumber
+ ", columnNumber=" + columnNumber
- + ", children=" + Objects.hashCode(children)
+ + ", children=" + Arrays.hashCode(children)
+ ", parent=" + parent + ']';
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,929 @@
diff --git a/guava/src/com/google/common/collect/Iterables.java b/guava/src/com/google/common/collect/Iterables.java
index 7928b15d67..f86ac443ba 100644
--- a/guava/src/com/google/common/collect/Iterables.java
+++ b/guava/src/com/google/common/collect/Iterables.java
@@ -1041,6 +1041,7 @@ public final class Iterables {
*
* @return {@code true} if the iterable contains no elements
*/
+ @SuppressWarnings("IterableIsEmpty")
public static boolean isEmpty(Iterable<?> iterable) {
if (iterable instanceof Collection) {
return ((Collection<?>) iterable).isEmpty();
diff --git a/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java b/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
index a5a20ec3ad..9bad916fe3 100644
--- a/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
+++ b/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
@@ -839,6 +839,7 @@ public class NullPointerTesterTest extends TestCase {
@SuppressWarnings("unused") // for NullPointerTester
private static class ClassThatFailsToThrowForStatic {
+ @SuppressWarnings("EmptyMethod")
static void staticOneArg(String s) {}
}
@@ -854,6 +855,7 @@ public class NullPointerTesterTest extends TestCase {
private static class SubclassThatTriesToOverrideBadStaticMethod
extends ClassThatFailsToThrowForStatic {
+ @SuppressWarnings("EmptyMethod")
static void staticOneArg(@Nullable String s) {}
}
diff --git a/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java b/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java
index c5db2d575c..4aa3d60ff0 100644
--- a/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java
+++ b/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java
@@ -1338,7 +1338,7 @@ public class ClassSanityTesterTest extends TestCase {
private enum EnumFailsToCheckNull {
A;
- @SuppressWarnings("unused")
+ @SuppressWarnings({"unused", "EmptyMethod"})
public void failToCheckNull(String s) {}
}
diff --git a/guava/src/com/google/common/base/Platform.java b/guava/src/com/google/common/base/Platform.java
index 644e89cbfa..137f879603 100644
--- a/guava/src/com/google/common/base/Platform.java
+++ b/guava/src/com/google/common/base/Platform.java
@@ -55,6 +55,7 @@ final class Platform {
return String.format(Locale.ROOT, "%.4g", value);
}
+ @SuppressWarnings("StringIsNullOrEmpty")
static boolean stringIsNullOrEmpty(@CheckForNull String string) {
return string == null || string.isEmpty();
}
diff --git a/guava/src/com/google/common/base/Preconditions.java b/guava/src/com/google/common/base/Preconditions.java
index 13ff77b7f7..1d9729951c 100644
--- a/guava/src/com/google/common/base/Preconditions.java
+++ b/guava/src/com/google/common/base/Preconditions.java
@@ -126,6 +126,7 @@ public final class Preconditions {
* @param expression a boolean expression
* @throws IllegalArgumentException if {@code expression} is false
*/
+ @SuppressWarnings("CheckArgument")
public static void checkArgument(boolean expression) {
if (!expression) {
throw new IllegalArgumentException();
@@ -140,6 +141,7 @@ public final class Preconditions {
* string using {@link String#valueOf(Object)}
* @throws IllegalArgumentException if {@code expression} is false
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(boolean expression, @CheckForNull Object errorMessage) {
if (!expression) {
throw new IllegalArgumentException(String.valueOf(errorMessage));
@@ -159,6 +161,7 @@ public final class Preconditions {
* are converted to strings using {@link String#valueOf(Object)}.
* @throws IllegalArgumentException if {@code expression} is false
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean expression,
String errorMessageTemplate,
@@ -175,6 +178,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(boolean b, String errorMessageTemplate, char p1) {
if (!b) {
throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
@@ -267,6 +271,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean b, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
if (!b) {
@@ -281,6 +286,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(boolean b, String errorMessageTemplate, int p1, char p2) {
if (!b) {
throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -294,6 +300,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(boolean b, String errorMessageTemplate, int p1, int p2) {
if (!b) {
throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -307,6 +314,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(boolean b, String errorMessageTemplate, int p1, long p2) {
if (!b) {
throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -320,6 +328,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean b, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
if (!b) {
@@ -334,6 +343,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(boolean b, String errorMessageTemplate, long p1, char p2) {
if (!b) {
throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -347,6 +357,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(boolean b, String errorMessageTemplate, long p1, int p2) {
if (!b) {
throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -360,6 +371,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(boolean b, String errorMessageTemplate, long p1, long p2) {
if (!b) {
throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -373,6 +385,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean b, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
if (!b) {
@@ -387,6 +400,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean b, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
if (!b) {
@@ -401,6 +415,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean b, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
if (!b) {
@@ -415,6 +430,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean b, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
if (!b) {
@@ -429,6 +445,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean b, String errorMessageTemplate, @CheckForNull Object p1, @CheckForNull Object p2) {
if (!b) {
@@ -443,6 +460,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean b,
String errorMessageTemplate,
@@ -461,6 +479,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckArgumentWithMessage")
public static void checkArgument(
boolean b,
String errorMessageTemplate,
@@ -481,6 +500,7 @@ public final class Preconditions {
* @throws IllegalStateException if {@code expression} is false
* @see Verify#verify Verify.verify()
*/
+ @SuppressWarnings("CheckState")
public static void checkState(boolean expression) {
if (!expression) {
throw new IllegalStateException();
@@ -497,6 +517,7 @@ public final class Preconditions {
* @throws IllegalStateException if {@code expression} is false
* @see Verify#verify Verify.verify()
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean expression, @CheckForNull Object errorMessage) {
if (!expression) {
throw new IllegalStateException(String.valueOf(errorMessage));
@@ -518,6 +539,7 @@ public final class Preconditions {
* @throws IllegalStateException if {@code expression} is false
* @see Verify#verify Verify.verify()
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean expression,
/*
@@ -543,6 +565,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, char p1) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
@@ -557,6 +580,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, int p1) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
@@ -571,6 +595,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, long p1) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
@@ -585,6 +610,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, @CheckForNull Object p1) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
@@ -599,6 +625,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, char p1, char p2) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -613,6 +640,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, char p1, int p2) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -627,6 +655,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, char p1, long p2) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -641,6 +670,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean b, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
if (!b) {
@@ -656,6 +686,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, int p1, char p2) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -670,6 +701,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, int p1, int p2) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -684,6 +716,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, int p1, long p2) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -698,6 +731,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean b, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
if (!b) {
@@ -713,6 +747,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, long p1, char p2) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -727,6 +762,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, long p1, int p2) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -741,6 +777,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(boolean b, String errorMessageTemplate, long p1, long p2) {
if (!b) {
throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
@@ -755,6 +792,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean b, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
if (!b) {
@@ -770,6 +808,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean b, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
if (!b) {
@@ -785,6 +824,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean b, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
if (!b) {
@@ -800,6 +840,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean b, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
if (!b) {
@@ -815,6 +856,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean b, String errorMessageTemplate, @CheckForNull Object p1, @CheckForNull Object p2) {
if (!b) {
@@ -830,6 +872,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean b,
String errorMessageTemplate,
@@ -849,6 +892,7 @@ public final class Preconditions {
*
* @since 20.0 (varargs overload since 2.0)
*/
+ @SuppressWarnings("CheckStateWithMessage")
public static void checkState(
boolean b,
String errorMessageTemplate,
@@ -884,6 +928,7 @@ public final class Preconditions {
* @see Verify#verifyNotNull Verify.verifyNotNull()
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullStatement")
public static <T> T checkNotNull(@CheckForNull T reference) {
if (reference == null) {
throw new NullPointerException();
@@ -902,6 +947,7 @@ public final class Preconditions {
* @see Verify#verifyNotNull Verify.verifyNotNull()
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(@CheckForNull T reference, @CheckForNull Object errorMessage) {
if (reference == null) {
throw new NullPointerException(String.valueOf(errorMessage));
@@ -925,6 +971,7 @@ public final class Preconditions {
* @see Verify#verifyNotNull Verify.verifyNotNull()
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T reference,
String errorMessageTemplate,
@@ -943,6 +990,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(@CheckForNull T obj, String errorMessageTemplate, char p1) {
if (obj == null) {
throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
@@ -958,6 +1006,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(@CheckForNull T obj, String errorMessageTemplate, int p1) {
if (obj == null) {
throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
@@ -973,6 +1022,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(@CheckForNull T obj, String errorMessageTemplate, long p1) {
if (obj == null) {
throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
@@ -988,6 +1038,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1) {
if (obj == null) {
@@ -1004,6 +1055,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, char p1, char p2) {
if (obj == null) {
@@ -1020,6 +1072,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, char p1, int p2) {
if (obj == null) {
@@ -1036,6 +1089,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, char p1, long p2) {
if (obj == null) {
@@ -1052,6 +1106,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
if (obj == null) {
@@ -1068,6 +1123,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, int p1, char p2) {
if (obj == null) {
@@ -1084,6 +1140,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, int p1, int p2) {
if (obj == null) {
@@ -1100,6 +1157,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, int p1, long p2) {
if (obj == null) {
@@ -1116,6 +1174,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
if (obj == null) {
@@ -1132,6 +1191,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, long p1, char p2) {
if (obj == null) {
@@ -1148,6 +1208,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, long p1, int p2) {
if (obj == null) {
@@ -1164,6 +1225,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, long p1, long p2) {
if (obj == null) {
@@ -1180,6 +1242,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
if (obj == null) {
@@ -1196,6 +1259,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
if (obj == null) {
@@ -1212,6 +1276,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
if (obj == null) {
@@ -1228,6 +1293,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
if (obj == null) {
@@ -1244,6 +1310,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj,
String errorMessageTemplate,
@@ -1263,6 +1330,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj,
String errorMessageTemplate,
@@ -1283,6 +1351,7 @@ public final class Preconditions {
* @since 20.0 (varargs overload since 2.0)
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("RequireNonNullWithMessageStatement")
public static <T> T checkNotNull(
@CheckForNull T obj,
String errorMessageTemplate,
@@ -1349,6 +1418,7 @@ public final class Preconditions {
* @throws IllegalArgumentException if {@code size} is negative
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("CheckElementIndexWithMessage")
public static int checkElementIndex(int index, int size, String desc) {
// Carefully optimized for execution by hotspot (explanatory comment above)
if (index < 0 || index >= size) {
@@ -1394,6 +1464,7 @@ public final class Preconditions {
* @throws IllegalArgumentException if {@code size} is negative
*/
@CanIgnoreReturnValue
+ @SuppressWarnings("CheckPositionIndexWithMessage")
public static int checkPositionIndex(int index, int size, String desc) {
// Carefully optimized for execution by hotspot (explanatory comment above)
if (index < 0 || index > size) {
diff --git a/guava/src/com/google/common/base/Strings.java b/guava/src/com/google/common/base/Strings.java
index e56bf1c481..459acbca1a 100644
--- a/guava/src/com/google/common/base/Strings.java
+++ b/guava/src/com/google/common/base/Strings.java
@@ -265,6 +265,7 @@ public final class Strings {
* @since 25.1
*/
// TODO(diamondm) consider using Arrays.toString() for array parameters
+ @SuppressWarnings("IdentityConversion")
public static String lenientFormat(
@CheckForNull String template, @CheckForNull @Nullable Object... args) {
template = String.valueOf(template); // null -> "null"
diff --git a/guava/src/com/google/common/graph/UndirectedNetworkConnections.java b/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
index 190897f882..f11f98867c 100644
--- a/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
+++ b/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
@@ -43,6 +43,7 @@ final class UndirectedNetworkConnections<N, E> extends AbstractUndirectedNetwork
return new UndirectedNetworkConnections<>(HashBiMap.<E, N>create(EXPECTED_DEGREE));
}
+ @SuppressWarnings("IdentityConversion")
static <N, E> UndirectedNetworkConnections<N, E> ofImmutable(Map<E, N> incidentEdges) {
return new UndirectedNetworkConnections<>(ImmutableBiMap.copyOf(incidentEdges));
}
diff --git a/guava/src/com/google/common/graph/DirectedNetworkConnections.java b/guava/src/com/google/common/graph/DirectedNetworkConnections.java
index e1db65708e..9d70c790ee 100644
--- a/guava/src/com/google/common/graph/DirectedNetworkConnections.java
+++ b/guava/src/com/google/common/graph/DirectedNetworkConnections.java
@@ -44,6 +44,7 @@ final class DirectedNetworkConnections<N, E> extends AbstractDirectedNetworkConn
HashBiMap.<E, N>create(EXPECTED_DEGREE), HashBiMap.<E, N>create(EXPECTED_DEGREE), 0);
}
+ @SuppressWarnings("IdentityConversion")
static <N, E> DirectedNetworkConnections<N, E> ofImmutable(
Map<E, N> inEdges, Map<E, N> outEdges, int selfLoopCount) {
return new DirectedNetworkConnections<>(
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java b/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java
index 35063e815d..3f445ca116 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java
@@ -60,6 +60,7 @@ public class MapGenerators {
public static class ImmutableMapCopyOfGenerator extends TestStringMapGenerator {
@Override
+ @SuppressWarnings("IdentityConversion")
protected Map<String, String> create(Entry<String, String>[] entries) {
Map<String, String> builder = Maps.newLinkedHashMap();
for (Entry<String, String> entry : entries) {
@@ -71,6 +72,7 @@ public class MapGenerators {
public static class ImmutableMapCopyOfEntriesGenerator extends TestStringMapGenerator {
@Override
+ @SuppressWarnings("IdentityConversion")
protected Map<String, String> create(Entry<String, String>[] entries) {
return ImmutableMap.copyOf(Arrays.asList(entries));
}
@@ -162,6 +164,7 @@ public class MapGenerators {
public static class ImmutableMapCopyOfEnumMapGenerator extends TestEnumMapGenerator {
@Override
+ @SuppressWarnings("IdentityConversion")
protected Map<AnEnum, String> create(Entry<AnEnum, String>[] entries) {
EnumMap<AnEnum, String> map = new EnumMap<>(AnEnum.class);
for (Entry<AnEnum, String> entry : entries) {
diff --git a/guava/src/com/google/common/collect/RegularImmutableSortedSet.java b/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
index 572e0acbf5..fa17e67916 100644
--- a/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
+++ b/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
@@ -324,6 +324,7 @@ final class RegularImmutableSortedSet<E> extends ImmutableSortedSet<E> {
@Override
ImmutableSortedSet<E> createDescendingSet() {
+ @SuppressWarnings("StaticImport")
Comparator<? super E> reversedOrder = Collections.reverseOrder(comparator);
return isEmpty()
? emptySet(reversedOrder)
diff --git a/pom.xml b/pom.xml
index 13dd0985d3..30c1060d1c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,6 +22,9 @@
<maven-javadoc-plugin.additionalJOptions></maven-javadoc-plugin.additionalJOptions>
<maven-source-plugin.version>3.2.1</maven-source-plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <error-prone.version>v2.19.1-picnic-1</error-prone.version> <java.version>11</java.version>
+ <error-prone-support.version>0.11.2-SNAPSHOT</error-prone-support.version>
+ <maven.compiler.plugin.version>3.11.0</maven.compiler.plugin.version>
</properties>
<issueManagement>
<system>GitHub Issues</system>
@@ -347,50 +350,163 @@
</dependencyManagement>
<profiles>
<profile>
- <id>sonatype-oss-release</id>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-source-plugin</artifactId>
- <version>${maven-source-plugin.version}</version>
- <executions>
- <execution>
- <id>attach-sources</id>
- <goals>
- <goal>jar-no-fork</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <version>${maven-javadoc-plugin.version}</version>
- <executions>
- <execution>
- <id>attach-javadocs</id>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-gpg-plugin</artifactId>
- <version>1.6</version>
- <executions>
- <execution>
- <id>sign-artifacts</id>
- <phase>verify</phase>
- <goals>
- <goal>sign</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
+ <id>error-prone-compile</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>${maven.compiler.plugin.version}</version>
+ <executions>
+ <execution>
+ <id>error-prone-compile</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ <configuration>
+ <failOnError>false</failOnError>
+ <source>1.8</source>
+ <target>1.8</target>
+ <compilerArgs>
+ <arg>-Xpkginfo:always</arg>
+ <arg>-XDcompilePolicy=simple</arg>
+ <arg>
+ -Xplugin:ErrorProne ${error-prone.flags} -Xep:CollectorMutability:OFF -Xep:FluxImplicitBlock:OFF -Xep:ScheduledTransactionTrace:OFF -XepOpt:Refaster:NamePattern=^((?!(Immutable|PrimitiveRules|AssortedRules\$CheckIndex|NullRules\$RequireNonNullElse|MapEntryRules\$MapEntry|OptionalRules\$OptionalOrElseThrow|OptionalRules\$OptionalIsEmpty)).*)
+ </arg>
+ </compilerArgs>
+ <annotationProcessorPaths>
+ <path>
+ <groupId>com.github.PicnicSupermarket.error-prone</groupId>
+ <artifactId>error_prone_core</artifactId>
+ <version>${error-prone.version}</version>
+ </path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>error-prone-contrib</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>refaster-runner</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
+ </annotationProcessorPaths>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>error-prone-test-compile</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>${maven.compiler.plugin.version}</version>
+ <executions>
+ <!-- Skip the default-testCompile execution as we don't want to execute the testCompile goal twice -->
+ <execution>
+ <id>default-testCompile</id>
+ <phase>test-compile</phase>
+ <goals>
+ <goal>testCompile</goal>
+ </goals>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </execution>
+ <execution>
+ <id>error-prone-test-compile</id>
+ <phase>test-compile</phase>
+ <goals>
+ <goal>testCompile</goal>
+ </goals>
+ <configuration>
+ <failOnError>false</failOnError>
+ <source>${java.version}</source>
+ <target>${java.version}</target>
+ <compilerArgs>
+ <arg>-Xpkginfo:always</arg>
+ <arg>-XDcompilePolicy=simple</arg>
+ <arg>
+ -Xplugin:ErrorProne \
+
+ ${error-prone.flags}
+ </arg>
+ </compilerArgs>
+ <annotationProcessorPaths>
+ <path>
+ <groupId>com.github.PicnicSupermarket.error-prone</groupId>
+ <artifactId>error_prone_core</artifactId>
+ <version>${error-prone.version}</version>
+ </path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>error-prone-contrib</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
+ <path>
+ <groupId>tech.picnic.error-prone-support</groupId>
+ <artifactId>refaster-runner</artifactId>
+ <version>${error-prone-support.version}</version>
+ </path>
+ </annotationProcessorPaths>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>sonatype-oss-release</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>${maven-source-plugin.version}</version>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <goals>
+ <goal>jar-no-fork</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>${maven-javadoc-plugin.version}</version>
+ <executions>
+ <execution>
+ <id>attach-javadocs</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-gpg-plugin</artifactId>
+ <version>1.6</version>
+ <executions>
+ <execution>
+ <id>sign-artifacts</id>
+ <phase>verify</phase>
+ <goals>
+ <goal>sign</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
</build>
</profile>
<profile>

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More