@@ -1108,12 +1108,19 @@ class IndexSwiftASTWalker : public SourceEntityWalker {
11081108 // / Whether the given decl should be marked implicit in the index data.
11091109 bool hasImplicitRole (Decl *D);
11101110
1111- bool initIndexSymbol (ValueDecl *D, SourceLoc Loc, bool IsRef,
1112- IndexSymbol &Info);
1111+ bool initIndexSymbol (
1112+ ValueDecl *D, SourceLoc Loc, bool IsRef, IndexSymbol &Info,
1113+ llvm::function_ref<bool (IndexSymbol &)> updateInfo = [](IndexSymbol &) {
1114+ return false ;
1115+ });
11131116 bool initIndexSymbol (ExtensionDecl *D, ValueDecl *ExtendedD, SourceLoc Loc,
11141117 IndexSymbol &Info);
11151118 bool initFuncDeclIndexSymbol (FuncDecl *D, IndexSymbol &Info);
1116- bool initFuncRefIndexSymbol (ValueDecl *D, SourceLoc Loc, IndexSymbol &Info);
1119+ bool initFuncRefIndexSymbol (
1120+ ValueDecl *D, SourceLoc Loc, IndexSymbol &Info,
1121+ llvm::function_ref<bool (IndexSymbol &)> updateInfo = [](IndexSymbol &) {
1122+ return false ;
1123+ });
11171124 bool initVarRefIndexSymbols (Expr *CurrentE, ValueDecl *D, SourceLoc Loc,
11181125 IndexSymbol &Info,
11191126 std::optional<AccessKind> AccKind);
@@ -1663,22 +1670,18 @@ bool IndexSwiftASTWalker::reportPseudoAccessor(AbstractStorageDecl *D,
16631670 // AbstractStorageDecl.
16641671 assert (getParentDecl () == D);
16651672 auto PreviousTop = EntitiesStack.pop_back_val ();
1666- bool initFailed = initFuncRefIndexSymbol (D, Loc, Info);
1673+ bool initFailed = initFuncRefIndexSymbol (D, Loc, Info, updateInfo );
16671674 EntitiesStack.push_back (PreviousTop);
16681675
16691676 if (initFailed)
16701677 return true ; // continue walking.
1671- if (updateInfo (Info))
1672- return true ;
16731678
16741679 if (!IdxConsumer.startSourceEntity (Info) || !IdxConsumer.finishSourceEntity (Info.symInfo , Info.roles ))
16751680 Cancelled = true ;
16761681 } else {
16771682 IndexSymbol Info;
1678- if (initIndexSymbol (D, Loc, IsRef, Info))
1683+ if (initIndexSymbol (D, Loc, IsRef, Info, updateInfo ))
16791684 return true ; // continue walking.
1680- if (updateInfo (Info))
1681- return true ;
16821685 if (addRelation (Info, (SymbolRoleSet)SymbolRole::RelationAccessorOf |
16831686 (SymbolRoleSet)SymbolRole::RelationChildOf , D))
16841687 return true ;
@@ -1898,16 +1901,20 @@ bool IndexSwiftASTWalker::reportImplicitConformance(ValueDecl *witness, ValueDec
18981901 loc = container->getLoc (/* SerializedOK*/ false );
18991902
19001903 IndexSymbol info;
1901- if (initIndexSymbol (witness, loc, /* IsRef=*/ true , info))
1904+ bool initFailed = initIndexSymbol (
1905+ witness, loc, /* IsRef=*/ true , info, [](IndexSymbol &info) {
1906+ // Remove the 'ref' role that \c initIndexSymbol introduces. This isn't
1907+ // actually a 'reference', but an 'implicit' override.
1908+ info.roles &= ~(SymbolRoleSet)SymbolRole::Reference;
1909+ info.roles |= (SymbolRoleSet)SymbolRole::Implicit;
1910+ return false ;
1911+ });
1912+ if (initFailed)
19021913 return true ;
19031914 if (addRelation (info, (SymbolRoleSet) SymbolRole::RelationOverrideOf, requirement))
19041915 return true ;
19051916 if (addRelation (info, (SymbolRoleSet) SymbolRole::RelationContainedBy, container))
19061917 return true ;
1907- // Remove the 'ref' role that \c initIndexSymbol introduces. This isn't
1908- // actually a 'reference', but an 'implicit' override.
1909- info.roles &= ~(SymbolRoleSet)SymbolRole::Reference;
1910- info.roles |= (SymbolRoleSet)SymbolRole::Implicit;
19111918
19121919 if (!startEntity (witness, info, /* IsRef=*/ true ))
19131920 return true ;
@@ -1929,8 +1936,47 @@ bool IndexSwiftASTWalker::hasImplicitRole(Decl *D) {
19291936 return false ;
19301937}
19311938
1932- bool IndexSwiftASTWalker::initIndexSymbol (ValueDecl *D, SourceLoc Loc,
1933- bool IsRef, IndexSymbol &Info) {
1939+ bool shouldOutputEffectiveAccessOfValueSymbol (SymbolInfo Info) {
1940+ SymbolKind Kind = Info.Kind ;
1941+ SymbolSubKind SubKind = Info.SubKind ;
1942+ switch (SubKind) {
1943+ case SymbolSubKind::AccessorGetter:
1944+ case SymbolSubKind::AccessorSetter:
1945+ case SymbolSubKind::SwiftAccessorWillSet:
1946+ case SymbolSubKind::SwiftAccessorDidSet:
1947+ case SymbolSubKind::SwiftAccessorAddressor:
1948+ case SymbolSubKind::SwiftAccessorMutableAddressor:
1949+ case SymbolSubKind::SwiftGenericTypeParam:
1950+ return false ;
1951+ default :
1952+ break ;
1953+ }
1954+ switch (Kind) {
1955+ case SymbolKind::Enum:
1956+ case SymbolKind::Struct:
1957+ case SymbolKind::Class:
1958+ case SymbolKind::Protocol:
1959+ case SymbolKind::Constructor:
1960+ case SymbolKind::EnumConstant:
1961+ case SymbolKind::Function:
1962+ case SymbolKind::StaticMethod:
1963+ case SymbolKind::Variable:
1964+ case SymbolKind::InstanceMethod:
1965+ case SymbolKind::ClassMethod:
1966+ case SymbolKind::InstanceProperty:
1967+ case SymbolKind::ClassProperty:
1968+ case SymbolKind::StaticProperty:
1969+ case SymbolKind::TypeAlias:
1970+ case SymbolKind::Macro:
1971+ return true ;
1972+ default :
1973+ return false ;
1974+ }
1975+ }
1976+
1977+ bool IndexSwiftASTWalker::initIndexSymbol (
1978+ ValueDecl *D, SourceLoc Loc, bool IsRef, IndexSymbol &Info,
1979+ llvm::function_ref<bool (IndexSymbol &)> updateInfo) {
19341980 assert (D);
19351981
19361982 auto MappedLoc = getMappedLocation (Loc);
@@ -1970,6 +2016,34 @@ bool IndexSwiftASTWalker::initIndexSymbol(ValueDecl *D, SourceLoc Loc,
19702016 Info.roles |= (unsigned )SymbolRole::Implicit;
19712017 }
19722018
2019+ if (updateInfo (Info)) {
2020+ return true ;
2021+ }
2022+
2023+ if (shouldOutputEffectiveAccessOfValueSymbol (Info.symInfo ) &&
2024+ (Info.roles & (SymbolRoleSet)SymbolRole::Reference) == 0 &&
2025+ !isLocalSymbol (D)) {
2026+ AccessScope Scope = D->getFormalAccessScope ();
2027+ if (Scope.isPublic ()) {
2028+ if (D->isSPI ()) {
2029+ Info.symInfo .Properties |= SymbolProperty::SwiftAccessControlSPI;
2030+ } else {
2031+ Info.symInfo .Properties |= SymbolProperty::SwiftAccessControlPublic;
2032+ }
2033+ } else if (Scope.isPackage ()) {
2034+ Info.symInfo .Properties |= SymbolProperty::SwiftAccessControlPackage;
2035+ } else if (Scope.isInternal ()) {
2036+ Info.symInfo .Properties |= SymbolProperty::SwiftAccessControlInternal;
2037+ } else if (Scope.isFileScope ()) {
2038+ Info.symInfo .Properties |= SymbolProperty::SwiftAccessControlFilePrivate;
2039+ } else if (Scope.isPrivate ()) {
2040+ Info.symInfo .Properties |=
2041+ SymbolProperty::SwiftAccessControlLessThanFilePrivate;
2042+ } else {
2043+ llvm_unreachable (" Unsupported access scope" );
2044+ }
2045+ }
2046+
19732047 return false ;
19742048}
19752049
@@ -2036,10 +2110,11 @@ bool IndexSwiftASTWalker::initFuncDeclIndexSymbol(FuncDecl *D,
20362110 return false ;
20372111}
20382112
2039- bool IndexSwiftASTWalker::initFuncRefIndexSymbol (ValueDecl *D, SourceLoc Loc,
2040- IndexSymbol &Info) {
2113+ bool IndexSwiftASTWalker::initFuncRefIndexSymbol (
2114+ ValueDecl *D, SourceLoc Loc, IndexSymbol &Info,
2115+ llvm::function_ref<bool (IndexSymbol &)> updateInfo) {
20412116
2042- if (initIndexSymbol (D, Loc, /* IsRef=*/ true , Info))
2117+ if (initIndexSymbol (D, Loc, /* IsRef=*/ true , Info, updateInfo ))
20432118 return true ;
20442119
20452120 if (!isa<AbstractStorageDecl>(D) && !ide::isBeingCalled (ExprStack))
0 commit comments