1259701Sdim//===-- ReplacementsYaml.h -- Serialiazation for Replacements ---*- C++ -*-===//
2259701Sdim//
3259701Sdim//                     The LLVM Compiler Infrastructure
4259701Sdim//
5259701Sdim// This file is distributed under the University of Illinois Open Source
6259701Sdim// License. See LICENSE.TXT for details.
7259701Sdim//
8259701Sdim//===----------------------------------------------------------------------===//
9259701Sdim///
10259701Sdim/// \file
11259701Sdim/// \brief This file defines the structure of a YAML document for serializing
12259701Sdim/// replacements.
13259701Sdim///
14259701Sdim//===----------------------------------------------------------------------===//
15259701Sdim
16259701Sdim#ifndef LLVM_CLANG_TOOLING_REPLACEMENTS_YAML_H
17259701Sdim#define LLVM_CLANG_TOOLING_REPLACEMENTS_YAML_H
18259701Sdim
19259701Sdim#include "clang/Tooling/Refactoring.h"
20259701Sdim#include "llvm/Support/YAMLTraits.h"
21259701Sdim#include <vector>
22259701Sdim#include <string>
23259701Sdim
24259701SdimLLVM_YAML_IS_SEQUENCE_VECTOR(clang::tooling::Replacement)
25259701Sdim
26259701Sdimnamespace llvm {
27259701Sdimnamespace yaml {
28259701Sdim
29259701Sdim/// \brief ScalarTraits to read/write std::string objects.
30259701Sdimtemplate <> struct ScalarTraits<std::string> {
31259701Sdim  static void output(const std::string &Val, void *, llvm::raw_ostream &Out) {
32259701Sdim    Out << Val;
33259701Sdim  }
34259701Sdim
35259701Sdim  static StringRef input(StringRef Scalar, void *, std::string &Val) {
36259701Sdim    Val = Scalar;
37259701Sdim    return StringRef();
38259701Sdim  }
39259701Sdim};
40259701Sdim
41259701Sdim/// \brief Specialized MappingTraits to describe how a Replacement is
42259701Sdim/// (de)serialized.
43259701Sdimtemplate <> struct MappingTraits<clang::tooling::Replacement> {
44259701Sdim  /// \brief Helper to (de)serialize a Replacement since we don't have direct
45259701Sdim  /// access to its data members.
46259701Sdim  struct NormalizedReplacement {
47259701Sdim    NormalizedReplacement(const IO &)
48259701Sdim        : FilePath(""), Offset(0), Length(0), ReplacementText("") {}
49259701Sdim
50259701Sdim    NormalizedReplacement(const IO &, const clang::tooling::Replacement &R)
51259701Sdim        : FilePath(R.getFilePath()), Offset(R.getOffset()),
52259701Sdim          Length(R.getLength()), ReplacementText(R.getReplacementText()) {}
53259701Sdim
54259701Sdim    clang::tooling::Replacement denormalize(const IO &) {
55259701Sdim      return clang::tooling::Replacement(FilePath, Offset, Length,
56259701Sdim                                         ReplacementText);
57259701Sdim    }
58259701Sdim
59259701Sdim    std::string FilePath;
60259701Sdim    unsigned int Offset;
61259701Sdim    unsigned int Length;
62259701Sdim    std::string ReplacementText;
63259701Sdim  };
64259701Sdim
65259701Sdim  static void mapping(IO &Io, clang::tooling::Replacement &R) {
66259701Sdim    MappingNormalization<NormalizedReplacement, clang::tooling::Replacement>
67259701Sdim    Keys(Io, R);
68259701Sdim    Io.mapRequired("FilePath", Keys->FilePath);
69259701Sdim    Io.mapRequired("Offset", Keys->Offset);
70259701Sdim    Io.mapRequired("Length", Keys->Length);
71259701Sdim    Io.mapRequired("ReplacementText", Keys->ReplacementText);
72259701Sdim  }
73259701Sdim};
74259701Sdim
75259701Sdim/// \brief Specialized MappingTraits to describe how a
76259701Sdim/// TranslationUnitReplacements is (de)serialized.
77259701Sdimtemplate <> struct MappingTraits<clang::tooling::TranslationUnitReplacements> {
78259701Sdim  static void mapping(IO &Io,
79259701Sdim                      clang::tooling::TranslationUnitReplacements &Doc) {
80259701Sdim    Io.mapRequired("MainSourceFile", Doc.MainSourceFile);
81259701Sdim    Io.mapOptional("Context", Doc.Context, std::string());
82259701Sdim    Io.mapRequired("Replacements", Doc.Replacements);
83259701Sdim  }
84259701Sdim};
85259701Sdim} // end namespace yaml
86259701Sdim} // end namespace llvm
87259701Sdim
88259701Sdim#endif // LLVM_CLANG_TOOLING_REPLACEMENTS_YAML_H
89