Fix false alarms in `redundant_objc_attribute` rule (#4742)

This commit is contained in:
Martin Redington 2023-05-20 15:45:27 -04:00 committed by GitHub
parent a2ba0a0626
commit 521df18fdb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 85 additions and 15 deletions

View File

@ -32,6 +32,11 @@
[SimplyDanny](https://github.com/SimplyDanny) [SimplyDanny](https://github.com/SimplyDanny)
[#5009](https://github.com/realm/SwiftLint/issues/5009) [#5009](https://github.com/realm/SwiftLint/issues/5009)
* Fix false positives on `redundant_objc_attribute` rule for enums
and private members.
[Martin Redington](https://github.com/mildm8nnered)
[#4633](https://github.com/realm/SwiftLint/issues/4633)
* Fix autocorrect for `CGIntersectionRect` in `legacy_cggeometry_functions` * Fix autocorrect for `CGIntersectionRect` in `legacy_cggeometry_functions`
rule. rule.
[Haoocen](https://github.com/Haoocen) [Haoocen](https://github.com/Haoocen)

View File

@ -68,6 +68,15 @@ private extension Syntax {
return false return false
} }
} }
var functionOrVariableModifiers: ModifierListSyntax? {
if let functionDecl = self.as(FunctionDeclSyntax.self) {
return functionDecl.modifiers
} else if let variableDecl = self.as(VariableDeclSyntax.self) {
return variableDecl.modifiers
}
return nil
}
} }
private extension AttributeListSyntax { private extension AttributeListSyntax {
@ -78,10 +87,12 @@ private extension AttributeListSyntax {
if hasAttributeImplyingObjC, parent?.is(ExtensionDeclSyntax.self) != true { if hasAttributeImplyingObjC, parent?.is(ExtensionDeclSyntax.self) != true {
return objcAttribute return objcAttribute
} else if parent?.is(EnumDeclSyntax.self) == true {
return nil
} else if parent?.isFunctionOrStoredProperty == true, } else if parent?.isFunctionOrStoredProperty == true,
let parentClassDecl = parent?.parent?.parent?.parent?.parent?.as(ClassDeclSyntax.self), let parentClassDecl = parent?.parent?.parent?.parent?.parent?.as(ClassDeclSyntax.self),
parentClassDecl.attributes.contains(attributeNamed: "objcMembers") { parentClassDecl.attributes.contains(attributeNamed: "objcMembers") {
return objcAttribute return parent?.functionOrVariableModifiers.isPrivateOrFileprivate == true ? nil : objcAttribute
} else if let parentExtensionDecl = parent?.parent?.parent?.parent?.parent?.as(ExtensionDeclSyntax.self), } else if let parentExtensionDecl = parent?.parent?.parent?.parent?.parent?.as(ExtensionDeclSyntax.self),
parentExtensionDecl.attributes?.objCAttribute != nil { parentExtensionDecl.attributes?.objCAttribute != nil {
return objcAttribute return objcAttribute

View File

@ -13,7 +13,7 @@ struct RedundantObjcAttributeRuleExamples {
class Foo { class Foo {
var bar: Any? var bar: Any?
@objc @objc
class Bar { class Bar: NSObject {
@objc @objc
var foo: Any? var foo: Any?
} }
@ -59,14 +59,15 @@ struct RedundantObjcAttributeRuleExamples {
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo {
@objc
class Bar: NSObject { class Bar: NSObject {
@objc var foo: Any @objc var foo: Any?
} }
} }
"""), """),
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
@objc class Bar {} @objc class Bar {}
} }
"""), """),
@ -75,6 +76,59 @@ struct RedundantObjcAttributeRuleExamples {
@objc(addElementsObject:) @objc(addElementsObject:)
@NSManaged public func addToElements(_ value: BlockEditorSettingElement) @NSManaged public func addToElements(_ value: BlockEditorSettingElement)
} }
"""),
Example("""
@objcMembers
public class Foo: NSObject {
@objc
private func handler(_ notification: Notification) {
}
func registerForNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(handler(_:)), name: nil, object: nil)
}
}
"""),
Example("""
class Foo: NSObject { }
@objc extension Foo {
@objc enum Bar: Int {
case bar
}
var bar: Bar { .bar }
}
"""),
Example("""
class Foo: NSObject { }
@objc extension Foo {
@objc private enum Baz: Int {
case baz
}
private var baz: Baz { .baz }
}
"""),
Example("""
@objcMembers
internal class Foo: NSObject {
@objc
private var baz: Int = 1
var x: Any? {
value(forKey: "baz")
}
}
"""),
Example("""
@objcMembers
class Foo: NSObject {
@objc enum Bar: Int {
case bar
}
}
""") """)
] ]
@ -90,13 +144,13 @@ struct RedundantObjcAttributeRuleExamples {
Example("↓@objc @IBDesignable class Foo {}"), Example("↓@objc @IBDesignable class Foo {}"),
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
@objc var bar: Any? @objc var bar: Any?
} }
"""), """),
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
@objc var bar: Any? @objc var bar: Any?
@objc var foo: Any? @objc var foo: Any?
@objc @objc
@ -126,7 +180,7 @@ struct RedundantObjcAttributeRuleExamples {
"""), """),
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
@objcMembers @objcMembers
class Bar: NSObject { class Bar: NSObject {
@objc var foo: Any @objc var foo: Any
@ -160,23 +214,23 @@ struct RedundantObjcAttributeRuleExamples {
Example("↓@objc @IBDesignable class Foo {}"): Example("@IBDesignable class Foo {}"), Example("↓@objc @IBDesignable class Foo {}"): Example("@IBDesignable class Foo {}"),
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
@objc var bar: Any? @objc var bar: Any?
} }
"""): """):
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
var bar: Any? var bar: Any?
} }
"""), """),
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
@objc var bar: Any? @objc var bar: Any?
@objc var foo: Any? @objc var foo: Any?
@objc @objc
class Bar { class Bar: NSObject {
@objc @objc
var foo2: Any? var foo2: Any?
} }
@ -184,11 +238,11 @@ struct RedundantObjcAttributeRuleExamples {
"""): """):
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
var bar: Any? var bar: Any?
var foo: Any? var foo: Any?
@objc @objc
class Bar { class Bar: NSObject {
@objc @objc
var foo2: Any? var foo2: Any?
} }
@ -230,7 +284,7 @@ struct RedundantObjcAttributeRuleExamples {
"""), """),
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
@objcMembers @objcMembers
class Bar: NSObject { class Bar: NSObject {
@objc var foo: Any @objc var foo: Any
@ -239,7 +293,7 @@ struct RedundantObjcAttributeRuleExamples {
"""): """):
Example(""" Example("""
@objcMembers @objcMembers
class Foo { class Foo: NSObject {
@objcMembers @objcMembers
class Bar: NSObject { class Bar: NSObject {
var foo: Any var foo: Any