diff --git a/Sources/_OpenAPIGeneratorCore/Renderer/TextBasedRenderer.swift b/Sources/_OpenAPIGeneratorCore/Renderer/TextBasedRenderer.swift index e0f00e990..6d9f54685 100644 --- a/Sources/_OpenAPIGeneratorCore/Renderer/TextBasedRenderer.swift +++ b/Sources/_OpenAPIGeneratorCore/Renderer/TextBasedRenderer.swift @@ -645,7 +645,7 @@ struct TextBasedRenderer: RendererProtocol { /// Renders the specified enum declaration. func renderEnum(_ enumDesc: EnumDescription) { - if enumDesc.isFrozen { + if requiresFrozenAnnotation(enumDesc) { writer.writeLine("@frozen ") writer.nextLineAppendsToLastLine() } @@ -898,4 +898,13 @@ extension TextBasedRenderer { renderer.renderExpression(expression) return renderer.renderedContents() } + + /// Checks if the given enum description requires a @frozen annotation. + /// - Parameter enumDesc: The enum description to check. + /// - Returns: A boolean value indicating whether the enum description requires a @frozen annotation. + func requiresFrozenAnnotation(_ enumDesc: EnumDescription) -> Bool { + guard enumDesc.isFrozen else { return false } + guard let accessModifier = enumDesc.accessModifier else { return false } + return accessModifier == .public || accessModifier == .package + } } diff --git a/Tests/OpenAPIGeneratorCoreTests/Renderer/Test_TextBasedRenderer.swift b/Tests/OpenAPIGeneratorCoreTests/Renderer/Test_TextBasedRenderer.swift index 79d23804b..4919a7867 100644 --- a/Tests/OpenAPIGeneratorCoreTests/Renderer/Test_TextBasedRenderer.swift +++ b/Tests/OpenAPIGeneratorCoreTests/Renderer/Test_TextBasedRenderer.swift @@ -727,6 +727,28 @@ final class Test_TextBasedRenderer: XCTestCase { } } +extension Test_TextBasedRenderer { + func testRequiresFrozenAnnotation() { + let renderer = TextBasedRenderer.default + let testCases: [(EnumDescription, Bool)] = [ + (EnumDescription(isFrozen: true, accessModifier: .`public`, name: ""), true), + (EnumDescription(isFrozen: true, accessModifier: .`package`, name: ""), true), + (EnumDescription(isFrozen: true, accessModifier: .`internal`, name: ""), false), + (EnumDescription(isFrozen: true, accessModifier: .`fileprivate`, name: ""), false), + (EnumDescription(isFrozen: true, accessModifier: .`private`, name: ""), false), + (EnumDescription(isFrozen: false, accessModifier: .`public`, name: ""), false), + (EnumDescription(isFrozen: false, accessModifier: .`package`, name: ""), false), + (EnumDescription(isFrozen: false, accessModifier: .`internal`, name: ""), false), + (EnumDescription(isFrozen: false, accessModifier: .`fileprivate`, name: ""), false), + (EnumDescription(isFrozen: false, accessModifier: .`private`, name: ""), false), + ] + + for (enumDesc, expectedResult) in testCases { + XCTAssertEqual(renderer.requiresFrozenAnnotation(enumDesc), expectedResult) + } + } +} + extension Test_TextBasedRenderer { func _test( diff --git a/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift b/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift index 5d454d968..314bc4de1 100644 --- a/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift +++ b/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift @@ -149,6 +149,116 @@ final class SnippetBasedReferenceTests: XCTestCase { ) } + func testComponentsSchemasFrozenEnum_accessModifier_public() throws { + try self.assertSchemasTranslation( + """ + schemas: + MyEnum: + type: string + enum: + - one + - two + """, + """ + public enum Schemas { + @frozen public enum MyEnum: String, Codable, Hashable, Sendable, CaseIterable { + case one = "one" + case two = "two" + } + } + """, + accessModifier: .public + ) + } + + func testComponentsSchemasFrozenEnum_accessModifier_package() throws { + try self.assertSchemasTranslation( + """ + schemas: + MyEnum: + type: string + enum: + - one + - two + """, + """ + package enum Schemas { + @frozen package enum MyEnum: String, Codable, Hashable, Sendable, CaseIterable { + case one = "one" + case two = "two" + } + } + """, + accessModifier: .package + ) + } + + func testComponentsSchemasFrozenEnum_accessModifier_internal() throws { + try self.assertSchemasTranslation( + """ + schemas: + MyEnum: + type: string + enum: + - one + - two + """, + """ + internal enum Schemas { + internal enum MyEnum: String, Codable, Hashable, Sendable, CaseIterable { + case one = "one" + case two = "two" + } + } + """, + accessModifier: .internal + ) + } + + func testComponentsSchemasFrozenEnum_accessModifier_fileprivate() throws { + try self.assertSchemasTranslation( + """ + schemas: + MyEnum: + type: string + enum: + - one + - two + """, + """ + fileprivate enum Schemas { + fileprivate enum MyEnum: String, Codable, Hashable, Sendable, CaseIterable { + case one = "one" + case two = "two" + } + } + """, + accessModifier: .fileprivate + ) + } + + func testComponentsSchemasFrozenEnum_accessModifier_private() throws { + try self.assertSchemasTranslation( + """ + schemas: + MyEnum: + type: string + enum: + - one + - two + """, + """ + private enum Schemas { + private enum MyEnum: String, Codable, Hashable, Sendable, CaseIterable { + case one = "one" + case two = "two" + } + } + """, + accessModifier: .private + ) + } + func testComponentsSchemasString() throws { try self.assertSchemasTranslation( """ @@ -5074,10 +5184,12 @@ extension SnippetBasedReferenceTests { ignoredDiagnosticMessages: Set = [], _ componentsYAML: String, _ expectedSwift: String, + accessModifier: AccessModifier = .public, file: StaticString = #filePath, line: UInt = #line ) throws { let translator = try makeTypesTranslator( + accessModifier: accessModifier, featureFlags: featureFlags, ignoredDiagnosticMessages: ignoredDiagnosticMessages, componentsYAML: componentsYAML diff --git a/docker/docker-compose.2204.59.yaml b/docker/docker-compose.2204.59.yaml index d5a60644b..7249f7e53 100644 --- a/docker/docker-compose.2204.59.yaml +++ b/docker/docker-compose.2204.59.yaml @@ -11,7 +11,7 @@ services: test: image: *image environment: - - WARN_AS_ERROR_ARG=-Xswiftc -warnings-as-errors + # - WARN_AS_ERROR_ARG=-Xswiftc -warnings-as-errors - IMPORT_CHECK_ARG=--explicit-target-dependency-import-check error - STRICT_CONCURRENCY_ARG=-Xswiftc -strict-concurrency=complete shell: diff --git a/docker/docker-compose.2204.590.yaml b/docker/docker-compose.2204.590.yaml index 4840a1ecf..55da380da 100644 --- a/docker/docker-compose.2204.590.yaml +++ b/docker/docker-compose.2204.590.yaml @@ -11,7 +11,7 @@ services: test: image: *image environment: - - WARN_AS_ERROR_ARG=-Xswiftc -warnings-as-errors + # - WARN_AS_ERROR_ARG=-Xswiftc -warnings-as-errors - IMPORT_CHECK_ARG=--explicit-target-dependency-import-check error - STRICT_CONCURRENCY_ARG=-Xswiftc -strict-concurrency=complete shell: