From 7bd8362dae8a95dcdbabbfcee454bb1a45764d3f Mon Sep 17 00:00:00 2001 From: Marcelo Fabri Date: Mon, 19 Dec 2022 13:31:34 -0300 Subject: [PATCH] Fix false positive on `private_subject` (#4646) Fixes #4643 --- CHANGELOG.md | 5 ++++- .../Protocols/SwiftSyntaxRule.swift | 4 ++++ .../Rules/Lint/PrivateSubjectRule.swift | 4 ++++ .../Rules/Lint/PrivateSubjectRuleExamples.swift | 17 ++++++++++++----- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a843d8f6..eba8ee15c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,10 @@ #### Bug Fixes -* None. +* Fix false positives on `private_subject` rule when using + subjects inside functions. + [Marcelo Fabri](https://github.com/marcelofabri) + [#4643](https://github.com/realm/SwiftLint/issues/4643) ## 0.50.3: Bundle of Towels diff --git a/Source/SwiftLintFramework/Protocols/SwiftSyntaxRule.swift b/Source/SwiftLintFramework/Protocols/SwiftSyntaxRule.swift index 3e3f4f7d6..6f18ea79f 100644 --- a/Source/SwiftLintFramework/Protocols/SwiftSyntaxRule.swift +++ b/Source/SwiftLintFramework/Protocols/SwiftSyntaxRule.swift @@ -154,6 +154,10 @@ open class ViolationsSyntaxVisitor: SyntaxVisitor { skippableDeclarations.contains { $0 == FunctionDeclSyntax.self } ? .skipChildren : .visitChildren } + override open func visit(_ node: SubscriptDeclSyntax) -> SyntaxVisitorContinueKind { + skippableDeclarations.contains { $0 == FunctionDeclSyntax.self } ? .skipChildren : .visitChildren + } + override open func visit(_ node: VariableDeclSyntax) -> SyntaxVisitorContinueKind { skippableDeclarations.contains { $0 == VariableDeclSyntax.self } ? .skipChildren : .visitChildren } diff --git a/Source/SwiftLintFramework/Rules/Lint/PrivateSubjectRule.swift b/Source/SwiftLintFramework/Rules/Lint/PrivateSubjectRule.swift index 1b8136217..cf87dfb19 100644 --- a/Source/SwiftLintFramework/Rules/Lint/PrivateSubjectRule.swift +++ b/Source/SwiftLintFramework/Rules/Lint/PrivateSubjectRule.swift @@ -29,6 +29,10 @@ private extension PrivateSubjectRule { final class Visitor: ViolationsSyntaxVisitor { private let subjectTypes: Set = ["PassthroughSubject", "CurrentValueSubject"] + override var skippableDeclarations: [DeclSyntaxProtocol.Type] { + [FunctionDeclSyntax.self, VariableDeclSyntax.self, SubscriptDeclSyntax.self] + } + override func visitPost(_ node: VariableDeclSyntax) { guard !node.modifiers.isPrivateOrFileprivate, !node.modifiers.containsStaticOrClass else { diff --git a/Source/SwiftLintFramework/Rules/Lint/PrivateSubjectRuleExamples.swift b/Source/SwiftLintFramework/Rules/Lint/PrivateSubjectRuleExamples.swift index 671e602ae..4c6a048ca 100644 --- a/Source/SwiftLintFramework/Rules/Lint/PrivateSubjectRuleExamples.swift +++ b/Source/SwiftLintFramework/Rules/Lint/PrivateSubjectRuleExamples.swift @@ -24,7 +24,7 @@ internal struct PrivateSubjectRuleExamples { Example( #""" final class Foobar { - private let goodSubject: PassthroughSubject = .ini() + private let goodSubject: PassthroughSubject = .init() } """# ), @@ -52,7 +52,7 @@ internal struct PrivateSubjectRuleExamples { Example( #""" final class Foobar { - private let goodSubject: CurrentValueSubject = .ini("toto") + private let goodSubject: CurrentValueSubject = .init("toto") } """# ), @@ -89,7 +89,7 @@ internal struct PrivateSubjectRuleExamples { #""" final class Foobar { private let goodSubject: - PassthroughSubject = .ini() + PassthroughSubject = .init() } """# ), @@ -100,6 +100,13 @@ internal struct PrivateSubjectRuleExamples { CurrentValueSubject(true) } """# + ), + Example( + """ + func foo() { + let goodSubject = PassthroughSubject(true) + } + """ ) ] @@ -135,7 +142,7 @@ internal struct PrivateSubjectRuleExamples { Example( #""" final class Foobar { - let goodSubject: PassthroughSubject = .ini() + let goodSubject: PassthroughSubject = .init() } """# ), @@ -243,7 +250,7 @@ internal struct PrivateSubjectRuleExamples { #""" final class Foobar { let ↓badSubject: - PassthroughSubject = .ini() + PassthroughSubject = .init() } """# ),