]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-12449 fix code move issue tracking missing some random issues
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Wed, 4 Sep 2019 09:22:51 +0000 (11:22 +0200)
committerSonarTech <sonartech@sonarsource.com>
Thu, 17 Oct 2019 13:24:49 +0000 (15:24 +0200)
an initial piece of code of code move heuristic would index issues by line in a MultiMap
issues are DefaultIssue objects which hashCode method is based solely on DefaultIssue's key field
Multimap implementation used in code move was Set based
unfortunately, at this point in time, no DefaultIssue instance have a key set yet
which implies that all of them have the same hashcode
which implies when stored in the MultiMap for the same key, only one DefaultIssue instance was stored (the first added, which is unpredictable)
this change make code move heuristic use List based Multimaps which do not use DefaultIssue's hashcode

sonar-core/src/main/java/org/sonar/core/issue/tracking/BlockRecognizer.java

index 20b78655d1ce579c21bb2620dbaf2f50cbd54177..c1cb3fb88e9097257c8d3496a6fcaa8d21371505 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.core.issue.tracking;
 
-import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
 import java.util.Collection;
@@ -140,7 +140,10 @@ class BlockRecognizer<RAW extends Trackable, BASE extends Trackable> {
   }
 
   private static <T extends Trackable> Multimap<Integer, T> groupByLine(Stream<T> trackables, BlockHashSequence hashSequence) {
-    Multimap<Integer, T> result = LinkedHashMultimap.create();
+    // must use a MultiMap implementation which is not based on a Set collection because when T is a DefaultIssue
+    // its hashcode method returns the same value for all instances because it is based only on the DefaultIssue's
+    // key field which is not yet set when we do Issue Tracking
+    Multimap<Integer, T> result = ArrayListMultimap.create();
     trackables.forEach(trackable -> {
       Integer line = trackable.getLine();
       if (hashSequence.hasLine(line)) {