diff options
Diffstat (limited to 'tools/libclang/CXCursor.h')
-rw-r--r-- | tools/libclang/CXCursor.h | 100 |
1 files changed, 73 insertions, 27 deletions
diff --git a/tools/libclang/CXCursor.h b/tools/libclang/CXCursor.h index 120b881..957d519 100644 --- a/tools/libclang/CXCursor.h +++ b/tools/libclang/CXCursor.h @@ -42,17 +42,18 @@ class TemplateDecl; class TemplateName; class TypeDecl; class VarDecl; +class IdentifierInfo; namespace cxcursor { CXCursor getCursor(CXTranslationUnit, SourceLocation); -CXCursor MakeCXCursor(const clang::Attr *A, clang::Decl *Parent, +CXCursor MakeCXCursor(const clang::Attr *A, const clang::Decl *Parent, CXTranslationUnit TU); -CXCursor MakeCXCursor(clang::Decl *D, CXTranslationUnit TU, +CXCursor MakeCXCursor(const clang::Decl *D, CXTranslationUnit TU, SourceRange RegionOfInterest = SourceRange(), bool FirstInDeclGroup = true); -CXCursor MakeCXCursor(clang::Stmt *S, clang::Decl *Parent, +CXCursor MakeCXCursor(const clang::Stmt *S, const clang::Decl *Parent, CXTranslationUnit TU, SourceRange RegionOfInterest = SourceRange()); CXCursor MakeCXCursorInvalid(CXCursorKind K, CXTranslationUnit TU = 0); @@ -64,7 +65,7 @@ CXCursor MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super, /// \brief Unpack an ObjCSuperClassRef cursor into the interface it references /// and optionally the location where the reference occurred. -std::pair<ObjCInterfaceDecl *, SourceLocation> +std::pair<const ObjCInterfaceDecl *, SourceLocation> getCursorObjCSuperClassRef(CXCursor C); /// \brief Create an Objective-C protocol reference at the given location. @@ -74,7 +75,7 @@ CXCursor MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto, /// \brief Unpack an ObjCProtocolRef cursor into the protocol it references /// and optionally the location where the reference occurred. -std::pair<ObjCProtocolDecl *, SourceLocation> +std::pair<const ObjCProtocolDecl *, SourceLocation> getCursorObjCProtocolRef(CXCursor C); /// \brief Create an Objective-C class reference at the given location. @@ -84,7 +85,7 @@ CXCursor MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class, /// \brief Unpack an ObjCClassRef cursor into the class it references /// and optionally the location where the reference occurred. -std::pair<ObjCInterfaceDecl *, SourceLocation> +std::pair<const ObjCInterfaceDecl *, SourceLocation> getCursorObjCClassRef(CXCursor C); /// \brief Create a type reference at the given location. @@ -93,7 +94,7 @@ CXCursor MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc, /// \brief Unpack a TypeRef cursor into the class it references /// and optionally the location where the reference occurred. -std::pair<TypeDecl *, SourceLocation> getCursorTypeRef(CXCursor C); +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, @@ -101,7 +102,8 @@ CXCursor MakeCursorTemplateRef(const TemplateDecl *Template, SourceLocation Loc, /// \brief Unpack a TemplateRef cursor into the template it references and /// the location where the reference occurred. -std::pair<TemplateDecl *, SourceLocation> getCursorTemplateRef(CXCursor C); +std::pair<const TemplateDecl *, SourceLocation> + getCursorTemplateRef(CXCursor C); /// \brief Create a reference to a namespace or namespace alias at the given /// location. @@ -110,7 +112,7 @@ CXCursor MakeCursorNamespaceRef(const NamedDecl *NS, SourceLocation Loc, /// \brief Unpack a NamespaceRef cursor into the namespace or namespace alias /// it references and the location where the reference occurred. -std::pair<NamedDecl *, SourceLocation> getCursorNamespaceRef(CXCursor C); +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, @@ -118,7 +120,7 @@ CXCursor MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc, /// \brief Unpack a VariableRef cursor into the variable it references and the /// location where the where the reference occurred. -std::pair<VarDecl *, SourceLocation> getCursorVariableRef(CXCursor C); +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, @@ -126,14 +128,14 @@ CXCursor MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc, /// \brief Unpack a MemberRef cursor into the field it references and the /// location where the reference occurred. -std::pair<FieldDecl *, SourceLocation> getCursorMemberRef(CXCursor C); +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. -CXXBaseSpecifier *getCursorCXXBaseSpecifier(CXCursor C); +const CXXBaseSpecifier *getCursorCXXBaseSpecifier(CXCursor C); /// \brief Create a preprocessing directive cursor. CXCursor MakePreprocessingDirectiveCursor(SourceRange Range, @@ -143,19 +145,62 @@ CXCursor MakePreprocessingDirectiveCursor(SourceRange Range, SourceRange getCursorPreprocessingDirective(CXCursor C); /// \brief Create a macro definition cursor. -CXCursor MakeMacroDefinitionCursor(MacroDefinition *, CXTranslationUnit TU); +CXCursor MakeMacroDefinitionCursor(const MacroDefinition *, + CXTranslationUnit TU); /// \brief Unpack a given macro definition cursor to retrieve its /// source range. -MacroDefinition *getCursorMacroDefinition(CXCursor C); +const MacroDefinition *getCursorMacroDefinition(CXCursor C); /// \brief Create a macro expansion cursor. CXCursor MakeMacroExpansionCursor(MacroExpansion *, CXTranslationUnit TU); -/// \brief Unpack a given macro expansion cursor to retrieve its -/// source range. -MacroExpansion *getCursorMacroExpansion(CXCursor C); +/// \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 *, @@ -163,7 +208,7 @@ CXCursor MakeInclusionDirectiveCursor(InclusionDirective *, /// \brief Unpack a given inclusion directive cursor to retrieve its /// source range. -InclusionDirective *getCursorInclusionDirective(CXCursor C); +const InclusionDirective *getCursorInclusionDirective(CXCursor C); /// \brief Create a label reference at the given location. CXCursor MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc, @@ -171,13 +216,14 @@ CXCursor MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc, /// \brief Unpack a label reference into the label statement it refers to and /// the location of the reference. -std::pair<LabelStmt *, SourceLocation> getCursorLabelRef(CXCursor C); +std::pair<const LabelStmt *, SourceLocation> getCursorLabelRef(CXCursor C); /// \brief Create a overloaded declaration reference cursor for an expression. -CXCursor MakeCursorOverloadedDeclRef(OverloadExpr *E, CXTranslationUnit TU); +CXCursor MakeCursorOverloadedDeclRef(const OverloadExpr *E, + CXTranslationUnit TU); /// \brief Create a overloaded declaration reference cursor for a declaration. -CXCursor MakeCursorOverloadedDeclRef(Decl *D, SourceLocation Location, +CXCursor MakeCursorOverloadedDeclRef(const Decl *D, SourceLocation Location, CXTranslationUnit TU); /// \brief Create a overloaded declaration reference cursor for a template name. @@ -186,7 +232,7 @@ CXCursor MakeCursorOverloadedDeclRef(TemplateName Template, CXTranslationUnit TU); /// \brief Internal storage for an overloaded declaration reference cursor; -typedef llvm::PointerUnion3<OverloadExpr *, Decl *, +typedef llvm::PointerUnion3<const OverloadExpr *, const Decl *, OverloadedTemplateStorage *> OverloadedDeclRefStorage; @@ -195,11 +241,11 @@ typedef llvm::PointerUnion3<OverloadExpr *, Decl *, std::pair<OverloadedDeclRefStorage, SourceLocation> getCursorOverloadedDeclRef(CXCursor C); -Decl *getCursorDecl(CXCursor Cursor); -Expr *getCursorExpr(CXCursor Cursor); -Stmt *getCursorStmt(CXCursor Cursor); -Attr *getCursorAttr(CXCursor Cursor); -Decl *getCursorParentDecl(CXCursor Cursor); +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); |