@@ -1338,55 +1338,55 @@ ModuleFile::resolveCrossReference(ModuleDecl *baseModule, uint32_t pathLen) {
1338
1338
case XREF_TYPE_PATH_PIECE: {
1339
1339
if (values.size () == 1 ) {
1340
1340
ModuleDecl *module = values.front ()->getModuleContext ();
1341
- if (module == this ->getAssociatedModule ()) {
1342
- // Fast path for nested types in the same module.
1343
- IdentifierID IID;
1344
- bool onlyInNominal = false ;
1345
- XRefTypePathPieceLayout::readRecord (scratch, IID, onlyInNominal);
1346
- Identifier memberName = getIdentifier (IID);
1347
- pathTrace.addValue (memberName);
1348
-
1349
- llvm::PrettyStackTraceString message{
1350
- " If you're seeing a crash here, try passing "
1351
- " -Xfrontend -disable-serialization-nested-type-lookup-table" };
1352
-
1353
- TypeDecl *nestedType = nullptr ;
1354
- if (onlyInNominal) {
1355
- // Only look in the file containing the type itself.
1356
- const DeclContext *dc = values.front ()->getDeclContext ();
1357
- auto *serializedFile =
1358
- dyn_cast<SerializedASTFile>(dc->getModuleScopeContext ());
1359
- if (serializedFile) {
1360
- nestedType =
1361
- serializedFile->File .lookupNestedType (memberName,
1362
- values.front ());
1363
- }
1364
- } else {
1365
- // Fault in extensions, then ask every serialized AST in the module.
1366
- (void )cast<NominalTypeDecl>(values.front ())->getExtensions ();
1367
- for (FileUnit *file : module ->getFiles ()) {
1368
- if (file == getFile ())
1369
- continue ;
1370
- auto *serializedFile = dyn_cast<SerializedASTFile>(file);
1371
- if (!serializedFile)
1372
- continue ;
1373
- nestedType =
1374
- serializedFile->File .lookupNestedType (memberName,
1375
- values.front ());
1376
- if (nestedType)
1377
- break ;
1378
- }
1379
- }
1380
1341
1381
- if (nestedType) {
1382
- values.clear ();
1383
- values.push_back (nestedType);
1384
- ++NumNestedTypeShortcuts;
1385
- break ;
1342
+ // Fast path for nested types that avoids deserializing all
1343
+ // members of the parent type.
1344
+ IdentifierID IID;
1345
+ bool onlyInNominal = false ;
1346
+ XRefTypePathPieceLayout::readRecord (scratch, IID, onlyInNominal);
1347
+ Identifier memberName = getIdentifier (IID);
1348
+ pathTrace.addValue (memberName);
1349
+
1350
+ llvm::PrettyStackTraceString message{
1351
+ " If you're seeing a crash here, try passing "
1352
+ " -Xfrontend -disable-serialization-nested-type-lookup-table" };
1353
+
1354
+ TypeDecl *nestedType = nullptr ;
1355
+ if (onlyInNominal) {
1356
+ // Only look in the file containing the type itself.
1357
+ const DeclContext *dc = values.front ()->getDeclContext ();
1358
+ auto *serializedFile =
1359
+ dyn_cast<SerializedASTFile>(dc->getModuleScopeContext ());
1360
+ if (serializedFile) {
1361
+ nestedType =
1362
+ serializedFile->File .lookupNestedType (memberName,
1363
+ values.front ());
1386
1364
}
1365
+ } else {
1366
+ // Fault in extensions, then ask every serialized AST in the module.
1367
+ (void )cast<NominalTypeDecl>(values.front ())->getExtensions ();
1368
+ for (FileUnit *file : module ->getFiles ()) {
1369
+ if (file == getFile ())
1370
+ continue ;
1371
+ auto *serializedFile = dyn_cast<SerializedASTFile>(file);
1372
+ if (!serializedFile)
1373
+ continue ;
1374
+ nestedType =
1375
+ serializedFile->File .lookupNestedType (memberName,
1376
+ values.front ());
1377
+ if (nestedType)
1378
+ break ;
1379
+ }
1380
+ }
1387
1381
1388
- pathTrace.removeLast ();
1382
+ if (nestedType) {
1383
+ values.clear ();
1384
+ values.push_back (nestedType);
1385
+ ++NumNestedTypeShortcuts;
1386
+ break ;
1389
1387
}
1388
+
1389
+ pathTrace.removeLast ();
1390
1390
}
1391
1391
LLVM_FALLTHROUGH;
1392
1392
}
0 commit comments