Skip to content

Commit ba9b120

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 32c236e commit ba9b120

File tree

5 files changed

+323
-51
lines changed

5 files changed

+323
-51
lines changed

Sources/SwiftParser/Expressions.swift

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

497-
// 'repeat' is the start of a pack expansion expression.
498-
if (self.at(.keyword(.repeat))) {
499-
return RawExprSyntax(
500-
parsePackExpansionExpr(flavor, pattern: pattern)
501-
)
502-
}
497+
switch self.currentToken.rawTokenKind {
498+
case .keyword(.repeat):
499+
// 'repeat' is the start of a pack expansion expression.
500+
return RawExprSyntax(parsePackExpansionExpr(flavor, pattern: pattern))
503501

504502
// Try parse an 'if' or 'switch' as an expression. Note we do this here in
505503
// parseUnaryExpression as we don't allow postfix syntax to hang off such
506504
// expressions to avoid ambiguities such as postfix '.member', which can
507505
// currently be parsed as a static dot member for a result builder.
508-
if self.at(.keyword(.switch)) {
506+
case .keyword(.switch):
509507
return RawExprSyntax(
510508
parseSwitchExpression(switchHandle: .constant(.keyword(.switch)))
511509
)
512-
}
513-
if self.at(.keyword(.if)) {
510+
case .keyword(.if):
514511
return RawExprSyntax(
515512
parseIfExpression(ifHandle: .constant(.keyword(.if)))
516513
)
514+
default:
515+
break
517516
}
518517

519518
switch self.at(anyIn: ExpressionPrefixOperator.self) {
@@ -2072,7 +2071,7 @@ extension Parser.Lookahead {
20722071

20732072
// If this is the start of a switch body, this isn't a trailing closure.
20742073
if self.peek().rawTokenKind == .keyword(.case) {
2075-
return false;
2074+
return false
20762075
}
20772076

20782077
// 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
@@ -575,8 +575,8 @@ enum IfOrSwitch: RawTokenKindSubset {
575575

576576
init?(lexeme: Lexer.Lexeme) {
577577
switch lexeme {
578-
case RawTokenKindMatch(.keyword(.if)): self = .ifKeyword
579-
case RawTokenKindMatch(.keyword(.switch)): self = .switchKeyword
578+
case RawTokenKindMatch(.if): self = .ifKeyword
579+
case RawTokenKindMatch(.switch): self = .switchKeyword
580580
default: return nil
581581
}
582582
}
@@ -754,6 +754,7 @@ enum ExpressionStart: RawTokenKindSubset {
754754
case expressionPrefixOperator(ExpressionPrefixOperator)
755755
case matchingPatternStart(MatchingPatternStart)
756756
case primaryExpressionStart(PrimaryExpressionStart)
757+
case ifOrSwitch(IfOrSwitch)
757758

758759
init?(lexeme: Lexer.Lexeme) {
759760
if let subset = AwaitTryMove(lexeme: lexeme) {
@@ -764,6 +765,8 @@ enum ExpressionStart: RawTokenKindSubset {
764765
self = .matchingPatternStart(subset)
765766
} else if let subset = PrimaryExpressionStart(lexeme: lexeme) {
766767
self = .primaryExpressionStart(subset)
768+
} else if let subset = IfOrSwitch(lexeme: lexeme) {
769+
self = .ifOrSwitch(subset)
767770
} else {
768771
return nil
769772
}
@@ -774,6 +777,7 @@ enum ExpressionStart: RawTokenKindSubset {
774777
+ ExpressionPrefixOperator.allCases.map(Self.expressionPrefixOperator)
775778
+ MatchingPatternStart.allCases.map(Self.matchingPatternStart)
776779
+ PrimaryExpressionStart.allCases.map(Self.primaryExpressionStart)
780+
+ IfOrSwitch.allCases.map(Self.ifOrSwitch)
777781
}
778782

779783
var rawTokenKind: RawTokenKind {
@@ -782,6 +786,7 @@ enum ExpressionStart: RawTokenKindSubset {
782786
case .expressionPrefixOperator(let underlyingKind): return underlyingKind.rawTokenKind
783787
case .matchingPatternStart(let underlyingKind): return underlyingKind.rawTokenKind
784788
case .primaryExpressionStart(let underlyingKind): return underlyingKind.rawTokenKind
789+
case .ifOrSwitch(let underlyingKind): return underlyingKind.rawTokenKind
785790
}
786791
}
787792
}

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)