- //===- IndexSymbol.h - Types and functions for indexing symbols -*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_CLANG_INDEX_INDEXSYMBOL_H 
- #define LLVM_CLANG_INDEX_INDEXSYMBOL_H 
-   
- #include "clang/Basic/LLVM.h" 
- #include "clang/Lex/MacroInfo.h" 
- #include "llvm/ADT/STLExtras.h" 
- #include "llvm/Support/DataTypes.h" 
-   
- namespace clang { 
-   class Decl; 
-   class LangOptions; 
-   
- namespace index { 
-   
- enum class SymbolKind : uint8_t { 
-   Unknown, 
-   
-   Module, 
-   Namespace, 
-   NamespaceAlias, 
-   Macro, 
-   
-   Enum, 
-   Struct, 
-   Class, 
-   Protocol, 
-   Extension, 
-   Union, 
-   TypeAlias, 
-   
-   Function, 
-   Variable, 
-   Field, 
-   EnumConstant, 
-   
-   InstanceMethod, 
-   ClassMethod, 
-   StaticMethod, 
-   InstanceProperty, 
-   ClassProperty, 
-   StaticProperty, 
-   
-   Constructor, 
-   Destructor, 
-   ConversionFunction, 
-   
-   Parameter, 
-   Using, 
-   TemplateTypeParm, 
-   TemplateTemplateParm, 
-   NonTypeTemplateParm, 
-   
-   Concept, /// C++20 concept. 
- }; 
-   
- enum class SymbolLanguage : uint8_t { 
-   C, 
-   ObjC, 
-   CXX, 
-   Swift, 
- }; 
-   
- /// Language specific sub-kinds. 
- enum class SymbolSubKind : uint8_t { 
-   None, 
-   CXXCopyConstructor, 
-   CXXMoveConstructor, 
-   AccessorGetter, 
-   AccessorSetter, 
-   UsingTypename, 
-   UsingValue, 
-   UsingEnum, 
- }; 
-   
- typedef uint16_t SymbolPropertySet; 
- /// Set of properties that provide additional info about a symbol. 
- enum class SymbolProperty : SymbolPropertySet { 
-   Generic                       = 1 << 0, 
-   TemplatePartialSpecialization = 1 << 1, 
-   TemplateSpecialization        = 1 << 2, 
-   UnitTest                      = 1 << 3, 
-   IBAnnotated                   = 1 << 4, 
-   IBOutletCollection            = 1 << 5, 
-   GKInspectable                 = 1 << 6, 
-   Local                         = 1 << 7, 
-   /// Symbol is part of a protocol interface. 
-   ProtocolInterface             = 1 << 8, 
- }; 
- static const unsigned SymbolPropertyBitNum = 9; 
-   
- /// Set of roles that are attributed to symbol occurrences. 
- /// 
- /// Low 9 bits of clang-c/include/Index.h CXSymbolRole mirrors this enum. 
- enum class SymbolRole : uint32_t { 
-   Declaration = 1 << 0, 
-   Definition = 1 << 1, 
-   Reference = 1 << 2, 
-   Read = 1 << 3, 
-   Write = 1 << 4, 
-   Call = 1 << 5, 
-   Dynamic = 1 << 6, 
-   AddressOf = 1 << 7, 
-   Implicit = 1 << 8, 
-   // FIXME: this is not mirrored in CXSymbolRole. 
-   // Note that macro occurrences aren't currently supported in libclang. 
-   Undefinition = 1 << 9, // macro #undef 
-   
-   // Relation roles. 
-   RelationChildOf = 1 << 10, 
-   RelationBaseOf = 1 << 11, 
-   RelationOverrideOf = 1 << 12, 
-   RelationReceivedBy = 1 << 13, 
-   RelationCalledBy = 1 << 14, 
-   RelationExtendedBy = 1 << 15, 
-   RelationAccessorOf = 1 << 16, 
-   RelationContainedBy = 1 << 17, 
-   RelationIBTypeOf = 1 << 18, 
-   RelationSpecializationOf = 1 << 19, 
-   
-   // Symbol only references the name of the object as written. For example, a 
-   // constructor references the class declaration using that role. 
-   NameReference = 1 << 20, 
- }; 
- static const unsigned SymbolRoleBitNum = 21; 
- typedef unsigned SymbolRoleSet; 
-   
- /// Represents a relation to another symbol for a symbol occurrence. 
- struct SymbolRelation { 
-   SymbolRoleSet Roles; 
-   const Decl *RelatedSymbol; 
-   
-   SymbolRelation(SymbolRoleSet Roles, const Decl *Sym) 
-     : Roles(Roles), RelatedSymbol(Sym) {} 
- }; 
-   
- struct SymbolInfo { 
-   SymbolKind Kind; 
-   SymbolSubKind SubKind; 
-   SymbolLanguage Lang; 
-   SymbolPropertySet Properties; 
- }; 
-   
- SymbolInfo getSymbolInfo(const Decl *D); 
-   
- SymbolInfo getSymbolInfoForMacro(const MacroInfo &MI); 
-   
- bool isFunctionLocalSymbol(const Decl *D); 
-   
- void applyForEachSymbolRole(SymbolRoleSet Roles, 
-                             llvm::function_ref<void(SymbolRole)> Fn); 
- bool applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles, 
-                             llvm::function_ref<bool(SymbolRole)> Fn); 
- void printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS); 
-   
- /// \returns true if no name was printed, false otherwise. 
- bool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS); 
-   
- StringRef getSymbolKindString(SymbolKind K); 
- StringRef getSymbolSubKindString(SymbolSubKind K); 
- StringRef getSymbolLanguageString(SymbolLanguage K); 
-   
- void applyForEachSymbolProperty(SymbolPropertySet Props, 
-                             llvm::function_ref<void(SymbolProperty)> Fn); 
- void printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS); 
-   
- } // namespace index 
- } // namespace clang 
-   
- #endif 
-