From: Douglas Gregor Date: Tue, 26 Jan 2010 03:07:15 +0000 (+0000) Subject: Introduce clang_getInstantiationLocationOffset(), which decomposes a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e69517ce61638f12c9abe4605753a45275ac4e37;p=clang Introduce clang_getInstantiationLocationOffset(), which decomposes a source location in file + offset. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94497 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index b38e517851..ab7e55bcb6 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -372,6 +372,24 @@ CINDEX_LINKAGE void clang_getInstantiationLocation(CXSourceLocation location, unsigned *line, unsigned *column); +/** + * \brief Retrieve the file and offset within that file represented by + * the given source location. + * + * \param location the location within a source file that will be decomposed + * into its parts. + * + * \param file [out] if non-NULL, will be set to the file to which the + * given source location points. + * + * \param offset [out] if non-NULL, will be set to the offset into the + * \p file to which the given source location points. + */ +CINDEX_LINKAGE void clang_getInstantiationLocationOffset( + CXSourceLocation location, + CXFile *File, + unsigned *Offset); + /** * \brief Retrieve a source location representing the first character within a * source range. 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 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; diff --git a/tools/CIndex/CIndex.exports b/tools/CIndex/CIndex.exports index d349086b9c..b2ec58e5b9 100644 --- a/tools/CIndex/CIndex.exports +++ b/tools/CIndex/CIndex.exports @@ -27,6 +27,7 @@ _clang_getFile _clang_getFileName _clang_getFileTime _clang_getInstantiationLocation +_clang_getInstantiationLocationOffset _clang_getLocation _clang_getNullCursor _clang_getNullLocation