Skip to content

Commit 27d551f

Browse files
committed
Allow borrowing without underscore in pattern matches.
rdar://126305009
1 parent d722cfc commit 27d551f

File tree

6 files changed

+37
-27
lines changed

6 files changed

+37
-27
lines changed

CodeGeneration/Sources/SyntaxSupport/PatternNodes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ public let PATTERN_NODES: [Node] = [
201201
kind: .token(choices: [
202202
.keyword(.let), .keyword(.var), .keyword(.inout),
203203
.keyword(._mutating), .keyword(._borrowing), .keyword(._consuming),
204+
.keyword(.borrowing),
204205
])
205206
),
206207
Child(

Sources/SwiftParser/Patterns.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,8 @@ extension Parser.Lookahead {
268268
// TODO: the other ownership modifiers (borrowing/consuming/mutating) more
269269
// than likely need to be made contextual as well before finalizing their
270270
// grammar.
271-
case ._borrowing where experimentalFeatures.contains(.borrowingSwitch):
271+
case ._borrowing where experimentalFeatures.contains(.borrowingSwitch),
272+
.borrowing where experimentalFeatures.contains(.borrowingSwitch):
272273
return peek(isAt: TokenSpec(.identifier, allowAtStartOfLine: false))
273274
default:
274275
// Other keywords can be parsed unconditionally.

Sources/SwiftParser/generated/Parser+TokenSpecSet.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3905,6 +3905,7 @@ extension ValueBindingPatternSyntax {
39053905
@_spi(ExperimentalLanguageFeatures)
39063906
#endif
39073907
case _consuming
3908+
case borrowing
39083909

39093910
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
39103911
switch PrepareForKeywordMatch(lexeme) {
@@ -3920,6 +3921,8 @@ extension ValueBindingPatternSyntax {
39203921
self = ._borrowing
39213922
case TokenSpec(._consuming) where experimentalFeatures.contains(.referenceBindings):
39223923
self = ._consuming
3924+
case TokenSpec(.borrowing):
3925+
self = .borrowing
39233926
default:
39243927
return nil
39253928
}
@@ -3939,6 +3942,8 @@ extension ValueBindingPatternSyntax {
39393942
self = ._borrowing
39403943
case TokenSpec(._consuming):
39413944
self = ._consuming
3945+
case TokenSpec(.borrowing):
3946+
self = .borrowing
39423947
default:
39433948
return nil
39443949
}
@@ -3958,6 +3963,8 @@ extension ValueBindingPatternSyntax {
39583963
return .keyword(._borrowing)
39593964
case ._consuming:
39603965
return .keyword(._consuming)
3966+
case .borrowing:
3967+
return .keyword(.borrowing)
39613968
}
39623969
}
39633970

@@ -3979,6 +3986,8 @@ extension ValueBindingPatternSyntax {
39793986
return .keyword(._borrowing)
39803987
case ._consuming:
39813988
return .keyword(._consuming)
3989+
case .borrowing:
3990+
return .keyword(.borrowing)
39823991
}
39833992
}
39843993
}

Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2706,7 +2706,8 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
27062706
.keyword("inout"),
27072707
.keyword("_mutating"),
27082708
.keyword("_borrowing"),
2709-
.keyword("_consuming")
2709+
.keyword("_consuming"),
2710+
.keyword("borrowing")
27102711
]))
27112712
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
27122713
assertNoError(kind, 3, verify(layout[3], as: RawPatternSyntax.self))

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesTUVWXYZ.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3256,7 +3256,7 @@ public struct UnresolvedTernaryExprSyntax: ExprSyntaxProtocol, SyntaxHashable, _
32563256

32573257
/// ### Children
32583258
///
3259-
/// - `bindingSpecifier`: (`let` | `var` | `inout` | `_mutating` | `_borrowing` | `_consuming`)
3259+
/// - `bindingSpecifier`: (`let` | `var` | `inout` | `_mutating` | `_borrowing` | `_consuming` | `borrowing`)
32603260
/// - `pattern`: ``PatternSyntax``
32613261
public struct ValueBindingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable, _LeafPatternSyntaxNodeProtocol {
32623262
public let _syntaxNode: Syntax
@@ -3327,6 +3327,7 @@ public struct ValueBindingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable,
33273327
/// - `_mutating`
33283328
/// - `_borrowing`
33293329
/// - `_consuming`
3330+
/// - `borrowing`
33303331
public var bindingSpecifier: TokenSyntax {
33313332
get {
33323333
return Syntax(self).child(at: 1)!.cast(TokenSyntax.self)

Tests/SwiftParserTest/translated/MatchingPatternsTests.swift

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -612,125 +612,122 @@ final class MatchingPatternsTests: ParserTestCase {
612612
assertParse(
613613
"""
614614
switch 42 {
615-
case _borrowing .foo(): // parses as `_borrowing.foo()` as before
615+
case borrowing .foo(): // parses as `borrowing.foo()` as before
616616
break
617617
}
618618
""",
619-
substructure: ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier("_borrowing"))),
619+
substructure: ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier("borrowing"))),
620620
experimentalFeatures: .borrowingSwitch
621621
)
622622

