Skip to content

Commit cde223a

Browse files
committed
[region-isolation] Add support for parsing arguments with transferring convention.
1 parent c52ab77 commit cde223a

File tree

8 files changed

+54
-1
lines changed

8 files changed

+54
-1
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
@@ -267,6 +267,7 @@ public enum Keyword: CaseIterable {
267267
case then
268268
case `throw`
269269
case `throws`
270+
case transferring
270271
case transpose
271272
case `true`
272273
case `try`
@@ -670,6 +671,11 @@ public enum Keyword: CaseIterable {
670671
return KeywordSpec("throw", isLexerClassified: true)
671672
case .throws:
672673
return KeywordSpec("throws", isLexerClassified: true)
674+
case .transferring:
675+
return KeywordSpec(
676+
"transferring",
677+
experimentalFeature: .transferringArgsAndResults
678+
)
673679
case .transpose:
674680
return KeywordSpec("transpose")
675681
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)
@@ -685,6 +688,7 @@ public enum TypeSpecifier: TokenSpecSet {
685688
case shared
686689
case borrowing
687690
case consuming
691+
case transferring
688692

689693
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
690694
switch PrepareForKeywordMatch(lexeme) {
@@ -693,6 +697,7 @@ public enum TypeSpecifier: TokenSpecSet {
693697
case TokenSpec(.__shared): self = .shared
694698
case TokenSpec(.consuming): self = .consuming
695699
case TokenSpec(.borrowing): self = .borrowing
700+
case TokenSpec(.transferring): self = .transferring
696701
default: return nil
697702
}
698703
}
@@ -705,6 +710,7 @@ public enum TypeSpecifier: TokenSpecSet {
705710
case TokenSpec(.__shared): self = .shared
706711
case TokenSpec(.consuming): self = .shared
707712
case TokenSpec(.borrowing): self = .shared
713+
case TokenSpec(.transferring): self = .transferring
708714
default: return nil
709715
}
710716
}
@@ -716,6 +722,7 @@ public enum TypeSpecifier: TokenSpecSet {
716722
case .shared: return .keyword(.__shared)
717723
case .borrowing: return .keyword(.borrowing)
718724
case .consuming: return .keyword(.consuming)
725+
case .transferring: return .keyword(.transferring)
719726
}
720727
}
721728
}
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)