diff --git a/Sources/SwiftExtract/SwiftAnalysisVisitor.swift b/Sources/SwiftExtract/SwiftAnalysisVisitor.swift index 3b079e510..773ba9662 100644 --- a/Sources/SwiftExtract/SwiftAnalysisVisitor.swift +++ b/Sources/SwiftExtract/SwiftAnalysisVisitor.swift @@ -527,6 +527,10 @@ final class SwiftAnalysisVisitor { in typeContext: ExtractedNominalType?, sourceFilePath: String, ) { + guard node.shouldExtract(config: config, in: typeContext, decider: analyzer.extractDecider) else { + return + } + let outputName = node.name.text let rhsType = node.initializer.value diff --git a/Tests/SwiftExtractTests/AnalysisResultTests.swift b/Tests/SwiftExtractTests/AnalysisResultTests.swift index 0ac1f5507..2fc1abd25 100644 --- a/Tests/SwiftExtractTests/AnalysisResultTests.swift +++ b/Tests/SwiftExtractTests/AnalysisResultTests.swift @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// import SwiftExtract +import SwiftSyntax import Testing /// End-to-end tests that drive the analysis pipeline (Swift source → @@ -553,6 +554,35 @@ struct AnalysisResultSuite { #expect(fishTank.isSpecialization) } + @Test func typealiasTriggersDecider() throws { + final class RecordingDecider: ExtractDecider, @unchecked Sendable { + var typealiasNames: [String] = [] + func shouldExtract(decl: DeclSyntax, in parent: ExtractedNominalType?) -> Bool { + if let ta = decl.as(TypeAliasDeclSyntax.self) { + typealiasNames.append(ta.name.text) + } + return true + } + } + let decider = RecordingDecider() + _ = try SwiftAnalyzer.analyze( + sources: [ + ( + "/fake/Source.swift", + """ + public struct Tank { public init() {} } + public struct Fish {} + public typealias FishTank = Tank + """ + ) + ], + moduleName: "Aquarium", + extractDecider: decider, + config: DefaultSwiftExtractConfiguration(swiftModule: "Aquarium") + ) + #expect(decider.typealiasNames == ["FishTank"]) + } + // ==== ----------------------------------------------------------------------- // MARK: Empty input