From d22cde70275606af80193909498330d427092dd1 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Fri, 21 Aug 2026 10:16:54 +0000 Subject: [PATCH] [SwiftExtract] Record the source file path on ExtractedFunc ExtractedNominalType already exposes sourceFilePath, but functions did not carry theirs, so a consumer that groups output by input file (e.g. BridgeJS's per-file imported-API skeletons) could not attribute global functions or accessors to a file. Thread the path through the visitor into every ExtractedFunc; synthesized declarations keep nil. --- Sources/SwiftExtract/ExtractedDecls.swift | 12 ++++++++++-- Sources/SwiftExtract/SwiftAnalysisVisitor.swift | 9 +++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftExtract/ExtractedDecls.swift b/Sources/SwiftExtract/ExtractedDecls.swift index 4a237d7c3..ae0871a86 100644 --- a/Sources/SwiftExtract/ExtractedDecls.swift +++ b/Sources/SwiftExtract/ExtractedDecls.swift @@ -309,6 +309,10 @@ public final class ExtractedFunc: ExtractedSwiftDecl, CustomStringConvertible { public let functionSignature: SwiftFunctionSignature + // The short path from module root to the file in which this declaration was originally declared. + // E.g. for `Sources/Example/My/Types.swift` it would be `My/Types.swift`. + public let sourceFilePath: String? + public var signatureString: String { self.swiftDecl.signatureString } @@ -386,12 +390,14 @@ public final class ExtractedFunc: ExtractedSwiftDecl, CustomStringConvertible { name: String, apiKind: SwiftAPIKind, functionSignature: SwiftFunctionSignature, + sourceFilePath: String? = nil, ) { self.module = module self.name = name self.swiftDecl = swiftDecl self.apiKind = apiKind self.functionSignature = functionSignature + self.sourceFilePath = sourceFilePath } public var description: String { @@ -414,7 +420,8 @@ public final class ExtractedFunc: ExtractedSwiftDecl, CustomStringConvertible { swiftDecl: swiftDecl, name: name, apiKind: apiKind, - functionSignature: functionSignature + functionSignature: functionSignature, + sourceFilePath: sourceFilePath ) } @@ -465,7 +472,8 @@ public final class ExtractedFunc: ExtractedSwiftDecl, CustomStringConvertible { swiftDecl: swiftDecl, name: name, apiKind: apiKind, - functionSignature: newSignature + functionSignature: newSignature, + sourceFilePath: sourceFilePath ) ) } diff --git a/Sources/SwiftExtract/SwiftAnalysisVisitor.swift b/Sources/SwiftExtract/SwiftAnalysisVisitor.swift index 773ba9662..faa1b4bc1 100644 --- a/Sources/SwiftExtract/SwiftAnalysisVisitor.swift +++ b/Sources/SwiftExtract/SwiftAnalysisVisitor.swift @@ -227,6 +227,7 @@ final class SwiftAnalysisVisitor { name: node.name.text.unescapedSwiftName, apiKind: apiKind, functionSignature: signature, + sourceFilePath: sourceFilePath, ) log.debug("Record extracted method \(node.qualifiedNameForDebug)") @@ -267,6 +268,7 @@ final class SwiftAnalysisVisitor { name: caseName, apiKind: .enumCase, functionSignature: signature, + sourceFilePath: sourceFilePath, ) let extractedCase = ExtractedEnumCase( @@ -316,6 +318,7 @@ final class SwiftAnalysisVisitor { in: typeContext, kind: .getter, name: varName, + sourceFilePath: sourceFilePath, ) } if supportedAccessors.contains(.set) { @@ -324,6 +327,7 @@ final class SwiftAnalysisVisitor { in: typeContext, kind: .setter, name: varName, + sourceFilePath: sourceFilePath, ) } } catch { @@ -370,6 +374,7 @@ final class SwiftAnalysisVisitor { name: "init", apiKind: .initializer, functionSignature: signature, + sourceFilePath: sourceFilePath, ) typeContext.initializers.append(extracted) @@ -397,6 +402,7 @@ final class SwiftAnalysisVisitor { in: typeContext, kind: .subscriptGetter, name: name, + sourceFilePath: sourceFilePath, ) } if accessors.contains(.set) { @@ -405,6 +411,7 @@ final class SwiftAnalysisVisitor { in: typeContext, kind: .subscriptSetter, name: name, + sourceFilePath: sourceFilePath, ) } } catch { @@ -445,6 +452,7 @@ final class SwiftAnalysisVisitor { in typeContext: ExtractedNominalType?, kind: SwiftAPIKind, name: String, + sourceFilePath: String, ) throws { let signature: SwiftFunctionSignature @@ -474,6 +482,7 @@ final class SwiftAnalysisVisitor { name: name, apiKind: kind, functionSignature: signature, + sourceFilePath: sourceFilePath, ) log.debug(