@@ -41,7 +41,7 @@ extension Parser {
41
41
/// expression → try-operator? await-operator? prefix-expression infix-expressions?
42
42
/// expression-list → expression | expression ',' expression-list
43
43
@_spi ( RawSyntax)
44
- public mutating func parseExpression( _ flavor: ExprFlavor = . trailingClosure) -> RawExprSyntax {
44
+ public mutating func parseExpression( _ flavor: ExprFlavor = . trailingClosure, inLetOrVar : Bool = false ) -> RawExprSyntax {
45
45
// If we are parsing a refutable pattern, check to see if this is the start
46
46
// of a let/var/is pattern. If so, parse it as an UnresolvedPatternExpr and
47
47
// let pattern type checking determine its final form.
@@ -52,7 +52,7 @@ extension Parser {
52
52
let pattern = self . parseMatchingPattern ( )
53
53
return RawExprSyntax ( RawUnresolvedPatternExprSyntax ( pattern: pattern, arena: self . arena) )
54
54
}
55
- return RawExprSyntax ( self . parseSequenceExpression ( flavor) )
55
+ return RawExprSyntax ( self . parseSequenceExpression ( flavor, inVarOrLet : inLetOrVar ) )
56
56
}
57
57
}
58
58
@@ -441,7 +441,7 @@ extension Parser {
441
441
}
442
442
return self . parsePostfixExpressionSuffix (
443
443
head, flavor, forDirective: forDirective,
444
- periodHasKeyPathBehavior: periodHasKeyPathBehavior)
444
+ periodHasKeyPathBehavior: periodHasKeyPathBehavior, inLetOrVar : inVarOrLet )
445
445
}
446
446
447
447
@_spi ( RawSyntax)
@@ -502,7 +502,9 @@ extension Parser {
502
502
}
503
503
let result = parser. parsePostfixExpressionSuffix (
504
504
head, flavor, forDirective: forDirective,
505
- periodHasKeyPathBehavior: false )
505
+ periodHasKeyPathBehavior: false ,
506
+ inLetOrVar: false
507
+ )
506
508
507
509
// TODO: diagnose and skip the remaining token in the current clause.
508
510
return result
@@ -538,7 +540,8 @@ extension Parser {
538
540
_ start: RawExprSyntax ,
539
541
_ flavor: ExprFlavor ,
540
542
forDirective: Bool ,
541
- periodHasKeyPathBehavior: Bool
543
+ periodHasKeyPathBehavior: Bool ,
544
+ inLetOrVar: Bool
542
545
) -> RawExprSyntax {
543
546
// Handle suffix expressions.
544
547
var leadingExpr = start
@@ -563,7 +566,7 @@ extension Parser {
563
566
564
567
// If there is an expr-call-suffix, parse it and form a call.
565
568
if let lparen = self . consume ( if: . leftParen, where: { !$0. isAtStartOfLine } ) {
566
- let args = self . parseArgumentListElements ( )
569
+ let args = self . parseArgumentListElements ( inLetOrVar : inLetOrVar )
567
570
let ( unexpectedBeforeRParen, rparen) = self . expect ( . rightParen)
568
571
569
572
// If we can parse trailing closures, do so.
@@ -591,7 +594,7 @@ extension Parser {
591
594
// Check for a [expr] suffix.
592
595
// Note that this cannot be the start of a new line.
593
596
if let lsquare = self . consume ( if: . leftSquareBracket, where: { !$0. isAtStartOfLine } ) {
594
- let args = self . parseArgumentListElements ( )
597
+ let args = self . parseArgumentListElements ( inLetOrVar : inLetOrVar )
595
598
let ( unexpectedBeforeRSquare, rsquare) = self . expect ( . rightSquareBracket)
596
599
597
600
// If we can parse trailing closures, do so.
@@ -750,14 +753,18 @@ extension Parser {
750
753
let base = RawExprSyntax ( RawKeyPathBaseExprSyntax ( period: dot, arena: self . arena) )
751
754
expression = self . parsePostfixExpressionSuffix (
752
755
base, . basic, forDirective: forDirective,
753
- periodHasKeyPathBehavior: false )
756
+ periodHasKeyPathBehavior: false ,
757
+ inLetOrVar: inVarOrLet
758
+ )
754
759
} else if self . at ( any: [ . period, . prefixPeriod] ) {
755
760
// Inside a keypath's path, the period always behaves normally: the key path
756
761
// behavior is only the separation between type and path.
757
762
let base = self . parseDottedExpressionSuffix ( nil )
758
763
expression = self . parsePostfixExpressionSuffix (
759
764
base, . basic, forDirective: forDirective,
760
- periodHasKeyPathBehavior: false )
765
+ periodHasKeyPathBehavior: false ,
766
+ inLetOrVar: inVarOrLet
767
+ )
761
768
} else {
762
769
expression = RawExprSyntax ( RawMissingExprSyntax ( arena: self . arena) )
763
770
}
@@ -956,7 +963,7 @@ extension Parser {
956
963
// only one element without label. However, libSyntax tree doesn't have this
957
964
// differentiation. A tuple expression node in libSyntax can have a single
958
965
// element without label.
959
- return RawExprSyntax ( self . parseTupleExpression ( ) )
966
+ return RawExprSyntax ( self . parseTupleExpression ( inLetOrVar : inVarOrLet ) )
960
967
961
968
case ( . leftSquareBracket, _) ? :
962
969
return self . parseCollectionLiteral ( )
@@ -1012,7 +1019,7 @@ extension Parser {
1012
1019
public mutating func parseObjectLiteralExpression( ) -> RawObjectLiteralExprSyntax {
1013
1020
let poundKeyword = self . consumeAnyToken ( )
1014
1021
let ( unexpectedBeforeLeftParen, leftParen) = self . expect ( . leftParen)
1015
- let arguments = self . parseArgumentListElements ( )
1022
+ let arguments = self . parseArgumentListElements ( inLetOrVar : false )
1016
1023
let ( unexpectedBeforeRightParen, rightParen) = self . expect ( . rightParen)
1017
1024
return RawObjectLiteralExprSyntax (
1018
1025
identifier: poundKeyword,
@@ -1366,7 +1373,7 @@ extension Parser {
1366
1373
expressionContent. withBuffer { buf in
1367
1374
var subparser = Parser ( buf, arena: self . arena)
1368
1375
let ( lunexpected, lparen) = subparser. expect ( . leftParen)
1369
- let args = subparser. parseArgumentListElements ( )
1376
+ let args = subparser. parseArgumentListElements ( inLetOrVar : false )
1370
1377
// If we stopped parsing the expression before the expression segment is
1371
1378
// over, eat the remaining tokens into a token list.
1372
1379
var runexpectedTokens = [ RawSyntax] ( )
@@ -1526,9 +1533,9 @@ extension Parser {
1526
1533
/// tuple-expression → '(' ')' | '(' tuple-element ',' tuple-element-list ')'
1527
1534
/// tuple-element-list → tuple-element | tuple-element ',' tuple-element-list
1528
1535
@_spi ( RawSyntax)
1529
- public mutating func parseTupleExpression( ) -> RawTupleExprSyntax {
1536
+ public mutating func parseTupleExpression( inLetOrVar : Bool ) -> RawTupleExprSyntax {
1530
1537
let ( unexpectedBeforeLParen, lparen) = self . expect ( . leftParen)
1531
- let elements = self . parseArgumentListElements ( )
1538
+ let elements = self . parseArgumentListElements ( inLetOrVar : inLetOrVar )
1532
1539
let ( unexpectedBeforeRParen, rparen) = self . expect ( . rightParen)
1533
1540
return RawTupleExprSyntax (
1534
1541
unexpectedBeforeLParen,
@@ -1995,7 +2002,7 @@ extension Parser {
1995
2002
///
1996
2003
/// tuple-element → expression | identifier ':' expression
1997
2004
@_spi ( RawSyntax)
1998
- public mutating func parseArgumentListElements( ) -> [ RawTupleExprElementSyntax ] {
2005
+ public mutating func parseArgumentListElements( inLetOrVar : Bool ) -> [ RawTupleExprElementSyntax ] {
1999
2006
guard !self . at ( . rightParen) else {
2000
2007
return [ ]
2001
2008
}
@@ -2017,7 +2024,7 @@ extension Parser {
2017
2024
expr = RawExprSyntax ( RawIdentifierExprSyntax (
2018
2025
identifier: ident, declNameArguments: args, arena: self . arena) )
2019
2026
} else {
2020
- expr = self . parseExpression ( )
2027
+ expr = self . parseExpression ( inLetOrVar : inLetOrVar )
2021
2028
}
2022
2029
keepGoing = self . consume ( if: . comma)
2023
2030
result. append ( RawTupleExprElementSyntax (
@@ -2042,9 +2049,9 @@ extension Parser {
2042
2049
/// tuple-expression → '(' ')' | '(' tuple-element ',' tuple-element-list ')'
2043
2050
/// tuple-element-list → tuple-element | tuple-element ',' tuple-element-list
2044
2051
@_spi ( RawSyntax)
2045
- public mutating func parseArgumentList( _ flavor: ExprFlavor ) -> RawTupleExprSyntax {
2052
+ public mutating func parseArgumentList( _ flavor: ExprFlavor , inLetOrVar : Bool ) -> RawTupleExprSyntax {
2046
2053
let ( unexpectedBeforeLParen, lparen) = self . expect ( . leftParen)
2047
- let args = self . parseArgumentListElements ( )
2054
+ let args = self . parseArgumentListElements ( inLetOrVar : inLetOrVar )
2048
2055
let ( unexpectedBeforeRightParen, rparen) = self . expect ( . rightParen)
2049
2056
2050
2057
// FIXME: Introduce new SyntaxKind for ArgumentList (rdar://81786229)
0 commit comments