Skip to content

Commit 2a723d0

Browse files
kimdvSimplyDanny
andauthored
Add new option max_number_of_single_line_parameters to multiline_parameters rule (#5781)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
1 parent c784adc commit 2a723d0

File tree

5 files changed

+92
-0
lines changed

5 files changed

+92
-0
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@
3232
[SimplyDanny](https://github.com/SimplyDanny)
3333
[#5774](https://github.com/realm/SwiftLint/issues/5774)
3434

35+
* Add new option `max_number_of_single_line_parameters` that allows only the specified maximum
36+
number of parameters to be on one line when `allows_single_line = true`. If the limit is
37+
exceeded, the rule will still trigger. Confusing option combinations like `allows_single_line = false`
38+
together with `max_number_of_single_line_parameters > 1` will be reported.
39+
[kimdv](https://github.com/kimdv)
40+
[SimplyDanny](https://github.com/SimplyDanny)
41+
[#5781](https://github.com/realm/SwiftLint/issues/5781)
42+
3543
* The `redundant_type_annotation` rule gains a new option,
3644
`ignore_properties`, that skips enforcement on members in a
3745
type declaration (like a `struct`). This helps the rule coexist with

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/MultilineParametersConfiguration.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,29 @@ struct MultilineParametersConfiguration: SeverityBasedRuleConfiguration {
88
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
99
@ConfigurationElement(key: "allows_single_line")
1010
private(set) var allowsSingleLine = true
11+
@ConfigurationElement(key: "max_number_of_single_line_parameters")
12+
private(set) var maxNumberOfSingleLineParameters: Int?
13+
14+
func validate() throws {
15+
guard let maxNumberOfSingleLineParameters else {
16+
return
17+
}
18+
guard maxNumberOfSingleLineParameters >= 1 else {
19+
Issue.inconsistentConfiguration(
20+
ruleID: Parent.identifier,
21+
message: "Option '\($maxNumberOfSingleLineParameters.key)' should be >= 1."
22+
).print()
23+
return
24+
}
25+
26+
if maxNumberOfSingleLineParameters > 1, !allowsSingleLine {
27+
Issue.inconsistentConfiguration(
28+
ruleID: Parent.identifier,
29+
message: """
30+
Option '\($maxNumberOfSingleLineParameters.key)' has no effect when \
31+
'\($allowsSingleLine.key)' is false.
32+
"""
33+
).print()
34+
}
35+
}
1136
}

Source/SwiftLintBuiltInRules/Rules/Style/MultilineParametersRule.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ private extension MultilineParametersRule {
4343
numberOfParameters += 1
4444
}
4545

46+
if let maxNumberOfSingleLineParameters = configuration.maxNumberOfSingleLineParameters,
47+
configuration.allowsSingleLine,
48+
numberOfParameters > maxNumberOfSingleLineParameters {
49+
return true
50+
}
51+
4652
guard linesWithParameters.count > (configuration.allowsSingleLine ? 1 : 0),
4753
numberOfParameters != linesWithParameters.count else {
4854
return false

Source/SwiftLintBuiltInRules/Rules/Style/MultilineParametersRuleExamples.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,13 @@ internal struct MultilineParametersRuleExamples {
197197
) { }
198198
}
199199
""", configuration: ["allows_single_line": false]),
200+
Example("func foo(param1: Int, param2: Bool, param3: [String]) { }",
201+
configuration: ["max_number_of_single_line_parameters": 3]),
202+
Example("""
203+
func foo(param1: Int,
204+
param2: Bool,
205+
param3: [String]) { }
206+
""", configuration: ["max_number_of_single_line_parameters": 3]),
200207
]
201208

202209
static let triggeringExamples: [Example] = [
@@ -336,5 +343,12 @@ internal struct MultilineParametersRuleExamples {
336343
configuration: ["allows_single_line": false]),
337344
Example("func ↓foo(param1: Int, param2: Bool, param3: [String]) { }",
338345
configuration: ["allows_single_line": false]),
346+
Example("func ↓foo(param1: Int, param2: Bool, param3: [String]) { }",
347+
configuration: ["max_number_of_single_line_parameters": 2]),
348+
Example("""
349+
func ↓foo(param1: Int,
350+
param2: Bool, param3: [String]) { }
351+
""",
352+
configuration: ["max_number_of_single_line_parameters": 3]),
339353
]
340354
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
@testable import SwiftLintBuiltInRules
2+
@testable import SwiftLintCore
3+
import XCTest
4+
5+
final class MultilineParametersConfigurationTests: SwiftLintTestCase {
6+
func testInvalidMaxNumberOfSingleLineParameters() throws {
7+
for maxNumberOfSingleLineParameters in [0, -1] {
8+
var config = MultilineParametersConfiguration()
9+
10+
XCTAssertEqual(
11+
try Issue.captureConsole {
12+
try config.apply(
13+
configuration: ["max_number_of_single_line_parameters": maxNumberOfSingleLineParameters]
14+
)
15+
},
16+
"""
17+
warning: Inconsistent configuration for 'multiline_parameters' rule: Option \
18+
'max_number_of_single_line_parameters' should be >= 1.
19+
"""
20+
)
21+
}
22+
}
23+
24+
func testInvalidMaxNumberOfSingleLineParametersWithSingleLineEnabled() throws {
25+
var config = MultilineParametersConfiguration()
26+
27+
XCTAssertEqual(
28+
try Issue.captureConsole {
29+
try config.apply(
30+
configuration: ["max_number_of_single_line_parameters": 2, "allows_single_line": false]
31+
)
32+
},
33+
"""
34+
warning: Inconsistent configuration for 'multiline_parameters' rule: Option \
35+
'max_number_of_single_line_parameters' has no effect when 'allows_single_line' is false.
36+
"""
37+
)
38+
}
39+
}

0 commit comments

Comments
 (0)