Skip to content

Commit 7fae4ab

Browse files
authored
[dart] type improvements (#8111)
* [dart] Configure and use import mapping This prevents models from being generated which would clash with exisiting dart types, e.g. List. * [dart] Fix decimal format not supported * [dart-dio] Remove redundant modelToIgnore & ignore dart:core import * modelToIgnore is now handled via importMappings the same way other generators do this * choose not to import dart:core as this is available by default * [dart-dio] EnumClass is a reserved word in built_value * Review changes * Fix regenerate docs
1 parent 99d8371 commit 7fae4ab

File tree

27 files changed

+121
-237
lines changed

27 files changed

+121
-237
lines changed

docs/generators/dart-dio.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,19 @@ These options may be applied as additional-properties (cli) or configOptions (pl
3333
|BuiltList|package:built_collection/built_collection.dart|
3434
|BuiltMap|package:built_collection/built_collection.dart|
3535
|BuiltSet|package:built_collection/built_collection.dart|
36+
|DateTime|dart:core|
3637
|JsonObject|package:built_value/json_object.dart|
38+
|List|dart:core|
39+
|Map|dart:core|
40+
|Object|dart:core|
41+
|Set|dart:core|
42+
|String|dart:core|
3743
|Uint8List|dart:typed_data|
44+
|bool|dart:core|
45+
|double|dart:core|
46+
|dynamic|dart:core|
47+
|int|dart:core|
48+
|num|dart:core|
3849

3950

4051
## INSTANTIATION TYPES

docs/generators/dart-jaguar.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@ These options may be applied as additional-properties (cli) or configOptions (pl
3030

3131
| Type/Alias | Imports |
3232
| ---------- | ------- |
33+
|DateTime|dart:core|
34+
|List|dart:core|
35+
|Map|dart:core|
36+
|Object|dart:core|
37+
|Set|dart:core|
38+
|String|dart:core|
39+
|bool|dart:core|
40+
|double|dart:core|
41+
|dynamic|dart:core|
42+
|int|dart:core|
43+
|num|dart:core|
3344

3445

3546
## INSTANTIATION TYPES

docs/generators/dart.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@ These options may be applied as additional-properties (cli) or configOptions (pl
2828

2929
| Type/Alias | Imports |
3030
| ---------- | ------- |
31+
|DateTime|dart:core|
32+
|List|dart:core|
33+
|Map|dart:core|
34+
|Object|dart:core|
35+
|Set|dart:core|
36+
|String|dart:core|
37+
|bool|dart:core|
38+
|double|dart:core|
39+
|dynamic|dart:core|
40+
|int|dart:core|
41+
|num|dart:core|
3142

3243

3344
## INSTANTIATION TYPES

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

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.apache.commons.io.FilenameUtils;
3737
import org.apache.commons.lang3.StringUtils;
3838
import org.openapitools.codegen.CliOption;
39-
import org.openapitools.codegen.CodegenConfig;
4039
import org.openapitools.codegen.CodegenConstants;
4140
import org.openapitools.codegen.CodegenModel;
4241
import org.openapitools.codegen.CodegenProperty;
@@ -56,7 +55,7 @@
5655
import io.swagger.v3.oas.models.media.ArraySchema;
5756
import io.swagger.v3.oas.models.media.Schema;
5857

59-
public class DartClientCodegen extends DefaultCodegen implements CodegenConfig {
58+
public class DartClientCodegen extends DefaultCodegen {
6059
private static final Logger LOGGER = LoggerFactory.getLogger(DartClientCodegen.class);
6160

6261
public static final String PUB_LIBRARY = "pubLibrary";
@@ -161,8 +160,7 @@ public DartClientCodegen() {
161160
typeMapping.put("number", "num");
162161
typeMapping.put("float", "double");
163162
typeMapping.put("double", "double");
164-
typeMapping.put("object", "Object");
165-
typeMapping.put("AnyType", "Object");
163+
typeMapping.put("decimal", "double");
166164
typeMapping.put("integer", "int");
167165
typeMapping.put("Date", "DateTime");
168166
typeMapping.put("date", "DateTime");
@@ -171,6 +169,24 @@ public DartClientCodegen() {
171169
typeMapping.put("UUID", "String");
172170
typeMapping.put("URI", "String");
173171
typeMapping.put("ByteArray", "String");
172+
typeMapping.put("object", "Object");
173+
typeMapping.put("AnyType", "Object");
174+
175+
// These are needed as they prevent models from being generated
176+
// which would clash with existing types, e.g. List
177+
// Importing dart:core doesn't hurt but a subclass may choose to skip
178+
// dart:core imports.
179+
importMapping.put("dynamic", "dart:core");
180+
importMapping.put("Object", "dart:core");
181+
importMapping.put("String", "dart:core");
182+
importMapping.put("bool", "dart:core");
183+
importMapping.put("num", "dart:core");
184+
importMapping.put("int", "dart:core");
185+
importMapping.put("double", "dart:core");
186+
importMapping.put("List", "dart:core");
187+
importMapping.put("Map", "dart:core");
188+
importMapping.put("Set", "dart:core");
189+
importMapping.put("DateTime", "dart:core");
174190

175191
cliOptions.add(new CliOption(PUB_LIBRARY, "Library name in generated code"));
176192
cliOptions.add(new CliOption(PUB_NAME, "Name in generated pubspec"));

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

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616

1717
package org.openapitools.codegen.languages;
1818

19-
import java.util.HashMap;
20-
19+
import com.google.common.collect.Sets;
2120
import org.apache.commons.lang3.StringUtils;
2221
import org.openapitools.codegen.CliOption;
2322
import org.openapitools.codegen.CodegenConstants;
@@ -32,11 +31,7 @@
3231
import org.slf4j.LoggerFactory;
3332

3433
import java.io.File;
35-
import java.util.HashSet;
36-
import java.util.List;
37-
import java.util.Locale;
38-
import java.util.Map;
39-
import java.util.Set;
34+
import java.util.*;
4035

4136
import io.swagger.v3.oas.models.media.Schema;
4237

@@ -51,19 +46,10 @@ public class DartDioClientCodegen extends DartClientCodegen {
5146

5247
private static final String IS_FORMAT_JSON = "jsonFormat";
5348
private static final String CLIENT_NAME = "clientName";
54-
private static final Set<String> modelToIgnore = new HashSet<>();
55-
56-
static {
57-
modelToIgnore.add("datetime");
58-
modelToIgnore.add("map");
59-
modelToIgnore.add("object");
60-
modelToIgnore.add("list");
61-
modelToIgnore.add("file");
62-
modelToIgnore.add("uint8list");
63-
}
6449

6550
private boolean nullableFields = true;
6651
private String dateLibrary = "core";
52+
private static final Set<String> reservedBuiltValueWords = Sets.newHashSet("EnumClass");
6753

6854
public DartDioClientCodegen() {
6955
super();
@@ -116,6 +102,11 @@ public String getHelp() {
116102
return "Generates a Dart Dio client library.";
117103
}
118104

105+
@Override
106+
protected boolean isReservedWord(String word) {
107+
return super.isReservedWord(word) || reservedBuiltValueWords.contains(word);
108+
}
109+
119110
@Override
120111
public String toDefaultValue(Schema schema) {
121112
if (ModelUtils.isMapSchema(schema)) {
@@ -270,12 +261,13 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {
270261
Set<String> modelImports = new HashSet<>();
271262
CodegenModel cm = (CodegenModel) mo.get("model");
272263
for (String modelImport : cm.imports) {
273-
if (importMapping.containsKey(modelImport)) {
274-
modelImports.add(importMapping.get(modelImport));
275-
} else {
276-
if (!modelToIgnore.contains(modelImport.toLowerCase(Locale.ROOT))) {
277-
modelImports.add("package:" + pubName + "/model/" + underscore(modelImport) + ".dart");
264+
if (importMapping().containsKey(modelImport)) {
265+
final String value = importMapping().get(modelImport);
266+
if (!Objects.equals(value, "dart:core")) {
267+
modelImports.add(value);
278268
}
269+
} else {
270+
modelImports.add("package:" + pubName + "/model/" + underscore(modelImport) + ".dart");
279271
}
280272
}
281273

@@ -362,10 +354,13 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
362354

363355
Set<String> imports = new HashSet<>();
364356
for (String item : op.imports) {
365-
if (!modelToIgnore.contains(item.toLowerCase(Locale.ROOT))) {
357+
if (importMapping().containsKey(item)) {
358+
final String value = importMapping().get(item);
359+
if (!Objects.equals(value, "dart:core")) {
360+
fullImports.add(value);
361+
}
362+
} else {
366363
imports.add(underscore(item));
367-
} else if (item.equalsIgnoreCase("Uint8List")) {
368-
fullImports.add("dart:typed_data");
369364
}
370365
}
371366
modelImports.addAll(imports);

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public void simpleModelTest() {
3737
.addProperties("name", new StringSchema())
3838
.addProperties("createdAt", new DateTimeSchema())
3939
.addProperties("defaultItem", new IntegerSchema()._default(1))
40+
.addProperties("number", new NumberSchema())
41+
.addProperties("decimal", new StringSchema().format("number"))
4042
.addRequiredItem("id")
4143
.addRequiredItem("name");
4244
final DefaultCodegen codegen = new DartClientCodegen();
@@ -47,9 +49,7 @@ public void simpleModelTest() {
4749
Assert.assertEquals(cm.name, "sample");
4850
Assert.assertEquals(cm.classname, "Sample");
4951
Assert.assertEquals(cm.description, "a sample model");
50-
Assert.assertEquals(cm.vars.size(), 4);
51-
// {{imports}} is not used in template
52-
//Assert.assertEquals(cm.imports.size(), 1);
52+
Assert.assertEquals(cm.vars.size(), 6);
5353

5454
final CodegenProperty property1 = cm.vars.get(0);
5555
Assert.assertEquals(property1.baseName, "id");
@@ -88,6 +88,16 @@ public void simpleModelTest() {
8888
Assert.assertEquals(property4.baseType, "int");
8989
Assert.assertFalse(property4.required);
9090
Assert.assertFalse(property4.isContainer);
91+
92+
final CodegenProperty property5 = cm.vars.get(4);
93+
Assert.assertEquals(property5.baseName, "number");
94+
Assert.assertEquals(property5.dataType, "num");
95+
Assert.assertEquals(property5.baseType, "num");
96+
97+
final CodegenProperty property6 = cm.vars.get(5);
98+
Assert.assertEquals(property6.baseName, "decimal");
99+
Assert.assertEquals(property6.dataType, "double");
100+
Assert.assertEquals(property6.baseType, "double");
91101
}
92102

93103
@Test(description = "convert a model with list property")

samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/.openapi-generator/FILES

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ doc/DefaultApi.md
1818
doc/Dog.md
1919
doc/DogAllOf.md
2020
doc/EnumArrays.md
21-
doc/EnumClass.md
2221
doc/EnumTest.md
2322
doc/FakeApi.md
2423
doc/FakeClassnameTags123Api.md
@@ -35,10 +34,10 @@ doc/InlineObject3.md
3534
doc/InlineObject4.md
3635
doc/InlineObject5.md
3736
doc/InlineResponseDefault.md
38-
doc/List.md
3937
doc/MapTest.md
4038
doc/MixedPropertiesAndAdditionalPropertiesClass.md
4139
doc/Model200Response.md
40+
doc/ModelEnumClass.md
4241
doc/ModelReturn.md
4342
doc/Name.md
4443
doc/NullableClass.md
@@ -85,7 +84,6 @@ lib/model/client.dart
8584
lib/model/dog.dart
8685
lib/model/dog_all_of.dart
8786
lib/model/enum_arrays.dart
88-
lib/model/enum_class.dart
8987
lib/model/enum_test.dart
9088
lib/model/file.dart
9189
lib/model/file_schema_test_class.dart
@@ -100,10 +98,10 @@ lib/model/inline_object3.dart
10098
lib/model/inline_object4.dart
10199
lib/model/inline_object5.dart
102100
lib/model/inline_response_default.dart
103-
lib/model/list.dart
104101
lib/model/map_test.dart
105102
lib/model/mixed_properties_and_additional_properties_class.dart
106103
lib/model/model200_response.dart
104+
lib/model/model_enum_class.dart
107105
lib/model/model_return.dart
108106
lib/model/name.dart
109107
lib/model/nullable_class.dart

samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ Class | Method | HTTP request | Description
116116
- [Dog](doc//Dog.md)
117117
- [DogAllOf](doc//DogAllOf.md)
118118
- [EnumArrays](doc//EnumArrays.md)
119-
- [EnumClass](doc//EnumClass.md)
120119
- [EnumTest](doc//EnumTest.md)
121120
- [File](doc//File.md)
122121
- [FileSchemaTestClass](doc//FileSchemaTestClass.md)
@@ -131,10 +130,10 @@ Class | Method | HTTP request | Description
131130
- [InlineObject4](doc//InlineObject4.md)
132131
- [InlineObject5](doc//InlineObject5.md)
133132
- [InlineResponseDefault](doc//InlineResponseDefault.md)
134-
- [List](doc//List.md)
135133
- [MapTest](doc//MapTest.md)
136134
- [MixedPropertiesAndAdditionalPropertiesClass](doc//MixedPropertiesAndAdditionalPropertiesClass.md)
137135
- [Model200Response](doc//Model200Response.md)
136+
- [ModelEnumClass](doc//ModelEnumClass.md)
138137
- [ModelReturn](doc//ModelReturn.md)
139138
- [Name](doc//Name.md)
140139
- [NullableClass](doc//NullableClass.md)

samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/doc/FormatTest.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Name | Type | Description | Notes
1414
**number** | **num** | | [default to null]
1515
**float** | **double** | | [optional] [default to null]
1616
**double** | **double** | | [optional] [default to null]
17-
**decimal** | [**Decimal**](Decimal.md) | | [optional] [default to null]
17+
**decimal** | **double** | | [optional] [default to null]
1818
**string** | **String** | | [optional] [default to null]
1919
**byte** | **String** | | [default to null]
2020
**binary** | [**Uint8List**](Uint8List.md) | | [optional] [default to null]

samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/doc/List.md

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)