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 500bd40e34..1b3bf9c3e9 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 @@ -5,6 +5,7 @@ import static java.util.function.Function.identity; import static org.assertj.core.api.Assertions.assertThat; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.MoreCollectors; import com.google.errorprone.refaster.Refaster; import com.google.errorprone.refaster.annotation.AfterTemplate; @@ -14,6 +15,7 @@ import com.google.errorprone.refaster.annotation.Placeholder; import com.google.errorprone.refaster.annotation.UseImportPolicy; import java.time.Duration; +import java.util.HashMap; import java.util.Optional; import java.util.concurrent.Callable; import java.util.function.Consumer; @@ -25,6 +27,7 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import reactor.test.publisher.PublisherProbe; +import reactor.util.context.Context; import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation; import tech.picnic.errorprone.refaster.matchers.ThrowsCheckedException; @@ -375,6 +378,21 @@ Flux after(Flux flux) { } } + /** Prefer {@link reactor.util.context.Context#empty()}} over more verbose alternatives. */ + // XXX: Consider introducing an `IsEmpty` matcher that identifies a wide range of guaranteed-empty + // `Collection` and `Map` expressions. + static final class ContextEmpty { + @BeforeTemplate + Context before() { + return Context.of(Refaster.anyOf(new HashMap<>(), ImmutableMap.of())); + } + + @AfterTemplate + Context after() { + return Context.empty(); + } + } + /** Prefer {@link PublisherProbe#empty()}} over more verbose alternatives. */ static final class PublisherProbeEmpty { @BeforeTemplate 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 cbf5cc888f..270dce8306 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 @@ -3,8 +3,10 @@ import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.time.Duration; +import java.util.HashMap; import java.util.Optional; import java.util.concurrent.Callable; import java.util.function.Supplier; @@ -12,12 +14,13 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import reactor.test.publisher.PublisherProbe; +import reactor.util.context.Context; import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase; final class ReactorRulesTest implements RefasterRuleCollectionTestCase { @Override public ImmutableSet elidedTypesAndStaticImports() { - return ImmutableSet.of(assertThat(0)); + return ImmutableSet.of(assertThat(0), HashMap.class, ImmutableMap.class); } ImmutableSet> testMonoFromSupplier() { @@ -126,6 +129,10 @@ ImmutableSet> testFluxOnErrorComplete() { Flux.just(2).onErrorResume(e -> Flux.empty())); } + ImmutableSet testContextEmpty() { + return ImmutableSet.of(Context.of(new HashMap<>()), Context.of(ImmutableMap.of())); + } + ImmutableSet> testPublisherProbeEmpty() { return ImmutableSet.of(PublisherProbe.of(Mono.empty()), PublisherProbe.of(Flux.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 94daf79ec9..2c790c959b 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 @@ -5,8 +5,10 @@ import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.time.Duration; +import java.util.HashMap; import java.util.Optional; import java.util.concurrent.Callable; import java.util.function.Supplier; @@ -14,12 +16,13 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import reactor.test.publisher.PublisherProbe; +import reactor.util.context.Context; import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase; final class ReactorRulesTest implements RefasterRuleCollectionTestCase { @Override public ImmutableSet elidedTypesAndStaticImports() { - return ImmutableSet.of(assertThat(0)); + return ImmutableSet.of(assertThat(0), HashMap.class, ImmutableMap.class); } ImmutableSet> testMonoFromSupplier() { @@ -124,6 +127,10 @@ ImmutableSet> testFluxOnErrorComplete() { return ImmutableSet.of(Flux.just(1).onErrorComplete(), Flux.just(2).onErrorComplete()); } + ImmutableSet testContextEmpty() { + return ImmutableSet.of(Context.empty(), Context.empty()); + } + ImmutableSet> testPublisherProbeEmpty() { return ImmutableSet.of(PublisherProbe.empty(), PublisherProbe.empty()); }