IndexSymbol.h revision 327952
193336Sdd//===--- IndexSymbol.h - Types and functions for indexing symbols ---------===// 293336Sdd// 393336Sdd// The LLVM Compiler Infrastructure 493336Sdd// 593336Sdd// This file is distributed under the University of Illinois Open Source 693336Sdd// License. See LICENSE.TXT for details. 793336Sdd// 893336Sdd//===----------------------------------------------------------------------===// 993336Sdd 1093336Sdd#ifndef LLVM_CLANG_INDEX_INDEXSYMBOL_H 1193336Sdd#define LLVM_CLANG_INDEX_INDEXSYMBOL_H 1293336Sdd 1393336Sdd#include "clang/Basic/LLVM.h" 1493336Sdd#include "llvm/ADT/STLExtras.h" 1593336Sdd#include "llvm/Support/DataTypes.h" 1693336Sdd 1793336Sddnamespace clang { 1893336Sdd class Decl; 1993336Sdd class LangOptions; 2093336Sdd 2193336Sddnamespace index { 2293336Sdd 2393336Sddenum class SymbolKind : uint8_t { 2493336Sdd Unknown, 2593336Sdd 2693336Sdd Module, 2793336Sdd Namespace, 2893336Sdd NamespaceAlias, 2993336Sdd Macro, 30203549Strasz 3193336Sdd Enum, 3293336Sdd Struct, 3393336Sdd Class, 3493336Sdd Protocol, 3593336Sdd Extension, 3693336Sdd Union, 3793336Sdd TypeAlias, 38117669Struckman 39117669Struckman Function, 40117669Struckman Variable, 41117669Struckman Field, 42117669Struckman EnumConstant, 4393336Sdd 4493336Sdd InstanceMethod, 4593336Sdd ClassMethod, 4693336Sdd StaticMethod, 4793336Sdd InstanceProperty, 4897597Sru ClassProperty, 49117669Struckman StaticProperty, 5097597Sru 51117669Struckman Constructor, 5293336Sdd Destructor, 53117669Struckman ConversionFunction, 5493336Sdd 55117669Struckman Parameter, 56117669Struckman Using, 57117669Struckman}; 58117669Struckman 59117669Struckmanenum class SymbolLanguage : uint8_t { 60117669Struckman C, 61117669Struckman ObjC, 62117669Struckman CXX, 63117669Struckman Swift, 6493336Sdd}; 6593336Sdd 6697597Sru/// Language specific sub-kinds. 67167387Sjhbenum class SymbolSubKind : uint8_t { 6893336Sdd None, 69117669Struckman CXXCopyConstructor, 70117669Struckman CXXMoveConstructor, 71117669Struckman AccessorGetter, 72117669Struckman AccessorSetter, 7393336Sdd UsingTypename, 74117669Struckman UsingValue, 75117669Struckman}; 76117669Struckman 77117669Struckmantypedef uint8_t SymbolPropertySet; 78117669Struckman/// Set of properties that provide additional info about a symbol. 7993336Sddenum class SymbolProperty : SymbolPropertySet { 80117669Struckman Generic = 1 << 0, 81117669Struckman TemplatePartialSpecialization = 1 << 1, 82117670Struckman TemplateSpecialization = 1 << 2, 83117669Struckman UnitTest = 1 << 3, 84117669Struckman IBAnnotated = 1 << 4, 85117669Struckman IBOutletCollection = 1 << 5, 8693336Sdd GKInspectable = 1 << 6, 8793336Sdd Local = 1 << 7, 8893336Sdd}; 8993336Sddstatic const unsigned SymbolPropertyBitNum = 8; 9093336Sdd 9193336Sdd/// Set of roles that are attributed to symbol occurrences. 9293336Sddenum class SymbolRole : uint32_t { 9393336Sdd Declaration = 1 << 0, 9493336Sdd Definition = 1 << 1, 9593336Sdd Reference = 1 << 2, 9693336Sdd Read = 1 << 3, 9793336Sdd Write = 1 << 4, 9893336Sdd Call = 1 << 5, 9993336Sdd Dynamic = 1 << 6, 10093336Sdd AddressOf = 1 << 7, 10197597Sru Implicit = 1 << 8, 10293336Sdd 10393336Sdd // Relation roles. 10493336Sdd RelationChildOf = 1 << 9, 10593336Sdd RelationBaseOf = 1 << 10, 10693336Sdd RelationOverrideOf = 1 << 11, 10793336Sdd RelationReceivedBy = 1 << 12, 10893336Sdd RelationCalledBy = 1 << 13, 10993336Sdd RelationExtendedBy = 1 << 14, 11093336Sdd RelationAccessorOf = 1 << 15, 11193336Sdd RelationContainedBy = 1 << 16, 11293336Sdd RelationIBTypeOf = 1 << 17, 113167387Sjhb RelationSpecializationOf = 1 << 18, 11493336Sdd}; 11593336Sddstatic const unsigned SymbolRoleBitNum = 19; 11693336Sddtypedef unsigned SymbolRoleSet; 11797597Sru 11893336Sdd/// Represents a relation to another symbol for a symbol occurrence. 11993336Sddstruct SymbolRelation { 12093336Sdd SymbolRoleSet Roles; 12193336Sdd const Decl *RelatedSymbol; 12293336Sdd 12393336Sdd SymbolRelation(SymbolRoleSet Roles, const Decl *Sym) 12493336Sdd : Roles(Roles), RelatedSymbol(Sym) {} 12593336Sdd}; 12693336Sdd 12793336Sddstruct SymbolInfo { 128117669Struckman SymbolKind Kind; 12993336Sdd SymbolSubKind SubKind; 13093336Sdd SymbolLanguage Lang; 13193336Sdd SymbolPropertySet Properties; 13293336Sdd}; 13393336Sdd 13493336SddSymbolInfo getSymbolInfo(const Decl *D); 13593336Sdd 13693336Sddbool isFunctionLocalSymbol(const Decl *D); 137117669Struckman 13893336Sddvoid applyForEachSymbolRole(SymbolRoleSet Roles, 13993336Sdd llvm::function_ref<void(SymbolRole)> Fn); 140117669Struckmanbool applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles, 141117669Struckman llvm::function_ref<bool(SymbolRole)> Fn); 142117669Struckmanvoid printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS); 14393336Sdd 144117669Struckman/// \returns true if no name was printed, false otherwise. 145117669Struckmanbool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS); 146117669Struckman 14793336SddStringRef getSymbolKindString(SymbolKind K); 14893336SddStringRef getSymbolSubKindString(SymbolSubKind K); 14993336SddStringRef getSymbolLanguageString(SymbolLanguage K); 150117669Struckman 151117669Struckmanvoid applyForEachSymbolProperty(SymbolPropertySet Props, 152117669Struckman llvm::function_ref<void(SymbolProperty)> Fn); 15393336Sddvoid printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS); 154117669Struckman 15593336Sdd} // namespace index 15693336Sdd} // namespace clang 157117669Struckman 15893336Sdd#endif 159117669Struckman