Skip to content

Commit 3f83de1

Browse files
committed
Add diagnostic for empty switch cases
1 parent 7ad2a4f commit 3f83de1

File tree

3 files changed

+13
-8
lines changed

3 files changed

+13
-8
lines changed

Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,10 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
10341034
addDiagnostic(node.expression, .missingExpressionInSwitchStatement, handledNodes: [node.expression.id])
10351035
}
10361036

1037+
if node.cases.isEmpty && !node.leftBrace.isMissingAllTokens && !node.rightBrace.isMissingAllTokens {
1038+
addDiagnostic(node.cases, .switchExprBodyEmpty, handledNodes: [node.cases.id])
1039+
}
1040+
10371041
return .visitChildren
10381042
}
10391043

Sources/SwiftParserDiagnostics/ParserDiagnosticMessages.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ extension DiagnosticMessage where Self == StaticParserError {
191191
public static var subscriptsCannotHaveNames: Self {
192192
.init("subscripts cannot have a name")
193193
}
194+
public static var switchExprBodyEmpty: Self {
195+
.init("'switch' statement body must have at least one 'case' or 'default' block")
196+
}
194197
public static var tooManyClosingRawStringDelimiters: Self {
195198
.init("too many '#' characters in closing delimiter")
196199
}

Tests/SwiftParserTest/translated/RecoveryTests.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -621,12 +621,12 @@ final class RecoveryTests: XCTestCase {
621621
func testRecovery46() {
622622
AssertParse(
623623
"""
624-
switch 1️⃣{
624+
switch 1️⃣{2️⃣
625625
}
626626
""",
627627
diagnostics: [
628-
DiagnosticSpec(message: "expected expression in 'switch' statement")
629-
// TODO: Old parser expected error on line 1: 'switch' statement body must have at least one 'case' or 'default' block
628+
DiagnosticSpec(locationMarker: "1️⃣", message: "expected expression in 'switch' statement"),
629+
DiagnosticSpec(locationMarker: "2️⃣", message: "'switch' statement body must have at least one 'case' or 'default' block")
630630
]
631631
)
632632
}
@@ -635,12 +635,12 @@ final class RecoveryTests: XCTestCase {
635635
AssertParse(
636636
"""
637637
switch 1️⃣
638-
{
638+
{2️⃣
639639
}
640640
""",
641641
diagnostics: [
642-
DiagnosticSpec(message: "expected expression in 'switch' statement")
643-
// TODO: Old parser expected error on line 1: 'switch' statement body must have at least one 'case' or 'default' block
642+
DiagnosticSpec(locationMarker: "1️⃣", message: "expected expression in 'switch' statement"),
643+
DiagnosticSpec(locationMarker: "2️⃣", message: "'switch' statement body must have at least one 'case' or 'default' block")
644644
]
645645
)
646646
}
@@ -669,8 +669,6 @@ final class RecoveryTests: XCTestCase {
669669
diagnostics: [
670670
DiagnosticSpec(locationMarker: "1️⃣", message: "expected expression in 'switch' statement"),
671671
// TODO: Old parser expected error on line 2: 'is' keyword required to pattern match against type name, Fix-It replacements: 10 - 10 = 'is '
672-
DiagnosticSpec(locationMarker: "2️⃣", message: "'case' can only appear inside a 'switch' statement or 'enum' declaration"),
673-
DiagnosticSpec(locationMarker: "3️⃣", message: "'case' can only appear inside a 'switch' statement or 'enum' declaration"),
674672
]
675673
)
676674
}

0 commit comments

Comments
 (0)