From 825c53ece38328df0d60198b559ce3b25847c032 Mon Sep 17 00:00:00 2001 From: etherealjoy Date: Sun, 14 Jun 2020 17:27:53 +0200 Subject: [PATCH 1/3] Enable forward declaration for C++ --- .../codegen/languages/AbstractCppCodegen.java | 47 +++++++++++++++++++ .../cpp-qt5-client/model-header.mustache | 4 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java index 7b7dca18ea6d..679d3dc51fcf 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java @@ -28,15 +28,18 @@ import org.openapitools.codegen.CodegenProperty; import org.openapitools.codegen.DefaultCodegen; import org.openapitools.codegen.templating.mustache.IndentedLambda; +import org.openapitools.codegen.utils.ModelUtils; import org.openapitools.codegen.utils.URLPathUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.net.URL; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Map.Entry; abstract public class AbstractCppCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractCppCodegen.class); @@ -237,6 +240,7 @@ public String toParamName(String name) { return sanitizeName(super.toParamName(name)); } + @SuppressWarnings("rawtypes") @Override public CodegenProperty fromProperty(String name, Schema p) { CodegenProperty property = super.fromProperty(name, p); @@ -353,4 +357,47 @@ public Map postProcessModels(Map objs) { } return postProcessModelsEnum(objs); } + + @Override + public Map postProcessAllModels(Map objs){ + Map models = super.postProcessAllModels(objs); + for (final Entry model : models.entrySet()) { + CodegenModel mo = ModelUtils.getModelByName(model.getKey(), models); + addForwardDeclarations(mo, models); + } + return models; + } + + private void addForwardDeclarations(CodegenModel model, Map objs) { + List forwardDeclarations = new ArrayList(); + if(!model.hasVars) { + return; + } + for(CodegenProperty property : model.vars){ + if((property.isContainer && property.mostInnerItems.isModel) || (property.isModel)) { + String innerPropertyName = property.isContainer?property.mostInnerItems.baseType:property.baseType; + for(final Entry mo : objs.entrySet()) { + CodegenModel innerModel = ModelUtils.getModelByName(mo.getKey(), objs); + if(innerPropertyName.equals(innerModel.classname) && !innerPropertyName.equals(model.classname)){ + if(innerModel.hasVars) { + for(CodegenProperty p : innerModel.vars) { + if(((p.isModel && p.dataType.equals(model.classname)) || (p.isContainer && p.mostInnerItems.baseType.equals(model.classname)))) { + String forwardDecl = "class " + innerModel.classname + ";\n"; + if(!forwardDeclarations.contains(forwardDecl)) { + forwardDeclarations.add(forwardDecl); + } + } + } + } + } + } + } + } + if(!forwardDeclarations.isEmpty()) + { + model.vendorExtensions.put("x-has-forward-declarations", true); + model.vendorExtensions.put("x-forward-declarations", forwardDeclarations); + } + return; + } } diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-client/model-header.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-client/model-header.mustache index 5bbe8c8c20e1..b18be15cbf03 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-client/model-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-client/model-header.mustache @@ -21,7 +21,9 @@ {{#cppNamespaceDeclarations}} namespace {{this}} { {{/cppNamespaceDeclarations}} - +{{#vendorExtensions.x-has-forward-declarations}} +{{#vendorExtensions.x-forward-declarations}}{{.}}{{/vendorExtensions.x-forward-declarations}} +{{/vendorExtensions.x-has-forward-declarations}} class {{classname}} : public {{prefix}}{{^isEnum}}Object{{/isEnum}}{{#isEnum}}Enum{{/isEnum}} { public: {{classname}}(); From bfbc6f4b56a814d48ba532ab85372021f9bef035 Mon Sep 17 00:00:00 2001 From: etherealjoy Date: Mon, 15 Jun 2020 00:51:31 +0200 Subject: [PATCH 2/3] Change local var name for readability and remove newline char --- .../openapitools/codegen/languages/AbstractCppCodegen.java | 6 +++--- .../src/main/resources/cpp-qt5-client/model-header.mustache | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java index 679d3dc51fcf..1f0aee3238ef 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java @@ -375,14 +375,14 @@ private void addForwardDeclarations(CodegenModel model, Map objs } for(CodegenProperty property : model.vars){ if((property.isContainer && property.mostInnerItems.isModel) || (property.isModel)) { - String innerPropertyName = property.isContainer?property.mostInnerItems.baseType:property.baseType; + String innerPropertyType = property.isContainer? property.mostInnerItems.baseType : property.baseType; for(final Entry mo : objs.entrySet()) { CodegenModel innerModel = ModelUtils.getModelByName(mo.getKey(), objs); - if(innerPropertyName.equals(innerModel.classname) && !innerPropertyName.equals(model.classname)){ + if(innerPropertyType.equals(innerModel.classname) && !innerPropertyType.equals(model.classname)){ if(innerModel.hasVars) { for(CodegenProperty p : innerModel.vars) { if(((p.isModel && p.dataType.equals(model.classname)) || (p.isContainer && p.mostInnerItems.baseType.equals(model.classname)))) { - String forwardDecl = "class " + innerModel.classname + ";\n"; + String forwardDecl = "class " + innerModel.classname + ";"; if(!forwardDeclarations.contains(forwardDecl)) { forwardDeclarations.add(forwardDecl); } diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-client/model-header.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-client/model-header.mustache index b18be15cbf03..db2ff1946065 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-client/model-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-client/model-header.mustache @@ -22,8 +22,8 @@ namespace {{this}} { {{/cppNamespaceDeclarations}} {{#vendorExtensions.x-has-forward-declarations}} -{{#vendorExtensions.x-forward-declarations}}{{.}}{{/vendorExtensions.x-forward-declarations}} -{{/vendorExtensions.x-has-forward-declarations}} +{{#vendorExtensions.x-forward-declarations}}{{.}} +{{/vendorExtensions.x-forward-declarations}}{{/vendorExtensions.x-has-forward-declarations}} class {{classname}} : public {{prefix}}{{^isEnum}}Object{{/isEnum}}{{#isEnum}}Enum{{/isEnum}} { public: {{classname}}(); From 823275616ab6aef51e5d26a122823ba811c5d1a2 Mon Sep 17 00:00:00 2001 From: etherealjoy Date: Mon, 15 Jun 2020 11:32:27 +0200 Subject: [PATCH 3/3] Rename variables and refactor if statements --- .../codegen/languages/AbstractCppCodegen.java | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java index 1f0aee3238ef..f7c62d2b7a67 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java @@ -368,35 +368,34 @@ public Map postProcessAllModels(Map objs){ return models; } - private void addForwardDeclarations(CodegenModel model, Map objs) { + private void addForwardDeclarations(CodegenModel parentModel, Map objs) { List forwardDeclarations = new ArrayList(); - if(!model.hasVars) { + if(!parentModel.hasVars) { return; } - for(CodegenProperty property : model.vars){ - if((property.isContainer && property.mostInnerItems.isModel) || (property.isModel)) { - String innerPropertyType = property.isContainer? property.mostInnerItems.baseType : property.baseType; - for(final Entry mo : objs.entrySet()) { - CodegenModel innerModel = ModelUtils.getModelByName(mo.getKey(), objs); - if(innerPropertyType.equals(innerModel.classname) && !innerPropertyType.equals(model.classname)){ - if(innerModel.hasVars) { - for(CodegenProperty p : innerModel.vars) { - if(((p.isModel && p.dataType.equals(model.classname)) || (p.isContainer && p.mostInnerItems.baseType.equals(model.classname)))) { - String forwardDecl = "class " + innerModel.classname + ";"; - if(!forwardDeclarations.contains(forwardDecl)) { - forwardDeclarations.add(forwardDecl); - } - } - } + for(CodegenProperty property : parentModel.vars){ + if(!( (property.isContainer && property.mostInnerItems.isModel) || (property.isModel) ) ){ + continue; + } + String childPropertyType = property.isContainer? property.mostInnerItems.baseType : property.baseType; + for(final Entry mo : objs.entrySet()) { + CodegenModel childModel = ModelUtils.getModelByName(mo.getKey(), objs); + if( !childPropertyType.equals(childModel.classname) || childPropertyType.equals(parentModel.classname) || !childModel.hasVars ){ + continue; + } + for(CodegenProperty p : childModel.vars) { + if(((p.isModel && p.dataType.equals(parentModel.classname)) || (p.isContainer && p.mostInnerItems.baseType.equals(parentModel.classname)))) { + String forwardDecl = "class " + childModel.classname + ";"; + if(!forwardDeclarations.contains(forwardDecl)) { + forwardDeclarations.add(forwardDecl); } } } } } - if(!forwardDeclarations.isEmpty()) - { - model.vendorExtensions.put("x-has-forward-declarations", true); - model.vendorExtensions.put("x-forward-declarations", forwardDeclarations); + if(!forwardDeclarations.isEmpty()){ + parentModel.vendorExtensions.put("x-has-forward-declarations", true); + parentModel.vendorExtensions.put("x-forward-declarations", forwardDeclarations); } return; }