This revision was automatically updated to reflect the committed changes.
Closed by commit rL342951: Deduplicate replacements from diagnostics. (authored
by ioeric, committed by ).
Herald added a subscriber: llvm-commits.
Changed prior to commit:
https://reviews.llvm.org/D52264?vs=166112&id=166826#toc
Repository:
rL LLVM
https://reviews.llvm.org/D52264
Files:
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/file2.yaml
clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/identical.cpp
clang-tools-extra/trunk/test/clang-apply-replacements/identical.cpp
Index: clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp
===================================================================
--- clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp
+++ clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp
@@ -125,7 +125,8 @@
}
/// \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 @@
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 @@
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.
Index: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file2.yaml
===================================================================
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file2.yaml
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file2.yaml
@@ -0,0 +1,14 @@
+---
+MainSourceFile: identical.cpp
+Diagnostics:
+ - DiagnosticName: test-identical-insertion
+ Message: Fix
+ FilePath: $(path)/identical.cpp
+ FileOffset: 12
+ Replacements:
+ - FilePath: $(path)/identical.cpp
+ Offset: 12
+ Length: 0
+ ReplacementText: '0'
+...
+
Index: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml
===================================================================
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/file1.yaml
@@ -10,9 +10,5 @@
Offset: 12
Length: 0
ReplacementText: '0'
- - FilePath: $(path)/identical.cpp
- Offset: 12
- Length: 0
- ReplacementText: '0'
...
Index: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/identical.cpp
===================================================================
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/identical.cpp
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/identical/identical.cpp
@@ -1,2 +1,2 @@
class MyType {};
-// CHECK: class MyType00 {};
+// CHECK: class MyType0 {};
Index: clang-tools-extra/trunk/test/clang-apply-replacements/identical.cpp
===================================================================
--- clang-tools-extra/trunk/test/clang-apply-replacements/identical.cpp
+++ clang-tools-extra/trunk/test/clang-apply-replacements/identical.cpp
@@ -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
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits