Skip to content

Commit 05ed3fb

Browse files
committed
Address review feedback
Clean up some code, allow `if` and `switch` to count as the start of an expression, and add some substructure test assertions.
1 parent 63e75d8 commit 05ed3fb

File tree

5 files changed

+318
-51
lines changed

5 files changed

+318
-51
lines changed

Sources/SwiftParser/Expressions.swift

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -520,26 +520,25 @@ extension Parser {
520520
// First check to see if we have the start of a regex literal `/.../`.
521521
// tryLexRegexLiteral(/*forUnappliedOperator*/ false)
522522

523-
// 'repeat' is the start of a pack expansion expression.
524-
if (self.at(.keyword(.repeat))) {
525-
return RawExprSyntax(
526-
parsePackExpansionExpr(flavor, pattern: pattern)
527-
)
528-
}
523+
switch self.currentToken.rawTokenKind {
524+
case .keyword(.repeat):
525+
// 'repeat' is the start of a pack expansion expression.
526+
return RawExprSyntax(parsePackExpansionExpr(flavor, pattern: pattern))
529527

530528
// Try parse an 'if' or 'switch' as an expression. Note we do this here in
531529
// parseUnaryExpression as we don't allow postfix syntax to hang off such
532530
// expressions to avoid ambiguities such as postfix '.member', which can
533531
// currently be parsed as a static dot member for a result builder.
534-
if self.at(.keyword(.switch)) {
532+
case .keyword(.switch):
535533
return RawExprSyntax(
536534
parseSwitchExpression(switchHandle: .constant(.keyword(.switch)))
537535
)
538-
}
539-
if self.at(.keyword(.if)) {
536+
case .keyword(.if):
540537
return RawExprSyntax(
541538
parseIfExpression(ifHandle: .constant(.keyword(.if)))
542539
)
540+
default:
541+
break
543542
}
544543

545544
switch self.at(anyIn: ExpressionPrefixOperator.self) {
@@ -2109,7 +2108,7 @@ extension Parser.Lookahead {
21092108

21102109
// If this is the start of a switch body, this isn't a trailing closure.
21112110
if self.peek().rawTokenKind == .keyword(.case) {
2112-
return false;
2111+
return false
21132112
}
21142113

21152114
// If this is a normal expression (not an expr-basic) then trailing closures

Sources/SwiftParser/RawTokenKindSubset.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -618,8 +618,8 @@ enum IfOrSwitch: RawTokenKindSubset {
618618

619619
init?(lexeme: Lexer.Lexeme) {
620620
switch lexeme {
621-
case RawTokenKindMatch(.keyword(.if)): self = .ifKeyword
622-
case RawTokenKindMatch(.keyword(.switch)): self = .switchKeyword
621+
case RawTokenKindMatch(.if): self = .ifKeyword
622+
case RawTokenKindMatch(.switch): self = .switchKeyword
623623
default: return nil
624624
}
625625
}
@@ -797,6 +797,7 @@ enum ExpressionStart: RawTokenKindSubset {
797797
case expressionPrefixOperator(ExpressionPrefixOperator)
798798
case matchingPatternStart(MatchingPatternStart)
799799
case primaryExpressionStart(PrimaryExpressionStart)
800+
case ifOrSwitch(IfOrSwitch)
800801

801802
init?(lexeme: Lexer.Lexeme) {
802803
if let subset = AwaitTryMove(lexeme: lexeme) {
@@ -807,6 +808,8 @@ enum ExpressionStart: RawTokenKindSubset {
807808
self = .matchingPatternStart(subset)
808809
} else if let subset = PrimaryExpressionStart(lexeme: lexeme) {
809810
self = .primaryExpressionStart(subset)
811+
} else if let subset = IfOrSwitch(lexeme: lexeme) {
812+
self = .ifOrSwitch(subset)
810813
} else {
811814
return nil
812815
}
@@ -817,6 +820,7 @@ enum ExpressionStart: RawTokenKindSubset {
817820
+ ExpressionPrefixOperator.allCases.map(Self.expressionPrefixOperator)
818821
+ MatchingPatternStart.allCases.map(Self.matchingPatternStart)
819822
+ PrimaryExpressionStart.allCases.map(Self.primaryExpressionStart)
823+
+ IfOrSwitch.allCases.map(Self.ifOrSwitch)
820824
}
821825

822826
var rawTokenKind: RawTokenKind {
@@ -825,6 +829,7 @@ enum ExpressionStart: RawTokenKindSubset {
825829
case .expressionPrefixOperator(let underlyingKind): return underlyingKind.rawTokenKind
826830
case .matchingPatternStart(let underlyingKind): return underlyingKind.rawTokenKind
827831
case .primaryExpressionStart(let underlyingKind): return underlyingKind.rawTokenKind
832+
case .ifOrSwitch(let underlyingKind): return underlyingKind.rawTokenKind
828833
}
829834
}
830835
}

Sources/SwiftParser/TopLevel.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,9 @@ extension Parser {
197197
// We could also achieve this by more eagerly attempting to parse an 'if'
198198
// or 'switch' as an expression when in statement position, but that
199199
// could result in less useful recovery behavior.
200-
if at(.keyword(.as)), let stmtExpr = stmt.as(RawExpressionStmtSyntax.self) {
201-
let expr = stmtExpr.expression
200+
if at(.keyword(.as)),
201+
let expr = stmt.as(RawExpressionStmtSyntax.self)?.expression
202+
{
202203
if expr.is(RawIfExprSyntax.self) || expr.is(RawSwitchExprSyntax.self) {
203204
let (op, rhs) = parseUnresolvedAsExpr(
204205
handle: .init(tokenKind: .keyword(.as))

0 commit comments

Comments
 (0)