NormalizedAtomicChange {
22NormalizedAtomicChange() =
default;
24NormalizedAtomicChange(
constllvm::yaml::IO &) {}
28NormalizedAtomicChange(
constllvm::yaml::IO &,
30: Key(
E.getKey()), FilePath(
E.getFilePath()),
Error(
E.getError()),
31InsertedHeaders(
E.getInsertedHeaders()),
32RemovedHeaders(
E.getRemovedHeaders()),
33Replaces(
E.getReplacements().begin(),
E.getReplacements().end()) {}
37llvm_unreachable(
"Do not convert YAML to AtomicChange directly with '>>'. " 38 "Use AtomicChange::convertFromYAML instead.");
43std::vector<std::string> InsertedHeaders;
44std::vector<std::string> RemovedHeaders;
45std::vector<clang::tooling::Replacement> Replaces;
54template<>
structMappingTraits<NormalizedAtomicChange> {
55 static void mapping(IO &Io, NormalizedAtomicChange &Doc) {
56Io.mapRequired(
"Key", Doc.Key);
57Io.mapRequired(
"FilePath", Doc.FilePath);
58Io.mapRequired(
"Error", Doc.Error);
59Io.mapRequired(
"InsertedHeaders", Doc.InsertedHeaders);
60Io.mapRequired(
"RemovedHeaders", Doc.RemovedHeaders);
61Io.mapRequired(
"Replacements", Doc.Replaces);
67template<>
structMappingTraits<
clang::tooling::AtomicChange> {
69MappingNormalization<NormalizedAtomicChange, clang::tooling::AtomicChange>
71Io.mapRequired(
"Key", Keys->Key);
72Io.mapRequired(
"FilePath", Keys->FilePath);
73Io.mapRequired(
"Error", Keys->Error);
74Io.mapRequired(
"InsertedHeaders", Keys->InsertedHeaders);
75Io.mapRequired(
"RemovedHeaders", Keys->RemovedHeaders);
76Io.mapRequired(
"Replacements", Keys->Replaces);
89boolviolatesColumnLimit(llvm::StringRef Code,
unsignedColumnLimit,
90 unsignedStart,
unsignedEnd) {
91 autoStartPos = Code.rfind(
'\n', Start);
92StartPos = (StartPos == llvm::StringRef::npos) ? 0 : StartPos + 1;
94 autoEndPos = Code.find(
"\n", End);
95 if(EndPos == llvm::StringRef::npos)
99Code.substr(StartPos, EndPos - StartPos).split(Lines,
'\n');
100 for(llvm::StringRef
Line: Lines)
101 if(
Line.size() > ColumnLimit)
107getRangesForFormatting(llvm::StringRef Code,
unsignedColumnLimit,
113std::vector<clang::tooling::Range> Ranges;
119 intStart = R.getOffset() + Offset;
120 intEnd = Start + R.getReplacementText().size();
121 if(!R.getReplacementText().empty() &&
122R.getReplacementText().back() ==
'\n'&& R.getLength() == 0 &&
123R.getOffset() > 0 && R.getOffset() <= Code.size() &&
124Code[R.getOffset() - 1] ==
'\n')
128Offset += R.getReplacementText().size() - R.getLength();
131violatesColumnLimit(Code, ColumnLimit, Start, End))
132Ranges.emplace_back(Start, End - Start);
138 returnllvm::make_error<llvm::StringError>(Message,
139llvm::inconvertibleErrorCode());
144createReplacementsForHeaders(llvm::StringRef FilePath, llvm::StringRef Code,
146 constformat::FormatStyle &Style) {
149Replacements HeaderReplacements;
150 for(
const auto&Change : Changes) {
151 for(llvm::StringRef Header : Change.getInsertedHeaders()) {
152std::string EscapedHeader =
153Header.starts_with(
"<") || Header.starts_with(
"\"")
155: (
"\""+ Header +
"\"").str();
156std::string ReplacementText =
"#include "+ EscapedHeader;
159llvm::Error Err = HeaderReplacements.add(
160tooling::Replacement(FilePath,
UINT_MAX, 0, ReplacementText));
162 returnstd::move(Err);
164 for(
conststd::string &Header : Change.getRemovedHeaders()) {
168HeaderReplacements.add(Replacement(FilePath,
UINT_MAX, 1, Header));
170 returnstd::move(Err);
183combineReplacementsInChanges(llvm::StringRef FilePath,
185Replacements Replaces;
186 for(
const auto&Change : Changes)
187 for(
const auto&R : Change.getReplacements())
188 if(
autoErr = Replaces.add(Replacement(
189FilePath, R.getOffset(), R.getLength(), R.getReplacementText())))
190 returnstd::move(Err);
199std::pair<FileID, unsigned> FileIDAndOffset =
202assert(FE &&
"Cannot create AtomicChange with invalid location.");
203FilePath = std::string(FE->
getName());
204Key = FilePath +
":"+ std::to_string(FileIDAndOffset.second);
210Metadata = std::move(M);
213AtomicChange::AtomicChange(std::string Key, std::string FilePath,
215std::vector<std::string> InsertedHeaders,
216std::vector<std::string> RemovedHeaders,
218: Key(
std::move(Key)), FilePath(
std::move(FilePath)),
219Error(
std::move(Error)), InsertedHeaders(
std::move(InsertedHeaders)),
220RemovedHeaders(
std::move(RemovedHeaders)), Replaces(
std::move(Replaces)) {
224 if(Key !=
Other.Key || FilePath !=
Other.FilePath || Error !=
Other.Error)
226 if(!(Replaces ==
Other.Replaces))
233std::string YamlContent;
234llvm::raw_string_ostream YamlContentStream(YamlContent);
236llvm::yaml::Output YAML(YamlContentStream);
242NormalizedAtomicChange NE;
243llvm::yaml::Input YAML(YAMLContent);
245 AtomicChange E(NE.Key, NE.FilePath, NE.Error, NE.InsertedHeaders,
247 for(
const auto&R : NE.Replaces) {
248llvm::Error Err =
E.Replaces.add(R);
251 "Failed to add replacement when Converting YAML to AtomicChange.");
252llvm::consumeError(std::move(Err));
259llvm::StringRef ReplacementText) {
264 unsignedLength, llvm::StringRef
Text) {
269llvm::StringRef
Text,
boolInsertAfter) {
271 returnllvm::Error::success();
273llvm::Error Err = Replaces.add(R);
275 returnllvm::handleErrors(
278 returnllvm::make_error<ReplacementError>(RE);
279 unsignedNewOffset = Replaces.getShiftedCodePosition(R.
getOffset());
285 returnllvm::Error::success();
288 returnllvm::Error::success();
292InsertedHeaders.push_back(std::string(Header));
296RemovedHeaders.push_back(std::string(Header));
304createReplacementsForHeaders(FilePath, Code, Changes, Spec.
Style);
305 if(!HeaderReplacements)
307 "Failed to create replacements for header changes: "+
308llvm::toString(HeaderReplacements.takeError()));
311combineReplacementsInChanges(FilePath, Changes);
314llvm::toString(Replaces.takeError()));
317 for(
const auto&R : *HeaderReplacements) {
318llvm::Error Err = AllReplaces.
add(R);
321 "Failed to combine existing replacements with header replacements: "+
322llvm::toString(std::move(Err)));
330llvm::toString(CleanReplaces.takeError()));
331AllReplaces = std::move(*CleanReplaces);
339llvm::toString(ChangedCode.takeError()));
349 "Failed to apply replacements for sorting includes: "+
350llvm::toString(ChangedCode.takeError()));
352AllReplaces = AllReplaces.
merge(HeaderSortingReplacements);
354std::vector<Range> FormatRanges = getRangesForFormatting(
356 if(!FormatRanges.empty()) {
362 "Failed to apply replacements for formatting changed code: "+
363llvm::toString(ChangedCode.takeError()));
This file defines the structure of a YAML document for serializing replacements.
Represents a character-granular source range.
StringRef getName() const
The name of this FileEntry.
A SourceLocation and its associated SourceManager.
FullSourceLoc getSpellingLoc() const
std::pair< FileID, unsigned > getDecomposedLoc() const
Decompose the specified location into a raw FileID + Offset pair.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
Expected< tooling::Replacements > cleanupAroundReplacements(StringRef Code, const tooling::Replacements &Replaces, const FormatStyle &Style)
Returns the replacements corresponding to applying Replaces and cleaning up the code after that on su...
tooling::Replacements reformat(const FormatStyle &Style, StringRef Code, ArrayRef< tooling::Range > Ranges, StringRef FileName="<stdin>", FormattingAttemptStatus *Status=nullptr)
Reformats the given Ranges in Code.
tooling::Replacements sortIncludes(const FormatStyle &Style, StringRef Code, ArrayRef< tooling::Range > Ranges, StringRef FileName, unsigned *Cursor=nullptr)
Returns the replacements necessary to sort all #include blocks that are affected by Ranges.
The JSON file list parser is used to communicate input to InstallAPI.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.
unsigned ColumnLimit
The column limit.
static void mapping(IO &Io, NormalizedAtomicChange &Doc)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4