[clang-tools-extra] r187428 - cpp11-migrate: Write header replacements to disk

Vane, Edwin edwin.vane at intel.com
Tue Jul 30 13:48:04 PDT 2013



> -----Original Message-----
> From: Alex Rosenberg [mailto:alexr at leftfield.org]
> Sent: Tuesday, July 30, 2013 4:31 PM
> To: Vane, Edwin
> Cc: Tareq A. Siraj; cfe-commits at cs.uiuc.edu
> Subject: Re: [clang-tools-extra] r187428 - cpp11-migrate: Write header
> replacements to disk
> 
> YAML was included as a serialization format to be used only for LLVM-internal
> testing tools, not as a supported output format. In fact, we discussed expanding
> the role of YAMLTraits in order to support some of our actually used output
> formats like plists to support generic logic in serialization.

I'm not sure how the original intention for YAML is relevant to the situation. We're making using of existing functionality in LLVM to simplify a problem.

> I'm pretty strongly against this direction. 

Why exactly?

> I know of exactly zero tools that use YAML as a format for diff/patch/rewriting.

We don't want to target existing tools. One new tool exists so far: https://github.com/revane/migmerge_git which is a prototype for a more powerful tool we'll soon be building. These output files are not meant for consumption by external tools (unless of course somebody wants to build such a tool). They serve only as an intermediate format for data flowing from >>1 C++11 Migrator processes to 1 Migration Post-Processor process via the filesystem. Inter-process communication would be nice but it's not easily portable.

I've CC'd Manuel who, I think, is familiar with how Google solves this problem internally with protocol buffers. I believe he suggested YAML but we didn't exactly discuss the issue in detail. He might have something to add from his experience.


