Skip to content

Commit 6574de2

Browse files
authored
Make our use of SwiftSyntax APIs more resilient to precompiled SwiftSyntax (#3694)
* Make our use of SwiftSyntax APIs more resilient to precompiled SwiftSyntax * support 600 and 601" * wip * Make store isolation tests more resillient.
1 parent 294ac2c commit 6574de2

File tree

7 files changed

+142
-54
lines changed

7 files changed

+142
-54
lines changed

Package.resolved

Lines changed: 13 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/ComposableArchitectureMacros/Availability.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ extension AttributeListSyntax.Element {
8686
if let availability = ifConfig.availability {
8787
return .ifConfigDecl(availability)
8888
}
89+
@unknown default:
90+
return nil
8991
}
9092
return nil
9193
}

Sources/ComposableArchitectureMacros/ObservableStateMacro.swift

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ struct ObservationDiagnostic: DiagnosticMessage {
9898
var severity: DiagnosticSeverity
9999

100100
init(
101-
message: String, diagnosticID: SwiftDiagnostics.MessageID,
101+
message: String,
102+
diagnosticID: SwiftDiagnostics.MessageID,
102103
severity: SwiftDiagnostics.DiagnosticSeverity = .error
103104
) {
104105
self.message = message
@@ -107,7 +108,10 @@ struct ObservationDiagnostic: DiagnosticMessage {
107108
}
108109

109110
init(
110-
message: String, domain: String, id: ID, severity: SwiftDiagnostics.DiagnosticSeverity = .error
111+
message: String,
112+
domain: String,
113+
id: ID,
114+
severity: SwiftDiagnostics.DiagnosticSeverity = .error
111115
) {
112116
self.message = message
113117
self.diagnosticID = MessageID(domain: domain, id: id.rawValue)
@@ -117,7 +121,10 @@ struct ObservationDiagnostic: DiagnosticMessage {
117121

118122
extension DiagnosticsError {
119123
init<S: SyntaxProtocol>(
120-
syntax: S, message: String, domain: String = "Observation", id: ObservationDiagnostic.ID,
124+
syntax: S,
125+
message: String,
126+
domain: String = "Observation",
127+
id: ObservationDiagnostic.ID,
121128
severity: SwiftDiagnostics.DiagnosticSeverity = .error
122129
) {
123130
self.init(diagnostics: [
@@ -158,8 +165,11 @@ extension TokenSyntax {
158165
switch tokenKind {
159166
case .identifier(let identifier):
160167
return TokenSyntax(
161-
.identifier(prefix + identifier), leadingTrivia: leadingTrivia,
162-
trailingTrivia: trailingTrivia, presence: presence)
168+
.identifier(prefix + identifier),
169+
leadingTrivia: leadingTrivia,
170+
trailingTrivia: trailingTrivia,
171+
presence: presence
172+
)
163173
default:
164174
return self
165175
}
@@ -183,7 +193,8 @@ extension PatternBindingListSyntax {
183193
initializer: binding.initializer,
184194
accessorBlock: binding.accessorBlock,
185195
trailingComma: binding.trailingComma,
186-
trailingTrivia: binding.trailingTrivia)
196+
trailingTrivia: binding.trailingTrivia
197+
)
187198

188199
}
189200
}
@@ -202,8 +213,11 @@ extension VariableDeclSyntax {
202213
attributes: newAttributes,
203214
modifiers: modifiers.privatePrefixed(prefix),
204215
bindingSpecifier: TokenSyntax(
205-
bindingSpecifier.tokenKind, leadingTrivia: .space, trailingTrivia: .space,
206-
presence: .present),
216+
bindingSpecifier.tokenKind,
217+
leadingTrivia: .space,
218+
trailingTrivia: .space,
219+
presence: .present
220+
),
207221
bindings: bindings.privatePrefixed(prefix),
208222
trailingTrivia: trailingTrivia
209223
)
@@ -215,13 +229,38 @@ extension VariableDeclSyntax {
215229
}
216230

217231
extension ObservableStateMacro: MemberMacro {
218-
public static func expansion<
219-
Declaration: DeclGroupSyntax,
220-
Context: MacroExpansionContext
221-
>(
232+
#if canImport(SwiftSyntax601)
233+
public static func expansion(
234+
of node: AttributeSyntax,
235+
providingMembersOf declaration: some DeclGroupSyntax,
236+
conformingTo protocols: [TypeSyntax],
237+
in context: some MacroExpansionContext
238+
) throws -> [DeclSyntax] {
239+
try _expansion(
240+
of: node,
241+
providingMembersOf: declaration,
242+
conformingTo: protocols,
243+
in: context
244+
)
245+
}
246+
#else
247+
public static func expansion<
248+
Declaration: DeclGroupSyntax,
249+
Context: MacroExpansionContext
250+
>(
251+
of node: AttributeSyntax,
252+
providingMembersOf declaration: Declaration,
253+
in context: Context
254+
) throws -> [DeclSyntax] {
255+
try _expansion(of: node, providingMembersOf: declaration, conformingTo: [], in: context)
256+
}
257+
#endif
258+
259+
private static func _expansion(
222260
of node: AttributeSyntax,
223-
providingMembersOf declaration: Declaration,
224-
in context: Context
261+
providingMembersOf declaration: some DeclGroupSyntax,
262+
conformingTo protocols: [TypeSyntax],
263+
in context: some MacroExpansionContext
225264
) throws -> [DeclSyntax] {
226265
guard !declaration.isEnum
227266
else {
@@ -239,20 +278,24 @@ extension ObservableStateMacro: MemberMacro {
239278
throw DiagnosticsError(
240279
syntax: node,
241280
message: "'@ObservableState' cannot be applied to class type '\(observableType.text)'",
242-
id: .invalidApplication)
281+
id: .invalidApplication
282+
)
243283
}
244284
if declaration.isActor {
245285
// actors cannot yet be supported for their isolation
246286
throw DiagnosticsError(
247287
syntax: node,
248288
message: "'@ObservableState' cannot be applied to actor type '\(observableType.text)'",
249-
id: .invalidApplication)
289+
id: .invalidApplication
290+
)
250291
}
251292

252293
var declarations = [DeclSyntax]()
253294

254295
declaration.addIfNeeded(
255-
ObservableStateMacro.registrarVariable(observableType), to: &declarations)
296+
ObservableStateMacro.registrarVariable(observableType),
297+
to: &declarations
298+
)
256299
declaration.addIfNeeded(ObservableStateMacro.idVariable(), to: &declarations)
257300
declaration.addIfNeeded(ObservableStateMacro.willModifyFunction(), to: &declarations)
258301

@@ -453,14 +496,18 @@ extension ObservableStateMacro: MemberAttributeMacro {
453496
return [
454497
AttributeSyntax(
455498
attributeName: IdentifierTypeSyntax(
456-
name: .identifier(ObservableStateMacro.ignoredMacroName)))
499+
name: .identifier(ObservableStateMacro.ignoredMacroName)
500+
)
501+
)
457502
]
458503
}
459504

460505
return [
461506
AttributeSyntax(
462507
attributeName: IdentifierTypeSyntax(
463-
name: .identifier(ObservableStateMacro.trackedMacroName)))
508+
name: .identifier(ObservableStateMacro.trackedMacroName)
509+
)
510+
)
464511
]
465512
}
466513
}
@@ -606,7 +653,8 @@ extension ObservationStateTrackedMacro: PeerMacro {
606653
}
607654

