From: Chris Lattner Date: Fri, 12 Oct 2007 20:24:19 +0000 (+0000) Subject: add a new SM::getDecomposedFileLoc method. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3457e8cbaa8a6fec5d69173450655fe0bc38634b;p=clang add a new SM::getDecomposedFileLoc method. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42931 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index 901010b947..ba731589d6 100644 --- a/include/clang/Basic/SourceManager.h +++ b/include/clang/Basic/SourceManager.h @@ -275,6 +275,24 @@ public: return FileIDs[FileID-1].getInfo()->first; } + /// getDecomposedFileLoc - Decompose the specified file location into a raw + /// FileID + Offset pair. The first element is the FileID, the second is the + /// offset from the start of the buffer of the location. + std::pair getDecomposedFileLoc(SourceLocation Loc) const { + assert(Loc.isFileID() && "Isn't a File SourceLocation"); + + // TODO: Add a flag "is first chunk" to SLOC. + const SrcMgr::FileIDInfo *FIDInfo = getFIDInfo(Loc.getFileID()); + + // If this file has been split up into chunks, factor in the chunk number + // that the FileID references. + unsigned ChunkNo = FIDInfo->getChunkNo(); + unsigned Offset = Loc.getRawFilePos(); + Offset += (ChunkNo << SourceLocation::FilePosBits); + + return std::pair(Loc.getFileID()-ChunkNo, Offset); + } + /// PrintStats - Print statistics to stderr. /// void PrintStats() const; @@ -319,13 +337,7 @@ private: /// returns the location of the physical character data, not the logical file /// position. unsigned getFullFilePos(SourceLocation PhysLoc) const { - // TODO: Add a flag "is first chunk" to SLOC. - const SrcMgr::FileIDInfo *FIDInfo = getFIDInfo(PhysLoc.getFileID()); - - // If this file has been split up into chunks, factor in the chunk number - // that the FileID references. - unsigned ChunkNo = FIDInfo->getChunkNo(); - return PhysLoc.getRawFilePos() + (ChunkNo << SourceLocation::FilePosBits); + return getDecomposedFileLoc(PhysLoc).second; } };