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)
[#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`
rule.
[Haoocen](https://github.com/Haoocen)

View File

@ -68,6 +68,15 @@ private extension Syntax {
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 {
@ -78,10 +87,12 @@ private extension AttributeListSyntax {
if hasAttributeImplyingObjC, parent?.is(ExtensionDeclSyntax.self) != true {
return objcAttribute
} else if parent?.is(EnumDeclSyntax.self) == true {
return nil
} else if parent?.isFunctionOrStoredProperty == true,
let parentClassDecl = parent?.parent?.parent?.parent?.parent?.as(ClassDeclSyntax.self),
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),
parentExtensionDecl.attributes?.objCAttribute != nil {
return objcAttribute

View File

@ -13,7 +13,7 @@ struct RedundantObjcAttributeRuleExamples {
class Foo {
var bar: Any?
@objc
class Bar {
class Bar: NSObject {
@objc
var foo: Any?
}
@ -59,14 +59,15 @@ struct RedundantObjcAttributeRuleExamples {
Example("""
@objcMembers
class Foo {
@objc
class Bar: NSObject {
@objc var foo: Any
@objc var foo: Any?
}
}
"""),
Example("""
@objcMembers
class Foo {
class Foo: NSObject {
@objc class Bar {}
}
"""),
@ -75,6 +76,59 @@ struct RedundantObjcAttributeRuleExamples {
@objc(addElementsObject:)
@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("""
@objcMembers
class Foo {
class Foo: NSObject {
@objc var bar: Any?
}
"""),
Example("""
@objcMembers
class Foo {
class Foo: NSObject {
@objc var bar: Any?
@objc var foo: Any?
@objc
@ -126,7 +180,7 @@ struct RedundantObjcAttributeRuleExamples {
"""),
Example("""
@objcMembers
class Foo {
class Foo: NSObject {
@objcMembers
class Bar: NSObject {
@objc var foo: Any
@ -160,23 +214,23 @@ struct RedundantObjcAttributeRuleExamples {
Example("↓@objc @IBDesignable class Foo {}"): Example("@IBDesignable class Foo {}"),
Example("""
@objcMembers
class Foo {
class Foo: NSObject {
@objc var bar: Any?
}
"""):
Example("""
@objcMembers
class Foo {
class Foo: NSObject {
var bar: Any?
}
"""),
Example("""
@objcMembers
class Foo {
class Foo: NSObject {
@objc var bar: Any?
@objc var foo: Any?
@objc
class Bar {
class Bar: NSObject {
@objc
var foo2: Any?
}
@ -184,11 +238,11 @@ struct RedundantObjcAttributeRuleExamples {
"""):
Example("""
@objcMembers
class Foo {
class Foo: NSObject {
var bar: Any?
var foo: Any?
@objc
class Bar {
class Bar: NSObject {
@objc
var foo2: Any?
}
@ -230,7 +284,7 @@ struct RedundantObjcAttributeRuleExamples {
"""),
Example("""
@objcMembers
class Foo {
class Foo: NSObject {
@objcMembers
class Bar: NSObject {
@objc var foo: Any
@ -239,7 +293,7 @@ struct RedundantObjcAttributeRuleExamples {
"""):
Example("""
@objcMembers
class Foo {
class Foo: NSObject {
@objcMembers
class Bar: NSObject {
var foo: Any