From 4945ee29b75b204ac71e960ab3bf370870adc2f2 Mon Sep 17 00:00:00 2001 From: Marcel Jackwerth Date: Fri, 29 Sep 2017 18:20:53 +0200 Subject: [PATCH 1/7] Add MultilineArgumentsRule --- CHANGELOG.md | 4 + Rules.md | 88 +++++++++++++++++++ .../Models/MasterRuleList.swift | 1 + .../Rules/MultilineArgumentsRule.swift | 85 ++++++++++++++++++ .../MultilineArgumentsRuleExamples.swift | 39 ++++++++ SwiftLint.xcodeproj/project.pbxproj | 8 ++ Tests/LinuxMain.swift | 1 + .../SwiftLintFrameworkTests/RulesTests.swift | 4 + 8 files changed, 230 insertions(+) create mode 100644 Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift create mode 100644 Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 917536b9b..b65d9b937 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,10 @@ when running `swiftlint rules`. [JP Simard](https://github.com/jpsim) [#1002](https://github.com/realm/SwiftLint/issues/1002) +* Add `multiline_arguments` opt-in rule that warns to either keep + all the arguments of a function call on the same line, + or one per line. + [Marcel Jackwerth](https://github.com/sirlantis) ##### Bug Fixes diff --git a/Rules.md b/Rules.md index 0a0581ea8..fee173c77 100644 --- a/Rules.md +++ b/Rules.md @@ -56,6 +56,7 @@ * [Variable Declaration Whitespace](#variable-declaration-whitespace) * [Line Length](#line-length) * [Mark](#mark) +* [Multiline Arguments](#multiline-arguments) * [Multiline Parameters](#multiline-parameters) * [Multiple Closures with Trailing Closure](#multiple-closures-with-trailing-closure) * [Nesting](#nesting) @@ -6528,6 +6529,93 @@ extension MarkTest {} +## Multiline Arguments + +Identifier | Enabled by default | Supports autocorrection | Kind +--- | --- | --- | --- +`multiline_arguments` | Disabled | No | style + +Arguments should be either on the same line, or one per line. + +### Examples + +
+Non Triggering Examples + +```swift +foo() +``` + +```swift +foo(0) +``` + +```swift +foo(0, 1) +``` + +```swift +foo(0, 1) { } +``` + +```swift +foo(0, param1: 1) +``` + +```swift +foo(0, param1: 1) { } +``` + +```swift +foo(param1: 1) +``` + +```swift +foo(param1: 1) { } +``` + +```swift +foo(param1: 1, param2: true) { } +``` + +```swift +foo(param1: 1, param2: true, param3: [3]) { } +``` + +```swift +foo(param1: 1, param2: true, param3: [3]) { + bar()} +``` + +```swift +foo(param1: 1, + param2: true, + param3: [3]) +``` + +
+
+Triggering Examples + +```swift +foo(0, + param1: 1, ↓param2: true, ↓param3: [3]) +``` + +```swift +foo(0, ↓param1: 1, + param2: true, ↓param3: [3]) +``` + +```swift +foo(0, ↓param1: 1, ↓param2: true, + param3: [3]) +``` + +
+ + + ## Multiline Parameters Identifier | Enabled by default | Supports autocorrection | Kind diff --git a/Source/SwiftLintFramework/Models/MasterRuleList.swift b/Source/SwiftLintFramework/Models/MasterRuleList.swift index c0a582229..0c855ece0 100644 --- a/Source/SwiftLintFramework/Models/MasterRuleList.swift +++ b/Source/SwiftLintFramework/Models/MasterRuleList.swift @@ -64,6 +64,7 @@ public let masterRuleList = RuleList(rules: [ LetVarWhitespaceRule.self, LineLengthRule.self, MarkRule.self, + MultilineArgumentsRule.self, MultilineParametersRule.self, MultipleClosuresWithTrailingClosureRule.self, NestingRule.self, diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift new file mode 100644 index 000000000..8ad3712df --- /dev/null +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift @@ -0,0 +1,85 @@ +// +// MultilineArgumentsRule.swift +// SwiftLint +// +// Created by Marcel Jackwerth on 29/09/17. +// Copyright © 2017 Realm. All rights reserved. +// + +import Foundation +import SourceKittenFramework + +public struct MultilineArgumentsRule: ASTRule, OptInRule, ConfigurationProviderRule { + public var configuration = SeverityConfiguration(.warning) + + public init() {} + + public static let description = RuleDescription( + identifier: "multiline_arguments", + name: "Multiline Arguments", + description: "Arguments should be either on the same line, or one per line.", + kind: .style, + nonTriggeringExamples: MultilineArgumentsRuleExamples.nonTriggeringExamples, + triggeringExamples: MultilineArgumentsRuleExamples.triggeringExamples + ) + + public func validate(file: File, + kind: SwiftExpressionKind, + dictionary: [String: SourceKitRepresentable]) -> [StyleViolation] { + guard + kind == .call, + case let arguments = dictionary.enclosedArguments, + arguments.count > 1, + case let contents = file.contents.bridge() else { + return [] + } + + var visitedLines = Set() + var hasCollisions = false + + let lastIndex = arguments.count - 1 + let violatingOffsets: [Int] = arguments.enumerated().flatMap { idx, argument in + guard + let offset = argument.offset, + let (line, _) = contents.lineAndCharacter(forByteOffset: offset) else { + return nil + } + + let (firstVisit, _) = visitedLines.insert(line) + + guard !firstVisit else { + return nil + } + + // never trigger on a trailing closure + if idx == lastIndex, isTrailingClosure(dictionary: dictionary, file: file) { + return nil + } + + hasCollisions = hasCollisions || !firstVisit + + return offset + } + + guard visitedLines.count > 1 && hasCollisions else { + return [] + } + + return violatingOffsets.map { + StyleViolation(ruleDescription: type(of: self).description, + severity: configuration.severity, + location: Location(file: file, byteOffset: $0)) + } + } + + private func isTrailingClosure(dictionary: [String: SourceKitRepresentable], file: File) -> Bool { + guard let offset = dictionary.offset, + let length = dictionary.length, + case let start = min(offset, offset + length - 1), + let text = file.contents.bridge().substringWithByteRange(start: start, length: length) else { + return false + } + + return !text.hasSuffix(")") + } +} diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift new file mode 100644 index 000000000..195dcc0aa --- /dev/null +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift @@ -0,0 +1,39 @@ +// +// MultilineArgumentsRuleExamples.swift +// SwiftLint +// +// Created by Marcel Jackwerth on 29/09/17. +// Copyright © 2017 Realm. All rights reserved. +// + +import Foundation + +internal struct MultilineArgumentsRuleExamples { + static let nonTriggeringExamples = [ + "foo()", + "foo(0)", + "foo(0, 1)", + "foo(0, 1) { }", + "foo(0, param1: 1)", + "foo(0, param1: 1) { }", + "foo(param1: 1)", + "foo(param1: 1) { }", + "foo(param1: 1, param2: true) { }", + "foo(param1: 1, param2: true, param3: [3]) { }", + "foo(param1: 1, param2: true, param3: [3]) {\n" + + " bar()" + + "}", + "foo(param1: 1,\n" + + " param2: true,\n" + + " param3: [3])" + ] + + static let triggeringExamples = [ + "foo(0,\n" + + " param1: 1, ↓param2: true, ↓param3: [3])", + "foo(0, ↓param1: 1,\n" + + " param2: true, ↓param3: [3])", + "foo(0, ↓param1: 1, ↓param2: true,\n" + + " param3: [3])" + ] +} diff --git a/SwiftLint.xcodeproj/project.pbxproj b/SwiftLint.xcodeproj/project.pbxproj index b36fe4029..5cb61f8be 100644 --- a/SwiftLint.xcodeproj/project.pbxproj +++ b/SwiftLint.xcodeproj/project.pbxproj @@ -105,6 +105,8 @@ 92CCB2D71E1EEFA300C8E5A3 /* UnusedOptionalBindingRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92CCB2D61E1EEFA300C8E5A3 /* UnusedOptionalBindingRule.swift */; }; 93E0C3CE1D67BD7F007FA25D /* ConditionalReturnsOnNewlineRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93E0C3CD1D67BD7F007FA25D /* ConditionalReturnsOnNewlineRule.swift */; }; A1A6F3F21EE319ED00A9F9E2 /* ObjectLiteralConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1A6F3F11EE319ED00A9F9E2 /* ObjectLiteralConfiguration.swift */; }; + B25DCD0B1F7E9F9E0028A199 /* MultilineArgumentsRuleExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD091F7E9BB50028A199 /* MultilineArgumentsRuleExamples.swift */; }; + B25DCD0C1F7E9FA20028A199 /* MultilineArgumentsRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD071F7E9B5F0028A199 /* MultilineArgumentsRule.swift */; }; B2902A0C1D66815600BFCCF7 /* PrivateUnitTestRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2902A0B1D66815600BFCCF7 /* PrivateUnitTestRule.swift */; }; B2902A0E1D6681F700BFCCF7 /* PrivateUnitTestConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2902A0D1D6681F700BFCCF7 /* PrivateUnitTestConfiguration.swift */; }; B3935371E92E0CF3F7668303 /* CannedJunitReporterOutput.xml in Resources */ = {isa = PBXBuildFile; fileRef = B39359A325FE84B7EDD1C455 /* CannedJunitReporterOutput.xml */; }; @@ -428,6 +430,8 @@ 92CCB2D61E1EEFA300C8E5A3 /* UnusedOptionalBindingRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnusedOptionalBindingRule.swift; sourceTree = ""; }; 93E0C3CD1D67BD7F007FA25D /* ConditionalReturnsOnNewlineRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionalReturnsOnNewlineRule.swift; sourceTree = ""; }; A1A6F3F11EE319ED00A9F9E2 /* ObjectLiteralConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectLiteralConfiguration.swift; sourceTree = ""; }; + B25DCD071F7E9B5F0028A199 /* MultilineArgumentsRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRule.swift; sourceTree = ""; }; + B25DCD091F7E9BB50028A199 /* MultilineArgumentsRuleExamples.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRuleExamples.swift; sourceTree = ""; }; B2902A0B1D66815600BFCCF7 /* PrivateUnitTestRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivateUnitTestRule.swift; sourceTree = ""; }; B2902A0D1D6681F700BFCCF7 /* PrivateUnitTestConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivateUnitTestConfiguration.swift; sourceTree = ""; }; B3935001033261E5A70CE101 /* CannedEmojiReporterOutput.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CannedEmojiReporterOutput.txt; sourceTree = ""; }; @@ -1023,6 +1027,8 @@ C946FEC91EAE5E20007DD778 /* LetVarWhitespaceRule.swift */, E88DEA7B1B098D7D00A66CB0 /* LineLengthRule.swift */, 856651A61D6B395F005E6B29 /* MarkRule.swift */, + B25DCD071F7E9B5F0028A199 /* MultilineArgumentsRule.swift */, + B25DCD091F7E9BB50028A199 /* MultilineArgumentsRuleExamples.swift */, 6238AE411ED4D734006C3601 /* MultilineParametersRule.swift */, 621061BE1ED57E640082D51E /* MultilineParametersRuleExamples.swift */, BB00B4E71F5216070079869F /* MultipleClosuresWithTrailingClosureRule.swift */, @@ -1403,6 +1409,7 @@ 623E36F01F3DB1B1002E5B71 /* QuickDiscouragedCallRule.swift in Sources */, BFF028AE1CBCF8A500B38A9D /* TrailingWhitespaceConfiguration.swift in Sources */, 3B034B6E1E0BE549005D49A9 /* LineLengthConfiguration.swift in Sources */, + B25DCD0C1F7E9FA20028A199 /* MultilineArgumentsRule.swift in Sources */, D4C4A34C1DEA4FF000E0E04C /* AttributesConfiguration.swift in Sources */, 83D71E281B131ECE000395DE /* RuleDescription.swift in Sources */, D4470D571EB69225008A1B2E /* ImplicitReturnRule.swift in Sources */, @@ -1521,6 +1528,7 @@ E81619531BFC162C00946723 /* QueuedPrint.swift in Sources */, E87E4A051BFB927C00FCFE46 /* TrailingSemicolonRule.swift in Sources */, D4B472411F66486300BD6EF1 /* FallthroughRule.swift in Sources */, + B25DCD0B1F7E9F9E0028A199 /* MultilineArgumentsRuleExamples.swift in Sources */, E88198421BEA929F00333A11 /* NestingRule.swift in Sources */, D46A317F1F1CEDCD00AF914A /* UnneededParenthesesInClosureArgumentRule.swift in Sources */, D4470D591EB6B4D1008A1B2E /* EmptyEnumArgumentsRule.swift in Sources */, diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift index 9254e0301..c1ae8126b 100644 --- a/Tests/LinuxMain.swift +++ b/Tests/LinuxMain.swift @@ -392,6 +392,7 @@ extension RulesTests { ("testLegacyConstructor", testLegacyConstructor), ("testLetVarWhitespace", testLetVarWhitespace), ("testMark", testMark), + ("testMultilineArguments", testMultilineArguments), ("testMultilineParameters", testMultilineParameters), ("testMultipleClosuresWithTrailingClosure", testMultipleClosuresWithTrailingClosure), ("testNesting", testNesting), diff --git a/Tests/SwiftLintFrameworkTests/RulesTests.swift b/Tests/SwiftLintFrameworkTests/RulesTests.swift index 3017038e6..d7eb91bbf 100644 --- a/Tests/SwiftLintFrameworkTests/RulesTests.swift +++ b/Tests/SwiftLintFrameworkTests/RulesTests.swift @@ -201,6 +201,10 @@ class RulesTests: XCTestCase { verifyRule(MarkRule.description, skipCommentTests: true) } + func testMultilineArguments() { + verifyRule(MultilineArgumentsRule.description) + } + func testMultilineParameters() { verifyRule(MultilineParametersRule.description) } From 25ad3f0d1dea82984cb978686e40848a5fb34257 Mon Sep 17 00:00:00 2001 From: Marcel Jackwerth Date: Fri, 29 Sep 2017 18:35:57 +0200 Subject: [PATCH 2/7] Fix some and add more tests --- Rules.md | 24 ++++++++++++++++++- .../MultilineArgumentsRuleExamples.swift | 18 +++++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/Rules.md b/Rules.md index fee173c77..000fea062 100644 --- a/Rules.md +++ b/Rules.md @@ -6584,7 +6584,8 @@ foo(param1: 1, param2: true, param3: [3]) { } ```swift foo(param1: 1, param2: true, param3: [3]) { - bar()} + bar() +} ``` ```swift @@ -6593,6 +6594,20 @@ foo(param1: 1, param3: [3]) ``` +```swift +foo( + param1: 1, param2: true, param3: [3] +) +``` + +```swift +foo( + param1: 1, + param2: true, + param3: [3] +) +``` +
Triggering Examples @@ -6612,6 +6627,13 @@ foo(0, ↓param1: 1, ↓param2: true, param3: [3]) ``` +```swift +foo( + 0, ↓param1: 1, + param2: true, ↓param3: [3] +) +``` +
diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift index 195dcc0aa..eb8ca46d8 100644 --- a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift @@ -21,11 +21,19 @@ internal struct MultilineArgumentsRuleExamples { "foo(param1: 1, param2: true) { }", "foo(param1: 1, param2: true, param3: [3]) { }", "foo(param1: 1, param2: true, param3: [3]) {\n" + - " bar()" + + " bar()\n" + "}", "foo(param1: 1,\n" + " param2: true,\n" + - " param3: [3])" + " param3: [3])", + "foo(\n" + + " param1: 1, param2: true, param3: [3]\n" + + ")", + "foo(\n" + + " param1: 1,\n" + + " param2: true,\n" + + " param3: [3]\n" + + ")" ] static let triggeringExamples = [ @@ -34,6 +42,10 @@ internal struct MultilineArgumentsRuleExamples { "foo(0, ↓param1: 1,\n" + " param2: true, ↓param3: [3])", "foo(0, ↓param1: 1, ↓param2: true,\n" + - " param3: [3])" + " param3: [3])", + "foo(\n" + + " 0, ↓param1: 1,\n" + + " param2: true, ↓param3: [3]\n" + + ")" ] } From 4899c0b17182e61243c1de0e4775d334258697a2 Mon Sep 17 00:00:00 2001 From: Marcel Jackwerth Date: Fri, 29 Sep 2017 18:39:38 +0200 Subject: [PATCH 3/7] Add a few more examples --- Rules.md | 16 ++++++++++++++++ .../Rules/MultilineArgumentsRuleExamples.swift | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/Rules.md b/Rules.md index 000fea062..9c2196abb 100644 --- a/Rules.md +++ b/Rules.md @@ -6546,6 +6546,22 @@ Arguments should be either on the same line, or one per line. foo() ``` +```swift +foo( + +) +``` + +```swift +foo { } +``` + +```swift +foo { + +} +``` + ```swift foo(0) ``` diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift index eb8ca46d8..ecd999b0e 100644 --- a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift @@ -11,6 +11,13 @@ import Foundation internal struct MultilineArgumentsRuleExamples { static let nonTriggeringExamples = [ "foo()", + "foo(\n" + + " \n" + + ")", + "foo { }", + "foo {\n" + + " \n" + + "}", "foo(0)", "foo(0, 1)", "foo(0, 1) { }", From c435475c2ce7e7bece871bcf6bee62e7975dac6f Mon Sep 17 00:00:00 2001 From: Marcel Jackwerth Date: Sat, 30 Sep 2017 01:01:56 +0200 Subject: [PATCH 4/7] Added first_argument_location option --- .../Rules/MultilineArgumentsRule.swift | 40 ++++++----- .../MultilineArgumentsRuleConfiguration.swift | 60 ++++++++++++++++ .../MultilineArgumentsRuleExamples.swift | 2 +- SwiftLint.xcodeproj/project.pbxproj | 8 +++ Tests/LinuxMain.swift | 10 ++- .../MultilineArgumentsRuleTests.swift | 69 +++++++++++++++++++ .../SwiftLintFrameworkTests/RulesTests.swift | 4 -- 7 files changed, 169 insertions(+), 24 deletions(-) create mode 100644 Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift create mode 100644 Tests/SwiftLintFrameworkTests/MultilineArgumentsRuleTests.swift diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift index 8ad3712df..84ef52a47 100644 --- a/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift @@ -2,7 +2,7 @@ // MultilineArgumentsRule.swift // SwiftLint // -// Created by Marcel Jackwerth on 29/09/17. +// Created by Marcel Jackwerth on 09/29/17. // Copyright © 2017 Realm. All rights reserved. // @@ -10,7 +10,8 @@ import Foundation import SourceKittenFramework public struct MultilineArgumentsRule: ASTRule, OptInRule, ConfigurationProviderRule { - public var configuration = SeverityConfiguration(.warning) + public var configuration = MultilineArgumentsRuleConfiguration(firstArgumentLocation: .anyLine, + severity: SeverityConfiguration(.warning)) public init() {} @@ -30,12 +31,17 @@ public struct MultilineArgumentsRule: ASTRule, OptInRule, ConfigurationProviderR kind == .call, case let arguments = dictionary.enclosedArguments, arguments.count > 1, - case let contents = file.contents.bridge() else { + case let contents = file.contents.bridge(), + let nameOffset = dictionary.nameOffset, + let (nameLine, _) = contents.lineAndCharacter(forByteOffset: nameOffset) else { return [] } var visitedLines = Set() - var hasCollisions = false + + if configuration.firstArgumentLocation == .sameLine { + visitedLines.insert(nameLine) + } let lastIndex = arguments.count - 1 let violatingOffsets: [Int] = arguments.enumerated().flatMap { idx, argument in @@ -47,27 +53,25 @@ public struct MultilineArgumentsRule: ASTRule, OptInRule, ConfigurationProviderR let (firstVisit, _) = visitedLines.insert(line) - guard !firstVisit else { + if idx == lastIndex && isTrailingClosure(dictionary: dictionary, file: file) { return nil + } else if idx == 0 { + switch configuration.firstArgumentLocation { + case .anyLine: return nil + case .nextLine: return line > nameLine ? nil : offset + case .sameLine: return line > nameLine ? offset : nil + } + } else { + return firstVisit ? nil : offset } - - // never trigger on a trailing closure - if idx == lastIndex, isTrailingClosure(dictionary: dictionary, file: file) { - return nil - } - - hasCollisions = hasCollisions || !firstVisit - - return offset } - guard visitedLines.count > 1 && hasCollisions else { - return [] - } + // only report violations if multiline + guard visitedLines.count > 1 else { return [] } return violatingOffsets.map { StyleViolation(ruleDescription: type(of: self).description, - severity: configuration.severity, + severity: configuration.severity.severity, location: Location(file: file, byteOffset: $0)) } } diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift new file mode 100644 index 000000000..d2569e358 --- /dev/null +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift @@ -0,0 +1,60 @@ +// +// MultilineArgumentsRuleConfiguration.swift +// SwiftLint +// +// Created by Marcel Jackwerth on 9/29/17. +// Copyright © 2017 Realm. All rights reserved. +// + +import Foundation + +public struct MultilineArgumentsRuleConfiguration: RuleConfiguration, Equatable { + public enum FirstArgumentLocation: String { + case anyLine = "any_line" + case sameLine = "same_line" + case nextLine = "next_line" + + init(value: Any) throws { + guard + let string = (value as? String)?.lowercased(), + let value = FirstArgumentLocation(rawValue: string) else { + throw ConfigurationError.unknownConfiguration + } + + self = value + } + } + + private(set) var firstArgumentLocation: FirstArgumentLocation + private(set) var severity: SeverityConfiguration + + init(firstArgumentLocation: FirstArgumentLocation, severity: SeverityConfiguration) { + self.firstArgumentLocation = firstArgumentLocation + self.severity = severity + } + + public var consoleDescription: String { + return severity.consoleDescription + + ", first_argument_location: \(firstArgumentLocation)" + } + + public mutating func apply(configuration: Any) throws { + guard let configuration = configuration as? [String: Any] else { + throw ConfigurationError.unknownConfiguration + } + + if let modeString = configuration["first_argument_location"] { + try firstArgumentLocation = FirstArgumentLocation(value: modeString) + } + + if let severityString = configuration["severity"] as? String { + try severity.apply(configuration: severityString) + } + } + + public static func == (lhs: MultilineArgumentsRuleConfiguration, + rhs: MultilineArgumentsRuleConfiguration) -> Bool { + return lhs.severity == rhs.severity && + lhs.firstArgumentLocation == rhs.firstArgumentLocation + } +} diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift index ecd999b0e..194343a46 100644 --- a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleExamples.swift @@ -2,7 +2,7 @@ // MultilineArgumentsRuleExamples.swift // SwiftLint // -// Created by Marcel Jackwerth on 29/09/17. +// Created by Marcel Jackwerth on 09/29/17. // Copyright © 2017 Realm. All rights reserved. // diff --git a/SwiftLint.xcodeproj/project.pbxproj b/SwiftLint.xcodeproj/project.pbxproj index 5cb61f8be..93570e646 100644 --- a/SwiftLint.xcodeproj/project.pbxproj +++ b/SwiftLint.xcodeproj/project.pbxproj @@ -107,6 +107,8 @@ A1A6F3F21EE319ED00A9F9E2 /* ObjectLiteralConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1A6F3F11EE319ED00A9F9E2 /* ObjectLiteralConfiguration.swift */; }; B25DCD0B1F7E9F9E0028A199 /* MultilineArgumentsRuleExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD091F7E9BB50028A199 /* MultilineArgumentsRuleExamples.swift */; }; B25DCD0C1F7E9FA20028A199 /* MultilineArgumentsRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD071F7E9B5F0028A199 /* MultilineArgumentsRule.swift */; }; + B25DCD0E1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD0D1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift */; }; + B25DCD101F7EF6DC0028A199 /* MultilineArgumentsRuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD0F1F7EF6DC0028A199 /* MultilineArgumentsRuleTests.swift */; }; B2902A0C1D66815600BFCCF7 /* PrivateUnitTestRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2902A0B1D66815600BFCCF7 /* PrivateUnitTestRule.swift */; }; B2902A0E1D6681F700BFCCF7 /* PrivateUnitTestConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2902A0D1D6681F700BFCCF7 /* PrivateUnitTestConfiguration.swift */; }; B3935371E92E0CF3F7668303 /* CannedJunitReporterOutput.xml in Resources */ = {isa = PBXBuildFile; fileRef = B39359A325FE84B7EDD1C455 /* CannedJunitReporterOutput.xml */; }; @@ -432,6 +434,8 @@ A1A6F3F11EE319ED00A9F9E2 /* ObjectLiteralConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectLiteralConfiguration.swift; sourceTree = ""; }; B25DCD071F7E9B5F0028A199 /* MultilineArgumentsRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRule.swift; sourceTree = ""; }; B25DCD091F7E9BB50028A199 /* MultilineArgumentsRuleExamples.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRuleExamples.swift; sourceTree = ""; }; + B25DCD0D1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRuleConfiguration.swift; sourceTree = ""; }; + B25DCD0F1F7EF6DC0028A199 /* MultilineArgumentsRuleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRuleTests.swift; sourceTree = ""; }; B2902A0B1D66815600BFCCF7 /* PrivateUnitTestRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivateUnitTestRule.swift; sourceTree = ""; }; B2902A0D1D6681F700BFCCF7 /* PrivateUnitTestConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivateUnitTestConfiguration.swift; sourceTree = ""; }; B3935001033261E5A70CE101 /* CannedEmojiReporterOutput.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CannedEmojiReporterOutput.txt; sourceTree = ""; }; @@ -893,6 +897,7 @@ 3B63D46E1E1F09DF0057BE35 /* LineLengthRuleTests.swift */, D4C27BFF1E12DFF500DF713E /* LinterCacheTests.swift */, D4CA758E1E2DEEA500A40E8A /* NumberSeparatorRuleTests.swift */, + B25DCD0F1F7EF6DC0028A199 /* MultilineArgumentsRuleTests.swift */, 825F19D01EEFF19700969EF1 /* ObjectLiteralRuleTests.swift */, D4246D6E1F30DB260097E658 /* PrivateOverFilePrivateRuleTests.swift */, E81ADD711ED5ED9D000CD451 /* RegionTests.swift */, @@ -1029,6 +1034,7 @@ 856651A61D6B395F005E6B29 /* MarkRule.swift */, B25DCD071F7E9B5F0028A199 /* MultilineArgumentsRule.swift */, B25DCD091F7E9BB50028A199 /* MultilineArgumentsRuleExamples.swift */, + B25DCD0D1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift */, 6238AE411ED4D734006C3601 /* MultilineParametersRule.swift */, 621061BE1ED57E640082D51E /* MultilineParametersRuleExamples.swift */, BB00B4E71F5216070079869F /* MultipleClosuresWithTrailingClosureRule.swift */, @@ -1522,6 +1528,7 @@ E88DEA771B098D0C00A66CB0 /* Rule.swift in Sources */, D47079AB1DFDCF7A00027086 /* SwiftExpressionKind.swift in Sources */, 00B8D9791E2D1223004E0EEC /* LegacyConstantRuleExamples.swift in Sources */, + B25DCD0E1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift in Sources */, 24B4DF0D1D6DFDE90097803B /* RedundantNilCoalescingRule.swift in Sources */, D4130D971E16183F00242361 /* IdentifierNameRuleExamples.swift in Sources */, 7250948A1D0859260039B353 /* StatementPositionConfiguration.swift in Sources */, @@ -1612,6 +1619,7 @@ 3B63D46D1E1F05160057BE35 /* LineLengthConfigurationTests.swift in Sources */, 6C7045441C6ADA450003F15A /* SourceKitCrashTests.swift in Sources */, D4246D6F1F30DB260097E658 /* PrivateOverFilePrivateRuleTests.swift in Sources */, + B25DCD101F7EF6DC0028A199 /* MultilineArgumentsRuleTests.swift in Sources */, 3BB47D871C51DE6E00AE6A10 /* CustomRulesTests.swift in Sources */, E812249A1B04F85B001783D2 /* TestHelpers.swift in Sources */, 3B20CD0C1EB699C20069EF2E /* TypeNameRuleTests.swift in Sources */, diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift index c1ae8126b..61a8cfa6c 100644 --- a/Tests/LinuxMain.swift +++ b/Tests/LinuxMain.swift @@ -251,6 +251,14 @@ extension LinterCacheTests { ] } +extension MultilineArgumentsRuleTests { + static var allTests: [(String, (MultilineArgumentsRuleTests) -> () throws -> Void)] = [ + ("testMultilineArgumentsWithDefaultConfiguration", testMultilineArgumentsWithDefaultConfiguration), + ("testMultilineArgumentsWithWithNextLine", testMultilineArgumentsWithWithNextLine), + ("testMultilineArgumentsWithWithSameLine", testMultilineArgumentsWithWithSameLine) + ] +} + extension NumberSeparatorRuleTests { static var allTests: [(String, (NumberSeparatorRuleTests) -> () throws -> Void)] = [ ("testNumberSeparatorWithDefaultConfiguration", testNumberSeparatorWithDefaultConfiguration), @@ -392,7 +400,6 @@ extension RulesTests { ("testLegacyConstructor", testLegacyConstructor), ("testLetVarWhitespace", testLetVarWhitespace), ("testMark", testMark), - ("testMultilineArguments", testMultilineArguments), ("testMultilineParameters", testMultilineParameters), ("testMultipleClosuresWithTrailingClosure", testMultipleClosuresWithTrailingClosure), ("testNesting", testNesting), @@ -531,6 +538,7 @@ XCTMain([ testCase(LineLengthConfigurationTests.allTests), testCase(LineLengthRuleTests.allTests), testCase(LinterCacheTests.allTests), + testCase(MultilineArgumentsRuleTests.allTests), testCase(NumberSeparatorRuleTests.allTests), testCase(ObjectLiteralRuleTests.allTests), testCase(PrivateOverFilePrivateRuleTests.allTests), diff --git a/Tests/SwiftLintFrameworkTests/MultilineArgumentsRuleTests.swift b/Tests/SwiftLintFrameworkTests/MultilineArgumentsRuleTests.swift new file mode 100644 index 000000000..2a0802ea9 --- /dev/null +++ b/Tests/SwiftLintFrameworkTests/MultilineArgumentsRuleTests.swift @@ -0,0 +1,69 @@ +// +// MultilineArgumentsRuleTests.swift +// SwiftLint +// +// Created by Marcel Jackwerth on 09/29/17. +// Copyright © 2017 Realm. All rights reserved. +// + +import SwiftLintFramework +import XCTest + +class MultilineArgumentsRuleTests: XCTestCase { + + func testMultilineArgumentsWithDefaultConfiguration() { + verifyRule(MultilineArgumentsRule.description) + } + + func testMultilineArgumentsWithWithNextLine() { + let nonTriggeringExamples = [ + "foo()", + "foo(0)", + "foo(1, bar: baz) { }", + "foo(2, bar: baz) {\n}", + "foo(\n" + + " 3,\n" + + " bar: baz) { }", + "foo(\n" + + " 4, bar: baz) { }" + ] + + let triggeringExamples = [ + "foo(↓1,\n" + + " bar: baz) { }" + ] + + let description = MultilineArgumentsRule.description + .with(triggeringExamples: triggeringExamples) + .with(nonTriggeringExamples: nonTriggeringExamples) + + verifyRule(description, ruleConfiguration: ["first_argument_location": "next_line"]) + } + + func testMultilineArgumentsWithWithSameLine() { + let nonTriggeringExamples = [ + "foo()", + "foo(0)", + "foo(1, bar: 1) { }", + "foo(2, bar: 2) {\n" + + " bar()\n" + + "}", + "foo(3,\n" + + " bar: 3) { }" + ] + + let triggeringExamples = [ + "foo(\n" + + " ↓1, ↓bar: baz) { }", + "foo(\n" + + " ↓2,\n" + + " bar: baz) { }" + ] + + let description = MultilineArgumentsRule.description + .with(triggeringExamples: triggeringExamples) + .with(nonTriggeringExamples: nonTriggeringExamples) + + verifyRule(description, ruleConfiguration: ["first_argument_location": "same_line"]) + } +} diff --git a/Tests/SwiftLintFrameworkTests/RulesTests.swift b/Tests/SwiftLintFrameworkTests/RulesTests.swift index d7eb91bbf..3017038e6 100644 --- a/Tests/SwiftLintFrameworkTests/RulesTests.swift +++ b/Tests/SwiftLintFrameworkTests/RulesTests.swift @@ -201,10 +201,6 @@ class RulesTests: XCTestCase { verifyRule(MarkRule.description, skipCommentTests: true) } - func testMultilineArguments() { - verifyRule(MultilineArgumentsRule.description) - } - func testMultilineParameters() { verifyRule(MultilineParametersRule.description) } From 08dadba371b94122c2be95a05525a8bf252574b4 Mon Sep 17 00:00:00 2001 From: Marcel Jackwerth Date: Sat, 30 Sep 2017 01:11:01 +0200 Subject: [PATCH 5/7] fix CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b65d9b937..0ee533d9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ when running `swiftlint rules`. [JP Simard](https://github.com/jpsim) [#1002](https://github.com/realm/SwiftLint/issues/1002) + * Add `multiline_arguments` opt-in rule that warns to either keep all the arguments of a function call on the same line, or one per line. From b97dc5814fc901841bc653983047d823bea63ec9 Mon Sep 17 00:00:00 2001 From: Marcel Jackwerth Date: Sat, 30 Sep 2017 01:26:29 +0200 Subject: [PATCH 6/7] Refactor MultilineArgumentsRuleConfiguration --- .../Rules/MultilineArgumentsRule.swift | 5 ++-- .../MultilineArgumentsRuleConfiguration.swift | 23 +++++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift index 84ef52a47..e9c4c4ae1 100644 --- a/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift @@ -10,8 +10,7 @@ import Foundation import SourceKittenFramework public struct MultilineArgumentsRule: ASTRule, OptInRule, ConfigurationProviderRule { - public var configuration = MultilineArgumentsRuleConfiguration(firstArgumentLocation: .anyLine, - severity: SeverityConfiguration(.warning)) + public var configuration = MultilineArgumentsRuleConfiguration() public init() {} @@ -71,7 +70,7 @@ public struct MultilineArgumentsRule: ASTRule, OptInRule, ConfigurationProviderR return violatingOffsets.map { StyleViolation(ruleDescription: type(of: self).description, - severity: configuration.severity.severity, + severity: configuration.severityConfiguration.severity, location: Location(file: file, byteOffset: $0)) } } diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift index d2569e358..e61a6c556 100644 --- a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift @@ -8,6 +8,10 @@ import Foundation +private enum ConfigurationKey: String { + case firstArgumentLocation = "first_argument_location" +} + public struct MultilineArgumentsRuleConfiguration: RuleConfiguration, Equatable { public enum FirstArgumentLocation: String { case anyLine = "any_line" @@ -25,17 +29,12 @@ public struct MultilineArgumentsRuleConfiguration: RuleConfiguration, Equatable } } - private(set) var firstArgumentLocation: FirstArgumentLocation - private(set) var severity: SeverityConfiguration - - init(firstArgumentLocation: FirstArgumentLocation, severity: SeverityConfiguration) { - self.firstArgumentLocation = firstArgumentLocation - self.severity = severity - } + private(set) var severityConfiguration = SeverityConfiguration(.warning) + private(set) var firstArgumentLocation = FirstArgumentLocation.anyLine public var consoleDescription: String { - return severity.consoleDescription + - ", first_argument_location: \(firstArgumentLocation)" + return severityConfiguration.consoleDescription + + ", \(ConfigurationKey.firstArgumentLocation.rawValue): \(firstArgumentLocation.rawValue)" } public mutating func apply(configuration: Any) throws { @@ -43,18 +42,18 @@ public struct MultilineArgumentsRuleConfiguration: RuleConfiguration, Equatable throw ConfigurationError.unknownConfiguration } - if let modeString = configuration["first_argument_location"] { + if let modeString = configuration[ConfigurationKey.firstArgumentLocation.rawValue] { try firstArgumentLocation = FirstArgumentLocation(value: modeString) } if let severityString = configuration["severity"] as? String { - try severity.apply(configuration: severityString) + try severityConfiguration.apply(configuration: severityString) } } public static func == (lhs: MultilineArgumentsRuleConfiguration, rhs: MultilineArgumentsRuleConfiguration) -> Bool { - return lhs.severity == rhs.severity && + return lhs.severityConfiguration == rhs.severityConfiguration && lhs.firstArgumentLocation == rhs.firstArgumentLocation } } From e9d65e3b5d5e3f875aa0bcf88e19c85d6a2d018b Mon Sep 17 00:00:00 2001 From: Marcel Jackwerth Date: Sat, 30 Sep 2017 01:28:45 +0200 Subject: [PATCH 7/7] MultilineArgumentsRuleConfiguration -> MultilineArgumentsConfiguration --- ...ration.swift => MultilineArgumentsConfiguration.swift} | 8 ++++---- .../SwiftLintFramework/Rules/MultilineArgumentsRule.swift | 2 +- SwiftLint.xcodeproj/project.pbxproj | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) rename Source/SwiftLintFramework/Rules/{MultilineArgumentsRuleConfiguration.swift => MultilineArgumentsConfiguration.swift} (86%) diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsConfiguration.swift similarity index 86% rename from Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift rename to Source/SwiftLintFramework/Rules/MultilineArgumentsConfiguration.swift index e61a6c556..1740ccf07 100644 --- a/Source/SwiftLintFramework/Rules/MultilineArgumentsRuleConfiguration.swift +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsConfiguration.swift @@ -1,5 +1,5 @@ // -// MultilineArgumentsRuleConfiguration.swift +// MultilineArgumentsConfiguration.swift // SwiftLint // // Created by Marcel Jackwerth on 9/29/17. @@ -12,7 +12,7 @@ private enum ConfigurationKey: String { case firstArgumentLocation = "first_argument_location" } -public struct MultilineArgumentsRuleConfiguration: RuleConfiguration, Equatable { +public struct MultilineArgumentsConfiguration: RuleConfiguration, Equatable { public enum FirstArgumentLocation: String { case anyLine = "any_line" case sameLine = "same_line" @@ -51,8 +51,8 @@ public struct MultilineArgumentsRuleConfiguration: RuleConfiguration, Equatable } } - public static func == (lhs: MultilineArgumentsRuleConfiguration, - rhs: MultilineArgumentsRuleConfiguration) -> Bool { + public static func == (lhs: MultilineArgumentsConfiguration, + rhs: MultilineArgumentsConfiguration) -> Bool { return lhs.severityConfiguration == rhs.severityConfiguration && lhs.firstArgumentLocation == rhs.firstArgumentLocation } diff --git a/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift b/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift index e9c4c4ae1..44c3b2ea2 100644 --- a/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift +++ b/Source/SwiftLintFramework/Rules/MultilineArgumentsRule.swift @@ -10,7 +10,7 @@ import Foundation import SourceKittenFramework public struct MultilineArgumentsRule: ASTRule, OptInRule, ConfigurationProviderRule { - public var configuration = MultilineArgumentsRuleConfiguration() + public var configuration = MultilineArgumentsConfiguration() public init() {} diff --git a/SwiftLint.xcodeproj/project.pbxproj b/SwiftLint.xcodeproj/project.pbxproj index 93570e646..eb82b4308 100644 --- a/SwiftLint.xcodeproj/project.pbxproj +++ b/SwiftLint.xcodeproj/project.pbxproj @@ -107,7 +107,7 @@ A1A6F3F21EE319ED00A9F9E2 /* ObjectLiteralConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1A6F3F11EE319ED00A9F9E2 /* ObjectLiteralConfiguration.swift */; }; B25DCD0B1F7E9F9E0028A199 /* MultilineArgumentsRuleExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD091F7E9BB50028A199 /* MultilineArgumentsRuleExamples.swift */; }; B25DCD0C1F7E9FA20028A199 /* MultilineArgumentsRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD071F7E9B5F0028A199 /* MultilineArgumentsRule.swift */; }; - B25DCD0E1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD0D1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift */; }; + B25DCD0E1F7EF2280028A199 /* MultilineArgumentsConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD0D1F7EF2280028A199 /* MultilineArgumentsConfiguration.swift */; }; B25DCD101F7EF6DC0028A199 /* MultilineArgumentsRuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25DCD0F1F7EF6DC0028A199 /* MultilineArgumentsRuleTests.swift */; }; B2902A0C1D66815600BFCCF7 /* PrivateUnitTestRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2902A0B1D66815600BFCCF7 /* PrivateUnitTestRule.swift */; }; B2902A0E1D6681F700BFCCF7 /* PrivateUnitTestConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2902A0D1D6681F700BFCCF7 /* PrivateUnitTestConfiguration.swift */; }; @@ -434,7 +434,7 @@ A1A6F3F11EE319ED00A9F9E2 /* ObjectLiteralConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectLiteralConfiguration.swift; sourceTree = ""; }; B25DCD071F7E9B5F0028A199 /* MultilineArgumentsRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRule.swift; sourceTree = ""; }; B25DCD091F7E9BB50028A199 /* MultilineArgumentsRuleExamples.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRuleExamples.swift; sourceTree = ""; }; - B25DCD0D1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRuleConfiguration.swift; sourceTree = ""; }; + B25DCD0D1F7EF2280028A199 /* MultilineArgumentsConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsConfiguration.swift; sourceTree = ""; }; B25DCD0F1F7EF6DC0028A199 /* MultilineArgumentsRuleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultilineArgumentsRuleTests.swift; sourceTree = ""; }; B2902A0B1D66815600BFCCF7 /* PrivateUnitTestRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivateUnitTestRule.swift; sourceTree = ""; }; B2902A0D1D6681F700BFCCF7 /* PrivateUnitTestConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivateUnitTestConfiguration.swift; sourceTree = ""; }; @@ -1032,9 +1032,9 @@ C946FEC91EAE5E20007DD778 /* LetVarWhitespaceRule.swift */, E88DEA7B1B098D7D00A66CB0 /* LineLengthRule.swift */, 856651A61D6B395F005E6B29 /* MarkRule.swift */, + B25DCD0D1F7EF2280028A199 /* MultilineArgumentsConfiguration.swift */, B25DCD071F7E9B5F0028A199 /* MultilineArgumentsRule.swift */, B25DCD091F7E9BB50028A199 /* MultilineArgumentsRuleExamples.swift */, - B25DCD0D1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift */, 6238AE411ED4D734006C3601 /* MultilineParametersRule.swift */, 621061BE1ED57E640082D51E /* MultilineParametersRuleExamples.swift */, BB00B4E71F5216070079869F /* MultipleClosuresWithTrailingClosureRule.swift */, @@ -1528,7 +1528,7 @@ E88DEA771B098D0C00A66CB0 /* Rule.swift in Sources */, D47079AB1DFDCF7A00027086 /* SwiftExpressionKind.swift in Sources */, 00B8D9791E2D1223004E0EEC /* LegacyConstantRuleExamples.swift in Sources */, - B25DCD0E1F7EF2280028A199 /* MultilineArgumentsRuleConfiguration.swift in Sources */, + B25DCD0E1F7EF2280028A199 /* MultilineArgumentsConfiguration.swift in Sources */, 24B4DF0D1D6DFDE90097803B /* RedundantNilCoalescingRule.swift in Sources */, D4130D971E16183F00242361 /* IdentifierNameRuleExamples.swift in Sources */, 7250948A1D0859260039B353 /* StatementPositionConfiguration.swift in Sources */,