303 lines
11 KiB
C
303 lines
11 KiB
C
|
//===- CXCursor.h - Routines for manipulating CXCursors -------------------===//
|
||
|
//
|
||
|
// The LLVM Compiler Infrastructure
|
||
|
//
|
||
|
// This file is distributed under the University of Illinois Open Source
|
||
|
// License. See LICENSE.TXT for details.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
//
|
||
|
// This file defines routines for manipulating CXCursors.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#ifndef LLVM_CLANG_CXCURSOR_H
|
||
|
#define LLVM_CLANG_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 MacroDefinition;
|
||
|
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 = 0);
|
||
|
|
||
|
/// \brief Create an Objective-C superclass reference at the given location.
|
||
|
CXCursor MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super,
|
||
|
SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief 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);
|
||
|
|
||
|
/// \brief Create an Objective-C protocol reference at the given location.
|
||
|
CXCursor MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto,
|
||
|
SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief 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);
|
||
|
|
||
|
/// \brief Create an Objective-C class reference at the given location.
|
||
|
CXCursor MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class,
|
||
|
SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief 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);
|
||
|
|
||
|
/// \brief Create a type reference at the given location.
|
||
|
CXCursor MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief 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);
|
||
|
|
||
|
/// \brief Create a reference to a template at the given location.
|
||
|
CXCursor MakeCursorTemplateRef(const TemplateDecl *Template, SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Unpack a TemplateRef cursor into the template it references and
|
||
|
/// the location where the reference occurred.
|
||
|
std::pair<const TemplateDecl *, SourceLocation>
|
||
|
getCursorTemplateRef(CXCursor C);
|
||
|
|
||
|
/// \brief Create a reference to a namespace or namespace alias at the given
|
||
|
/// location.
|
||
|
CXCursor MakeCursorNamespaceRef(const NamedDecl *NS, SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief 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);
|
||
|
|
||
|
/// \brief Create a reference to a variable at the given location.
|
||
|
CXCursor MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief 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);
|
||
|
|
||
|
/// \brief Create a reference to a field at the given location.
|
||
|
CXCursor MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Unpack a MemberRef cursor into the field it references and the
|
||
|
/// location where the reference occurred.
|
||
|
std::pair<const FieldDecl *, SourceLocation> getCursorMemberRef(CXCursor C);
|
||
|
|
||
|
/// \brief Create a CXX base specifier cursor.
|
||
|
CXCursor MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Unpack a CXXBaseSpecifier cursor into a CXXBaseSpecifier.
|
||
|
const CXXBaseSpecifier *getCursorCXXBaseSpecifier(CXCursor C);
|
||
|
|
||
|
/// \brief Create a preprocessing directive cursor.
|
||
|
CXCursor MakePreprocessingDirectiveCursor(SourceRange Range,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Unpack a given preprocessing directive to retrieve its source range.
|
||
|
SourceRange getCursorPreprocessingDirective(CXCursor C);
|
||
|
|
||
|
/// \brief Create a macro definition cursor.
|
||
|
CXCursor MakeMacroDefinitionCursor(const MacroDefinition *,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Unpack a given macro definition cursor to retrieve its
|
||
|
/// source range.
|
||
|
const MacroDefinition *getCursorMacroDefinition(CXCursor C);
|
||
|
|
||
|
/// \brief Create a macro expansion cursor.
|
||
|
CXCursor MakeMacroExpansionCursor(MacroExpansion *,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Create a "pseudo" macro expansion cursor, using a macro definition
|
||
|
/// and a source location.
|
||
|
CXCursor MakeMacroExpansionCursor(MacroDefinition *, SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief 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] != 0;
|
||
|
}
|
||
|
const MacroDefinition *getAsMacroDefinition() const {
|
||
|
assert(isPseudo());
|
||
|
return static_cast<const MacroDefinition *>(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 MacroDefinition *getDefinition() const;
|
||
|
SourceRange getSourceRange() const;
|
||
|
};
|
||
|
|
||
|
/// \brief Unpack a given macro expansion cursor to retrieve its info.
|
||
|
static inline MacroExpansionCursor getCursorMacroExpansion(CXCursor C) {
|
||
|
return C;
|
||
|
}
|
||
|
|
||
|
/// \brief Create an inclusion directive cursor.
|
||
|
CXCursor MakeInclusionDirectiveCursor(InclusionDirective *,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Unpack a given inclusion directive cursor to retrieve its
|
||
|
/// source range.
|
||
|
const InclusionDirective *getCursorInclusionDirective(CXCursor C);
|
||
|
|
||
|
/// \brief Create a label reference at the given location.
|
||
|
CXCursor MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief 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);
|
||
|
|
||
|
/// \brief Create a overloaded declaration reference cursor for an expression.
|
||
|
CXCursor MakeCursorOverloadedDeclRef(const OverloadExpr *E,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Create a overloaded declaration reference cursor for a declaration.
|
||
|
CXCursor MakeCursorOverloadedDeclRef(const Decl *D, SourceLocation Location,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Create a overloaded declaration reference cursor for a template name.
|
||
|
CXCursor MakeCursorOverloadedDeclRef(TemplateName Template,
|
||
|
SourceLocation Location,
|
||
|
CXTranslationUnit TU);
|
||
|
|
||
|
/// \brief Internal storage for an overloaded declaration reference cursor;
|
||
|
typedef llvm::PointerUnion3<const OverloadExpr *, const Decl *,
|
||
|
OverloadedTemplateStorage *>
|
||
|
OverloadedDeclRefStorage;
|
||
|
|
||
|
/// \brief 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);
|
||
|
const Decl *getCursorParentDecl(CXCursor Cursor);
|
||
|
|
||
|
ASTContext &getCursorContext(CXCursor Cursor);
|
||
|
ASTUnit *getCursorASTUnit(CXCursor Cursor);
|
||
|
CXTranslationUnit getCursorTU(CXCursor Cursor);
|
||
|
|
||
|
void getOverriddenCursors(CXCursor cursor,
|
||
|
SmallVectorImpl<CXCursor> &overridden);
|
||
|
|
||
|
/// \brief Create an opaque pool used for fast generation of overriden
|
||
|
/// CXCursor arrays.
|
||
|
void *createOverridenCXCursorsPool();
|
||
|
|
||
|
/// \brief Dispose of the overriden CXCursors pool.
|
||
|
void disposeOverridenCXCursorsPool(void *pool);
|
||
|
|
||
|
/// \brief 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);
|
||
|
|
||
|
/// \brief 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);
|
||
|
}
|
||
|
|
||
|
/// \brief Return true if the cursor represents a declaration that is the
|
||
|
/// first in a declaration group.
|
||
|
bool isFirstInDeclGroup(CXCursor C);
|
||
|
|
||
|
}} // end namespace: clang::cxcursor
|
||
|
|
||
|
#endif
|