25
25
import static org .inferred .freebuilder .processor .Util .erasesToAnyOf ;
26
26
import static org .inferred .freebuilder .processor .Util .upperBound ;
27
27
import static org .inferred .freebuilder .processor .util .Block .methodBody ;
28
+ import static org .inferred .freebuilder .processor .util .FunctionalType .consumer ;
29
+ import static org .inferred .freebuilder .processor .util .FunctionalType .functionalTypeAcceptedByMethod ;
28
30
import static org .inferred .freebuilder .processor .util .ModelUtils .maybeDeclared ;
29
31
import static org .inferred .freebuilder .processor .util .ModelUtils .maybeUnbox ;
30
32
import static org .inferred .freebuilder .processor .util .ModelUtils .overrides ;
43
45
import org .inferred .freebuilder .processor .excerpt .CheckedListMultimap ;
44
46
import org .inferred .freebuilder .processor .util .Block ;
45
47
import org .inferred .freebuilder .processor .util .Excerpt ;
46
- import org .inferred .freebuilder .processor .util .ParameterizedType ;
48
+ import org .inferred .freebuilder .processor .util .FunctionalType ;
47
49
import org .inferred .freebuilder .processor .util .SourceBuilder ;
48
50
49
51
import java .util .Collection ;
50
52
import java .util .Map .Entry ;
51
53
54
+ import javax .lang .model .element .TypeElement ;
52
55
import javax .lang .model .type .DeclaredType ;
53
56
import javax .lang .model .type .TypeMirror ;
57
+ import javax .lang .model .util .Elements ;
58
+ import javax .lang .model .util .Types ;
54
59
55
60
/**
56
61
* {@link PropertyCodeGenerator} providing fluent methods for {@link ListMultimap} properties.
@@ -61,7 +66,8 @@ static class Factory implements PropertyCodeGenerator.Factory {
61
66
62
67
@ Override
63
68
public Optional <ListMultimapProperty > create (Config config ) {
64
- DeclaredType type = maybeDeclared (config .getProperty ().getType ()).orNull ();
69
+ Property property = config .getProperty ();
70
+ DeclaredType type = maybeDeclared (property .getType ()).orNull ();
65
71
if (type == null ) {
66
72
return Optional .absent ();
67
73
}
@@ -79,14 +85,23 @@ public Optional<ListMultimapProperty> create(Config config) {
79
85
Optional <TypeMirror > unboxedValueType = maybeUnbox (valueType , config .getTypes ());
80
86
boolean overridesPutMethod =
81
87
hasPutMethodOverride (config , unboxedKeyType .or (keyType ), unboxedValueType .or (valueType ));
88
+
89
+ FunctionalType mutatorType = functionalTypeAcceptedByMethod (
90
+ config .getBuilder (),
91
+ mutator (property ),
92
+ consumer (listMultimap (keyType , valueType , config .getElements (), config .getTypes ())),
93
+ config .getElements (),
94
+ config .getTypes ());
95
+
82
96
return Optional .of (new ListMultimapProperty (
83
97
config .getMetadata (),
84
- config . getProperty () ,
98
+ property ,
85
99
overridesPutMethod ,
86
100
keyType ,
87
101
unboxedKeyType ,
88
102
valueType ,
89
- unboxedValueType ));
103
+ unboxedValueType ,
104
+ mutatorType ));
90
105
}
91
106
92
107
private static boolean hasPutMethodOverride (
@@ -98,13 +113,23 @@ private static boolean hasPutMethodOverride(
98
113
keyType ,
99
114
valueType );
100
115
}
116
+
117
+ private static TypeMirror listMultimap (
118
+ TypeMirror keyType ,
119
+ TypeMirror valueType ,
120
+ Elements elements ,
121
+ Types types ) {
122
+ TypeElement listMultimapType = elements .getTypeElement (ListMultimap .class .getName ());
123
+ return types .getDeclaredType (listMultimapType , keyType , valueType );
124
+ }
101
125
}
102
126
103
127
private final boolean overridesPutMethod ;
104
128
private final TypeMirror keyType ;
105
129
private final Optional <TypeMirror > unboxedKeyType ;
106
130
private final TypeMirror valueType ;
107
131
private final Optional <TypeMirror > unboxedValueType ;
132
+ private final FunctionalType mutatorType ;
108
133
109
134
ListMultimapProperty (
110
135
Metadata metadata ,
@@ -113,13 +138,15 @@ private static boolean hasPutMethodOverride(
113
138
TypeMirror keyType ,
114
139
Optional <TypeMirror > unboxedKeyType ,
115
140
TypeMirror valueType ,
116
- Optional <TypeMirror > unboxedValueType ) {
141
+ Optional <TypeMirror > unboxedValueType ,
142
+ FunctionalType mutatorType ) {
117
143
super (metadata , property );
118
144
this .overridesPutMethod = overridesPutMethod ;
119
145
this .keyType = keyType ;
120
146
this .unboxedKeyType = unboxedKeyType ;
121
147
this .valueType = valueType ;
122
148
this .unboxedValueType = unboxedValueType ;
149
+ this .mutatorType = mutatorType ;
123
150
}
124
151
125
152
@ Override
@@ -301,8 +328,7 @@ private void addRemoveAll(SourceBuilder code, Metadata metadata) {
301
328
}
302
329
303
330
private void addMutate (SourceBuilder code , Metadata metadata ) {
304
- ParameterizedType consumer = code .feature (FUNCTION_PACKAGE ).consumer ().orNull ();
305
- if (consumer == null ) {
331
+ if (!code .feature (FUNCTION_PACKAGE ).consumer ().isPresent ()) {
306
332
return ;
307
333
}
308
334
code .addLine ("" )
@@ -316,21 +342,21 @@ private void addMutate(SourceBuilder code, Metadata metadata) {
316
342
.addLine (" * @return this {@code Builder} object" )
317
343
.addLine (" * @throws NullPointerException if {@code mutator} is null" )
318
344
.addLine (" */" )
319
- .addLine ("public %s %s(%s<%s<%s, %s>> mutator) {" ,
345
+ .addLine ("public %s %s(%s mutator) {" ,
320
346
metadata .getBuilder (),
321
347
mutator (property ),
322
- consumer .getQualifiedName (),
323
- ListMultimap .class ,
324
- keyType ,
325
- valueType );
348
+ mutatorType .getFunctionalInterface ());
326
349
Block body = methodBody (code , "mutator" );
327
350
if (overridesPutMethod ) {
328
- body .addLine (" mutator.accept(new %s<>(%s, this::%s));" ,
329
- CheckedListMultimap .TYPE , property .getField (), putMethod (property ));
351
+ body .addLine (" mutator.%s(new %s<>(%s, this::%s));" ,
352
+ mutatorType .getMethodName (),
353
+ CheckedListMultimap .TYPE ,
354
+ property .getField (),
355
+ putMethod (property ));
330
356
} else {
331
357
body .addLine (" // If %s is overridden, this method will be updated to delegate to it" ,
332
358
putMethod (property ))
333
- .addLine (" mutator.accept (%s);" , property .getField ());
359
+ .addLine (" mutator.%s (%s);" , mutatorType . getMethodName () , property .getField ());
334
360
}
335
361
body .addLine (" return (%s) this;" , metadata .getBuilder ());
336
362
code .add (body )
0 commit comments