This check drops selected {@link ImmutableSet#of} and {@link Set#of} invocations, with the + * assumption that these operations do not deduplicate the collection of explicitly enumerated + * values. It also drops {@link ImmutableMultiset#of} and {@link Set#of} invocations, with the + * assumption that these do not materially impact iteration order. + * + *
This checker attempts to identify {@link Iterable}-accepting methods for which a varargs
+ * overload exists, and suggests calling the varargs overload instead. This is an imperfect
+ * heuristic, but it e.g. allows invocations of Immutables-generated {@code
+ * with*} methods to be simplified.
+ */
+@AutoService(BugChecker.class)
+@BugPattern(
+ summary = "Iterable creation can be avoided by using a varargs alternative method",
+ link = BUG_PATTERNS_BASE_URL + "ExplicitArgumentEnumeration",
+ linkType = CUSTOM,
+ severity = SUGGESTION,
+ tags = {PERFORMANCE, SIMPLIFICATION})
+public final class ExplicitArgumentEnumeration extends BugChecker
+ implements MethodInvocationTreeMatcher {
+ private static final long serialVersionUID = 1L;
+ private static final Matcher {
@SuppressWarnings("unchecked")
ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T element) {
return Refaster.anyOf(
- iterAssert.containsAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element))),
iterAssert.containsAnyOf(element),
- iterAssert.containsAll(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element))),
- iterAssert.containsSequence(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element))),
iterAssert.containsSequence(element),
- iterAssert.containsSubsequence(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element))),
iterAssert.containsSubsequence(element));
}
@@ -244,20 +216,7 @@ static final class ObjectEnumerableDoesNotContainOneElement {
@BeforeTemplate
@SuppressWarnings("unchecked")
ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T element) {
- return Refaster.anyOf(
- iterAssert.doesNotContainAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element))),
- iterAssert.doesNotContainSequence(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element))),
- iterAssert.doesNotContainSequence(element));
+ return iterAssert.doesNotContainSequence(element);
}
@AfterTemplate
@@ -270,25 +229,7 @@ ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T el
static final class ObjectEnumerableContainsExactlyOneElement {
@BeforeTemplate
@SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T element) {
- return Refaster.anyOf(
- iterAssert.containsExactlyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element))),
- iterAssert.containsExactlyInAnyOrderElementsOf(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element))));
- }
-
- @BeforeTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> before2(
+ ObjectEnumerableAssert, S> before(
ObjectEnumerableAssert, S> iterAssert, @NotMatches(IsArray.class) T element) {
return iterAssert.containsExactlyInAnyOrder(element);
}
@@ -313,42 +254,6 @@ ObjectEnumerableAssert, S> after(Set set, T element) {
}
}
- static final class ObjectEnumerableContainsOneDistinctElement {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T element) {
- return iterAssert.hasSameElementsAs(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T element) {
- return iterAssert.containsOnly(element);
- }
- }
-
- static final class ObjectEnumerableIsSubsetOfOneElement {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T element) {
- return iterAssert.isSubsetOf(
- Refaster.anyOf(
- ImmutableList.of(element),
- Arrays.asList(element),
- ImmutableSet.of(element),
- ImmutableMultiset.of(element)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T element) {
- return iterAssert.isSubsetOf(element);
- }
- }
-
//
// Iterable
//
@@ -1155,824 +1060,6 @@ void after(Predicate {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsAnyOf(e1, e2);
- }
- }
-
- static final class ObjectEnumerableContainsAnyOfThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsAnyOf(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableContainsAnyOfFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsAnyOf(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableContainsAnyOfFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsAnyOf(e1, e2, e3, e4, e5);
- }
- }
-
- //
- // ObjectEnumerableAssert: contains
- //
-
- static final class ObjectEnumerableContainsTwoElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsAll(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.contains(e1, e2);
- }
- }
-
- static final class ObjectEnumerableContainsThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsAll(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.contains(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableContainsFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsAll(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.contains(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableContainsFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsAll(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.contains(e1, e2, e3, e4, e5);
- }
- }
-
- //
- // ObjectEnumerableAssert: containsExactly
- //
-
- static final class ObjectEnumerableContainsExactlyTwoElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsExactlyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsExactly(e1, e2);
- }
- }
-
- static final class ObjectEnumerableContainsExactlyThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsExactlyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsExactly(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableContainsExactlyFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsExactlyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsExactly(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableContainsExactlyFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsExactlyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsExactly(e1, e2, e3, e4, e5);
- }
- }
-
- //
- // ObjectEnumerableAssert: containsExactlyInAnyOrder
- //
-
- static final class ObjectEnumerableContainsExactlyInAnyOrderTwoElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsExactlyInAnyOrderElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsExactlyInAnyOrder(e1, e2);
- }
- }
-
- static final class ObjectEnumerableContainsExactlyInAnyOrderThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsExactlyInAnyOrderElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsExactlyInAnyOrder(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableContainsExactlyInAnyOrderFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsExactlyInAnyOrderElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsExactlyInAnyOrder(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableContainsExactlyInAnyOrderFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsExactlyInAnyOrderElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsExactlyInAnyOrder(e1, e2, e3, e4, e5);
- }
- }
-
- //
- // ObjectEnumerableAssert: containsSequence
- //
-
- static final class ObjectEnumerableContainsSequenceTwoElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsSequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsSequence(e1, e2);
- }
- }
-
- static final class ObjectEnumerableContainsSequenceThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsSequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsSequence(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableContainsSequenceFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsSequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsSequence(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableContainsSequenceFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsSequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsSequence(e1, e2, e3, e4, e5);
- }
- }
-
- //
- // ObjectEnumerableAssert: containsSubsequence
- //
-
- static final class ObjectEnumerableContainsSubsequenceTwoElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsSubsequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsSubsequence(e1, e2);
- }
- }
-
- static final class ObjectEnumerableContainsSubsequenceThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsSubsequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsSubsequence(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableContainsSubsequenceFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsSubsequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsSubsequence(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableContainsSubsequenceFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsSubsequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsSubsequence(e1, e2, e3, e4, e5);
- }
- }
-
- //
- // ObjectEnumerableAssert: doesNotContain
- //
-
- static final class ObjectEnumerableDoesNotContainTwoElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.doesNotContainAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.doesNotContain(e1, e2);
- }
- }
-
- static final class ObjectEnumerableDoesNotContainThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.doesNotContainAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.doesNotContain(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableDoesNotContainFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.doesNotContainAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.doesNotContain(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableDoesNotContainFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.doesNotContainAnyElementsOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.doesNotContain(e1, e2, e3, e4, e5);
- }
- }
-
- //
- // ObjectEnumerableAssert: doesNotContainSequence
- //
-
- static final class ObjectEnumerableDoesNotContainSequenceTwoElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.doesNotContainSequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.doesNotContainSequence(e1, e2);
- }
- }
-
- static final class ObjectEnumerableDoesNotContainSequenceThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.doesNotContainSequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.doesNotContainSequence(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableDoesNotContainSequenceFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.doesNotContainSequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.doesNotContainSequence(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableDoesNotContainSequenceFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.doesNotContainSequence(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.doesNotContainSequence(e1, e2, e3, e4, e5);
- }
- }
-
- //
- // ObjectEnumerableAssert: containsOnly
- //
-
- static final class ObjectEnumerableContainsOnlyTwoElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.hasSameElementsAs(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.containsOnly(e1, e2);
- }
- }
-
- static final class ObjectEnumerableContainsOnlyThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.hasSameElementsAs(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.containsOnly(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableContainsOnlyFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.hasSameElementsAs(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.containsOnly(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableContainsOnlyFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.hasSameElementsAs(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.containsOnly(e1, e2, e3, e4, e5);
- }
- }
-
- //
- // ObjectEnumerableAssert: isSubsetOf
- //
-
- static final class ObjectEnumerableIsSubsetOfTwoElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.isSubsetOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2),
- Arrays.asList(e1, e2),
- ImmutableSet.of(e1, e2),
- ImmutableMultiset.of(e1, e2)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2) {
- return iterAssert.isSubsetOf(e1, e2);
- }
- }
-
- static final class ObjectEnumerableIsSubsetOfThreeElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.isSubsetOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3),
- Arrays.asList(e1, e2, e3),
- ImmutableSet.of(e1, e2, e3),
- ImmutableMultiset.of(e1, e2, e3)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3) {
- return iterAssert.isSubsetOf(e1, e2, e3);
- }
- }
-
- static final class ObjectEnumerableIsSubsetOfFourElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.isSubsetOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4),
- Arrays.asList(e1, e2, e3, e4),
- ImmutableSet.of(e1, e2, e3, e4),
- ImmutableMultiset.of(e1, e2, e3, e4)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4) {
- return iterAssert.isSubsetOf(e1, e2, e3, e4);
- }
- }
-
- // XXX: Add variants for 6+ elements?
- static final class ObjectEnumerableIsSubsetOfFiveElements {
- @BeforeTemplate
- ObjectEnumerableAssert, S> before(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.isSubsetOf(
- Refaster.anyOf(
- ImmutableList.of(e1, e2, e3, e4, e5),
- Arrays.asList(e1, e2, e3, e4, e5),
- ImmutableSet.of(e1, e2, e3, e4, e5),
- ImmutableMultiset.of(e1, e2, e3, e4, e5)));
- }
-
- @AfterTemplate
- @SuppressWarnings("unchecked")
- ObjectEnumerableAssert, S> after(
- ObjectEnumerableAssert, S> iterAssert, T e1, T e2, T e3, T e4, T e5) {
- return iterAssert.isSubsetOf(e1, e2, e3, e4, e5);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////
- // Above: Generated code.
-
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// Organize the code below.
diff --git a/error-prone-contrib/src/test/java/tech/picnic/errorprone/bugpatterns/ExplicitArgumentEnumerationTest.java b/error-prone-contrib/src/test/java/tech/picnic/errorprone/bugpatterns/ExplicitArgumentEnumerationTest.java
new file mode 100644
index 0000000000..3366248f70
--- /dev/null
+++ b/error-prone-contrib/src/test/java/tech/picnic/errorprone/bugpatterns/ExplicitArgumentEnumerationTest.java
@@ -0,0 +1,161 @@
+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;
+
+final class ExplicitArgumentEnumerationTest {
+ @Test
+ void identification() {
+ CompilationTestHelper.newInstance(ExplicitArgumentEnumeration.class, getClass())
+ .addSourceLines(
+ "A.java",
+ "import static org.assertj.core.api.Assertions.assertThat;",
+ "",
+ "import com.google.common.collect.ImmutableList;",
+ "import com.google.errorprone.CompilationTestHelper;",
+ "import com.google.errorprone.bugpatterns.BugChecker;",
+ "import org.jooq.impl.DSL;",
+ "import reactor.core.publisher.Flux;",
+ "import reactor.test.StepVerifier;",
+ "",
+ "class A {",
+ " void m() {",
+ " ImmutableList