]> granicus.if.org Git - clang/commitdiff
add a new SM::getDecomposedFileLoc method.
authorChris Lattner <sabre@nondot.org>
Fri, 12 Oct 2007 20:24:19 +0000 (20:24 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 12 Oct 2007 20:24:19 +0000 (20:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42931 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/SourceManager.h

index 901010b9470c9e4f00867ae6e36a40ab4d690038..ba731589d63c1a95416685a546c04676f33552af 100644 (file)
@@ -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;
   }
 };