Files
SwiftLint/Source/SwiftLintFramework/Rules/Performance/EmptyCountRule.swift
T

53 lines
2.1 KiB
Swift

import SourceKittenFramework
public struct EmptyCountRule: ConfigurationProviderRule, OptInRule {
public var configuration = EmptyCountConfiguration()
public init() {}
public static let description = RuleDescription(
identifier: "empty_count",
name: "Empty Count",
description: "Prefer checking `isEmpty` over comparing `count` to zero.",
kind: .performance,
nonTriggeringExamples: [
Example("var count = 0\n"),
Example("[Int]().isEmpty\n"),
Example("[Int]().count > 1\n"),
Example("[Int]().count == 1\n"),
Example("[Int]().count == 0xff\n"),
Example("[Int]().count == 0b01\n"),
Example("[Int]().count == 0o07\n"),
Example("discount == 0\n"),
Example("order.discount == 0\n")
],
triggeringExamples: [
Example("[Int]().↓count == 0\n"),
Example("[Int]().↓count > 0\n"),
Example("[Int]().↓count != 0\n"),
Example("[Int]().↓count == 0x0\n"),
Example("[Int]().↓count == 0x00_00\n"),
Example("[Int]().↓count == 0b00\n"),
Example("[Int]().↓count == 0o00\n"),
Example("↓count == 0\n")
]
)
public func validate(file: SwiftLintFile) -> [StyleViolation] {
let defaultPattern = #"\bcount\s*(==|!=|<|<=|>|>=)\s*0(\b|([box][0_]+\b){1})"#
let prefixPattern = configuration.onlyAfterDot ? #"\."# : ""
let pattern = prefixPattern + defaultPattern
// Offset the violation location in case `only_after_dot` is turned on,
// to compensate for the pattern matching the dot
let offset = configuration.onlyAfterDot ? 1 : 0
let excludingKinds = SyntaxKind.commentAndStringKinds
return file.match(pattern: pattern, excludingSyntaxKinds: excludingKinds).map {
StyleViolation(ruleDescription: Self.description,
severity: configuration.severityConfiguration.severity,
location: Location(file: file, characterOffset: $0.location + offset))
}
}
}