diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/c-index-test/c-index-test.c | 7 | ||||
-rw-r--r-- | tools/libclang/CIndex.cpp | 36 | ||||
-rw-r--r-- | tools/libclang/CXCursor.cpp | 11 | ||||
-rw-r--r-- | tools/libclang/CXCursor.h | 8 | ||||
-rw-r--r-- | tools/libclang/libclang.darwin.exports | 1 | ||||
-rw-r--r-- | tools/libclang/libclang.exports | 1 |
6 files changed, 60 insertions, 4 deletions
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 32cada08ae..c95fb307a6 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -271,6 +271,13 @@ static void PrintCursor(CXCursor Cursor) { printf("]"); clang_disposeOverriddenCursors(overridden); } + + if (Cursor.kind == CXCursor_InclusionDirective) { + CXFile File = clang_getIncludedFile(Cursor); + CXString Included = clang_getFileName(File); + printf(" (%s)", clang_getCString(Included)); + clang_disposeString(Included); + } } } diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 722e2cb738..c944883fa4 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -555,6 +555,13 @@ bool CursorVisitor::VisitChildren(CXCursor Cursor) { continue; } + + if (InclusionDirective *ID = dyn_cast<InclusionDirective>(*E)) { + if (Visit(MakeInclusionDirectiveCursor(ID, CXXUnit))) + return true; + + continue; + } } } return false; @@ -2565,6 +2572,9 @@ CXString clang_getCursorSpelling(CXCursor C) { return createCXString(getCursorMacroDefinition(C)->getName() ->getNameStart()); + if (C.kind == CXCursor_InclusionDirective) + return createCXString(getCursorInclusionDirective(C)->getFileName()); + if (clang_isDeclaration(C.kind)) return getDeclSpelling(getCursorDecl(C)); @@ -2757,6 +2767,8 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return createCXString("macro definition"); case CXCursor_MacroInstantiation: return createCXString("macro instantiation"); + case CXCursor_InclusionDirective: + return createCXString("inclusion directive"); case CXCursor_Namespace: return createCXString("Namespace"); case CXCursor_LinkageSpec: @@ -2977,7 +2989,13 @@ CXSourceLocation clang_getCursorLocation(CXCursor C) { SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation(); return cxloc::translateSourceLocation(getCursorContext(C), L); } - + + if (C.kind == CXCursor_InclusionDirective) { + SourceLocation L + = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin(); + return cxloc::translateSourceLocation(getCursorContext(C), L); + } + if (C.kind < CXCursor_FirstDecl || C.kind > CXCursor_LastDecl) return clang_getNullLocation(); @@ -3043,12 +3061,14 @@ static SourceRange getRawCursorExtent(CXCursor C) { if (C.kind == CXCursor_MacroDefinition) return cxcursor::getCursorMacroDefinition(C)->getSourceRange(); - + + if (C.kind == CXCursor_InclusionDirective) + return cxcursor::getCursorInclusionDirective(C)->getSourceRange(); + if (C.kind >= CXCursor_FirstDecl && C.kind <= CXCursor_LastDecl) return getCursorDecl(C)->getSourceRange(); - return SourceRange(); -} + return SourceRange();} extern "C" { @@ -4149,6 +4169,14 @@ void clang_disposeOverriddenCursors(CXCursor *overridden) { delete [] overridden; } +CXFile clang_getIncludedFile(CXCursor cursor) { + if (cursor.kind != CXCursor_InclusionDirective) + return 0; + + InclusionDirective *ID = getCursorInclusionDirective(cursor); + return (void *)ID->getFile(); +} + } // end: extern "C" diff --git a/tools/libclang/CXCursor.cpp b/tools/libclang/CXCursor.cpp index 52594dcf6b..d506400407 100644 --- a/tools/libclang/CXCursor.cpp +++ b/tools/libclang/CXCursor.cpp @@ -363,6 +363,17 @@ MacroInstantiation *cxcursor::getCursorMacroInstantiation(CXCursor C) { return static_cast<MacroInstantiation *>(C.data[0]); } +CXCursor cxcursor::MakeInclusionDirectiveCursor(InclusionDirective *ID, + ASTUnit *TU) { + CXCursor C = { CXCursor_InclusionDirective, { ID, 0, TU } }; + return C; +} + +InclusionDirective *cxcursor::getCursorInclusionDirective(CXCursor C) { + assert(C.kind == CXCursor_InclusionDirective); + return static_cast<InclusionDirective *>(C.data[0]); +} + CXCursor cxcursor::MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc, ASTUnit *TU) { diff --git a/tools/libclang/CXCursor.h b/tools/libclang/CXCursor.h index 4a29dd0f1c..a31a322076 100644 --- a/tools/libclang/CXCursor.h +++ b/tools/libclang/CXCursor.h @@ -28,6 +28,7 @@ class CXXBaseSpecifier; class Decl; class Expr; class FieldDecl; +class InclusionDirective; class LabelStmt; class MacroDefinition; class MacroInstantiation; @@ -133,6 +134,13 @@ CXCursor MakeMacroInstantiationCursor(MacroInstantiation *, ASTUnit *TU); /// source range. MacroInstantiation *getCursorMacroInstantiation(CXCursor C); +/// \brief Create an inclusion directive cursor. +CXCursor MakeInclusionDirectiveCursor(InclusionDirective *, ASTUnit *TU); + +/// \brief Unpack a given inclusion directive cursor to retrieve its +/// source range. +InclusionDirective *getCursorInclusionDirective(CXCursor C); + /// \brief Create a label reference at the given location. CXCursor MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc, ASTUnit *TU); diff --git a/tools/libclang/libclang.darwin.exports b/tools/libclang/libclang.darwin.exports index dbb335f9aa..e9d40d0a75 100644 --- a/tools/libclang/libclang.darwin.exports +++ b/tools/libclang/libclang.darwin.exports @@ -68,6 +68,7 @@ _clang_getFile _clang_getFileName _clang_getFileTime _clang_getIBOutletCollectionType +_clang_getIncludedFile _clang_getInclusions _clang_getInstantiationLocation _clang_getLocation diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index 06e5a8bf51..9935a584b9 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -68,6 +68,7 @@ clang_getFile clang_getFileName clang_getFileTime clang_getIBOutletCollectionType +clang_getIncludedFile clang_getInclusions clang_getInstantiationLocation clang_getLocation |