Skip to content

Commit 242e19d

Browse files
authored
Merge pull request #2658 from gottesmm/rdar128216574
[sending] Add support for sending
2 parents 8a4d12e + cee0c14 commit 242e19d

15 files changed

+74
-6
lines changed

CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,7 @@ public let DECL_NODES: [Node] = [
472472
.keyword(.transferring),
473473
.keyword(.unowned),
474474
.keyword(.weak),
475+
.keyword(.sending),
475476
])
476477
),
477478
Child(

CodeGeneration/Sources/SyntaxSupport/ExperimentalFeatures.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public enum ExperimentalFeature: String, CaseIterable {
1919
case nonescapableTypes
2020
case transferringArgsAndResults
2121
case trailingComma
22+
case sendingArgsAndResults
2223

2324
/// The name of the feature, which is used in the doc comment.
2425
public var featureName: String {
@@ -35,6 +36,8 @@ public enum ExperimentalFeature: String, CaseIterable {
3536
return "TransferringArgsAndResults"
3637
case .trailingComma:
3738
return "trailing comma"
39+
case .sendingArgsAndResults:
40+
return "SendingArgsAndResults"
3841
}
3942
}
4043

CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ public enum Keyword: CaseIterable {
263263
case safe
264264
case scoped
265265
case `self`
266+
case sending
266267
case `Self`
267268
case Sendable
268269
case set
@@ -701,6 +702,11 @@ public enum Keyword: CaseIterable {
701702
"transferring",
702703
experimentalFeature: .transferringArgsAndResults
703704
)
705+
case .sending:
706+
return KeywordSpec(
707+
"sending",
708+
experimentalFeature: .sendingArgsAndResults
709+
)
704710
case .transpose:
705711
return KeywordSpec("transpose")
706712
case .true:

CodeGeneration/Sources/SyntaxSupport/TypeNodes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,7 @@ public let TYPE_NODES: [Node] = [
593593
.keyword(.consuming),
594594
.keyword(.transferring),
595595
.keyword(._resultDependsOn),
596+
.keyword(.sending),
596597
]),
597598
documentation: "The specifier token that's attached to the type."
598599
)

Sources/SwiftParser/Declarations.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ extension DeclarationModifier {
2323
.borrowing, .class, .consuming, .convenience, .distributed, .dynamic,
2424
.final, .indirect, .infix, .isolated, .lazy, .mutating, .nonmutating,
2525
.optional, .override, .postfix, .prefix, .reasync, ._resultDependsOn, ._resultDependsOnSelf, .required,
26-
.rethrows, .static, .weak, .transferring:
26+
.rethrows, .static, .weak, .transferring, .sending:
2727
return false
2828
case .fileprivate, .internal, .nonisolated, .package, .open, .private,
2929
.public, .unowned:

Sources/SwiftParser/Patterns.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,7 @@ extension Parser.Lookahead {
378378
&& !self.at(.keyword(.borrowing))
379379
&& !self.at(.keyword(.consuming))
380380
&& !(experimentalFeatures.contains(.transferringArgsAndResults) && self.at(.keyword(.transferring)))
381+
&& !(experimentalFeatures.contains(.sendingArgsAndResults) && self.at(.keyword(.sending)))
381382
&& !(experimentalFeatures.contains(.nonescapableTypes) && self.at(.keyword(._resultDependsOn)))
382383
{
383384
return true

Sources/SwiftParser/TokenPrecedence.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ enum TokenPrecedence: Comparable {
237237
.__setter_access, .indirect, .isolated, .nonisolated, .distributed, ._local,
238238
.inout, ._mutating, ._borrow, ._borrowing, .borrowing, ._consuming, .consuming, .consume, ._resultDependsOnSelf,
239239
._resultDependsOn,
240-
.transferring, .dependsOn, .scoped,
240+
.transferring, .dependsOn, .scoped, .sending,
241241
// Accessors
242242
.get, .set, .didSet, .willSet, .unsafeAddress, .addressWithOwner, .addressWithNativeOwner, .unsafeMutableAddress,
243243
.mutableAddressWithOwner, .mutableAddressWithNativeOwner, ._read, ._modify,

Sources/SwiftParser/TokenSpecSet.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ enum DeclarationModifier: TokenSpecSet {
377377
case reasync
378378
case required
379379
case `rethrows`
380+
case sending
380381
case `static`
381382
case transferring
382383
case unowned
@@ -420,6 +421,7 @@ enum DeclarationModifier: TokenSpecSet {
420421
case TokenSpec(.rethrows): self = .rethrows
421422
case TokenSpec(.static): self = .static
422423
case TokenSpec(.transferring): self = .transferring
424+
case TokenSpec(.sending): self = .sending
423425
case TokenSpec(.unowned): self = .unowned
424426
case TokenSpec(.weak): self = .weak
425427
case TokenSpec(._resultDependsOn) where experimentalFeatures.contains(.nonescapableTypes): self = ._resultDependsOn
@@ -465,6 +467,7 @@ enum DeclarationModifier: TokenSpecSet {
465467
case .rethrows: return TokenSpec(.rethrows, recoveryPrecedence: .declKeyword)
466468
case .static: return .keyword(.static)
467469
case .transferring: return .keyword(.transferring)
470+
case .sending: return .keyword(.sending)
468471
case .unowned: return TokenSpec(.unowned, recoveryPrecedence: .declKeyword)
469472
case .weak: return TokenSpec(.weak, recoveryPrecedence: .declKeyword)
470473
case ._resultDependsOn: return TokenSpec(._resultDependsOn, recoveryPrecedence: .declKeyword)

Sources/SwiftParser/generated/ExperimentalFeatures.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,7 @@ extension Parser.ExperimentalFeatures {
4141

4242
/// Whether to enable the parsing of trailing comma.
4343
public static let trailingComma = Self (rawValue: 1 << 5)
44+
45+
/// Whether to enable the parsing of SendingArgsAndResults.
46+
public static let sendingArgsAndResults = Self (rawValue: 1 << 6)
4447
}

Sources/SwiftParser/generated/Parser+TokenSpecSet.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,10 @@ extension DeclModifierSyntax {
814814
case transferring
815815
case unowned
816816
case weak
817+
#if compiler(>=5.8)
818+
@_spi(ExperimentalLanguageFeatures)
819+
#endif
820+
case sending
817821

818822
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
819823
switch PrepareForKeywordMatch(lexeme) {
@@ -891,6 +895,8 @@ extension DeclModifierSyntax {
891895
self = .unowned
892896
case TokenSpec(.weak):
893897
self = .weak
898+
case TokenSpec(.sending) where experimentalFeatures.contains(.sendingArgsAndResults):
899+
self = .sending
894900
default:
895901
return nil
896902
}
@@ -972,6 +978,8 @@ extension DeclModifierSyntax {
972978
self = .unowned
973979
case TokenSpec(.weak):
974980
self = .weak
981+
case TokenSpec(.sending):
982+
self = .sending
975983
default:
976984
return nil
977985
}
@@ -1053,6 +1061,8 @@ extension DeclModifierSyntax {
10531061
return .keyword(.unowned)
10541062
case .weak:
10551063
return .keyword(.weak)
1064+
case .sending:
1065+
return .keyword(.sending)
10561066
}
10571067
}
10581068

@@ -1136,6 +1146,8 @@ extension DeclModifierSyntax {
11361146
return .keyword(.unowned)
11371147
case .weak:
11381148
return .keyword(.weak)
1149+
case .sending:
1150+
return .keyword(.sending)
11391151
}
11401152
}
11411153
}
@@ -3347,6 +3359,10 @@ extension SimpleTypeSpecifierSyntax {
33473359
@_spi(ExperimentalLanguageFeatures)
33483360
#endif
33493361
case _resultDependsOn
3362+
#if compiler(>=5.8)
3363+
@_spi(ExperimentalLanguageFeatures)
3364+
#endif
3365+
case sending
33503366

33513367
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
33523368
switch PrepareForKeywordMatch(lexeme) {
@@ -3368,6 +3384,8 @@ extension SimpleTypeSpecifierSyntax {
33683384
self = .transferring
33693385
case TokenSpec(._resultDependsOn) where experimentalFeatures.contains(.nonescapableTypes):
33703386
self = ._resultDependsOn
3387+
case TokenSpec(.sending) where experimentalFeatures.contains(.sendingArgsAndResults):
3388+
self = .sending
33713389
default:
33723390
return nil
33733391
}
@@ -3393,6 +3411,8 @@ extension SimpleTypeSpecifierSyntax {
33933411
self = .transferring
33943412
case TokenSpec(._resultDependsOn):
33953413
self = ._resultDependsOn
3414+
case TokenSpec(.sending):
3415+
self = .sending
33963416
default:
33973417
return nil
33983418
}
@@ -3418,6 +3438,8 @@ extension SimpleTypeSpecifierSyntax {
34183438
return .keyword(.transferring)
34193439
case ._resultDependsOn:
34203440
return .keyword(._resultDependsOn)
3441+
case .sending:
3442+
return .keyword(.sending)
34213443
}
34223444
}
34233445

@@ -3445,6 +3467,8 @@ extension SimpleTypeSpecifierSyntax {
34453467
return .keyword(.transferring)
34463468
case ._resultDependsOn:
34473469
return .keyword(._resultDependsOn)
3470+
case .sending:
3471+
return .keyword(.sending)
34483472
}
34493473
}
34503474
}

Sources/SwiftSyntax/generated/Keyword.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,10 @@ public enum Keyword: UInt8, Hashable, Sendable {
211211
#endif
212212
case scoped
213213
case `self`
214+
#if compiler(>=5.8)
215+
@_spi(ExperimentalLanguageFeatures)
216+
#endif
217+
case sending
214218
case `Self`
215219
case Sendable
216220
case set
@@ -492,6 +496,8 @@ public enum Keyword: UInt8, Hashable, Sendable {
492496
self = .renamed
493497
case "reverse":
494498
self = .reverse
499+
case "sending":
500+
self = .sending
495501
case "unowned":
496502
self = .unowned
497503
case "willSet":
@@ -1002,6 +1008,7 @@ public enum Keyword: UInt8, Hashable, Sendable {
10021008
"safe",
10031009
"scoped",
10041010
"self",
1011+
"sending",
10051012
"Self",
10061013
"Sendable",
10071014
"set",

Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -799,7 +799,8 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
799799
.keyword("static"),
800800
.keyword("transferring"),
801801
.keyword("unowned"),
802-
.keyword("weak")
802+
.keyword("weak"),
803+
.keyword("sending")
803804
]))
804805
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
805806
assertNoError(kind, 3, verify(layout[3], as: RawDeclModifierDetailSyntax?.self))
@@ -2298,7 +2299,8 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
22982299
.keyword("borrowing"),
22992300
.keyword("consuming"),
23002301
.keyword("transferring"),
2301-
.keyword("_resultDependsOn")
2302+
.keyword("_resultDependsOn"),
2303+
.keyword("sending")
23022304
]))
23032305
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
23042306
case .someOrAnyType:

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public struct DeclModifierDetailSyntax: SyntaxProtocol, SyntaxHashable, _LeafSyn
169169

170170
/// ### Children
171171
///
172-
/// - `name`: (`__consuming` | `__setter_access` | `_const` | `_local` | `actor` | `async` | `borrowing` | `class` | `consuming` | `convenience` | `distributed` | `dynamic` | `fileprivate` | `final` | `indirect` | `infix` | `internal` | `isolated` | `lazy` | `mutating` | `nonisolated` | `nonmutating` | `open` | `optional` | `override` | `package` | `postfix` | `prefix` | `private` | `public` | `reasync` | `_resultDependsOnSelf` | `required` | `static` | `transferring` | `unowned` | `weak`)
172+
/// - `name`: (`__consuming` | `__setter_access` | `_const` | `_local` | `actor` | `async` | `borrowing` | `class` | `consuming` | `convenience` | `distributed` | `dynamic` | `fileprivate` | `final` | `indirect` | `infix` | `internal` | `isolated` | `lazy` | `mutating` | `nonisolated` | `nonmutating` | `open` | `optional` | `override` | `package` | `postfix` | `prefix` | `private` | `public` | `reasync` | `_resultDependsOnSelf` | `required` | `static` | `transferring` | `unowned` | `weak` | `sending`)
173173
/// - `detail`: ``DeclModifierDetailSyntax``?
174174
///
175175
/// ### Contained in
@@ -276,6 +276,7 @@ public struct DeclModifierSyntax: SyntaxProtocol, SyntaxHashable, _LeafSyntaxNod
276276
/// - `transferring`
277277
/// - `unowned`
278278
/// - `weak`
279+
/// - `sending`
279280
public var name: TokenSyntax {
280281
get {
281282
return Syntax(self).child(at: 1)!.cast(TokenSyntax.self)

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesQRS.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1090,7 +1090,7 @@ public struct SimpleStringLiteralExprSyntax: ExprSyntaxProtocol, SyntaxHashable,
10901090
///
10911091
/// ### Children
10921092
///
1093-
/// - `specifier`: (`inout` | `__shared` | `__owned` | `isolated` | `_const` | `borrowing` | `consuming` | `transferring` | `_resultDependsOn`)
1093+
/// - `specifier`: (`inout` | `__shared` | `__owned` | `isolated` | `_const` | `borrowing` | `consuming` | `transferring` | `_resultDependsOn` | `sending`)
10941094
///
10951095
/// ### Contained in
10961096
///
@@ -1156,6 +1156,7 @@ public struct SimpleTypeSpecifierSyntax: SyntaxProtocol, SyntaxHashable, _LeafSy
11561156
/// - `consuming`
11571157
/// - `transferring`
11581158
/// - `_resultDependsOn`
1159+
/// - `sending`
11591160
public var specifier: TokenSyntax {
11601161
get {
11611162
return Syntax(self).child(at: 1)!.cast(TokenSyntax.self)

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3309,6 +3309,21 @@ final class DeclarationTests: ParserTestCase {
33093309
)
33103310
}
33113311

3312+
func testSendingTypeSpecifier() {
3313+
assertParse(
3314+
"func testVarDeclTupleElt() -> (sending String, String) {}",
3315+
experimentalFeatures: .sendingArgsAndResults
3316+
)
3317+
assertParse(
3318+
"func testVarDeclTuple2(_ x: (sending String)) {}",
3319+
experimentalFeatures: .sendingArgsAndResults
3320+
)
3321+
assertParse(
3322+
"func testVarDeclTuple2(_ x: (sending String, String)) {}",
3323+
experimentalFeatures: .sendingArgsAndResults
3324+
)
3325+
}
3326+
33123327
func testMisplacedAttributeInVarDeclWithMultipleBindings() {
33133328
assertParse(
33143329
"""

0 commit comments

Comments
 (0)