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