Skip to content

Commit 93f56af

Browse files
committed
Fix isEnumCase helper bug
1 parent 89761e4 commit 93f56af

4 files changed

Lines changed: 65 additions & 2 deletions

File tree

Sources/ParsingHelpers.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -838,10 +838,12 @@ extension Formatter {
838838

839839
func isEnumCase(at i: Int) -> Bool {
840840
assert(tokens[i] == .keyword("case"))
841-
if last(.keyword, before: i) == .keyword("case") {
841+
switch last(.nonSpaceOrCommentOrLinebreak, before: i) {
842+
case .identifier?, .endOfScope(")")?, .startOfScope("{")?:
842843
return true
844+
default:
845+
return false
843846
}
844-
return last(.nonSpaceOrCommentOrLinebreak, before: i) == .startOfScope("{")
845847
}
846848

847849
struct ImportRange: Comparable {

Tests/ParsingHelpersTests.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,13 +573,50 @@ class ParsingHelpersTests: XCTestCase {
573573
XCTAssert(formatter.isEnumCase(at: 15))
574574
}
575575

576+
func testIsEnumCaseWithValue() {
577+
let formatter = Formatter(tokenize("""
578+
enum Foo {
579+
case foo, bar(Int)
580+
case baz
581+
}
582+
"""))
583+
XCTAssert(formatter.isEnumCase(at: 7))
584+
XCTAssert(formatter.isEnumCase(at: 18))
585+
}
586+
576587
func testIsNotEnumCase() {
588+
let formatter = Formatter(tokenize("""
589+
if case let .foo(bar) = baz {}
590+
"""))
591+
XCTAssertFalse(formatter.isEnumCase(at: 2))
592+
}
593+
594+
func testTypoIsNotEnumCase() {
577595
let formatter = Formatter(tokenize("""
578596
if let case .foo(bar) = baz {}
579597
"""))
580598
XCTAssertFalse(formatter.isEnumCase(at: 4))
581599
}
582600

601+
func testMixedCaseTypes() {
602+
let formatter = Formatter(tokenize("""
603+
enum Foo {
604+
case foo
605+
case bar(value: [Int])
606+
}
607+
608+
func baz() {
609+
if case .foo = foo,
610+
case .bar(let value) = bar,
611+
value.isEmpty {}
612+
}
613+
"""))
614+
XCTAssert(formatter.isEnumCase(at: 7))
615+
XCTAssert(formatter.isEnumCase(at: 12))
616+
XCTAssertFalse(formatter.isEnumCase(at: 38))
617+
XCTAssertFalse(formatter.isEnumCase(at: 49))
618+
}
619+
583620
// MARK: modifierOrder
584621

585622
func testModifierOrder() {

Tests/RulesTests+Wrapping.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2777,6 +2777,26 @@ extension RulesTests {
27772777
testFormatting(for: input, rule: FormatRules.wrapEnumCases)
27782778
}
27792779

2780+
func testNoConfuseIfCaseWithEnum() {
2781+
let input = """
2782+
enum Foo {
2783+
case foo
2784+
case bar(value: [Int])
2785+
}
2786+
2787+
func baz() {
2788+
if case .foo = foo,
2789+
case .bar(let value) = bar,
2790+
value.isEmpty
2791+
{
2792+
print("")
2793+
}
2794+
}
2795+
"""
2796+
testFormatting(for: input, rule: FormatRules.wrapEnumCases,
2797+
exclude: ["hoistPatternLet"])
2798+
}
2799+
27802800
// MARK: wrapSwitchCases
27812801

27822802
func testMultilineSwitchCases() {

Tests/XCTestManifests.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,9 @@ extension ParsingHelpersTests {
384384
("testInitAllmanBracesNotTreatedAsClosure", testInitAllmanBracesNotTreatedAsClosure),
385385
("testInitBracesNotTreatedAsClosure", testInitBracesNotTreatedAsClosure),
386386
("testIsEnumCase", testIsEnumCase),
387+
("testIsEnumCaseWithValue", testIsEnumCaseWithValue),
387388
("testIsNotEnumCase", testIsNotEnumCase),
389+
("testMixedCaseTypes", testMixedCaseTypes),
388390
("testModifierOrder", testModifierOrder),
389391
("testModifierOrder2", testModifierOrder2),
390392
("testMultipleNestedTrailingClosures", testMultipleNestedTrailingClosures),
@@ -437,6 +439,7 @@ extension ParsingHelpersTests {
437439
("testThrowingFunctionWithWhereClauseBracesNotTreatedAsClosure", testThrowingFunctionWithWhereClauseBracesNotTreatedAsClosure),
438440
("testTupleReturningFunctionBracesNotTreatedAsClosure", testTupleReturningFunctionBracesNotTreatedAsClosure),
439441
("testTypedVarAssignmentBracesTreatedAsClosure", testTypedVarAssignmentBracesTreatedAsClosure),
442+
("testTypoIsNotEnumCase", testTypoIsNotEnumCase),
440443
("testVarAssignmentBracesTreatedAsClosure", testVarAssignmentBracesTreatedAsClosure),
441444
("testVarAssignmentBracesTreatedAsClosure2", testVarAssignmentBracesTreatedAsClosure2),
442445
("testVarDidSetBracesNotTreatedAsClosure", testVarDidSetBracesNotTreatedAsClosure),
@@ -1153,6 +1156,7 @@ extension RulesTests {
11531156
("testNoBlanksInsideClassFunc", testNoBlanksInsideClassFunc),
11541157
("testNoBlanksInsideClassVar", testNoBlanksInsideClassVar),
11551158
("testNoConfuseCaseWithModifier", testNoConfuseCaseWithModifier),
1159+
("testNoConfuseIfCaseWithEnum", testNoConfuseIfCaseWithEnum),
11561160
("testNoConfusePostfixIdentifierWithKeyword", testNoConfusePostfixIdentifierWithKeyword),
11571161
("testNoConfusePostfixIdentifierWithKeyword2", testNoConfusePostfixIdentifierWithKeyword2),
11581162
("testNoConvertVoidSelfToTuple", testNoConvertVoidSelfToTuple),

0 commit comments

Comments
 (0)