Skip to content

Commit b46eda0

Browse files
authored
Introduce Immutable{{List,Set}Multimap,Map,Table}BuilderPut Refaster rules (#2044)
Resolves #2038.
1 parent 87ae19d commit b46eda0

12 files changed

+140
-0
lines changed

error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ImmutableListMultimapRules.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static com.google.common.collect.ImmutableListMultimap.toImmutableListMultimap;
55
import static com.google.errorprone.refaster.ImportPolicy.STATIC_IMPORT_ALWAYS;
66

7+
import com.google.common.collect.ImmutableList;
78
import com.google.common.collect.ImmutableListMultimap;
89
import com.google.common.collect.ImmutableMultimap;
910
import com.google.common.collect.ListMultimap;
@@ -276,4 +277,28 @@ ImmutableListMultimap<K, V2> after(
276277
return ImmutableListMultimap.copyOf(Multimaps.transformValues(multimap, transformation));
277278
}
278279
}
280+
281+
/**
282+
* Prefer {@link ImmutableListMultimap.Builder#put(Object, Object)} over more contrived or less
283+
* efficient alternatives.
284+
*/
285+
static final class ImmutableListMultimapBuilderPut<K, V> {
286+
@BeforeTemplate
287+
@SuppressWarnings("unchecked" /* Safe generic array type creation. */)
288+
ImmutableListMultimap.Builder<K, V> before(
289+
ImmutableListMultimap.Builder<K, V> builder, K key, V value) {
290+
// XXX: Drop the `ImmutableList` case in favour of generalizing the
291+
// `ExplicitArgumentEnumeration` check, or add variants for other collection types as well.
292+
return Refaster.anyOf(
293+
builder.put(Map.entry(key, value)),
294+
builder.putAll(key, value),
295+
builder.putAll(key, ImmutableList.of(value)));
296+
}
297+
298+
@AfterTemplate
299+
ImmutableListMultimap.Builder<K, V> after(
300+
ImmutableListMultimap.Builder<K, V> builder, K key, V value) {
301+
return builder.put(key, value);
302+
}
303+
}
279304
}

error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ImmutableMapRules.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,20 @@ ImmutableMap<K, V> after(@Repeated Map.Entry<? extends K, ? extends V> entries)
422422
}
423423
}
424424

425+
/** Prefer {@link ImmutableMap.Builder#put(Object, Object)} over more contrived alternatives. */
426+
static final class ImmutableMapBuilderPut<K, V> {
427+
@BeforeTemplate
428+
ImmutableMap.Builder<K, V> before(ImmutableMap.Builder<K, V> builder, K key, V value) {
429+
return Refaster.anyOf(
430+
builder.put(Map.entry(key, value)), builder.putAll(ImmutableMap.of(key, value)));
431+
}
432+
433+
@AfterTemplate
434+
ImmutableMap.Builder<K, V> after(ImmutableMap.Builder<K, V> builder, K key, V value) {
435+
return builder.put(key, value);
436+
}
437+
}
438+
425439
// XXX: Add a rule for this:
426440
// Maps.transformValues(streamOfEntries.collect(groupBy(fun)), ImmutableMap::copyOf)
427441
// ->

error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ImmutableSetMultimapRules.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static com.google.common.collect.ImmutableSetMultimap.toImmutableSetMultimap;
55
import static com.google.errorprone.refaster.ImportPolicy.STATIC_IMPORT_ALWAYS;
66

7+
import com.google.common.collect.ImmutableSet;
78
import com.google.common.collect.ImmutableSetMultimap;
89
import com.google.common.collect.ListMultimap;
910
import com.google.common.collect.Multimap;
@@ -216,4 +217,28 @@ ImmutableSetMultimap<K, V2> after(
216217
return ImmutableSetMultimap.copyOf(Multimaps.transformValues(multimap, transformation));
217218
}
218219
}
220+
221+
/**
222+
* Prefer {@link ImmutableSetMultimap.Builder#put(Object, Object)} over more contrived
223+
* alternatives.
224+
*/
225+
static final class ImmutableSetMultimapBuilderPut<K, V> {
226+
@BeforeTemplate
227+
@SuppressWarnings("unchecked" /* Safe generic array type creation. */)
228+
ImmutableSetMultimap.Builder<K, V> before(
229+
ImmutableSetMultimap.Builder<K, V> builder, K key, V value) {
230+
// XXX: Drop the `ImmutableSet` case in favour of generalizing the
231+
// `ExplicitArgumentEnumeration` check, or add variants for other collection types as well.
232+
return Refaster.anyOf(
233+
builder.put(Map.entry(key, value)),
234+
builder.putAll(key, value),
235+
builder.putAll(key, ImmutableSet.of(value)));
236+
}
237+
238+
@AfterTemplate
239+
ImmutableSetMultimap.Builder<K, V> after(
240+
ImmutableSetMultimap.Builder<K, V> builder, K key, V value) {
241+
return builder.put(key, value);
242+
}
243+
}
219244
}

