diff options
author | Chris Lattner <sabre@nondot.org> | 2007-10-12 20:24:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-10-12 20:24:19 +0000 |
commit | 3457e8cbaa8a6fec5d69173450655fe0bc38634b (patch) | |
tree | bfc375ff292e0ef658f4bcbd3739119b555282ed /include/clang/Basic/SourceManager.h | |
parent | 3fe44e44828d473ae4c7b1366e10bf4503f7d64f (diff) |
add a new SM::getDecomposedFileLoc method.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42931 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Basic/SourceManager.h')
-rw-r--r-- | include/clang/Basic/SourceManager.h | 26 |
1 files changed, 19 insertions, 7 deletions
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<unsigned, unsigned> 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<unsigned,unsigned>(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; } }; |