@@ -39,6 +39,11 @@ import Testing
3939 " Inputs "
4040 )
4141
42+ static let multifileInputsDirectory = URL ( fileURLWithPath : #filePath ) . deletingLastPathComponent ( )
43+ . appendingPathComponent (
44+ " MultifileInputs "
45+ )
46+
4247 static func collectInputs ( ) -> [ String ] {
4348 let fileManager = FileManager . default
4449 let inputs = try! fileManager . contentsOfDirectory ( atPath : Self . inputsDirectory . path )
@@ -69,4 +74,73 @@ import Testing
6974 let name = url . deletingPathExtension ( ) . lastPathComponent
7075 try snapshot ( swiftAPI : swiftAPI , name : name + " .Global " )
7176 }
77+
78+ @ Test
79+ func snapshotCrossFileTypeResolution ( ) throws {
80+ // Test that types defined in one file can be referenced from another file
81+ // This tests the fix for cross-file type resolution in BridgeJS
82+ let swiftAPI = ExportSwift ( progress : . silent , moduleName : " TestModule " , exposeToGlobal : false )
83+
84+ // Add ClassB first, then ClassA (which references ClassB)
85+ let classBURL = Self . multifileInputsDirectory . appendingPathComponent ( " CrossFileClassB.swift " )
86+ let classBSourceFile = Parser . parse ( source : try String ( contentsOf : classBURL , encoding : . utf8 ) )
87+ try swiftAPI . addSourceFile ( classBSourceFile , " CrossFileClassB.swift " )
88+
89+ let classAURL = Self . multifileInputsDirectory . appendingPathComponent ( " CrossFileClassA.swift " )
90+ let classASourceFile = Parser . parse ( source : try String ( contentsOf : classAURL , encoding : . utf8 ) )
91+ try swiftAPI . addSourceFile ( classASourceFile , " CrossFileClassA.swift " )
92+
93+ try snapshot ( swiftAPI : swiftAPI , name : " CrossFileTypeResolution " )
94+ }
95+
96+ @ Test
97+ func snapshotCrossFileTypeResolutionReverseOrder ( ) throws {
98+ // Test that types can be resolved regardless of the order files are added
99+ // Add ClassA first (which references ClassB), then ClassB
100+ let swiftAPI = ExportSwift ( progress : . silent , moduleName : " TestModule " , exposeToGlobal : false )
101+
102+ let classAURL = Self . multifileInputsDirectory . appendingPathComponent ( " CrossFileClassA.swift " )
103+ let classASourceFile = Parser . parse ( source : try String ( contentsOf : classAURL , encoding : . utf8 ) )
104+ try swiftAPI . addSourceFile ( classASourceFile , " CrossFileClassA.swift " )
105+
106+ let classBURL = Self . multifileInputsDirectory . appendingPathComponent ( " CrossFileClassB.swift " )
107+ let classBSourceFile = Parser . parse ( source : try String ( contentsOf : classBURL , encoding : . utf8 ) )
108+ try swiftAPI . addSourceFile ( classBSourceFile , " CrossFileClassB.swift " )
109+
110+ try snapshot ( swiftAPI : swiftAPI , name : " CrossFileTypeResolution.ReverseOrder " )
111+ }
112+
113+ @ Test
114+ func snapshotCrossFileFunctionTypes ( ) throws {
115+ // Test that functions and methods can use cross-file types as parameters and return types
116+ let swiftAPI = ExportSwift ( progress : . silent , moduleName : " TestModule " , exposeToGlobal : false )
117+
118+ // Add FunctionB first, then FunctionA (which references FunctionB in methods and functions)
119+ let functionBURL = Self . multifileInputsDirectory . appendingPathComponent ( " CrossFileFunctionB.swift " )
120+ let functionBSourceFile = Parser . parse ( source : try String ( contentsOf : functionBURL , encoding : . utf8 ) )
121+ try swiftAPI . addSourceFile ( functionBSourceFile , " CrossFileFunctionB.swift " )
122+
123+ let functionAURL = Self . multifileInputsDirectory . appendingPathComponent ( " CrossFileFunctionA.swift " )
124+ let functionASourceFile = Parser . parse ( source : try String ( contentsOf : functionAURL , encoding : . utf8 ) )
125+ try swiftAPI . addSourceFile ( functionASourceFile , " CrossFileFunctionA.swift " )
126+
127+ try snapshot ( swiftAPI : swiftAPI , name : " CrossFileFunctionTypes " )
128+ }
129+
130+ @ Test
131+ func snapshotCrossFileFunctionTypesReverseOrder ( ) throws {
132+ // Test that function types can be resolved regardless of the order files are added
133+ let swiftAPI = ExportSwift ( progress : . silent , moduleName : " TestModule " , exposeToGlobal : false )
134+
135+ // Add FunctionA first (which references FunctionB), then FunctionB
136+ let functionAURL = Self . multifileInputsDirectory . appendingPathComponent ( " CrossFileFunctionA.swift " )
137+ let functionASourceFile = Parser . parse ( source : try String ( contentsOf : functionAURL , encoding : . utf8 ) )
138+ try swiftAPI . addSourceFile ( functionASourceFile , " CrossFileFunctionA.swift " )
139+
140+ let functionBURL = Self . multifileInputsDirectory . appendingPathComponent ( " CrossFileFunctionB.swift " )
141+ let functionBSourceFile = Parser . parse ( source : try String ( contentsOf : functionBURL , encoding : . utf8 ) )
142+ try swiftAPI . addSourceFile ( functionBSourceFile , " CrossFileFunctionB.swift " )
143+
144+ try snapshot ( swiftAPI : swiftAPI , name : " CrossFileFunctionTypes.ReverseOrder " )
145+ }
72146}
0 commit comments