IndexSymbol.h revision 344779
1//===- IndexSymbol.h - Types and functions for indexing symbols -*- C++ -*-===//
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 "clang/Lex/MacroInfo.h"
15#include "llvm/ADT/STLExtras.h"
16#include "llvm/Support/DataTypes.h"
17
18namespace clang {
19  class Decl;
20  class LangOptions;
21
22namespace index {
23
24enum class SymbolKind : uint8_t {
25  Unknown,
26
27  Module,
28  Namespace,
29  NamespaceAlias,
30  Macro,
31
32  Enum,
33  Struct,
34  Class,
35  Protocol,
36  Extension,
37  Union,
38  TypeAlias,
39
40  Function,
41  Variable,
42  Field,
43  EnumConstant,
44
45  InstanceMethod,
46  ClassMethod,
47  StaticMethod,
48  InstanceProperty,
49  ClassProperty,
50  StaticProperty,
51
52  Constructor,
53  Destructor,
54  ConversionFunction,
55
56  Parameter,
57  Using,
58};
59
60enum class SymbolLanguage : uint8_t {
61  C,
62  ObjC,
63  CXX,
64  Swift,
65};
66
67/// Language specific sub-kinds.
68enum class SymbolSubKind : uint8_t {
69  None,
70  CXXCopyConstructor,
71  CXXMoveConstructor,
72  AccessorGetter,
73  AccessorSetter,
74  UsingTypename,
75  UsingValue,
76};
77
78typedef uint16_t SymbolPropertySet;
79/// Set of properties that provide additional info about a symbol.
80enum class SymbolProperty : SymbolPropertySet {
81  Generic                       = 1 << 0,
82  TemplatePartialSpecialization = 1 << 1,
83  TemplateSpecialization        = 1 << 2,
84  UnitTest                      = 1 << 3,
85  IBAnnotated                   = 1 << 4,
86  IBOutletCollection            = 1 << 5,
87  GKInspectable                 = 1 << 6,
88  Local                         = 1 << 7,
89  /// Symbol is part of a protocol interface.
90  ProtocolInterface             = 1 << 8,
91};
92static const unsigned SymbolPropertyBitNum = 9;
93
94/// Set of roles that are attributed to symbol occurrences.
95///
96/// Low 9 bits of clang-c/include/Index.h CXSymbolRole mirrors this enum.
97enum class SymbolRole : uint32_t {
98  Declaration = 1 << 0,
99  Definition = 1 << 1,
100  Reference = 1 << 2,
101  Read = 1 << 3,
102  Write = 1 << 4,
103  Call = 1 << 5,
104  Dynamic = 1 << 6,
105  AddressOf = 1 << 7,
106  Implicit = 1 << 8,
107  // FIXME: this is not mirrored in CXSymbolRole.
108  // Note that macro occurrences aren't currently supported in libclang.
109  Undefinition = 1 << 9, // macro #undef
110
111  // Relation roles.
112  RelationChildOf = 1 << 10,
113  RelationBaseOf = 1 << 11,
114  RelationOverrideOf = 1 << 12,
115  RelationReceivedBy = 1 << 13,
116  RelationCalledBy = 1 << 14,
117  RelationExtendedBy = 1 << 15,
118  RelationAccessorOf = 1 << 16,
119  RelationContainedBy = 1 << 17,
120  RelationIBTypeOf = 1 << 18,
121  RelationSpecializationOf = 1 << 19,
122};
123static const unsigned SymbolRoleBitNum = 20;
124typedef unsigned SymbolRoleSet;
125
126/// Represents a relation to another symbol for a symbol occurrence.
127struct SymbolRelation {
128  SymbolRoleSet Roles;
129  const Decl *RelatedSymbol;
130
131  SymbolRelation(SymbolRoleSet Roles, const Decl *Sym)
132    : Roles(Roles), RelatedSymbol(Sym) {}
133};
134
135struct SymbolInfo {
136  SymbolKind Kind;
137  SymbolSubKind SubKind;
138  SymbolLanguage Lang;
139  SymbolPropertySet Properties;
140};
141
142SymbolInfo getSymbolInfo(const Decl *D);
143
144SymbolInfo getSymbolInfoForMacro(const MacroInfo &MI);
145
146bool isFunctionLocalSymbol(const Decl *D);
147
148void applyForEachSymbolRole(SymbolRoleSet Roles,
149                            llvm::function_ref<void(SymbolRole)> Fn);
150bool applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles,
151                            llvm::function_ref<bool(SymbolRole)> Fn);
152void printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS);
153
154/// \returns true if no name was printed, false otherwise.
155bool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS);
156
157StringRef getSymbolKindString(SymbolKind K);
158StringRef getSymbolSubKindString(SymbolSubKind K);
159StringRef getSymbolLanguageString(SymbolLanguage K);
160
161void applyForEachSymbolProperty(SymbolPropertySet Props,
162                            llvm::function_ref<void(SymbolProperty)> Fn);
163void printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS);
164
165} // namespace index
166} // namespace clang
167
168#endif
169