1341825Sdim//===- IndexSymbol.h - Types and functions for indexing symbols -*- C++ -*-===//
2303233Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6303233Sdim//
7303233Sdim//===----------------------------------------------------------------------===//
8303233Sdim
9303233Sdim#ifndef LLVM_CLANG_INDEX_INDEXSYMBOL_H
10303233Sdim#define LLVM_CLANG_INDEX_INDEXSYMBOL_H
11303233Sdim
12303233Sdim#include "clang/Basic/LLVM.h"
13341825Sdim#include "clang/Lex/MacroInfo.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
77344779Sdimtypedef uint16_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,
88344779Sdim  /// Symbol is part of a protocol interface.
89344779Sdim  ProtocolInterface             = 1 << 8,
90303233Sdim};
91344779Sdimstatic const unsigned SymbolPropertyBitNum = 9;
92303233Sdim
93303233Sdim/// Set of roles that are attributed to symbol occurrences.
94341825Sdim///
95341825Sdim/// Low 9 bits of clang-c/include/Index.h CXSymbolRole mirrors this enum.
96314564Sdimenum class SymbolRole : uint32_t {
97303233Sdim  Declaration = 1 << 0,
98341825Sdim  Definition = 1 << 1,
99341825Sdim  Reference = 1 << 2,
100341825Sdim  Read = 1 << 3,
101341825Sdim  Write = 1 << 4,
102341825Sdim  Call = 1 << 5,
103341825Sdim  Dynamic = 1 << 6,
104341825Sdim  AddressOf = 1 << 7,
105341825Sdim  Implicit = 1 << 8,
106341825Sdim  // FIXME: this is not mirrored in CXSymbolRole.
107341825Sdim  // Note that macro occurrences aren't currently supported in libclang.
108341825Sdim  Undefinition = 1 << 9, // macro #undef
109303233Sdim
110303233Sdim  // Relation roles.
111341825Sdim  RelationChildOf = 1 << 10,
112341825Sdim  RelationBaseOf = 1 << 11,
113341825Sdim  RelationOverrideOf = 1 << 12,
114341825Sdim  RelationReceivedBy = 1 << 13,
115341825Sdim  RelationCalledBy = 1 << 14,
116341825Sdim  RelationExtendedBy = 1 << 15,
117341825Sdim  RelationAccessorOf = 1 << 16,
118341825Sdim  RelationContainedBy = 1 << 17,
119341825Sdim  RelationIBTypeOf = 1 << 18,
120341825Sdim  RelationSpecializationOf = 1 << 19,
121353358Sdim
122353358Sdim  // Symbol only references the name of the object as written. For example, a
123353358Sdim  // constructor references the class declaration using that role.
124353358Sdim  NameReference = 1 << 20,
125303233Sdim};
126353358Sdimstatic const unsigned SymbolRoleBitNum = 21;
127303233Sdimtypedef unsigned SymbolRoleSet;
128303233Sdim
129303233Sdim/// Represents a relation to another symbol for a symbol occurrence.
130303233Sdimstruct SymbolRelation {
131303233Sdim  SymbolRoleSet Roles;
132303233Sdim  const Decl *RelatedSymbol;
133303233Sdim
134303233Sdim  SymbolRelation(SymbolRoleSet Roles, const Decl *Sym)
135303233Sdim    : Roles(Roles), RelatedSymbol(Sym) {}
136303233Sdim};
137303233Sdim
138303233Sdimstruct SymbolInfo {
139303233Sdim  SymbolKind Kind;
140314564Sdim  SymbolSubKind SubKind;
141327952Sdim  SymbolLanguage Lang;
142314564Sdim  SymbolPropertySet Properties;
143303233Sdim};
144303233Sdim
145303233SdimSymbolInfo getSymbolInfo(const Decl *D);
146303233Sdim
147341825SdimSymbolInfo getSymbolInfoForMacro(const MacroInfo &MI);
148341825Sdim
149321369Sdimbool isFunctionLocalSymbol(const Decl *D);
150321369Sdim
151303233Sdimvoid applyForEachSymbolRole(SymbolRoleSet Roles,
152303233Sdim                            llvm::function_ref<void(SymbolRole)> Fn);
153321369Sdimbool applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles,
154321369Sdim                            llvm::function_ref<bool(SymbolRole)> Fn);
155303233Sdimvoid printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS);
156303233Sdim
157303233Sdim/// \returns true if no name was printed, false otherwise.
158303233Sdimbool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS);
159303233Sdim
160303233SdimStringRef getSymbolKindString(SymbolKind K);
161314564SdimStringRef getSymbolSubKindString(SymbolSubKind K);
162303233SdimStringRef getSymbolLanguageString(SymbolLanguage K);
163303233Sdim
164314564Sdimvoid applyForEachSymbolProperty(SymbolPropertySet Props,
165314564Sdim                            llvm::function_ref<void(SymbolProperty)> Fn);
166314564Sdimvoid printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS);
167303233Sdim
168303233Sdim} // namespace index
169303233Sdim} // namespace clang
170303233Sdim
171303233Sdim#endif
172