diff --git a/Sources/VexilMacros/FlagContainerMacro.swift b/Sources/VexilMacros/FlagContainerMacro.swift index 17c7342f..05404884 100644 --- a/Sources/VexilMacros/FlagContainerMacro.swift +++ b/Sources/VexilMacros/FlagContainerMacro.swift @@ -179,6 +179,17 @@ extension FlagContainerMacro: ExtensionMacro { ] } + if shouldGenerateConformance.sendable { + decls += [ + ExtensionDeclSyntax( + extendedType: type, + inheritanceClause: .init(inheritedTypes: [ .init(type: TypeSyntax(stringLiteral: "Sendable")) ]) + ) { + // Member block intentionally left blank + }, + ] + } + return decls } @@ -214,17 +225,14 @@ private extension TypeSyntax { private extension [TypeSyntax] { - var shouldGenerateConformance: (flagContainer: Bool, equatable: Bool) { - reduce(into: (false, false)) { result, type in + var shouldGenerateConformance: (flagContainer: Bool, equatable: Bool, sendable: Bool) { + reduce(into: (false, false, false)) { result, type in if type.identifier == "FlagContainer" { - result = (true, result.1) + result = (true, result.1, result.2) } else if type.identifier == "Equatable" { - result = (result.0, true) - - // For some reason Swift 5.9 concatenates these into a single `IdentifierTypeSyntax` - // instead of providing them as array items - } else if type.identifier == "FlagContainerEquatable" { - result = (true, true) + result = (result.0, true, result.2) + } else if type.identifier == "Sendable" { + result = (result.0, result.1, true) } } } @@ -233,11 +241,11 @@ private extension [TypeSyntax] { private extension AttributeSyntax { - var shouldGenerateConformance: (flagContainer: Bool, equatable: Bool) { + var shouldGenerateConformance: (flagContainer: Bool, equatable: Bool, sendable: Bool) { if attributeName.identifier == "FlagContainer" { - (true, true) + (true, true, true) } else { - (false, false) + (false, false, false) } } diff --git a/Tests/VexilMacroTests/EquatableFlagContainerMacroTests.swift b/Tests/VexilMacroTests/EquatableFlagContainerMacroTests.swift index 0d372f1c..f1d83b0c 100644 --- a/Tests/VexilMacroTests/EquatableFlagContainerMacroTests.swift +++ b/Tests/VexilMacroTests/EquatableFlagContainerMacroTests.swift @@ -56,6 +56,9 @@ final class EquatableFlagContainerMacroTests: XCTestCase { true } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, @@ -156,6 +159,9 @@ final class EquatableFlagContainerMacroTests: XCTestCase { lhs.otherStoredProperty == rhs.otherStoredProperty } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, @@ -231,6 +237,9 @@ final class EquatableFlagContainerMacroTests: XCTestCase { lhs.someFlag == rhs.someFlag } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, @@ -309,6 +318,9 @@ final class EquatableFlagContainerMacroTests: XCTestCase { lhs.someFlag == rhs.someFlag } } + + extension SomeContainer.TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, @@ -383,6 +395,9 @@ final class EquatableFlagContainerMacroTests: XCTestCase { lhs.someFlag == rhs.someFlag } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, @@ -478,6 +493,9 @@ final class EquatableFlagContainerMacroTests: XCTestCase { lhs.second == rhs.second } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, @@ -572,6 +590,9 @@ final class EquatableFlagContainerMacroTests: XCTestCase { lhs.second == rhs.second } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, diff --git a/Tests/VexilMacroTests/FlagContainerMacroTests.swift b/Tests/VexilMacroTests/FlagContainerMacroTests.swift index 7a4d0f94..9b5b6b44 100644 --- a/Tests/VexilMacroTests/FlagContainerMacroTests.swift +++ b/Tests/VexilMacroTests/FlagContainerMacroTests.swift @@ -56,6 +56,9 @@ final class FlagContainerMacroTests: XCTestCase { true } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, @@ -99,6 +102,9 @@ final class FlagContainerMacroTests: XCTestCase { true } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, @@ -142,6 +148,9 @@ final class FlagContainerMacroTests: XCTestCase { true } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self, @@ -238,6 +247,9 @@ final class FlagContainerMacroTests: XCTestCase { lhs.second == rhs.second } } + + extension TestFlags: Sendable { + } """, macros: [ "FlagContainer": FlagContainerMacro.self,