123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- //===- CXCursor.h - Routines for manipulating CXCursors -------------------===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines routines for manipulating CXCursors.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_TOOLS_LIBCLANG_CXCURSOR_H
- #define LLVM_CLANG_TOOLS_LIBCLANG_CXCURSOR_H
- #include "clang-c/Index.h"
- #include "clang/Basic/SourceLocation.h"
- #include "llvm/ADT/PointerUnion.h"
- #include <utility>
- namespace clang {
- class ASTContext;
- class ASTUnit;
- class Attr;
- class CXXBaseSpecifier;
- class Decl;
- class Expr;
- class FieldDecl;
- class InclusionDirective;
- class LabelStmt;
- class MacroDefinitionRecord;
- class MacroExpansion;
- class NamedDecl;
- class ObjCInterfaceDecl;
- class ObjCProtocolDecl;
- class OverloadedTemplateStorage;
- class OverloadExpr;
- class Stmt;
- class TemplateDecl;
- class TemplateName;
- class TypeDecl;
- class VarDecl;
- class IdentifierInfo;
- namespace cxcursor {
- CXCursor getCursor(CXTranslationUnit, SourceLocation);
- CXCursor MakeCXCursor(const clang::Attr *A, const clang::Decl *Parent,
- CXTranslationUnit TU);
- CXCursor MakeCXCursor(const clang::Decl *D, CXTranslationUnit TU,
- SourceRange RegionOfInterest = SourceRange(),
- bool FirstInDeclGroup = true);
- CXCursor MakeCXCursor(const clang::Stmt *S, const clang::Decl *Parent,
- CXTranslationUnit TU,
- SourceRange RegionOfInterest = SourceRange());
- CXCursor MakeCXCursorInvalid(CXCursorKind K, CXTranslationUnit TU = nullptr);
- /// Create an Objective-C superclass reference at the given location.
- CXCursor MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super,
- SourceLocation Loc, CXTranslationUnit TU);
- /// Unpack an ObjCSuperClassRef cursor into the interface it references
- /// and optionally the location where the reference occurred.
- std::pair<const ObjCInterfaceDecl *, SourceLocation>
- getCursorObjCSuperClassRef(CXCursor C);
- /// Create an Objective-C protocol reference at the given location.
- CXCursor MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto,
- SourceLocation Loc, CXTranslationUnit TU);
- /// Unpack an ObjCProtocolRef cursor into the protocol it references
- /// and optionally the location where the reference occurred.
- std::pair<const ObjCProtocolDecl *, SourceLocation>
- getCursorObjCProtocolRef(CXCursor C);
- /// Create an Objective-C class reference at the given location.
- CXCursor MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class,
- SourceLocation Loc, CXTranslationUnit TU);
- /// Unpack an ObjCClassRef cursor into the class it references
- /// and optionally the location where the reference occurred.
- std::pair<const ObjCInterfaceDecl *, SourceLocation>
- getCursorObjCClassRef(CXCursor C);
- /// Create a type reference at the given location.
- CXCursor MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc,
- CXTranslationUnit TU);
- /// Unpack a TypeRef cursor into the class it references
- /// and optionally the location where the reference occurred.
- std::pair<const TypeDecl *, SourceLocation> getCursorTypeRef(CXCursor C);
- /// Create a reference to a template at the given location.
- CXCursor MakeCursorTemplateRef(const TemplateDecl *Template, SourceLocation Loc,
- CXTranslationUnit TU);
- /// Unpack a TemplateRef cursor into the template it references and
- /// the location where the reference occurred.
- std::pair<const TemplateDecl *, SourceLocation>
- getCursorTemplateRef(CXCursor C);
- /// Create a reference to a namespace or namespace alias at the given
- /// location.
- CXCursor MakeCursorNamespaceRef(const NamedDecl *NS, SourceLocation Loc,
- CXTranslationUnit TU);
- /// Unpack a NamespaceRef cursor into the namespace or namespace alias
- /// it references and the location where the reference occurred.
- std::pair<const NamedDecl *, SourceLocation> getCursorNamespaceRef(CXCursor C);
- /// Create a reference to a variable at the given location.
- CXCursor MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc,
- CXTranslationUnit TU);
- /// Unpack a VariableRef cursor into the variable it references and the
- /// location where the where the reference occurred.
- std::pair<const VarDecl *, SourceLocation> getCursorVariableRef(CXCursor C);
- /// Create a reference to a field at the given location.
- CXCursor MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc,
- CXTranslationUnit TU);
- /// Unpack a MemberRef cursor into the field it references and the
- /// location where the reference occurred.
- std::pair<const FieldDecl *, SourceLocation> getCursorMemberRef(CXCursor C);
- /// Create a CXX base specifier cursor.
- CXCursor MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B,
- CXTranslationUnit TU);
- /// Unpack a CXXBaseSpecifier cursor into a CXXBaseSpecifier.
- const CXXBaseSpecifier *getCursorCXXBaseSpecifier(CXCursor C);
- /// Create a preprocessing directive cursor.
- CXCursor MakePreprocessingDirectiveCursor(SourceRange Range,
- CXTranslationUnit TU);
- /// Unpack a given preprocessing directive to retrieve its source range.
- SourceRange getCursorPreprocessingDirective(CXCursor C);
- /// Create a macro definition cursor.
- CXCursor MakeMacroDefinitionCursor(const MacroDefinitionRecord *,
- CXTranslationUnit TU);
- /// Unpack a given macro definition cursor to retrieve its
- /// source range.
- const MacroDefinitionRecord *getCursorMacroDefinition(CXCursor C);
- /// Create a macro expansion cursor.
- CXCursor MakeMacroExpansionCursor(MacroExpansion *, CXTranslationUnit TU);
- /// Create a "pseudo" macro expansion cursor, using a macro definition
- /// and a source location.
- CXCursor MakeMacroExpansionCursor(MacroDefinitionRecord *, SourceLocation Loc,
- CXTranslationUnit TU);
- /// Wraps a macro expansion cursor and provides a common interface
- /// for a normal macro expansion cursor or a "pseudo" one.
- ///
- /// "Pseudo" macro expansion cursors (essentially a macro definition along with
- /// a source location) are created in special cases, for example they can be
- /// created for identifiers inside macro definitions, if these identifiers are
- /// macro names.
- class MacroExpansionCursor {
- CXCursor C;
- bool isPseudo() const { return C.data[1] != nullptr; }
- const MacroDefinitionRecord *getAsMacroDefinition() const {
- assert(isPseudo());
- return static_cast<const MacroDefinitionRecord *>(C.data[0]);
- }
- const MacroExpansion *getAsMacroExpansion() const {
- assert(!isPseudo());
- return static_cast<const MacroExpansion *>(C.data[0]);
- }
- SourceLocation getPseudoLoc() const {
- assert(isPseudo());
- return SourceLocation::getFromPtrEncoding(C.data[1]);
- }
- public:
- MacroExpansionCursor(CXCursor C) : C(C) {
- assert(C.kind == CXCursor_MacroExpansion);
- }
- const IdentifierInfo *getName() const;
- const MacroDefinitionRecord *getDefinition() const;
- SourceRange getSourceRange() const;
- };
- /// Unpack a given macro expansion cursor to retrieve its info.
- static inline MacroExpansionCursor getCursorMacroExpansion(CXCursor C) {
- return C;
- }
- /// Create an inclusion directive cursor.
- CXCursor MakeInclusionDirectiveCursor(InclusionDirective *,
- CXTranslationUnit TU);
- /// Unpack a given inclusion directive cursor to retrieve its
- /// source range.
- const InclusionDirective *getCursorInclusionDirective(CXCursor C);
- /// Create a label reference at the given location.
- CXCursor MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc,
- CXTranslationUnit TU);
- /// Unpack a label reference into the label statement it refers to and
- /// the location of the reference.
- std::pair<const LabelStmt *, SourceLocation> getCursorLabelRef(CXCursor C);
- /// Create a overloaded declaration reference cursor for an expression.
- CXCursor MakeCursorOverloadedDeclRef(const OverloadExpr *E,
- CXTranslationUnit TU);
- /// Create a overloaded declaration reference cursor for a declaration.
- CXCursor MakeCursorOverloadedDeclRef(const Decl *D, SourceLocation Location,
- CXTranslationUnit TU);
- /// Create a overloaded declaration reference cursor for a template name.
- CXCursor MakeCursorOverloadedDeclRef(TemplateName Template,
- SourceLocation Location,
- CXTranslationUnit TU);
- /// Internal storage for an overloaded declaration reference cursor;
- typedef llvm::PointerUnion<const OverloadExpr *, const Decl *,
- OverloadedTemplateStorage *>
- OverloadedDeclRefStorage;
- /// Unpack an overloaded declaration reference into an expression,
- /// declaration, or template name along with the source location.
- std::pair<OverloadedDeclRefStorage, SourceLocation>
- getCursorOverloadedDeclRef(CXCursor C);
- const Decl *getCursorDecl(CXCursor Cursor);
- const Expr *getCursorExpr(CXCursor Cursor);
- const Stmt *getCursorStmt(CXCursor Cursor);
- const Attr *getCursorAttr(CXCursor Cursor);
- ASTContext &getCursorContext(CXCursor Cursor);
- ASTUnit *getCursorASTUnit(CXCursor Cursor);
- CXTranslationUnit getCursorTU(CXCursor Cursor);
- void getOverriddenCursors(CXCursor cursor,
- SmallVectorImpl<CXCursor> &overridden);
- /// Create an opaque pool used for fast generation of overridden
- /// CXCursor arrays.
- void *createOverridenCXCursorsPool();
- /// Dispose of the overridden CXCursors pool.
- void disposeOverridenCXCursorsPool(void *pool);
- /// Returns a index/location pair for a selector identifier if the cursor
- /// points to one.
- std::pair<int, SourceLocation> getSelectorIdentifierIndexAndLoc(CXCursor);
- static inline int getSelectorIdentifierIndex(CXCursor cursor) {
- return getSelectorIdentifierIndexAndLoc(cursor).first;
- }
- static inline SourceLocation getSelectorIdentifierLoc(CXCursor cursor) {
- return getSelectorIdentifierIndexAndLoc(cursor).second;
- }
- CXCursor getSelectorIdentifierCursor(int SelIdx, CXCursor cursor);
- static inline CXCursor getTypeRefedCallExprCursor(CXCursor cursor) {
- CXCursor newCursor = cursor;
- if (cursor.kind == CXCursor_CallExpr)
- newCursor.xdata = 1;
- return newCursor;
- }
- CXCursor getTypeRefCursor(CXCursor cursor);
- /// Generate a USR for \arg D and put it in \arg Buf.
- /// \returns true if no USR was computed or the result should be ignored,
- /// false otherwise.
- bool getDeclCursorUSR(const Decl *D, SmallVectorImpl<char> &Buf);
- bool operator==(CXCursor X, CXCursor Y);
- inline bool operator!=(CXCursor X, CXCursor Y) { return !(X == Y); }
- /// Return true if the cursor represents a declaration that is the
- /// first in a declaration group.
- bool isFirstInDeclGroup(CXCursor C);
- } // namespace cxcursor
- } // namespace clang
- #endif
|