From fd71465cd28544c9971bf9806aa76487117eb38a Mon Sep 17 00:00:00 2001 From: Marcelo Fabri Date: Sun, 27 Nov 2016 16:26:32 -0200 Subject: [PATCH 1/4] Add support for filePrivate and open in rules Fixes #781 and #831 --- CHANGELOG.md | 8 ++++++++ .../Extensions/String+SwiftLint.swift | 8 ++++++-- .../Rules/MissingDocsRule.swift | 19 ++++++++++++++++++- .../Rules/PrivateOutletRule.swift | 17 +++++++++++++---- .../Rules/PrivateUnitTestRule.swift | 6 +++--- 5 files changed, 48 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5f409abf7..dfd8f7f9ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,14 @@ the `mandatory_comma` configuration. [Marcelo Fabri](https://github.com/marcelofabri) [#883](https://github.com/realm/SwiftLint/issues/883) + +* Add support for `fileprivate` on `PrivateOutletRule`. + [Marcelo Fabri](https://github.com/marcelofabri) + [#831](https://github.com/realm/SwiftLint/issues/831) + +* Add support for `fileprivate` on `PrivateUnitTestRule`. + [Marcelo Fabri](https://github.com/marcelofabri) + [#781](https://github.com/realm/SwiftLint/issues/781) ##### Bug Fixes diff --git a/Source/SwiftLintFramework/Extensions/String+SwiftLint.swift b/Source/SwiftLintFramework/Extensions/String+SwiftLint.swift index 0725b0b9e7..c7e3468515 100644 --- a/Source/SwiftLintFramework/Extensions/String+SwiftLint.swift +++ b/Source/SwiftLintFramework/Extensions/String+SwiftLint.swift @@ -32,8 +32,12 @@ extension String { internal func nameStrippingLeadingUnderscoreIfPrivate(dict: [String: SourceKitRepresentable]) -> String { - let privateACL = "source.lang.swift.accessibility.private" - if dict["key.accessibility"] as? String == privateACL && characters.first == "_" { + guard let acl = (dict["key.accessibility"] as? String) + .flatMap(AccessControlLevel.init(identifier:)) else { + return self + } + + if acl.isPrivate && characters.first == "_" { return self[startIndex.successor()..] diff --git a/Source/SwiftLintFramework/Rules/PrivateOutletRule.swift b/Source/SwiftLintFramework/Rules/PrivateOutletRule.swift index 6acb940a0f..2cf6a560fa 100644 --- a/Source/SwiftLintFramework/Rules/PrivateOutletRule.swift +++ b/Source/SwiftLintFramework/Rules/PrivateOutletRule.swift @@ -46,10 +46,11 @@ public struct PrivateOutletRule: ASTRule, OptInRule, ConfigurationProviderRule { guard isOutlet else { return [] } // Check if private - let accessibility = (dictionary["key.accessibility"] as? String) ?? "" - let setterAccessiblity = (dictionary["key.setter_accessibility"] as? String) ?? "" - let isPrivate = accessibility == "source.lang.swift.accessibility.private" - let isPrivateSet = setterAccessiblity == "source.lang.swift.accessibility.private" + let accessibility = dictionary["key.accessibility"] as? String + let setterAccessiblity = dictionary["key.setter_accessibility"] as? String + + let isPrivate = isPrivateLevel(accessibility) + let isPrivateSet = isPrivateLevel(setterAccessiblity) if isPrivate || (self.configuration.allowPrivateSet && isPrivateSet) { return [] @@ -70,4 +71,12 @@ public struct PrivateOutletRule: ASTRule, OptInRule, ConfigurationProviderRule { ) ] } + + private func isPrivateLevel(identifier: String?) -> Bool { + guard let accessibility = identifier.flatMap(AccessControlLevel.init(identifier:)) else { + return false + } + + return accessibility.isPrivate + } } diff --git a/Source/SwiftLintFramework/Rules/PrivateUnitTestRule.swift b/Source/SwiftLintFramework/Rules/PrivateUnitTestRule.swift index e8bb082c20..a732b3ef42 100644 --- a/Source/SwiftLintFramework/Rules/PrivateUnitTestRule.swift +++ b/Source/SwiftLintFramework/Rules/PrivateUnitTestRule.swift @@ -171,15 +171,15 @@ public struct PrivateUnitTestRule: ASTRule, ConfigurationProviderRule { -> [StyleViolation] { guard let acl = AccessControlLevel(dictionary) else { return [] } - switch acl { - case .Private: + if acl.isPrivate { let offset = Int(dictionary["key.offset"] as? Int64 ?? 0) return [StyleViolation( ruleDescription: self.dynamicType.description, severity: configuration.severityConfiguration.severity, location: Location(file: file, byteOffset: offset), reason: configuration.message)] - default: return [] } + + return [] } } From 0f008474f5f8af752c0cc8c37baf84ad7a30955c Mon Sep 17 00:00:00 2001 From: JP Simard Date: Mon, 28 Nov 2016 21:44:08 -0800 Subject: [PATCH 2/4] combine changelog entries for #781 and #831 --- CHANGELOG.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfd8f7f9ea..4f7dceb180 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,20 +36,18 @@ * `closure_spacing` rule now accepts empty bodies with a space. [Marcelo Fabri](https://github.com/marcelofabri) [#875](https://github.com/realm/SwiftLint/issues/875) - + * Add `TrailingCommaRule` to enforce/forbid trailing commas in arrays and dictionaries. The default is to forbid them, but this can be changed with the `mandatory_comma` configuration. [Marcelo Fabri](https://github.com/marcelofabri) [#883](https://github.com/realm/SwiftLint/issues/883) - -* Add support for `fileprivate` on `PrivateOutletRule`. - [Marcelo Fabri](https://github.com/marcelofabri) - [#831](https://github.com/realm/SwiftLint/issues/831) - -* Add support for `fileprivate` on `PrivateUnitTestRule`. + +* Add support for `fileprivate` in `PrivateOutletRule` and + `PrivateUnitTestRule`. [Marcelo Fabri](https://github.com/marcelofabri) [#781](https://github.com/realm/SwiftLint/issues/781) + [#831](https://github.com/realm/SwiftLint/issues/831) ##### Bug Fixes From 0999f6a24b3570814432a2727ff3ed01c185f8e8 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Mon, 28 Nov 2016 21:48:25 -0800 Subject: [PATCH 3/4] refactor nameStrippingLeadingUnderscoreIfPrivate --- .../SwiftLintFramework/Extensions/String+SwiftLint.swift | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Source/SwiftLintFramework/Extensions/String+SwiftLint.swift b/Source/SwiftLintFramework/Extensions/String+SwiftLint.swift index c7e3468515..a02fd874f9 100644 --- a/Source/SwiftLintFramework/Extensions/String+SwiftLint.swift +++ b/Source/SwiftLintFramework/Extensions/String+SwiftLint.swift @@ -32,12 +32,9 @@ extension String { internal func nameStrippingLeadingUnderscoreIfPrivate(dict: [String: SourceKitRepresentable]) -> String { - guard let acl = (dict["key.accessibility"] as? String) - .flatMap(AccessControlLevel.init(identifier:)) else { - return self - } - - if acl.isPrivate && characters.first == "_" { + if let aclString = dict["key.accessibility"] as? String, + let acl = AccessControlLevel(identifier: aclString) + where acl.isPrivate && characters.first == "_" { return self[startIndex.successor().. Date: Mon, 28 Nov 2016 21:51:42 -0800 Subject: [PATCH 4/4] refactor isPrivateLevel(identifier:) --- Source/SwiftLintFramework/Rules/PrivateOutletRule.swift | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Source/SwiftLintFramework/Rules/PrivateOutletRule.swift b/Source/SwiftLintFramework/Rules/PrivateOutletRule.swift index 2cf6a560fa..c3e35f0f24 100644 --- a/Source/SwiftLintFramework/Rules/PrivateOutletRule.swift +++ b/Source/SwiftLintFramework/Rules/PrivateOutletRule.swift @@ -67,16 +67,11 @@ public struct PrivateOutletRule: ASTRule, OptInRule, ConfigurationProviderRule { return [ StyleViolation(ruleDescription: self.dynamicType.description, severity: configuration.severityConfiguration.severity, - location: location - ) + location: location) ] } private func isPrivateLevel(identifier: String?) -> Bool { - guard let accessibility = identifier.flatMap(AccessControlLevel.init(identifier:)) else { - return false - } - - return accessibility.isPrivate + return identifier.flatMap(AccessControlLevel.init(identifier:))?.isPrivate ?? false } }