@@ -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