@@ -878,6 +878,10 @@ class IndexSwiftASTWalker : public SourceEntityWalker {
878
878
auto AfterDollar = Loc.getAdvancedLoc (1 );
879
879
reportRef (Wrapped, AfterDollar, Info, None);
880
880
}
881
+ } else if (auto *TAD = dyn_cast<TypeAliasDecl>(D)) {
882
+ TypeLoc TL (TAD->getUnderlyingTypeRepr (), TAD->getUnderlyingType ());
883
+ if (!reportRelatedTypeRef (TL, (SymbolRoleSet)SymbolRole::Reference, D, /* isImplicit=*/ true , Loc))
884
+ return false ;
881
885
}
882
886
883
887
return true ;
@@ -962,7 +966,18 @@ class IndexSwiftASTWalker : public SourceEntityWalker {
962
966
bool startEntityDecl (ValueDecl *D);
963
967
964
968
bool reportRelatedRef (ValueDecl *D, SourceLoc Loc, bool isImplicit, SymbolRoleSet Relations, Decl *Related);
965
- bool reportRelatedTypeRef (const TypeLoc &Ty, SymbolRoleSet Relations, Decl *Related);
969
+
970
+ // / Report references for dependent types
971
+ // /
972
+ // / NOTE: If the dependent type is a typealias, report the underlying types as well.
973
+ // /
974
+ // / \param Ty The type being referenced.
975
+ // / \param Relations The relationship between the referenced type and the passed Decl.
976
+ // / \param Related The Decl that is referencing the type.
977
+ // / \param isImplicit Whether the reference is implicit, such as for a typealias' underlying type.
978
+ // / \param Loc The location of the reference, otherwise the location of the TypeLoc is used.
979
+ bool reportRelatedTypeRef (const TypeLoc &Ty, SymbolRoleSet Relations, Decl *Related,
980
+ bool isImplicit=false , SourceLoc Loc={});
966
981
bool reportInheritedTypeRefs (
967
982
ArrayRef<InheritedEntry> Inherited, Decl *Inheritee);
968
983
NominalTypeDecl *getTypeLocAsNominalTypeDecl (const TypeLoc &Ty);
@@ -1378,20 +1393,37 @@ bool IndexSwiftASTWalker::reportInheritedTypeRefs(ArrayRef<InheritedEntry> Inher
1378
1393
return true ;
1379
1394
}
1380
1395
1381
- bool IndexSwiftASTWalker::reportRelatedTypeRef (const TypeLoc &Ty, SymbolRoleSet Relations, Decl *Related) {
1382
- if (auto *declRefTR = dyn_cast_or_null<DeclRefTypeRepr>(Ty.getTypeRepr ())) {
1383
- SourceLoc IdLoc = declRefTR->getLoc ();
1396
+ bool IndexSwiftASTWalker::reportRelatedTypeRef (const TypeLoc &Ty, SymbolRoleSet Relations,
1397
+ Decl *Related, bool Implicit, SourceLoc Loc) {
1398
+ if (auto *composite = llvm::dyn_cast_or_null<CompositionTypeRepr>(Ty.getTypeRepr ())) {
1399
+ SourceLoc IdLoc = Loc.isValid () ? Loc : composite->getSourceLoc ();
1400
+ for (auto *Type : composite->getTypes ()) {
1401
+ if (!reportRelatedTypeRef (Type, Relations, Related, /* isImplicit=*/ Implicit, IdLoc))
1402
+ return false ;
1403
+ }
1404
+
1405
+ return true ;
1406
+ } else if (auto *declRefTR = dyn_cast_or_null<DeclRefTypeRepr>(Ty.getTypeRepr ())) {
1407
+ SourceLoc IdLoc = Loc.isValid () ? Loc : declRefTR->getLoc ();
1384
1408
NominalTypeDecl *NTD = nullptr ;
1385
- bool isImplicit = false ;
1409
+ bool isImplicit = Implicit ;
1386
1410
if (auto *VD = declRefTR->getBoundDecl ()) {
1387
1411
if (auto *TAD = dyn_cast<TypeAliasDecl>(VD)) {
1388
1412
IndexSymbol Info;
1413
+ if (isImplicit)
1414
+ Info.roles |= (unsigned )SymbolRole::Implicit;
1389
1415
if (!reportRef (TAD, IdLoc, Info, None))
1390
1416
return false ;
1391
1417
if (auto Ty = TAD->getUnderlyingType ()) {
1392
1418
NTD = Ty->getAnyNominal ();
1393
1419
isImplicit = true ;
1394
1420
}
1421
+
1422
+ if (isa_and_nonnull<CompositionTypeRepr>(TAD->getUnderlyingTypeRepr ())) {
1423
+ TypeLoc TL (TAD->getUnderlyingTypeRepr (), TAD->getUnderlyingType ());
1424
+ if (!reportRelatedTypeRef (TL, Relations, Related, /* isImplicit=*/ true , IdLoc))
1425
+ return false ;
1426
+ }
1395
1427
} else {
1396
1428
NTD = dyn_cast<NominalTypeDecl>(VD);
1397
1429
}
0 commit comments