[clang-tools-extra] r189008 - Introducing new tool clang-replace

Manuel Klimek klimek at google.com
Fri Aug 23 23:38:17 PDT 2013


On Fri, Aug 23, 2013 at 11:47 PM, David Blaikie <dblaikie at gmail.com> wrote:

> On Fri, Aug 23, 2013 at 2:35 PM, Sean Silva <silvas at purdue.edu> wrote:
> >
> >
> >
> > On Thu, Aug 22, 2013 at 9:07 AM, Edwin Vane <edwin.vane at intel.com>
> wrote:
> >>
> >> Author: revane
> >> Date: Thu Aug 22 08:07:14 2013
> >> New Revision: 189008
> >>
> >> URL: http://llvm.org/viewvc/llvm-project?rev=189008&view=rev
> >> Log:
> >> Introducing new tool clang-replace
> >>
> >> Introducing new tool 'clang-replace' that finds files containing
> >> serialized Replacements and applies those changes after deduplication
> >> and detecting conflicts.
> >>
> >> Currently the tool does not apply changes. It stops just after the
> >> deduplication and conflict report phase. Forthcoming patches will
> >> complete functionality.
> >
> >
> > I hate to bring this up post-commit (it just came to me now), but I
> really
> > feel `clang-replace` is not the right name for this tool.
> `clang-replace` is
> > not self-documenting and sounds more like a tool for renaming than a tool
> > that does what it does now (or will do soon), i.e. deduplicate/apply
> > replacements generated by refactoring tools. I feel like this tool
> should be
> > called `clang-apply-replacements` (or something like that).
>
> If we're going to paint this bikeshed I'll mention my colour issues:
>
> This won't always apply 'replacements'. It might also/instead do, say,
> insertions (add 'override' everywhere, for example).
>

Conceptually (at least in the way we defined the domain), an insertion is a
subset of a replacement. Most tools I've seen handle it that way (that is,
you replace a 0-length range with <text>).

I tend to agree that clang-apply-replacements is probably a better name.
Edwin?