623623
assertParse(
624624
"""
625625
switch 42 {
626-
case _borrowing (): // parses as `_borrowing()` as before
626+
case borrowing (): // parses as `borrowing()` as before
627627
break
628628
}
629629
""",
630-
substructure: ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier("_borrowing"))),
630+
substructure: ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier("borrowing"))),
631631
experimentalFeatures: .borrowingSwitch
632632
)
633633

634634
assertParse(
635635
"""
636636
switch 42 {
637-
case _borrowing x: // parses as binding
637+
case borrowing x: // parses as binding
638638
break
639639
}
640640
""",
641641
substructure: PatternSyntax(
642642
ValueBindingPatternSyntax(
643-
bindingSpecifier: .keyword(._borrowing),
643+
bindingSpecifier: .keyword(.borrowing),
644644
pattern: PatternSyntax(IdentifierPatternSyntax(identifier: .identifier("x")))
645645
)
646-
),
647-
experimentalFeatures: .borrowingSwitch
646+
)
648647
)
649648

650649
assertParse(
651650
"""
652651
switch bar {
653-
case .payload(_borrowing x): // parses as binding
652+
case .payload(borrowing x): // parses as binding
654653
break
655654
}
656655
""",
657656
substructure: PatternSyntax(
658657
ValueBindingPatternSyntax(
659-
bindingSpecifier: .keyword(._borrowing),
658+
bindingSpecifier: .keyword(.borrowing),
660659
pattern: PatternSyntax(IdentifierPatternSyntax(identifier: .identifier("x")))
661660
)
662-
),
663-
experimentalFeatures: .borrowingSwitch
661+
)
664662
)
665663

666664
assertParse(
667665
"""
668666
switch bar {
669-
case _borrowing x.member: // parses as var introducer surrounding postfix expression (which never is valid)
667+
case borrowing x.member: // parses as var introducer surrounding postfix expression (which never is valid)
670668
break
671669
}
672670
""",
673671
substructure: PatternSyntax(
674672
ValueBindingPatternSyntax(
675-
bindingSpecifier: .keyword(._borrowing),
673+
bindingSpecifier: .keyword(.borrowing),
676674
pattern: ExpressionPatternSyntax(
677675
expression: MemberAccessExprSyntax(
678676
base: DeclReferenceExprSyntax(baseName: .identifier("x")),
679677
declName: DeclReferenceExprSyntax(baseName: .identifier("member"))
680678
)
681679
)
682680
)
683-
),
684-
experimentalFeatures: .borrowingSwitch
681+
)
685682
)
686683
assertParse(
687684
"""
688685
switch 42 {
689-
case let _borrowing: // parses as let binding named '_borrowing'
686+
case let borrowing: // parses as let binding named 'borrowing'
690687
break
691688
}
692689
""",
693690
substructure: PatternSyntax(
694691
ValueBindingPatternSyntax(
695692
bindingSpecifier: .keyword(.let),
696-
pattern: PatternSyntax(IdentifierPatternSyntax(identifier: .identifier("_borrowing")))
693+
pattern: PatternSyntax(IdentifierPatternSyntax(identifier: .identifier("borrowing")))
697694
)
698695
),
699696
experimentalFeatures: .borrowingSwitch
700697
)
701698
assertParse(
702699
"""
703700
switch 42 {
704-
case _borrowing + _borrowing: // parses as expr pattern
701+
case borrowing + borrowing: // parses as expr pattern
705702
break
706703
}
707704
""",
708-
substructure: ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier("_borrowing"))),
705+
substructure: ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier("borrowing"))),
709706
experimentalFeatures: .borrowingSwitch
710707
)
711708
assertParse(
712709
"""
713710
switch 42 {
714-
case _borrowing(let _borrowing): // parses as let binding named '_borrowing' inside a case pattern named 'borrowing'
711+
case borrowing(let borrowing): // parses as let binding named 'borrowing' inside a case pattern named 'borrowing'
715712
break
716713
}
717714
""",
718715
substructure: PatternSyntax(
719716
ValueBindingPatternSyntax(
720717
bindingSpecifier: .keyword(.let),
721-
pattern: PatternSyntax(IdentifierPatternSyntax(identifier: .identifier("_borrowing")))
718+
pattern: PatternSyntax(IdentifierPatternSyntax(identifier: .identifier("borrowing")))
722719
)
723720
),
724721
experimentalFeatures: .borrowingSwitch
725722
)
726723
assertParse(
727724
"""
728725
switch 42 {
729-
case {}(_borrowing + _borrowing): // parses as expr pattern
726+
case {}(borrowing + borrowing): // parses as expr pattern
730727
break
731728
}
732729
""",
733-
substructure: ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier("_borrowing"))),
730+
substructure: ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier("borrowing"))),
734731
experimentalFeatures: .borrowingSwitch
735732
)
736733
}

0 commit comments

Comments
 (0)