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