Revert "Allow to initialize Examples by string literals (#5154)" (#5155)

This reverts commit 56461c3ab4.
This commit is contained in:
Danny Mösch
2023-08-04 00:03:26 +02:00
committed by GitHub
parent 56461c3ab4
commit 85c4a3a03d
32 changed files with 487 additions and 493 deletions
@@ -9,16 +9,16 @@ struct DiscouragedObjectLiteralRule: SwiftSyntaxRule, OptInRule, ConfigurationPr
description: "Prefer initializers over object literals",
kind: .idiomatic,
nonTriggeringExamples: [
"let image = UIImage(named: aVariable)",
"let image = UIImage(named: \"interpolated \\(variable)\")",
"let color = UIColor(red: value, green: value, blue: value, alpha: 1)",
"let image = NSImage(named: aVariable)",
"let image = NSImage(named: \"interpolated \\(variable)\")",
"let color = NSColor(red: value, green: value, blue: value, alpha: 1)"
Example("let image = UIImage(named: aVariable)"),
Example("let image = UIImage(named: \"interpolated \\(variable)\")"),
Example("let color = UIColor(red: value, green: value, blue: value, alpha: 1)"),
Example("let image = NSImage(named: aVariable)"),
Example("let image = NSImage(named: \"interpolated \\(variable)\")"),
Example("let color = NSColor(red: value, green: value, blue: value, alpha: 1)")
],
triggeringExamples: [
"let image = ↓#imageLiteral(resourceName: \"image.jpg\")",
"let color = ↓#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)"
Example("let image = ↓#imageLiteral(resourceName: \"image.jpg\")"),
Example("let color = ↓#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)")
]
)
@@ -9,22 +9,22 @@ struct ExplicitTopLevelACLRule: SwiftSyntaxRule, OptInRule, ConfigurationProvide
description: "Top-level declarations should specify Access Control Level keywords explicitly",
kind: .idiomatic,
nonTriggeringExamples: [
"internal enum A {}\n",
"public final class B {}\n",
"private struct C {}\n",
"internal enum A {\n enum B {}\n}",
"internal final class Foo {}",
"internal\nclass Foo {}",
"internal func a() {}\n",
"extension A: Equatable {}",
"extension A {}"
Example("internal enum A {}\n"),
Example("public final class B {}\n"),
Example("private struct C {}\n"),
Example("internal enum A {\n enum B {}\n}"),
Example("internal final class Foo {}"),
Example("internal\nclass Foo {}"),
Example("internal func a() {}\n"),
Example("extension A: Equatable {}"),
Example("extension A {}")
],
triggeringExamples: [
"↓enum A {}\n",
"final ↓class B {}\n",
"↓struct C {}\n",
"↓func a() {}\n",
"internal let a = 0\n↓func b() {}\n"
Example("↓enum A {}\n"),
Example("final ↓class B {}\n"),
Example("↓struct C {}\n"),
Example("↓func a() {}\n"),
Example("internal let a = 0\n↓func b() {}\n")
]
)
@@ -9,9 +9,9 @@ struct ForceCastRule: ConfigurationProviderRule, SwiftSyntaxRule {
description: "Force casts should be avoided",
kind: .idiomatic,
nonTriggeringExamples: [
"NSNumber() as? Int\n"
Example("NSNumber() as? Int\n")
],
triggeringExamples: [ "NSNumber() ↓as! Int\n" ]
triggeringExamples: [ Example("NSNumber() ↓as! Int\n") ]
)
func makeVisitor(file: SwiftLintFile) -> ViolationsSyntaxVisitor {
@@ -14,36 +14,36 @@ struct GenericTypeNameRule: SwiftSyntaxRule, ConfigurationProviderRule {
"uppercase character and span between 1 and 20 characters in length.",
kind: .idiomatic,
nonTriggeringExamples: [
"func foo<T>() {}\n",
"func foo<T>() -> T {}\n",
"func foo<T, U>(param: U) -> T {}\n",
"func foo<T: Hashable, U: Rule>(param: U) -> T {}\n",
"struct Foo<T> {}\n",
"class Foo<T> {}\n",
"enum Foo<T> {}\n",
"func run(_ options: NoOptions<CommandantError<()>>) {}\n",
"func foo(_ options: Set<type>) {}\n",
"func < <T: Comparable>(lhs: T?, rhs: T?) -> Bool\n",
"func configureWith(data: Either<MessageThread, (project: Project, backing: Backing)>)\n",
"typealias StringDictionary<T> = Dictionary<String, T>\n",
"typealias BackwardTriple<T1, T2, T3> = (T3, T2, T1)\n",
"typealias DictionaryOfStrings<T : Hashable> = Dictionary<T, String>\n"
Example("func foo<T>() {}\n"),
Example("func foo<T>() -> T {}\n"),
Example("func foo<T, U>(param: U) -> T {}\n"),
Example("func foo<T: Hashable, U: Rule>(param: U) -> T {}\n"),
Example("struct Foo<T> {}\n"),
Example("class Foo<T> {}\n"),
Example("enum Foo<T> {}\n"),
Example("func run(_ options: NoOptions<CommandantError<()>>) {}\n"),
Example("func foo(_ options: Set<type>) {}\n"),
Example("func < <T: Comparable>(lhs: T?, rhs: T?) -> Bool\n"),
Example("func configureWith(data: Either<MessageThread, (project: Project, backing: Backing)>)\n"),
Example("typealias StringDictionary<T> = Dictionary<String, T>\n"),
Example("typealias BackwardTriple<T1, T2, T3> = (T3, T2, T1)\n"),
Example("typealias DictionaryOfStrings<T : Hashable> = Dictionary<T, String>\n")
],
triggeringExamples: [
"func foo<↓T_Foo>() {}\n",
"func foo<T, ↓U_Foo>(param: U_Foo) -> T {}\n",
"func foo<↓\(String(repeating: "T", count: 21))>() {}\n",
"func foo<↓type>() {}\n",
"typealias StringDictionary<↓T_Foo> = Dictionary<String, T_Foo>\n",
"typealias BackwardTriple<T1, ↓T2_Bar, T3> = (T3, T2_Bar, T1)\n",
"typealias DictionaryOfStrings<↓T_Foo: Hashable> = Dictionary<T_Foo, String>\n"
Example("func foo<↓T_Foo>() {}\n"),
Example("func foo<T, ↓U_Foo>(param: U_Foo) -> T {}\n"),
Example("func foo<↓\(String(repeating: "T", count: 21))>() {}\n"),
Example("func foo<↓type>() {}\n"),
Example("typealias StringDictionary<↓T_Foo> = Dictionary<String, T_Foo>\n"),
Example("typealias BackwardTriple<T1, ↓T2_Bar, T3> = (T3, T2_Bar, T1)\n"),
Example("typealias DictionaryOfStrings<↓T_Foo: Hashable> = Dictionary<T_Foo, String>\n")
] + ["class", "struct", "enum"].flatMap { type -> [Example] in
return [
"\(type) Foo<↓T_Foo> {}\n",
"\(type) Foo<T, ↓U_Foo> {}\n",
"\(type) Foo<↓T_Foo, ↓U_Foo> {}\n",
"\(type) Foo<↓\(String(repeating: "T", count: 21))> {}\n",
"\(type) Foo<↓type> {}\n"
Example("\(type) Foo<↓T_Foo> {}\n"),
Example("\(type) Foo<T, ↓U_Foo> {}\n"),
Example("\(type) Foo<↓T_Foo, ↓U_Foo> {}\n"),
Example("\(type) Foo<↓\(String(repeating: "T", count: 21))> {}\n"),
Example("\(type) Foo<↓type> {}\n")
]
}
)
@@ -9,14 +9,14 @@ struct IsDisjointRule: SwiftSyntaxRule, ConfigurationProviderRule {
description: "Prefer using `Set.isDisjoint(with:)` over `Set.intersection(_:).isEmpty`",
kind: .idiomatic,
nonTriggeringExamples: [
"_ = Set(syntaxKinds).isDisjoint(with: commentAndStringKindsSet)",
"let isObjc = !objcAttributes.isDisjoint(with: dictionary.enclosedSwiftAttributes)",
"_ = Set(syntaxKinds).intersection(commentAndStringKindsSet)",
"_ = !objcAttributes.intersection(dictionary.enclosedSwiftAttributes)"
Example("_ = Set(syntaxKinds).isDisjoint(with: commentAndStringKindsSet)"),
Example("let isObjc = !objcAttributes.isDisjoint(with: dictionary.enclosedSwiftAttributes)"),
Example("_ = Set(syntaxKinds).intersection(commentAndStringKindsSet)"),
Example("_ = !objcAttributes.intersection(dictionary.enclosedSwiftAttributes)")
],
triggeringExamples: [
"_ = Set(syntaxKinds).↓intersection(commentAndStringKindsSet).isEmpty",
"let isObjc = !objcAttributes.↓intersection(dictionary.enclosedSwiftAttributes).isEmpty"
Example("_ = Set(syntaxKinds).↓intersection(commentAndStringKindsSet).isEmpty"),
Example("let isObjc = !objcAttributes.↓intersection(dictionary.enclosedSwiftAttributes).isEmpty")
]
)
@@ -9,14 +9,14 @@ struct LegacyRandomRule: SwiftSyntaxRule, ConfigurationProviderRule {
description: "Prefer using `type.random(in:)` over legacy functions",
kind: .idiomatic,
nonTriggeringExamples: [
"Int.random(in: 0..<10)\n",
"Double.random(in: 8.6...111.34)\n",
"Float.random(in: 0 ..< 1)\n"
Example("Int.random(in: 0..<10)\n"),
Example("Double.random(in: 8.6...111.34)\n"),
Example("Float.random(in: 0 ..< 1)\n")
],
triggeringExamples: [
"↓arc4random()\n",
"↓arc4random_uniform(83)\n",
"↓drand48()\n"
Example("↓arc4random()\n"),
Example("↓arc4random_uniform(83)\n"),
Example("↓drand48()\n")
]
)
@@ -9,15 +9,15 @@ struct NoExtensionAccessModifierRule: SwiftSyntaxRule, OptInRule, ConfigurationP
description: "Prefer not to use extension access modifiers",
kind: .idiomatic,
nonTriggeringExamples: [
"extension String {}",
"\n\n extension String {}"
Example("extension String {}"),
Example("\n\n extension String {}")
],
triggeringExamples: [
"↓private extension String {}",
"↓public \n extension String {}",
"↓open extension String {}",
"↓internal extension String {}",
"↓fileprivate extension String {}"
Example("↓private extension String {}"),
Example("↓public \n extension String {}"),
Example("↓open extension String {}"),
Example("↓internal extension String {}"),
Example("↓fileprivate extension String {}")
]
)
@@ -9,15 +9,15 @@ struct NoGroupingExtensionRule: OptInRule, ConfigurationProviderRule {
description: "Extensions shouldn't be used to group code within the same source file",
kind: .idiomatic,
nonTriggeringExamples: [
"protocol Food {}\nextension Food {}\n",
"class Apples {}\nextension Oranges {}\n",
"class Box<T> {}\nextension Box where T: Vegetable {}\n"
Example("protocol Food {}\nextension Food {}\n"),
Example("class Apples {}\nextension Oranges {}\n"),
Example("class Box<T> {}\nextension Box where T: Vegetable {}\n")
],
triggeringExamples: [
"enum Fruit {}\n↓extension Fruit {}\n",
"↓extension Tea: Error {}\nstruct Tea {}\n",
"class Ham { class Spam {}}\n↓extension Ham.Spam {}\n",
"extension External { struct Gotcha {}}\n↓extension External.Gotcha {}\n"
Example("enum Fruit {}\n↓extension Fruit {}\n"),
Example("↓extension Tea: Error {}\nstruct Tea {}\n"),
Example("class Ham { class Spam {}}\n↓extension Ham.Spam {}\n"),
Example("extension External { struct Gotcha {}}\n↓extension External.Gotcha {}\n")
]
)
@@ -9,27 +9,27 @@ struct PatternMatchingKeywordsRule: SwiftSyntaxRule, ConfigurationProviderRule,
description: "Combine multiple pattern matching bindings by moving keywords out of tuples",
kind: .idiomatic,
nonTriggeringExamples: [
"default",
"case 1",
"case bar",
"case let (x, y)",
"case .foo(let x)",
"case let .foo(x, y)",
"case .foo(let x), .bar(let x)",
"case .foo(let x, var y)",
"case var (x, y)",
"case .foo(var x)",
"case var .foo(x, y)"
Example("default"),
Example("case 1"),
Example("case bar"),
Example("case let (x, y)"),
Example("case .foo(let x)"),
Example("case let .foo(x, y)"),
Example("case .foo(let x), .bar(let x)"),
Example("case .foo(let x, var y)"),
Example("case var (x, y)"),
Example("case .foo(var x)"),
Example("case var .foo(x, y)")
].map(wrapInSwitch),
triggeringExamples: [
"case (↓let x, ↓let y)",
"case (↓let x, ↓let y, .foo)",
"case (↓let x, ↓let y, _)",
"case .foo(↓let x, ↓let y)",
"case (.yamlParsing(↓let x), .yamlParsing(↓let y))",
"case (↓var x, ↓var y)",
"case .foo(↓var x, ↓var y)",
"case (.yamlParsing(↓var x), .yamlParsing(↓var y))"
Example("case (↓let x, ↓let y)"),
Example("case (↓let x, ↓let y, .foo)"),
Example("case (↓let x, ↓let y, _)"),
Example("case .foo(↓let x, ↓let y)"),
Example("case (.yamlParsing(↓let x), .yamlParsing(↓let y))"),
Example("case (↓var x, ↓var y)"),
Example("case .foo(↓var x, ↓var y)"),
Example("case (.yamlParsing(↓var x), .yamlParsing(↓var y))")
].map(wrapInSwitch)
)
@@ -9,16 +9,16 @@ struct PreferNimbleRule: SwiftSyntaxRule, OptInRule, ConfigurationProviderRule {
description: "Prefer Nimble matchers over XCTAssert functions",
kind: .idiomatic,
nonTriggeringExamples: [
"expect(foo) == 1",
"expect(foo).to(equal(1))"
Example("expect(foo) == 1"),
Example("expect(foo).to(equal(1))")
],
triggeringExamples: [
"↓XCTAssertTrue(foo)",
"↓XCTAssertEqual(foo, 2)",
"↓XCTAssertNotEqual(foo, 2)",
"↓XCTAssertNil(foo)",
"↓XCTAssert(foo)",
"↓XCTAssertGreaterThan(foo, 10)"
Example("↓XCTAssertTrue(foo)"),
Example("↓XCTAssertEqual(foo, 2)"),
Example("↓XCTAssertNotEqual(foo, 2)"),
Example("↓XCTAssertNil(foo)"),
Example("↓XCTAssert(foo)"),
Example("↓XCTAssertGreaterThan(foo, 10)")
]
)
@@ -1,56 +1,56 @@
internal struct XCTSpecificMatcherRuleExamples {
static let nonTriggeringExamples: [Example] = [
static let nonTriggeringExamples = [
// True/False
"XCTAssert(foo)",
"XCTAssertFalse(foo)",
"XCTAssertTrue(foo)",
Example("XCTAssert(foo"),
Example("XCTAssertFalse(foo)"),
Example("XCTAssertTrue(foo)"),
// Nil/Not nil
"XCTAssertNil(foo)",
"XCTAssertNotNil(foo)",
Example("XCTAssertNil(foo)"),
Example("XCTAssertNotNil(foo)"),
// Equal/Not equal
"XCTAssertEqual(foo, 2)",
"XCTAssertNotEqual(foo, \"false\")",
Example("XCTAssertEqual(foo, 2)"),
Example("XCTAssertNotEqual(foo, \"false\")"),
// Arrays with key words
"XCTAssertEqual(foo, [1, 2, 3, true])",
"XCTAssertEqual(foo, [1, 2, 3, false])",
"XCTAssertEqual(foo, [1, 2, 3, nil])",
"XCTAssertEqual(foo, [true, nil, true, nil])",
"XCTAssertEqual([1, 2, 3, true], foo)",
"XCTAssertEqual([1, 2, 3, false], foo)",
"XCTAssertEqual([1, 2, 3, nil], foo)",
"XCTAssertEqual([true, nil, true, nil], foo)",
Example("XCTAssertEqual(foo, [1, 2, 3, true])"),
Example("XCTAssertEqual(foo, [1, 2, 3, false])"),
Example("XCTAssertEqual(foo, [1, 2, 3, nil])"),
Example("XCTAssertEqual(foo, [true, nil, true, nil])"),
Example("XCTAssertEqual([1, 2, 3, true], foo)"),
Example("XCTAssertEqual([1, 2, 3, false], foo)"),
Example("XCTAssertEqual([1, 2, 3, nil], foo)"),
Example("XCTAssertEqual([true, nil, true, nil], foo)"),
// Inverted logic
"XCTAssertEqual(2, foo)",
"XCTAssertNotEqual(\"false\"), foo)",
"XCTAssertEqual(false, foo?.bar)",
"XCTAssertEqual(true, foo?.bar)",
Example("XCTAssertEqual(2, foo)"),
Example("XCTAssertNotEqual(\"false\"), foo)"),
Example("XCTAssertEqual(false, foo?.bar)"),
Example("XCTAssertEqual(true, foo?.bar)"),
// Blank spaces
"XCTAssert( foo )",
"XCTAssertFalse( foo )",
"XCTAssertTrue( foo )",
"XCTAssertNil( foo )",
"XCTAssertNotNil( foo )",
"XCTAssertEqual( foo , 2 )",
"XCTAssertNotEqual( foo, \"false\")",
Example("XCTAssert( foo )"),
Example("XCTAssertFalse( foo )"),
Example("XCTAssertTrue( foo )"),
Example("XCTAssertNil( foo )"),
Example("XCTAssertNotNil( foo )"),
Example("XCTAssertEqual( foo , 2 )"),
Example("XCTAssertNotEqual( foo, \"false\")"),
// Optionals
"XCTAssertEqual(foo?.bar, false)",
"XCTAssertEqual(foo?.bar, true)",
"XCTAssertNil(foo?.bar)",
"XCTAssertNotNil(foo?.bar)",
"XCTAssertEqual(foo?.bar, 2)",
"XCTAssertNotEqual(foo?.bar, \"false\")",
Example("XCTAssertEqual(foo?.bar, false)"),
Example("XCTAssertEqual(foo?.bar, true)"),
Example("XCTAssertNil(foo?.bar)"),
Example("XCTAssertNotNil(foo?.bar)"),
Example("XCTAssertEqual(foo?.bar, 2)"),
Example("XCTAssertNotEqual(foo?.bar, \"false\")"),
// Function calls and enums
"XCTAssertEqual(foo?.bar, toto())",
"XCTAssertEqual(foo?.bar, .toto(.zoo))",
"XCTAssertEqual(toto(), foo?.bar)",
"XCTAssertEqual(.toto(.zoo), foo?.bar)",
Example("XCTAssertEqual(foo?.bar, toto())"),
Example("XCTAssertEqual(foo?.bar, .toto(.zoo))"),
Example("XCTAssertEqual(toto(), foo?.bar)"),
Example("XCTAssertEqual(.toto(.zoo), foo?.bar)"),
// Configurations Disabled
Example("XCTAssertEqual(foo, true)",
@@ -61,81 +61,81 @@ internal struct XCTSpecificMatcherRuleExamples {
excludeFromDocumentation: true),
// Skip if one operand might be a type or a tuple
"XCTAssert(foo.self == bar)",
"XCTAssertTrue(type(of: foo) != Int.self)",
"XCTAssertTrue(a == (1, 3, 5)"
Example("XCTAssert(foo.self == bar)"),
Example("XCTAssertTrue(type(of: foo) != Int.self)"),
Example("XCTAssertTrue(a == (1, 3, 5)")
]
static let triggeringExamples: [Example] = [
static let triggeringExamples = [
// Without message
"↓XCTAssertEqual(foo, true)",
"↓XCTAssertEqual(foo, false)",
"↓XCTAssertEqual(foo, nil)",
"↓XCTAssertNotEqual(foo, true)",
"↓XCTAssertNotEqual(foo, false)",
"↓XCTAssertNotEqual(foo, nil)",
Example("↓XCTAssertEqual(foo, true)"),
Example("↓XCTAssertEqual(foo, false)"),
Example("↓XCTAssertEqual(foo, nil)"),
Example("↓XCTAssertNotEqual(foo, true)"),
Example("↓XCTAssertNotEqual(foo, false)"),
Example("↓XCTAssertNotEqual(foo, nil)"),
// Inverted logic (just in case...)
"↓XCTAssertEqual(true, foo)",
"↓XCTAssertEqual(false, foo)",
"↓XCTAssertEqual(nil, foo)",
"↓XCTAssertNotEqual(true, foo)",
"↓XCTAssertNotEqual(false, foo)",
"↓XCTAssertNotEqual(nil, foo)",
Example("↓XCTAssertEqual(true, foo)"),
Example("↓XCTAssertEqual(false, foo)"),
Example("↓XCTAssertEqual(nil, foo)"),
Example("↓XCTAssertNotEqual(true, foo)"),
Example("↓XCTAssertNotEqual(false, foo)"),
Example("↓XCTAssertNotEqual(nil, foo)"),
// With message
"↓XCTAssertEqual(foo, true, \"toto\")",
"↓XCTAssertEqual(foo, false, \"toto\")",
"↓XCTAssertEqual(foo, nil, \"toto\")",
"↓XCTAssertNotEqual(foo, true, \"toto\")",
"↓XCTAssertNotEqual(foo, false, \"toto\")",
"↓XCTAssertNotEqual(foo, nil, \"toto\")",
"↓XCTAssertEqual(true, foo, \"toto\")",
"↓XCTAssertEqual(false, foo, \"toto\")",
"↓XCTAssertEqual(nil, foo, \"toto\")",
"↓XCTAssertNotEqual(true, foo, \"toto\")",
"↓XCTAssertNotEqual(false, foo, \"toto\")",
"↓XCTAssertNotEqual(nil, foo, \"toto\")",
Example("↓XCTAssertEqual(foo, true, \"toto\")"),
Example("↓XCTAssertEqual(foo, false, \"toto\")"),
Example("↓XCTAssertEqual(foo, nil, \"toto\")"),
Example("↓XCTAssertNotEqual(foo, true, \"toto\")"),
Example("↓XCTAssertNotEqual(foo, false, \"toto\")"),
Example("↓XCTAssertNotEqual(foo, nil, \"toto\")"),
Example("↓XCTAssertEqual(true, foo, \"toto\")"),
Example("↓XCTAssertEqual(false, foo, \"toto\")"),
Example("↓XCTAssertEqual(nil, foo, \"toto\")"),
Example("↓XCTAssertNotEqual(true, foo, \"toto\")"),
Example("↓XCTAssertNotEqual(false, foo, \"toto\")"),
Example("↓XCTAssertNotEqual(nil, foo, \"toto\")"),
// Blank spaces
"↓XCTAssertEqual(foo,true)",
"↓XCTAssertEqual( foo , false )",
"↓XCTAssertEqual( foo , nil )",
Example("↓XCTAssertEqual(foo,true)"),
Example("↓XCTAssertEqual( foo , false )"),
Example("↓XCTAssertEqual( foo , nil )"),
// Arrays
"↓XCTAssertEqual(true, [1, 2, 3, true].hasNumbers())",
"↓XCTAssertEqual([1, 2, 3, true].hasNumbers(), true)",
Example("↓XCTAssertEqual(true, [1, 2, 3, true].hasNumbers())"),
Example("↓XCTAssertEqual([1, 2, 3, true].hasNumbers(), true)"),
// Optionals
"↓XCTAssertEqual(foo?.bar, nil)",
"↓XCTAssertNotEqual(foo?.bar, nil)",
Example("↓XCTAssertEqual(foo?.bar, nil)"),
Example("↓XCTAssertNotEqual(foo?.bar, nil)"),
// Weird cases
"↓XCTAssertEqual(nil, true)",
"↓XCTAssertEqual(nil, false)",
"↓XCTAssertEqual(true, nil)",
"↓XCTAssertEqual(false, nil)",
"↓XCTAssertEqual(nil, nil)",
"↓XCTAssertEqual(true, true)",
"↓XCTAssertEqual(false, false)",
Example("↓XCTAssertEqual(nil, true)"),
Example("↓XCTAssertEqual(nil, false)"),
Example("↓XCTAssertEqual(true, nil)"),
Example("↓XCTAssertEqual(false, nil)"),
Example("↓XCTAssertEqual(nil, nil)"),
Example("↓XCTAssertEqual(true, true)"),
Example("↓XCTAssertEqual(false, false)"),
// Equality with `==`
"↓XCTAssert(foo == bar)",
"↓XCTAssertTrue( foo == bar )",
"↓XCTAssertFalse(1 == foo)",
"↓XCTAssert(foo == bar, \"toto\")",
Example("↓XCTAssert(foo == bar)"),
Example("↓XCTAssertTrue( foo == bar )"),
Example("↓XCTAssertFalse(1 == foo)"),
Example("↓XCTAssert(foo == bar, \"toto\")"),
// Inequality with `!=`
"↓XCTAssert(foo != bar)",
"↓XCTAssertTrue( foo != bar )",
"↓XCTAssertFalse(1 != foo)",
"↓XCTAssert(foo != bar, \"toto\")",
Example("↓XCTAssert(foo != bar)"),
Example("↓XCTAssertTrue( foo != bar )"),
Example("↓XCTAssertFalse(1 != foo)"),
Example("↓XCTAssert(foo != bar, \"toto\")"),
// Comparison with `nil`
"↓XCTAssert( foo == nil)",
"↓XCTAssert(nil == foo",
"↓XCTAssertTrue( foo != nil)",
"↓XCTAssertFalse(nil != foo",
"↓XCTAssert(foo == nil, \"toto\")"
Example("↓XCTAssert( foo == nil)"),
Example("↓XCTAssert(nil == foo"),
Example("↓XCTAssertTrue( foo != nil)"),
Example("↓XCTAssertFalse(nil != foo"),
Example("↓XCTAssert(foo == nil, \"toto\")")
]
}
@@ -9,23 +9,23 @@ struct ClassDelegateProtocolRule: SwiftSyntaxRule, ConfigurationProviderRule {
description: "Delegate protocols should be class-only so they can be weakly referenced",
kind: .lint,
nonTriggeringExamples: [
"protocol FooDelegate: class {}\n",
"protocol FooDelegate: class, BarDelegate {}\n",
"protocol Foo {}\n",
"class FooDelegate {}\n",
"@objc protocol FooDelegate {}\n",
"@objc(MyFooDelegate)\n protocol FooDelegate {}\n",
"protocol FooDelegate: BarDelegate {}\n",
"protocol FooDelegate: AnyObject {}\n",
"protocol FooDelegate: NSObjectProtocol {}\n",
"protocol FooDelegate where Self: BarDelegate {}\n",
"protocol FooDelegate where Self: AnyObject {}\n",
"protocol FooDelegate where Self: NSObjectProtocol {}\n"
Example("protocol FooDelegate: class {}\n"),
Example("protocol FooDelegate: class, BarDelegate {}\n"),
Example("protocol Foo {}\n"),
Example("class FooDelegate {}\n"),
Example("@objc protocol FooDelegate {}\n"),
Example("@objc(MyFooDelegate)\n protocol FooDelegate {}\n"),
Example("protocol FooDelegate: BarDelegate {}\n"),
Example("protocol FooDelegate: AnyObject {}\n"),
Example("protocol FooDelegate: NSObjectProtocol {}\n"),
Example("protocol FooDelegate where Self: BarDelegate {}\n"),
Example("protocol FooDelegate where Self: AnyObject {}\n"),
Example("protocol FooDelegate where Self: NSObjectProtocol {}\n")
],
triggeringExamples: [
"↓protocol FooDelegate {}\n",
"↓protocol FooDelegate: Bar {}\n",
"↓protocol FooDelegate where Self: StringProtocol {}\n"
Example("↓protocol FooDelegate {}\n"),
Example("↓protocol FooDelegate: Bar {}\n"),
Example("↓protocol FooDelegate where Self: StringProtocol {}\n")
]
)
@@ -10,14 +10,14 @@ struct CompilerProtocolInitRule: SwiftSyntaxRule, ConfigurationProviderRule {
"shouldn't be called directly.",
kind: .lint,
nonTriggeringExamples: [
"let set: Set<Int> = [1, 2]\n",
"let set = Set(array)\n"
Example("let set: Set<Int> = [1, 2]\n"),
Example("let set = Set(array)\n")
],
triggeringExamples: [
"let set = ↓Set(arrayLiteral: 1, 2)\n",
"let set = ↓Set (arrayLiteral: 1, 2)\n",
"let set = ↓Set.init(arrayLiteral: 1, 2)\n",
"let set = ↓Set.init(arrayLiteral : 1, 2)\n"
Example("let set = ↓Set(arrayLiteral: 1, 2)\n"),
Example("let set = ↓Set (arrayLiteral: 1, 2)\n"),
Example("let set = ↓Set.init(arrayLiteral: 1, 2)\n"),
Example("let set = ↓Set.init(arrayLiteral : 1, 2)\n")
]
)
@@ -1,37 +1,37 @@
internal enum DeploymentTargetRuleExamples {
static let nonTriggeringExamples: [Example] = [
"@available(iOS 12.0, *)\nclass A {}",
"@available(iOSApplicationExtension 13.0, *)\nclass A {}",
"@available(watchOS 4.0, *)\nclass A {}",
"@available(watchOSApplicationExtension 4.0, *)\nclass A {}",
"@available(swift 3.0.2)\nclass A {}",
"class A {}",
"if #available(iOS 10.0, *) {}",
"if #available(iOS 10, *) {}",
"guard #available(iOS 12.0, *) else { return }",
"#if #unavailable(iOS 15.0) {}",
"#guard #unavailable(iOS 15.0) {} else { return }"
Example("@available(iOS 12.0, *)\nclass A {}"),
Example("@available(iOSApplicationExtension 13.0, *)\nclass A {}"),
Example("@available(watchOS 4.0, *)\nclass A {}"),
Example("@available(watchOSApplicationExtension 4.0, *)\nclass A {}"),
Example("@available(swift 3.0.2)\nclass A {}"),
Example("class A {}"),
Example("if #available(iOS 10.0, *) {}"),
Example("if #available(iOS 10, *) {}"),
Example("guard #available(iOS 12.0, *) else { return }"),
Example("#if #unavailable(iOS 15.0) {}"),
Example("#guard #unavailable(iOS 15.0) {} else { return }")
]
static let triggeringExamples: [Example] = [
"↓@available(iOS 6.0, *)\nclass A {}",
"↓@available(iOSApplicationExtension 6.0, *)\nclass A {}",
"↓@available(iOS 7.0, *)\nclass A {}",
"↓@available(iOS 6, *)\nclass A {}",
"↓@available(iOS 6.0, macOS 10.12, *)\n class A {}",
"↓@available(macOS 10.12, iOS 6.0, *)\n class A {}",
"↓@available(macOS 10.7, *)\nclass A {}",
"↓@available(macOSApplicationExtension 10.7, *)\nclass A {}",
"↓@available(OSX 10.7, *)\nclass A {}",
"↓@available(watchOS 0.9, *)\nclass A {}",
"↓@available(watchOSApplicationExtension 0.9, *)\nclass A {}",
"↓@available(tvOS 8, *)\nclass A {}",
"↓@available(tvOSApplicationExtension 8, *)\nclass A {}",
"if ↓#available(iOS 6.0, *) {}",
"if ↓#available(iOS 6, *) {}",
"guard ↓#available(iOS 6.0, *) else { return }",
"if ↓#unavailable(iOS 7.0) {}",
"if ↓#unavailable(iOS 6.9) {}",
"guard ↓#unavailable(iOS 7.0) {} else { return }"
Example("↓@available(iOS 6.0, *)\nclass A {}"),
Example("↓@available(iOSApplicationExtension 6.0, *)\nclass A {}"),
Example("↓@available(iOS 7.0, *)\nclass A {}"),
Example("↓@available(iOS 6, *)\nclass A {}"),
Example("↓@available(iOS 6.0, macOS 10.12, *)\n class A {}"),
Example("↓@available(macOS 10.12, iOS 6.0, *)\n class A {}"),
Example("↓@available(macOS 10.7, *)\nclass A {}"),
Example("↓@available(macOSApplicationExtension 10.7, *)\nclass A {}"),
Example("↓@available(OSX 10.7, *)\nclass A {}"),
Example("↓@available(watchOS 0.9, *)\nclass A {}"),
Example("↓@available(watchOSApplicationExtension 0.9, *)\nclass A {}"),
Example("↓@available(tvOS 8, *)\nclass A {}"),
Example("↓@available(tvOSApplicationExtension 8, *)\nclass A {}"),
Example("if ↓#available(iOS 6.0, *) {}"),
Example("if ↓#available(iOS 6, *) {}"),
Example("guard ↓#available(iOS 6.0, *) else { return }"),
Example("if ↓#unavailable(iOS 7.0) {}"),
Example("if ↓#unavailable(iOS 6.9) {}"),
Example("guard ↓#unavailable(iOS 7.0) {} else { return }")
]
}
@@ -9,29 +9,29 @@ struct DiscouragedDirectInitRule: SwiftSyntaxRule, ConfigurationProviderRule {
description: "Discouraged direct initialization of types that can be harmful",
kind: .lint,
nonTriggeringExamples: [
"let foo = UIDevice.current",
"let foo = Bundle.main",
"let foo = Bundle(path: \"bar\")",
"let foo = Bundle(identifier: \"bar\")",
"let foo = Bundle.init(path: \"bar\")",
"let foo = Bundle.init(identifier: \"bar\")",
"let foo = NSError(domain: \"bar\", code: 0)",
"let foo = NSError.init(domain: \"bar\", code: 0)",
"func testNSError()"
Example("let foo = UIDevice.current"),
Example("let foo = Bundle.main"),
Example("let foo = Bundle(path: \"bar\")"),
Example("let foo = Bundle(identifier: \"bar\")"),
Example("let foo = Bundle.init(path: \"bar\")"),
Example("let foo = Bundle.init(identifier: \"bar\")"),
Example("let foo = NSError(domain: \"bar\", code: 0)"),
Example("let foo = NSError.init(domain: \"bar\", code: 0)"),
Example("func testNSError()")
],
triggeringExamples: [
"↓UIDevice()",
"↓Bundle()",
"let foo = ↓UIDevice()",
"let foo = ↓Bundle()",
"let foo = ↓NSError()",
"let foo = bar(bundle: ↓Bundle(), device: ↓UIDevice(), error: ↓NSError())",
"↓UIDevice.init()",
"↓Bundle.init()",
"↓NSError.init()",
"let foo = ↓UIDevice.init()",
"let foo = ↓Bundle.init()",
"let foo = bar(bundle: ↓Bundle.init(), device: ↓UIDevice.init(), error: ↓NSError.init())"
Example("↓UIDevice()"),
Example("↓Bundle()"),
Example("let foo = ↓UIDevice()"),
Example("let foo = ↓Bundle()"),
Example("let foo = ↓NSError()"),
Example("let foo = bar(bundle: ↓Bundle(), device: ↓UIDevice(), error: ↓NSError())"),
Example("↓UIDevice.init()"),
Example("↓Bundle.init()"),
Example("↓NSError.init()"),
Example("let foo = ↓UIDevice.init()"),
Example("let foo = ↓Bundle.init()"),
Example("let foo = bar(bundle: ↓Bundle.init(), device: ↓UIDevice.init(), error: ↓NSError.init())")
]
)
@@ -9,16 +9,16 @@ struct DynamicInlineRule: SwiftSyntaxRule, ConfigurationProviderRule {
description: "Avoid using 'dynamic' and '@inline(__always)' together",
kind: .lint,
nonTriggeringExamples: [
"class C {\ndynamic func f() {}}",
"class C {\n@inline(__always) func f() {}}",
"class C {\n@inline(never) dynamic func f() {}}"
Example("class C {\ndynamic func f() {}}"),
Example("class C {\n@inline(__always) func f() {}}"),
Example("class C {\n@inline(never) dynamic func f() {}}")
],
triggeringExamples: [
"class C {\n@inline(__always) dynamic ↓func f() {}\n}",
"class C {\n@inline(__always) public dynamic ↓func f() {}\n}",
"class C {\n@inline(__always) dynamic internal ↓func f() {}\n}",
"class C {\n@inline(__always)\ndynamic ↓func f() {}\n}",
"class C {\n@inline(__always)\ndynamic\n↓func f() {}\n}"
Example("class C {\n@inline(__always) dynamic ↓func f() {}\n}"),
Example("class C {\n@inline(__always) public dynamic ↓func f() {}\n}"),
Example("class C {\n@inline(__always) dynamic internal ↓func f() {}\n}"),
Example("class C {\n@inline(__always)\ndynamic ↓func f() {}\n}"),
Example("class C {\n@inline(__always)\ndynamic\n↓func f() {}\n}")
]
)
@@ -25,22 +25,22 @@ struct ExpiringTodoRule: ConfigurationProviderRule, OptInRule {
description: "TODOs and FIXMEs should be resolved prior to their expiry date.",
kind: .lint,
nonTriggeringExamples: [
"// notaTODO:\n",
"// notaFIXME:\n",
"// TODO: [12/31/9999]\n",
"// TODO(note)\n",
"// FIXME(note)\n",
"/* FIXME: */\n",
"/* TODO: */\n",
"/** FIXME: */\n",
"/** TODO: */\n"
Example("// notaTODO:\n"),
Example("// notaFIXME:\n"),
Example("// TODO: [12/31/9999]\n"),
Example("// TODO(note)\n"),
Example("// FIXME(note)\n"),
Example("/* FIXME: */\n"),
Example("/* TODO: */\n"),
Example("/** FIXME: */\n"),
Example("/** TODO: */\n")
],
triggeringExamples: [
"// TODO: [↓10/14/2019]\n",
"// FIXME: [↓10/14/2019]\n",
"// FIXME: [↓1/14/2019]\n",
"// FIXME: [↓10/14/2019]\n",
"// TODO: [↓9999/14/10]\n"
Example("// TODO: [↓10/14/2019]\n"),
Example("// FIXME: [↓10/14/2019]\n"),
Example("// FIXME: [↓1/14/2019]\n"),
Example("// FIXME: [↓10/14/2019]\n"),
Example("// TODO: [↓9999/14/10]\n")
].skipWrappingInCommentTests()
)
@@ -7,27 +7,27 @@ struct InvalidSwiftLintCommandRule: ConfigurationProviderRule {
description: "swiftlint command does not have a valid action or modifier",
kind: .lint,
nonTriggeringExamples: [
"// swiftlint:disable unused_import",
"// swiftlint:enable unused_import",
"// swiftlint:disable:next unused_import",
"// swiftlint:disable:previous unused_import",
"// swiftlint:disable:this unused_import"
Example("// swiftlint:disable unused_import"),
Example("// swiftlint:enable unused_import"),
Example("// swiftlint:disable:next unused_import"),
Example("// swiftlint:disable:previous unused_import"),
Example("// swiftlint:disable:this unused_import")
],
triggeringExamples: [
"// swiftlint:",
"// swiftlint: ",
"// swiftlint::",
"// swiftlint:: ",
"// swiftlint:disable",
"// swiftlint:dissable unused_import",
"// swiftlint:enaaaable unused_import",
"// swiftlint:disable:nxt unused_import",
"// swiftlint:enable:prevus unused_import",
"// swiftlint:enable:ths unused_import",
"// swiftlint:enable",
"// swiftlint:enable:",
"// swiftlint:enable: ",
"// swiftlint:disable: unused_import"
Example("// swiftlint:"),
Example("// swiftlint: "),
Example("// swiftlint::"),
Example("// swiftlint:: "),
Example("// swiftlint:disable"),
Example("// swiftlint:dissable unused_import"),
Example("// swiftlint:enaaaable unused_import"),
Example("// swiftlint:disable:nxt unused_import"),
Example("// swiftlint:enable:prevus unused_import"),
Example("// swiftlint:enable:ths unused_import"),
Example("// swiftlint:enable"),
Example("// swiftlint:enable:"),
Example("// swiftlint:enable: "),
Example("// swiftlint:disable: unused_import")
].skipWrappingInCommentTests()
)
@@ -9,25 +9,25 @@ struct PrivateActionRule: SwiftSyntaxRule, OptInRule, ConfigurationProviderRule
description: "IBActions should be private",
kind: .lint,
nonTriggeringExamples: [
"class Foo {\n\t@IBAction private func barButtonTapped(_ sender: UIButton) {}\n}\n",
"struct Foo {\n\t@IBAction private func barButtonTapped(_ sender: UIButton) {}\n}\n",
"class Foo {\n\t@IBAction fileprivate func barButtonTapped(_ sender: UIButton) {}\n}\n",
"struct Foo {\n\t@IBAction fileprivate func barButtonTapped(_ sender: UIButton) {}\n}\n",
"private extension Foo {\n\t@IBAction func barButtonTapped(_ sender: UIButton) {}\n}\n",
"fileprivate extension Foo {\n\t@IBAction func barButtonTapped(_ sender: UIButton) {}\n}\n"
Example("class Foo {\n\t@IBAction private func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("struct Foo {\n\t@IBAction private func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("class Foo {\n\t@IBAction fileprivate func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("struct Foo {\n\t@IBAction fileprivate func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("private extension Foo {\n\t@IBAction func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("fileprivate extension Foo {\n\t@IBAction func barButtonTapped(_ sender: UIButton) {}\n}\n")
],
triggeringExamples: [
"class Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"struct Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"class Foo {\n\t@IBAction public ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"struct Foo {\n\t@IBAction public ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"class Foo {\n\t@IBAction internal ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"struct Foo {\n\t@IBAction internal ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"extension Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"extension Foo {\n\t@IBAction public ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"extension Foo {\n\t@IBAction internal ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"public extension Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n",
"internal extension Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"
Example("class Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("struct Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("class Foo {\n\t@IBAction public ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("struct Foo {\n\t@IBAction public ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("class Foo {\n\t@IBAction internal ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("struct Foo {\n\t@IBAction internal ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("extension Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("extension Foo {\n\t@IBAction public ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("extension Foo {\n\t@IBAction internal ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("public extension Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n"),
Example("internal extension Foo {\n\t@IBAction ↓func barButtonTapped(_ sender: UIButton) {}\n}\n")
]
)
@@ -10,18 +10,18 @@ struct TodoRule: SwiftSyntaxRule, ConfigurationProviderRule {
description: "TODOs and FIXMEs should be resolved.",
kind: .lint,
nonTriggeringExamples: [
"// notaTODO:\n",
"// notaFIXME:\n"
Example("// notaTODO:\n"),
Example("// notaFIXME:\n")
],
triggeringExamples: [
"// ↓TODO:\n",
"// ↓FIXME:\n",
"// ↓TODO(note)\n",
"// ↓FIXME(note)\n",
"/* ↓FIXME: */\n",
"/* ↓TODO: */\n",
"/** ↓FIXME: */\n",
"/** ↓TODO: */\n"
Example("// ↓TODO:\n"),
Example("// ↓FIXME:\n"),
Example("// ↓TODO(note)\n"),
Example("// ↓FIXME(note)\n"),
Example("/* ↓FIXME: */\n"),
Example("/* ↓TODO: */\n"),
Example("/** ↓FIXME: */\n"),
Example("/** ↓TODO: */\n")
].skipWrappingInCommentTests()
)
@@ -1,56 +1,56 @@
struct LargeTupleRuleExamples {
static let nonTriggeringExamples: [Example] = [
"let foo: (Int, Int)\n",
"let foo: (start: Int, end: Int)\n",
"let foo: (Int, (Int, String))\n",
"func foo() -> (Int, Int)\n",
"func foo() -> (Int, Int) {}\n",
"func foo(bar: String) -> (Int, Int)\n",
"func foo(bar: String) -> (Int, Int) {}\n",
"func foo() throws -> (Int, Int)\n",
"func foo() throws -> (Int, Int) {}\n",
"let foo: (Int, Int, Int) -> Void\n",
"let foo: (Int, Int, Int) throws -> Void\n",
"func foo(bar: (Int, String, Float) -> Void)\n",
"func foo(bar: (Int, String, Float) throws -> Void)\n",
"var completionHandler: ((_ data: Data?, _ resp: URLResponse?, _ e: NSError?) -> Void)!\n",
"func getDictionaryAndInt() -> (Dictionary<Int, String>, Int)?\n",
"func getGenericTypeAndInt() -> (Type<Int, String, Float>, Int)?\n",
"func foo() async -> (Int, Int)\n",
"func foo() async -> (Int, Int) {}\n",
"func foo(bar: String) async -> (Int, Int)\n",
"func foo(bar: String) async -> (Int, Int) {}\n",
"func foo() async throws -> (Int, Int)\n",
"func foo() async throws -> (Int, Int) {}\n",
"let foo: (Int, Int, Int) async -> Void\n",
"let foo: (Int, Int, Int) async throws -> Void\n",
"func foo(bar: (Int, String, Float) async -> Void)\n",
"func foo(bar: (Int, String, Float) async throws -> Void)\n",
"func getDictionaryAndInt() async -> (Dictionary<Int, String>, Int)?\n",
"func getGenericTypeAndInt() async -> (Type<Int, String, Float>, Int)?\n"
Example("let foo: (Int, Int)\n"),
Example("let foo: (start: Int, end: Int)\n"),
Example("let foo: (Int, (Int, String))\n"),
Example("func foo() -> (Int, Int)\n"),
Example("func foo() -> (Int, Int) {}\n"),
Example("func foo(bar: String) -> (Int, Int)\n"),
Example("func foo(bar: String) -> (Int, Int) {}\n"),
Example("func foo() throws -> (Int, Int)\n"),
Example("func foo() throws -> (Int, Int) {}\n"),
Example("let foo: (Int, Int, Int) -> Void\n"),
Example("let foo: (Int, Int, Int) throws -> Void\n"),
Example("func foo(bar: (Int, String, Float) -> Void)\n"),
Example("func foo(bar: (Int, String, Float) throws -> Void)\n"),
Example("var completionHandler: ((_ data: Data?, _ resp: URLResponse?, _ e: NSError?) -> Void)!\n"),
Example("func getDictionaryAndInt() -> (Dictionary<Int, String>, Int)?\n"),
Example("func getGenericTypeAndInt() -> (Type<Int, String, Float>, Int)?\n"),
Example("func foo() async -> (Int, Int)\n"),
Example("func foo() async -> (Int, Int) {}\n"),
Example("func foo(bar: String) async -> (Int, Int)\n"),
Example("func foo(bar: String) async -> (Int, Int) {}\n"),
Example("func foo() async throws -> (Int, Int)\n"),
Example("func foo() async throws -> (Int, Int) {}\n"),
Example("let foo: (Int, Int, Int) async -> Void\n"),
Example("let foo: (Int, Int, Int) async throws -> Void\n"),
Example("func foo(bar: (Int, String, Float) async -> Void)\n"),
Example("func foo(bar: (Int, String, Float) async throws -> Void)\n"),
Example("func getDictionaryAndInt() async -> (Dictionary<Int, String>, Int)?\n"),
Example("func getGenericTypeAndInt() async -> (Type<Int, String, Float>, Int)?\n")
]
static let triggeringExamples: [Example] = [
"let foo: ↓(Int, Int, Int)\n",
"let foo: ↓(start: Int, end: Int, value: String)\n",
"let foo: (Int, ↓(Int, Int, Int))\n",
"func foo(bar: ↓(Int, Int, Int))\n",
"func foo() -> ↓(Int, Int, Int)\n",
"func foo() -> ↓(Int, Int, Int) {}\n",
"func foo(bar: String) -> ↓(Int, Int, Int)\n",
"func foo(bar: String) -> ↓(Int, Int, Int) {}\n",
"func foo() throws -> ↓(Int, Int, Int)\n",
"func foo() throws -> ↓(Int, Int, Int) {}\n",
"func foo() throws -> ↓(Int, ↓(String, String, String), Int) {}\n",
"func getDictionaryAndInt() -> (Dictionary<Int, ↓(String, String, String)>, Int)?\n",
"func foo(bar: ↓(Int, Int, Int)) async\n",
"func foo() async -> ↓(Int, Int, Int)\n",
"func foo() async -> ↓(Int, Int, Int) {}\n",
"func foo(bar: String) async -> ↓(Int, Int, Int)\n",
"func foo(bar: String) async -> ↓(Int, Int, Int) {}\n",
"func foo() async throws -> ↓(Int, Int, Int)\n",
"func foo() async throws -> ↓(Int, Int, Int) {}\n",
"func foo() async throws -> ↓(Int, ↓(String, String, String), Int) {}\n",
"func getDictionaryAndInt() async -> (Dictionary<Int, ↓(String, String, String)>, Int)?\n"
Example("let foo: ↓(Int, Int, Int)\n"),
Example("let foo: ↓(start: Int, end: Int, value: String)\n"),
Example("let foo: (Int, ↓(Int, Int, Int))\n"),
Example("func foo(bar: ↓(Int, Int, Int))\n"),
Example("func foo() -> ↓(Int, Int, Int)\n"),
Example("func foo() -> ↓(Int, Int, Int) {}\n"),
Example("func foo(bar: String) -> ↓(Int, Int, Int)\n"),
Example("func foo(bar: String) -> ↓(Int, Int, Int) {}\n"),
Example("func foo() throws -> ↓(Int, Int, Int)\n"),
Example("func foo() throws -> ↓(Int, Int, Int) {}\n"),
Example("func foo() throws -> ↓(Int, ↓(String, String, String), Int) {}\n"),
Example("func getDictionaryAndInt() -> (Dictionary<Int, ↓(String, String, String)>, Int)?\n"),
Example("func foo(bar: ↓(Int, Int, Int)) async\n"),
Example("func foo() async -> ↓(Int, Int, Int)\n"),
Example("func foo() async -> ↓(Int, Int, Int) {}\n"),
Example("func foo(bar: String) async -> ↓(Int, Int, Int)\n"),
Example("func foo(bar: String) async -> ↓(Int, Int, Int) {}\n"),
Example("func foo() async throws -> ↓(Int, Int, Int)\n"),
Example("func foo() async throws -> ↓(Int, Int, Int) {}\n"),
Example("func foo() async throws -> ↓(Int, ↓(String, String, String), Int) {}\n"),
Example("func getDictionaryAndInt() async -> (Dictionary<Int, ↓(String, String, String)>, Int)?\n")
]
}
@@ -10,20 +10,20 @@ struct ContainsOverFilterCountRule: SwiftSyntaxRule, OptInRule, ConfigurationPro
kind: .performance,
nonTriggeringExamples: [">", "==", "!="].flatMap { operation in
return [
"let result = myList.filter(where: { $0 % 2 == 0 }).count \(operation) 1\n",
"let result = myList.filter { $0 % 2 == 0 }.count \(operation) 1\n",
"let result = myList.filter(where: { $0 % 2 == 0 }).count \(operation) 01\n"
Example("let result = myList.filter(where: { $0 % 2 == 0 }).count \(operation) 1\n"),
Example("let result = myList.filter { $0 % 2 == 0 }.count \(operation) 1\n"),
Example("let result = myList.filter(where: { $0 % 2 == 0 }).count \(operation) 01\n")
]
} + [
"let result = myList.contains(where: { $0 % 2 == 0 })\n",
"let result = !myList.contains(where: { $0 % 2 == 0 })\n",
"let result = myList.contains(10)\n"
Example("let result = myList.contains(where: { $0 % 2 == 0 })\n"),
Example("let result = !myList.contains(where: { $0 % 2 == 0 })\n"),
Example("let result = myList.contains(10)\n")
],
triggeringExamples: [">", "==", "!="].flatMap { operation in
return [
"let result = ↓myList.filter(where: { $0 % 2 == 0 }).count \(operation) 0\n",
"let result = ↓myList.filter { $0 % 2 == 0 }.count \(operation) 0\n",
"let result = ↓myList.filter(where: someFunction).count \(operation) 0\n"
Example("let result = ↓myList.filter(where: { $0 % 2 == 0 }).count \(operation) 0\n"),
Example("let result = ↓myList.filter { $0 % 2 == 0 }.count \(operation) 0\n"),
Example("let result = ↓myList.filter(where: someFunction).count \(operation) 0\n")
]
}
)
@@ -10,19 +10,19 @@ struct ContainsOverFilterIsEmptyRule: SwiftSyntaxRule, OptInRule, ConfigurationP
kind: .performance,
nonTriggeringExamples: [">", "==", "!="].flatMap { operation in
return [
"let result = myList.filter(where: { $0 % 2 == 0 }).count \(operation) 1\n",
"let result = myList.filter { $0 % 2 == 0 }.count \(operation) 1\n"
Example("let result = myList.filter(where: { $0 % 2 == 0 }).count \(operation) 1\n"),
Example("let result = myList.filter { $0 % 2 == 0 }.count \(operation) 1\n")
]
} + [
"let result = myList.contains(where: { $0 % 2 == 0 })\n",
"let result = !myList.contains(where: { $0 % 2 == 0 })\n",
"let result = myList.contains(10)\n"
Example("let result = myList.contains(where: { $0 % 2 == 0 })\n"),
Example("let result = !myList.contains(where: { $0 % 2 == 0 })\n"),
Example("let result = myList.contains(10)\n")
],
triggeringExamples: [
"let result = ↓myList.filter(where: { $0 % 2 == 0 }).isEmpty\n",
"let result = !↓myList.filter(where: { $0 % 2 == 0 }).isEmpty\n",
"let result = ↓myList.filter { $0 % 2 == 0 }.isEmpty\n",
"let result = ↓myList.filter(where: someFunction).isEmpty\n"
Example("let result = ↓myList.filter(where: { $0 % 2 == 0 }).isEmpty\n"),
Example("let result = !↓myList.filter(where: { $0 % 2 == 0 }).isEmpty\n"),
Example("let result = ↓myList.filter { $0 % 2 == 0 }.isEmpty\n"),
Example("let result = ↓myList.filter(where: someFunction).isEmpty\n")
]
)
@@ -10,19 +10,19 @@ struct ContainsOverFirstNotNilRule: SwiftSyntaxRule, OptInRule, ConfigurationPro
kind: .performance,
nonTriggeringExamples: ["first", "firstIndex"].flatMap { method in
return [
"let \(method) = myList.\(method)(where: { $0 % 2 == 0 })\n",
"let \(method) = myList.\(method) { $0 % 2 == 0 }\n"
Example("let \(method) = myList.\(method)(where: { $0 % 2 == 0 })\n"),
Example("let \(method) = myList.\(method) { $0 % 2 == 0 }\n")
]
},
triggeringExamples: ["first", "firstIndex"].flatMap { method in
return ["!=", "=="].flatMap { comparison in
return [
"↓myList.\(method) { $0 % 2 == 0 } \(comparison) nil\n",
"↓myList.\(method)(where: { $0 % 2 == 0 }) \(comparison) nil\n",
"↓myList.map { $0 + 1 }.\(method)(where: { $0 % 2 == 0 }) \(comparison) nil\n",
"↓myList.\(method)(where: someFunction) \(comparison) nil\n",
"↓myList.map { $0 + 1 }.\(method) { $0 % 2 == 0 } \(comparison) nil\n",
"(↓myList.\(method) { $0 % 2 == 0 }) \(comparison) nil\n"
Example("↓myList.\(method) { $0 % 2 == 0 } \(comparison) nil\n"),
Example("↓myList.\(method)(where: { $0 % 2 == 0 }) \(comparison) nil\n"),
Example("↓myList.map { $0 + 1 }.\(method)(where: { $0 % 2 == 0 }) \(comparison) nil\n"),
Example("↓myList.\(method)(where: someFunction) \(comparison) nil\n"),
Example("↓myList.map { $0 + 1 }.\(method) { $0 % 2 == 0 } \(comparison) nil\n"),
Example("(↓myList.\(method) { $0 % 2 == 0 }) \(comparison) nil\n")
]
}
}
@@ -9,15 +9,16 @@ struct ContainsOverRangeNilComparisonRule: SwiftSyntaxRule, OptInRule, Configura
description: "Prefer `contains` over `range(of:) != nil` and `range(of:) == nil`",
kind: .performance,
nonTriggeringExamples: [
"let range = myString.range(of: \"Test\")",
"myString.contains(\"Test\")",
"!myString.contains(\"Test\")",
"resourceString.range(of: rule.regex, options: .regularExpression) != nil"
Example("let range = myString.range(of: \"Test\")"),
Example("myString.contains(\"Test\")"),
Example("!myString.contains(\"Test\")"),
Example("resourceString.range(of: rule.regex, options: .regularExpression) != nil")
],
triggeringExamples: [
"↓myString.range(of: \"Test\") != nil",
"↓myString.range(of: \"Test\") == nil"
]
triggeringExamples: ["!=", "=="].flatMap { comparison in
return [
Example("↓myString.range(of: \"Test\") \(comparison) nil")
]
}
)
func preprocess(file: SwiftLintFile) -> SourceFileSyntax? {
@@ -9,20 +9,20 @@ struct EmptyCollectionLiteralRule: SwiftSyntaxRule, ConfigurationProviderRule, O
description: "Prefer checking `isEmpty` over comparing collection to an empty array or dictionary literal",
kind: .performance,
nonTriggeringExamples: [
"myArray = []",
"myArray.isEmpty",
"!myArray.isEmpty",
"myDict = [:]"
Example("myArray = []"),
Example("myArray.isEmpty"),
Example("!myArray.isEmpty"),
Example("myDict = [:]")
],
triggeringExamples: [
"myArray↓ == []",
"myArray↓ != []",
"myArray↓ == [ ]",
"myDict↓ == [:]",
"myDict↓ != [:]",
"myDict↓ == [: ]",
"myDict↓ == [ :]",
"myDict↓ == [ : ]"
Example("myArray↓ == []"),
Example("myArray↓ != []"),
Example("myArray↓ == [ ]"),
Example("myDict↓ == [:]"),
Example("myDict↓ != [:]"),
Example("myDict↓ == [: ]"),
Example("myDict↓ == [ :]"),
Example("myDict↓ == [ : ]")
]
)
@@ -9,27 +9,27 @@ struct EmptyCountRule: ConfigurationProviderRule, OptInRule, SwiftSyntaxRule {
description: "Prefer checking `isEmpty` over comparing `count` to zero",
kind: .performance,
nonTriggeringExamples: [
"var count = 0\n",
"[Int]().isEmpty\n",
"[Int]().count > 1\n",
"[Int]().count == 1\n",
"[Int]().count == 0xff\n",
"[Int]().count == 0b01\n",
"[Int]().count == 0o07\n",
"discount == 0\n",
"order.discount == 0\n"
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: [
"[Int]().↓count == 0\n",
"0 == [Int]().↓count\n",
"[Int]().↓count==0\n",
"[Int]().↓count > 0\n",
"[Int]().↓count != 0\n",
"[Int]().↓count == 0x0\n",
"[Int]().↓count == 0x00_00\n",
"[Int]().↓count == 0b00\n",
"[Int]().↓count == 0o00\n",
"↓count == 0\n"
Example("[Int]().↓count == 0\n"),
Example("0 == [Int]().↓count\n"),
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")
]
)
@@ -9,11 +9,11 @@ struct FlatMapOverMapReduceRule: SwiftSyntaxRule, OptInRule, ConfigurationProvid
description: "Prefer `flatMap` over `map` followed by `reduce([], +)`",
kind: .performance,
nonTriggeringExamples: [
"let foo = bar.map { $0.count }.reduce(0, +)",
"let foo = bar.flatMap { $0.array }"
Example("let foo = bar.map { $0.count }.reduce(0, +)"),
Example("let foo = bar.flatMap { $0.array }")
],
triggeringExamples: [
"let foo = ↓bar.map { $0.array }.reduce([], +)"
Example("let foo = ↓bar.map { $0.array }.reduce([], +)")
]
)
@@ -9,20 +9,20 @@ struct ReduceBooleanRule: SwiftSyntaxRule, ConfigurationProviderRule {
description: "Prefer using `.allSatisfy()` or `.contains()` over `reduce(true)` or `reduce(false)`.",
kind: .performance,
nonTriggeringExamples: [
"nums.reduce(0) { $0.0 + $0.1 }",
"nums.reduce(0.0) { $0.0 + $0.1 }",
"nums.reduce(initial: true) { $0.0 && $0.1 == 3 }"
Example("nums.reduce(0) { $0.0 + $0.1 }"),
Example("nums.reduce(0.0) { $0.0 + $0.1 }"),
Example("nums.reduce(initial: true) { $0.0 && $0.1 == 3 }")
],
triggeringExamples: [
"let allNines = nums.↓reduce(true) { $0.0 && $0.1 == 9 }",
"let anyNines = nums.↓reduce(false) { $0.0 || $0.1 == 9 }",
"let allValid = validators.↓reduce(true) { $0 && $1(input) }",
"let anyValid = validators.↓reduce(false) { $0 || $1(input) }",
"let allNines = nums.↓reduce(true, { $0.0 && $0.1 == 9 })",
"let anyNines = nums.↓reduce(false, { $0.0 || $0.1 == 9 })",
"let allValid = validators.↓reduce(true, { $0 && $1(input) })",
"let anyValid = validators.↓reduce(false, { $0 || $1(input) })",
"nums.reduce(into: true) { (r: inout Bool, s) in r = r && (s == 3) }"
Example("let allNines = nums.↓reduce(true) { $0.0 && $0.1 == 9 }"),
Example("let anyNines = nums.↓reduce(false) { $0.0 || $0.1 == 9 }"),
Example("let allValid = validators.↓reduce(true) { $0 && $1(input) }"),
Example("let anyValid = validators.↓reduce(false) { $0 || $1(input) }"),
Example("let allNines = nums.↓reduce(true, { $0.0 && $0.1 == 9 })"),
Example("let anyNines = nums.↓reduce(false, { $0.0 || $0.1 == 9 })"),
Example("let allValid = validators.↓reduce(true, { $0 && $1(input) })"),
Example("let anyValid = validators.↓reduce(false, { $0 || $1(input) })"),
Example("nums.reduce(into: true) { (r: inout Bool, s) in r = r && (s == 3) }")
]
)
@@ -9,17 +9,17 @@ struct OperatorFunctionWhitespaceRule: ConfigurationProviderRule, SwiftSyntaxRul
description: "Operators should be surrounded by a single whitespace when defining them",
kind: .style,
nonTriggeringExamples: [
"func <| (lhs: Int, rhs: Int) -> Int {}\n",
"func <|< <A>(lhs: A, rhs: A) -> A {}\n",
"func abc(lhs: Int, rhs: Int) -> Int {}\n"
Example("func <| (lhs: Int, rhs: Int) -> Int {}\n"),
Example("func <|< <A>(lhs: A, rhs: A) -> A {}\n"),
Example("func abc(lhs: Int, rhs: Int) -> Int {}\n")
],
triggeringExamples: [
"↓func <|(lhs: Int, rhs: Int) -> Int {}\n", // no spaces after
"↓func <|<<A>(lhs: A, rhs: A) -> A {}\n", // no spaces after
"↓func <| (lhs: Int, rhs: Int) -> Int {}\n", // 2 spaces after
"↓func <|< <A>(lhs: A, rhs: A) -> A {}\n", // 2 spaces after
"↓func <| (lhs: Int, rhs: Int) -> Int {}\n", // 2 spaces before
"↓func <|< <A>(lhs: A, rhs: A) -> A {}\n" // 2 spaces before
Example("↓func <|(lhs: Int, rhs: Int) -> Int {}\n"), // no spaces after
Example("↓func <|<<A>(lhs: A, rhs: A) -> A {}\n"), // no spaces after
Example("↓func <| (lhs: Int, rhs: Int) -> Int {}\n"), // 2 spaces after
Example("↓func <|< <A>(lhs: A, rhs: A) -> A {}\n"), // 2 spaces after
Example("↓func <| (lhs: Int, rhs: Int) -> Int {}\n"), // 2 spaces before
Example("↓func <|< <A>(lhs: A, rhs: A) -> A {}\n") // 2 spaces before
]
)
@@ -10,21 +10,21 @@ struct TrailingClosureRule: OptInRule, ConfigurationProviderRule {
description: "Trailing closure syntax should be used whenever possible",
kind: .style,
nonTriggeringExamples: [
"foo.map { $0 + 1 }\n",
"foo.bar()\n",
"foo.reduce(0) { $0 + 1 }\n",
"if let foo = bar.map({ $0 + 1 }) { }\n",
"foo.something(param1: { $0 }, param2: { $0 + 1 })\n",
"offsets.sorted { $0.offset < $1.offset }\n",
"foo.something({ return 1 }())",
"foo.something({ return $0 }(1))",
"foo.something(0, { return 1 }())"
Example("foo.map { $0 + 1 }\n"),
Example("foo.bar()\n"),
Example("foo.reduce(0) { $0 + 1 }\n"),
Example("if let foo = bar.map({ $0 + 1 }) { }\n"),
Example("foo.something(param1: { $0 }, param2: { $0 + 1 })\n"),
Example("offsets.sorted { $0.offset < $1.offset }\n"),
Example("foo.something({ return 1 }())"),
Example("foo.something({ return $0 }(1))"),
Example("foo.something(0, { return 1 }())")
],
triggeringExamples: [
"↓foo.map({ $0 + 1 })\n",
"↓foo.reduce(0, combine: { $0 + 1 })\n",
"↓offsets.sorted(by: { $0.offset < $1.offset })\n",
"↓foo.something(0, { $0 + 1 })\n"
Example("↓foo.map({ $0 + 1 })\n"),
Example("↓foo.reduce(0, combine: { $0 + 1 })\n"),
Example("↓offsets.sorted(by: { $0.offset < $1.offset })\n"),
Example("↓foo.something(0, { $0 + 1 })\n")
]
)
@@ -147,13 +147,6 @@ extension Example: Comparable {
}
}
/// Allows to initialize an ``Example`` as `let example: Example = "..."`.
extension Example: ExpressibleByStringInterpolation {
public init(stringLiteral value: String) {
self.init(value)
}
}
public extension Array where Element == Example {
/// Make these examples skip wrapping in comment tests.
func skipWrappingInCommentTests() -> Self {