@@ -10,53 +10,39 @@ import SwiftSyntaxMacros
1010
1111extension ClassDeclSyntax {
1212
13- public var unverifiedInferredSuperclassType : TypeSyntax ? {
14- inheritanceClause? . inheritedTypes. first? . type. trimmed
15- }
16-
17- public func inferredSuperclassType( ) -> TypeSyntax ? {
18- let verifier = SuperclassVerifier ( for: self )
19- return verifier. verifiedSuperclassType ( )
20- }
21-
2213 public func inferredSuperclassType(
23- isExpected: Bool ?
24- ) throws -> TypeSyntax ? {
25- switch isExpected {
26- case nil :
27- return inferredSuperclassType ( )
28- case true :
29- if let type = unverifiedInferredSuperclassType {
30- return type
31- }
32- throw DiagnosticsError (
33- node: self ,
34- message: " \( name. trimmed) should have a superclass "
35- )
36- case false :
37- return nil
38- }
14+ isKnownToBeSubclass: Bool = false
15+ ) -> TypeSyntax ? {
16+ let finder = SuperclassFinder ( for: self )
17+ let needsCheck = !isKnownToBeSubclass
18+ return finder. find ( checkAgainstSubclassSpecificKeywords: needsCheck)
3919 }
4020}
4121
4222extension ClassDeclSyntax {
4323
44- private final class SuperclassVerifier : SyntaxVisitor {
24+ private final class SuperclassFinder : SyntaxVisitor {
4525
4626 private let classDecl : ClassDeclSyntax
47- private var didVerify = false
27+ private var didFind = false
4828
4929 init ( for classDecl: ClassDeclSyntax ) {
5030 self . classDecl = classDecl
5131 super. init ( viewMode: . sourceAccurate)
5232 }
5333
54- func verifiedSuperclassType( ) -> TypeSyntax ? {
55- if let unverified = classDecl. unverifiedInferredSuperclassType {
34+ func find( checkAgainstSubclassSpecificKeywords: Bool ) -> TypeSyntax ? {
35+ guard let inheritedTypes = classDecl. inheritanceClause? . inheritedTypes,
36+ let superclassType = inheritedTypes. first? . type. trimmed
37+ else {
38+ return nil
39+ }
40+
41+ if checkAgainstSubclassSpecificKeywords {
5642 walk ( classDecl)
57- return didVerify ? unverified : nil
43+ return didFind ? superclassType : nil
5844 } else {
59- return nil
45+ return superclassType
6046 }
6147 }
6248
@@ -65,12 +51,12 @@ extension ClassDeclSyntax {
6551 }
6652
6753 override func visit( _ node: DeclModifierSyntax ) -> SyntaxVisitorContinueKind {
68- didVerify = didVerify || node. overrideSpecifier != nil
54+ didFind = didFind || node. overrideSpecifier != nil
6955 return . visitChildren
7056 }
7157
7258 override func visit( _: SuperExprSyntax ) -> SyntaxVisitorContinueKind {
73- didVerify = true
59+ didFind = true
7460 return . visitChildren
7561 }
7662 }
0 commit comments