1259701Sdim//===-- ReplacementsYaml.h -- Serialiazation for Replacements ---*- C++ -*-===//
2259701Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6259701Sdim//
7259701Sdim//===----------------------------------------------------------------------===//
8259701Sdim///
9259701Sdim/// \file
10341825Sdim/// This file defines the structure of a YAML document for serializing
11259701Sdim/// replacements.
12259701Sdim///
13259701Sdim//===----------------------------------------------------------------------===//
14259701Sdim
15280031Sdim#ifndef LLVM_CLANG_TOOLING_REPLACEMENTSYAML_H
16280031Sdim#define LLVM_CLANG_TOOLING_REPLACEMENTSYAML_H
17259701Sdim
18259701Sdim#include "clang/Tooling/Refactoring.h"
19259701Sdim#include "llvm/Support/YAMLTraits.h"
20276479Sdim#include <string>
21259701Sdim
22259701SdimLLVM_YAML_IS_SEQUENCE_VECTOR(clang::tooling::Replacement)
23259701Sdim
24259701Sdimnamespace llvm {
25259701Sdimnamespace yaml {
26259701Sdim
27341825Sdim/// Specialized MappingTraits to describe how a Replacement is
28259701Sdim/// (de)serialized.
29259701Sdimtemplate <> struct MappingTraits<clang::tooling::Replacement> {
30341825Sdim  /// Helper to (de)serialize a Replacement since we don't have direct
31259701Sdim  /// access to its data members.
32259701Sdim  struct NormalizedReplacement {
33259701Sdim    NormalizedReplacement(const IO &)
34259701Sdim        : FilePath(""), Offset(0), Length(0), ReplacementText("") {}
35259701Sdim
36259701Sdim    NormalizedReplacement(const IO &, const clang::tooling::Replacement &R)
37259701Sdim        : FilePath(R.getFilePath()), Offset(R.getOffset()),
38353358Sdim          Length(R.getLength()), ReplacementText(R.getReplacementText()) {
39353358Sdim      size_t lineBreakPos = ReplacementText.find('\n');
40353358Sdim      while (lineBreakPos != std::string::npos) {
41353358Sdim        ReplacementText.replace(lineBreakPos, 1, "\n\n");
42353358Sdim        lineBreakPos = ReplacementText.find('\n', lineBreakPos + 2);
43353358Sdim      }
44353358Sdim    }
45259701Sdim
46259701Sdim    clang::tooling::Replacement denormalize(const IO &) {
47259701Sdim      return clang::tooling::Replacement(FilePath, Offset, Length,
48259701Sdim                                         ReplacementText);
49259701Sdim    }
50259701Sdim
51259701Sdim    std::string FilePath;
52259701Sdim    unsigned int Offset;
53259701Sdim    unsigned int Length;
54259701Sdim    std::string ReplacementText;
55259701Sdim  };
56259701Sdim
57259701Sdim  static void mapping(IO &Io, clang::tooling::Replacement &R) {
58259701Sdim    MappingNormalization<NormalizedReplacement, clang::tooling::Replacement>
59259701Sdim    Keys(Io, R);
60259701Sdim    Io.mapRequired("FilePath", Keys->FilePath);
61259701Sdim    Io.mapRequired("Offset", Keys->Offset);
62259701Sdim    Io.mapRequired("Length", Keys->Length);
63259701Sdim    Io.mapRequired("ReplacementText", Keys->ReplacementText);
64259701Sdim  }
65259701Sdim};
66259701Sdim
67341825Sdim/// Specialized MappingTraits to describe how a
68259701Sdim/// TranslationUnitReplacements is (de)serialized.
69259701Sdimtemplate <> struct MappingTraits<clang::tooling::TranslationUnitReplacements> {
70259701Sdim  static void mapping(IO &Io,
71259701Sdim                      clang::tooling::TranslationUnitReplacements &Doc) {
72259701Sdim    Io.mapRequired("MainSourceFile", Doc.MainSourceFile);
73259701Sdim    Io.mapRequired("Replacements", Doc.Replacements);
74259701Sdim  }
75259701Sdim};
76259701Sdim} // end namespace yaml
77259701Sdim} // end namespace llvm
78259701Sdim
79280031Sdim#endif
80