diff --git a/Package.swift b/Package.swift index e1e985c264..f4a6426388 100644 --- a/Package.swift +++ b/Package.swift @@ -216,7 +216,7 @@ let package = Package( ], swiftSettings: swiftFeatures + strictConcurrency ), - .testTarget( + .target( name: "TestHelpers", dependencies: [ "SwiftLintFramework" diff --git a/Source/SwiftLintBuiltInRules/Rules/Idiomatic/LegacyNSGeometryFunctionsRule.swift b/Source/SwiftLintBuiltInRules/Rules/Idiomatic/LegacyNSGeometryFunctionsRule.swift index d78eda0d89..43da42be5d 100644 --- a/Source/SwiftLintBuiltInRules/Rules/Idiomatic/LegacyNSGeometryFunctionsRule.swift +++ b/Source/SwiftLintBuiltInRules/Rules/Idiomatic/LegacyNSGeometryFunctionsRule.swift @@ -8,6 +8,12 @@ struct LegacyNSGeometryFunctionsRule: Rule { identifier: "legacy_nsgeometry_functions", name: "Legacy NSGeometry Functions", description: "Struct extension properties and methods are preferred over legacy functions", + rationale: """ + The CGRect extension properties are a more modern API (and are available on NSRect, which + is a typealias for CGRect), and are supported on all Swift platforms. + + The legacy functions are only supported on macOS and Mac Catalyst. + """, kind: .idiomatic, nonTriggeringExamples: [ Example("rect.width"), diff --git a/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFilterCountRule.swift b/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFilterCountRule.swift index e6970385c4..b34508a7a6 100644 --- a/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFilterCountRule.swift +++ b/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFilterCountRule.swift @@ -8,6 +8,10 @@ struct ContainsOverFilterCountRule: Rule { identifier: "contains_over_filter_count", name: "Contains over Filter Count", description: "Prefer `contains` over comparing `filter(where:).count` to 0", + rationale: """ + `filter` always needs to scan the entire collection, whereas `contains` can exit early as + soon as a match is found. + """, kind: .performance, nonTriggeringExamples: [">", "==", "!="].flatMap { operation in [ diff --git a/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFilterIsEmptyRule.swift b/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFilterIsEmptyRule.swift index 730196d42c..f515aa1c88 100644 --- a/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFilterIsEmptyRule.swift +++ b/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFilterIsEmptyRule.swift @@ -8,6 +8,10 @@ struct ContainsOverFilterIsEmptyRule: Rule { identifier: "contains_over_filter_is_empty", name: "Contains over Filter is Empty", description: "Prefer `contains` over using `filter(where:).isEmpty`", + rationale: """ + `filter` always needs to scan the entire collection, whereas `contains` can exit early as + soon as a match is found. + """, kind: .performance, nonTriggeringExamples: [">", "==", "!="].flatMap { operation in [ diff --git a/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFirstNotNilRule.swift b/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFirstNotNilRule.swift index 22d08b3c35..b1c06c7b71 100644 --- a/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFirstNotNilRule.swift +++ b/Source/SwiftLintBuiltInRules/Rules/Performance/ContainsOverFirstNotNilRule.swift @@ -8,6 +8,10 @@ struct ContainsOverFirstNotNilRule: Rule { identifier: "contains_over_first_not_nil", name: "Contains over First not Nil", description: "Prefer `contains` over `first(where:) != nil` and `firstIndex(where:) != nil`.", + rationale: """ + `filter` always needs to scan the entire collection, whereas `contains` can exit early as + soon as a match is found. + """, kind: .performance, nonTriggeringExamples: ["first", "firstIndex"].flatMap { method in [ diff --git a/Source/SwiftLintBuiltInRules/Rules/Performance/EmptyCountRule.swift b/Source/SwiftLintBuiltInRules/Rules/Performance/EmptyCountRule.swift index 465f592127..6d3571b7d8 100644 --- a/Source/SwiftLintBuiltInRules/Rules/Performance/EmptyCountRule.swift +++ b/Source/SwiftLintBuiltInRules/Rules/Performance/EmptyCountRule.swift @@ -12,6 +12,10 @@ struct EmptyCountRule: Rule { identifier: "empty_count", name: "Empty Count", description: "Prefer checking `isEmpty` over comparing `count` to zero", + rationale: """ + For collections that do not conform to `RandomAccessCollection`, `count` is an O(n) operation, + whereas `isEmpty` is O(1). + """, kind: .performance, nonTriggeringExamples: [ Example("var count = 0"),