Skip to content

Commit

Permalink
added ExplicitInitRule
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt Taube authored and norio-nomura committed Oct 29, 2016
1 parent 21e3439 commit cec0a61
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 0 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@
[Marcelo Fabri](https://github.com/marcelofabri)
[#681](https://github.com/realm/SwiftLint/issues/681)

* Add ``ExplicitInitRule`` Opt-In rule to discourage calling ``init``
directly.
[Matt Taube](https://github.com/mtaube)
[#715](https://github.com/realm/SwiftLint/pull/715)

##### Bug Fixes

* Fixed whitespace being added to TODO messages.
Expand Down
1 change: 1 addition & 0 deletions Source/SwiftLintFramework/Models/MasterRuleList.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ public let masterRuleList = RuleList(rules:
CustomRules.self,
CyclomaticComplexityRule.self,
EmptyCountRule.self,
ExplicitInitRule.self,
FileLengthRule.self,
ForceCastRule.self,
ForceTryRule.self,
Expand Down
75 changes: 75 additions & 0 deletions Source/SwiftLintFramework/Rules/ExplicitInitRule.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
//
// ExplicitInitRule.swift
// SwiftLint
//
// Created by Matt Taube on 7/2/16.
// Copyright (c) 2016 Realm. All rights reserved.
//

import Foundation
import SourceKittenFramework

public struct ExplicitInitRule: ConfigurationProviderRule, CorrectableRule, OptInRule {

private let pattern = "\\b([A-Z][A-Za-z]*)\\.init\\("

public var configuration = SeverityConfiguration(.Warning)

public init() {}

public static let description = RuleDescription(
identifier: "explicit_init",
name: "Explicit Init",
description: "Explicitly calling .init() should be avoided.",
nonTriggeringExamples: [
"self.init(",
"self.init",
"Abc.init",
"abc.init(",
"$0.init("
],
triggeringExamples: [
"Abc.init(",
"Abc(NSURL.init(someString"
],
corrections: [
"Abc.init(": "Abc(",
"Abc(NSURL.init(someString": "Abc(NSURL(someString"
]
)

public func validateFile(file: File) -> [StyleViolation] {
return violationRangesInFile(file).flatMap { range in
return StyleViolation(ruleDescription: self.dynamicType.description,
severity: configuration.severity,
location: Location(file: file, characterOffset: range.location))
}
}

private func violationRangesInFile(file: File) -> [NSRange] {
let excludingKinds = SyntaxKind.commentAndStringKinds()

return file.matchPattern(pattern, excludingSyntaxKinds: excludingKinds)
}

public func correctFile(file: File) -> [Correction] {
let matches = violationRangesInFile(file)
guard !matches.isEmpty else { return [] }

let regularExpression = regex(pattern)
let description = self.dynamicType.description
var corrections = [Correction]()
var contents = file.contents
for range in matches.reverse() {
contents = regularExpression.stringByReplacingMatchesInString(contents,
options: [],
range: range,
withTemplate: "$1(")
let location = Location(file: file, characterOffset: range.location)
corrections.append(Correction(ruleDescription: description, location: location))
}

file.write(contents)
return corrections
}
}
4 changes: 4 additions & 0 deletions SwiftLint.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
6CCFCF301CFEF742003239EB /* Yaml.framework in Embed Frameworks into SwiftLintFramework.framework */ = {isa = PBXBuildFile; fileRef = E89376AC1B8A701E0025708E /* Yaml.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
7250948A1D0859260039B353 /* StatementPositionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 725094881D0855760039B353 /* StatementPositionConfiguration.swift */; };
78F032461D7C877E00BE709A /* OverridenSuperCallRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78F032441D7C877800BE709A /* OverridenSuperCallRule.swift */; };
7C0C2E7A1D2866CB0076435A /* ExplicitInitRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C0C2E791D2866CB0076435A /* ExplicitInitRule.swift */; };
78F032481D7D614300BE709A /* OverridenSuperCallConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78F032471D7D614300BE709A /* OverridenSuperCallConfiguration.swift */; };
83894F221B0C928A006214E1 /* RulesCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83894F211B0C928A006214E1 /* RulesCommand.swift */; };
83D71E281B131ECE000395DE /* RuleDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83D71E261B131EB5000395DE /* RuleDescription.swift */; };
Expand Down Expand Up @@ -228,6 +229,7 @@
6CC4259A1C77046200AEA885 /* SyntaxMap+SwiftLint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SyntaxMap+SwiftLint.swift"; sourceTree = "<group>"; };
725094881D0855760039B353 /* StatementPositionConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatementPositionConfiguration.swift; sourceTree = "<group>"; };
78F032441D7C877800BE709A /* OverridenSuperCallRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverridenSuperCallRule.swift; sourceTree = "<group>"; };
7C0C2E791D2866CB0076435A /* ExplicitInitRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExplicitInitRule.swift; sourceTree = "<group>"; };
78F032471D7D614300BE709A /* OverridenSuperCallConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverridenSuperCallConfiguration.swift; sourceTree = "<group>"; };
83894F211B0C928A006214E1 /* RulesCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RulesCommand.swift; sourceTree = "<group>"; };
83D71E261B131EB5000395DE /* RuleDescription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RuleDescription.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -614,6 +616,7 @@
3B1DF0111C5148140011BCED /* CustomRules.swift */,
2E02005E1C54BF680024D09D /* CyclomaticComplexityRule.swift */,
E847F0A81BFBBABD00EA9363 /* EmptyCountRule.swift */,
7C0C2E791D2866CB0076435A /* ExplicitInitRule.swift */,
E88DEA891B0992B300A66CB0 /* FileLengthRule.swift */,
E88DEA7F1B09903300A66CB0 /* ForceCastRule.swift */,
E816194D1BFBFEAB00946723 /* ForceTryRule.swift */,
Expand Down Expand Up @@ -964,6 +967,7 @@
D47A510E1DB29EEB00A4CC21 /* SwitchCaseOnNewlineRule.swift in Sources */,
E88DEA6F1B09843F00A66CB0 /* Location.swift in Sources */,
93E0C3CE1D67BD7F007FA25D /* ConditionalReturnsOnNewline.swift in Sources */,
7C0C2E7A1D2866CB0076435A /* ExplicitInitRule.swift in Sources */,
E88DEA771B098D0C00A66CB0 /* Rule.swift in Sources */,
24B4DF0D1D6DFDE90097803B /* RedundantNilCoalesingRule.swift in Sources */,
7250948A1D0859260039B353 /* StatementPositionConfiguration.swift in Sources */,
Expand Down
4 changes: 4 additions & 0 deletions Tests/SwiftLintFramework/RulesTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ class RulesTests: XCTestCase {
verifyRule(EmptyCountRule.description)
}

func testExplicitInit() {
verifyRule(ExplicitInitRule.description)
}

func testFileLength() {
verifyRule(FileLengthRule.description, commentDoesntViolate: false)
}
Expand Down

0 comments on commit cec0a61

Please sign in to comment.