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