mirror of
https://github.com/realm/SwiftLint.git
synced 2026-06-06 20:18:40 +00:00
40828dff03
* master: (41 commits) Fix formatting in CHANGELOG.md release 0.13.0 Update CHANGELOG.md Fix check for trailing whitespace to return early Fix checks for some inline comments Replace check for comments to use SyntaxKind Add configuration for trailing_whitespace to ignore comments Unwanted space removed - Lint issues fixed Updated HTML Reporter PR feedback Add check on autocorrect for disabled range Use `utf8.count` instead of `utf16.count` to byte range Re-write `ExplicitInitRule` to `ASTRule` added ExplicitInitRule Updated CHANGELOG HTML Reporter added HTML Reporter added Adds information about SwiftLint plugin for AppCode into README.md added reasons why a new rule should be opt in ... # Conflicts: # Source/SwiftLintFramework/Extensions/File+SwiftLint.swift # Source/SwiftLintFramework/Extensions/Structure+SwiftLint.swift # Source/SwiftLintFramework/Rules/ColonRule.swift # Source/SwiftLintFramework/Rules/CommaRule.swift # Source/SwiftLintFramework/Rules/LegacyCGGeometryFunctionsRule.swift # Source/SwiftLintFramework/Rules/LegacyConstantRule.swift # Source/SwiftLintFramework/Rules/LegacyConstructorRule.swift # Source/SwiftLintFramework/Rules/LegacyNSGeometryFunctionsRule.swift # Source/SwiftLintFramework/Rules/LineLengthRule.swift # Source/SwiftLintFramework/Rules/OperatorFunctionWhitespaceRule.swift # Source/SwiftLintFramework/Rules/ReturnArrowWhitespaceRule.swift # Source/SwiftLintFramework/Rules/RuleConfigurations/StatementPositionConfiguration.swift # Source/SwiftLintFramework/Rules/StatementPositionRule.swift # Source/SwiftLintFramework/Rules/TrailingWhitespaceRule.swift # Tests/SwiftLintFramework/RuleConfigurationTests.swift
103 lines
3.7 KiB
Swift
103 lines
3.7 KiB
Swift
//
|
|
// LegacyConstantRule.swift
|
|
// SwiftLint
|
|
//
|
|
// Created by Aaron McTavish on 12/01/2016.
|
|
// Copyright © 2016 Realm. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import SourceKittenFramework
|
|
|
|
public struct LegacyConstantRule: CorrectableRule, ConfigurationProviderRule {
|
|
|
|
public var configuration = SeverityConfiguration(.Warning)
|
|
|
|
public init() {}
|
|
|
|
public static let description = RuleDescription(
|
|
identifier: "legacy_constant",
|
|
name: "Legacy Constant",
|
|
description: "Struct-scoped constants are preferred over legacy global constants.",
|
|
nonTriggeringExamples: [
|
|
"CGRect.infinite",
|
|
"CGPoint.zero",
|
|
"CGRect.zero",
|
|
"CGSize.zero",
|
|
"NSPoint.zero",
|
|
"NSRect.zero",
|
|
"NSSize.zero",
|
|
"CGRect.null"
|
|
],
|
|
triggeringExamples: [
|
|
"↓CGRectInfinite",
|
|
"↓CGPointZero",
|
|
"↓CGRectZero",
|
|
"↓CGSizeZero",
|
|
"↓NSZeroPoint",
|
|
"↓NSZeroRect",
|
|
"↓NSZeroSize",
|
|
"↓CGRectNull"
|
|
],
|
|
corrections: [
|
|
"↓CGRectInfinite\n": "CGRect.infinite\n",
|
|
"↓CGPointZero\n": "CGPoint.zero\n",
|
|
"↓CGRectZero\n": "CGRect.zero\n",
|
|
"↓CGSizeZero\n": "CGSize.zero\n",
|
|
"↓NSZeroPoint\n": "NSPoint.zero\n",
|
|
"↓NSZeroRect\n": "NSRect.zero\n",
|
|
"↓NSZeroSize\n": "NSSize.zero\n",
|
|
"↓CGRectInfinite\n↓CGRectNull\n": "CGRect.infinite\nCGRect.null\n"
|
|
]
|
|
)
|
|
|
|
public func validateFile(_ file: File) -> [StyleViolation] {
|
|
let constants = ["CGRectInfinite", "CGPointZero", "CGRectZero", "CGSizeZero",
|
|
"NSZeroPoint", "NSZeroRect", "NSZeroSize", "CGRectNull"]
|
|
|
|
let pattern = "\\b(" + constants.joined(separator: "|") + ")\\b"
|
|
|
|
return file.matchPattern(pattern, withSyntaxKinds: [.identifier]).map {
|
|
StyleViolation(ruleDescription: type(of: self).description,
|
|
severity: configuration.severity,
|
|
location: Location(file: file, characterOffset: $0.location))
|
|
}
|
|
}
|
|
|
|
public func correctFile(_ file: File) -> [Correction] {
|
|
let patterns = [
|
|
"CGRectInfinite": "CGRect.infinite",
|
|
"CGPointZero": "CGPoint.zero",
|
|
"CGRectZero": "CGRect.zero",
|
|
"CGSizeZero": "CGSize.zero",
|
|
"NSZeroPoint": "NSPoint.zero",
|
|
"NSZeroRect": "NSRect.zero",
|
|
"NSZeroSize": "NSSize.zero",
|
|
"CGRectNull": "CGRect.null"
|
|
]
|
|
|
|
let description = type(of: self).description
|
|
var corrections = [Correction]()
|
|
var contents = file.contents
|
|
let matches = patterns.map({ pattern, template in
|
|
file.matchPattern(pattern, withSyntaxKinds: [.identifier])
|
|
.filter { !file.ruleEnabledViolatingRanges([$0], forRule: self).isEmpty }
|
|
.map { ($0, pattern, template) }
|
|
}).joined().sorted { $0.0.location > $1.0.location } // reversed
|
|
|
|
if matches.isEmpty { return [] }
|
|
|
|
for (range, pattern, template) in matches {
|
|
contents = regex(pattern).stringByReplacingMatches(in: contents,
|
|
options: [],
|
|
range: range,
|
|
withTemplate: template)
|
|
let location = Location(file: file, characterOffset: range.location)
|
|
corrections.append(Correction(ruleDescription: description, location: location))
|
|
}
|
|
|
|
file.write(contents)
|
|
return corrections
|
|
}
|
|
}
|