@@ -140,7 +140,7 @@ Metadata analyse(TypeElement type) throws CannotGenerateCodeException {
140
140
QualifiedName generatedBuilder = QualifiedName .of (
141
141
pkg .getQualifiedName ().toString (), generatedBuilderSimpleName (type ));
142
142
Optional <TypeElement > builder = tryFindBuilder (generatedBuilder , type );
143
- Optional < BuilderFactory > builderFactory = builderFactory (builder );
143
+ Metadata . Builder constructionAndExtension = constructionAndExtension (builder );
144
144
QualifiedName valueType = generatedBuilder .nestedType ("Value" );
145
145
QualifiedName partialType = generatedBuilder .nestedType ("Partial" );
146
146
QualifiedName propertyType = generatedBuilder .nestedType ("Property" );
@@ -151,7 +151,7 @@ Metadata analyse(TypeElement type) throws CannotGenerateCodeException {
151
151
.setType (QualifiedName .of (type ).withParameters (typeParameters ))
152
152
.setInterfaceType (type .getKind ().isInterface ())
153
153
.setBuilder (parameterized (builder , typeParameters ))
154
- .setBuilderFactory ( builderFactory )
154
+ .mergeFrom ( constructionAndExtension )
155
155
.setGeneratedBuilder (generatedBuilder .withParameters (typeParameters ))
156
156
.setValueType (valueType .withParameters (typeParameters ))
157
157
.setPartialType (partialType .withParameters (typeParameters ))
@@ -161,7 +161,8 @@ Metadata analyse(TypeElement type) throws CannotGenerateCodeException {
161
161
.addVisibleNestedTypes (propertyType )
162
162
.addAllVisibleNestedTypes (visibleTypesIn (type )) // Because we inherit from type
163
163
.putAllStandardMethodUnderrides (findUnderriddenMethods (methods ))
164
- .setHasToBuilderMethod (hasToBuilderMethod (builder , builderFactory , methods ))
164
+ .setHasToBuilderMethod (hasToBuilderMethod (
165
+ builder , constructionAndExtension .isExtensible (), methods ))
165
166
.setBuilderSerializable (shouldBuilderBeSerializable (builder ))
166
167
.addAllProperties (properties .values ());
167
168
Metadata baseMetadata = metadataBuilder .build ();
@@ -310,18 +311,17 @@ private Map<StandardMethod, UnderrideLevel> findUnderriddenMethods(
310
311
return result .build ();
311
312
}
312
313
313
- /** Find a toBuilder method, if the user has provided one.
314
- * @param builderFactory */
314
+ /** Find a toBuilder method, if the user has provided one. */
315
315
private boolean hasToBuilderMethod (
316
316
Optional <TypeElement > builder ,
317
- Optional < BuilderFactory > builderFactory ,
317
+ boolean isExtensible ,
318
318
Iterable <ExecutableElement > methods ) {
319
319
if (!builder .isPresent ()) {
320
320
return false ;
321
321
}
322
322
for (ExecutableElement method : methods ) {
323
323
if (isToBuilderMethod (builder .get (), method )) {
324
- if (!builderFactory . isPresent () ) {
324
+ if (!isExtensible ) {
325
325
messager .printMessage (ERROR ,
326
326
"No accessible no-args Builder constructor available to implement toBuilder" ,
327
327
method );
@@ -408,15 +408,19 @@ private Optional<TypeElement> tryFindBuilder(
408
408
return userClass ;
409
409
}
410
410
411
- private Optional < BuilderFactory > builderFactory (Optional <TypeElement > builder ) {
411
+ private Metadata . Builder constructionAndExtension (Optional <TypeElement > builder ) {
412
412
if (!builder .isPresent ()) {
413
- return Optional .of (NO_ARGS_CONSTRUCTOR );
413
+ return new Metadata .Builder ()
414
+ .setExtensible (false )
415
+ .setBuilderFactory (NO_ARGS_CONSTRUCTOR );
414
416
}
415
417
if (!builder .get ().getModifiers ().contains (Modifier .STATIC )) {
416
418
messager .printMessage (ERROR , "Builder must be static on @FreeBuilder types" , builder .get ());
417
- return Optional . absent ( );
419
+ return new Metadata . Builder (). setExtensible ( false );
418
420
}
419
- return BuilderFactory .from (builder .get ());
421
+ return new Metadata .Builder ()
422
+ .setExtensible (BuilderFactory .hasNoArgsConstructor (builder .get ()))
423
+ .setBuilderFactory (BuilderFactory .from (builder .get ()));
420
424
}
421
425
422
426
private Map <ExecutableElement , Property > findProperties (
0 commit comments