12 #include "llvm/Support/YAMLTraits.h"
22 struct NormalizedAtomicChange {
23 NormalizedAtomicChange() =
default;
25 NormalizedAtomicChange(
const llvm::yaml::IO &) {}
29 NormalizedAtomicChange(
const llvm::yaml::IO &,
31 : Key(E.getKey()),
FilePath(E.getFilePath()),
Error(E.getError()),
32 InsertedHeaders(E.getInsertedHeaders()),
33 RemovedHeaders(E.getRemovedHeaders()),
34 Replaces(E.getReplacements().begin(), E.getReplacements().end()) {}
38 llvm_unreachable(
"Do not convert YAML to AtomicChange directly with '>>'. "
39 "Use AtomicChange::convertFromYAML instead.");
44 std::vector<std::string> InsertedHeaders;
45 std::vector<std::string> RemovedHeaders;
46 std::vector<clang::tooling::Replacement> Replaces;
55 template <>
struct MappingTraits<NormalizedAtomicChange> {
56 static void mapping(IO &Io, NormalizedAtomicChange &Doc) {
57 Io.mapRequired(
"Key", Doc.Key);
58 Io.mapRequired(
"FilePath", Doc.FilePath);
59 Io.mapRequired(
"Error", Doc.Error);
60 Io.mapRequired(
"InsertedHeaders", Doc.InsertedHeaders);
61 Io.mapRequired(
"RemovedHeaders", Doc.RemovedHeaders);
62 Io.mapRequired(
"Replacements", Doc.Replaces);
68 template <>
struct MappingTraits<clang::tooling::AtomicChange> {
70 MappingNormalization<NormalizedAtomicChange, clang::tooling::AtomicChange>
72 Io.mapRequired(
"Key", Keys->Key);
73 Io.mapRequired(
"FilePath", Keys->FilePath);
74 Io.mapRequired(
"Error", Keys->Error);
75 Io.mapRequired(
"InsertedHeaders", Keys->InsertedHeaders);
76 Io.mapRequired(
"RemovedHeaders", Keys->RemovedHeaders);
77 Io.mapRequired(
"Replacements", Keys->Replaces);
90 std::pair<FileID, unsigned> FileIDAndOffset =
93 assert(FE &&
"Cannot create AtomicChange with invalid location.");
95 Key = FilePath +
":" + std::to_string(FileIDAndOffset.second);
98 AtomicChange::AtomicChange(std::string Key, std::string
FilePath,
100 std::vector<std::string> InsertedHeaders,
101 std::vector<std::string> RemovedHeaders,
103 : Key(std::move(Key)), FilePath(std::move(FilePath)),
104 Error(std::move(Error)), InsertedHeaders(std::move(InsertedHeaders)),
105 RemovedHeaders(std::move(RemovedHeaders)), Replaces(std::move(Replaces)) {
109 std::string YamlContent;
110 llvm::raw_string_ostream YamlContentStream(YamlContent);
112 llvm::yaml::Output YAML(YamlContentStream);
114 YamlContentStream.flush();
119 NormalizedAtomicChange NE;
122 AtomicChange E(NE.Key, NE.FilePath, NE.Error, NE.InsertedHeaders,
124 for (
const auto &R : NE.Replaces) {
128 "Failed to add replacement when Converting YAML to AtomicChange.");
129 llvm::consumeError(std::move(Err));
136 llvm::StringRef ReplacementText) {
146 llvm::StringRef
Text,
bool InsertAfter) {
148 return llvm::Error::success();
152 return llvm::handleErrors(
155 return llvm::make_error<ReplacementError>(RE);
162 return llvm::Error::success();
165 return llvm::Error::success();
169 InsertedHeaders.push_back(Header);
173 RemovedHeaders.push_back(Header);
std::pair< FileID, unsigned > getDecomposedLoc() const
Decompose the specified location into a raw FileID + Offset pair.
StringRef getName() const
const FileEntry * getFileEntryForID(FileID FID) const
Returns the FileEntry record for the provided FileID.
Represents a character-granular source range.
Encodes a location in the source.
Cached information about one file (either on disk or in the virtual file system). ...
detail::InMemoryDirectory::const_iterator E
A SourceLocation and its associated SourceManager.
static void mapping(IO &Io, NormalizedAtomicChange &Doc)
This file defines the structure of a YAML document for serializing replacements.
This class handles loading and caching of source files into memory.
FullSourceLoc getSpellingLoc() const