@@ -190,6 +190,51 @@ private CodeBlock stringToEnumCopyMethodBody() {
190
190
}
191
191
192
192
private MethodSpec builderCopyMethod () {
193
+ return builderCopyMethodProto ()
194
+ .addParameter (builderCopyMethodParameters (), memberParamName ())
195
+ .addCode (builderCopyMethodBody ())
196
+ .build ();
197
+ }
198
+
199
+ private MethodSpec .Builder builderCopyMethodProto () {
200
+ return MethodSpec .methodBuilder (serviceModelCopiers .builderCopyMethodName ())
201
+ .addModifiers (Modifier .STATIC )
202
+ .returns (typeProvider .fieldType (memberModel ));
203
+ }
204
+
205
+ private TypeName builderCopyMethodParameters () {
206
+ if (memberModel .isCollectionWithNestedBuilderMember ()) {
207
+ ParameterizedTypeName nestedParameters = builderCopyMethodParametersForMap (memberModel .getListModel ()
208
+ .getListMemberModel ()
209
+ .getMapModel ());
210
+ return ParameterizedTypeName .get (ClassName .get (Collection .class ), WildcardTypeName .subtypeOf (nestedParameters ));
211
+ }
212
+ if (memberModel .isList ()) {
213
+ return builderCopyMethodParametersForList ();
214
+ }
215
+ if (memberModel .isMap ()) {
216
+ return builderCopyMethodParametersForMap (memberModel .getMapModel ());
217
+ }
218
+ throw new UnsupportedOperationException ();
219
+ }
220
+
221
+ private ParameterizedTypeName builderCopyMethodParametersForList () {
222
+ ClassName listParameter = poetExtensions .getModelClass (memberModel .getListModel ().getListMemberModel ().getC2jShape ());
223
+ ClassName builderForParameter = listParameter .nestedClass ("Builder" );
224
+ return ParameterizedTypeName .get (ClassName .get (Collection .class ), WildcardTypeName .subtypeOf (builderForParameter ));
225
+ }
226
+
227
+ private ParameterizedTypeName builderCopyMethodParametersForMap (MapModel mapModel ) {
228
+ TypeName keyType = typeProvider .getTypeNameForSimpleType (mapModel .getKeyModel ().getVariable ().getVariableType ());
229
+ ClassName valueParameter = poetExtensions .getModelClass (mapModel .getValueModel ().getC2jShape ());
230
+ ClassName builderForParameter = valueParameter .nestedClass ("Builder" );
231
+ return ParameterizedTypeName .get (ClassName .get (Map .class ), keyType , WildcardTypeName .subtypeOf (builderForParameter ));
232
+ }
233
+
234
+ private CodeBlock builderCopyMethodBody () {
235
+ if (memberModel .isCollectionWithNestedBuilderMember ()) {
236
+ return builderCopyMethodForListWithMap ();
237
+ }
193
238
if (memberModel .isList ()) {
194
239
return builderCopyMethodForList ();
195
240
}
@@ -199,59 +244,50 @@ private MethodSpec builderCopyMethod() {
199
244
throw new UnsupportedOperationException ();
200
245
}
201
246
202
- private MethodSpec builderCopyMethodForMap () {
203
- TypeName keyType = typeProvider .getTypeNameForSimpleType (memberModel .getMapModel ().getKeyModel ()
204
- .getVariable ().getVariableType ());
205
- ClassName valueParameter = poetExtensions .getModelClass (memberModel .getMapModel ().getValueModel ().getC2jShape ());
206
- ClassName builderForParameter = valueParameter .nestedClass ("Builder" );
207
- TypeName parameterType =
208
- ParameterizedTypeName .get (ClassName .get (Map .class ), keyType , WildcardTypeName .subtypeOf (builderForParameter ));
209
-
210
- CodeBlock code =
211
- CodeBlock .builder ()
212
- .beginControlFlow ("if ($1N == null || $1N instanceof $2T)" ,
213
- memberParamName (), DefaultSdkAutoConstructMap .class )
214
- .addStatement ("return $T.getInstance()" , DefaultSdkAutoConstructMap .class )
215
- .endControlFlow ()
216
- .addStatement ("return $N($N.entrySet().stream().collect(toMap($T::getKey, e -> e.getValue().build())))" ,
217
- serviceModelCopiers .copyMethodName (),
218
- memberParamName (),
219
- Map .Entry .class )
220
- .build ();
247
+ private CodeBlock builderCopyMethodForListWithMap () {
248
+ MemberModel listMemberModel = memberModel .getListModel ().getListMemberModel ();
249
+ Optional <ClassName > mapCopierClass = serviceModelCopiers .copierClassFor (listMemberModel );
221
250
222
- return MethodSpec .methodBuilder (serviceModelCopiers .builderCopyMethodName ())
223
- .addModifiers (Modifier .STATIC )
224
- .addParameter (parameterType , memberParamName ())
225
- .returns (typeProvider .fieldType (memberModel ))
226
- .addCode (code )
227
- .build ();
251
+ CodeBlock .Builder builderMethodBody = builderWithDefaultStatement (DefaultSdkAutoConstructList .class );
252
+ builderMethodBody .add ("return $N($N.stream()." , serviceModelCopiers .copyMethodName (), memberParamName ());
253
+
254
+ if (mapCopierClass .isPresent ()) {
255
+ builderMethodBody .add ("map($T::$N)" , mapCopierClass .get (), serviceModelCopiers .builderCopyMethodName ());
256
+ } else {
257
+ builderMethodBody .add ("map(m -> m.entrySet().stream().collect(toMap(Map.Entry::getKey, e -> e.getValue().build())))" );
258
+ }
259
+
260
+ builderMethodBody .addStatement (".collect(toList()))" );
261
+ return builderMethodBody .build ();
228
262
}
229
263
230
- private MethodSpec builderCopyMethodForList () {
231
- ClassName listParameter = poetExtensions .getModelClass (memberModel .getListModel ().getListMemberModel ().getC2jShape ());
232
- ClassName builderForParameter = listParameter .nestedClass ("Builder" );
264
+ private CodeBlock builderCopyMethodForMap () {
265
+ return builderWithDefaultStatement (DefaultSdkAutoConstructMap .class )
266
+ .addStatement ("return $N($N.entrySet().stream().collect(toMap($T::getKey, e -> e.getValue().build())))" ,
267
+ serviceModelCopiers .copyMethodName (),
268
+ memberParamName (),
269
+ Map .Entry .class )
270
+ .build ();
271
+ }
233
272
234
- TypeName parameterType =
235
- ParameterizedTypeName .get (ClassName .get (Collection .class ), WildcardTypeName .subtypeOf (builderForParameter ));
236
-
237
- CodeBlock code = CodeBlock .builder ()
238
- .beginControlFlow ("if ($1N == null || $1N instanceof $2T)" ,
239
- memberParamName (), DefaultSdkAutoConstructList .class )
240
- .addStatement ("return $T.getInstance()" , DefaultSdkAutoConstructList .class )
241
- .endControlFlow ()
242
- .addStatement ("return $N($N.stream().map($T::$N).collect(toList()))" ,
243
- serviceModelCopiers .copyMethodName (),
244
- memberParamName (),
245
- builderForParameter ,
246
- "build" )
247
- .build ();
273
+ private CodeBlock builderCopyMethodForList () {
274
+ String listMemberClass = memberModel .getListModel ().getListMemberModel ().getC2jShape ();
248
275
249
- return MethodSpec .methodBuilder (serviceModelCopiers .builderCopyMethodName ())
250
- .addModifiers (Modifier .STATIC )
251
- .addParameter (parameterType , memberParamName ())
252
- .returns (typeProvider .fieldType (memberModel ))
253
- .addCode (code )
254
- .build ();
276
+ return builderWithDefaultStatement (DefaultSdkAutoConstructList .class )
277
+ .addStatement ("return $N($N.stream().map($T::$N).collect(toList()))" ,
278
+ serviceModelCopiers .copyMethodName (),
279
+ memberParamName (),
280
+ poetExtensions .getModelClass (listMemberClass ).nestedClass ("Builder" ),
281
+ "build" )
282
+ .build ();
283
+ }
284
+
285
+ private CodeBlock .Builder builderWithDefaultStatement (Class <?> autoConstructClass ) {
286
+ return CodeBlock .builder ()
287
+ .beginControlFlow ("if ($1N == null || $1N instanceof $2T)" ,
288
+ memberParamName (), autoConstructClass )
289
+ .addStatement ("return $T.getInstance()" , autoConstructClass )
290
+ .endControlFlow ();
255
291
}
256
292
257
293
private CodeBlock copyMethodBody () {
0 commit comments