diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-12-02 06:49:09 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-12-02 06:49:09 +0000 |
commit | 2968442603b029949246467253eeac8139a5b6d8 (patch) | |
tree | ff548e890078ba6293daa74c947dcdf57c410798 /include/clang/Basic/SourceManager.h | |
parent | a46e4d91d8f3eb341f2387768db66dcfe8dd0afa (diff) |
Extend the source manager with the ability to override the contents of
files with the contents of an arbitrary memory buffer. Use this new
functionality to drastically clean up the way in which we handle file
truncation for code-completion: all of the truncation/completion logic
is now encapsulated in the preprocessor where it belongs
(<rdar://problem/7434737>).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90300 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Basic/SourceManager.h')
-rw-r--r-- | include/clang/Basic/SourceManager.h | 55 |
1 files changed, 23 insertions, 32 deletions
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index 6cf92e674b..3b170a6a74 100644 --- a/include/clang/Basic/SourceManager.h +++ b/include/clang/Basic/SourceManager.h @@ -54,9 +54,6 @@ namespace SrcMgr { /// file. This is owned by the ContentCache object. mutable const llvm::MemoryBuffer *Buffer; - /// The line and column at which we should truncate the file. - unsigned TruncateAtLine, TruncateAtColumn; - public: /// Reference to the file entry. This reference does not own /// the FileEntry object. It is possible for this to be NULL if @@ -93,28 +90,19 @@ namespace SrcMgr { Buffer = B; } - /// \brief Truncate this file at the given line and column. - /// - /// \param Line the line on which to truncate the current file (1-based). - /// \param Column the column at which to truncate the current file. - /// (1-based). - void truncateAt(unsigned Line, unsigned Column); - - /// \brief Determines whether the file was artificially truncated with - /// truncateAt(). - bool isTruncated() const { return TruncateAtLine && TruncateAtColumn; } - + /// \brief Replace the existing buffer (which will be deleted) + /// with the given buffer. + void replaceBuffer(const llvm::MemoryBuffer *B); + ContentCache(const FileEntry *Ent = 0) - : Buffer(0), TruncateAtLine(0), TruncateAtColumn(0), Entry(Ent), - SourceLineCache(0), NumLines(0) {} + : Buffer(0), Entry(Ent), SourceLineCache(0), NumLines(0) {} ~ContentCache(); /// The copy ctor does not allow copies where source object has either /// a non-NULL Buffer or SourceLineCache. Ownership of allocated memory /// is not transfered, so this is a logical error. - ContentCache(const ContentCache &RHS) - : Buffer(0), TruncateAtLine(0), TruncateAtColumn(0), SourceLineCache(0) { + ContentCache(const ContentCache &RHS) : Buffer(0), SourceLineCache(0) { Entry = RHS.Entry; assert (RHS.Buffer == 0 && RHS.SourceLineCache == 0 @@ -344,19 +332,13 @@ class SourceManager { mutable FileID LastRFIDForBeforeTUCheck; mutable bool LastResForBeforeTUCheck; - // Keep track of the file/line/column that we should truncate. - const FileEntry *TruncateFile; - unsigned TruncateAtLine; - unsigned TruncateAtColumn; - // SourceManager doesn't support copy construction. explicit SourceManager(const SourceManager&); void operator=(const SourceManager&); public: SourceManager() - : ExternalSLocEntries(0), LineTable(0), NumLinearScans(0), - NumBinaryProbes(0), TruncateFile(0), TruncateAtLine(0), - TruncateAtColumn(0) { + : ExternalSLocEntries(0), LineTable(0), NumLinearScans(0), + NumBinaryProbes(0) { clearIDTables(); } ~SourceManager(); @@ -425,6 +407,21 @@ public: unsigned PreallocatedID = 0, unsigned Offset = 0); + /// \brief Retrieve the memory buffer associated with the given file. + const llvm::MemoryBuffer *getMemoryBufferForFile(const FileEntry *File); + + /// \brief Override the contents of the given source file by providing an + /// already-allocated buffer. + /// + /// \param SourceFile the source file whose contents will be override. + /// + /// \param Buffer the memory buffer whose contents will be used as the + /// data in the given source file. + /// + /// \returns true if an error occurred, false otherwise. + bool overrideFileContents(const FileEntry *SourceFile, + const llvm::MemoryBuffer *Buffer); + //===--------------------------------------------------------------------===// // FileID manipulation methods. //===--------------------------------------------------------------------===// @@ -668,12 +665,6 @@ public: /// \returns true if LHS source location comes before RHS, false otherwise. bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const; - /// \brief Truncate the given file at the specified line/column. - void truncateFileAt(const FileEntry *Entry, unsigned Line, unsigned Column); - - /// \brief Determine whether this file was truncated. - bool isTruncatedFile(FileID FID) const; - // Iterators over FileInfos. typedef llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*> ::const_iterator fileinfo_iterator; |