diff --git a/docs/generators/swift5.md b/docs/generators/swift5.md index 7c3052b6e4c9..d04ae8e878e0 100644 --- a/docs/generators/swift5.md +++ b/docs/generators/swift5.md @@ -113,45 +113,92 @@ These options may be applied as additional-properties (cli) or configOptions (pl
  • #line
  • #selector
  • #sourceLocation
  • +
  • APIHelper
  • +
  • AlamofireDecodableRequestBuilder
  • +
  • AlamofireRequestBuilder
  • +
  • AlamofireRequestBuilderFactory
  • Any
  • +
  • AnyHashable
  • AnyObject
  • +
  • AnyResponseSerializer
  • Array
  • +
  • ArrayRule
  • +
  • ArrayValidationErrorKind
  • Bool
  • COLUMN
  • +
  • Calendar
  • +
  • CaseIterableDefaultsLast
  • Character
  • Class
  • ClosedRange
  • Codable
  • +
  • CodableHelper
  • +
  • Configuration
  • CountableClosedRange
  • CountableRange
  • Data
  • +
  • DateFormatter
  • Decodable
  • +
  • DecodableRequestBuilderError
  • Dictionary
  • +
  • DispatchQueue
  • Double
  • +
  • DownloadException
  • Encodable
  • Error
  • ErrorResponse
  • FILE
  • FUNCTION
  • +
  • FileManager
  • Float
  • Float32
  • Float64
  • Float80
  • +
  • HTTPMethod
  • +
  • HTTPURLResponse
  • Int
  • Int16
  • Int32
  • Int64
  • Int8
  • +
  • JSONDataEncoding
  • +
  • JSONDecoder
  • +
  • JSONEncodable
  • +
  • JSONEncoder
  • +
  • JSONEncodingHelper
  • +
  • KeyedDecodingContainerProtocol
  • +
  • KeyedEncodingContainerProtocol
  • LINE
  • +
  • Locale
  • +
  • NSCoder
  • +
  • NSDecimalNumber
  • +
  • NSNumber
  • +
  • NSObject
  • +
  • NSRecursiveLock
  • +
  • NSRegularExpression
  • +
  • NSString
  • +
  • NullEncodable
  • +
  • NumericRule
  • +
  • NumericValidationErrorKind
  • +
  • OpenISO8601DateFormatter
  • OptionSet
  • Optional
  • +
  • ParameterEncoding
  • +
  • Progress
  • Protocol
  • Range
  • +
  • RequestBuilder
  • +
  • RequestBuilderFactory
  • +
  • RequestTask
  • Response
  • Self
  • Set
  • StaticString
  • String
  • +
  • StringRule
  • +
  • StringValidationErrorKind
  • +
  • SynchronizedDictionary
  • +
  • TimeZone
  • Type
  • UInt
  • UInt16
  • @@ -159,7 +206,26 @@ These options may be applied as additional-properties (cli) or configOptions (pl
  • UInt64
  • UInt8
  • URL
  • +
  • URLAuthenticationChallenge
  • +
  • URLComponents
  • +
  • URLCredential
  • +
  • URLQueryItem
  • +
  • URLRequest
  • +
  • URLResponse
  • +
  • URLSession
  • +
  • URLSessionConfiguration
  • +
  • URLSessionDataTask
  • +
  • URLSessionDataTaskProtocol
  • +
  • URLSessionDecodableRequestBuilder
  • +
  • URLSessionProtocol
  • +
  • URLSessionRequestBuilder
  • +
  • URLSessionRequestBuilderFactory
  • +
  • URLSessionTask
  • +
  • URLSessionTaskDelegate
  • Unicode
  • +
  • UnknownCaseCheckable
  • +
  • ValidationError
  • +
  • Validator
  • Void
  • _
  • as
  • diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift5ClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift5ClientCodegen.java index 7d2a1d9d5154..f7b9eb82c3e0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift5ClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift5ClientCodegen.java @@ -213,8 +213,22 @@ public Swift5ClientCodegen() { reservedWords = new HashSet<>( Arrays.asList( - // name used by swift client + // Types declared by the generated code itself (support files and + // per-library implementations). A model with one of these names + // would be an invalid redeclaration of the client's own type. "ErrorResponse", "Response", + "APIHelper", "AlamofireDecodableRequestBuilder", "AlamofireRequestBuilder", + "AlamofireRequestBuilderFactory", "AnyResponseSerializer", "ArrayRule", + "ArrayValidationErrorKind", "CaseIterableDefaultsLast", "CodableHelper", + "Configuration", "DecodableRequestBuilderError", "DownloadException", + "HTTPMethod", "JSONDataEncoding", "JSONEncodable", "JSONEncodingHelper", + "NullEncodable", "NumericRule", "NumericValidationErrorKind", + "OpenISO8601DateFormatter", "ParameterEncoding", "RequestBuilder", + "RequestBuilderFactory", "RequestTask", "StringRule", + "StringValidationErrorKind", "SynchronizedDictionary", "UnknownCaseCheckable", + "URLSessionDataTaskProtocol", "URLSessionDecodableRequestBuilder", + "URLSessionProtocol", "URLSessionRequestBuilder", + "URLSessionRequestBuilderFactory", "ValidationError", "Validator", // Swift keywords. This list is taken from here: // https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html#//apple_ref/doc/uid/TP40014097-CH30-ID410 @@ -251,8 +265,20 @@ public Swift5ClientCodegen() { // Collections "Array", "Dictionary", "Set", "OptionSet", "CountableRange", "CountableClosedRange", - // The following are commonly-used Foundation types + // The following are commonly-used Foundation (and stdlib) types that + // the generated support files reference unqualified: a model with one + // of these names would shadow the real type inside the generated + // module and break the client's own code. "URL", "Data", "Codable", "Encodable", "Decodable", + "AnyHashable", "Calendar", "DateFormatter", "DispatchQueue", "FileManager", + "HTTPURLResponse", "JSONDecoder", "JSONEncoder", + "KeyedDecodingContainerProtocol", "KeyedEncodingContainerProtocol", + "Locale", "NSCoder", "NSDecimalNumber", "NSNumber", "NSObject", + "NSRecursiveLock", "NSRegularExpression", "NSString", "Progress", + "TimeZone", "URLAuthenticationChallenge", "URLComponents", "URLCredential", + "URLQueryItem", "URLRequest", "URLResponse", "URLSession", + "URLSessionConfiguration", "URLSessionDataTask", "URLSessionTask", + "URLSessionTaskDelegate", // The following are other words we want to reserve "Void", "AnyObject", "Class", "dynamicType", "COLUMN", "FILE", "FUNCTION", "LINE" diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift5/Swift5ClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift5/Swift5ClientCodegenTest.java index ec64a91269d1..8f965c076159 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift5/Swift5ClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift5/Swift5ClientCodegenTest.java @@ -163,6 +163,31 @@ public void dateWithoutTimeTest() { Assert.assertEquals(op.bodyParam.dataType, "OpenAPIDateWithoutTime"); } + @Test(description = "model names colliding with types declared by the generated client are renamed", enabled = true) + public void reservedTypeNamesDeclaredByClientTest() { + final DefaultCodegen codegen = new Swift5ClientCodegen(); + + // Names declared by the generated support files (Validation.swift, Models.swift, ...): + // a model with such a name would be an invalid redeclaration of the client's own type. + Assert.assertEquals(codegen.toModelName("ValidationError"), "ModelValidationError"); + Assert.assertEquals(codegen.toModelName("Validator"), "ModelValidator"); + Assert.assertEquals(codegen.toModelName("Configuration"), "ModelConfiguration"); + Assert.assertEquals(codegen.toModelName("RequestBuilder"), "ModelRequestBuilder"); + } + + @Test(description = "model names shadowing Foundation types used by the generated client are renamed", enabled = true) + public void reservedFoundationTypeNamesTest() { + final DefaultCodegen codegen = new Swift5ClientCodegen(); + + // Foundation types the generated support files reference unqualified + // (e.g. OpenISO8601DateFormatter.swift assigns `formatter.locale = Locale(...)`): + // a model with such a name would shadow the Foundation type inside the module. + Assert.assertEquals(codegen.toModelName("Locale"), "ModelLocale"); + Assert.assertEquals(codegen.toModelName("DateFormatter"), "ModelDateFormatter"); + Assert.assertEquals(codegen.toModelName("TimeZone"), "ModelTimeZone"); + Assert.assertEquals(codegen.toModelName("URLSession"), "ModelURLSession"); + } + @Test(description = "type from languageSpecificPrimitives should not be prefixed", enabled = true) public void prefixExceptionTest() { final DefaultCodegen codegen = new Swift5ClientCodegen();