From e4e29c0974603df4a8ba52d26495d99a807b9ea5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A9ter=20Radics?= <mitchnull@gmail.com>
Date: Fri, 10 Jan 2020 10:27:16 +0100
Subject: [PATCH 1/2] [issue-4961] add parentContainer property to CodegenModel

---
 .../main/java/org/openapitools/codegen/CodegenModel.java    | 1 +
 .../main/java/org/openapitools/codegen/DefaultCodegen.java  | 6 +++---
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java
index f8eb675d477..1fb0ec76163 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java
@@ -61,6 +61,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
 
     public Set<String> imports = new TreeSet<String>();
     public boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum, isNullable, hasRequired, hasOptional, isArrayModel, hasChildren, isMapModel;
+    public CodegenProperty parentContainer;
     public boolean hasOnlyReadOnly = true; // true if all properties are read-only
     public ExternalDocumentation externalDocumentation;
 
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
index df595d68f08..adb0682ac36 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
@@ -3776,10 +3776,10 @@ public class DefaultCodegen implements CodegenConfig {
     }
 
     protected void addParentContainer(CodegenModel model, String name, Schema schema) {
-        final CodegenProperty property = fromProperty(name, schema);
-        addImport(model, property.complexType);
+        model.parentContainer = fromProperty(name, schema);
+        addImport(model, model.parentContainer.complexType);
         model.parent = toInstantiationType(schema);
-        final String containerType = property.containerType;
+        final String containerType = model.parentContainer.containerType;
         final String instantiationType = instantiationTypes.get(containerType);
         if (instantiationType != null) {
             addImport(model, instantiationType);
-- 
GitLab


From 6b7f2390d9e5b53844db19336a97e1f327ceb281 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A9ter=20Radics?= <mitchnull@gmail.com>
Date: Fri, 10 Jan 2020 10:37:57 +0100
Subject: [PATCH 2/2] [issue-4961] add "itemsDepth" property for nested
 properties

This allows variable-name generation for nested structures without
shadowing violations, like v${{itemsDepth}}.
---
 .../org/openapitools/codegen/CodegenProperty.java     |  1 +
 .../java/org/openapitools/codegen/DefaultCodegen.java | 11 +++++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java
index e9877eefafa..a93a8c19739 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java
@@ -86,6 +86,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
     public List<String> _enum;
     public Map<String, Object> allowableValues;
     public CodegenProperty items;
+    public Integer itemsDepth;
     public CodegenProperty mostInnerItems;
     public Map<String, Object> vendorExtensions = new HashMap<String, Object>();
     public boolean hasValidation; // true if pattern, maximum, etc are set (only used in the mustache template)
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
index adb0682ac36..83c0da6343e 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
@@ -2162,6 +2162,10 @@ public class DefaultCodegen implements CodegenConfig {
      * @return Codegen Property object
      */
     public CodegenProperty fromProperty(String name, Schema p) {
+        return fromProperty(name, p, null);
+    }
+
+    private CodegenProperty fromProperty(String name, Schema p, Integer itemsDepth) {
         if (p == null) {
             LOGGER.error("Undefined property/schema for `{}`. Default to type:string.", name);
             return null;
@@ -2175,6 +2179,7 @@ public class DefaultCodegen implements CodegenConfig {
 
         ModelUtils.syncValidationProperties(p, property);
 
+        property.itemsDepth = itemsDepth;
         property.name = toVarName(name);
         property.baseName = name;
         if (p.getType() == null) {
@@ -2401,7 +2406,8 @@ public class DefaultCodegen implements CodegenConfig {
             if (arraySchema.getItems() == null) {
                 arraySchema.setItems(innerSchema);
             }
-            CodegenProperty cp = fromProperty(itemName, innerSchema);
+            CodegenProperty cp = fromProperty(itemName, innerSchema,
+                    itemsDepth == null ? 1 : itemsDepth.intValue() + 1);
             updatePropertyForArray(property, cp);
         } else if (ModelUtils.isMapSchema(p)) {
             property.isContainer = true;
@@ -2418,7 +2424,8 @@ public class DefaultCodegen implements CodegenConfig {
                 innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type");
                 p.setAdditionalProperties(innerSchema);
             }
-            CodegenProperty cp = fromProperty("inner", innerSchema);
+            CodegenProperty cp = fromProperty("inner", innerSchema,
+                    itemsDepth == null ? 1 : itemsDepth.intValue() + 1);
             updatePropertyForMap(property, cp);
         } else if (ModelUtils.isFreeFormObject(p)) {
             property.isFreeFormObject = true;
-- 
GitLab