diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index b041dcfd673b..3a0260d86c8b 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -352,8 +352,8 @@ CINDEX_LINKAGE CXSourceRange clang_getRange(CXSourceLocation begin, CXSourceLocation end); /** - * \brief Retrieve the file, line, and column represented by the given source - * location. + * \brief Retrieve the file, line, column, and offset represented by + * the given source location. * * \param location the location within a source file that will be decomposed * into its parts. @@ -366,29 +366,15 @@ CINDEX_LINKAGE CXSourceRange clang_getRange(CXSourceLocation begin, * * \param column [out] if non-NULL, will be set to the column to which the given * source location points. + * + * \param offset [out] if non-NULL, will be set to the offset into the + * buffer to which the given source location points. */ CINDEX_LINKAGE void clang_getInstantiationLocation(CXSourceLocation location, CXFile *file, 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); + unsigned *column, + unsigned *offset); /** * \brief Retrieve a source location representing the first character within a diff --git a/clang/tools/CIndex/CIndex.cpp b/clang/tools/CIndex/CIndex.cpp index 3a5977970a4e..10099ef0aa90 100644 --- a/clang/tools/CIndex/CIndex.cpp +++ b/clang/tools/CIndex/CIndex.cpp @@ -1123,11 +1123,27 @@ CXSourceRange clang_getRange(CXSourceLocation begin, CXSourceLocation end) { return Result; } -static SourceLocation getAdjustedSourceLocation(CXSourceLocation location) { +void clang_getInstantiationLocation(CXSourceLocation location, + CXFile *file, + unsigned *line, + unsigned *column, + unsigned *offset) { 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; + if (offset) + *offset = 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. @@ -1159,53 +1175,14 @@ static SourceLocation getAdjustedSourceLocation(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) *line = SM.getInstantiationLineNumber(InstLoc); if (column) *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; + *offset = SM.getDecomposedLoc(InstLoc).second; } CXSourceLocation clang_getRangeStart(CXSourceRange range) { diff --git a/clang/tools/CIndex/CIndex.exports b/clang/tools/CIndex/CIndex.exports index fa141fc41cc1..ef77fede5360 100644 --- a/clang/tools/CIndex/CIndex.exports +++ b/clang/tools/CIndex/CIndex.exports @@ -29,7 +29,6 @@ _clang_getFile _clang_getFileName _clang_getFileTime _clang_getInstantiationLocation -_clang_getInstantiationLocationOffset _clang_getLocation _clang_getNullCursor _clang_getNullLocation diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 243b8736f4fb..7250cc72577e 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -151,7 +151,7 @@ static void PrintCursor(CXCursor Cursor) { Referenced = clang_getCursorReferenced(Cursor); if (!clang_equalCursors(Referenced, clang_getNullCursor())) { CXSourceLocation Loc = clang_getCursorLocation(Referenced); - clang_getInstantiationLocation(Loc, 0, &line, &column); + clang_getInstantiationLocation(Loc, 0, &line, &column, 0); printf(":%d:%d", line, column); } @@ -164,7 +164,7 @@ static const char* GetCursorSource(CXCursor Cursor) { CXSourceLocation Loc = clang_getCursorLocation(Cursor); const char *source; CXFile file; - clang_getInstantiationLocation(Loc, &file, 0, 0); + clang_getInstantiationLocation(Loc, &file, 0, 0, 0); source = clang_getFileName(file); if (!source) return ""; @@ -189,9 +189,9 @@ static void PrintCursorExtent(CXCursor C) { unsigned begin_line, begin_column, end_line, end_column; clang_getInstantiationLocation(clang_getRangeStart(extent), - &begin_file, &begin_line, &begin_column); + &begin_file, &begin_line, &begin_column, 0); clang_getInstantiationLocation(clang_getRangeEnd(extent), - &end_file, &end_line, &end_column); + &end_file, &end_line, &end_column, 0); if (!begin_file || !end_file) return; @@ -213,7 +213,7 @@ enum CXChildVisitResult FilteredPrintingVisitor(CXCursor Cursor, if (!Data->Filter || (Cursor.kind == *(enum CXCursorKind *)Data->Filter)) { CXSourceLocation Loc = clang_getCursorLocation(Cursor); unsigned line, column; - clang_getInstantiationLocation(Loc, 0, &line, &column); + clang_getInstantiationLocation(Loc, 0, &line, &column, 0); printf("// %s: %s:%d:%d: ", FileCheckPrefix, GetCursorSource(Cursor), line, column); PrintCursor(Cursor); @@ -257,7 +257,7 @@ static enum CXChildVisitResult FunctionScanVisitor(CXCursor Cursor, curColumn++; Loc = clang_getCursorLocation(Cursor); - clang_getInstantiationLocation(Loc, &file, 0, 0); + clang_getInstantiationLocation(Loc, &file, 0, 0, 0); source = clang_getFileName(file); if (source) { CXSourceLocation RefLoc @@ -807,9 +807,9 @@ int perform_token_annotation(int argc, const char **argv) { case CXToken_Comment: kind = "Comment"; break; } clang_getInstantiationLocation(clang_getRangeStart(extent), - 0, &start_line, &start_column); + 0, &start_line, &start_column, 0); clang_getInstantiationLocation(clang_getRangeEnd(extent), - 0, &end_line, &end_column); + 0, &end_line, &end_column, 0); printf("%s: \"%s\" [%d:%d - %d:%d]", kind, clang_getCString(spelling), start_line, start_column, end_line, end_column); if (!clang_isInvalid(cursors[i].kind)) {