1 //===--- IndexSymbol.h - Types and functions for indexing symbols ---------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_CLANG_INDEX_INDEXSYMBOL_H 11 #define LLVM_CLANG_INDEX_INDEXSYMBOL_H 12 13 #include "clang/Basic/LLVM.h" 14 #include "llvm/ADT/STLExtras.h" 15 #include "llvm/Support/DataTypes.h" 16 17 namespace clang { 18 class Decl; 19 class LangOptions; 20 21 namespace index { 22 23 enum class SymbolKind : uint8_t { 24 Unknown, 25 26 Module, 27 Namespace, 28 NamespaceAlias, 29 Macro, 30 31 Enum, 32 Struct, 33 Class, 34 Protocol, 35 Extension, 36 Union, 37 TypeAlias, 38 39 Function, 40 Variable, 41 Field, 42 EnumConstant, 43 44 InstanceMethod, 45 ClassMethod, 46 StaticMethod, 47 InstanceProperty, 48 ClassProperty, 49 StaticProperty, 50 51 Constructor, 52 Destructor, 53 ConversionFunction, 54 }; 55 56 enum class SymbolLanguage { 57 C, 58 ObjC, 59 CXX, 60 }; 61 62 enum class SymbolSubKind : uint8_t { 63 Generic = 1 << 0, 64 TemplatePartialSpecialization = 1 << 1, 65 TemplateSpecialization = 1 << 2, 66 UnitTest = 1 << 3, 67 IBAnnotated = 1 << 4, 68 IBOutletCollection = 1 << 5, 69 }; 70 static const unsigned SymbolSubKindBitNum = 6; 71 typedef unsigned SymbolSubKindSet; 72 73 /// Set of roles that are attributed to symbol occurrences. 74 enum class SymbolRole : uint16_t { 75 Declaration = 1 << 0, 76 Definition = 1 << 1, 77 Reference = 1 << 2, 78 Read = 1 << 3, 79 Write = 1 << 4, 80 Call = 1 << 5, 81 Dynamic = 1 << 6, 82 AddressOf = 1 << 7, 83 Implicit = 1 << 8, 84 85 // Relation roles. 86 RelationChildOf = 1 << 9, 87 RelationBaseOf = 1 << 10, 88 RelationOverrideOf = 1 << 11, 89 RelationReceivedBy = 1 << 12, 90 RelationCalledBy = 1 << 13, 91 }; 92 static const unsigned SymbolRoleBitNum = 14; 93 typedef unsigned SymbolRoleSet; 94 95 /// Represents a relation to another symbol for a symbol occurrence. 96 struct SymbolRelation { 97 SymbolRoleSet Roles; 98 const Decl *RelatedSymbol; 99 100 SymbolRelation(SymbolRoleSet Roles, const Decl *Sym) 101 : Roles(Roles), RelatedSymbol(Sym) {} 102 }; 103 104 struct SymbolInfo { 105 SymbolKind Kind; 106 SymbolSubKindSet SubKinds; 107 SymbolLanguage Lang; 108 }; 109 110 SymbolInfo getSymbolInfo(const Decl *D); 111 112 void applyForEachSymbolRole(SymbolRoleSet Roles, 113 llvm::function_ref<void(SymbolRole)> Fn); 114 void printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS); 115 116 /// \returns true if no name was printed, false otherwise. 117 bool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS); 118 119 StringRef getSymbolKindString(SymbolKind K); 120 StringRef getSymbolLanguageString(SymbolLanguage K); 121 122 void applyForEachSymbolSubKind(SymbolSubKindSet SubKinds, 123 llvm::function_ref<void(SymbolSubKind)> Fn); 124 void printSymbolSubKinds(SymbolSubKindSet SubKinds, raw_ostream &OS); 125 126 } // namespace index 127 } // namespace clang 128 129 #endif 130