IndexSymbol.h revision 327952
193336Sdd//===--- IndexSymbol.h - Types and functions for indexing symbols ---------===//
293336Sdd//
393336Sdd//                     The LLVM Compiler Infrastructure
493336Sdd//
593336Sdd// This file is distributed under the University of Illinois Open Source
693336Sdd// License. See LICENSE.TXT for details.
793336Sdd//
893336Sdd//===----------------------------------------------------------------------===//
993336Sdd
1093336Sdd#ifndef LLVM_CLANG_INDEX_INDEXSYMBOL_H
1193336Sdd#define LLVM_CLANG_INDEX_INDEXSYMBOL_H
1293336Sdd
1393336Sdd#include "clang/Basic/LLVM.h"
1493336Sdd#include "llvm/ADT/STLExtras.h"
1593336Sdd#include "llvm/Support/DataTypes.h"
1693336Sdd
1793336Sddnamespace clang {
1893336Sdd  class Decl;
1993336Sdd  class LangOptions;
2093336Sdd
2193336Sddnamespace index {
2293336Sdd
2393336Sddenum class SymbolKind : uint8_t {
2493336Sdd  Unknown,
2593336Sdd
2693336Sdd  Module,
2793336Sdd  Namespace,
2893336Sdd  NamespaceAlias,
2993336Sdd  Macro,
30203549Strasz
3193336Sdd  Enum,
3293336Sdd  Struct,
3393336Sdd  Class,
3493336Sdd  Protocol,
3593336Sdd  Extension,
3693336Sdd  Union,
3793336Sdd  TypeAlias,
38117669Struckman
39117669Struckman  Function,
40117669Struckman  Variable,
41117669Struckman  Field,
42117669Struckman  EnumConstant,
4393336Sdd
4493336Sdd  InstanceMethod,
4593336Sdd  ClassMethod,
4693336Sdd  StaticMethod,
4793336Sdd  InstanceProperty,
4897597Sru  ClassProperty,
49117669Struckman  StaticProperty,
5097597Sru
51117669Struckman  Constructor,
5293336Sdd  Destructor,
53117669Struckman  ConversionFunction,
5493336Sdd
55117669Struckman  Parameter,
56117669Struckman  Using,
57117669Struckman};
58117669Struckman
59117669Struckmanenum class SymbolLanguage : uint8_t {
60117669Struckman  C,
61117669Struckman  ObjC,
62117669Struckman  CXX,
63117669Struckman  Swift,
6493336Sdd};
6593336Sdd
6697597Sru/// Language specific sub-kinds.
67167387Sjhbenum class SymbolSubKind : uint8_t {
6893336Sdd  None,
69117669Struckman  CXXCopyConstructor,
70117669Struckman  CXXMoveConstructor,
71117669Struckman  AccessorGetter,
72117669Struckman  AccessorSetter,
7393336Sdd  UsingTypename,
74117669Struckman  UsingValue,
75117669Struckman};
76117669Struckman
77117669Struckmantypedef uint8_t SymbolPropertySet;
78117669Struckman/// Set of properties that provide additional info about a symbol.
7993336Sddenum class SymbolProperty : SymbolPropertySet {
80117669Struckman  Generic                       = 1 << 0,
81117669Struckman  TemplatePartialSpecialization = 1 << 1,
82117670Struckman  TemplateSpecialization        = 1 << 2,
83117669Struckman  UnitTest                      = 1 << 3,
84117669Struckman  IBAnnotated                   = 1 << 4,
85117669Struckman  IBOutletCollection            = 1 << 5,
8693336Sdd  GKInspectable                 = 1 << 6,
8793336Sdd  Local                         = 1 << 7,
8893336Sdd};
8993336Sddstatic const unsigned SymbolPropertyBitNum = 8;
9093336Sdd
9193336Sdd/// Set of roles that are attributed to symbol occurrences.
9293336Sddenum class SymbolRole : uint32_t {
9393336Sdd  Declaration = 1 << 0,
9493336Sdd  Definition  = 1 << 1,
9593336Sdd  Reference   = 1 << 2,
9693336Sdd  Read        = 1 << 3,
9793336Sdd  Write       = 1 << 4,
9893336Sdd  Call        = 1 << 5,
9993336Sdd  Dynamic     = 1 << 6,
10093336Sdd  AddressOf   = 1 << 7,
10197597Sru  Implicit    = 1 << 8,
10293336Sdd
10393336Sdd  // Relation roles.
10493336Sdd  RelationChildOf     = 1 << 9,
10593336Sdd  RelationBaseOf      = 1 << 10,
10693336Sdd  RelationOverrideOf  = 1 << 11,
10793336Sdd  RelationReceivedBy  = 1 << 12,
10893336Sdd  RelationCalledBy    = 1 << 13,
10993336Sdd  RelationExtendedBy  = 1 << 14,
11093336Sdd  RelationAccessorOf  = 1 << 15,
11193336Sdd  RelationContainedBy = 1 << 16,
11293336Sdd  RelationIBTypeOf    = 1 << 17,
113167387Sjhb  RelationSpecializationOf = 1 << 18,
11493336Sdd};
11593336Sddstatic const unsigned SymbolRoleBitNum = 19;
11693336Sddtypedef unsigned SymbolRoleSet;
11797597Sru
11893336Sdd/// Represents a relation to another symbol for a symbol occurrence.
11993336Sddstruct SymbolRelation {
12093336Sdd  SymbolRoleSet Roles;
12193336Sdd  const Decl *RelatedSymbol;
12293336Sdd
12393336Sdd  SymbolRelation(SymbolRoleSet Roles, const Decl *Sym)
12493336Sdd    : Roles(Roles), RelatedSymbol(Sym) {}
12593336Sdd};
12693336Sdd
12793336Sddstruct SymbolInfo {
128117669Struckman  SymbolKind Kind;
12993336Sdd  SymbolSubKind SubKind;
13093336Sdd  SymbolLanguage Lang;
13193336Sdd  SymbolPropertySet Properties;
13293336Sdd};
13393336Sdd
13493336SddSymbolInfo getSymbolInfo(const Decl *D);
13593336Sdd
13693336Sddbool isFunctionLocalSymbol(const Decl *D);
137117669Struckman
13893336Sddvoid applyForEachSymbolRole(SymbolRoleSet Roles,
13993336Sdd                            llvm::function_ref<void(SymbolRole)> Fn);
140117669Struckmanbool applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles,
141117669Struckman                            llvm::function_ref<bool(SymbolRole)> Fn);
142117669Struckmanvoid printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS);
14393336Sdd
144117669Struckman/// \returns true if no name was printed, false otherwise.
145117669Struckmanbool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS);
146117669Struckman
14793336SddStringRef getSymbolKindString(SymbolKind K);
14893336SddStringRef getSymbolSubKindString(SymbolSubKind K);
14993336SddStringRef getSymbolLanguageString(SymbolLanguage K);
150117669Struckman
151117669Struckmanvoid applyForEachSymbolProperty(SymbolPropertySet Props,
152117669Struckman                            llvm::function_ref<void(SymbolProperty)> Fn);
15393336Sddvoid printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS);
154117669Struckman
15593336Sdd} // namespace index
15693336Sdd} // namespace clang
157117669Struckman
15893336Sdd#endif
159117669Struckman