Skip to content

Commit e072157

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 82de33c commit e072157

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
@@ -587,8 +587,8 @@ enum IfOrSwitch: RawTokenKindSubset {
587587

588588
init?(lexeme: Lexer.Lexeme) {
589589
switch lexeme {
590-
case RawTokenKindMatch(.keyword(.if)): self = .ifKeyword
591-
case RawTokenKindMatch(.keyword(.switch)): self = .switchKeyword
590+
case RawTokenKindMatch(.if): self = .ifKeyword
591+
case RawTokenKindMatch(.switch): self = .switchKeyword
592592
default: return nil
593593
}
594594
}
@@ -766,6 +766,7 @@ enum ExpressionStart: RawTokenKindSubset {
766766
case expressionPrefixOperator(ExpressionPrefixOperator)
767767
case matchingPatternStart(MatchingPatternStart)
768768
case primaryExpressionStart(PrimaryExpressionStart)
769+
case ifOrSwitch(IfOrSwitch)
769770

770771
init?(lexeme: Lexer.Lexeme) {
771772
if let subset = AwaitTryMove(lexeme: lexeme) {
@@ -776,6 +777,8 @@ enum ExpressionStart: RawTokenKindSubset {
776777
self = .matchingPatternStart(subset)
777778
} else if let subset = PrimaryExpressionStart(lexeme: lexeme) {
778779
self = .primaryExpressionStart(subset)
780+
} else if let subset = IfOrSwitch(lexeme: lexeme) {
781+
self = .ifOrSwitch(subset)
779782
} else {
780783
return nil
781784
}
@@ -786,6 +789,7 @@ enum ExpressionStart: RawTokenKindSubset {
786789
+ ExpressionPrefixOperator.allCases.map(Self.expressionPrefixOperator)
787790
+ MatchingPatternStart.allCases.map(Self.matchingPatternStart)
788791
+ PrimaryExpressionStart.allCases.map(Self.primaryExpressionStart)
792+
+ IfOrSwitch.allCases.map(Self.ifOrSwitch)
789793
}
790794

791795
var rawTokenKind: RawTokenKind {
@@ -794,6 +798,7 @@ enum ExpressionStart: RawTokenKindSubset {
794798
case .expressionPrefixOperator(let underlyingKind): return underlyingKind.rawTokenKind
795799
case .matchingPatternStart(let underlyingKind): return underlyingKind.rawTokenKind
796800
case .primaryExpressionStart(let underlyingKind): return underlyingKind.rawTokenKind
801+
case .ifOrSwitch(let underlyingKind): return underlyingKind.rawTokenKind
797802
}
798803
}
799804
}

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)