@@ -878,6 +878,10 @@ class IndexSwiftASTWalker : public SourceEntityWalker {
878878 auto AfterDollar = Loc.getAdvancedLoc (1 );
879879 reportRef (Wrapped, AfterDollar, Info, None);
880880 }
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 ;
881885 }
882886
883887 return true ;
@@ -962,7 +966,18 @@ class IndexSwiftASTWalker : public SourceEntityWalker {
962966 bool startEntityDecl (ValueDecl *D);
963967
964968 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={});
966981 bool reportInheritedTypeRefs (
967982 ArrayRef<InheritedEntry> Inherited, Decl *Inheritee);
968983 NominalTypeDecl *getTypeLocAsNominalTypeDecl (const TypeLoc &Ty);
@@ -1378,20 +1393,37 @@ bool IndexSwiftASTWalker::reportInheritedTypeRefs(ArrayRef<InheritedEntry> Inher
13781393 return true ;
13791394}
13801395
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 ();
13841408 NominalTypeDecl *NTD = nullptr ;
1385- bool isImplicit = false ;
1409+ bool isImplicit = Implicit ;
13861410 if (auto *VD = declRefTR->getBoundDecl ()) {
13871411 if (auto *TAD = dyn_cast<TypeAliasDecl>(VD)) {
13881412 IndexSymbol Info;
1413+ if (isImplicit)
1414+ Info.roles |= (unsigned )SymbolRole::Implicit;
13891415 if (!reportRef (TAD, IdLoc, Info, None))
13901416 return false ;
13911417 if (auto Ty = TAD->getUnderlyingType ()) {
13921418 NTD = Ty->getAnyNominal ();
13931419 isImplicit = true ;
13941420 }
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+ }
13951427 } else {
13961428 NTD = dyn_cast<NominalTypeDecl>(VD);
13971429 }
0 commit comments