1341825Sdim//===- IndexSymbol.h - Types and functions for indexing symbols -*- C++ -*-===// 2303233Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6303233Sdim// 7303233Sdim//===----------------------------------------------------------------------===// 8303233Sdim 9303233Sdim#ifndef LLVM_CLANG_INDEX_INDEXSYMBOL_H 10303233Sdim#define LLVM_CLANG_INDEX_INDEXSYMBOL_H 11303233Sdim 12303233Sdim#include "clang/Basic/LLVM.h" 13341825Sdim#include "clang/Lex/MacroInfo.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 77344779Sdimtypedef uint16_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, 88344779Sdim /// Symbol is part of a protocol interface. 89344779Sdim ProtocolInterface = 1 << 8, 90303233Sdim}; 91344779Sdimstatic const unsigned SymbolPropertyBitNum = 9; 92303233Sdim 93303233Sdim/// Set of roles that are attributed to symbol occurrences. 94341825Sdim/// 95341825Sdim/// Low 9 bits of clang-c/include/Index.h CXSymbolRole mirrors this enum. 96314564Sdimenum class SymbolRole : uint32_t { 97303233Sdim Declaration = 1 << 0, 98341825Sdim Definition = 1 << 1, 99341825Sdim Reference = 1 << 2, 100341825Sdim Read = 1 << 3, 101341825Sdim Write = 1 << 4, 102341825Sdim Call = 1 << 5, 103341825Sdim Dynamic = 1 << 6, 104341825Sdim AddressOf = 1 << 7, 105341825Sdim Implicit = 1 << 8, 106341825Sdim // FIXME: this is not mirrored in CXSymbolRole. 107341825Sdim // Note that macro occurrences aren't currently supported in libclang. 108341825Sdim Undefinition = 1 << 9, // macro #undef 109303233Sdim 110303233Sdim // Relation roles. 111341825Sdim RelationChildOf = 1 << 10, 112341825Sdim RelationBaseOf = 1 << 11, 113341825Sdim RelationOverrideOf = 1 << 12, 114341825Sdim RelationReceivedBy = 1 << 13, 115341825Sdim RelationCalledBy = 1 << 14, 116341825Sdim RelationExtendedBy = 1 << 15, 117341825Sdim RelationAccessorOf = 1 << 16, 118341825Sdim RelationContainedBy = 1 << 17, 119341825Sdim RelationIBTypeOf = 1 << 18, 120341825Sdim RelationSpecializationOf = 1 << 19, 121353358Sdim 122353358Sdim // Symbol only references the name of the object as written. For example, a 123353358Sdim // constructor references the class declaration using that role. 124353358Sdim NameReference = 1 << 20, 125303233Sdim}; 126353358Sdimstatic const unsigned SymbolRoleBitNum = 21; 127303233Sdimtypedef unsigned SymbolRoleSet; 128303233Sdim 129303233Sdim/// Represents a relation to another symbol for a symbol occurrence. 130303233Sdimstruct SymbolRelation { 131303233Sdim SymbolRoleSet Roles; 132303233Sdim const Decl *RelatedSymbol; 133303233Sdim 134303233Sdim SymbolRelation(SymbolRoleSet Roles, const Decl *Sym) 135303233Sdim : Roles(Roles), RelatedSymbol(Sym) {} 136303233Sdim}; 137303233Sdim 138303233Sdimstruct SymbolInfo { 139303233Sdim SymbolKind Kind; 140314564Sdim SymbolSubKind SubKind; 141327952Sdim SymbolLanguage Lang; 142314564Sdim SymbolPropertySet Properties; 143303233Sdim}; 144303233Sdim 145303233SdimSymbolInfo getSymbolInfo(const Decl *D); 146303233Sdim 147341825SdimSymbolInfo getSymbolInfoForMacro(const MacroInfo &MI); 148341825Sdim 149321369Sdimbool isFunctionLocalSymbol(const Decl *D); 150321369Sdim 151303233Sdimvoid applyForEachSymbolRole(SymbolRoleSet Roles, 152303233Sdim llvm::function_ref<void(SymbolRole)> Fn); 153321369Sdimbool applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles, 154321369Sdim llvm::function_ref<bool(SymbolRole)> Fn); 155303233Sdimvoid printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS); 156303233Sdim 157303233Sdim/// \returns true if no name was printed, false otherwise. 158303233Sdimbool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS); 159303233Sdim 160303233SdimStringRef getSymbolKindString(SymbolKind K); 161314564SdimStringRef getSymbolSubKindString(SymbolSubKind K); 162303233SdimStringRef getSymbolLanguageString(SymbolLanguage K); 163303233Sdim 164314564Sdimvoid applyForEachSymbolProperty(SymbolPropertySet Props, 165314564Sdim llvm::function_ref<void(SymbolProperty)> Fn); 166314564Sdimvoid printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS); 167303233Sdim 168303233Sdim} // namespace index 169303233Sdim} // namespace clang 170303233Sdim 171303233Sdim#endif 172