forked from loafle/openapi-generator-original
[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
This commit is contained in:
parent
11f0b3d39f
commit
ec4e44a5f4
@ -28,15 +28,18 @@ import org.openapitools.codegen.CodegenModel;
|
|||||||
import org.openapitools.codegen.CodegenProperty;
|
import org.openapitools.codegen.CodegenProperty;
|
||||||
import org.openapitools.codegen.DefaultCodegen;
|
import org.openapitools.codegen.DefaultCodegen;
|
||||||
import org.openapitools.codegen.templating.mustache.IndentedLambda;
|
import org.openapitools.codegen.templating.mustache.IndentedLambda;
|
||||||
|
import org.openapitools.codegen.utils.ModelUtils;
|
||||||
import org.openapitools.codegen.utils.URLPathUtils;
|
import org.openapitools.codegen.utils.URLPathUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
abstract public class AbstractCppCodegen extends DefaultCodegen implements CodegenConfig {
|
abstract public class AbstractCppCodegen extends DefaultCodegen implements CodegenConfig {
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractCppCodegen.class);
|
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));
|
return sanitizeName(super.toParamName(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public CodegenProperty fromProperty(String name, Schema p) {
|
public CodegenProperty fromProperty(String name, Schema p) {
|
||||||
CodegenProperty property = super.fromProperty(name, p);
|
CodegenProperty property = super.fromProperty(name, p);
|
||||||
@ -353,4 +357,46 @@ abstract public class AbstractCppCodegen extends DefaultCodegen implements Codeg
|
|||||||
}
|
}
|
||||||
return postProcessModelsEnum(objs);
|
return postProcessModelsEnum(objs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> postProcessAllModels(Map<String, Object> objs){
|
||||||
|
Map<String, Object> models = super.postProcessAllModels(objs);
|
||||||
|
for (final Entry<String, Object> model : models.entrySet()) {
|
||||||
|
CodegenModel mo = ModelUtils.getModelByName(model.getKey(), models);
|
||||||
|
addForwardDeclarations(mo, models);
|
||||||
|
}
|
||||||
|
return models;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addForwardDeclarations(CodegenModel parentModel, Map<String, Object> objs) {
|
||||||
|
List<String> forwardDeclarations = new ArrayList<String>();
|
||||||
|
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<String, Object> 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,9 @@
|
|||||||
{{#cppNamespaceDeclarations}}
|
{{#cppNamespaceDeclarations}}
|
||||||
namespace {{this}} {
|
namespace {{this}} {
|
||||||
{{/cppNamespaceDeclarations}}
|
{{/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}} {
|
class {{classname}} : public {{prefix}}{{^isEnum}}Object{{/isEnum}}{{#isEnum}}Enum{{/isEnum}} {
|
||||||
public:
|
public:
|
||||||
{{classname}}();
|
{{classname}}();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user