diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index f54bd08883..07bcf9eec6 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -363,6 +363,49 @@ CINDEX_LINKAGE void clang_getExpansionLocation(CXSourceLocation location, unsigned *column, unsigned *offset); +/** + * \brief Retrieve the file, line, column, and offset represented by + * the given source location, as specified in a # line directive. + * + * Example: given the following source code in a file somefile.c + * + * #123 "dummy.c" 1 + * + * static int func(void) + * { + * return 0; + * } + * + * the location information returned by this function would be + * + * File: dummy.c Line: 124 Column: 12 + * + * whereas clang_getExpansionLocation would have returned + * + * File: somefile.c Line: 3 Column: 12 + * + * \param location the location within a source file that will be decomposed + * into its parts. + * + * \param filename [out] if non-NULL, will be set to the filename of the + * source location. Note that filenames returned will be for "virtual" files, + * which don't necessarily exist on the machine running clang - e.g. when + * parsing preprocessed output obtained from a different environment. If + * a non-NULL value is passed in, remember to dispose of the returned value + * using \c clang_disposeString() once you've finished with it. For an invalid + * source location, an empty string is returned. + * + * \param line [out] if non-NULL, will be set to the line number of the + * source location. For an invalid source location, zero is returned. + * + * \param column [out] if non-NULL, will be set to the column number of the + * source location. For an invalid source location, zero is returned. + */ +CINDEX_LINKAGE void clang_getPresumedLocation(CXSourceLocation location, + CXString *filename, + unsigned *line, + unsigned *column); + /** * \brief Legacy API to retrieve the file, line, column, and offset represented * by the given source location. diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 2f8db5dfce..51749d7849 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -2861,6 +2861,34 @@ void clang_getExpansionLocation(CXSourceLocation location, *offset = SM.getDecomposedLoc(ExpansionLoc).second; } +void clang_getPresumedLocation(CXSourceLocation location, + CXString *filename, + unsigned *line, + unsigned *column) { + SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); + + if (!location.ptr_data[0] || Loc.isInvalid()) { + if (filename) + *filename = createCXString(""); + if (line) + *line = 0; + if (column) + *column = 0; + } + else { + const SourceManager &SM = + *static_cast(location.ptr_data[0]); + PresumedLoc PreLoc = SM.getPresumedLoc(Loc); + + if (filename) + *filename = createCXString(PreLoc.getFilename()); + if (line) + *line = PreLoc.getLine(); + if (column) + *column = PreLoc.getColumn(); + } +} + void clang_getInstantiationLocation(CXSourceLocation location, CXFile *file, unsigned *line, diff --git a/tools/libclang/libclang.darwin.exports b/tools/libclang/libclang.darwin.exports index a858f624c8..21ef35b457 100644 --- a/tools/libclang/libclang.darwin.exports +++ b/tools/libclang/libclang.darwin.exports @@ -102,6 +102,7 @@ _clang_getNumOverloadedDecls _clang_getOverloadedDecl _clang_getOverriddenCursors _clang_getPointeeType +_clang_getPresumedLocation _clang_getRange _clang_getRangeEnd _clang_getRangeStart diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index 85e9f02695..ea7aaf00c8 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -102,6 +102,7 @@ clang_getNumOverloadedDecls clang_getOverloadedDecl clang_getOverriddenCursors clang_getPointeeType +clang_getPresumedLocation clang_getRange clang_getRangeEnd clang_getRangeStart