From 6ab831fd7201cdab8389bb25d536aaf0c787a00c Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Wed, 19 Aug 2026 14:51:00 +0900 Subject: [PATCH] [SwiftExtract] Invoke ExtractDecider for typealiases We should check with the configured ExtractDecider when visiting a typealias as well. Some systems may import only annotated things, so we need to guard typealiases too. --- .../SwiftExtract/SwiftAnalysisVisitor.swift | 4 +++ .../AnalysisResultTests.swift | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+) 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