IndexSymbol.h revision 327952
1303233Sdim//===--- IndexSymbol.h - Types and functions for indexing symbols ---------===// 2303233Sdim// 3303233Sdim// The LLVM Compiler Infrastructure 4303233Sdim// 5303233Sdim// This file is distributed under the University of Illinois Open Source 6303233Sdim// License. See LICENSE.TXT for details. 7303233Sdim// 8303233Sdim//===----------------------------------------------------------------------===// 9303233Sdim 10303233Sdim#ifndef LLVM_CLANG_INDEX_INDEXSYMBOL_H 11303233Sdim#define LLVM_CLANG_INDEX_INDEXSYMBOL_H 12303233Sdim 13303233Sdim#include "clang/Basic/LLVM.h" 14303233Sdim#include "llvm/ADT/STLExtras.h" 15303233Sdim#include "llvm/Support/DataTypes.h" 16303233Sdim 17303233Sdimnamespace clang { 18303233Sdim class Decl; 19303233Sdim class LangOptions; 20303233Sdim 21303233Sdimnamespace index { 22303233Sdim 23303233Sdimenum class SymbolKind : uint8_t { 24303233Sdim Unknown, 25303233Sdim 26303233Sdim Module, 27303233Sdim Namespace, 28303233Sdim NamespaceAlias, 29303233Sdim Macro, 30303233Sdim 31303233Sdim Enum, 32303233Sdim Struct, 33303233Sdim Class, 34303233Sdim Protocol, 35303233Sdim Extension, 36303233Sdim Union, 37303233Sdim TypeAlias, 38303233Sdim 39303233Sdim Function, 40303233Sdim Variable, 41303233Sdim Field, 42303233Sdim EnumConstant, 43303233Sdim 44303233Sdim InstanceMethod, 45303233Sdim ClassMethod, 46303233Sdim StaticMethod, 47303233Sdim InstanceProperty, 48303233Sdim ClassProperty, 49303233Sdim StaticProperty, 50303233Sdim 51303233Sdim Constructor, 52303233Sdim Destructor, 53303233Sdim ConversionFunction, 54321369Sdim 55321369Sdim Parameter, 56327952Sdim Using, 57303233Sdim}; 58303233Sdim 59327952Sdimenum class SymbolLanguage : uint8_t { 60303233Sdim C, 61303233Sdim ObjC, 62303233Sdim CXX, 63321369Sdim Swift, 64303233Sdim}; 65303233Sdim 66314564Sdim/// Language specific sub-kinds. 67327952Sdimenum class SymbolSubKind : uint8_t { 68314564Sdim None, 69314564Sdim CXXCopyConstructor, 70314564Sdim CXXMoveConstructor, 71314564Sdim AccessorGetter, 72314564Sdim AccessorSetter, 73327952Sdim UsingTypename, 74327952Sdim UsingValue, 75314564Sdim}; 76314564Sdim 77327952Sdimtypedef uint8_t SymbolPropertySet; 78314564Sdim/// Set of properties that provide additional info about a symbol. 79327952Sdimenum class SymbolProperty : SymbolPropertySet { 80303233Sdim Generic = 1 << 0, 81303233Sdim TemplatePartialSpecialization = 1 << 1, 82303233Sdim TemplateSpecialization = 1 << 2, 83303233Sdim UnitTest = 1 << 3, 84303233Sdim IBAnnotated = 1 << 4, 85303233Sdim IBOutletCollection = 1 << 5, 86314564Sdim GKInspectable = 1 << 6, 87321369Sdim Local = 1 << 7, 88303233Sdim}; 89321369Sdimstatic const unsigned SymbolPropertyBitNum = 8; 90303233Sdim 91303233Sdim/// Set of roles that are attributed to symbol occurrences. 92314564Sdimenum class SymbolRole : uint32_t { 93303233Sdim Declaration = 1 << 0, 94303233Sdim Definition = 1 << 1, 95303233Sdim Reference = 1 << 2, 96303233Sdim Read = 1 << 3, 97303233Sdim Write = 1 << 4, 98303233Sdim Call = 1 << 5, 99303233Sdim Dynamic = 1 << 6, 100303233Sdim AddressOf = 1 << 7, 101303233Sdim Implicit = 1 << 8, 102303233Sdim 103303233Sdim // Relation roles. 104303233Sdim RelationChildOf = 1 << 9, 105303233Sdim RelationBaseOf = 1 << 10, 106303233Sdim RelationOverrideOf = 1 << 11, 107303233Sdim RelationReceivedBy = 1 << 12, 108303233Sdim RelationCalledBy = 1 << 13, 109314564Sdim RelationExtendedBy = 1 << 14, 110314564Sdim RelationAccessorOf = 1 << 15, 111314564Sdim RelationContainedBy = 1 << 16, 112314564Sdim RelationIBTypeOf = 1 << 17, 113321369Sdim RelationSpecializationOf = 1 << 18, 114303233Sdim}; 115321369Sdimstatic const unsigned SymbolRoleBitNum = 19; 116303233Sdimtypedef unsigned SymbolRoleSet; 117303233Sdim 118303233Sdim/// Represents a relation to another symbol for a symbol occurrence. 119303233Sdimstruct SymbolRelation { 120303233Sdim SymbolRoleSet Roles; 121303233Sdim const Decl *RelatedSymbol; 122303233Sdim 123303233Sdim SymbolRelation(SymbolRoleSet Roles, const Decl *Sym) 124303233Sdim : Roles(Roles), RelatedSymbol(Sym) {} 125303233Sdim}; 126303233Sdim 127303233Sdimstruct SymbolInfo { 128303233Sdim SymbolKind Kind; 129314564Sdim SymbolSubKind SubKind; 130327952Sdim SymbolLanguage Lang; 131314564Sdim SymbolPropertySet Properties; 132303233Sdim}; 133303233Sdim 134303233SdimSymbolInfo getSymbolInfo(const Decl *D); 135303233Sdim 136321369Sdimbool isFunctionLocalSymbol(const Decl *D); 137321369Sdim 138303233Sdimvoid applyForEachSymbolRole(SymbolRoleSet Roles, 139303233Sdim llvm::function_ref<void(SymbolRole)> Fn); 140321369Sdimbool applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles, 141321369Sdim llvm::function_ref<bool(SymbolRole)> Fn); 142303233Sdimvoid printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS); 143303233Sdim 144303233Sdim/// \returns true if no name was printed, false otherwise. 145303233Sdimbool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS); 146303233Sdim 147303233SdimStringRef getSymbolKindString(SymbolKind K); 148314564SdimStringRef getSymbolSubKindString(SymbolSubKind K); 149303233SdimStringRef getSymbolLanguageString(SymbolLanguage K); 150303233Sdim 151314564Sdimvoid applyForEachSymbolProperty(SymbolPropertySet Props, 152314564Sdim llvm::function_ref<void(SymbolProperty)> Fn); 153314564Sdimvoid printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS); 154303233Sdim 155303233Sdim} // namespace index 156303233Sdim} // namespace clang 157303233Sdim 158303233Sdim#endif 159