//===--- IndexSymbol.h - Types and functions for indexing symbols ---------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_INDEX_INDEXSYMBOL_H #define LLVM_CLANG_INDEX_INDEXSYMBOL_H #include "clang/Basic/LLVM.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, }; enum class SymbolLanguage { C, ObjC, CXX, }; /// Language specific sub-kinds. enum class SymbolSubKind { None, CXXCopyConstructor, CXXMoveConstructor, }; /// Set of properties that provide additional info about a symbol. enum class SymbolProperty : uint8_t { Generic = 1 << 0, TemplatePartialSpecialization = 1 << 1, TemplateSpecialization = 1 << 2, UnitTest = 1 << 3, IBAnnotated = 1 << 4, IBOutletCollection = 1 << 5, GKInspectable = 1 << 6, }; static const unsigned SymbolPropertyBitNum = 7; typedef unsigned SymbolPropertySet; /// Set of roles that are attributed to symbol occurrences. enum class SymbolRole : uint16_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, // Relation roles. RelationChildOf = 1 << 9, RelationBaseOf = 1 << 10, RelationOverrideOf = 1 << 11, RelationReceivedBy = 1 << 12, RelationCalledBy = 1 << 13, RelationExtendedBy = 1 << 14, RelationAccessorOf = 1 << 15, }; static const unsigned SymbolRoleBitNum = 16; 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; SymbolPropertySet Properties; SymbolLanguage Lang; }; SymbolInfo getSymbolInfo(const Decl *D); void applyForEachSymbolRole(SymbolRoleSet Roles, llvm::function_ref 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 Fn); void printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS); } // namespace index } // namespace clang #endif