From 042d0916198b0e288f1eff7ab3b95928c756d938 Mon Sep 17 00:00:00 2001 From: Nick Lockwood Date: Sun, 2 Aug 2020 22:52:16 +0100 Subject: [PATCH] Fix bug in isStartOfClosure affecting self removal --- Snapshots/Issues/678.swift | 19 +++++++++++++++++++ Sources/ParsingHelpers.swift | 10 +++++++--- Tests/ParsingHelpersTests.swift | 5 +++++ Tests/XCTestManifests.swift | 1 + 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 Snapshots/Issues/678.swift diff --git a/Snapshots/Issues/678.swift b/Snapshots/Issues/678.swift new file mode 100644 index 00000000..734114c3 --- /dev/null +++ b/Snapshots/Issues/678.swift @@ -0,0 +1,19 @@ +// swiftformat:options --swiftversion 5.2 + +final class Value { + private let provider: () -> T + + init(provider: @escaping () -> T) { + self.provider = provider + } +} + +final class Consumer { + private(set) lazy var value = Value { [unowned self] in + self.someProvider() + } + + private func someProvider() -> String { + "string" + } +} diff --git a/Sources/ParsingHelpers.swift b/Sources/ParsingHelpers.swift index cd5ee90f..44f89dd5 100644 --- a/Sources/ParsingHelpers.swift +++ b/Sources/ParsingHelpers.swift @@ -325,12 +325,16 @@ extension Formatter { return false } return !isStartOfClosure(at: startOfScope) - case .endOfScope(")"): - guard let startOfScope = index(of: .startOfScope("("), before: prevIndex), - let prev = index(of: .nonSpaceOrCommentOrLinebreak, before: startOfScope) + case .endOfScope(")"), .endOfScope(">"): + guard var startOfScope = index(of: .startOfScope, before: prevIndex), + var prev = index(of: .nonSpaceOrCommentOrLinebreak, before: startOfScope) else { return true } + if tokens[prevIndex] == .endOfScope(">"), tokens[prev] == .endOfScope(")") { + startOfScope = index(of: .startOfScope, before: prev) ?? startOfScope + prev = index(of: .nonSpaceOrCommentOrLinebreak, before: startOfScope) ?? prev + } switch tokens[prev] { case .identifier: prevIndex = prev diff --git a/Tests/ParsingHelpersTests.swift b/Tests/ParsingHelpersTests.swift index 09f4e586..e245d0da 100644 --- a/Tests/ParsingHelpersTests.swift +++ b/Tests/ParsingHelpersTests.swift @@ -389,6 +389,11 @@ class ParsingHelpersTests: XCTestCase { XCTAssertFalse(formatter.isStartOfClosure(at: 25)) } + func testClosureAfterGenericType() { + let formatter = Formatter(tokenize("let foo = Foo {}")) + XCTAssert(formatter.isStartOfClosure(at: 11)) + } + // MARK: isAccessorKeyword func testDidSet() { diff --git a/Tests/XCTestManifests.swift b/Tests/XCTestManifests.swift index 13c129ca..80eceb79 100644 --- a/Tests/XCTestManifests.swift +++ b/Tests/XCTestManifests.swift @@ -327,6 +327,7 @@ extension ParsingHelpersTests { ("testChainedTrailingClosureInVarChain2", testChainedTrailingClosureInVarChain2), ("testChainedTrailingClosureInVarChain3", testChainedTrailingClosureInVarChain3), ("testClassBracesNotTreatedAsClosure", testClassBracesNotTreatedAsClosure), + ("testClosureAfterGenericType", testClosureAfterGenericType), ("testClosureInsideIfCondition", testClosureInsideIfCondition), ("testComputedVarAllmanBracesNotTreatedAsClosure", testComputedVarAllmanBracesNotTreatedAsClosure), ("testComputedVarBracesNotTreatedAsClosure", testComputedVarBracesNotTreatedAsClosure),