#pragma once #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #endif //===- 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 Fn); bool applyForEachSymbolRoleInterruptible(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 #ifdef __GNUC__ #pragma GCC diagnostic pop #endif