From d4ba2ddc3e88c6d35bb6c698e860775652f3a829 Mon Sep 17 00:00:00 2001 From: chetan-kmr-0607 <118420797+chetan-kmr-0607@users.noreply.github.com> Date: Sun, 12 Oct 2025 05:19:49 -0700 Subject: [PATCH] fix: skip redundant_optional_initialization for @Parameter variables (#5884) This change updates ImplicitOptionalInitializationRule so that variables annotated with @Parameter (from TipKit) are ignored when checking for redundant nil initializers. TipKit's @Parameter macro requires explicitly initializing optional parameters to nil; otherwise the macro fails to expand. Without this change, the implicit_optional_initialization rule incorrectly flags these initializers, forcing developers to disable the rule. Resolves #5884. --- .../ImplicitOptionalInitializationRule.swift | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Source/SwiftLintBuiltInRules/Rules/Style/ImplicitOptionalInitializationRule.swift b/Source/SwiftLintBuiltInRules/Rules/Style/ImplicitOptionalInitializationRule.swift index 402c21dd6d..caf809bba9 100644 --- a/Source/SwiftLintBuiltInRules/Rules/Style/ImplicitOptionalInitializationRule.swift +++ b/Source/SwiftLintBuiltInRules/Rules/Style/ImplicitOptionalInitializationRule.swift @@ -1,4 +1,4 @@ -import SwiftSyntax +eimport SwiftSyntax @SwiftSyntaxRule(explicitRewriter: true) struct ImplicitOptionalInitializationRule: Rule { @@ -28,12 +28,19 @@ private extension ImplicitOptionalInitializationRule { override func visitPost(_ node: PatternBindingSyntax) { guard let violationPosition = node.violationPosition(for: configuration.style) else { return } - violations.append(ReasonedRuleViolation(position: violationPosition, reason: reason)) + // // violations.append(ReasonedRuleViolation(position: violationPosition, reason: reason)) + override func visitPost(_ node: PatternBindingSyntax) { +if let variableDecl = node.parent?.as(VariableDeclSyntax.self), + let attrs = variableDecl.attributes, + attrs.contains(where: { attr in + guard let attribute = attr.as(AttributeSyntax.self) else { return false } + return attribute.attributeName.as(SimpleTypeIdentifierSyntax.self)?.name.text == "Parameter" }) { + return } + guard let violationPosition = node.violationPosition(for: configuration.style) else { return } + violations.append(ReasonedRuleViolation(position: violationPosition, reason: reason)) } -} - -private extension ImplicitOptionalInitializationRule { + { final class Rewriter: ViolationsSyntaxRewriter { override func visit(_ node: PatternBindingSyntax) -> PatternBindingSyntax { guard node.violationPosition(for: configuration.style) != nil else {