mirror of
https://github.com/intel/llvm.git
synced 2026-01-31 16:29:50 +08:00
Introduce SourceManager::getLocation() to get a source location out of a "file:line:column" triplet.
llvm-svn: 73823
This commit is contained in:
@@ -68,7 +68,12 @@ namespace SrcMgr {
|
||||
/// NumLines - The number of lines in this ContentCache. This is only valid
|
||||
/// if SourceLineCache is non-null.
|
||||
unsigned NumLines;
|
||||
|
||||
|
||||
/// FirstFID - First FileID that was created for this ContentCache.
|
||||
/// Represents the first source inclusion of the file associated with this
|
||||
/// ContentCache.
|
||||
mutable FileID FirstFID;
|
||||
|
||||
/// getBuffer - Returns the memory buffer for the associated content.
|
||||
const llvm::MemoryBuffer *getBuffer() const;
|
||||
|
||||
@@ -624,6 +629,13 @@ public:
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Other miscellaneous methods.
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
||||
/// \brief Get the source location for the given file:line:col triplet.
|
||||
///
|
||||
/// If the source file is included multiple times, the source location will
|
||||
/// be based upon the first inclusion.
|
||||
SourceLocation getLocation(const FileEntry *SourceFile,
|
||||
unsigned Line, unsigned Col) const;
|
||||
|
||||
// Iterators over FileInfos.
|
||||
typedef llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*>
|
||||
|
||||
@@ -358,7 +358,10 @@ FileID SourceManager::createFileID(const ContentCache *File,
|
||||
SLocEntryTable[PreallocatedID]
|
||||
= SLocEntry::get(Offset, FileInfo::get(IncludePos, File, FileCharacter));
|
||||
SLocEntryLoaded[PreallocatedID] = true;
|
||||
return LastFileIDLookup = FileID::get(PreallocatedID);
|
||||
FileID FID = FileID::get(PreallocatedID);
|
||||
if (File->FirstFID.isInvalid())
|
||||
File->FirstFID = FID;
|
||||
return LastFileIDLookup = FID;
|
||||
}
|
||||
|
||||
SLocEntryTable.push_back(SLocEntry::get(NextOffset,
|
||||
@@ -914,6 +917,43 @@ PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc) const {
|
||||
// Other miscellaneous methods.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// \brief Get the source location for the given file:line:col triplet.
|
||||
///
|
||||
/// If the source file is included multiple times, the source location will
|
||||
/// be based upon the first inclusion.
|
||||
SourceLocation SourceManager::getLocation(const FileEntry *SourceFile,
|
||||
unsigned Line, unsigned Col) const {
|
||||
assert(SourceFile && "Null source file!");
|
||||
assert(Line && Col && "Line and column should start from 1!");
|
||||
|
||||
fileinfo_iterator FI = FileInfos.find(SourceFile);
|
||||
if (FI == FileInfos.end())
|
||||
return SourceLocation();
|
||||
ContentCache *Content = FI->second;
|
||||
|
||||
// If this is the first use of line information for this buffer, compute the
|
||||
/// SourceLineCache for it on demand.
|
||||
if (Content->SourceLineCache == 0)
|
||||
ComputeLineNumbers(Content, ContentCacheAlloc);
|
||||
|
||||
if (Line > Content->NumLines)
|
||||
return SourceLocation();
|
||||
|
||||
unsigned FilePos = Content->SourceLineCache[Line - 1];
|
||||
const char *BufStart = Content->getBuffer()->getBufferStart();
|
||||
const char *BufEnd = Content->getBuffer()->getBufferEnd();
|
||||
const char *p = BufStart;
|
||||
|
||||
// Check that the given column is valid.
|
||||
while (p < BufEnd && *p != '\n' && *p != '\r')
|
||||
++p;
|
||||
if (Col > p-BufStart)
|
||||
return SourceLocation();
|
||||
|
||||
return getLocForStartOfFile(Content->FirstFID).
|
||||
getFileLocWithOffset(FilePos + Col - 1);
|
||||
}
|
||||
|
||||
|
||||
/// PrintStats - Print statistics to stderr.
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user