From 94c6009fc4077d69788c089a049ddb38113c4d28 Mon Sep 17 00:00:00 2001 From: Marcelo Fabri Date: Thu, 4 Jul 2019 22:23:38 -0700 Subject: [PATCH] Fix false positive in `function_default_parameter_at_end` Fixes #2788 --- CHANGELOG.md | 5 ++++ Rules.md | 5 ++++ .../FunctionDefaultParameterAtEndRule.swift | 23 +++++++++++++++---- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89349c1562..a898c195b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,11 @@ [Marcelo Fabri](https://github.com/marcelofabri) [#2792](https://github.com/realm/SwiftLint/issues/2792) +* Fix false positive in `function_default_parameter_at_end` rule when using + a closure parameter with default value. + [Marcelo Fabri](https://github.com/marcelofabri) + [#2788](https://github.com/realm/SwiftLint/issues/2788) + ## 0.33.0: Worldwide Dryers Conference #### Breaking diff --git a/Rules.md b/Rules.md index bb246b85c1..184cde8794 100644 --- a/Rules.md +++ b/Rules.md @@ -8399,6 +8399,11 @@ func foo(a: Int, b: CGFloat = 0) { } ``` +```swift +func foo(a: String, b: String? = nil, + c: String? = nil, d: @escaping AlertActionHandler = { _ in }) {} +``` +
Triggering Examples diff --git a/Source/SwiftLintFramework/Rules/Idiomatic/FunctionDefaultParameterAtEndRule.swift b/Source/SwiftLintFramework/Rules/Idiomatic/FunctionDefaultParameterAtEndRule.swift index 2efba2490b..fd5cccf6d3 100644 --- a/Source/SwiftLintFramework/Rules/Idiomatic/FunctionDefaultParameterAtEndRule.swift +++ b/Source/SwiftLintFramework/Rules/Idiomatic/FunctionDefaultParameterAtEndRule.swift @@ -26,6 +26,10 @@ public struct FunctionDefaultParameterAtEndRule: ASTRule, ConfigurationProviderR func foo(a: Int, b: CGFloat = 0) { let block = { (error: Error?) in } } + """, + """ + func foo(a: String, b: String? = nil, + c: String? = nil, d: @escaping AlertActionHandler = { _ in }) {} """ ], triggeringExamples: [ @@ -43,13 +47,22 @@ public struct FunctionDefaultParameterAtEndRule: ASTRule, ConfigurationProviderR } let isNotClosure = { !self.isClosureParameter(dictionary: $0) } - let params = dictionary.enclosedVarParameters.filter(isNotClosure).filter { param in - guard let paramOffset = param.offset else { - return false + let params = dictionary.substructure + .flatMap { subDict -> [[String: SourceKitRepresentable]] in + guard subDict.kind.flatMap(SwiftDeclarationKind.init) == .varParameter else { + return [] + } + + return [subDict] } + .filter(isNotClosure) + .filter { param in + guard let paramOffset = param.offset else { + return false + } - return paramOffset < bodyOffset - } + return paramOffset < bodyOffset + } guard !params.isEmpty else { return []