From ec4e44a5f4c35f5eaaf34bcd1019c3983c77846f Mon Sep 17 00:00:00 2001 From: sunn <33183834+etherealjoy@users.noreply.github.com> Date: Sun, 21 Jun 2020 23:17:03 +0200 Subject: [PATCH] [C++]Enable forward declaration for C++ (#6654) * Enable forward declaration for C++ * Change local var name for readability and remove newline char * Rename variables and refactor if statements --- .../codegen/languages/AbstractCppCodegen.java | 46 +++++++++++++++++++ .../cpp-qt5-client/model-header.mustache | 4 +- 2 files changed, 49 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 7b7dca18ea6..f7c62d2b7a6 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.CodegenModel; 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 @@ abstract public class AbstractCppCodegen extends DefaultCodegen implements Codeg return sanitizeName(super.toParamName(name)); } + @SuppressWarnings("rawtypes") @Override public CodegenProperty fromProperty(String name, Schema p) { CodegenProperty property = super.fromProperty(name, p); @@ -353,4 +357,46 @@ abstract public class AbstractCppCodegen extends DefaultCodegen implements Codeg } 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 parentModel, Map objs) { + List forwardDeclarations = new ArrayList(); + if(!parentModel.hasVars) { + return; + } + 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()){ + parentModel.vendorExtensions.put("x-has-forward-declarations", true); + parentModel.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 5bbe8c8c20e..db2ff194606 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}}();