1
1
package com .algolia .codegen .utils ;
2
2
3
+ import com .algolia .codegen .AlgoliaSwiftGenerator ;
3
4
import java .util .*;
4
5
import java .util .function .Function ;
5
6
import org .openapitools .codegen .*;
@@ -43,18 +44,19 @@ private static void setHasChildGeneric(IJsonSchemaValidationProperties property)
43
44
* x-has-child-generic
44
45
*/
45
46
private static boolean hasGeneric (IJsonSchemaValidationProperties property ) {
46
- if (property instanceof CodegenModel ) {
47
- return (
48
- (boolean ) ((CodegenModel ) property ).vendorExtensions .getOrDefault ("x-propagated-generic" , false ) ||
49
- (boolean ) ((CodegenModel ) property ).vendorExtensions .getOrDefault ("x-has-child-generic" , false )
50
- );
51
- } else if (property instanceof CodegenProperty ) {
52
- return (
53
- (boolean ) ((CodegenProperty ) property ).vendorExtensions .getOrDefault ("x-propagated-generic" , false ) ||
54
- (boolean ) ((CodegenProperty ) property ).vendorExtensions .getOrDefault ("x-has-child-generic" , false )
55
- );
47
+ Map <String , Object > vendorExtensions ;
48
+ if (property instanceof CodegenModel model ) {
49
+ vendorExtensions = model .vendorExtensions ;
50
+ } else if (property instanceof CodegenProperty prop ) {
51
+ vendorExtensions = prop .vendorExtensions ;
52
+ } else {
53
+ return false ;
56
54
}
57
- return false ;
55
+ return (
56
+ (boolean ) vendorExtensions .getOrDefault ("x-propagated-generic" , false ) ||
57
+ (boolean ) vendorExtensions .getOrDefault ("x-has-child-generic" , false ) ||
58
+ (boolean ) vendorExtensions .getOrDefault ("x-is-generic" , false )
59
+ );
58
60
}
59
61
60
62
private static CodegenModel propertyToModel (Map <String , CodegenModel > models , CodegenProperty prop ) {
@@ -78,16 +80,13 @@ private static boolean markPropagatedGeneric(
78
80
}
79
81
// if items itself isn't generic, we recurse on its items and properties until we reach the
80
82
// end or find a generic property
81
- if (
82
- items != null &&
83
- ((boolean ) items .vendorExtensions .getOrDefault ("x-is-generic" , false ) || markPropagatedGeneric (items , getVar , skipOneOf ))
84
- ) {
83
+ if (items != null && (hasGeneric (items ) || markPropagatedGeneric (items , getVar , skipOneOf ))) {
85
84
setPropagatedGeneric (model );
86
85
return true ;
87
86
}
88
87
for (CodegenProperty variable : getVar .apply (model )) {
89
88
// same thing for the variable, if it's not a generic, we recurse on it until we find one
90
- if (( boolean ) variable . vendorExtensions . getOrDefault ( "x-is-generic" , false ) || markPropagatedGeneric (variable , getVar , skipOneOf )) {
89
+ if (hasGeneric ( items ) || markPropagatedGeneric (variable , getVar , skipOneOf )) {
91
90
setPropagatedGeneric (model );
92
91
return true ;
93
92
}
@@ -122,12 +121,17 @@ private static boolean propagateGenericRecursive(
122
121
return false ;
123
122
}
124
123
125
- private static void setGenericToComposedSchema (Map <String , CodegenModel > models , List <CodegenProperty > composedSchemas ) {
124
+ private static void setGenericToComposedSchema (
125
+ Map <String , CodegenModel > models ,
126
+ CodegenModel model ,
127
+ List <CodegenProperty > composedSchemas
128
+ ) {
126
129
if (composedSchemas == null ) {
127
130
return ;
128
131
}
129
132
for (CodegenProperty prop : composedSchemas ) {
130
- if (hasGeneric (propertyToModel (models , prop ))) {
133
+ if (hasGeneric (prop ) || hasGeneric (propertyToModel (models , prop ))) {
134
+ setHasChildGeneric (model );
131
135
setHasChildGeneric (prop );
132
136
}
133
137
}
@@ -138,62 +142,86 @@ private static void propagateToComposedSchema(Map<String, CodegenModel> models,
138
142
if (composedSchemas == null ) {
139
143
return ;
140
144
}
141
- setGenericToComposedSchema (models , composedSchemas .getOneOf ());
142
- setGenericToComposedSchema (models , composedSchemas .getAllOf ());
143
- setGenericToComposedSchema (models , composedSchemas .getAnyOf ());
145
+ setGenericToComposedSchema (models , model , composedSchemas .getOneOf ());
146
+ setGenericToComposedSchema (models , model , composedSchemas .getAllOf ());
147
+ setGenericToComposedSchema (models , model , composedSchemas .getAnyOf ());
144
148
}
145
149
146
- private static Map <String , CodegenModel > convertToMap (Map <String , ModelsMap > models ) {
150
+ private static Map <String , CodegenModel > convertToMap (String language , String client , Map <String , ModelsMap > models ) {
147
151
Map <String , CodegenModel > modelsMap = new TreeMap <>(String .CASE_INSENSITIVE_ORDER );
148
152
for (ModelsMap modelMap : models .values ()) {
149
153
// modelContainers always have 1 and only 1 model in our specs
150
154
CodegenModel model = modelMap .getModels ().get (0 ).getModel ();
151
- modelsMap .put (model .name , model );
155
+ String modelName = model .name ;
156
+ if (language .equals ("swift" ) && !client .equals ("search" )) {
157
+ modelName = AlgoliaSwiftGenerator .prefixReservedModelName (modelName , client );
158
+ }
159
+ modelsMap .put (modelName , model );
152
160
}
153
161
return modelsMap ;
154
162
}
155
163
156
- private static Map <String , CodegenModel > convertToMap (List <ModelMap > models ) {
164
+ private static Map <String , CodegenModel > convertToMap (String language , String client , List <ModelMap > models ) {
157
165
Map <String , CodegenModel > modelsMap = new TreeMap <>(String .CASE_INSENSITIVE_ORDER );
158
166
for (ModelMap modelMap : models ) {
159
167
CodegenModel model = modelMap .getModel ();
160
- modelsMap .put (model .name , model );
168
+ String modelName = model .name ;
169
+ if (language .equals ("swift" ) && !client .equals ("search" )) {
170
+ modelName = AlgoliaSwiftGenerator .prefixReservedModelName (modelName , client );
171
+ }
172
+ modelsMap .put (modelName , model );
161
173
}
162
174
return modelsMap ;
163
175
}
164
176
165
177
/**
166
178
* Models and their members will be marked with either x-propagated-generic or x-has-child-generic
167
179
*/
168
- public static void propagateGenericsToModels (Map <String , ModelsMap > modelsMap , boolean skipOneOf ) {
180
+ public static void propagateGenericsToModels (String language , String client , Map <String , ModelsMap > modelsMap , boolean skipOneOf ) {
169
181
// We propagate generics in two phases:
170
182
// 1. We mark the direct parent of the generic model to replace it with T
171
183
// 2. We tell each parent with generic properties to pass that generic type all the way down
172
184
173
- Map <String , CodegenModel > models = convertToMap (modelsMap );
185
+ Map <String , CodegenModel > models = convertToMap (language , client , modelsMap );
174
186
175
- for (CodegenModel model : models .values ()) {
176
- markPropagatedGeneric (model , m -> m .getVars (), skipOneOf );
177
- markPropagatedGeneric (model , m -> m .getRequiredVars (), skipOneOf );
178
- }
187
+ // we don't know in which order the model will come, so we iterate multiple times to make sure
188
+ // models at any depth are propagated
189
+ for (int i = 0 ; i < 5 ; i ++) {
190
+ for (CodegenModel model : models .values ()) {
191
+ markPropagatedGeneric (model , m -> m .getVars (), skipOneOf );
192
+ markPropagatedGeneric (model , m -> m .getRequiredVars (), skipOneOf );
193
+ }
179
194
180
- for (CodegenModel model : models .values ()) {
181
- propagateGenericRecursive (models , model , m -> m .getVars ());
182
- propagateGenericRecursive (models , model , m -> m .getRequiredVars ());
183
- }
195
+ for (CodegenModel model : models .values ()) {
196
+ propagateGenericRecursive (models , model , m -> m .getVars ());
197
+ propagateGenericRecursive (models , model , m -> m .getRequiredVars ());
198
+ }
184
199
185
- for (CodegenModel model : models .values ()) {
186
- propagateToComposedSchema (models , model );
200
+ for (CodegenModel model : models .values ()) {
201
+ propagateToComposedSchema (models , model );
202
+ }
187
203
}
188
204
}
189
205
190
206
public static void propagateGenericsToModels (Map <String , ModelsMap > modelsMap ) {
191
207
propagateGenericsToModels (modelsMap , false );
192
208
}
193
209
210
+ public static void propagateGenericsToModels (Map <String , ModelsMap > modelsMap , boolean skipOneOf ) {
211
+ propagateGenericsToModels ("dontcare" , "dontcare" , modelsMap , false );
212
+ }
213
+
214
+ public static void propagateGenericsToModels (String language , String client , Map <String , ModelsMap > modelsMap ) {
215
+ propagateGenericsToModels (language , client , modelsMap , false );
216
+ }
217
+
194
218
/** Mark operations with a generic return type with x-is-generic */
195
219
public static void propagateGenericsToOperations (OperationsMap operations , List <ModelMap > allModels ) {
196
- Map <String , CodegenModel > models = convertToMap (allModels );
220
+ propagateGenericsToOperations ("dontcare" , "dontcare" , operations , allModels );
221
+ }
222
+
223
+ public static void propagateGenericsToOperations (String language , String client , OperationsMap operations , List <ModelMap > allModels ) {
224
+ Map <String , CodegenModel > models = convertToMap (language , client , allModels );
197
225
for (CodegenOperation ope : operations .getOperations ().getOperation ()) {
198
226
if (ope .returnType == null ) {
199
227
continue ;
0 commit comments