Skip to content

Commit 09b5dfc

Browse files
committed
Adding Extension
1 parent 8db2e53 commit 09b5dfc

2 files changed

Lines changed: 42 additions & 18 deletions

File tree

Macros/Options/Package@swift-6.1.swift

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,6 @@
77
import CompilerPluginSupport
88
import PackageDescription
99

10-
let swiftSettings = [
11-
SwiftSetting.enableUpcomingFeature("BareSlashRegexLiterals"),
12-
SwiftSetting.enableUpcomingFeature("ConciseMagicFile"),
13-
SwiftSetting.enableUpcomingFeature("ExistentialAny"),
14-
SwiftSetting.enableUpcomingFeature("ForwardTrailingClosures"),
15-
SwiftSetting.enableUpcomingFeature("ImplicitOpenExistentials"),
16-
SwiftSetting.enableUpcomingFeature("StrictConcurrency"),
17-
SwiftSetting.enableUpcomingFeature("DisableOutwardActorInference"),
18-
SwiftSetting.enableExperimentalFeature("StrictConcurrency")
19-
]
2010

2111
let package = Package(
2212
name: "Options",
@@ -42,17 +32,15 @@ let package = Package(
4232
targets: [
4333
.target(
4434
name: "Options",
45-
dependencies: ["OptionsMacros"],
46-
swiftSettings: swiftSettings
35+
dependencies: ["OptionsMacros"]
4736
),
4837
.macro(
4938
name: "OptionsMacros",
5039
dependencies: [
5140
.product(name: "SyntaxKit", package: "SyntaxKit"),
5241
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
5342
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
54-
],
55-
swiftSettings: swiftSettings
43+
]
5644
),
5745
.testTarget(
5846
name: "OptionsTests",

Macros/Options/Sources/OptionsMacros/OptionsMacro.swift

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)