From 231ec6bcaca1de19f95e613aec518b28c0fc972b Mon Sep 17 00:00:00 2001 From: Alexander Weaver Date: Mon, 24 Feb 2020 07:24:43 -0600 Subject: [PATCH] [BUG][C++] Avoid using plain underscore when escaping reserved words (#5269) * Don't use plain underscore when escaping reserved words * Regenerate petstore output * Add CLI option for reserved word prefix * Ensure CLI option isn't cleared in cpprest client codegen * Regenerate docs --- docs/generators/cpp-qt5-client.md | 1 + docs/generators/cpp-qt5-qhttpengine-server.md | 1 + docs/generators/cpp-restsdk.md | 1 + docs/generators/cpp-tizen.md | 1 + .../codegen/languages/AbstractCppCodegen.java | 16 +++++++++++++++- .../languages/CppRestSdkClientCodegen.java | 8 ++++++++ 6 files changed, 27 insertions(+), 1 deletion(-) diff --git a/docs/generators/cpp-qt5-client.md b/docs/generators/cpp-qt5-client.md index 112399d9178..720a54d4e51 100644 --- a/docs/generators/cpp-qt5-client.md +++ b/docs/generators/cpp-qt5-client.md @@ -12,6 +12,7 @@ sidebar_label: cpp-qt5-client |modelNamePrefix|Prefix that will be prepended to all model names.| |OAI| |optionalProjectFile|Generate client.pri.| |true| |prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false| +|reservedWordPrefix|Prefix to prepend to reserved words in order to avoid conflicts| |r_| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| diff --git a/docs/generators/cpp-qt5-qhttpengine-server.md b/docs/generators/cpp-qt5-qhttpengine-server.md index 72064ba6a8b..a8d7413b22f 100644 --- a/docs/generators/cpp-qt5-qhttpengine-server.md +++ b/docs/generators/cpp-qt5-qhttpengine-server.md @@ -11,6 +11,7 @@ sidebar_label: cpp-qt5-qhttpengine-server |ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true| |modelNamePrefix|Prefix that will be prepended to all model names.| |OAI| |prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false| +|reservedWordPrefix|Prefix to prepend to reserved words in order to avoid conflicts| |r_| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| diff --git a/docs/generators/cpp-restsdk.md b/docs/generators/cpp-restsdk.md index bb4ac465534..4166d17e260 100644 --- a/docs/generators/cpp-restsdk.md +++ b/docs/generators/cpp-restsdk.md @@ -11,6 +11,7 @@ sidebar_label: cpp-restsdk |generateGMocksForApis|Generate Google Mock classes for APIs.| |null| |modelPackage|C++ namespace for models (convention: name.space.model).| |org.openapitools.client.model| |packageVersion|C++ package version.| |1.0.0| +|reservedWordPrefix|Prefix to prepend to reserved words in order to avoid conflicts| |r_| ## IMPORT MAPPING diff --git a/docs/generators/cpp-tizen.md b/docs/generators/cpp-tizen.md index 47ef8f80687..26ba9863745 100644 --- a/docs/generators/cpp-tizen.md +++ b/docs/generators/cpp-tizen.md @@ -8,6 +8,7 @@ sidebar_label: cpp-tizen |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true| |prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false| +|reservedWordPrefix|Prefix to prepend to reserved words in order to avoid conflicts| |r_| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| 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 454b9de0512..de170293667 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 @@ -39,6 +39,10 @@ import java.util.Map; abstract public class AbstractCppCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractCppCodegen.class); + protected static final String RESERVED_WORD_PREFIX_OPTION = "reservedWordPrefix"; + protected static final String RESERVED_WORD_PREFIX_DESC = "Prefix to prepend to reserved words in order to avoid conflicts"; + protected String reservedWordPrefix = "r_"; + public AbstractCppCodegen() { super(); @@ -135,6 +139,10 @@ abstract public class AbstractCppCodegen extends DefaultCodegen implements Codeg "xor", "xor_eq") ); + + addOption(RESERVED_WORD_PREFIX_OPTION, + RESERVED_WORD_PREFIX_DESC, + this.reservedWordPrefix); } @Override @@ -200,7 +208,7 @@ abstract public class AbstractCppCodegen extends DefaultCodegen implements Codeg if (this.reservedWordsMappings().containsKey(name)) { return this.reservedWordsMappings().get(name); } - return sanitizeName("_" + name); + return sanitizeName(reservedWordPrefix + name); } @Override @@ -259,6 +267,12 @@ abstract public class AbstractCppCodegen extends DefaultCodegen implements Codeg LOGGER.info("Environment variable CPP_POST_PROCESS_FILE not defined so the C++ code may not be properly formatted. To define it, try 'export CPP_POST_PROCESS_FILE=\"/usr/local/bin/clang-format -i\"' (Linux/Mac)"); LOGGER.info("NOTE: To enable file post-processing, 'enablePostProcessFile' must be set to `true` (--enable-post-process-file for CLI)."); } + + if (additionalProperties.containsKey(RESERVED_WORD_PREFIX_OPTION)) { + reservedWordPrefix = (String) additionalProperties.get(RESERVED_WORD_PREFIX_OPTION); + } + + additionalProperties.put(RESERVED_WORD_PREFIX_OPTION, reservedWordPrefix); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java index 3f16079147e..5475472046c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java @@ -129,6 +129,9 @@ public class CppRestSdkClientCodegen extends AbstractCppCodegen { addOption(GENERATE_GMOCKS_FOR_APIS, "Generate Google Mock classes for APIs.", null); + addOption(RESERVED_WORD_PREFIX_OPTION, + RESERVED_WORD_PREFIX_DESC, + this.reservedWordPrefix); supportingFiles.add(new SupportingFile("modelbase-header.mustache", "", "ModelBase.h")); supportingFiles.add(new SupportingFile("modelbase-source.mustache", "", "ModelBase.cpp")); @@ -194,6 +197,10 @@ public class CppRestSdkClientCodegen extends AbstractCppCodegen { defaultInclude = additionalProperties.get(DEFAULT_INCLUDE).toString(); } + if (additionalProperties.containsKey(RESERVED_WORD_PREFIX_OPTION)) { + reservedWordPrefix = (String) additionalProperties.get(RESERVED_WORD_PREFIX_OPTION); + } + if (convertPropertyToBoolean(GENERATE_GMOCKS_FOR_APIS)) { apiTemplateFiles.put("api-gmock.mustache", "GMock.h"); additionalProperties.put("gmockApis", "true"); @@ -207,6 +214,7 @@ public class CppRestSdkClientCodegen extends AbstractCppCodegen { additionalProperties.put("apiHeaderGuardPrefix", apiPackage.replaceAll("\\.", "_").toUpperCase(Locale.ROOT)); additionalProperties.put("declspec", declspec); additionalProperties.put("defaultInclude", defaultInclude); + additionalProperties.put(RESERVED_WORD_PREFIX_OPTION, reservedWordPrefix); } /**