Introduce clang_getInstantiationLocationOffset(), which decomposes a

source location in file + offset.

llvm-svn: 94497
This commit is contained in:
Douglas Gregor 2010-01-26 03:07:15 +00:00
parent cd94410152
commit 47751d6c21
3 changed files with 61 additions and 14 deletions

View File

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

View File

@ -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<FileID, unsigned> 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;

View File

@ -27,6 +27,7 @@ _clang_getFile
_clang_getFileName
_clang_getFileTime
_clang_getInstantiationLocation
_clang_getInstantiationLocationOffset
_clang_getLocation
_clang_getNullCursor
_clang_getNullLocation