Viewing file: Commit.h (5.21 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- Commit.h - A unit of edits -------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_EDIT_COMMIT_H #define LLVM_CLANG_EDIT_COMMIT_H
#include "clang/Basic/LLVM.h" #include "clang/Basic/SourceLocation.h" #include "clang/Edit/FileOffset.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Allocator.h"
namespace clang {
class LangOptions; class PPConditionalDirectiveRecord; class SourceManager;
namespace edit {
class EditedSource;
class Commit { public: enum EditKind { Act_Insert, Act_InsertFromRange, Act_Remove };
struct Edit { EditKind Kind; StringRef Text; SourceLocation OrigLoc; FileOffset Offset; FileOffset InsertFromRangeOffs; unsigned Length; bool BeforePrev;
SourceLocation getFileLocation(SourceManager &SM) const; CharSourceRange getFileRange(SourceManager &SM) const; CharSourceRange getInsertFromRange(SourceManager &SM) const; };
private: const SourceManager &SourceMgr; const LangOptions &LangOpts; const PPConditionalDirectiveRecord *PPRec; EditedSource *Editor = nullptr;
bool IsCommitable = true; SmallVector<Edit, 8> CachedEdits;
llvm::BumpPtrAllocator StrAlloc;
public: explicit Commit(EditedSource &Editor); Commit(const SourceManager &SM, const LangOptions &LangOpts, const PPConditionalDirectiveRecord *PPRec = nullptr) : SourceMgr(SM), LangOpts(LangOpts), PPRec(PPRec) {}
bool isCommitable() const { return IsCommitable; }
bool insert(SourceLocation loc, StringRef text, bool afterToken = false, bool beforePreviousInsertions = false);
bool insertAfterToken(SourceLocation loc, StringRef text, bool beforePreviousInsertions = false) { return insert(loc, text, /*afterToken=*/true, beforePreviousInsertions); }
bool insertBefore(SourceLocation loc, StringRef text) { return insert(loc, text, /*afterToken=*/false, /*beforePreviousInsertions=*/true); }
bool insertFromRange(SourceLocation loc, CharSourceRange range, bool afterToken = false, bool beforePreviousInsertions = false); bool insertWrap(StringRef before, CharSourceRange range, StringRef after);
bool remove(CharSourceRange range);
bool replace(CharSourceRange range, StringRef text); bool replaceWithInner(CharSourceRange range, CharSourceRange innerRange); bool replaceText(SourceLocation loc, StringRef text, StringRef replacementText);
bool insertFromRange(SourceLocation loc, SourceRange TokenRange, bool afterToken = false, bool beforePreviousInsertions = false) { return insertFromRange(loc, CharSourceRange::getTokenRange(TokenRange), afterToken, beforePreviousInsertions); }
bool insertWrap(StringRef before, SourceRange TokenRange, StringRef after) { return insertWrap(before, CharSourceRange::getTokenRange(TokenRange), after); }
bool remove(SourceRange TokenRange) { return remove(CharSourceRange::getTokenRange(TokenRange)); }
bool replace(SourceRange TokenRange, StringRef text) { return replace(CharSourceRange::getTokenRange(TokenRange), text); }
bool replaceWithInner(SourceRange TokenRange, SourceRange TokenInnerRange) { return replaceWithInner(CharSourceRange::getTokenRange(TokenRange), CharSourceRange::getTokenRange(TokenInnerRange)); }
using edit_iterator = SmallVectorImpl<Edit>::const_iterator;
edit_iterator edit_begin() const { return CachedEdits.begin(); } edit_iterator edit_end() const { return CachedEdits.end(); }
private: void addInsert(SourceLocation OrigLoc, FileOffset Offs, StringRef text, bool beforePreviousInsertions); void addInsertFromRange(SourceLocation OrigLoc, FileOffset Offs, FileOffset RangeOffs, unsigned RangeLen, bool beforePreviousInsertions); void addRemove(SourceLocation OrigLoc, FileOffset Offs, unsigned Len);
bool canInsert(SourceLocation loc, FileOffset &Offset); bool canInsertAfterToken(SourceLocation loc, FileOffset &Offset, SourceLocation &AfterLoc); bool canInsertInOffset(SourceLocation OrigLoc, FileOffset Offs); bool canRemoveRange(CharSourceRange range, FileOffset &Offs, unsigned &Len); bool canReplaceText(SourceLocation loc, StringRef text, FileOffset &Offs, unsigned &Len);
void commitInsert(FileOffset offset, StringRef text, bool beforePreviousInsertions); void commitRemove(FileOffset offset, unsigned length);
bool isAtStartOfMacroExpansion(SourceLocation loc, SourceLocation *MacroBegin = nullptr) const; bool isAtEndOfMacroExpansion(SourceLocation loc, SourceLocation *MacroEnd = nullptr) const; };
} // namespace edit
} // namespace clang
#endif // LLVM_CLANG_EDIT_COMMIT_H
|