Skip to content

Commit e412145

Browse files
authored
[dart][dart-dio] More enum fixes for inner types (#8174)
* correctly generate enums from `mostInnerItems` * use `datatypeWithEnum` which should always be he correct type * dart generators prefix inner enums with the classname of the containing class, ensure datatypeWithEnum always matches
1 parent c974c51 commit e412145

18 files changed

Lines changed: 215 additions & 213 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,25 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {
504504
return postProcessModelsEnum(objs);
505505
}
506506

507+
@Override
508+
public void postProcessModelProperty(CodegenModel model, CodegenProperty property) {
509+
super.postProcessModelProperty(model, property);
510+
if (!model.isEnum && property.isEnum) {
511+
// These are inner enums, enums which do not exist as models, just as properties.
512+
// They are handled via the enum_inline template and and are generated in the
513+
// same file as the containing class. To prevent name clashes the inline enum classes
514+
// are prefix with the classname of the containing class in the template.
515+
// Here the datatypeWithEnum template variable gets updated to match that scheme.
516+
// Also taking into account potential collection types e.g. List<JustSymbolEnum> -> List<EnumArraysJustSymbolEnum>
517+
if (property.items != null) {
518+
// basically inner items e.g. map of maps etc.
519+
property.setDatatypeWithEnum(property.datatypeWithEnum.replace(property.items.datatypeWithEnum, model.classname + property.items.datatypeWithEnum));
520+
} else {
521+
property.setDatatypeWithEnum(property.datatypeWithEnum.replace(property.enumName, model.classname + property.enumName));
522+
}
523+
}
524+
}
525+
507526
@Override
508527
public CodegenOperation fromOperation(String path, String httpMethod, Operation operation, List<Server> servers) {
509528
final CodegenOperation op = super.fromOperation(path, httpMethod, operation, servers);

modules/openapi-generator/src/main/resources/dart-dio/class.mustache

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ abstract class {{classname}} implements Built<{{classname}}, {{classname}}Builde
1111
@nullable
1212
{{/isNullable}}
1313
@BuiltValueField(wireName: r'{{baseName}}')
14-
{{#isEnum}}{{classname}}{{{nameInCamelCase}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}} get {{name}};
14+
{{{datatypeWithEnum}}} get {{name}};
1515
{{#allowableValues}}
1616
{{#min}}// range from {{min}} to {{max}}{{/min}}//{{^min}} enum {{name}}Enum { {{#values}} {{.}}, {{/values}} };{{/min}}
1717
{{/allowableValues}}
@@ -31,8 +31,15 @@ abstract class {{classname}} implements Built<{{classname}}, {{classname}}Builde
3131
}}
3232
{{#vars}}
3333
{{#isEnum}}
34+
{{^isContainer}}
3435

3536
{{>enum_inline}}
37+
{{/isContainer}}
38+
{{#isContainer}}
39+
{{#mostInnerItems}}
3640

41+
{{>enum_inline}}
42+
{{/mostInnerItems}}
43+
{{/isContainer}}
3744
{{/isEnum}}
3845
{{/vars}}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
class {{classname}}{{nameInCamelCase}} extends EnumClass {
1+
class {{{classname}}}{{{enumName}}} extends EnumClass {
22
33
{{#allowableValues}}
44
{{#enumVars}}
55
{{#description}}
66
/// {{{description}}}
77
{{/description}}
88
@BuiltValueEnumConst({{#isInteger}}wireNumber: {{{value}}}{{/isInteger}}{{^isInteger}}wireName: r{{#lambda.escapeBuiltValueEnum}}{{{value}}}{{/lambda.escapeBuiltValueEnum}}{{/isInteger}})
9-
static const {{classname}}{{nameInCamelCase}} {{name}} = _${{#lambda.camelcase}}{{classname}}{{nameInCamelCase}}{{/lambda.camelcase}}_{{name}};
9+
static const {{{classname}}}{{{enumName}}} {{name}} = _${{#lambda.camelcase}}{{{classname}}}{{{enumName}}}{{/lambda.camelcase}}_{{name}};
1010
{{/enumVars}}
1111
{{/allowableValues}}
1212

13-
static Serializer<{{classname}}{{nameInCamelCase}}> get serializer => _${{#lambda.camelcase}}{{classname}}{{nameInCamelCase}}{{/lambda.camelcase}}Serializer;
13+
static Serializer<{{{classname}}}{{{enumName}}}> get serializer => _${{#lambda.camelcase}}{{{classname}}}{{{enumName}}}{{/lambda.camelcase}}Serializer;
1414

15-
const {{classname}}{{nameInCamelCase}}._(String name): super(name);
15+
const {{{classname}}}{{{enumName}}}._(String name): super(name);
1616

17-
static BuiltSet<{{classname}}{{nameInCamelCase}}> get values => _${{#lambda.camelcase}}{{classname}}{{nameInCamelCase}}{{/lambda.camelcase}}Values;
18-
static {{classname}}{{nameInCamelCase}} valueOf(String name) => _${{#lambda.camelcase}}{{classname}}{{nameInCamelCase}}{{/lambda.camelcase}}ValueOf(name);
17+
static BuiltSet<{{{classname}}}{{{enumName}}}> get values => _${{#lambda.camelcase}}{{{classname}}}{{{enumName}}}{{/lambda.camelcase}}Values;
18+
static {{{classname}}}{{{enumName}}} valueOf(String name) => _${{#lambda.camelcase}}{{{classname}}}{{{enumName}}}{{/lambda.camelcase}}ValueOf(name);
1919
}

modules/openapi-generator/src/main/resources/dart2/class.mustache

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,8 @@ class {{{classname}}} {
1515
{{#maximum}}
1616
// maximum: {{{maximum}}}
1717
{{/maximum}}
18-
{{{dataType}}} {{{name}}};
19-
{{/isEnum}}
20-
{{#isEnum}}
21-
{{#isContainer}}
22-
{{#isArray}}
23-
List<{{{classname}}}{{{enumName}}}> {{{name}}};
24-
{{/isArray}}
25-
{{#isMap}}
26-
Map<String, dynamic> {{{name}}};
27-
{{/isMap}}
28-
{{/isContainer}}
29-
{{^isContainer}}
30-
{{#allowableValues}}
31-
{{{classname}}}{{{enumName}}} {{{name}}}{{#required}}{{#defaultValue}} = {{{classname}}}{{{enumName}}}._({{{defaultValue}}}){{/defaultValue}}{{/required}};
32-
{{/allowableValues}}
33-
{{/isContainer}}
3418
{{/isEnum}}
19+
{{{datatypeWithEnum}}} {{{name}}};
3520

3621
{{/vars}}
3722
@override
@@ -225,8 +210,16 @@ class {{{classname}}} {
225210
}
226211
}
227212
{{#vars}}
228-
{{#isEnum}}
213+
{{#isEnum}}
214+
{{^isContainer}}
229215

230216
{{>enum_inline}}
231-
{{/isEnum}}
217+
{{/isContainer}}
218+
{{#isContainer}}
219+
{{#mostInnerItems}}
220+
221+
{{>enum_inline}}
222+
{{/mostInnerItems}}
223+
{{/isContainer}}
224+
{{/isEnum}}
232225
{{/vars}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/dart/DartModelTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ public void testEnumValues() {
419419
Assert.assertEquals(property1.baseName, "testStringEnum");
420420
Assert.assertEquals(property1.dataType, "String");
421421
Assert.assertEquals(property1.baseType, "String");
422-
Assert.assertEquals(property1.datatypeWithEnum, "TestStringEnumEnum");
422+
Assert.assertEquals(property1.datatypeWithEnum, "SampleTestStringEnumEnum");
423423
Assert.assertEquals(property1.name, "testStringEnum");
424424
Assert.assertTrue(property1.isEnum);
425425
Assert.assertEquals(property1.allowableValues.size(), 2);
@@ -439,7 +439,7 @@ public void testEnumValues() {
439439
Assert.assertEquals(property2.baseName, "testIntEnum");
440440
Assert.assertEquals(property2.dataType, "int");
441441
Assert.assertEquals(property2.baseType, "int");
442-
Assert.assertEquals(property2.datatypeWithEnum, "TestIntEnumEnum");
442+
Assert.assertEquals(property2.datatypeWithEnum, "SampleTestIntEnumEnum");
443443
Assert.assertEquals(property2.name, "testIntEnum");
444444
Assert.assertTrue(property2.isEnum);
445445
Assert.assertEquals(property2.allowableValues.size(), 2);
@@ -482,7 +482,7 @@ public void testXEnumValuesExtension() {
482482
Assert.assertEquals(property1.baseName, "testIntEnum");
483483
Assert.assertEquals(property1.dataType, "int");
484484
Assert.assertEquals(property1.baseType, "int");
485-
Assert.assertEquals(property1.datatypeWithEnum, "TestIntEnumEnum");
485+
Assert.assertEquals(property1.datatypeWithEnum, "SampleTestIntEnumEnum");
486486
Assert.assertEquals(property1.name, "testIntEnum");
487487
Assert.assertTrue(property1.isEnum);
488488
Assert.assertEquals(property1.allowableValues.size(), 2);

samples/client/petstore/dart-dio/petstore_client_lib/lib/model/order.dart

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ abstract class Order implements Built<Order, OrderBuilder> {
2525
/* Order Status */
2626
@nullable
2727
@BuiltValueField(wireName: r'status')
28-
OrderStatus get status;
28+
OrderStatusEnum get status;
2929
// enum statusEnum { placed, approved, delivered, };
3030

3131
@nullable
@@ -39,24 +39,23 @@ abstract class Order implements Built<Order, OrderBuilder> {
3939
static Serializer<Order> get serializer => _$orderSerializer;
4040
}
4141

42-
class OrderStatus extends EnumClass {
42+
class OrderStatusEnum extends EnumClass {
4343

4444
/// Order Status
4545
@BuiltValueEnumConst(wireName: r'placed')
46-
static const OrderStatus placed = _$orderStatus_placed;
46+
static const OrderStatusEnum placed = _$orderStatusEnum_placed;
4747
/// Order Status
4848
@BuiltValueEnumConst(wireName: r'approved')
49-
static const OrderStatus approved = _$orderStatus_approved;
49+
static const OrderStatusEnum approved = _$orderStatusEnum_approved;
5050
/// Order Status
5151
@BuiltValueEnumConst(wireName: r'delivered')
52-
static const OrderStatus delivered = _$orderStatus_delivered;
52+
static const OrderStatusEnum delivered = _$orderStatusEnum_delivered;
5353

54-
static Serializer<OrderStatus> get serializer => _$orderStatusSerializer;
54+
static Serializer<OrderStatusEnum> get serializer => _$orderStatusEnumSerializer;
5555

56-
const OrderStatus._(String name): super(name);
56+
const OrderStatusEnum._(String name): super(name);
5757

58-
static BuiltSet<OrderStatus> get values => _$orderStatusValues;
59-
static OrderStatus valueOf(String name) => _$orderStatusValueOf(name);
58+
static BuiltSet<OrderStatusEnum> get values => _$orderStatusEnumValues;
59+
static OrderStatusEnum valueOf(String name) => _$orderStatusEnumValueOf(name);
6060
}
6161

62-

samples/client/petstore/dart-dio/petstore_client_lib/lib/model/pet.dart

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ abstract class Pet implements Built<Pet, PetBuilder> {
3131
/* pet status in the store */
3232
@nullable
3333
@BuiltValueField(wireName: r'status')
34-
PetStatus get status;
34+
PetStatusEnum get status;
3535
// enum statusEnum { available, pending, sold, };
3636

3737
// Boilerplate code needed to wire-up generated code
@@ -41,24 +41,23 @@ abstract class Pet implements Built<Pet, PetBuilder> {
4141
static Serializer<Pet> get serializer => _$petSerializer;
4242
}
4343

44-
class PetStatus extends EnumClass {
44+
class PetStatusEnum extends EnumClass {
4545

4646
/// pet status in the store
4747
@BuiltValueEnumConst(wireName: r'available')
48-
static const PetStatus available = _$petStatus_available;
48+
static const PetStatusEnum available = _$petStatusEnum_available;
4949
/// pet status in the store
5050
@BuiltValueEnumConst(wireName: r'pending')
51-
static const PetStatus pending = _$petStatus_pending;
51+
static const PetStatusEnum pending = _$petStatusEnum_pending;
5252
/// pet status in the store
5353
@BuiltValueEnumConst(wireName: r'sold')
54-
static const PetStatus sold = _$petStatus_sold;
54+
static const PetStatusEnum sold = _$petStatusEnum_sold;
5555

56-
static Serializer<PetStatus> get serializer => _$petStatusSerializer;
56+
static Serializer<PetStatusEnum> get serializer => _$petStatusEnumSerializer;
5757

58-
const PetStatus._(String name): super(name);
58+
const PetStatusEnum._(String name): super(name);
5959

60-
static BuiltSet<PetStatus> get values => _$petStatusValues;
61-
static PetStatus valueOf(String name) => _$petStatusValueOf(name);
60+
static BuiltSet<PetStatusEnum> get values => _$petStatusEnumValues;
61+
static PetStatusEnum valueOf(String name) => _$petStatusEnumValueOf(name);
6262
}
6363

64-

samples/openapi3/client/petstore/dart-dio/petstore_client_lib/lib/model/order.dart

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ abstract class Order implements Built<Order, OrderBuilder> {
2525
/* Order Status */
2626
@nullable
2727
@BuiltValueField(wireName: r'status')
28-
OrderStatus get status;
28+
OrderStatusEnum get status;
2929
// enum statusEnum { placed, approved, delivered, };
3030

3131
@nullable
@@ -39,24 +39,23 @@ abstract class Order implements Built<Order, OrderBuilder> {
3939
static Serializer<Order> get serializer => _$orderSerializer;
4040
}
4141

42-
class OrderStatus extends EnumClass {
42+
class OrderStatusEnum extends EnumClass {
4343

4444
/// Order Status
4545
@BuiltValueEnumConst(wireName: r'placed')
46-
static const OrderStatus placed = _$orderStatus_placed;
46+
static const OrderStatusEnum placed = _$orderStatusEnum_placed;
4747
/// Order Status
4848
@BuiltValueEnumConst(wireName: r'approved')
49-
static const OrderStatus approved = _$orderStatus_approved;
49+
static const OrderStatusEnum approved = _$orderStatusEnum_approved;
5050
/// Order Status
5151
@BuiltValueEnumConst(wireName: r'delivered')
52-
static const OrderStatus delivered = _$orderStatus_delivered;
52+
static const OrderStatusEnum delivered = _$orderStatusEnum_delivered;
5353

54-
static Serializer<OrderStatus> get serializer => _$orderStatusSerializer;
54+
static Serializer<OrderStatusEnum> get serializer => _$orderStatusEnumSerializer;
5555

56-
const OrderStatus._(String name): super(name);
56+
const OrderStatusEnum._(String name): super(name);
5757

58-
static BuiltSet<OrderStatus> get values => _$orderStatusValues;
59-
static OrderStatus valueOf(String name) => _$orderStatusValueOf(name);
58+
static BuiltSet<OrderStatusEnum> get values => _$orderStatusEnumValues;
59+
static OrderStatusEnum valueOf(String name) => _$orderStatusEnumValueOf(name);
6060
}
6161

62-

samples/openapi3/client/petstore/dart-dio/petstore_client_lib/lib/model/pet.dart

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ abstract class Pet implements Built<Pet, PetBuilder> {
3131
/* pet status in the store */
3232
@nullable
3333
@BuiltValueField(wireName: r'status')
34-
PetStatus get status;
34+
PetStatusEnum get status;
3535
// enum statusEnum { available, pending, sold, };
3636

3737
// Boilerplate code needed to wire-up generated code
@@ -41,24 +41,23 @@ abstract class Pet implements Built<Pet, PetBuilder> {
4141
static Serializer<Pet> get serializer => _$petSerializer;
4242
}
4343

44-
class PetStatus extends EnumClass {
44+
class PetStatusEnum extends EnumClass {
4545

4646
/// pet status in the store
4747
@BuiltValueEnumConst(wireName: r'available')
48-
static const PetStatus available = _$petStatus_available;
48+
static const PetStatusEnum available = _$petStatusEnum_available;
4949
/// pet status in the store
5050
@BuiltValueEnumConst(wireName: r'pending')
51-
static const PetStatus pending = _$petStatus_pending;
51+
static const PetStatusEnum pending = _$petStatusEnum_pending;
5252
/// pet status in the store
5353
@BuiltValueEnumConst(wireName: r'sold')
54-
static const PetStatus sold = _$petStatus_sold;
54+
static const PetStatusEnum sold = _$petStatusEnum_sold;
5555

56-
static Serializer<PetStatus> get serializer => _$petStatusSerializer;
56+
static Serializer<PetStatusEnum> get serializer => _$petStatusEnumSerializer;
5757

58-
const PetStatus._(String name): super(name);
58+
const PetStatusEnum._(String name): super(name);
5959

60-
static BuiltSet<PetStatus> get values => _$petStatusValues;
61-
static PetStatus valueOf(String name) => _$petStatusValueOf(name);
60+
static BuiltSet<PetStatusEnum> get values => _$petStatusEnumValues;
61+
static PetStatusEnum valueOf(String name) => _$petStatusEnumValueOf(name);
6262
}
6363

64-

samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/lib/model/enum_arrays.dart

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ abstract class EnumArrays implements Built<EnumArrays, EnumArraysBuilder> {
99

1010
@nullable
1111
@BuiltValueField(wireName: r'just_symbol')
12-
EnumArraysJustSymbol get justSymbol;
12+
EnumArraysJustSymbolEnum get justSymbol;
1313
// enum justSymbolEnum { &gt;&#x3D;, $, };
1414

1515
@nullable
1616
@BuiltValueField(wireName: r'array_enum')
17-
EnumArraysArrayEnum get arrayEnum;
17+
BuiltList<EnumArraysArrayEnumEnum> get arrayEnum;
1818
// enum arrayEnumEnum { fish, crab, };
1919

2020
// Boilerplate code needed to wire-up generated code
@@ -24,35 +24,33 @@ abstract class EnumArrays implements Built<EnumArrays, EnumArraysBuilder> {
2424
static Serializer<EnumArrays> get serializer => _$enumArraysSerializer;
2525
}
2626

27-
class EnumArraysJustSymbol extends EnumClass {
27+
class EnumArraysJustSymbolEnum extends EnumClass {
2828

2929
@BuiltValueEnumConst(wireName: r'>=')
30-
static const EnumArraysJustSymbol greaterThanEqual = _$enumArraysJustSymbol_greaterThanEqual;
30+
static const EnumArraysJustSymbolEnum greaterThanEqual = _$enumArraysJustSymbolEnum_greaterThanEqual;
3131
@BuiltValueEnumConst(wireName: r'\$')
32-
static const EnumArraysJustSymbol dollar = _$enumArraysJustSymbol_dollar;
32+
static const EnumArraysJustSymbolEnum dollar = _$enumArraysJustSymbolEnum_dollar;
3333

34-
static Serializer<EnumArraysJustSymbol> get serializer => _$enumArraysJustSymbolSerializer;
34+
static Serializer<EnumArraysJustSymbolEnum> get serializer => _$enumArraysJustSymbolEnumSerializer;
3535

36-
const EnumArraysJustSymbol._(String name): super(name);
36+
const EnumArraysJustSymbolEnum._(String name): super(name);
3737

38-
static BuiltSet<EnumArraysJustSymbol> get values => _$enumArraysJustSymbolValues;
39-
static EnumArraysJustSymbol valueOf(String name) => _$enumArraysJustSymbolValueOf(name);
38+
static BuiltSet<EnumArraysJustSymbolEnum> get values => _$enumArraysJustSymbolEnumValues;
39+
static EnumArraysJustSymbolEnum valueOf(String name) => _$enumArraysJustSymbolEnumValueOf(name);
4040
}
4141

42-
43-
class EnumArraysArrayEnum extends EnumClass {
42+
class EnumArraysArrayEnumEnum extends EnumClass {
4443

4544
@BuiltValueEnumConst(wireName: r'fish')
46-
static const EnumArraysArrayEnum fish = _$enumArraysArrayEnum_fish;
45+
static const EnumArraysArrayEnumEnum fish = _$enumArraysArrayEnumEnum_fish;
4746
@BuiltValueEnumConst(wireName: r'crab')
48-
static const EnumArraysArrayEnum crab = _$enumArraysArrayEnum_crab;
47+
static const EnumArraysArrayEnumEnum crab = _$enumArraysArrayEnumEnum_crab;
4948

50-
static Serializer<EnumArraysArrayEnum> get serializer => _$enumArraysArrayEnumSerializer;
49+
static Serializer<EnumArraysArrayEnumEnum> get serializer => _$enumArraysArrayEnumEnumSerializer;
5150

52-
const EnumArraysArrayEnum._(String name): super(name);
51+
const EnumArraysArrayEnumEnum._(String name): super(name);
5352

54-
static BuiltSet<EnumArraysArrayEnum> get values => _$enumArraysArrayEnumValues;
55-
static EnumArraysArrayEnum valueOf(String name) => _$enumArraysArrayEnumValueOf(name);
53+
static BuiltSet<EnumArraysArrayEnumEnum> get values => _$enumArraysArrayEnumEnumValues;
54+
static EnumArraysArrayEnumEnum valueOf(String name) => _$enumArraysArrayEnumEnumValueOf(name);
5655
}
5756

58-

0 commit comments

Comments
 (0)