On Fri, Aug 23, 2013 at 2:54 PM, Sean Silva <[email protected]> wrote: > > > > On Fri, Aug 23, 2013 at 5:47 PM, David Blaikie <[email protected]> wrote: >> >> On Fri, Aug 23, 2013 at 2:35 PM, Sean Silva <[email protected]> wrote: >> > >> > >> > >> > On Thu, Aug 22, 2013 at 9:07 AM, Edwin Vane <[email protected]> >> > 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 >> >> [email protected] >> >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > >> > >> > >> > _______________________________________________ >> > cfe-commits mailing list >> > [email protected] >> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > > > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
