Home | History | Annotate | Download | only in Index
      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 
    100   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