[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:
sunn 2020-06-21 23:17:03 +02:00 committed by GitHub
parent 11f0b3d39f
commit ec4e44a5f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 1 deletions

View File

@ -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<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;
}
}

View File

@ -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}}();