From 12557c91cef9f1ef9c51ba9a015f7b5317ba1b33 Mon Sep 17 00:00:00 2001 From: Ian Leitch Date: Fri, 22 Dec 2023 09:49:36 +0000 Subject: [PATCH] Better fix for inherited generic parameter RPAA false-positive --- Sources/PeripheryKit/Indexer/Reference.swift | 1 + Sources/PeripheryKit/Indexer/SwiftIndexer.swift | 7 ++++--- .../AccessibilityProject/Sources/MainTarget/main.swift | 1 + ...licClassInheritingPublicTypeWithGenericParameter.swift | 7 +++++++ .../RedundantPublicAccessibilityTest.swift | 8 ++++++++ 5 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 Tests/AccessibilityTests/AccessibilityProject/Sources/TargetA/PublicClassInheritingPublicTypeWithGenericParameter.swift diff --git a/Sources/PeripheryKit/Indexer/Reference.swift b/Sources/PeripheryKit/Indexer/Reference.swift index 1a9c01b95..01127aff1 100644 --- a/Sources/PeripheryKit/Indexer/Reference.swift +++ b/Sources/PeripheryKit/Indexer/Reference.swift @@ -7,6 +7,7 @@ final class Reference { case genericRequirementType case inheritedType case refinedProtocolType + case conformedType case initializerType case variableInitFunctionCall case functionCallMetatypeArgument diff --git a/Sources/PeripheryKit/Indexer/SwiftIndexer.swift b/Sources/PeripheryKit/Indexer/SwiftIndexer.swift index a19879ecc..67c03404e 100644 --- a/Sources/PeripheryKit/Indexer/SwiftIndexer.swift +++ b/Sources/PeripheryKit/Indexer/SwiftIndexer.swift @@ -392,11 +392,12 @@ public final class SwiftIndexer: Indexer { for ref in decl.references.union(decl.related) { if result.inheritedTypeLocations.contains(ref.location) { - if (decl.kind == .class && ref.kind == .class) || - (decl.kind == .associatedtype && ref.kind == .protocol) { - ref.role = .inheritedType + if decl.kind.isConformableKind, ref.kind == .protocol { + ref.role = .conformedType } else if decl.kind == .protocol, ref.kind == .protocol { ref.role = .refinedProtocolType + } else if decl.kind == .class || decl.kind == .associatedtype { + ref.role = .inheritedType } } else if result.variableTypeLocations.contains(ref.location) { ref.role = .varType diff --git a/Tests/AccessibilityTests/AccessibilityProject/Sources/MainTarget/main.swift b/Tests/AccessibilityTests/AccessibilityProject/Sources/MainTarget/main.swift index a25abc705..94fbf4b23 100644 --- a/Tests/AccessibilityTests/AccessibilityProject/Sources/MainTarget/main.swift +++ b/Tests/AccessibilityTests/AccessibilityProject/Sources/MainTarget/main.swift @@ -48,6 +48,7 @@ case let .someCase(a, b): // Inheritance _ = PublicClassInheritingPublicClass() _ = PublicClassInheritingPublicExternalClassRetainer() +_ = PublicClassInheritingPublicClassWithGenericParameter() // Conformance _ = PublicClassAdoptingPublicProtocol() diff --git a/Tests/AccessibilityTests/AccessibilityProject/Sources/TargetA/PublicClassInheritingPublicTypeWithGenericParameter.swift b/Tests/AccessibilityTests/AccessibilityProject/Sources/TargetA/PublicClassInheritingPublicTypeWithGenericParameter.swift new file mode 100644 index 000000000..1a0cc6cd5 --- /dev/null +++ b/Tests/AccessibilityTests/AccessibilityProject/Sources/TargetA/PublicClassInheritingPublicTypeWithGenericParameter.swift @@ -0,0 +1,7 @@ +import Foundation + +public struct PublicClassInheritingPublicClassWithGenericParameter_GenericType {} +public class PublicClassInheritingPublicClassWithGenericParameter_Superclass {} +public class PublicClassInheritingPublicClassWithGenericParameter: PublicClassInheritingPublicClassWithGenericParameter_Superclass { + public override init() {} +} diff --git a/Tests/AccessibilityTests/RedundantPublicAccessibilityTest.swift b/Tests/AccessibilityTests/RedundantPublicAccessibilityTest.swift index e457689bd..f7dc0a62f 100644 --- a/Tests/AccessibilityTests/RedundantPublicAccessibilityTest.swift +++ b/Tests/AccessibilityTests/RedundantPublicAccessibilityTest.swift @@ -107,6 +107,14 @@ class RedundantPublicAccessibilityTest: SourceGraphTestCase { assertRedundantPublicAccessibility(.class("PublicClassInheritingPublicExternalClass")) } + func testPublicClassInheritingPublicClassWithGenericRequirement() { + Self.index() + + assertNotRedundantPublicAccessibility(.struct("PublicClassInheritingPublicClassWithGenericParameter_GenericType")) + assertNotRedundantPublicAccessibility(.class("PublicClassInheritingPublicClassWithGenericParameter_Superclass")) + assertNotRedundantPublicAccessibility(.class("PublicClassInheritingPublicClassWithGenericParameter")) + } + func testPublicClassAdoptingPublicProtocol() { Self.index()