@@ -39,18 +39,54 @@ public struct OptionsMacro: ExtensionMacro, PeerMacro {
3939 throw InvalidDeclError . kind ( declaration. kind)
4040 }
4141
42- let extensionDecl = try ExtensionDeclSyntax (
43- enumDecl: enumDecl, conformingTo: protocols
42+ // Build `typealias <EnumName>Set = EnumSet<EnumName>`
43+ let typeName = enumDecl. name
44+ let aliasName = " \( typeName. trimmed) Set "
45+ let aliasDecl = TypeAlias ( aliasName, equals: " EnumSet< \( typeName) > " ) . syntax
46+
47+ let memberItem = MemberBlockItemSyntax (
48+ decl: DeclSyntax ( aliasDecl. as ( TypeAliasDeclSyntax . self) ! ) ,
49+ trailingTrivia: . newline
4450 )
45- return [ extensionDecl]
51+
52+ // Build member block
53+ let memberBlock = MemberBlockSyntax (
54+ leftBrace: . leftBraceToken( leadingTrivia: . space, trailingTrivia: . newline) ,
55+ members: MemberBlockItemListSyntax ( [ memberItem] ) ,
56+ rightBrace: . rightBraceToken( leadingTrivia: . newline)
57+ )
58+
59+ // Build inheritance clause from `protocols` argument
60+ let inheritanceClause : InheritanceClauseSyntax ? = protocols. isEmpty ? nil : InheritanceClauseSyntax (
61+ colon: . colonToken( ) ,
62+ inheritedTypes: InheritedTypeListSyntax (
63+ protocols. enumerated ( ) . map { idx, proto in
64+ var inherited = InheritedTypeSyntax ( type: proto)
65+ if idx < protocols. count - 1 {
66+ inherited = inherited. with ( \. trailingComma, . commaToken( trailingTrivia: . space) )
67+ }
68+ return inherited
69+ }
70+ )
71+ )
72+
73+ // Assemble extension
74+ let extDecl = ExtensionDeclSyntax (
75+ modifiers: DeclModifierListSyntax ( [ ] ) ,
76+ extendedType: IdentifierTypeSyntax ( name: typeName) ,
77+ inheritanceClause: inheritanceClause,
78+ memberBlock: memberBlock
79+ )
80+
81+ return [ extDecl]
4682 }
4783
4884 public static func expansion( of node: SwiftSyntax . AttributeSyntax , providingPeersOf declaration: some SwiftSyntax . DeclSyntaxProtocol , in context: some SwiftSyntaxMacros . MacroExpansionContext ) throws -> [ SwiftSyntax . DeclSyntax ] {
4985 guard let enumDecl = declaration. as ( EnumDeclSyntax . self) else {
5086 throw InvalidDeclError . kind ( declaration. kind)
5187 }
5288
53- let typeName = enumDecl. name
89+ let typeName = enumDecl. name
5490
5591 guard let declSyntax : DeclSyntax = . init( TypeAlias ( " \( typeName. trimmed) Set " , equals: " EnumSet< \( typeName) > " ) . expr) else {
5692 throw InvalidDeclError . kind ( declaration. kind)
0 commit comments