diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ReactorRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ReactorRules.java index e698b07f..52a3e5fd 100644 --- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ReactorRules.java +++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ReactorRules.java @@ -365,13 +365,21 @@ final class ReactorRules { } } - /** Don't unnecessarily pass an empty publisher to {@link Mono#switchIfEmpty(Mono)}. */ - static final class MonoSwitchIfEmptyOfEmptyPublisher { + /** Don't unnecessarily transform a {@link Mono} to an equivalent instance. */ + static final class MonoIdentity { @BeforeTemplate Mono before(Mono mono) { return mono.switchIfEmpty(Mono.empty()); } + // XXX: Review the suppression once NullAway has better support for generics. Keep an eye on + // https://github.com/uber/NullAway/issues?q=is%3Aopen+generics. + @BeforeTemplate + @SuppressWarnings("NullAway" /* False positive. */) + Mono<@Nullable Void> before2(Mono<@Nullable Void> mono) { + return mono.then(); + } + @AfterTemplate Mono after(Mono mono) { return mono; @@ -675,6 +683,19 @@ final class ReactorRules { } } + /** Prefer direct invocation of {@link Mono#then()}} over more contrived alternatives. */ + static final class MonoThen { + @BeforeTemplate + Mono<@Nullable Void> before(Mono mono) { + return mono.flux().then(); + } + + @AfterTemplate + Mono<@Nullable Void> after(Mono mono) { + return mono.then(); + } + } + /** * Prefer a collection using {@link MoreCollectors#toOptional()} over more contrived alternatives. */ diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestInput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestInput.java index 6ee8cbf8..c483d1e3 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestInput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestInput.java @@ -115,8 +115,8 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { Flux.just("baz").switchIfEmpty(Flux.just("qux"))); } - Mono testMonoSwitchIfEmptyOfEmptyPublisher() { - return Mono.just(1).switchIfEmpty(Mono.empty()); + ImmutableSet> testMonoIdentity() { + return ImmutableSet.of(Mono.just(1).switchIfEmpty(Mono.empty()), Mono.empty().then()); } ImmutableSet> testFluxSwitchIfEmptyOfEmptyPublisher() { @@ -221,6 +221,10 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { Flux.concat(Mono.just("baz"))); } + Mono testMonoThen() { + return Mono.just("foo").flux().then(); + } + Mono> testMonoCollectToOptional() { return Mono.just("foo").map(Optional::of).defaultIfEmpty(Optional.empty()); } diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestOutput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestOutput.java index 5a15684a..619334ba 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestOutput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestOutput.java @@ -120,8 +120,8 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { Flux.just("foo").defaultIfEmpty("bar"), Flux.just("baz").defaultIfEmpty("qux")); } - Mono testMonoSwitchIfEmptyOfEmptyPublisher() { - return Mono.just(1); + ImmutableSet> testMonoIdentity() { + return ImmutableSet.of(Mono.just(1), Mono.empty()); } ImmutableSet> testFluxSwitchIfEmptyOfEmptyPublisher() { @@ -220,6 +220,10 @@ final class ReactorRulesTest implements RefasterRuleCollectionTestCase { Mono.just("foo").flux(), Mono.just("bar").flux(), Mono.just("baz").flux()); } + Mono testMonoThen() { + return Mono.just("foo").then(); + } + Mono> testMonoCollectToOptional() { return Mono.just("foo").flux().collect(toOptional()); }