1 //===- IndexSymbol.h - Types and functions for indexing symbols -*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CLANG_INDEX_INDEXSYMBOL_H 10 #define LLVM_CLANG_INDEX_INDEXSYMBOL_H 11 12 #include "clang/Basic/LLVM.h" 13 #include "clang/Lex/MacroInfo.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 Parameter, 56 Using, 57 TemplateTypeParm, 58 TemplateTemplateParm, 59 NonTypeTemplateParm, 60 }; 61 62 enum class SymbolLanguage : uint8_t { 63 C, 64 ObjC, 65 CXX, 66 Swift, 67 }; 68 69 /// Language specific sub-kinds. 70 enum class SymbolSubKind : uint8_t { 71 None, 72 CXXCopyConstructor, 73 CXXMoveConstructor, 74 AccessorGetter, 75 AccessorSetter, 76 UsingTypename, 77 UsingValue, 78 UsingEnum, 79 }; 80 81 typedef uint16_t SymbolPropertySet; 82 /// Set of properties that provide additional info about a symbol. 83 enum class SymbolProperty : SymbolPropertySet { 84 Generic = 1 << 0, 85 TemplatePartialSpecialization = 1 << 1, 86 TemplateSpecialization = 1 << 2, 87 UnitTest = 1 << 3, 88 IBAnnotated = 1 << 4, 89 IBOutletCollection = 1 << 5, 90 GKInspectable = 1 << 6, 91 Local = 1 << 7, 92 /// Symbol is part of a protocol interface. 93 ProtocolInterface = 1 << 8, 94 }; 95 static const unsigned SymbolPropertyBitNum = 9; 96 97 /// Set of roles that are attributed to symbol occurrences. 98 /// 99 /// Low 9 bits of clang-c/include/Index.h CXSymbolRole mirrors this enum. 100 enum class SymbolRole : uint32_t { 101 Declaration = 1 << 0, 102 Definition = 1 << 1, 103 Reference = 1 << 2, 104 Read = 1 << 3, 105 Write = 1 << 4, 106 Call = 1 << 5, 107 Dynamic = 1 << 6, 108 AddressOf = 1 << 7, 109 Implicit = 1 << 8, 110 // FIXME: this is not mirrored in CXSymbolRole. 111 // Note that macro occurrences aren't currently supported in libclang. 112 Undefinition = 1 << 9, // macro #undef 113 114 // Relation roles. 115 RelationChildOf = 1 << 10, 116 RelationBaseOf = 1 << 11, 117 RelationOverrideOf = 1 << 12, 118 RelationReceivedBy = 1 << 13, 119 RelationCalledBy = 1 << 14, 120 RelationExtendedBy = 1 << 15, 121 RelationAccessorOf = 1 << 16, 122 RelationContainedBy = 1 << 17, 123 RelationIBTypeOf = 1 << 18, 124 RelationSpecializationOf = 1 << 19, 125 126 // Symbol only references the name of the object as written. For example, a 127 // constructor references the class declaration using that role. 128 NameReference = 1 << 20, 129 }; 130 static const unsigned SymbolRoleBitNum = 21; 131 typedef unsigned SymbolRoleSet; 132 133 /// Represents a relation to another symbol for a symbol occurrence. 134 struct SymbolRelation { 135 SymbolRoleSet Roles; 136 const Decl *RelatedSymbol; 137 SymbolRelationSymbolRelation138 SymbolRelation(SymbolRoleSet Roles, const Decl *Sym) 139 : Roles(Roles), RelatedSymbol(Sym) {} 140 }; 141 142 struct SymbolInfo { 143 SymbolKind Kind; 144 SymbolSubKind SubKind; 145 SymbolLanguage Lang; 146 SymbolPropertySet Properties; 147 }; 148 149 SymbolInfo getSymbolInfo(const Decl *D); 150 151 SymbolInfo getSymbolInfoForMacro(const MacroInfo &MI); 152 153 bool isFunctionLocalSymbol(const Decl *D); 154 155 void applyForEachSymbolRole(SymbolRoleSet Roles, 156 llvm::function_ref<void(SymbolRole)> Fn); 157 bool applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles, 158 llvm::function_ref<bool(SymbolRole)> Fn); 159 void printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS); 160 161 /// \returns true if no name was printed, false otherwise. 162 bool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS); 163 164 StringRef getSymbolKindString(SymbolKind K); 165 StringRef getSymbolSubKindString(SymbolSubKind K); 166 StringRef getSymbolLanguageString(SymbolLanguage K); 167 168 void applyForEachSymbolProperty(SymbolPropertySet Props, 169 llvm::function_ref<void(SymbolProperty)> Fn); 170 void printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS); 171 172 } // namespace index 173 } // namespace clang 174 175 #endif 176