Author: akirtzidis Date: Fri Apr 22 02:21:04 2016 New Revision: 267116 URL: http://llvm.org/viewvc/llvm-project?rev=267116&view=rev Log: [index] Change SymbolCXXTemplateKind to a 'SymbolSubKinds' bitset.
This provides a more general and flexible way to annotate special symbols. Modified: cfe/trunk/include/clang/Index/IndexSymbol.h cfe/trunk/lib/Index/IndexSymbol.cpp cfe/trunk/tools/c-index-test/core_main.cpp cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp Modified: cfe/trunk/include/clang/Index/IndexSymbol.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexSymbol.h?rev=267116&r1=267115&r2=267116&view=diff ============================================================================== --- cfe/trunk/include/clang/Index/IndexSymbol.h (original) +++ cfe/trunk/include/clang/Index/IndexSymbol.h Fri Apr 22 02:21:04 2016 @@ -59,12 +59,13 @@ enum class SymbolLanguage { CXX, }; -enum class SymbolCXXTemplateKind { - NonTemplate, - Template, - TemplatePartialSpecialization, - TemplateSpecialization, +enum class SymbolSubKind : uint8_t { + Generic = 1 << 0, + TemplatePartialSpecialization = 1 << 1, + TemplateSpecialization = 1 << 2, }; +static const unsigned SymbolSubKindBitNum = 3; +typedef unsigned SymbolSubKindSet; /// Set of roles that are attributed to symbol occurrences. enum class SymbolRole : uint16_t { @@ -99,7 +100,7 @@ struct SymbolRelation { struct SymbolInfo { SymbolKind Kind; - SymbolCXXTemplateKind TemplateKind; + SymbolSubKindSet SubKinds; SymbolLanguage Lang; }; @@ -113,9 +114,12 @@ void printSymbolRoles(SymbolRoleSet Role bool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS); StringRef getSymbolKindString(SymbolKind K); -StringRef getTemplateKindStr(SymbolCXXTemplateKind TK); StringRef getSymbolLanguageString(SymbolLanguage K); +void applyForEachSymbolSubKind(SymbolSubKindSet SubKinds, + llvm::function_ref<void(SymbolSubKind)> Fn); +void printSymbolSubKinds(SymbolSubKindSet SubKinds, raw_ostream &OS); + } // namespace index } // namespace clang Modified: cfe/trunk/lib/Index/IndexSymbol.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexSymbol.cpp?rev=267116&r1=267115&r2=267116&view=diff ============================================================================== --- cfe/trunk/lib/Index/IndexSymbol.cpp (original) +++ cfe/trunk/lib/Index/IndexSymbol.cpp Fri Apr 22 02:21:04 2016 @@ -20,7 +20,7 @@ SymbolInfo index::getSymbolInfo(const De assert(D); SymbolInfo Info; Info.Kind = SymbolKind::Unknown; - Info.TemplateKind = SymbolCXXTemplateKind::NonTemplate; + Info.SubKinds = SymbolSubKindSet(); Info.Lang = SymbolLanguage::C; if (const TagDecl *TD = dyn_cast<TagDecl>(D)) { @@ -46,9 +46,11 @@ SymbolInfo index::getSymbolInfo(const De Info.Lang = SymbolLanguage::CXX; if (isa<ClassTemplatePartialSpecializationDecl>(D)) { - Info.TemplateKind = SymbolCXXTemplateKind::TemplatePartialSpecialization; + Info.SubKinds |= (unsigned)SymbolSubKind::Generic; + Info.SubKinds |= (unsigned)SymbolSubKind::TemplatePartialSpecialization; } else if (isa<ClassTemplateSpecializationDecl>(D)) { - Info.TemplateKind = SymbolCXXTemplateKind::TemplateSpecialization; + Info.SubKinds |= (unsigned)SymbolSubKind::Generic; + Info.SubKinds |= (unsigned)SymbolSubKind::TemplateSpecialization; } } else { @@ -141,12 +143,12 @@ SymbolInfo index::getSymbolInfo(const De } case Decl::ClassTemplate: Info.Kind = SymbolKind::Class; - Info.TemplateKind = SymbolCXXTemplateKind::Template; + Info.SubKinds |= (unsigned)SymbolSubKind::Generic; Info.Lang = SymbolLanguage::CXX; break; case Decl::FunctionTemplate: Info.Kind = SymbolKind::Function; - Info.TemplateKind = SymbolCXXTemplateKind::Template; + Info.SubKinds |= (unsigned)SymbolSubKind::Generic; Info.Lang = SymbolLanguage::CXX; if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>( cast<FunctionTemplateDecl>(D)->getTemplatedDecl())) { @@ -167,7 +169,7 @@ SymbolInfo index::getSymbolInfo(const De case Decl::TypeAliasTemplate: Info.Kind = SymbolKind::TypeAlias; Info.Lang = SymbolLanguage::CXX; - Info.TemplateKind = SymbolCXXTemplateKind::Template; + Info.SubKinds |= (unsigned)SymbolSubKind::Generic; break; case Decl::TypeAlias: Info.Kind = SymbolKind::TypeAlias; @@ -183,11 +185,13 @@ SymbolInfo index::getSymbolInfo(const De if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { if (FD->getTemplatedKind() == - FunctionDecl::TK_FunctionTemplateSpecialization) - Info.TemplateKind = SymbolCXXTemplateKind::TemplateSpecialization; + FunctionDecl::TK_FunctionTemplateSpecialization) { + Info.SubKinds |= (unsigned)SymbolSubKind::Generic; + Info.SubKinds |= (unsigned)SymbolSubKind::TemplateSpecialization; + } } - if (Info.TemplateKind != SymbolCXXTemplateKind::NonTemplate) + if (Info.SubKinds & (unsigned)SymbolSubKind::Generic) Info.Lang = SymbolLanguage::CXX; return Info; @@ -292,16 +296,6 @@ StringRef index::getSymbolKindString(Sym llvm_unreachable("invalid symbol kind"); } -StringRef index::getTemplateKindStr(SymbolCXXTemplateKind TK) { - switch (TK) { - case SymbolCXXTemplateKind::NonTemplate: return "NT"; - case SymbolCXXTemplateKind::Template : return "T"; - case SymbolCXXTemplateKind::TemplatePartialSpecialization : return "TPS"; - case SymbolCXXTemplateKind::TemplateSpecialization: return "TS"; - } - llvm_unreachable("invalid template kind"); -} - StringRef index::getSymbolLanguageString(SymbolLanguage K) { switch (K) { case SymbolLanguage::C: return "C"; @@ -310,3 +304,31 @@ StringRef index::getSymbolLanguageString } llvm_unreachable("invalid symbol language kind"); } + +void index::applyForEachSymbolSubKind(SymbolSubKindSet SubKinds, + llvm::function_ref<void(SymbolSubKind)> Fn) { +#define APPLY_FOR_SUBKIND(K) \ + if (SubKinds & (unsigned)SymbolSubKind::K) \ + Fn(SymbolSubKind::K) + + APPLY_FOR_SUBKIND(Generic); + APPLY_FOR_SUBKIND(TemplatePartialSpecialization); + APPLY_FOR_SUBKIND(TemplateSpecialization); + +#undef APPLY_FOR_SUBKIND +} + +void index::printSymbolSubKinds(SymbolSubKindSet SubKinds, raw_ostream &OS) { + bool VisitedOnce = false; + applyForEachSymbolSubKind(SubKinds, [&](SymbolSubKind SubKind) { + if (VisitedOnce) + OS << ','; + else + VisitedOnce = true; + switch (SubKind) { + case SymbolSubKind::Generic: OS << "Gen"; break; + case SymbolSubKind::TemplatePartialSpecialization: OS << "TPS"; break; + case SymbolSubKind::TemplateSpecialization: OS << "TS"; break; + } + }); +} Modified: cfe/trunk/tools/c-index-test/core_main.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/core_main.cpp?rev=267116&r1=267115&r2=267116&view=diff ============================================================================== --- cfe/trunk/tools/c-index-test/core_main.cpp (original) +++ cfe/trunk/tools/c-index-test/core_main.cpp Fri Apr 22 02:21:04 2016 @@ -168,8 +168,9 @@ static bool printSourceSymbols(ArrayRef< static void printSymbolInfo(SymbolInfo SymInfo, raw_ostream &OS) { OS << getSymbolKindString(SymInfo.Kind); - if (SymInfo.TemplateKind != SymbolCXXTemplateKind::NonTemplate) { - OS << '-' << getTemplateKindStr(SymInfo.TemplateKind); + if (SymInfo.SubKinds) { + OS << '-'; + printSymbolSubKinds(SymInfo.SubKinds, OS); } OS << '/' << getSymbolLanguageString(SymInfo.Lang); } Modified: cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp?rev=267116&r1=267115&r2=267116&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp (original) +++ cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp Fri Apr 22 02:21:04 2016 @@ -1134,7 +1134,7 @@ void CXIndexDataConsumer::translateLoc(S static CXIdxEntityKind getEntityKindFromSymbolKind(SymbolKind K, SymbolLanguage L); static CXIdxEntityCXXTemplateKind -getEntityKindFromSymbolCXXTemplateKind(SymbolCXXTemplateKind K); +getEntityKindFromSymbolSubKinds(SymbolSubKindSet K); static CXIdxEntityLanguage getEntityLangFromSymbolLang(SymbolLanguage L); void CXIndexDataConsumer::getEntityInfo(const NamedDecl *D, @@ -1150,8 +1150,7 @@ void CXIndexDataConsumer::getEntityInfo( SymbolInfo SymInfo = getSymbolInfo(D); EntityInfo.kind = getEntityKindFromSymbolKind(SymInfo.Kind, SymInfo.Lang); - EntityInfo.templateKind = - getEntityKindFromSymbolCXXTemplateKind(SymInfo.TemplateKind); + EntityInfo.templateKind = getEntityKindFromSymbolSubKinds(SymInfo.SubKinds); EntityInfo.lang = getEntityLangFromSymbolLang(SymInfo.Lang); if (D->hasAttrs()) { @@ -1291,16 +1290,14 @@ static CXIdxEntityKind getEntityKindFrom } static CXIdxEntityCXXTemplateKind -getEntityKindFromSymbolCXXTemplateKind(SymbolCXXTemplateKind K) { - switch (K) { - case SymbolCXXTemplateKind::NonTemplate: return CXIdxEntity_NonTemplate; - case SymbolCXXTemplateKind::Template: return CXIdxEntity_Template; - case SymbolCXXTemplateKind::TemplatePartialSpecialization: +getEntityKindFromSymbolSubKinds(SymbolSubKindSet K) { + if (K & (unsigned)SymbolSubKind::TemplatePartialSpecialization) return CXIdxEntity_TemplatePartialSpecialization; - case SymbolCXXTemplateKind::TemplateSpecialization: + if (K & (unsigned)SymbolSubKind::TemplateSpecialization) return CXIdxEntity_TemplateSpecialization; - } - llvm_unreachable("invalid template kind"); + if (K & (unsigned)SymbolSubKind::Generic) + return CXIdxEntity_Template; + return CXIdxEntity_NonTemplate; } static CXIdxEntityLanguage getEntityLangFromSymbolLang(SymbolLanguage L) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits