/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/include/clang/Edit/Commit.h
Line | Count | Source |
1 | | //===- Commit.h - A unit of edits -------------------------------*- C++ -*-===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | |
9 | | #ifndef LLVM_CLANG_EDIT_COMMIT_H |
10 | | #define LLVM_CLANG_EDIT_COMMIT_H |
11 | | |
12 | | #include "clang/Basic/LLVM.h" |
13 | | #include "clang/Basic/SourceLocation.h" |
14 | | #include "clang/Edit/FileOffset.h" |
15 | | #include "llvm/ADT/SmallVector.h" |
16 | | #include "llvm/ADT/StringRef.h" |
17 | | #include "llvm/Support/Allocator.h" |
18 | | |
19 | | namespace clang { |
20 | | |
21 | | class LangOptions; |
22 | | class PPConditionalDirectiveRecord; |
23 | | class SourceManager; |
24 | | |
25 | | namespace edit { |
26 | | |
27 | | class EditedSource; |
28 | | |
29 | | class Commit { |
30 | | public: |
31 | | enum EditKind { |
32 | | Act_Insert, |
33 | | Act_InsertFromRange, |
34 | | Act_Remove |
35 | | }; |
36 | | |
37 | | struct Edit { |
38 | | EditKind Kind; |
39 | | StringRef Text; |
40 | | SourceLocation OrigLoc; |
41 | | FileOffset Offset; |
42 | | FileOffset InsertFromRangeOffs; |
43 | | unsigned Length; |
44 | | bool BeforePrev; |
45 | | |
46 | | SourceLocation getFileLocation(SourceManager &SM) const; |
47 | | CharSourceRange getFileRange(SourceManager &SM) const; |
48 | | CharSourceRange getInsertFromRange(SourceManager &SM) const; |
49 | | }; |
50 | | |
51 | | private: |
52 | | const SourceManager &SourceMgr; |
53 | | const LangOptions &LangOpts; |
54 | | const PPConditionalDirectiveRecord *PPRec; |
55 | | EditedSource *Editor = nullptr; |
56 | | |
57 | | bool IsCommitable = true; |
58 | | SmallVector<Edit, 8> CachedEdits; |
59 | | |
60 | | llvm::BumpPtrAllocator StrAlloc; |
61 | | |
62 | | public: |
63 | | explicit Commit(EditedSource &Editor); |
64 | | Commit(const SourceManager &SM, const LangOptions &LangOpts, |
65 | | const PPConditionalDirectiveRecord *PPRec = nullptr) |
66 | 14.9k | : SourceMgr(SM), LangOpts(LangOpts), PPRec(PPRec) {} |
67 | | |
68 | 6.34k | bool isCommitable() const { return IsCommitable; } |
69 | | |
70 | | bool insert(SourceLocation loc, StringRef text, bool afterToken = false, |
71 | | bool beforePreviousInsertions = false); |
72 | | |
73 | | bool insertAfterToken(SourceLocation loc, StringRef text, |
74 | 114 | bool beforePreviousInsertions = false) { |
75 | 114 | return insert(loc, text, /*afterToken=*/true, beforePreviousInsertions); |
76 | 114 | } |
77 | | |
78 | 69 | bool insertBefore(SourceLocation loc, StringRef text) { |
79 | 69 | return insert(loc, text, /*afterToken=*/false, |
80 | 69 | /*beforePreviousInsertions=*/true); |
81 | 69 | } |
82 | | |
83 | | bool insertFromRange(SourceLocation loc, CharSourceRange range, |
84 | | bool afterToken = false, |
85 | | bool beforePreviousInsertions = false); |
86 | | bool insertWrap(StringRef before, CharSourceRange range, StringRef after); |
87 | | |
88 | | bool remove(CharSourceRange range); |
89 | | |
90 | | bool replace(CharSourceRange range, StringRef text); |
91 | | bool replaceWithInner(CharSourceRange range, CharSourceRange innerRange); |
92 | | bool replaceText(SourceLocation loc, StringRef text, |
93 | | StringRef replacementText); |
94 | | |
95 | | bool insertFromRange(SourceLocation loc, SourceRange TokenRange, |
96 | | bool afterToken = false, |
97 | 49 | bool beforePreviousInsertions = false) { |
98 | 49 | return insertFromRange(loc, CharSourceRange::getTokenRange(TokenRange), |
99 | 49 | afterToken, beforePreviousInsertions); |
100 | 49 | } |
101 | | |
102 | 56 | bool insertWrap(StringRef before, SourceRange TokenRange, StringRef after) { |
103 | 56 | return insertWrap(before, CharSourceRange::getTokenRange(TokenRange), after); |
104 | 56 | } |
105 | | |
106 | 166 | bool remove(SourceRange TokenRange) { |
107 | 166 | return remove(CharSourceRange::getTokenRange(TokenRange)); |
108 | 166 | } |
109 | | |
110 | 238 | bool replace(SourceRange TokenRange, StringRef text) { |
111 | 238 | return replace(CharSourceRange::getTokenRange(TokenRange), text); |
112 | 238 | } |
113 | | |
114 | 121 | bool replaceWithInner(SourceRange TokenRange, SourceRange TokenInnerRange) { |
115 | 121 | return replaceWithInner(CharSourceRange::getTokenRange(TokenRange), |
116 | 121 | CharSourceRange::getTokenRange(TokenInnerRange)); |
117 | 121 | } |
118 | | |
119 | | using edit_iterator = SmallVectorImpl<Edit>::const_iterator; |
120 | | |
121 | 5.49k | edit_iterator edit_begin() const { return CachedEdits.begin(); } |
122 | 5.49k | edit_iterator edit_end() const { return CachedEdits.end(); } |
123 | | |
124 | | private: |
125 | | void addInsert(SourceLocation OrigLoc, |
126 | | FileOffset Offs, StringRef text, bool beforePreviousInsertions); |
127 | | void addInsertFromRange(SourceLocation OrigLoc, FileOffset Offs, |
128 | | FileOffset RangeOffs, unsigned RangeLen, |
129 | | bool beforePreviousInsertions); |
130 | | void addRemove(SourceLocation OrigLoc, FileOffset Offs, unsigned Len); |
131 | | |
132 | | bool canInsert(SourceLocation loc, FileOffset &Offset); |
133 | | bool canInsertAfterToken(SourceLocation loc, FileOffset &Offset, |
134 | | SourceLocation &AfterLoc); |
135 | | bool canInsertInOffset(SourceLocation OrigLoc, FileOffset Offs); |
136 | | bool canRemoveRange(CharSourceRange range, FileOffset &Offs, unsigned &Len); |
137 | | bool canReplaceText(SourceLocation loc, StringRef text, |
138 | | FileOffset &Offs, unsigned &Len); |
139 | | |
140 | | void commitInsert(FileOffset offset, StringRef text, |
141 | | bool beforePreviousInsertions); |
142 | | void commitRemove(FileOffset offset, unsigned length); |
143 | | |
144 | | bool isAtStartOfMacroExpansion(SourceLocation loc, |
145 | | SourceLocation *MacroBegin = nullptr) const; |
146 | | bool isAtEndOfMacroExpansion(SourceLocation loc, |
147 | | SourceLocation *MacroEnd = nullptr) const; |
148 | | }; |
149 | | |
150 | | } // namespace edit |
151 | | |
152 | | } // namespace clang |
153 | | |
154 | | #endif // LLVM_CLANG_EDIT_COMMIT_H |