From 4ecde582824aa9fa72c150db4e00b71bbcf489e9 Mon Sep 17 00:00:00 2001 From: Ahsan Fayyaz <29537067+ahsanfz@users.noreply.github.com> Date: Mon, 12 Jul 2021 16:14:11 +0200 Subject: [PATCH 1/6] Add a simplistic way to add back underscore to a var when it appears at beginning --- .../codegen/languages/AbstractJavaCodegen.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index 0814e11b82f2..3bf0501625d0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -795,10 +795,12 @@ public String toVarName(String name) { // camelize (lower first character) the variable name // pet_id => petId + boolean beginsWithUnderScore = name.startsWith("_"); name = camelize(name, true); // for reserved word or word starting with number, append _ - if (isReservedWord(name) || name.matches("^\\d.*")) { + // for _ in start of word, put it back in, as camelize removes it totally. + if (isReservedWord(name) || name.matches("^\\d.*") || beginsWithUnderScore ) { name = escapeReservedWord(name); } @@ -1993,10 +1995,19 @@ public String getterAndSetterCapitalize(String name) { // Refer to section 8.8: Capitalization of inferred names of the JavaBeans API specification // http://download.oracle.com/otn-pub/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/beans.101.pdf) // - if (name.length() > 1 && Character.isLowerCase(name.charAt(0)) && Character.isUpperCase(name.charAt(1))) { + boolean beginsWithUnderScore = name.startsWith("_"); + int indexToCheck = 0; + if (beginsWithUnderScore) { + indexToCheck = 1; + } + if (name.length() > 1 && Character.isLowerCase(name.charAt(indexToCheck)) && Character.isUpperCase(name.charAt(indexToCheck+1))) { lowercaseFirstLetter = true; } - return camelize(name, lowercaseFirstLetter); + name = camelize(name, lowercaseFirstLetter); + if ( beginsWithUnderScore ) { + name = "_" + name; + } + return name; } @Override From 220ce082dc8dbe45ef4b7b8875fce5c3225297fa Mon Sep 17 00:00:00 2001 From: Ahsan Fayyaz <29537067+ahsanfz@users.noreply.github.com> Date: Mon, 12 Jul 2021 16:30:01 +0200 Subject: [PATCH 2/6] Lets not change how we decide to lowercase first letter --- .../codegen/languages/AbstractJavaCodegen.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index 3bf0501625d0..3723e9bec8f4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -1988,6 +1988,7 @@ public String getterAndSetterCapitalize(String name) { if (name == null || name.length() == 0) { return name; } + boolean beginsWithUnderScore = name.startsWith("_"); name = toVarName(name); // // Let the property name capitalized @@ -1995,12 +1996,7 @@ public String getterAndSetterCapitalize(String name) { // Refer to section 8.8: Capitalization of inferred names of the JavaBeans API specification // http://download.oracle.com/otn-pub/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/beans.101.pdf) // - boolean beginsWithUnderScore = name.startsWith("_"); - int indexToCheck = 0; - if (beginsWithUnderScore) { - indexToCheck = 1; - } - if (name.length() > 1 && Character.isLowerCase(name.charAt(indexToCheck)) && Character.isUpperCase(name.charAt(indexToCheck+1))) { + if (name.length() > 1 && Character.isLowerCase(name.charAt(0)) && Character.isUpperCase(name.charAt(1))) { lowercaseFirstLetter = true; } name = camelize(name, lowercaseFirstLetter); From 7b2147617e4906aeb1e1416b46c326491cc4f11e Mon Sep 17 00:00:00 2001 From: Ahsan Fayyaz <29537067+ahsanfz@users.noreply.github.com> Date: Mon, 12 Jul 2021 16:49:35 +0200 Subject: [PATCH 3/6] Fix the corner case with variable name as only "_" --- .../openapitools/codegen/languages/AbstractJavaCodegen.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index 3723e9bec8f4..ddf1b94c542d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -763,6 +763,9 @@ public String toVarName(String name) { // sanitize name name = sanitizeName(name, "\\W-[\\$]"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + // name is not just equal to "_" which translates to "_u" corner case. + boolean beginsWithUnderScore = name.length()!=1 && name.startsWith("_"); + if (name.toLowerCase(Locale.ROOT).matches("^_*class$")) { return "propertyClass"; } @@ -795,7 +798,6 @@ public String toVarName(String name) { // camelize (lower first character) the variable name // pet_id => petId - boolean beginsWithUnderScore = name.startsWith("_"); name = camelize(name, true); // for reserved word or word starting with number, append _ @@ -1988,7 +1990,7 @@ public String getterAndSetterCapitalize(String name) { if (name == null || name.length() == 0) { return name; } - boolean beginsWithUnderScore = name.startsWith("_"); + boolean beginsWithUnderScore = name.length()!=1 && name.startsWith("_"); name = toVarName(name); // // Let the property name capitalized From 802c213680f6c1a3579a36ecdbaf5aa69b6adba2 Mon Sep 17 00:00:00 2001 From: Ahsan Fayyaz <29537067+ahsanfz@users.noreply.github.com> Date: Mon, 12 Jul 2021 17:15:01 +0200 Subject: [PATCH 4/6] Add strange case with class, _class and __class. Need to find out why these are special strings. Cannot find anything in specifications. --- .../codegen/languages/AbstractJavaCodegen.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index ddf1b94c542d..a54ecdbc3e38 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -764,7 +764,7 @@ public String toVarName(String name) { name = sanitizeName(name, "\\W-[\\$]"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // name is not just equal to "_" which translates to "_u" corner case. - boolean beginsWithUnderScore = name.length()!=1 && name.startsWith("_"); + boolean prependUnderscore = prependUnderscore(name); if (name.toLowerCase(Locale.ROOT).matches("^_*class$")) { return "propertyClass"; @@ -802,7 +802,7 @@ public String toVarName(String name) { // for reserved word or word starting with number, append _ // for _ in start of word, put it back in, as camelize removes it totally. - if (isReservedWord(name) || name.matches("^\\d.*") || beginsWithUnderScore ) { + if (isReservedWord(name) || name.matches("^\\d.*") || prependUnderscore ) { name = escapeReservedWord(name); } @@ -1990,7 +1990,7 @@ public String getterAndSetterCapitalize(String name) { if (name == null || name.length() == 0) { return name; } - boolean beginsWithUnderScore = name.length()!=1 && name.startsWith("_"); + boolean prependUnderscore = prependUnderscore(name); name = toVarName(name); // // Let the property name capitalized @@ -2002,12 +2002,18 @@ public String getterAndSetterCapitalize(String name) { lowercaseFirstLetter = true; } name = camelize(name, lowercaseFirstLetter); - if ( beginsWithUnderScore ) { + if ( prependUnderscore ) { name = "_" + name; } return name; } + private boolean prependUnderscore(String name) { + boolean beginsWithUnderScore = name.length()!=1 && name.startsWith("_") + && ( name.equals("class") || name.equals("_class") || name.equals("__class") ); + return beginsWithUnderScore; + } + @Override public void postProcessFile(File file, String fileType) { if (file == null) { From 11d432b211b2a42fbd366fb173a69671c54174ac Mon Sep 17 00:00:00 2001 From: Ahsan Fayyaz <29537067+ahsanfz@users.noreply.github.com> Date: Mon, 12 Jul 2021 17:21:27 +0200 Subject: [PATCH 5/6] It should be not for the class properties in condition. --- .../org/openapitools/codegen/languages/AbstractJavaCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index a54ecdbc3e38..a0e555ceda18 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -2010,7 +2010,7 @@ public String getterAndSetterCapitalize(String name) { private boolean prependUnderscore(String name) { boolean beginsWithUnderScore = name.length()!=1 && name.startsWith("_") - && ( name.equals("class") || name.equals("_class") || name.equals("__class") ); + && !( name.equals("class") || name.equals("_class") || name.equals("__class") ); return beginsWithUnderScore; } From 28d53a311d1e5f8b48a309708613eb2c40989e9e Mon Sep 17 00:00:00 2001 From: Ahsan Fayyaz <29537067+ahsanfz@users.noreply.github.com> Date: Mon, 12 Jul 2021 17:39:17 +0200 Subject: [PATCH 6/6] Inline condition and fix propertyClass check. --- .../codegen/languages/AbstractJavaCodegen.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index a0e555ceda18..6e5e5f6dd390 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -763,8 +763,9 @@ public String toVarName(String name) { // sanitize name name = sanitizeName(name, "\\W-[\\$]"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + // We need to rePrepend the "_" if it appears as first character of a series of characters in a name. // name is not just equal to "_" which translates to "_u" corner case. - boolean prependUnderscore = prependUnderscore(name); + boolean prependUnderscore = name.length()!=1 && name.startsWith("_"); if (name.toLowerCase(Locale.ROOT).matches("^_*class$")) { return "propertyClass"; @@ -1990,7 +1991,7 @@ public String getterAndSetterCapitalize(String name) { if (name == null || name.length() == 0) { return name; } - boolean prependUnderscore = prependUnderscore(name); + boolean prependUnderscore = name.length()!=1 && name.startsWith("_"); name = toVarName(name); // // Let the property name capitalized @@ -2002,18 +2003,13 @@ public String getterAndSetterCapitalize(String name) { lowercaseFirstLetter = true; } name = camelize(name, lowercaseFirstLetter); - if ( prependUnderscore ) { + // Note capitalizing "P" initial letter since camelize capitalizes it + if ( prependUnderscore && !name.equals("PropertyClass")) { name = "_" + name; } return name; } - private boolean prependUnderscore(String name) { - boolean beginsWithUnderScore = name.length()!=1 && name.startsWith("_") - && !( name.equals("class") || name.equals("_class") || name.equals("__class") ); - return beginsWithUnderScore; - } - @Override public void postProcessFile(File file, String fileType) { if (file == null) {