error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ImmutableTableRules.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,24 @@ ImmutableTable<R, C, V> after() {
111111
return ImmutableTable.of();
112112
}
113113
}
114+
115+
/**
116+
* Prefer {@link ImmutableTable.Builder#put(Object, Object, Object)} over more contrived
117+
* alternatives.
118+
*/
119+
static final class ImmutableTableBuilderPut<R, C, V> {
120+
@BeforeTemplate
121+
ImmutableTable.Builder<R, C, V> before(
122+
ImmutableTable.Builder<R, C, V> builder, R rowKey, C columnKey, V value) {
123+
return Refaster.anyOf(
124+
builder.put(Tables.immutableCell(rowKey, columnKey, value)),
125+
builder.putAll(ImmutableTable.of(rowKey, columnKey, value)));
126+
}
127+
128+
@AfterTemplate
129+
ImmutableTable.Builder<R, C, V> after(
130+
ImmutableTable.Builder<R, C, V> builder, R rowKey, C columnKey, V value) {
131+
return builder.put(rowKey, columnKey, value);
132+
}
133+
}
114134
}

error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ImmutableListMultimapRulesTestInput.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,12 @@ ImmutableListMultimap<String, Integer> testTransformMultimapValuesToImmutableLis
125125
flatteningToImmutableListMultimap(
126126
Map.Entry::getKey, e -> e.getValue().stream().map(Math::toIntExact))));
127127
}
128+
129+
ImmutableSet<ImmutableListMultimap.Builder<String, Integer>>
130+
testImmutableListMultimapBuilderPut() {
131+
return ImmutableSet.of(
132+
ImmutableListMultimap.<String, Integer>builder().put(Map.entry("foo", 1)),
133+
ImmutableListMultimap.<String, Integer>builder().putAll("bar", 2),
134+
ImmutableListMultimap.<String, Integer>builder().putAll("baz", ImmutableList.of(3)));
135+
}
128136
}

error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ImmutableListMultimapRulesTestOutput.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,12 @@ ImmutableListMultimap<String, Integer> testTransformMultimapValuesToImmutableLis
9898
ImmutableListMultimap.copyOf(
9999
Multimaps.transformValues(TreeMultimap.<String, Long>create(), Math::toIntExact)));
100100
}
101+
102+
ImmutableSet<ImmutableListMultimap.Builder<String, Integer>>
103+
testImmutableListMultimapBuilderPut() {
104+
return ImmutableSet.of(
105+
ImmutableListMultimap.<String, Integer>builder().put("foo", 1),
106+
ImmutableListMultimap.<String, Integer>builder().put("bar", 2),
107+
ImmutableListMultimap.<String, Integer>builder().put("baz", 3));
108+
}
101109
}

error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ImmutableMapRulesTestInput.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,10 @@ ImmutableSet<Map<String, Integer>> testImmutableMapOfEntries() {
170170
Map.ofEntries(Map.entry("foo", 1)),
171171
Map.ofEntries(Map.entry("bar", 2), Map.entry("baz", 3)));
172172
}
173+
174+
ImmutableSet<ImmutableMap.Builder<String, Integer>> testImmutableMapBuilderPut() {
175+
return ImmutableSet.of(
176+
ImmutableMap.<String, Integer>builder().put(Map.entry("foo", 1)),
177+
ImmutableMap.<String, Integer>builder().putAll(ImmutableMap.of("bar", 2)));
178+
}
173179
}

error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ImmutableMapRulesTestOutput.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,10 @@ ImmutableSet<Map<String, Integer>> testImmutableMapOfEntries() {
137137
ImmutableMap.ofEntries(Map.entry("foo", 1)),
138138
ImmutableMap.ofEntries(Map.entry("bar", 2), Map.entry("baz", 3)));
139139
}
140+
141+
ImmutableSet<ImmutableMap.Builder<String, Integer>> testImmutableMapBuilderPut() {
142+
return ImmutableSet.of(
143+
ImmutableMap.<String, Integer>builder().put("foo", 1),
144+
ImmutableMap.<String, Integer>builder().put("bar", 2));
145+
}
140146
}

error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ImmutableSetMultimapRulesTestInput.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,11 @@ ImmutableSetMultimap<String, Integer> testTransformMultimapValuesToImmutableSetM
9292
flatteningToImmutableSetMultimap(
9393
Map.Entry::getKey, e -> e.getValue().stream().map(Math::toIntExact))));
9494
}
95+
96+
ImmutableSet<ImmutableSetMultimap.Builder<String, Integer>> testImmutableSetMultimapBuilderPut() {
97+
return ImmutableSet.of(
98+
ImmutableSetMultimap.<String, Integer>builder().put(Map.entry("foo", 1)),
99+
ImmutableSetMultimap.<String, Integer>builder().putAll("bar", 2),
100+
ImmutableSetMultimap.<String, Integer>builder().putAll("baz", ImmutableSet.of(3)));
101+
}
95102
}

error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ImmutableSetMultimapRulesTestOutput.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,11 @@ ImmutableSetMultimap<String, Integer> testTransformMultimapValuesToImmutableSetM
7373
ImmutableSetMultimap.copyOf(
7474
Multimaps.transformValues(TreeMultimap.<String, Long>create(), Math::toIntExact)));
7575
}
76+
77+
ImmutableSet<ImmutableSetMultimap.Builder<String, Integer>> testImmutableSetMultimapBuilderPut() {
78+
return ImmutableSet.of(
79+
ImmutableSetMultimap.<String, Integer>builder().put("foo", 1),
80+
ImmutableSetMultimap.<String, Integer>builder().put("bar", 2),
81+
ImmutableSetMultimap.<String, Integer>builder().put("baz", 3));
82+
}
7683
}

0 commit comments

Comments
 (0)