• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 namespace clang {
18   class Decl;
19   class LangOptions;
20 
21 namespace index {
22 
23 enum 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 
56 enum class SymbolLanguage {
57   C,
58   ObjC,
59   CXX,
60 };
61 
62 enum 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 };
70 static const unsigned SymbolSubKindBitNum = 6;
71 typedef unsigned SymbolSubKindSet;
72 
73 /// Set of roles that are attributed to symbol occurrences.
74 enum 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 };
92 static const unsigned SymbolRoleBitNum = 14;
93 typedef unsigned SymbolRoleSet;
94 
95 /// Represents a relation to another symbol for a symbol occurrence.
96 struct SymbolRelation {
97   SymbolRoleSet Roles;
98   const Decl *RelatedSymbol;
99 
SymbolRelationSymbolRelation100   SymbolRelation(SymbolRoleSet Roles, const Decl *Sym)
101     : Roles(Roles), RelatedSymbol(Sym) {}
102 };
103 
104 struct SymbolInfo {
105   SymbolKind Kind;
106   SymbolSubKindSet SubKinds;
107   SymbolLanguage Lang;
108 };
109 
110 SymbolInfo getSymbolInfo(const Decl *D);
111 
112 void applyForEachSymbolRole(SymbolRoleSet Roles,
113                             llvm::function_ref<void(SymbolRole)> Fn);
114 void printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS);
115 
116 /// \returns true if no name was printed, false otherwise.
117 bool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS);
118 
119 StringRef getSymbolKindString(SymbolKind K);
120 StringRef getSymbolLanguageString(SymbolLanguage K);
121 
122 void applyForEachSymbolSubKind(SymbolSubKindSet SubKinds,
123                             llvm::function_ref<void(SymbolSubKind)> Fn);
124 void printSymbolSubKinds(SymbolSubKindSet SubKinds, raw_ostream &OS);
125 
126 } // namespace index
127 } // namespace clang
128 
129 #endif
130