Skip to content

Commit 70521cd

Browse files
committed
fix duplicate builder factories and regenerate petstore sample
1 parent daf6302 commit 70521cd

2 files changed

Lines changed: 91 additions & 14 deletions

File tree

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

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -683,16 +683,29 @@ private void registerNestedBuilderFactories(CodegenProperty prop) {
683683
if (prop == null || !prop.isContainer || prop.items == null) {
684684
return;
685685
}
686-
// Recurse first so deeper containers are registered too. Order
687-
// doesn't matter for correctness (built_value resolves factories
688-
// by FullType lookup), but it keeps the emitted list intuitive.
686+
// Recurse first so deeper containers are registered too.
689687
registerNestedBuilderFactories(prop.items);
690688

691-
BuilderFactoryExpr expr = renderBuilderFactory(prop);
692-
if (expr != null) {
693-
addBuiltValueSerializer(BuiltValueSerializer.composite(
694-
expr.fullTypeArgs,
695-
expr.builderInstantiation));
689+
if (prop.items.isContainer) {
690+
// Truly nested container (e.g. Map<String, List<X>>):
691+
// must use composite form because the simple constructor
692+
// cannot express the nested FullType.
693+
BuilderFactoryExpr expr = renderBuilderFactory(prop);
694+
if (expr != null) {
695+
addBuiltValueSerializer(BuiltValueSerializer.composite(
696+
expr.fullTypeArgs,
697+
expr.builderInstantiation));
698+
}
699+
} else {
700+
// Leaf container (e.g. List<X>, Map<String, X>): use the
701+
// same simple constructor the rest of the codegen uses so
702+
// the Set deduplicates correctly.
703+
addBuiltValueSerializer(new BuiltValueSerializer(
704+
prop.isArray,
705+
prop.getUniqueItems(),
706+
prop.isMap,
707+
prop.items.isNullable,
708+
prop.items.dataType));
696709
}
697710
}
698711

samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/lib/src/serializers.dart

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,42 @@ Serializers serializers = (_$serializers.toBuilder()
136136
const FullType(BuiltMap, [FullType(String), FullType(String)]),
137137
() => MapBuilder<String, String>(),
138138
)
139+
..addBuilderFactory(
140+
const FullType(BuiltList, [FullType(BuiltList, [FullType(int)])]),
141+
() => ListBuilder<BuiltList<int>>(),
142+
)
143+
..addBuilderFactory(
144+
const FullType(BuiltMap, [FullType(String), FullType(num)]),
145+
() => MapBuilder<String, num>(),
146+
)
147+
..addBuilderFactory(
148+
const FullType(BuiltMap, [FullType(String), FullType(Animal)]),
149+
() => MapBuilder<String, Animal>(),
150+
)
151+
..addBuilderFactory(
152+
const FullType(BuiltList, [FullType(ReadOnlyFirst)]),
153+
() => ListBuilder<ReadOnlyFirst>(),
154+
)
155+
..addBuilderFactory(
156+
const FullType(BuiltList, [FullType(BuiltList, [FullType(ReadOnlyFirst)])]),
157+
() => ListBuilder<BuiltList<ReadOnlyFirst>>(),
158+
)
159+
..addBuilderFactory(
160+
const FullType(BuiltMap, [FullType(String), FullType(BuiltMap, [FullType(String), FullType(String)])]),
161+
() => MapBuilder<String, BuiltMap<String, String>>(),
162+
)
163+
..addBuilderFactory(
164+
const FullType(BuiltMap, [FullType(String), FullType(int)]),
165+
() => MapBuilder<String, int>(),
166+
)
167+
..addBuilderFactory(
168+
const FullType(BuiltList, [FullType(BuiltList, [FullType(num)])]),
169+
() => ListBuilder<BuiltList<num>>(),
170+
)
171+
..addBuilderFactory(
172+
const FullType(BuiltList, [FullType(num)]),
173+
() => ListBuilder<num>(),
174+
)
139175
..addBuilderFactory(
140176
const FullType(BuiltList, [FullType(User)]),
141177
() => ListBuilder<User>(),
@@ -144,6 +180,10 @@ Serializers serializers = (_$serializers.toBuilder()
144180
const FullType(BuiltSet, [FullType(String)]),
145181
() => SetBuilder<String>(),
146182
)
183+
..addBuilderFactory(
184+
const FullType(BuiltMap, [FullType(String), FullType(BuiltList, [FullType(int)])]),
185+
() => MapBuilder<String, BuiltList<int>>(),
186+
)
147187
..addBuilderFactory(
148188
const FullType(BuiltSet, [FullType(Pet)]),
149189
() => SetBuilder<Pet>(),
@@ -153,21 +193,45 @@ Serializers serializers = (_$serializers.toBuilder()
153193
() => ListBuilder<Pet>(),
154194
)
155195
..addBuilderFactory(
156-
const FullType(BuiltMap, [FullType(String), FullType.nullable(JsonObject)]),
157-
() => MapBuilder<String, JsonObject?>(),
158-
)
159-
..addBuilderFactory(
160-
const FullType(BuiltMap, [FullType(String), FullType(int)]),
161-
() => MapBuilder<String, int>(),
196+
const FullType(BuiltList, [FullType(JsonObject)]),
197+
() => ListBuilder<JsonObject>(),
162198
)
163199
..addBuilderFactory(
164200
const FullType(BuiltList, [FullType(ModelEnumClass)]),
165201
() => ListBuilder<ModelEnumClass>(),
166202
)
203+
..addBuilderFactory(
204+
const FullType(BuiltList, [FullType.nullable(JsonObject)]),
205+
() => ListBuilder<JsonObject>(),
206+
)
207+
..addBuilderFactory(
208+
const FullType(BuiltList, [FullType(Tag)]),
209+
() => ListBuilder<Tag>(),
210+
)
211+
..addBuilderFactory(
212+
const FullType(BuiltList, [FullType(ModelFile)]),
213+
() => ListBuilder<ModelFile>(),
214+
)
215+
..addBuilderFactory(
216+
const FullType(BuiltList, [FullType(int)]),
217+
() => ListBuilder<int>(),
218+
)
219+
..addBuilderFactory(
220+
const FullType(BuiltMap, [FullType(String), FullType.nullable(JsonObject)]),
221+
() => MapBuilder<String, JsonObject?>(),
222+
)
223+
..addBuilderFactory(
224+
const FullType(BuiltMap, [FullType(String), FullType(bool)]),
225+
() => MapBuilder<String, bool>(),
226+
)
167227
..addBuilderFactory(
168228
const FullType(BuiltList, [FullType(String)]),
169229
() => ListBuilder<String>(),
170230
)
231+
..addBuilderFactory(
232+
const FullType(BuiltMap, [FullType(String), FullType(JsonObject)]),
233+
() => MapBuilder<String, JsonObject>(),
234+
)
171235
..add(Animal.serializer)
172236
..add(ParentWithNullable.serializer)
173237
..add(const OneOfSerializer())

0 commit comments

Comments
 (0)