@@ -183,45 +183,56 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
183
183
isFramework = false ;
184
184
185
185
llvm::SmallString<256 > currPath;
186
- for (auto path : Ctx.SearchPathOpts .ImportSearchPaths ) {
187
- std::error_code result;
188
-
189
- currPath = path;
190
- llvm::sys::path::append (currPath, fileNames.module .str ());
191
- llvm::ErrorOr<llvm::vfs::Status> statResult = fs.status (currPath);
192
186
193
- if (statResult && statResult->isDirectory ()) {
194
- // A .swiftmodule directory contains architecture-specific files.
187
+ // / Returns true if a target-specific module file was found, false if an error
188
+ // / was diagnosed, or None if neither one happened and the search should
189
+ // / continue.
190
+ auto findTargetSpecificModuleFiles = [&]() -> Optional<bool > {
191
+ auto result = findModuleFilesInDirectory (moduleID, currPath,
192
+ archFileNames.module ,
193
+ archFileNames.moduleDoc ,
194
+ moduleBuffer, moduleDocBuffer);
195
+
196
+ if (result == std::errc::no_such_file_or_directory &&
197
+ !alternateArchName.empty ()) {
195
198
result = findModuleFilesInDirectory (moduleID, currPath,
196
- archFileNames .module ,
197
- archFileNames .moduleDoc ,
199
+ alternateArchFileNames .module ,
200
+ alternateArchFileNames .moduleDoc ,
198
201
moduleBuffer, moduleDocBuffer);
202
+ }
199
203
200
- if (result == std::errc::no_such_file_or_directory &&
201
- !alternateArchName.empty ()) {
202
- result = findModuleFilesInDirectory (moduleID, currPath,
203
- alternateArchFileNames.module ,
204
- alternateArchFileNames.moduleDoc ,
205
- moduleBuffer, moduleDocBuffer);
204
+ if (result == std::errc::no_such_file_or_directory) {
205
+ if (maybeDiagnoseArchitectureMismatch (moduleID.second , moduleName,
206
+ archName, currPath)) {
207
+ return false ;
206
208
}
209
+ }
207
210
208
- if (result == std::errc::no_such_file_or_directory) {
209
- if (maybeDiagnoseArchitectureMismatch (moduleID.second , moduleName,
210
- archName, currPath)) {
211
- return false ;
212
- }
213
- }
211
+ if (!result)
212
+ return true ;
213
+ else
214
+ return None;
215
+ };
214
216
217
+ for (auto path : Ctx.SearchPathOpts .ImportSearchPaths ) {
218
+ currPath = path;
219
+ llvm::sys::path::append (currPath, fileNames.module .str ());
220
+ llvm::ErrorOr<llvm::vfs::Status> statResult = fs.status (currPath);
221
+
222
+ if (statResult && statResult->isDirectory ()) {
223
+ // A .swiftmodule directory contains architecture-specific files.
224
+ if (auto outcome = findTargetSpecificModuleFiles ())
225
+ return *outcome;
215
226
} else {
216
227
// We can't just return the error; the path we're looking for might not
217
228
// be "Foo.swiftmodule".
218
- result = findModuleFilesInDirectory (moduleID, path,
219
- fileNames.module .str (),
220
- fileNames.moduleDoc .str (),
221
- moduleBuffer, moduleDocBuffer);
229
+ auto result = findModuleFilesInDirectory (moduleID, path,
230
+ fileNames.module .str (),
231
+ fileNames.moduleDoc .str (),
232
+ moduleBuffer, moduleDocBuffer);
233
+ if (!result)
234
+ return true ;
222
235
}
223
- if (!result)
224
- return true ;
225
236
}
226
237
227
238
{
@@ -241,27 +252,7 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
241
252
// Frameworks always use architecture-specific files within a .swiftmodule
242
253
// directory.
243
254
llvm::sys::path::append (currPath, " Modules" , fileNames.module .str ());
244
- auto err = findModuleFilesInDirectory (moduleID, currPath,
245
- archFileNames.module ,
246
- archFileNames.moduleDoc ,
247
- moduleBuffer, moduleDocBuffer);
248
-
249
- if (err == std::errc::no_such_file_or_directory &&
250
- !alternateArchName.empty ()) {
251
- err = findModuleFilesInDirectory (moduleID, currPath,
252
- alternateArchFileNames.module ,
253
- alternateArchFileNames.moduleDoc ,
254
- moduleBuffer, moduleDocBuffer);
255
- }
256
-
257
- if (err == std::errc::no_such_file_or_directory) {
258
- if (maybeDiagnoseArchitectureMismatch (moduleID.second , moduleName,
259
- archName, currPath)) {
260
- return false ;
261
- }
262
- }
263
-
264
- return !err;
255
+ return findTargetSpecificModuleFiles ().getValueOr (false );
265
256
};
266
257
267
258
for (const auto &framepath : Ctx.SearchPathOpts .FrameworkSearchPaths ) {
@@ -296,10 +287,7 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
296
287
// Apple platforms always use architecture-specific files within a
297
288
// .swiftmodule directory for the stdlib.
298
289
llvm::sys::path::append (currPath, fileNames.module .str ());
299
- return !findModuleFilesInDirectory (moduleID, currPath,
300
- archFileNames.module ,
301
- archFileNames.moduleDoc ,
302
- moduleBuffer, moduleDocBuffer);
290
+ return findTargetSpecificModuleFiles ().getValueOr (false );
303
291
}
304
292
// Non-Apple platforms always use single-architecture swiftmodules.
305
293
return !findModuleFilesInDirectory (moduleID, currPath,
0 commit comments