IndexSymbol.h revision 303233
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 17namespace clang { 18 class Decl; 19 class LangOptions; 20 21namespace index { 22 23enum 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 56enum class SymbolLanguage { 57 C, 58 ObjC, 59 CXX, 60}; 61 62enum 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}; 70static const unsigned SymbolSubKindBitNum = 6; 71typedef unsigned SymbolSubKindSet; 72 73/// Set of roles that are attributed to symbol occurrences. 74enum 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}; 92static const unsigned SymbolRoleBitNum = 14; 93typedef unsigned SymbolRoleSet; 94 95/// Represents a relation to another symbol for a symbol occurrence. 96struct SymbolRelation { 97 SymbolRoleSet Roles; 98 const Decl *RelatedSymbol; 99 100 SymbolRelation(SymbolRoleSet Roles, const Decl *Sym) 101 : Roles(Roles), RelatedSymbol(Sym) {} 102}; 103 104struct SymbolInfo { 105 SymbolKind Kind; 106 SymbolSubKindSet SubKinds; 107 SymbolLanguage Lang; 108}; 109 110SymbolInfo getSymbolInfo(const Decl *D); 111 112void applyForEachSymbolRole(SymbolRoleSet Roles, 113 llvm::function_ref<void(SymbolRole)> Fn); 114void printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS); 115 116/// \returns true if no name was printed, false otherwise. 117bool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS); 118 119StringRef getSymbolKindString(SymbolKind K); 120StringRef getSymbolLanguageString(SymbolLanguage K); 121 122void applyForEachSymbolSubKind(SymbolSubKindSet SubKinds, 123 llvm::function_ref<void(SymbolSubKind)> Fn); 124void printSymbolSubKinds(SymbolSubKindSet SubKinds, raw_ostream &OS); 125 126} // namespace index 127} // namespace clang 128 129#endif 130