Author: ioeric Date: Tue Sep 25 01:24:07 2018 New Revision: 342951 URL: http://llvm.org/viewvc/llvm-project?rev=342951&view=rev Log: Deduplicate replacements from diagnostics.
Summary: After r329813, clang-apply-replacements stopped deduplicating identical replacements; however, tools like clang-tidy relies on the deduplication of identical dignostics replacements from different TUs to apply fixes correctly. This change partially roll back the behavior by deduplicating changes from diagnostics. Ideally, we should deduplicate on diagnostics level, but we need to figure out an effecient way. Reviewers: bkramer Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D52264 Added: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file2.yaml - copied, changed from r342903, clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml Modified: clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/identical.cpp clang-tools-extra/trunk/test/clang-apply-replacements/identical.cpp Modified: clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp?rev=342951&r1=342950&r2=342951&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp (original) +++ clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp Tue Sep 25 01:24:07 2018 @@ -125,7 +125,8 @@ std::error_code collectReplacementsFromD } /// \brief Extract replacements from collected TranslationUnitReplacements and -/// TranslationUnitDiagnostics and group them per file. +/// TranslationUnitDiagnostics and group them per file. Identical replacements +/// from diagnostics are deduplicated. /// /// \param[in] TUs Collection of all found and deserialized /// TranslationUnitReplacements. @@ -142,10 +143,20 @@ groupReplacements(const TUReplacements & llvm::DenseMap<const FileEntry *, std::vector<tooling::Replacement>> GroupedReplacements; - auto AddToGroup = [&](const tooling::Replacement &R) { + // Deduplicate identical replacements in diagnostics. + // FIXME: Find an efficient way to deduplicate on diagnostics level. + llvm::DenseMap<const FileEntry *, std::set<tooling::Replacement>> + DiagReplacements; + + auto AddToGroup = [&](const tooling::Replacement &R, bool FromDiag) { // Use the file manager to deduplicate paths. FileEntries are // automatically canonicalized. if (const FileEntry *Entry = SM.getFileManager().getFile(R.getFilePath())) { + if (FromDiag) { + auto &Replaces = DiagReplacements[Entry]; + if (!Replaces.insert(R).second) + return; + } GroupedReplacements[Entry].push_back(R); } else if (Warned.insert(R.getFilePath()).second) { errs() << "Described file '" << R.getFilePath() @@ -155,13 +166,13 @@ groupReplacements(const TUReplacements & for (const auto &TU : TUs) for (const tooling::Replacement &R : TU.Replacements) - AddToGroup(R); + AddToGroup(R, false); for (const auto &TU : TUDs) for (const auto &D : TU.Diagnostics) for (const auto &Fix : D.Fix) for (const tooling::Replacement &R : Fix.second) - AddToGroup(R); + AddToGroup(R, true); // Sort replacements per file to keep consistent behavior when // clang-apply-replacements run on differents machine. Modified: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml?rev=342951&r1=342950&r2=342951&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml (original) +++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml Tue Sep 25 01:24:07 2018 @@ -10,9 +10,5 @@ Diagnostics: Offset: 12 Length: 0 ReplacementText: '0' - - FilePath: $(path)/identical.cpp - Offset: 12 - Length: 0 - ReplacementText: '0' ... Copied: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file2.yaml (from r342903, clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml) URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file2.yaml?p2=clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file2.yaml&p1=clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml&r1=342903&r2=342951&rev=342951&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml (original) +++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file2.yaml Tue Sep 25 01:24:07 2018 @@ -10,9 +10,5 @@ Diagnostics: Offset: 12 Length: 0 ReplacementText: '0' - - FilePath: $(path)/identical.cpp - Offset: 12 - Length: 0 - ReplacementText: '0' ... Modified: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/identical.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/identical.cpp?rev=342951&r1=342950&r2=342951&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/identical.cpp (original) +++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/identical.cpp Tue Sep 25 01:24:07 2018 @@ -1,2 +1,2 @@ class MyType {}; -// CHECK: class MyType00 {}; +// CHECK: class MyType0 {}; Modified: clang-tools-extra/trunk/test/clang-apply-replacements/identical.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/identical.cpp?rev=342951&r1=342950&r2=342951&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-apply-replacements/identical.cpp (original) +++ clang-tools-extra/trunk/test/clang-apply-replacements/identical.cpp Tue Sep 25 01:24:07 2018 @@ -1,5 +1,6 @@ // RUN: mkdir -p %T/Inputs/identical // RUN: grep -Ev "// *[A-Z-]+:" %S/Inputs/identical/identical.cpp > %T/Inputs/identical/identical.cpp // RUN: sed "s#\$(path)#%/T/Inputs/identical#" %S/Inputs/identical/file1.yaml > %T/Inputs/identical/file1.yaml +// RUN: sed "s#\$(path)#%/T/Inputs/identical#" %S/Inputs/identical/file2.yaml > %T/Inputs/identical/file2.yaml // RUN: clang-apply-replacements %T/Inputs/identical // RUN: FileCheck -input-file=%T/Inputs/identical/identical.cpp %S/Inputs/identical/identical.cpp _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits