Skip to content

Commit 0f50f93

Browse files
authored
Merge pull request #2410 from gottesmm/transferring
[region-isolation] Add support for parsing transferring.
2 parents c70d1aa + 1ebf4ec commit 0f50f93

File tree

13 files changed

+81
-3
lines changed

13 files changed

+81
-3
lines changed

CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ public let DECL_NODES: [Node] = [
467467
.keyword(._resultDependsOnSelf),
468468
.keyword(.required),
469469
.keyword(.static),
470+
.keyword(.transferring),
470471
.keyword(.unowned),
471472
.keyword(.weak),
472473
])

CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ public enum Keyword: CaseIterable {
268268
case then
269269
case `throw`
270270
case `throws`
271+
case transferring
271272
case transpose
272273
case `true`
273274
case `try`
@@ -671,6 +672,11 @@ public enum Keyword: CaseIterable {
671672
return KeywordSpec("throw", isLexerClassified: true)
672673
case .throws:
673674
return KeywordSpec("throws", isLexerClassified: true)
675+
case .transferring:
676+
return KeywordSpec(
677+
"transferring",
678+
experimentalFeature: .transferringArgsAndResults
679+
)
674680
case .transpose:
675681
return KeywordSpec("transpose")
676682
case .true:

CodeGeneration/Sources/SyntaxSupport/TypeNodes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public let TYPE_NODES: [Node] = [
5252
.keyword(._const),
5353
.keyword(.borrowing),
5454
.keyword(.consuming),
55+
.keyword(.transferring),
5556
.keyword(._resultDependsOn),
5657
]),
5758
isOptional: true

Sources/SwiftParser/Declarations.swift

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

Sources/SwiftParser/Patterns.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ extension Parser.Lookahead {
353353
&& !self.at(.keyword(.__owned))
354354
&& !self.at(.keyword(.borrowing))
355355
&& !self.at(.keyword(.consuming))
356+
&& !(experimentalFeatures.contains(.transferringArgsAndResults) && self.at(.keyword(.transferring)))
356357
&& !(experimentalFeatures.contains(.nonescapableTypes) && self.at(.keyword(._resultDependsOn)))
357358
{
358359
return true

Sources/SwiftParser/TokenPrecedence.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ enum TokenPrecedence: Comparable {
231231
.__consuming, .final, .required, .optional, .lazy, .dynamic, .infix, .postfix, .prefix, .mutating, .nonmutating, .convenience, .override, .package, .open,
232232
.__setter_access, .indirect, .isolated, .nonisolated, .distributed, ._local,
233233
.inout, ._mutating, ._borrow, ._borrowing, .borrowing, ._consuming, .consuming, .consume, ._resultDependsOnSelf, ._resultDependsOn,
234+
.transferring,
234235
// Accessors
235236
.get, .set, .didSet, .willSet, .unsafeAddress, .addressWithOwner, .addressWithNativeOwner, .unsafeMutableAddress,
236237
.mutableAddressWithOwner, .mutableAddressWithNativeOwner, ._read, ._modify,

Sources/SwiftParser/TokenSpecSet.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ enum DeclarationModifier: TokenSpecSet {
374374
case required
375375
case `rethrows`
376376
case `static`
377+
case transferring
377378
case unowned
378379
case weak
379380
case _resultDependsOn
@@ -414,6 +415,7 @@ enum DeclarationModifier: TokenSpecSet {
414415
case TokenSpec(.required): self = .required
415416
case TokenSpec(.rethrows): self = .rethrows
416417
case TokenSpec(.static): self = .static
418+
case TokenSpec(.transferring): self = .transferring
417419
case TokenSpec(.unowned): self = .unowned
418420
case TokenSpec(.weak): self = .weak
419421
case TokenSpec(._resultDependsOn) where experimentalFeatures.contains(.nonescapableTypes): self = ._resultDependsOn
@@ -457,6 +459,7 @@ enum DeclarationModifier: TokenSpecSet {
457459
case .required: return .keyword(.required)
458460
case .rethrows: return TokenSpec(.rethrows, recoveryPrecedence: .declKeyword)
459461
case .static: return .keyword(.static)
462+
case .transferring: return .keyword(.transferring)
460463
case .unowned: return TokenSpec(.unowned, recoveryPrecedence: .declKeyword)
461464
case .weak: return TokenSpec(.weak, recoveryPrecedence: .declKeyword)
462465
case ._resultDependsOn: return TokenSpec(._resultDependsOn, recoveryPrecedence: .declKeyword)
@@ -688,6 +691,7 @@ public enum TypeSpecifier: TokenSpecSet {
688691
case shared
689692
case borrowing
690693
case consuming
694+
case transferring
691695

692696
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
693697
switch PrepareForKeywordMatch(lexeme) {
@@ -696,6 +700,7 @@ public enum TypeSpecifier: TokenSpecSet {
696700
case TokenSpec(.__shared): self = .shared
697701
case TokenSpec(.consuming): self = .consuming
698702
case TokenSpec(.borrowing): self = .borrowing
703+
case TokenSpec(.transferring): self = .transferring
699704
default: return nil
700705
}
701706
}
@@ -708,6 +713,7 @@ public enum TypeSpecifier: TokenSpecSet {
708713
case TokenSpec(.__shared): self = .shared
709714
case TokenSpec(.consuming): self = .shared
710715
case TokenSpec(.borrowing): self = .shared
716+
case TokenSpec(.transferring): self = .transferring
711717
default: return nil
712718
}
713719
}
@@ -719,6 +725,7 @@ public enum TypeSpecifier: TokenSpecSet {
719725
case .shared: return .keyword(.__shared)
720726
case .borrowing: return .keyword(.borrowing)
721727
case .consuming: return .keyword(.consuming)
728+
case .transferring: return .keyword(.transferring)
722729
}
723730
}
724731
}

Sources/SwiftParser/generated/Parser+TokenSpecSet.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ extension AttributedTypeSyntax {
184184
case borrowing
185185
case consuming
186186
@_spi(ExperimentalLanguageFeatures)
187+
case transferring
188+
@_spi(ExperimentalLanguageFeatures)
187189
case _resultDependsOn
188190

189191
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
@@ -202,6 +204,8 @@ extension AttributedTypeSyntax {
202204
self = .borrowing
203205
case TokenSpec(.consuming):
204206
self = .consuming
207+
case TokenSpec(.transferring) where experimentalFeatures.contains(.transferringArgsAndResults):
208+
self = .transferring
205209
case TokenSpec(._resultDependsOn) where experimentalFeatures.contains(.nonescapableTypes):
206210
self = ._resultDependsOn
207211
default:
@@ -225,6 +229,8 @@ extension AttributedTypeSyntax {
225229
return .keyword(.borrowing)
226230
case .consuming:
227231
return .keyword(.consuming)
232+
case .transferring:
233+
return .keyword(.transferring)
228234
case ._resultDependsOn:
229235
return .keyword(._resultDependsOn)
230236
}
@@ -250,6 +256,8 @@ extension AttributedTypeSyntax {
250256
return .keyword(.borrowing)
251257
case .consuming:
252258
return .keyword(.consuming)
259+
case .transferring:
260+
return .keyword(.transferring)
253261
case ._resultDependsOn:
254262
return .keyword(._resultDependsOn)
255263
}
@@ -726,6 +734,8 @@ extension DeclModifierSyntax {
726734
case _resultDependsOnSelf
727735
case required
728736
case `static`
737+
@_spi(ExperimentalLanguageFeatures)
738+
case transferring
729739
case unowned
730740
case weak
731741

@@ -799,6 +809,8 @@ extension DeclModifierSyntax {
799809
self = .required
800810
case TokenSpec(.static):
801811
self = .static
812+
case TokenSpec(.transferring) where experimentalFeatures.contains(.transferringArgsAndResults):
813+
self = .transferring
802814
case TokenSpec(.unowned):
803815
self = .unowned
804816
case TokenSpec(.weak):
@@ -878,6 +890,8 @@ extension DeclModifierSyntax {
878890
return .keyword(.required)
879891
case .static:
880892
return .keyword(.static)
893+
case .transferring:
894+
return .keyword(.transferring)
881895
case .unowned:
882896
return .keyword(.unowned)
883897
case .weak:
@@ -959,6 +973,8 @@ extension DeclModifierSyntax {
959973
return .keyword(.required)
960974
case .static:
961975
return .keyword(.static)
976+
case .transferring:
977+
return .keyword(.transferring)
962978
case .unowned:
963979
return .keyword(.unowned)
964980
case .weak:

Sources/SwiftSyntax/generated/Keyword.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ public enum Keyword: UInt8, Hashable {
212212
case then
213213
case `throw`
214214
case `throws`
215+
@_spi(ExperimentalLanguageFeatures)
216+
case transferring
215217
case transpose
216218
case `true`
217219
case `try`
@@ -647,6 +649,8 @@ public enum Keyword: UInt8, Hashable {
647649
self = .backDeployed
648650
case "noDerivative":
649651
self = .noDerivative
652+
case "transferring":
653+
self = .transferring
650654
default:
651655
return nil
652656
}
@@ -988,6 +992,7 @@ public enum Keyword: UInt8, Hashable {
988992
"then",
989993
"throw",
990994
"throws",
995+
"transferring",
991996
"transpose",
992997
"true",
993998
"try",

Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
387387
.keyword("_const"),
388388
.keyword("borrowing"),
389389
.keyword("consuming"),
390+
.keyword("transferring"),
390391
.keyword("_resultDependsOn")
391392
]))
392393
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
@@ -806,6 +807,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
806807
.keyword("_resultDependsOnSelf"),
807808
.keyword("required"),
808809
.keyword("static"),
810+
.keyword("transferring"),
809811
.keyword("unowned"),
810812
.keyword("weak")
811813
]))

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesAB.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3257,7 +3257,7 @@ public struct AttributeSyntax: SyntaxProtocol, SyntaxHashable, _LeafSyntaxNodePr
32573257

32583258
/// ### Children
32593259
///
3260-
/// - `specifier`: (`inout` | `__shared` | `__owned` | `isolated` | `_const` | `borrowing` | `consuming` | `_resultDependsOn`)?
3260+
/// - `specifier`: (`inout` | `__shared` | `__owned` | `isolated` | `_const` | `borrowing` | `consuming` | `transferring` | `_resultDependsOn`)?
32613261
/// - `attributes`: ``AttributeListSyntax``
32623262
/// - `baseType`: ``TypeSyntax``
32633263
public struct AttributedTypeSyntax: TypeSyntaxProtocol, SyntaxHashable, _LeafTypeSyntaxNodeProtocol {
@@ -3336,6 +3336,7 @@ public struct AttributedTypeSyntax: TypeSyntaxProtocol, SyntaxHashable, _LeafTyp
33363336
/// - `_const`
33373337
/// - `borrowing`
33383338
/// - `consuming`
3339+
/// - `transferring`
33393340
/// - `_resultDependsOn`
33403341
public var specifier: TokenSyntax? {
33413342
get {

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` | `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`)
173173
/// - `detail`: ``DeclModifierDetailSyntax``?
174174
///
175175
/// ### Contained in
@@ -273,6 +273,7 @@ public struct DeclModifierSyntax: SyntaxProtocol, SyntaxHashable, _LeafSyntaxNod
273273
/// - `_resultDependsOnSelf`
274274
/// - `required`
275275
/// - `static`
276+
/// - `transferring`
276277
/// - `unowned`
277278
/// - `weak`
278279
public var name: TokenSyntax {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
@_spi(ExperimentalLanguageFeatures) import SwiftParser
14+
import XCTest
15+
16+
final class TransferringTests: ParserTestCase {
17+
func testTransferingArg1() {
18+
assertParse(
19+
"""
20+
class Klass {}
21+
func transferMain(_ x: transferring Klass) -> ()
22+
""",
23+
experimentalFeatures: .transferringArgsAndResults
24+
)
25+
}
26+
27+
func testTransferingArgMiddle() {
28+
assertParse(
29+
"""
30+
class Klass {}
31+
func transferMain(_ y: Klass, _ x: transferring Klass, _ z: Klass) -> ()
32+
""",
33+
experimentalFeatures: .transferringArgsAndResults
34+
)
35+
}
36+
}

0 commit comments

Comments
 (0)