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). 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
