diff --git a/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift b/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift index 884b7aa7..f606b3cf 100644 --- a/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift +++ b/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift @@ -156,7 +156,7 @@ extension FileTranslator { .try( .identifierPattern("container").dot("encode\(property.typeUsage.isOptional ? "IfPresent" : "")") .call([ - .init(label: nil, expression: .identifierPattern(property.swiftSafeName)), + .init(label: nil, expression: .identifierPattern("self").dot(property.swiftSafeName)), .init(label: "forKey", expression: .dot(property.swiftSafeName)), ]) ) diff --git a/Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml b/Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml index ac8a417d..1d9a5ed5 100644 --- a/Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml +++ b/Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml @@ -406,6 +406,14 @@ components: type: [array, null] items: type: [string, null] + # To catch the clashes of members and the decoding container. + TypedAdditionalPropertiesWithPropertyNamedContainer: + type: object + properties: + container: + type: string + additionalProperties: + type: integer CodeError: type: object properties: diff --git a/Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Types.swift b/Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Types.swift index 71de33ec..b0221ce4 100644 --- a/Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Types.swift +++ b/Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Types.swift @@ -637,7 +637,7 @@ public enum Components { public func encode(to encoder: any Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent( - foo, + self.foo, forKey: .foo ) try encoder.encodeAdditionalProperties(additionalProperties) @@ -677,7 +677,7 @@ public enum Components { public func encode(to encoder: any Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent( - foo, + self.foo, forKey: .foo ) try encoder.encodeAdditionalProperties(additionalProperties) @@ -698,6 +698,46 @@ public enum Components { case foo } } + /// - Remark: Generated from `#/components/schemas/TypedAdditionalPropertiesWithPropertyNamedContainer`. + public struct TypedAdditionalPropertiesWithPropertyNamedContainer: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/TypedAdditionalPropertiesWithPropertyNamedContainer/container`. + public var container: Swift.String? + /// A container of undocumented properties. + public var additionalProperties: [String: Swift.Int] + /// Creates a new `TypedAdditionalPropertiesWithPropertyNamedContainer`. + /// + /// - Parameters: + /// - container: + /// - additionalProperties: A container of undocumented properties. + public init( + container: Swift.String? = nil, + additionalProperties: [String: Swift.Int] = .init() + ) { + self.container = container + self.additionalProperties = additionalProperties + } + public enum CodingKeys: String, CodingKey { + case container + } + public init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.container = try container.decodeIfPresent( + Swift.String.self, + forKey: .container + ) + additionalProperties = try decoder.decodeAdditionalProperties(knownKeys: [ + "container" + ]) + } + public func encode(to encoder: any Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent( + self.container, + forKey: .container + ) + try encoder.encodeAdditionalProperties(additionalProperties) + } + } /// - Remark: Generated from `#/components/schemas/CodeError`. public struct CodeError: Codable, Hashable, Sendable { /// - Remark: Generated from `#/components/schemas/CodeError/code`. diff --git a/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift b/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift index a00b3cbc..f9cc2888 100644 --- a/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift +++ b/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift @@ -547,20 +547,42 @@ final class SnippetBasedReferenceTests: XCTestCase { schemas: MyObject: type: object - properties: {} + properties: + id: + type: string additionalProperties: true """, """ public enum Schemas { public struct MyObject: Codable, Hashable, Sendable { + public var id: Swift.String? public var additionalProperties: OpenAPIRuntime.OpenAPIObjectContainer - public init(additionalProperties: OpenAPIRuntime.OpenAPIObjectContainer = .init()) { + public init( + id: Swift.String? = nil, + additionalProperties: OpenAPIRuntime.OpenAPIObjectContainer = .init() + ) { + self.id = id self.additionalProperties = additionalProperties } + public enum CodingKeys: String, CodingKey { + case id + } public init(from decoder: any Decoder) throws { - additionalProperties = try decoder.decodeAdditionalProperties(knownKeys: []) + let container = try decoder.container(keyedBy: CodingKeys.self) + self.id = try container.decodeIfPresent( + Swift.String.self, + forKey: .id + ) + additionalProperties = try decoder.decodeAdditionalProperties(knownKeys: [ + "id" + ]) } public func encode(to encoder: any Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent( + self.id, + forKey: .id + ) try encoder.encodeAdditionalProperties(additionalProperties) } }