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