diff --git a/CHANGELOG.md b/CHANGELOG.md index d74d76a455..c105c4d438 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ ### Bug Fixes +* Fix `missing_docs` false positives for implicit actor requirements. + [ZHUOLIN0928](https://github.com/ZHUOLIN0928) + [#5422](https://github.com/realm/SwiftLint/issues/5422) + * Add an opt-in `allow_explicit_unsafe_unowned` option to let the `unowned_variable_capture` rule accept explicit `unowned(unsafe)` captures. [Yurii Bakurov](https://github.com/Yurii201811) diff --git a/Source/SwiftLintBuiltInRules/Rules/Lint/MissingDocsRule.swift b/Source/SwiftLintBuiltInRules/Rules/Lint/MissingDocsRule.swift index 6a5fb6765f..428d645dd8 100644 --- a/Source/SwiftLintBuiltInRules/Rules/Lint/MissingDocsRule.swift +++ b/Source/SwiftLintBuiltInRules/Rules/Lint/MissingDocsRule.swift @@ -130,6 +130,9 @@ private extension MissingDocsRule { } override func visit(_ node: VariableDeclSyntax) -> SyntaxVisitorContinueKind { + if configuration.excludesInheritedTypes, node.isActorRequirement { + return .skipChildren + } collectViolation(from: node, on: node.bindingSpecifier) return .skipChildren } @@ -152,6 +155,17 @@ private extension MissingDocsRule { } } +private extension VariableDeclSyntax { + var isActorRequirement: Bool { + guard bindings.count == 1, + let identifier = bindings.first?.pattern.as(IdentifierPatternSyntax.self), + identifier.identifier.text == "unownedExecutor" else { + return false + } + return parent?.parent?.parent?.parent?.is(ActorDeclSyntax.self) == true + } +} + private extension DeclGroupSyntax { var inherits: Bool { if let types = inheritanceClause?.inheritedTypes, types.isNotEmpty { diff --git a/Source/SwiftLintBuiltInRules/Rules/Lint/MissingDocsRuleExamples.swift b/Source/SwiftLintBuiltInRules/Rules/Lint/MissingDocsRuleExamples.swift index edef0da32d..0a2b258d67 100644 --- a/Source/SwiftLintBuiltInRules/Rules/Lint/MissingDocsRuleExamples.swift +++ b/Source/SwiftLintBuiltInRules/Rules/Lint/MissingDocsRuleExamples.swift @@ -54,6 +54,12 @@ struct MissingDocsRuleExamples { } """, """ + /// Documentation for MyActor. + public final actor MyActor { + public nonisolated var unownedExecutor: UnownedSerialExecutor { fatalError() } + } + """, + """ /// my doc #if os(macOS) public func f() {}