зеркало из https://github.com/microsoft/clang.git
[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:
Родитель
144b38a799
Коммит
e6be34d8f7
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче