23
23
#include " llvm/Support/Path.h"
24
24
#include " llvm/Support/raw_ostream.h"
25
25
#include " llvm/Support/system_error.h"
26
- #include < algorithm>
27
26
28
27
using namespace clang ;
29
28
using namespace clang ::tooling;
30
29
31
- void HeaderOverride::recordReplacements (
32
- llvm::StringRef TransformID, const clang::tooling::Replacements &Replaces) {
33
- TransformReplacements TR;
34
- TR.TransformID = TransformID;
35
- TR.GeneratedReplacements .resize (Replaces.size ());
36
- std::copy (Replaces.begin (), Replaces.end (), TR.GeneratedReplacements .begin ());
37
- TransformReplacementsDoc.Replacements .push_back (TR);
38
- }
39
-
40
30
SourceOverrides::SourceOverrides (llvm::StringRef MainFileName,
41
31
bool TrackChanges)
42
32
: MainFileName(MainFileName), TrackChanges(TrackChanges) {}
43
33
44
- void SourceOverrides::applyReplacements (tooling::Replacements &Replaces,
45
- llvm::StringRef TransformName ) {
34
+ void
35
+ SourceOverrides::applyReplacements (clang::tooling::Replacements &Replaces ) {
46
36
llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts (
47
37
new DiagnosticOptions ());
48
38
DiagnosticsEngine Diagnostics (
49
39
llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs ()),
50
40
DiagOpts.getPtr ());
51
41
FileManager Files ((FileSystemOptions ()));
52
42
SourceManager SM (Diagnostics, Files);
53
- applyReplacements (Replaces, SM, TransformName );
43
+ applyReplacements (Replaces, SM);
54
44
}
55
45
56
- void SourceOverrides::applyReplacements (tooling::Replacements &Replaces,
57
- SourceManager &SM,
58
- llvm::StringRef TransformName) {
46
+ void SourceOverrides::applyReplacements (clang::tooling::Replacements &Replaces,
47
+ clang::SourceManager &SM) {
59
48
applyOverrides (SM);
60
49
61
50
Rewriter Rewrites (SM, LangOptions ());
@@ -67,6 +56,12 @@ void SourceOverrides::applyReplacements(tooling::Replacements &Replaces,
67
56
if (!Success)
68
57
llvm::errs () << " error: failed to apply some replacements." ;
69
58
59
+ applyRewrites (Rewrites);
60
+ if (TrackChanges)
61
+ adjustChangedRanges (Replaces);
62
+ }
63
+
64
+ void SourceOverrides::applyRewrites (Rewriter &Rewrites) {
70
65
std::string ResultBuf;
71
66
72
67
for (Rewriter::buffer_iterator I = Rewrites.buffer_begin (),
@@ -94,50 +89,36 @@ void SourceOverrides::applyReplacements(tooling::Replacements &Replaces,
94
89
// will be stored as well for later output to disk. Applying replacements
95
90
// in memory will always be necessary as the source goes down the transform
96
91
// pipeline.
92
+
97
93
HeaderOverride &HeaderOv = Headers[FileName];
94
+ HeaderOv.FileOverride .swap (ResultBuf);
98
95
// "Create" HeaderOverride if not already existing
99
- if (HeaderOv.getFileName ().empty ())
100
- HeaderOv = HeaderOverride (FileName);
101
-
102
- HeaderOv.swapContentOverride (ResultBuf);
96
+ if (HeaderOv.FileName .empty ())
97
+ HeaderOv.FileName = FileName;
103
98
}
99
+ }
104
100
105
- // Separate replacements to header files
101
+ void SourceOverrides::adjustChangedRanges (const Replacements &Replaces) {
102
+ // Start by grouping replacements by file name
106
103
Replacements MainFileReplaces;
107
- ReplacementsMap HeadersReplaces;
108
- for (Replacements::const_iterator I = Replaces.begin (), E = Replaces.end ();
109
- I != E; ++I) {
104
+ llvm::StringMap<Replacements> HeadersReplaces;
105
+
106
+ for (Replacements::iterator I = Replaces.begin (), E = Replaces.end (); I != E;
107
+ ++I) {
110
108
llvm::StringRef ReplacementFileName = I->getFilePath ();
111
109
112
- if (ReplacementFileName == MainFileName) {
110
+ if (ReplacementFileName == MainFileName)
113
111
MainFileReplaces.insert (*I);
114
- continue ;
115
- }
116
-
117
- HeadersReplaces[ReplacementFileName].insert (*I);
112
+ else
113
+ HeadersReplaces[ReplacementFileName].insert (*I);
118
114
}
119
115
120
- // Record all replacements to headers.
121
- for (ReplacementsMap::const_iterator I = HeadersReplaces.begin (),
122
- E = HeadersReplaces.end ();
123
- I != E; ++I) {
124
- HeaderOverride &HeaderOv = Headers[I->getKey ()];
125
- HeaderOv.recordReplacements (TransformName, I->getValue ());
126
- }
127
-
128
- if (TrackChanges)
129
- adjustChangedRanges (MainFileReplaces, HeadersReplaces);
130
- }
131
-
132
- void
133
- SourceOverrides::adjustChangedRanges (const Replacements &MainFileReplaces,
134
- const ReplacementsMap &HeadersReplaces) {
135
- // Adjust the changed ranges for each individual file
136
- MainFileChanges.adjustChangedRanges (MainFileReplaces);
137
- for (ReplacementsMap::const_iterator I = HeadersReplaces.begin (),
138
- E = HeadersReplaces.end ();
116
+ // Then adjust the changed ranges for each individual file
117
+ MainFileChanges.adjustChangedRanges (Replaces);
118
+ for (llvm::StringMap<Replacements>::iterator I = HeadersReplaces.begin (),
119
+ E = HeadersReplaces.end ();
139
120
I != E; ++I) {
140
- Headers[I->getKey ()].adjustChangedRanges (I->getValue ());
121
+ Headers[I->getKey ()].Changes . adjustChangedRanges (I->getValue ());
141
122
}
142
123
}
143
124
@@ -150,11 +131,11 @@ void SourceOverrides::applyOverrides(SourceManager &SM) const {
150
131
151
132
for (HeaderOverrides::const_iterator I = Headers.begin (), E = Headers.end ();
152
133
I != E; ++I) {
153
- assert (!I->second .getContentOverride () .empty () &&
134
+ assert (!I->second .FileOverride .empty () &&
154
135
" Header override should not be empty!" );
155
136
SM.overrideFileContents (
156
- FM.getFile (I->second .getFileName () ),
157
- llvm::MemoryBuffer::getMemBuffer (I->second .getContentOverride () ));
137
+ FM.getFile (I->second .FileName ),
138
+ llvm::MemoryBuffer::getMemBuffer (I->second .FileOverride ));
158
139
}
159
140
}
160
141
0 commit comments