> 
> Sent from my iPad
> 
> On Jul 30, 2013, at 12:59 PM, "Vane, Edwin" <edwin.vane at intel.com> wrote:
> 
> > The goal is to read in the data again to consume in a custom merge tool.
> Using diff format is just more complex. We really want to maintain the offset,
> replacement length, and replacement text info for the merger. We can generate
> that from a diff but why not just serialize the data directly.
> >
> >> -----Original Message-----
> >> From: cfe-commits-bounces at cs.uiuc.edu [mailto:cfe-commits-
> >> bounces at cs.uiuc.edu] On Behalf Of Alex Rosenberg
> >> Sent: Tuesday, July 30, 2013 3:48 PM
> >> To: Tareq A. Siraj
> >> Cc: cfe-commits at cs.uiuc.edu
> >> Subject: Re: [clang-tools-extra] r187428 - cpp11-migrate: Write
> >> header replacements to disk
> >>
> >> I missed the initial discussion here, but I'm wondering why YAML is
> >> being used here and not just outputting a diff.
> >>
> >> Sent from my iPad
> >>
> >> On Jul 30, 2013, at 11:18 AM, "Tareq A. Siraj" <tareq.a.sriaj at intel.com>
> wrote:
> >>
> >>> Author: tasiraj
> >>> Date: Tue Jul 30 13:18:02 2013
> >>> New Revision: 187428
> >>>
> >>> URL: http://llvm.org/viewvc/llvm-project?rev=187428&view=rev
> >>> Log:
> >>> cpp11-migrate: Write header replacements to disk
> >>>
> >>> Committing r187204 with fixes for darwin. Note that one of the lit
> >>> tests are disabled on windows due to a bug in writing header
> >>> replacements to
> >> file.
> >>>
> >>> Header replacements are now written to disk in YAML format for an
> >>> external tool to merge. A unique file will be created in the same
> >>> directory as the header with all replacements that came from a
> >>> source file that included the header file. The YAML file will have:
> >>> - Name of the file
> >>> - Transform ID that generated the replacement
> >>> - Offset
> >>> - Length
> >>> - Replacement text
> >>>
> >>> Any tool reading these replacements should read them using the
> >>> TransformDocument struct.
> >>>
> >>>
> >>> Added:
> >>>   clang-tools-extra/trunk/cpp11-migrate/Core/ReplacementsYaml.h
> >>>   clang-tools-extra/trunk/test/cpp11-
> >> migrate/HeaderReplacements/common.cpp
> >>>   clang-tools-extra/trunk/test/cpp11-
> >> migrate/HeaderReplacements/common.h
> >>>   clang-tools-extra/trunk/test/cpp11-
> >> migrate/HeaderReplacements/common.h.yaml
> >>>   clang-tools-extra/trunk/test/cpp11-
> migrate/HeaderReplacements/main.cpp
> >>>   clang-tools-extra/trunk/unittests/cpp11-
> migrate/ReplacementsYamlTest.cpp
> >>>   clang-tools-extra/trunk/unittests/cpp11-migrate/Utility.h
> >>> Modified:
> >>>   clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp
> >>>   clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h
> >>>   clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp
> >>>   clang-tools-extra/trunk/cpp11-migrate/Core/Transform.cpp
> >>>   clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp
> >>>   clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt
> >>>   clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.cpp
> >>>
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/IncludeExcludeTest.c
> >>> pp
> >>>
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp
> >>>
> >>> Modified:
> >>> clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-mi
> >>> gr
> >>> ate/Core/FileOverrides.cpp?rev=187428&r1=187427&r2=187428&view=diff
> >>
> =================================================================
> >> =====
> >>> ========
> >>> --- clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp
> >>> (original)
> >>> +++ clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp Tue
> >>> +++ Jul 30 13:18:02 2013
> >>> @@ -23,16 +23,26 @@
> >>> #include "llvm/Support/Path.h"
> >>> #include "llvm/Support/raw_ostream.h"
> >>> #include "llvm/Support/system_error.h"
> >>> +#include <algorithm>
> >>>
> >>> using namespace clang;
> >>> using namespace clang::tooling;
> >>>
> >>> +void HeaderOverride::recordReplacements(
> >>> +    llvm::StringRef TransformID, const clang::tooling::Replacements
> >>> +&Replaces) {
> >>> +  TransformReplacements TR;
> >>> +  TR.TransformID = TransformID;
> >>> +  TR.GeneratedReplacements.resize(Replaces.size());
> >>> +  std::copy(Replaces.begin(), Replaces.end(),
> >>> +TR.GeneratedReplacements.begin());
> >>> +  TransformReplacementsDoc.Replacements.push_back(TR);
> >>> +}
> >>> +
> >>> SourceOverrides::SourceOverrides(llvm::StringRef MainFileName,
> >>>                                 bool TrackChanges)
> >>>    : MainFileName(MainFileName), TrackChanges(TrackChanges) {}
> >>>
> >>> -void
> >>> -SourceOverrides::applyReplacements(clang::tooling::Replacements
> >>> &Replaces) {
> >>> +void SourceOverrides::applyReplacements(tooling::Replacements
> &Replaces,
> >>> +                                        llvm::StringRef
> >>> +TransformName) {
> >>>  llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts(
> >>>      new DiagnosticOptions());
> >>>  DiagnosticsEngine Diagnostics(
> >>> @@ -40,11 +50,12 @@ SourceOverrides::applyReplacements(clang
> >>>      DiagOpts.getPtr());
> >>>  FileManager Files((FileSystemOptions()));  SourceManager
> >>> SM(Diagnostics, Files);
> >>> -  applyReplacements(Replaces, SM);
> >>> +  applyReplacements(Replaces, SM, TransformName);
> >>> }
> >>>
> >>> -void
> >>> SourceOverrides::applyReplacements(clang::tooling::Replacements
> >> &Replaces,
> >>> -                                        clang::SourceManager &SM) {
> >>> +void SourceOverrides::applyReplacements(tooling::Replacements
> &Replaces,
> >>> +                                        SourceManager &SM,
> >>> +                                        llvm::StringRef
> >>> +TransformName) {
> >>>  applyOverrides(SM);
> >>>
> >>>  Rewriter Rewrites(SM, LangOptions()); @@ -56,12 +67,6 @@ void
> >>> SourceOverrides::applyReplacements(
> >>>  if (!Success)
> >>>    llvm::errs() << "error: failed to apply some replacements.";
> >>>
> >>> -  applyRewrites(Rewrites);
> >>> -  if (TrackChanges)
> >>> -    adjustChangedRanges(Replaces);
> >>> -}
> >>> -
> >>> -void SourceOverrides::applyRewrites(Rewriter &Rewrites) {
> >>> std::string ResultBuf;
> >>>
> >>>  for (Rewriter::buffer_iterator I = Rewrites.buffer_begin(), @@
> >>> -89,36 +94,50 @@ void SourceOverrides::applyRewrites(Rewr
> >>>    // will be stored as well for later output to disk. Applying replacements
> >>>    // in memory will always be necessary as the source goes down the
> >> transform
> >>>    // pipeline.
> >>> -
> >>>    HeaderOverride &HeaderOv = Headers[FileName];
> >>> -    HeaderOv.FileOverride.swap(ResultBuf);
> >>>    // "Create" HeaderOverride if not already existing
> >>> -    if (HeaderOv.FileName.empty())
> >>> -      HeaderOv.FileName = FileName;
> >>> +    if (HeaderOv.getFileName().empty())
> >>> +      HeaderOv = HeaderOverride(FileName);
> >>> +
> >>> +    HeaderOv.swapContentOverride(ResultBuf);
> >>>  }
> >>> -}
> >>>
> >>> -void SourceOverrides::adjustChangedRanges(const Replacements
> >>> &Replaces) {
> >>> -  // Start by grouping replacements by file name
> >>> +  // Separate replacements to header files
> >>>  Replacements MainFileReplaces;
> >>> -  llvm::StringMap<Replacements> HeadersReplaces;
> >>> -
> >>> -  for (Replacements::iterator I = Replaces.begin(), E = Replaces.end(); I != E;
> >>> -       ++I) {
> >>> +  ReplacementsMap HeadersReplaces;
> >>> +  for (Replacements::const_iterator I = Replaces.begin(), E =
> Replaces.end();
> >>> +      I != E; ++I) {
> >>>    llvm::StringRef ReplacementFileName = I->getFilePath();
> >>>
> >>> -    if (ReplacementFileName == MainFileName)
> >>> +    if (ReplacementFileName == MainFileName) {
> >>>      MainFileReplaces.insert(*I);
> >>> -    else
> >>> -      HeadersReplaces[ReplacementFileName].insert(*I);
> >>> +      continue;
> >>> +    }
> >>> +
> >>> +    HeadersReplaces[ReplacementFileName].insert(*I);
> >>> +  }
> >>> +
> >>> +  // Record all replacements to headers.
> >>> +  for (ReplacementsMap::const_iterator I = HeadersReplaces.begin(),
> >>> +                                       E = HeadersReplaces.end();
> >>> +       I != E; ++I) {
> >>> +    HeaderOverride &HeaderOv = Headers[I->getKey()];
> >>> +    HeaderOv.recordReplacements(TransformName, I->getValue());
> >>>  }
> >>>
> >>> -  // Then adjust the changed ranges for each individual file
> >>> -  MainFileChanges.adjustChangedRanges(Replaces);
> >>> -  for (llvm::StringMap<Replacements>::iterator I =
> HeadersReplaces.begin(),
> >>> -                                               E = HeadersReplaces.end();
> >>> +  if (TrackChanges)
> >>> +    adjustChangedRanges(MainFileReplaces, HeadersReplaces); }
> >>> +
> >>> +void
> >>> +SourceOverrides::adjustChangedRanges(const Replacements
> >> &MainFileReplaces,
> >>> +                                     const ReplacementsMap
> >>> +&HeadersReplaces) {
> >>> +  // Adjust the changed ranges for each individual file
> >>> +  MainFileChanges.adjustChangedRanges(MainFileReplaces);
> >>> +  for (ReplacementsMap::const_iterator I = HeadersReplaces.begin(),
> >>> +                                       E = HeadersReplaces.end();
> >>>       I != E; ++I) {
> >>> -    Headers[I->getKey()].Changes.adjustChangedRanges(I->getValue());
> >>> +    Headers[I->getKey()].adjustChangedRanges(I->getValue());
> >>>  }
> >>> }
> >>>
> >>> @@ -131,11 +150,11 @@ void SourceOverrides::applyOverrides(Sou
> >>>
> >>>  for (HeaderOverrides::const_iterator I = Headers.begin(), E = Headers.end();
> >>>       I != E; ++I) {
> >>> -    assert(!I->second.FileOverride.empty() &&
> >>> +    assert(!I->second.getContentOverride().empty() &&
> >>>           "Header override should not be empty!");
> >>>    SM.overrideFileContents(
> >>> -        FM.getFile(I->second.FileName),
> >>> -        llvm::MemoryBuffer::getMemBuffer(I->second.FileOverride));
> >>> +        FM.getFile(I->second.getFileName()),
> >>> +
> >>> + llvm::MemoryBuffer::getMemBuffer(I->second.getContentOverride()));
> >>>  }
> >>> }
> >>>
> >>>
> >>> Modified: clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-mi
> >>> gr ate/Core/FileOverrides.h?rev=187428&r1=187427&r2=187428&view=diff
> >>
> =================================================================
> >> =====
> >>> ========
> >>> --- clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h
> >>> (original)
> >>> +++ clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h Tue
> >>> +++ Jul
> >>> +++ 30 13:18:02 2013
> >>> @@ -16,6 +16,7 @@
> >>> #ifndef CPP11_MIGRATE_FILE_OVERRIDES_H #define
> >>> CPP11_MIGRATE_FILE_OVERRIDES_H
> >>>
> >>> +#include "Core/ReplacementsYaml.h"
> >>> #include "clang/Tooling/Refactoring.h"
> >>> #include "llvm/ADT/StringMap.h"
> >>>
> >>> @@ -58,13 +59,52 @@ private:
> >>> };
> >>>
> >>> /// \brief Container for storing override information for a single headers.
> >>> -struct HeaderOverride {
> >>> +class HeaderOverride {
> >>> +public:
> >>> +  /// \brief Constructors.
> >>> +  /// @{
> >>>  HeaderOverride() {}
> >>> -  HeaderOverride(llvm::StringRef FileName) : FileName(FileName) {}
> >>> +  HeaderOverride(llvm::StringRef FileName) {
> >>> +    TransformReplacementsDoc.FileName = FileName;  }  /// @}
> >>> +
> >>> +  /// \brief Getter for FileName.
> >>> +  llvm::StringRef getFileName() const {
> >>> +    return TransformReplacementsDoc.FileName;
> >>> +  }
> >>> +
> >>> +  /// \brief Accessor for ContentOverride.
> >>> +  /// @{
> >>> +  llvm::StringRef getContentOverride() const { return
> >>> + ContentOverride; }  void setContentOverride(const llvm::StringRef
> >>> + S) { ContentOverride = S; }  /// @}
> >>> +
> >>> +  /// \brief Getter for Changes.
> >>> +  const ChangedRanges &getChanges() const { return Changes; }
> >>>
> >>> -  std::string FileName;
> >>> -  std::string FileOverride;
> >>> +  /// \brief Swaps the content of ContentOverride with \param S
> >>> + void swapContentOverride(std::string &S) {
> >>> + ContentOverride.swap(S); }
> >>> +
> >>> +  /// \brief Getter for TransformReplacementsDoc.
> >>> +  const TransformDocument &getTransformReplacementsDoc() const {
> >>> +    return TransformReplacementsDoc;  }
> >>> +
> >>> +  /// \brief Stores the replacements made by a transform to the
> >>> + header this  /// object represents.
> >>> +  void recordReplacements(llvm::StringRef TransformID,
> >>> +                          const clang::tooling::Replacements
> >>> + &Replaces);
> >>> +
> >>> +  /// \brief Helper function to adjust the changed ranges.
> >>> +  void adjustChangedRanges(const clang::tooling::Replacements
> &Replaces) {
> >>> +    Changes.adjustChangedRanges(Replaces);
> >>> +  }
> >>> +
> >>> +private:
> >>> +  std::string ContentOverride;
> >>>  ChangedRanges Changes;
> >>> +  TransformDocument TransformReplacementsDoc;
> >>> };
> >>>
> >>> /// \brief Container mapping header file names to override information.
> >>> @@ -100,8 +140,10 @@ public:
> >>>  /// \param Replaces The replacements to apply.
> >>>  /// \param SM A user provided SourceManager to be used when
> >>> applying
> >> rewrites.
> >>>  void applyReplacements(clang::tooling::Replacements &Replaces,
> >>> -                         clang::SourceManager &SM);
> >>> -  void applyReplacements(clang::tooling::Replacements &Replaces);
> >>> +                         clang::SourceManager &SM,
> >>> +                         llvm::StringRef TransformName);  void
> >>> + applyReplacements(clang::tooling::Replacements &Replaces,
> >>> +                         llvm::StringRef TransformName);
> >>>
> >>>  /// \brief Convenience function for applying this source's
> >>> overrides to  /// the given SourceManager.
> >>> @@ -118,13 +160,16 @@ public:
> >>>  /// @}
> >>>
> >>> private:
> >>> +  typedef llvm::StringMap<clang::tooling::Replacements>
> >>> + ReplacementsMap;
> >>> +
> >>>  /// \brief Flatten the Rewriter buffers of \p Rewrite and store
> >>> results as  /// file content overrides.
> >>>  void applyRewrites(clang::Rewriter &Rewrite);
> >>>
> >>>  /// \brief Adjust the changed ranges to reflect the parts of the
> >>> files that  /// have been replaced.
> >>> -  void adjustChangedRanges(const clang::tooling::Replacements
> >>> &Replaces);
> >>> +  void adjustChangedRanges(const clang::tooling::Replacements
> &Replaces,
> >>> +                           const ReplacementsMap &HeadersReplaces);
> >>>
> >>>  const std::string MainFileName;
> >>>  std::string MainFileOverride;
> >>>
> >>> Modified:
> >>> clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-mi
> >>> gr
> >>> ate/Core/Reformatting.cpp?rev=187428&r1=187427&r2=187428&view=diff
> >>
> =================================================================
> >> =====
> >>> ========
> >>> --- clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp
> >>> (original)
> >>> +++ clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp Tue
> >>> +++ Jul 30 13:18:02 2013
> >>> @@ -47,10 +47,10 @@ void Reformatter::reformatChanges(Source
> >>>       I != E; ++I) {
> >>>    const HeaderOverride &Header = I->getValue();
> >>>    const tooling::Replacements &HeaderReplaces =
> >>> -        reformatSingleFile(Header.FileName, Header.Changes, SM);
> >>> +        reformatSingleFile(Header.getFileName(),
> >>> + Header.getChanges(), SM);
> >>>    Replaces.insert(HeaderReplaces.begin(), HeaderReplaces.end());  }
> >>> -  Overrides.applyReplacements(Replaces, SM);
> >>> +  Overrides.applyReplacements(Replaces, SM, "reformatter");
> >>> }
> >>>
> >>> tooling::Replacements Reformatter::reformatSingleFile(
> >>>
> >>> Added: clang-tools-extra/trunk/cpp11-migrate/Core/ReplacementsYaml.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-mi
> >>> gr ate/Core/ReplacementsYaml.h?rev=187428&view=auto
> >>
> =================================================================
> >> =====
> >>> ========
> >>> --- clang-tools-extra/trunk/cpp11-migrate/Core/ReplacementsYaml.h
> >>> (added)
> >>> +++ clang-tools-extra/trunk/cpp11-migrate/Core/ReplacementsYaml.h
> >>> +++ Tue Jul 30 13:18:02 2013
> >>> @@ -0,0 +1,115 @@
> >>> +//===-- Core/ReplacementsYaml.h ---------------------------------*-
> >>> +C++ -*-===// //
> >>> +//                     The LLVM Compiler Infrastructure
> >>> +//
> >>> +// This file is distributed under the University of Illinois Open
> >>> +Source // License. See LICENSE.TXT for details.
> >>> +//
> >>> +//===--------------------------------------------------------------
> >>> +--
> >>> +------===//
> >>> +///
> >>> +/// \file
> >>> +/// \brief This file provides structs to store the migrator
> >>> +specific header /// replacements and the YAML traits for Replacements.
> >>> +///
> >>> +//===--------------------------------------------------------------
> >>> +--
> >>> +------===//
> >>> +
> >>> +#ifndef CPP11_MIGRATE_REPLACEMENTS_YAML_H #define
> >>> +CPP11_MIGRATE_REPLACEMENTS_YAML_H
> >>> +
> >>> +#include "clang/Tooling/Refactoring.h"
> >>> +#include "llvm/Support/YAMLTraits.h"
> >>> +#include <vector>
> >>> +#include <string>
> >>> +
> >>> +/// \brief A replacement struct to store the transform ID and the
> >> replacement.
> >>> +struct TransformReplacements {
> >>> +  std::string TransformID;
> >>> +  std::vector<clang::tooling::Replacement> GeneratedReplacements;
> >>> +};
> >>> +
> >>> +/// \brief The top-level YAML document that contains the name of
> >>> +the file and /// the TransformReplacements.
> >>> +struct TransformDocument {
> >>> +  std::string FileName;
> >>> +  std::vector<TransformReplacements> Replacements; };
> >>> +
> >>> +LLVM_YAML_IS_SEQUENCE_VECTOR(clang::tooling::Replacement)
> >>> +LLVM_YAML_IS_SEQUENCE_VECTOR(TransformReplacements)
> >>> +
> >>> +namespace llvm {
> >>> +namespace yaml {
> >>> +
> >>> +/// \brief ScalarTraits to read/write std::string objects.
> >>> +template <>
> >>> +struct ScalarTraits<std::string> {
> >>> +  static void output(const std::string &Val, void *, llvm::raw_ostream &Out)
> {
> >>> +    // We need to put quotes around the string to make sure special
> characters
> >>> +    // in the string is not treated as YAML tokens.
> >>> +    std::string NormalizedVal = std::string("\"") + Val + std::string("\"");
> >>> +    Out << NormalizedVal;
> >>> +  }
> >>> +
> >>> +  static StringRef input(StringRef Scalar, void *, std::string &Val) {
> >>> +    Val = Scalar;
> >>> +    return StringRef();
> >>> +  }
> >>> +};
> >>> +
> >>> +/// \brief Specialized MappingTraits for Repleacements to be
> >>> +converted to/from /// a YAML File.
> >>> +template <>
> >>> +struct MappingTraits<clang::tooling::Replacement> {
> >>> +  /// \brief Normalize clang::tooling::Replacement to provide
> >>> +direct access to
> >>> +  /// its members.
> >>> +  struct NormalizedReplacement {
> >>> +    NormalizedReplacement(const IO &)
> >>> +        : FilePath(""), Offset(0), Length(0), ReplacementText("")
> >>> +{}
> >>> +
> >>> +    NormalizedReplacement(const IO &, const
> >>> + clang::tooling::Replacement
> >> &R)
> >>> +        : FilePath(R.getFilePath()), Offset(R.getOffset()),
> >>> +          Length(R.getLength()),
> >>> + ReplacementText(R.getReplacementText()) {}
> >>> +
> >>> +    clang::tooling::Replacement denormalize(const IO &) {
> >>> +      return clang::tooling::Replacement(FilePath, Offset, Length,
> >>> +                                         ReplacementText);
> >>> +    }
> >>> +
> >>> +    std::string FilePath;
> >>> +    unsigned int Offset;
> >>> +    unsigned int Length;
> >>> +    std::string ReplacementText;
> >>> +  };
> >>> +
> >>> +  static void mapping(IO &Io, clang::tooling::Replacement &R) {
> >>> +    MappingNormalization<NormalizedReplacement,
> >> clang::tooling::Replacement>
> >>> +        Keys(Io, R);
> >>> +    Io.mapRequired("Offset", Keys->Offset);
> >>> +    Io.mapRequired("Length", Keys->Length);
> >>> +    Io.mapRequired("ReplacementText", Keys->ReplacementText);
> >>> +  }
> >>> +};
> >>> +
> >>> +/// \brief Specialized MappingTraits for TransformRepleacements to
> >>> +be converted /// to/from a YAML File.
> >>> +template <>
> >>> +struct MappingTraits<TransformReplacements> {
> >>> +  static void mapping(IO &Io, TransformReplacements &R) {
> >>> +    Io.mapRequired("TransformID", R.TransformID);
> >>> +    Io.mapRequired("Replacements", R.GeneratedReplacements);
> >>> +  }
> >>> +};
> >>> +
> >>> +/// \brief Specialized MappingTraits for TransformDocument to be
> >>> +converted /// to/from a YAML File.
> >>> +template <>
> >>> +struct MappingTraits<TransformDocument> {
> >>> +  static void mapping(IO &Io, TransformDocument &TD) {
> >>> +    Io.mapRequired("FileName", TD.FileName);
> >>> +    Io.mapRequired("Transforms", TD.Replacements);
> >>> +  }
> >>> +};
> >>> +} // end namespace yaml
> >>> +} // end namespace llvm
> >>> +
> >>> +#endif // CPP11_MIGRATE_REPLACEMENTS_YAML_H
> >>>
> >>> Modified: clang-tools-extra/trunk/cpp11-migrate/Core/Transform.cpp
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-mi
> >>> gr ate/Core/Transform.cpp?rev=187428&r1=187427&r2=187428&view=diff
> >>
> =================================================================
> >> =====
> >>> ========
> >>> --- clang-tools-extra/trunk/cpp11-migrate/Core/Transform.cpp
> >>> (original)
> >>> +++ clang-tools-extra/trunk/cpp11-migrate/Core/Transform.cpp Tue Jul
> >>> +++ 30 13:18:02 2013
> >>> @@ -118,7 +118,7 @@ bool Transform::handleBeginSource(Compil
> >>> void Transform::handleEndSource() {
> >>>  if (!getReplacements().empty()) {
> >>>    SourceOverrides &SO = Overrides->getOrCreate(CurrentSource);
> >>> -    SO.applyReplacements(getReplacements());
> >>> +    SO.applyReplacements(getReplacements(), getName());
> >>>  }
> >>>
> >>>  if (Options().EnableTiming)
> >>>
> >>> Modified:
> >>> clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-mi
> >>> gr
> >>> ate/tool/Cpp11Migrate.cpp?rev=187428&r1=187427&r2=187428&view=diff
> >>
> =================================================================
> >> =====
> >>> ========
> >>> --- clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp
> >>> (original)
> >>> +++ clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp Tue
> >>> +++ Jul 30 13:18:02 2013
> >>> @@ -325,13 +325,40 @@ int main(int argc, const char **argv) {
> >>>    for (HeaderOverrides::const_iterator HeaderI = Overrides.headers_begin(),
> >>>                                         HeaderE = Overrides.headers_end();
> >>>         HeaderI != HeaderE; ++HeaderI) {
> >>> -      assert(!HeaderI->second.FileOverride.empty() &&
> >>> +      assert(!HeaderI->second.getContentOverride().empty() &&
> >>>             "A header override should not be empty");
> >>>      std::string ErrorInfo;
> >>>      std::string HeaderFileName = HeaderI->getKey();
> >>>      llvm::raw_fd_ostream HeaderStream(HeaderFileName.c_str(), ErrorInfo,
> >>>                                        llvm::sys::fs::F_Binary);
> >>> -      HeaderStream << HeaderI->second.FileOverride;
> >>> +      if (!ErrorInfo.empty()) {
> >>> +        llvm::errs() << "Error opening file: " << ErrorInfo << "\n";
> >>> +        continue;
> >>> +      }
> >>> +      HeaderStream << HeaderI->second.getContentOverride();
> >>> +
> >>> +      // Replacements for header files need to be written in a YAML file for
> >>> +      // every transform and will be merged together with an external tool.
> >>> +      llvm::SmallString<128> ReplacementsHeaderName;
> >>> +      llvm::SmallString<64> Error;
> >>> +      bool Result = generateReplacementsFileName(I->getKey(),
> >> HeaderFileName,
> >>> +                                                 ReplacementsHeaderName, Error);
> >>> +      if (!Result) {
> >>> +        llvm::errs() << "Failed to generate replacements filename:" << Error
> >>> +                     << "\n";
> >>> +        continue;
> >>> +      }
> >>> +
> >>> +      llvm::raw_fd_ostream
> >> ReplacementsFile(ReplacementsHeaderName.c_str(),
> >>> +                                            ErrorInfo,
> >>> +                                            llvm::sys::fs::F_Binary);
> >>> +      if (!ErrorInfo.empty()) {
> >>> +        llvm::errs() << "Error opening file: " << ErrorInfo << "\n";
> >>> +        continue;
> >>> +      }
> >>> +      llvm::yaml::Output YAML(ReplacementsFile);
> >>> +      YAML << const_cast<TransformDocument &>(
> >>> +
> >>> + HeaderI->getValue().getTransformReplacementsDoc());
> >>>    }
> >>>  }
> >>>
> >>>
> >>> Added:
> >>> clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/common
> >>> .c
> >>> pp
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp
> >>> 11 -migrate/HeaderReplacements/common.cpp?rev=187428&view=auto
> >>
> =================================================================
> >> =====
> >>> ========
> >>> ---
> >>> clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/common
> >>> .c
> >>> pp (added)
> >>> +++ clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/co
> >>> +++ mm
> >>> +++ on.cpp Tue Jul 30 13:18:02 2013
> >>> @@ -0,0 +1,16 @@
> >>> +// This is just a dummy run command to keep lit happy. Tests for
> >>> +this file are // in main.cpp // RUN: true
> >>> +
> >>> +#include "common.h"
> >>> +
> >>> +void func1(int &I) {
> >>> +}
> >>> +
> >>> +void func2() {
> >>> +  container C1;
> >>> +  container C2;
> >>> +  for (container::iterator I = C1.begin(), E = C1.end(); I != E; ++I) {
> >>> +    C2.push_back(*I);
> >>> +  }
> >>> +}
> >>>
> >>> Added:
> >>> clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/common
> >>> .h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp
> >>> 11 -migrate/HeaderReplacements/common.h?rev=187428&view=auto
> >>
> =================================================================
> >> =====
> >>> ========
> >>> ---
> >>> clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/common
> >>> .h
> >>> (added)
> >>> +++ clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/co
> >>> +++ mm
> >>> +++ on.h Tue Jul 30 13:18:02 2013
> >>> @@ -0,0 +1,27 @@
> >>> +#ifndef CPP11_MIGRATE_TEST_HEADER_REPLACEMENTS_COMMON_H
> >>> +#define CPP11_MIGRATE_TEST_HEADER_REPLACEMENTS_COMMON_H
> >>> +
> >>> +struct container {
> >>> +  struct iterator {
> >>> +    int &operator*();
> >>> +    const int &operator*() const;
> >>> +    iterator &operator++();
> >>> +    bool operator!=(const iterator &other);
> >>> +  };
> >>> +
> >>> +  iterator begin();
> >>> +  iterator end();
> >>> +  void push_back(const int &);
> >>> +};
> >>> +
> >>> +void func1(int &I);
> >>> +void func2();
> >>> +
> >>> +void dostuff() {
> >>> +  container C;
> >>> +  for (container::iterator I = C.begin(), E = C.end(); I != E; ++I) {
> >>> +    func1(*I);
> >>> +  }
> >>> +}
> >>> +
> >>> +#endif // CPP11_MIGRATE_TEST_HEADER_REPLACEMENTS_COMMON_H
> >>>
> >>> Added:
> >>> clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/common
> >>> .h
> >>> .yaml
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp
> >>> 11 -migrate/HeaderReplacements/common.h.yaml?rev=187428&view=auto
> >>
> =================================================================
> >> =====
> >>> ========
> >>> ---
> >>> clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/common
> >>> .h
> >>> .yaml (added)
> >>> +++ clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/co
> >>> +++ mm on.h.yaml Tue Jul 30 13:18:02 2013
> >>> @@ -0,0 +1,12 @@
> >>> +---
> >>> +FileName: "common.h"
> >>> +Transforms:
> >>> +  - TransformID:     "LoopConvert"
> >>> +    Replacements:
> >>> +      - Offset:          432
> >>> +        Length:          61
> >>> +        ReplacementText: "(auto & elem : C)"
> >>> +      - Offset:          506
> >>> +        Length:          2
> >>> +        ReplacementText: "elem"
> >>> +...
> >>>
> >>> Added:
> >>> clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/main.c
> >>> pp
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp
> >>> 11 -migrate/HeaderReplacements/main.cpp?rev=187428&view=auto
> >>
> =================================================================
> >> =====
> >>> ========
> >>> ---
> >>> clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/main.c
> >>> pp
> >>> (added)
> >>> +++ clang-tools-extra/trunk/test/cpp11-migrate/HeaderReplacements/ma
> >>> +++ in
> >>> +++ .cpp Tue Jul 30 13:18:02 2013
> >>> @@ -0,0 +1,39 @@
> >>> +// XFAIL: win32
> >>> +// This test fails on windows due to a bug in writing to header
> replacements.
> >>> +//
> >>> +// The following block tests the following:
> >>> +//   - Only 1 file is generated per translation unit and header file
> >>> +//   - Replacements are written in YAML that matches the expected YAML
> file
> >>> +// RUN: rm -rf %t/Test
> >>> +// RUN: mkdir -p %t/Test
> >>> +// RUN: cp %S/main.cpp %S/common.cpp %S/common.h %t/Test // RUN:
> >>> +cpp11-migrate -loop-convert -headers -include=%t/Test
> >>> +%t/Test/main.cpp %t/Test/common.cpp -- // Check that only 1 file is
> >> generated per translation unit and header file.
> >>> +// RUN: ls -1 %t/Test | grep -c "main.cpp_common.h_.*.yaml" | grep
> "^1$"
> >>> +// RUN: ls -1 %t/Test | grep -c "common.cpp_common.h_.*.yaml" |
> >>> +grep
> >> "^1$"
> >>> +// We need to remove the path from FileName in the generated YAML
> >>> +file because it will have a path in the temp directory // RUN: sed
> >>> +-i -e 's/^\(FileName:\).*[\/\\]\(.*\)"$/\1 "\2"/g'
> >>> +%t/Test/main.cpp_common.h_*.yaml // RUN: sed -i -e
> >>> +'s/^\(FileName:\).*[\/\\]\(.*\)"$/\1 "\2"/g'
> >>> +%t/Test/common.cpp_common.h_*.yaml
> >>> +// RUN: diff -b %S/common.h.yaml %t/Test/main.cpp_common.h_*.yaml
> >>> +//
> >>> +RUN: diff -b %S/common.h.yaml %t/Test/common.cpp_common.h_*.yaml
> >>> +//
> >>> +// The following block tests the following:
> >>> +//   - YAML files are written only when -headers is used
> >>> +// RUN: rm -rf %t/Test
> >>> +// RUN: mkdir -p %t/Test
> >>> +// RUN: cp %S/main.cpp %S/common.cpp %S/common.h %t/Test // RUN:
> >>> +cpp11-migrate -loop-convert -headers -include=%t/Test
> >>> +%t/Test/main.cpp -- // RUN: cpp11-migrate -loop-convert
> >>> +%t/Test/common.cpp -- // Check that only one YAML file is generated
> >>> +from main.cpp and common.h and not from common.cpp and common.h
> >> since -header is not specified // RUN: ls -1 %t/Test | grep -c
> >> "main.cpp_common.h_.*.yaml" | grep "^1$"
> >>> +// RUN: ls -1 %t/Test | not grep "common.cpp_common.h_.*.yaml"
> >>> +// We need to remove the path from FileName in the generated YAML
> >>> +file because it will have a path in the temp directory // RUN: sed
> >>> +-i -e 's/^\(FileName:\).*[\/\\]\(.*\)"$/\1 "\2"/g'
> >>> +%t/Test/main.cpp_common.h_*.yaml // RUN: diff -b %S/common.h.yaml
> >>> +%t/Test/main.cpp_common.h_*.yaml
> >>> +
> >>> +#include "common.h"
> >>> +
> >>> +void test_header_replacement() {
> >>> +  dostuff();
> >>> +  func2();
> >>> +}
> >>>
> >>> Modified:
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittest
> >>> s/
> >>> cpp11-
> >> migrate/CMakeLists.txt?rev=187428&r1=187427&r2=187428&view=diff
> >>
> =================================================================
> >> =====
> >>> ========
> >>> --- clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt
> >>> (original)
> >>> +++ clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt
> >>> +++ Tue Jul 30 13:18:02 2013
> >>> @@ -11,6 +11,7 @@ add_extra_unittest(Cpp11MigrateTests
> >>>  ReformattingTest.cpp
> >>>  IncludeExcludeTest.cpp
> >>>  PerfSupportTest.cpp
> >>> +  ReplacementsYamlTest.cpp
> >>>  TransformTest.cpp
> >>>  UniqueHeaderNameTest.cpp
> >>>  )
> >>>
> >>> Modified:
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.cp
> >>> p
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittest
> >>> s/
> >>> cpp11-
> >> migrate/FileOverridesTest.cpp?rev=187428&r1=187427&r2=187428&vie
> >>> w=diff
> >>
> =================================================================
> >> =====
> >>> ========
> >>> ---
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.cp
> >>> p
> >>> (original)
> >>> +++ clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.
> >>> +++ cpp Tue Jul 30 13:18:02 2013
> >>> @@ -30,8 +30,10 @@ TEST(SourceOverridesTest, Interface) {
> >>> Replacements Replaces;  unsigned ReplacementLength =
> >>>
> >>> strlen("std::vector<such_a_long_name_for_a_type>::const_iterator");
> >>> -  Replaces.insert(Replacement(FileName, 0, ReplacementLength,
> >>> "auto"));
> >>> -  Overrides.applyReplacements(Replaces,
> >>> VFHelper.getNewSourceManager());
> >>> +  Replaces.insert(
> >>> +      Replacement(FileName, 0, ReplacementLength, "auto"));
> >>> + Overrides.applyReplacements(Replaces,
> VFHelper.getNewSourceManager(),
> >>> +                              "use-auto");
> >>>  EXPECT_TRUE(Overrides.isSourceOverriden());
> >>>
> >>>  std::string ExpectedContent = "auto long_type =\n"
> >>>
> >>> Modified:
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/IncludeExcludeTest.c
> >>> pp
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittest
> >>> s/
> >>> cpp11-
> >> migrate/IncludeExcludeTest.cpp?rev=187428&r1=187427&r2=187428&vi
> >>> ew=diff
> >>
> =================================================================
> >> =====
> >>> ========
> >>> ---
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/IncludeExcludeTest.c
> >>> pp
> >>> (original)
> >>> +++ clang-tools-extra/trunk/unittests/cpp11-migrate/IncludeExcludeTe
> >>> +++ st
> >>> +++ .cpp Tue Jul 30 13:18:02 2013
> >>> @@ -7,24 +7,13 @@
> >>> //
> >>> //===---------------------------------------------------------------
> >>> --
> >>> -----===//
> >>>
> >>> +#include "Utility.h"
> >>> #include "Core/IncludeExcludeInfo.h"
> >>> #include "gtest/gtest.h"
> >>> #include "llvm/Support/FileSystem.h"
> >>> #include "llvm/Support/Path.h"
> >>> #include <fstream>
> >>>
> >>> -// FIXME: copied from unittests/Support/Path.cpp
> >>> -#define ASSERT_NO_ERROR(x)                                                     \
> >>> -  if (llvm::error_code ASSERT_NO_ERROR_ec = x) {                               \
> >>> -    llvm::SmallString<128> MessageStorage;                                     \
> >>> -    llvm::raw_svector_ostream Message(MessageStorage);                         \
> >>> -    Message << #x ": did not return errc::success.\n"                          \
> >>> -            << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n"          \
> >>> -            << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n";
> \
> >>> -    GTEST_FATAL_FAILURE_(MessageStorage.c_str());                              \
> >>> -  } else {                                                                     \
> >>> -  }
> >>> -
> >>> TEST(IncludeExcludeTest, ParseString) {  IncludeExcludeInfo
> >>> IEManager;  llvm::error_code Err = IEManager.readListFromString(
> >>>
> >>> Modified:
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittest
> >>> s/
> >>> cpp11-
> >> migrate/ReformattingTest.cpp?rev=187428&r1=187427&r2=187428&view
> >>> =diff
> >>
> =================================================================
> >> =====
> >>> ========
> >>> ---
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp
> >>> (original)
> >>> +++ clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest
> >>> +++ .c
> >>> +++ pp Tue Jul 30 13:18:02 2013
> >>> @@ -39,7 +39,8 @@ TEST(Reformatter, SingleReformat) {
> >>>      FileName, Changes, VFHelper.getNewSourceManager());
> >>>
> >>>  SourceOverrides Overrides(FileName, /*TrackChanges=*/false);
> >>> -  Overrides.applyReplacements(Replaces,
> >>> VFHelper.getNewSourceManager());
> >>> +  Overrides.applyReplacements(Replaces,
> VFHelper.getNewSourceManager(),
> >>> +                              "reformatter");
> >>>
> >>>  std::string Expected, Result;
> >>>
> >>>
> >>> Added:
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/ReplacementsYamlTest
> >>> .c
> >>> pp
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittest
> >>> s/ cpp11-migrate/ReplacementsYamlTest.cpp?rev=187428&view=auto
> >>
> =================================================================
> >> =====
> >>> ========
> >>> ---
> >>> clang-tools-extra/trunk/unittests/cpp11-migrate/ReplacementsYamlTest
> >>> .c
> >>> pp (added)
> >>> +++ clang-tools-extra/trunk/unittests/cpp11-migrate/ReplacementsYaml
> >>> +++ Te
> >>> +++ st.cpp Tue Jul 30 13:18:02 2013
> >>> @@ -0,0 +1,84 @@
> >>> +//===- unittests/cpp11-migrate/ReplacementsYamlTest.cpp
> >>> +-------------------===// //
> >>> +//                     The LLVM Compiler Infrastructure
> >>> +//
> >>> +// This file is distributed under the University of Illinois Open
> >>> +Source // License. See LICENSE.TXT for details.
> >>> +//
> >>> +//===--------------------------------------------------------------
> >>> +--
> >>> +------===//
> >>> +//
> >>> +// Test for the Yaml files generated by transforms on header files.
> >>> +//
> >>> +//===--------------------------------------------------------------
> >>> +--
> >>> +------===//
> >>> +
> >>> +#include "Utility.h"
> >>> +#include "Core/FileOverrides.h"
> >>> +#include "gtest/gtest.h"
> >>> +
> >>> +using namespace llvm;
> >>> +
> >>> +TEST(ReplacementsYamlTest, writeReadTest) {
> >>> +  using clang::tooling::Replacement;
> >>> +
> >>> +  const std::string HeaderFileName = "/path/to/common.h";  const
> >>> + std::string TransformID = "loop-convert";  const unsigned int
> >>> + ReplacementOffset1 = 232;  const unsigned int ReplacementLength1 =
> >>> + 56;  const std::string ReplacementText1 = "(auto & elem : V)";
> >>> + const unsigned int ReplacementOffset2 = 301;  const unsigned int
> >>> + ReplacementLength2 = 2;  const std::string ReplacementText2 =
> >>> + "elem";
> >>> +
> >>> +  TransformReplacements TR;
> >>> +  TR.TransformID = TransformID;
> >>> +  TR.GeneratedReplacements
> >>> +      .push_back(Replacement(HeaderFileName, ReplacementOffset1,
> >>> +                             ReplacementLength1,
> >>> + ReplacementText1)); TR.GeneratedReplacements
> >>> +      .push_back(Replacement(HeaderFileName, ReplacementOffset2,
> >>> +                             ReplacementLength2,
> >>> + ReplacementText2));
> >>> +
> >>> +  TransformDocument TD;
> >>> +  TD.FileName = HeaderFileName.c_str();
> >>> + TD.Replacements.push_back(TR);
> >>> +
> >>> +  std::string YamlContent;
> >>> +  llvm::raw_string_ostream YamlContentStream(YamlContent);
> >>> +
> >>> +  // Write to the YAML file.
> >>> +  {
> >>> +    yaml::Output YAML(YamlContentStream);
> >>> +    YAML << TD;
> >>> +    YamlContentStream.str();
> >>> +    ASSERT_NE(YamlContent.length(), 0u);  }
> >>> +
> >>> +  // Read from the YAML file and verify that what was written is
> >>> + exactly what  // we read back.
> >>> +  {
> >>> +    TransformDocument TDActual;
> >>> +    yaml::Input YAML(YamlContent);
> >>> +    YAML >> TDActual;
> >>> +    ASSERT_NO_ERROR(YAML.error());
> >>> +    EXPECT_EQ(HeaderFileName, TDActual.FileName);
> >>> +    ASSERT_EQ(1u, TDActual.Replacements.size());
> >>> +
> >>> +    TransformReplacements TRActual = TDActual.Replacements[0];
> >>> +    EXPECT_EQ(TransformID, TRActual.TransformID);
> >>> +    ASSERT_EQ(2u, TRActual.GeneratedReplacements.size());
> >>> +
> >>> +    EXPECT_EQ(ReplacementOffset1,
> >>> +              TRActual.GeneratedReplacements[0].getOffset());
> >>> +    EXPECT_EQ(ReplacementLength1,
> >>> +              TRActual.GeneratedReplacements[0].getLength());
> >>> +    EXPECT_EQ(ReplacementText1,
> >>> +
> >>> + TRActual.GeneratedReplacements[0].getReplacementText().str());
> >>> +
> >>> +    EXPECT_EQ(ReplacementOffset2,
> >>> +              TRActual.GeneratedReplacements[1].getOffset());
> >>> +    EXPECT_EQ(ReplacementLength2,
> >>> +              TRActual.GeneratedReplacements[1].getLength());
> >>> +    EXPECT_EQ(ReplacementText2,
> >>> +
> >>> +TRActual.GeneratedReplacements[1].getReplacementText().str());
> >>> +  }
> >>> +}
> >>>
> >>> Added: clang-tools-extra/trunk/unittests/cpp11-migrate/Utility.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittest
> >>> s/ cpp11-migrate/Utility.h?rev=187428&view=auto
> >>
> =================================================================
> >> =====
> >>> ========
> >>> --- clang-tools-extra/trunk/unittests/cpp11-migrate/Utility.h
> >>> (added)
> >>> +++ clang-tools-extra/trunk/unittests/cpp11-migrate/Utility.h Tue
> >>> +++ Jul
> >>> +++ 30 13:18:02 2013
> >>> @@ -0,0 +1,25 @@
> >>> +//=-- cpp11-migrate/Utility.h - Utility functions and macros-----*-
> >>> +C++ -*-===// //
> >>> +//                     The LLVM Compiler Infrastructure
> >>> +//
> >>> +// This file is distributed under the University of Illinois Open
> >>> +Source // License. See LICENSE.TXT for details.
> >>> +//
> >>> +//===--------------------------------------------------------------
> >>> +--
> >>> +------===//
> >>> +
> >>> +#ifndef CPP11_MIGRATE_UNITTESTS_UTILITY_H #define
> >>> +CPP11_MIGRATE_UNITTESTS_UTILITY_H
> >>> +
> >>> +// FIXME: copied from unittests/Support/Path.cpp
> >>> +#define ASSERT_NO_ERROR(x)                                                     \
> >>> +  if (llvm::error_code ASSERT_NO_ERROR_ec = x) {                               \
> >>> +    llvm::SmallString<128> MessageStorage;                                     \
> >>> +    llvm::raw_svector_ostream Message(MessageStorage);                         \
> >>> +    Message << #x ": did not return errc::success.\n"                          \
> >>> +            << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n"          \
> >>> +            << "error message: " << ASSERT_NO_ERROR_ec.message() <<
> >>> +"\n";
> >> \
> >>> +    GTEST_FATAL_FAILURE_(MessageStorage.c_str());                              \
> >>> +  } else {                                                                     \
> >>> +  }
> >>> +
> >>> +#endif // CPP11_MIGRATE_UNITTESTS_UTILITY_H
> >>>
> >>>
> >>> _______________________________________________
> >>> cfe-commits mailing list
> >>> cfe-commits at cs.uiuc.edu
> >>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> >>
> >> _______________________________________________
> >> cfe-commits mailing list
> >> cfe-commits at cs.uiuc.edu
> >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list