[libclang] Introduce clang_getPresumedLocation which works like clang_getExpansionLocation

but takes into account #line directives coming from preprocessed files.

Patch by Vinay Sajip!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139647 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Argyrios Kyrtzidis 2011-09-13 21:49:08 +00:00
Родитель 144b38a799
Коммит e6be34d8f7
4 изменённых файлов: 73 добавлений и 0 удалений

Просмотреть файл

@ -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.

Просмотреть файл

@ -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<const SourceManager*>(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,

Просмотреть файл

@ -102,6 +102,7 @@ _clang_getNumOverloadedDecls
_clang_getOverloadedDecl
_clang_getOverriddenCursors
_clang_getPointeeType
_clang_getPresumedLocation
_clang_getRange
_clang_getRangeEnd
_clang_getRangeStart

Просмотреть файл

@ -102,6 +102,7 @@ clang_getNumOverloadedDecls
clang_getOverloadedDecl
clang_getOverriddenCursors
clang_getPointeeType
clang_getPresumedLocation
clang_getRange
clang_getRangeEnd
clang_getRangeStart