> clang-apply-changes ? But I like the short tool names, not sure if
> clang-apply is too vague. (clang-change? clang-edit? clang-patch?)
>
> >
> > -- Sean Silva
> >
> >
> >>
> >>
> >> Both build systems updated for new tool.
> >>
> >> Includes a conflict test case.
> >>
> >> clang-replace added to Doxygen build.
> >>
> >> Differential Revision: http://llvm-reviews.chandlerc.com/D1424
> >>
> >>
> >> Added:
> >>     clang-tools-extra/trunk/clang-replace/
> >>     clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp
> >>     clang-tools-extra/trunk/clang-replace/ApplyReplacements.h
> >>     clang-tools-extra/trunk/clang-replace/CMakeLists.txt
> >>     clang-tools-extra/trunk/clang-replace/Makefile
> >>     clang-tools-extra/trunk/clang-replace/tool/
> >>     clang-tools-extra/trunk/clang-replace/tool/CMakeLists.txt
> >>     clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp
> >>     clang-tools-extra/trunk/clang-replace/tool/Makefile
> >>     clang-tools-extra/trunk/test/clang-replace/
> >>     clang-tools-extra/trunk/test/clang-replace/conflict/
> >>     clang-tools-extra/trunk/test/clang-replace/conflict.cpp
> >>     clang-tools-extra/trunk/test/clang-replace/conflict/common.h
> >>     clang-tools-extra/trunk/test/clang-replace/conflict/expected.txt
> >>     clang-tools-extra/trunk/test/clang-replace/conflict/file1.yaml
> >>     clang-tools-extra/trunk/test/clang-replace/conflict/file2.yaml
> >>     clang-tools-extra/trunk/test/clang-replace/conflict/file3.yaml
> >> Modified:
> >>     clang-tools-extra/trunk/CMakeLists.txt
> >>     clang-tools-extra/trunk/Makefile
> >>     clang-tools-extra/trunk/docs/Doxyfile
> >>     clang-tools-extra/trunk/test/CMakeLists.txt
> >>
> >> Modified: clang-tools-extra/trunk/CMakeLists.txt
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/CMakeLists.txt?rev=189008&r1=189007&r2=189008&view=diff
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/CMakeLists.txt (original)
> >> +++ clang-tools-extra/trunk/CMakeLists.txt Thu Aug 22 08:07:14 2013
> >> @@ -1,6 +1,7 @@
> >>  add_subdirectory(remove-cstr-calls)
> >>  add_subdirectory(tool-template)
> >>  add_subdirectory(cpp11-migrate)
> >> +add_subdirectory(clang-replace)
> >>  add_subdirectory(modularize)
> >>  add_subdirectory(clang-tidy)
> >>
> >>
> >> Modified: clang-tools-extra/trunk/Makefile
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/Makefile?rev=189008&r1=189007&r2=189008&view=diff
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/Makefile (original)
> >> +++ clang-tools-extra/trunk/Makefile Thu Aug 22 08:07:14 2013
> >> @@ -12,7 +12,7 @@ CLANG_LEVEL := ../..
> >>  include $(CLANG_LEVEL)/../../Makefile.config
> >>
> >>  PARALLEL_DIRS := remove-cstr-calls tool-template modularize
> >> -DIRS := cpp11-migrate clang-tidy unittests
> >> +DIRS := cpp11-migrate clang-tidy clang-replace unittests
> >>
> >>  include $(CLANG_LEVEL)/Makefile
> >>
> >>
> >> Added: clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp (added)
> >> +++ clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp Thu Aug
> 22
> >> 08:07:14 2013
> >> @@ -0,0 +1,193 @@
> >> +//===-- Core/ApplyChangeDescriptions.cpp
> >> ----------------------------------===//
> >> +//
> >> +//                     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 the implementation for finding and
> applying
> >> change
> >> +/// description files.
> >> +///
> >>
> >>
> +//===----------------------------------------------------------------------===//
> >> +#include "ApplyReplacements.h"
> >> +#include "clang/Basic/LangOptions.h"
> >> +#include "clang/Basic/SourceManager.h"
> >> +#include "llvm/ADT/ArrayRef.h"
> >> +#include "llvm/Support/FileSystem.h"
> >> +#include "llvm/Support/MemoryBuffer.h"
> >> +#include "llvm/Support/Path.h"
> >> +#include "llvm/Support/raw_ostream.h"
> >> +
> >> +using namespace llvm;
> >> +using namespace clang;
> >> +
> >> +
> >> +static void eatDiagnostics(const SMDiagnostic &, void *) {}
> >> +
> >> +namespace clang {
> >> +namespace replace {
> >> +
> >> +llvm::error_code
> >> +collectReplacementsFromDirectory(const llvm::StringRef Directory,
> >> +                                 TUReplacements &TUs,
> >> +                                 clang::DiagnosticsEngine
> &Diagnostics) {
> >> +  using namespace llvm::sys::fs;
> >> +  using namespace llvm::sys::path;
> >> +
> >> +  error_code ErrorCode;
> >> +
> >> +  for (recursive_directory_iterator I(Directory, ErrorCode), E;
> >> +       I != E && !ErrorCode; I.increment(ErrorCode)) {
> >> +    if (filename(I->path())[0] == '.') {
> >> +      // Indicate not to descend into directories beginning with '.'
> >> +      I.no_push();
> >> +      continue;
> >> +    }
> >> +
> >> +    if (extension(I->path()) != ".yaml")
> >> +      continue;
> >> +
> >> +    OwningPtr<MemoryBuffer> Out;
> >> +    error_code BufferError = MemoryBuffer::getFile(I->path(), Out);
> >> +    if (BufferError) {
> >> +      errs() << "Error reading " << I->path() << ": " <<
> >> BufferError.message()
> >> +             << "\n";
> >> +      continue;
> >> +    }
> >> +
> >> +    yaml::Input YIn(Out->getBuffer());
> >> +    YIn.setDiagHandler(&eatDiagnostics);
> >> +    tooling::TranslationUnitReplacements TU;
> >> +    YIn >> TU;
> >> +    if (YIn.error()) {
> >> +      // File doesn't appear to be a header change description. Ignore
> >> it.
> >> +      continue;
> >> +    }
> >> +
> >> +    // Only keep files that properly parse.
> >> +    TUs.push_back(TU);
> >> +  }
> >> +
> >> +  return ErrorCode;
> >> +}
> >> +
> >> +/// \brief Dumps information for a sequence of conflicting
> Replacements.
> >> +///
> >> +/// \param[in] File FileEntry for the file the conflicting Replacements
> >> are
> >> +/// for.
> >> +/// \param[in] ConflictingReplacements List of conflicting
> Replacements.
> >> +/// \param[in] SM SourceManager used for reporting.
> >> +static void reportConflict(
> >> +    const FileEntry *File,
> >> +    const llvm::ArrayRef<clang::tooling::Replacement>
> >> ConflictingReplacements,
> >> +    SourceManager &SM) {
> >> +  FileID FID = SM.translateFile(File);
> >> +  if (FID.isInvalid())
> >> +    FID = SM.createFileID(File, SourceLocation(), SrcMgr::C_User);
> >> +
> >> +  // FIXME: Output something a little more user-friendly (e.g. unified
> >> diff?)
> >> +  errs() << "The following changes conflict:\n";
> >> +  for (const tooling::Replacement *I = ConflictingReplacements.begin(),
> >> +                                  *E = ConflictingReplacements.end();
> >> +       I != E; ++I) {
> >> +    if (I->getLength() == 0) {
> >> +      errs() << "  Insert at " << SM.getLineNumber(FID, I->getOffset())
> >> << ":"
> >> +             << SM.getColumnNumber(FID, I->getOffset()) << " "
> >> +             << I->getReplacementText() << "\n";
> >> +    } else {
> >> +      if (I->getReplacementText().empty())
> >> +        errs() << "  Remove ";
> >> +      else
> >> +        errs() << "  Replace ";
> >> +
> >> +      errs() << SM.getLineNumber(FID, I->getOffset()) << ":"
> >> +             << SM.getColumnNumber(FID, I->getOffset()) << "-"
> >> +             << SM.getLineNumber(FID, I->getOffset() + I->getLength() -
> >> 1)
> >> +             << ":"
> >> +             << SM.getColumnNumber(FID, I->getOffset() +
> I->getLength() -
> >> 1);
> >> +
> >> +      if (I->getReplacementText().empty())
> >> +        errs() << "\n";
> >> +      else
> >> +        errs() << " with \"" << I->getReplacementText() << "\"\n";
> >> +    }
> >> +  }
> >> +}
> >> +
> >> +/// \brief Deduplicates and tests for conflicts among the replacements
> >> for each
> >> +/// file in \c Replacements. Any conflicts found are reported.
> >> +///
> >> +/// \param[in,out] Replacements Container of all replacements grouped
> by
> >> file
> >> +/// to be deduplicated and checked for conflicts.
> >> +/// \param[in] SM SourceManager required for conflict reporting
> >> +///
> >> +/// \returns \li true if conflicts were detected
> >> +///          \li false if no conflicts were detected
> >> +static bool deduplicateAndDetectConflicts(FileToReplacementsMap
> >> &Replacements,
> >> +                                          SourceManager &SM) {
> >> +  bool conflictsFound = false;
> >> +
> >> +  for (FileToReplacementsMap::iterator I = Replacements.begin(),
> >> +                                       E = Replacements.end();
> >> +       I != E; ++I) {
> >> +
> >> +    const FileEntry *Entry = SM.getFileManager().getFile(I->getKey());
> >> +    if (!Entry) {
> >> +      errs() << "Described file '" << I->getKey()
> >> +             << "' doesn't exist. Ignoring...\n";
> >> +      continue;
> >> +    }
> >> +
> >> +    std::vector<tooling::Range> Conflicts;
> >> +    tooling::deduplicate(I->getValue(), Conflicts);
> >> +
> >> +    if (Conflicts.empty())
> >> +      continue;
> >> +
> >> +    conflictsFound = true;
> >> +
> >> +    errs() << "There are conflicting changes to " << I->getKey() <<
> >> ":\n";
> >> +
> >> +    for (std::vector<tooling::Range>::const_iterator
> >> +             ConflictI = Conflicts.begin(),
> >> +             ConflictE = Conflicts.end();
> >> +         ConflictI != ConflictE; ++ConflictI) {
> >> +      ArrayRef<tooling::Replacement> ConflictingReplacements(
> >> +          &I->getValue()[ConflictI->getOffset()],
> >> ConflictI->getLength());
> >> +      reportConflict(Entry, ConflictingReplacements, SM);
> >> +    }
> >> +  }
> >> +
> >> +  return conflictsFound;
> >> +}
> >> +
> >> +bool mergeAndDeduplicate(const TUReplacements &TUs,
> >> +                         FileToReplacementsMap &GroupedReplacements,
> >> +                         clang::DiagnosticsEngine &Diagnostics) {
> >> +
> >> +  // FIXME: Use Diagnostics for output
> >> +
> >> +  // Group all replacements by target file.
> >> +  for (TUReplacements::const_iterator TUI = TUs.begin(), TUE =
> TUs.end();
> >> +       TUI != TUE; ++TUI)
> >> +    for (std::vector<tooling::Replacement>::const_iterator
> >> +             RI = TUI->Replacements.begin(),
> >> +             RE = TUI->Replacements.end();
> >> +         RI != RE; ++RI)
> >> +      GroupedReplacements[RI->getFilePath()].push_back(*RI);
> >> +
> >> +  FileManager Files((FileSystemOptions()));
> >> +  SourceManager SM(Diagnostics, Files);
> >> +
> >> +  // Ask clang to deduplicate and report conflicts.
> >> +  if (deduplicateAndDetectConflicts(GroupedReplacements, SM))
> >> +    return false;
> >> +
> >> +  return true;
> >> +}
> >> +
> >> +} // end namespace replace
> >> +} // end namespace clang
> >>
> >> Added: clang-tools-extra/trunk/clang-replace/ApplyReplacements.h
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/ApplyReplacements.h?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/clang-replace/ApplyReplacements.h (added)
> >> +++ clang-tools-extra/trunk/clang-replace/ApplyReplacements.h Thu Aug 22
> >> 08:07:14 2013
> >> @@ -0,0 +1,77 @@
> >> +//===-- Core/ApplyChangeDescriptions.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 the interface for finding and applying
> >> change
> >> +/// description files.
> >> +///
> >>
> >>
> +//===----------------------------------------------------------------------===//
> >> +
> >> +#ifndef CPP11_MIGRATE_APPLYCHANGEDESCRIPTIONS_H
> >> +#define CPP11_MIGRATE_APPLYCHANGEDESCRIPTIONS_H
> >> +
> >> +#include "clang/Tooling/ReplacementsYaml.h"
> >> +#include "llvm/ADT/StringMap.h"
> >> +#include "llvm/ADT/StringRef.h"
> >> +#include "llvm/Support/system_error.h"
> >> +#include <vector>
> >> +
> >> +namespace clang {
> >> +
> >> +class DiagnosticsEngine;
> >> +
> >> +namespace replace {
> >> +
> >> +/// \brief Collection of TranslationUnitReplacements.
> >> +typedef std::vector<clang::tooling::TranslationUnitReplacements>
> >> +TUReplacements;
> >> +
> >> +/// \brief Map mapping file name to Replacements targeting that file.
> >> +typedef llvm::StringMap<std::vector<clang::tooling::Replacement> >
> >> +FileToReplacementsMap;
> >> +
> >> +/// \brief Recursively descends through a directory structure rooted at
> >> \p
> >> +/// Directory and attempts to deserialize *.yaml files as
> >> +/// TranslationUnitReplacements. All docs that successfully deserialize
> >> are
> >> +/// added to \p TUs.
> >> +///
> >> +/// Directories starting with '.' are ignored during traversal.
> >> +///
> >> +/// \param[in] Directory Directory to begin search for serialized
> >> +/// TranslationUnitReplacements.
> >> +/// \param[out] TUs Collection of all found and deserialized
> >> +/// TranslationUnitReplacements.
> >> +/// \param[in] Diagnostics DiagnosticsEngine used for error output.
> >> +///
> >> +/// \returns An error_code indicating success or failure in navigating
> >> the
> >> +/// directory structure.
> >> +llvm::error_code
> >> +collectReplacementsFromDirectory(const llvm::StringRef Directory,
> >> +                                 TUReplacements &TUs,
> >> +                                 clang::DiagnosticsEngine
> &Diagnostics);
> >> +
> >> +/// \brief Deduplicate, check for conflicts, and apply all Replacements
> >> stored
> >> +/// in \c TUs. If conflicts occur, no Replacements are applied.
> >> +///
> >> +/// \param[in] TUs Collection of TranslationUnitReplacements to merge,
> >> +/// deduplicate, and test for conflicts.
> >> +/// \param[out] GroupedReplacements Container grouping all Replacements
> >> by the
> >> +/// file they target.
> >> +/// \param[in] Diagnostics DiagnosticsEngine used for error/warning
> >> output.
> >> +///
> >> +/// \returns \li true If all changes were applied successfully.
> >> +///          \li false If there were conflicts.
> >> +bool mergeAndDeduplicate(const TUReplacements &TUs,
> >> +                         FileToReplacementsMap &GroupedReplacements,
> >> +                         clang::DiagnosticsEngine &Diagnostics);
> >> +
> >> +} // end namespace replace
> >> +} // end namespace clang
> >> +
> >> +#endif // CPP11_MIGRATE_APPLYCHANGEDESCRIPTIONS_H
> >>
> >> Added: clang-tools-extra/trunk/clang-replace/CMakeLists.txt
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/CMakeLists.txt?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/clang-replace/CMakeLists.txt (added)
> >> +++ clang-tools-extra/trunk/clang-replace/CMakeLists.txt Thu Aug 22
> >> 08:07:14 2013
> >> @@ -0,0 +1,19 @@
> >> +set(LLVM_LINK_COMPONENTS
> >> +  ${LLVM_TARGETS_TO_BUILD}
> >> +  asmparser
> >> +  bitreader
> >> +  support
> >> +  mc
> >> +  )
> >> +
> >> +add_clang_library(clangReplace
> >> +  ApplyReplacements.cpp
> >> +  )
> >> +target_link_libraries(clangReplace
> >> +  clangTooling
> >> +  clangBasic
> >> +  clangRewriteFrontend
> >> +  )
> >> +
> >> +include_directories(${CMAKE_CURRENT_SOURCE_DIR})
> >> +add_subdirectory(tool)
> >>
> >> Added: clang-tools-extra/trunk/clang-replace/Makefile
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/Makefile?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/clang-replace/Makefile (added)
> >> +++ clang-tools-extra/trunk/clang-replace/Makefile Thu Aug 22 08:07:14
> >> 2013
> >> @@ -0,0 +1,16 @@
> >> +##===- clang-replace/Makefile ------------------------------*- Makefile
> >> -*-===##
> >> +#
> >> +#                     The LLVM Compiler Infrastructure
> >> +#
> >> +# This file is distributed under the University of Illinois Open Source
> >> +# License. See LICENSE.TXT for details.
> >> +#
> >>
> >>
> +##===----------------------------------------------------------------------===##
> >> +
> >> +CLANG_LEVEL := ../../..
> >> +LIBRARYNAME := clangReplace
> >> +include $(CLANG_LEVEL)/../../Makefile.config
> >> +
> >> +DIRS = tool
> >> +
> >> +include $(CLANG_LEVEL)/Makefile
> >>
> >> Added: clang-tools-extra/trunk/clang-replace/tool/CMakeLists.txt
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/tool/CMakeLists.txt?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/clang-replace/tool/CMakeLists.txt (added)
> >> +++ clang-tools-extra/trunk/clang-replace/tool/CMakeLists.txt Thu Aug 22
> >> 08:07:14 2013
> >> @@ -0,0 +1,17 @@
> >> +set(LLVM_LINK_COMPONENTS
> >> +  ${LLVM_TARGETS_TO_BUILD}
> >> +  asmparser
> >> +  bitreader
> >> +  support
> >> +  mc
> >> +  )
> >> +
> >> +add_clang_executable(clang-replace
> >> +  ClangReplaceMain.cpp
> >> +  )
> >> +target_link_libraries(clang-replace
> >> +  clangReplace
> >> +  )
> >> +
> >> +install(TARGETS clang-replace
> >> +  RUNTIME DESTINATION bin)
> >>
> >> Added: clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp
> >> (added)
> >> +++ clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp Thu
> >> Aug 22 08:07:14 2013
> >> @@ -0,0 +1,50 @@
> >> +//===-- ClangReplaceMain.cpp - Main file for clang-replace tool
> >> -----------===//
> >> +//
> >> +//                     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 the main function for the clang-replace
> >> tool.
> >> +///
> >>
> >>
> +//===----------------------------------------------------------------------===//
> >> +
> >> +#include "ApplyReplacements.h"
> >> +#include "clang/Basic/Diagnostic.h"
> >> +#include "clang/Basic/DiagnosticOptions.h"
> >> +#include "llvm/Support/CommandLine.h"
> >> +
> >> +using namespace llvm;
> >> +using namespace clang;
> >> +using namespace clang::replace;
> >> +
> >> +static cl::opt<std::string> Directory(cl::Positional, cl::Required,
> >> +                                      cl::desc("<Search Root
> >> Directory>"));
> >> +
> >> +int main(int argc, char **argv) {
> >> +  cl::ParseCommandLineOptions(argc, argv);
> >> +
> >> +  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new
> >> DiagnosticOptions());
> >> +  DiagnosticsEngine Diagnostics(
> >> +      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),
> >> +      DiagOpts.getPtr());
> >> +
> >> +  TUReplacements TUs;
> >> +
> >> +  error_code ErrorCode =
> >> +      collectReplacementsFromDirectory(Directory, TUs, Diagnostics);
> >> +
> >> +  if (ErrorCode) {
> >> +    errs() << "Trouble iterating over directory '" << Directory
> >> +           << "': " << ErrorCode.message() << "\n";
> >> +    return false;
> >> +  }
> >> +
> >> +  FileToReplacementsMap GroupedReplacements;
> >> +  if (mergeAndDeduplicate(TUs, GroupedReplacements, Diagnostics))
> >> +    return 0;
> >> +  return 1;
> >> +}
> >>
> >> Added: clang-tools-extra/trunk/clang-replace/tool/Makefile
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/tool/Makefile?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/clang-replace/tool/Makefile (added)
> >> +++ clang-tools-extra/trunk/clang-replace/tool/Makefile Thu Aug 22
> >> 08:07:14 2013
> >> @@ -0,0 +1,28 @@
> >> +##===- clang-replace/tool/Makefile -------------------------*- Makefile
> >> -*-===##
> >> +#
> >> +#                     The LLVM Compiler Infrastructure
> >> +#
> >> +# This file is distributed under the University of Illinois Open Source
> >> +# License. See LICENSE.TXT for details.
> >> +#
> >>
> >>
> +##===----------------------------------------------------------------------===##
> >> +
> >> +CLANG_LEVEL := ../../../..
> >> +include $(CLANG_LEVEL)/../../Makefile.config
> >> +
> >> +TOOLNAME = clang-replace
> >> +
> >> +# No plugins, optimize startup time.
> >> +TOOL_NO_EXPORTS = 1
> >> +
> >> +SOURCES = ClangReplaceMain.cpp
> >> +
> >> +LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc
> >> mcparser option
> >> +USEDLIBS = clangReplace.a clangFormat.a clangTooling.a clangFrontend.a
> \
> >> +          clangSerialization.a clangDriver.a clangRewriteFrontend.a \
> >> +          clangRewriteCore.a clangParse.a clangSema.a clangAnalysis.a \
> >> +          clangAST.a clangASTMatchers.a clangEdit.a clangLex.a
> >> clangBasic.a
> >> +
> >> +include $(CLANG_LEVEL)/Makefile
> >> +
> >> +CPP.Flags += -I$(PROJ_SRC_DIR)/..
> >>
> >> Modified: clang-tools-extra/trunk/docs/Doxyfile
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/Doxyfile?rev=189008&r1=189007&r2=189008&view=diff
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/docs/Doxyfile (original)
> >> +++ clang-tools-extra/trunk/docs/Doxyfile Thu Aug 22 08:07:14 2013
> >> @@ -648,7 +648,7 @@ WARN_LOGFILE           =
> >>  # directories like "/usr/src/myproject". Separate the files or
> >> directories
> >>  # with spaces.
> >>
> >> -INPUT                  = ../cpp11-migrate
> >> +INPUT                  = ../cpp11-migrate ../clang-replace
> >>
> >>  # This tag can be used to specify the character encoding of the source
> >> files
> >>  # that doxygen parses. Internally doxygen uses the UTF-8 encoding,
> which
> >> is
> >>
> >> Modified: clang-tools-extra/trunk/test/CMakeLists.txt
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/CMakeLists.txt?rev=189008&r1=189007&r2=189008&view=diff
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/test/CMakeLists.txt (original)
> >> +++ clang-tools-extra/trunk/test/CMakeLists.txt Thu Aug 22 08:07:14 2013
> >> @@ -27,7 +27,7 @@ set(CLANG_TOOLS_TEST_DEPS
> >>    clang clang-headers FileCheck count not
> >>
> >>    # Individual tools we test.
> >> -  remove-cstr-calls cpp11-migrate modularize clang-tidy
> >> +  remove-cstr-calls clang-replace cpp11-migrate modularize clang-tidy
> >>
> >>    # Unit tests
> >>    ExtraToolsUnitTests
> >>
> >> Added: clang-tools-extra/trunk/test/clang-replace/conflict.cpp
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-replace/conflict.cpp?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/test/clang-replace/conflict.cpp (added)
> >> +++ clang-tools-extra/trunk/test/clang-replace/conflict.cpp Thu Aug 22
> >> 08:07:14 2013
> >> @@ -0,0 +1,7 @@
> >> +// RUN: mkdir -p %T/conflict
> >> +// RUN: sed "s#\$(path)#%/S/conflict#" %S/conflict/file1.yaml >
> >> %T/conflict/file1.yaml
> >> +// RUN: sed "s#\$(path)#%/S/conflict#" %S/conflict/file2.yaml >
> >> %T/conflict/file2.yaml
> >> +// RUN: sed "s#\$(path)#%/S/conflict#" %S/conflict/file3.yaml >
> >> %T/conflict/file3.yaml
> >> +// RUN: sed "s#\$(path)#%/S/conflict#" %S/conflict/expected.txt >
> >> %T/conflict/expected.txt
> >> +// RUN: not clang-replace %T/conflict > %T/conflict/output.txt 2>&1
> >> +// RUN: diff -b %T/conflict/output.txt %T/conflict/expected.txt
> >>
> >> Added: clang-tools-extra/trunk/test/clang-replace/conflict/common.h
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-replace/conflict/common.h?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/test/clang-replace/conflict/common.h (added)
> >> +++ clang-tools-extra/trunk/test/clang-replace/conflict/common.h Thu Aug
> >> 22 08:07:14 2013
> >> @@ -0,0 +1,17 @@
> >> +#ifndef COMMON_H
> >> +#define COMMON_H
> >> +
> >> +extern void ext(int (&)[5]);
> >> +
> >> +void func(int t) {
> >> +  int ints[5];
> >> +  for (unsigned i = 0; i < 5; ++i) {
> >> +    ints[i] = t;
> >> +  }
> >> +
> >> +  int *i = 0;
> >> +
> >> +  ext(ints);
> >> +}
> >> +
> >> +#endif // COMMON_H
> >>
> >> Added: clang-tools-extra/trunk/test/clang-replace/conflict/expected.txt
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-replace/conflict/expected.txt?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/test/clang-replace/conflict/expected.txt
> >> (added)
> >> +++ clang-tools-extra/trunk/test/clang-replace/conflict/expected.txt Thu
> >> Aug 22 08:07:14 2013
> >> @@ -0,0 +1,11 @@
> >> +There are conflicting changes to $(path)/common.h:
> >> +The following changes conflict:
> >> +  Replace 8:8-8:33 with "auto & i : ints"
> >> +  Replace 8:8-8:33 with "int & elem : ints"
> >> +The following changes conflict:
> >> +  Replace 9:5-9:11 with "elem"
> >> +  Replace 9:5-9:11 with "i"
> >> +The following changes conflict:
> >> +  Remove 12:3-12:14
> >> +  Insert at 12:12 (int*)
> >> +  Replace 12:12-12:12 with "nullptr"
> >>
> >> Added: clang-tools-extra/trunk/test/clang-replace/conflict/file1.yaml
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-replace/conflict/file1.yaml?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/test/clang-replace/conflict/file1.yaml
> (added)
> >> +++ clang-tools-extra/trunk/test/clang-replace/conflict/file1.yaml Thu
> Aug
> >> 22 08:07:14 2013
> >> @@ -0,0 +1,16 @@
> >> +---
> >> +MainSourceFile: "source1.cpp"
> >> +Replacements:
> >> +  - FilePath:        "$(path)/common.h"
> >> +    Offset:          106
> >> +    Length:          26
> >> +    ReplacementText: "auto & i : ints"
> >> +  - FilePath:        "$(path)/common.h"
> >> +    Offset:          140
> >> +    Length:          7
> >> +    ReplacementText: "i"
> >> +  - FilePath:        "$(path)/common.h"
> >> +    Offset:          160
> >> +    Length:          12
> >> +    ReplacementText: ""
> >> +...
> >>
> >> Added: clang-tools-extra/trunk/test/clang-replace/conflict/file2.yaml
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-replace/conflict/file2.yaml?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/test/clang-replace/conflict/file2.yaml
> (added)
> >> +++ clang-tools-extra/trunk/test/clang-replace/conflict/file2.yaml Thu
> Aug
> >> 22 08:07:14 2013
> >> @@ -0,0 +1,16 @@
> >> +---
> >> +MainSourceFile: "source2.cpp"
> >> +Replacements:
> >> +  - FilePath:        "$(path)/common.h"
> >> +    Offset:          106
> >> +    Length:          26
> >> +    ReplacementText: "int & elem : ints"
> >> +  - FilePath:        "$(path)/common.h"
> >> +    Offset:          140
> >> +    Length:          7
> >> +    ReplacementText: "elem"
> >> +  - FilePath:        "$(path)/common.h"
> >> +    Offset:          169
> >> +    Length:          1
> >> +    ReplacementText: "nullptr"
> >> +...
> >>
> >> Added: clang-tools-extra/trunk/test/clang-replace/conflict/file3.yaml
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-replace/conflict/file3.yaml?rev=189008&view=auto
> >>
> >>
> ==============================================================================
> >> --- clang-tools-extra/trunk/test/clang-replace/conflict/file3.yaml
> (added)
> >> +++ clang-tools-extra/trunk/test/clang-replace/conflict/file3.yaml Thu
> Aug
> >> 22 08:07:14 2013
> >> @@ -0,0 +1,8 @@
> >> +---
> >> +MainSourceFile: "source1.cpp"
> >> +Replacements:
> >> +  - FilePath:        "$(path)/common.h"
> >> +    Offset:          169
> >> +    Length:          0
> >> +    ReplacementText: "(int*)"
> >> +...
> >>
> >>
> >> _______________________________________________
> >> 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
> >
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130824/c3430a6d/attachment.html>


More information about the cfe-commits mailing list