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

David Blaikie dblaikie at gmail.com
Fri Aug 23 14:58:03 PDT 2013


On Fri, Aug 23, 2013 at 2:54 PM, Sean Silva <silvas at purdue.edu> wrote:
>
>
>
> On Fri, Aug 23, 2013 at 5: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).
>
>
> Wouldn't that take the form of a clang::tooling::Replacement starting at the
> insertion point but with 0 length?

I should think so - I assume that's physically possible. This just
demonstrates that "Replacement" doesn't necessarily encapsulate the
concept entirely. Internally this is less of an issue than it is for
an end user.

> If I understand correctly, this tool's
> only purpose is literally to slurp up serialized Replacement's then apply
> them (after a deduplication/conflict detection step). Hence my suggestion of
> `clang-apply-replacements`. What avenues of growth you are seeing that would
> change this?

I'm not picturing a growth in functionality not already part of
clang-replace. Just pointing out that the name doesn't fit the current
behavior entirely.

>
> -- Sean Silva
>
>>
>>
>> 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
>> >
>
>



More information about the cfe-commits mailing list