@@ -308,6 +308,14 @@ def get_underlying_type(data_type, allow_lists=True):
308
308
return data_type
309
309
310
310
311
+ def union_factory_create_method_name (data_type , value_fields_subset ):
312
+ if len (value_fields_subset ) > 0 :
313
+ method_suffix = 'And%s' % _capwords (value_fields_subset [0 ].name )
314
+ else :
315
+ method_suffix = ''
316
+ return 'withTag%s' % method_suffix
317
+
318
+
311
319
@total_ordering
312
320
class JavaClass (object ):
313
321
"""
@@ -2962,49 +2970,57 @@ def generate_data_type_union(self, data_type):
2962
2970
all_fields = data_type .all_fields
2963
2971
static_fields = [f for f in all_fields if is_void_type (f .data_type )]
2964
2972
value_fields = [f for f in all_fields if not is_void_type (f .data_type )]
2965
- nulls = ["null" for f in value_fields ]
2966
2973
2967
2974
if static_fields :
2968
2975
w .out ('' )
2969
2976
for field in static_fields :
2970
- singleton_args = ', ' .join (["Tag.%s" % j .field_tag_enum_name (field )] + nulls )
2977
+ singleton_args = ', ' .join (["Tag.%s" % j .field_tag_enum_name (field )])
2971
2978
w .javadoc (field )
2972
- w .out ('public static final %s %s = new %s(%s);' ,
2979
+ method_name = union_factory_create_method_name (data_type , [])
2980
+ w .out ('public static final %s %s = %s.%s(%s);' ,
2973
2981
j .java_class (data_type ),
2974
2982
j .field_static_instance (field ),
2975
2983
j .java_class (data_type ),
2984
+ method_name ,
2976
2985
singleton_args ,
2977
2986
)
2978
2987
2979
2988
#
2980
2989
# Instance fields
2981
2990
#
2982
2991
w .out ('' )
2983
- w .out ('private final Tag _tag;' )
2992
+ w .out ('private Tag _tag;' )
2984
2993
for field in all_fields :
2985
2994
if j .has_value (field ):
2986
- w .out ('private final %s %s;' , j .java_class (field , boxed = True ), j .param_name (field ))
2995
+ w .out ('private %s %s;' , j .java_class (field , boxed = True ), j .param_name (field ))
2987
2996
2988
2997
#
2989
- # Constructor
2998
+ # Constructors
2990
2999
#
2991
- args = ', ' .join (chain (
2992
- ['Tag _tag' ],
2993
- [
2994
- w .fmt ('%s %s' , j .java_class (f , boxed = True ), j .param_name (f ))
2995
- for f in value_fields
2996
- ],
2997
- ))
2998
- w .out ('' )
2999
- w .javadoc (data_type ,
3000
- fields = value_fields ,
3001
- params = OrderedDict (_tag = "Discriminating tag for this instance." ))
3002
- with w .block ('private %s(%s)' , j .java_class (data_type ), args ):
3003
- w .out ('this._tag = _tag;' )
3004
- for field in value_fields :
3005
- # don't perform validation in the private constructor
3006
- w .out ('this.%s = %s;' , j .param_name (field ), j .param_name (field ))
3007
-
3000
+ def _gen_factory_method (data_type , value_fields_subset ):
3001
+ w .out ('' )
3002
+ w .javadoc (data_type ,
3003
+ fields = value_fields_subset ,
3004
+ params = OrderedDict (_tag = "Discriminating tag for this instance." ))
3005
+ formatted_args = ', ' .join (chain (
3006
+ ['Tag _tag' ],
3007
+ [
3008
+ w .fmt ('%s %s' , j .java_class (f , boxed = True ), j .param_name (f ))
3009
+ for f in value_fields_subset
3010
+ ],
3011
+ ))
3012
+ method_name = union_factory_create_method_name (data_type , value_fields_subset )
3013
+ with w .block ('private static %s %s(%s)' , j .java_class (data_type ), method_name , formatted_args ):
3014
+ w .out ('final %s result = new %s();' , j .java_class (data_type ), j .java_class (data_type ))
3015
+ w .out ('result._tag = _tag;' )
3016
+ for field in value_fields_subset :
3017
+ # don't perform validation in the private constructor
3018
+ w .out ('result.%s = %s;' , j .param_name (field ), j .param_name (field ))
3019
+ w .out ('return result;' )
3020
+
3021
+ _gen_factory_method (data_type , [])
3022
+ for f in value_fields :
3023
+ _gen_factory_method (data_type , [f ])
3008
3024
3009
3025
#
3010
3026
# Field getters/constructors
@@ -3104,14 +3120,12 @@ def generate_data_type_union_field_methods(self, data_type):
3104
3120
j .java_class (field ),
3105
3121
):
3106
3122
self .generate_field_validation (field , value_name = "value" , omit_arg_name = True , allow_default = False )
3107
- args = ", " .join (
3108
- "value" if f is field else "null"
3109
- for f in value_fields
3110
- )
3111
- w .out ('return new %s(Tag.%s, %s);' ,
3123
+ method_name = union_factory_create_method_name (data_type , [field ])
3124
+ w .out ('return %s.%s(Tag.%s, %s);' ,
3112
3125
j .java_class (data_type ),
3126
+ method_name ,
3113
3127
j .field_tag_enum_name (field ),
3114
- args )
3128
+ "value" )
3115
3129
3116
3130
if is_nullable_type (field .data_type ):
3117
3131
w .out ('' )
0 commit comments