nicklockwood / SwiftFormat

A command-line tool and Xcode Extension for formatting Swift code
MIT License
7.9k stars 640 forks source link

Unexpected comma separator with nested array index access #914

Closed Austinpayne closed 3 years ago

Austinpayne commented 3 years ago

Given the following main.swift:

struct Foo {
    struct Bar {
        let value = 1
    }

    let bar = [Bar()]
}

let foo = Foo()
let array = [
    foo
        .bar[
            0
        ]
        .value,
]

SwiftFormat incorrectly adds a comma following the 0 array access in .bar, i.e. after swiftformat --config .swiftformat main.swift:

...
let foo = Foo()
let array = [
    foo
        .bar[
            0,
        ] // Unexpected ',' separator
        .value,
]

SwiftFormat does the correct thing in the following situation though:

...
let foo = Foo()
let array = [
    foo
        .bar[0]
        .value,
]

Version info:

$ swiftformat --version # installed via brew
0.48.0
$ uname -a
Darwin hostname 19.6.0 Darwin Kernel Version 19.6.0: Tue Jan 12 22:13:05 PST 2021; root:xnu-6153.141.16~1/RELEASE_X86_64 x86_64
SwiftFormat config ``` --allman false --binarygrouping none --decimalgrouping none --disable redundantSelf,trailingClosures --elseposition next-line --exponentcase uppercase --guardelse same-line --hexliteralcase lowercase --indent 4 --indentcase true --maxwidth 140 --self insert --semicolons never --swiftversion 5 --trimwhitespace nonblank-lines --varattributes prev-line --typeattributes prev-line --wrapparameters before-first --wrapcollections before-first --wraparguments before-first --rules andOperator --rules anyObjectProtocol --rules blankLinesAroundMark --rules blankLinesAtEndOfScope --rules blankLinesAtStartOfScope --rules blankLinesBetweenScopes --rules braces --rules consecutiveBlankLines --rules consecutiveSpaces --rules duplicateImports --rules elseOnSameLine --rules emptyBraces --rules enumNamespaces --rules extensionAccessControl --rules fileHeader --rules hoistPatternLet --rules indent --rules initCoderUnavailable --rules leadingDelimiters --rules linebreakAtEndOfFile --rules linebreaks --rules modifierOrder --rules numberFormatting --rules preferKeyPath --rules redundantBackticks --rules redundantBreak --rules redundantExtensionACL --rules redundantFileprivate --rules redundantGet --rules redundantInit --rules redundantLet --rules redundantLetError --rules redundantNilInit --rules redundantObjc --rules redundantParens --rules redundantPattern --rules redundantRawValues --rules redundantReturn --rules redundantSelf --rules redundantType --rules redundantVoidReturnType --rules semicolons --rules sortedImports --rules spaceAroundBraces --rules spaceAroundBrackets --rules spaceAroundComments --rules spaceAroundGenerics --rules spaceAroundOperators --rules spaceAroundParens --rules spaceInsideBraces --rules spaceInsideBrackets --rules spaceInsideComments --rules spaceInsideGenerics --rules spaceInsideParens --rules strongOutlets --rules strongifiedSelf --rules todos --rules trailingClosures --rules trailingCommas --rules trailingSpace --rules unusedArguments --rules void --rules wrap --rules wrapArguments --rules wrapAttributes --rules wrapMultilineStatementBraces --rules yodaConditions ```
Austinpayne commented 3 years ago

For reference: I noticed this was broken in 0.47.13 as well.

nicklockwood commented 3 years ago

@Austinpayne thanks, I'll add a fix.

nicklockwood commented 3 years ago

@Austinpayne fixed in 0.48.1