608655
let storage = DeclSyntax(
609-
property.privatePrefixed("_", addingAttribute: ObservableStateMacro.ignoredAttribute))
656+
property.privatePrefixed("_", addingAttribute: ObservableStateMacro.ignoredAttribute)
657+
)
610658
return [storage]
611659
}
612660
}

Sources/ComposableArchitectureMacros/PresentsMacro.swift

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ extension VariableDeclSyntax {
9999
attributes: newAttributes,
100100
modifiers: modifiers.privatePrefixed("_"),
101101
bindingSpecifier: TokenSyntax(
102-
bindingSpecifier.tokenKind, trailingTrivia: .space,
102+
bindingSpecifier.tokenKind,
103+
trailingTrivia: .space,
103104
presence: .present
104105
),
105106
bindings: bindings.privateWrapped,
@@ -112,7 +113,8 @@ extension VariableDeclSyntax {
112113
leadingTrivia: leadingTrivia,
113114
modifiers: modifiers,
114115
bindingSpecifier: TokenSyntax(
115-
bindingSpecifier.tokenKind, trailingTrivia: .space,
116+
bindingSpecifier.tokenKind,
117+
trailingTrivia: .space,
116118
presence: .present
117119
),
118120
bindings: bindings.projected,
@@ -211,18 +213,34 @@ extension PatternBindingListSyntax {
211213

212214
extension TypeSyntax {
213215
fileprivate var presentationWrapped: GenericSpecializationExprSyntax {
214-
GenericSpecializationExprSyntax(
215-
expression: MemberAccessExprSyntax(
216-
base: DeclReferenceExprSyntax(baseName: "ComposableArchitecture"),
217-
name: "PresentationState"
218-
),
219-
genericArgumentClause: GenericArgumentClauseSyntax(
220-
arguments: [
221-
GenericArgumentSyntax(
222-
argument: self
223-
)
224-
]
216+
#if canImport(SwiftSyntax601)
217+
GenericSpecializationExprSyntax(
218+
expression: MemberAccessExprSyntax(
219+
base: DeclReferenceExprSyntax(baseName: "ComposableArchitecture"),
220+
name: "PresentationState"
221+
),
222+
genericArgumentClause: GenericArgumentClauseSyntax(
223+
arguments: [
224+
GenericArgumentSyntax(
225+
argument: GenericArgumentSyntax.Argument(self)
226+
)
227+
]
228+
)
225229
)
226-
)
230+
#else
231+
GenericSpecializationExprSyntax(
232+
expression: MemberAccessExprSyntax(
233+
base: DeclReferenceExprSyntax(baseName: "ComposableArchitecture"),
234+
name: "PresentationState"
235+
),
236+
genericArgumentClause: GenericArgumentClauseSyntax(
237+
arguments: [
238+
GenericArgumentSyntax(
239+
argument: self
240+
)
241+
]
242+
)
243+
)
244+
#endif
227245
}
228246
}

Sources/ComposableArchitectureMacros/ReducerMacro.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,28 @@ extension IdentifierTypeSyntax {
189189
}
190190

191191
extension ReducerMacro: MemberMacro {
192+
public static func expansion(
193+
of node: AttributeSyntax,
194+
providingMembersOf declaration: some DeclGroupSyntax,
195+
conformingTo protocols: [TypeSyntax],
196+
in context: some MacroExpansionContext
197+
) throws -> [DeclSyntax] {
198+
try _expansion(of: node, providingMembersOf: declaration, conformingTo: protocols, in: context)
199+
}
200+
192201
public static func expansion<D: DeclGroupSyntax, C: MacroExpansionContext>(
193202
of node: AttributeSyntax,
194203
providingMembersOf declaration: D,
195204
in context: C
205+
) throws -> [DeclSyntax] {
206+
try _expansion(of: node, providingMembersOf: declaration, conformingTo: [], in: context)
207+
}
208+
209+
private static func _expansion(
210+
of node: AttributeSyntax,
211+
providingMembersOf declaration: some DeclGroupSyntax,
212+
conformingTo protocols: [TypeSyntax],
213+
in context: some MacroExpansionContext
196214
) throws -> [DeclSyntax] {
197215
let access = declaration.modifiers.first {
198216
[.keyword(.public), .keyword(.package)].contains($0.name.tokenKind)

Tests/ComposableArchitectureTests/CurrentValueRelayTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
final class CurrentValueRelayTests: BaseTCATestCase {
77
func testConcurrentSend() async {
8-
nonisolated(unsafe) let subject = CurrentValueRelay(0)
8+
let subject = CurrentValueRelay(0)
99
let values = LockIsolated<Set<Int>>([])
1010
let cancellable = subject.sink { (value: Int) in
1111
values.withValue {
@@ -28,7 +28,7 @@
2828

2929
@available(macOS 12.0, iOS 15.0, tvOS 15.0, watchOS 8.0, *)
3030
func testConcurrentSendAndReceive() async {
31-
nonisolated(unsafe) let subject = CurrentValueRelay(0)
31+
let subject = CurrentValueRelay(0)
3232
let values = LockIsolated<Set<Int>>([])
3333
let cancellable = subject.sink { (value: Int) in
3434
values.withValue {

0 commit comments

Comments
 (0)