diff options
Diffstat (limited to 'tools/CIndex/CIndex.cpp')
-rw-r--r-- | tools/CIndex/CIndex.cpp | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index fee5b74b49..03519adc0a 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -1108,24 +1108,11 @@ CXSourceRange clang_getRange(CXSourceLocation begin, CXSourceLocation end) { return Result; } -void clang_getInstantiationLocation(CXSourceLocation location, - CXFile *file, - unsigned *line, - unsigned *column) { +static SourceLocation getAdjustedSourceLocation(CXSourceLocation location) { cxloc::CXSourceLocationPtr Ptr = cxloc::CXSourceLocationPtr::getFromOpaqueValue(location.ptr_data); SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); - if (!Ptr.getPointer() || Loc.isInvalid()) { - if (file) - *file = 0; - if (line) - *line = 0; - if (column) - *column = 0; - return; - } - // FIXME: This is largely copy-paste from ///TextDiagnosticPrinter::HighlightRange. When it is clear that this is // what we want the two routines should be refactored. @@ -1157,6 +1144,30 @@ void clang_getInstantiationLocation(CXSourceLocation location, InstLoc = InstLoc.getFileLocWithOffset(Length - 1); } + return InstLoc; +} + +void clang_getInstantiationLocation(CXSourceLocation location, + CXFile *file, + unsigned *line, + unsigned *column) { + cxloc::CXSourceLocationPtr Ptr + = cxloc::CXSourceLocationPtr::getFromOpaqueValue(location.ptr_data); + SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); + + if (!Ptr.getPointer() || Loc.isInvalid()) { + if (file) + *file = 0; + if (line) + *line = 0; + if (column) + *column = 0; + return; + } + + SourceLocation InstLoc = getAdjustedSourceLocation(location); + ASTContext &Context = *Ptr.getPointer(); + SourceManager &SM = Context.getSourceManager(); if (file) *file = (void *)SM.getFileEntryForID(SM.getFileID(InstLoc)); if (line) @@ -1165,6 +1176,23 @@ void clang_getInstantiationLocation(CXSourceLocation location, *column = SM.getInstantiationColumnNumber(InstLoc); } +void clang_getInstantiationLocationOffset(CXSourceLocation location, + CXFile *file, + unsigned *offset) { + cxloc::CXSourceLocationPtr Ptr + = cxloc::CXSourceLocationPtr::getFromOpaqueValue(location.ptr_data); + SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); + + ASTContext &Context = *Ptr.getPointer(); + SourceManager &SM = Context.getSourceManager(); + SourceLocation InstLoc = getAdjustedSourceLocation(location); + std::pair<FileID, unsigned> Decomposed = SM.getDecomposedLoc(InstLoc); + if (file) + *file = (void *)SM.getFileEntryForID(Decomposed.first); + if (offset) + *offset = Decomposed.second; +} + CXSourceLocation clang_getRangeStart(CXSourceRange range) { CXSourceLocation Result = { range.ptr_data, range.begin_int_data }; return Result; |