From 541199e925328f61eb773430686cd4e26f056273 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Wed, 4 Sep 2019 11:22:51 +0200 Subject: [PATCH] SONAR-12449 fix code move issue tracking missing some random issues 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 --- .../org/sonar/core/issue/tracking/BlockRecognizer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sonar-core/src/main/java/org/sonar/core/issue/tracking/BlockRecognizer.java b/sonar-core/src/main/java/org/sonar/core/issue/tracking/BlockRecognizer.java index 20b78655d1c..c1cb3fb88e9 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/tracking/BlockRecognizer.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/tracking/BlockRecognizer.java @@ -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 { } private static Multimap groupByLine(Stream trackables, BlockHashSequence hashSequence) { - Multimap 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 result = ArrayListMultimap.create(); trackables.forEach(trackable -> { Integer line = trackable.getLine(); if (hashSequence.hasLine(line)) { -- 2.39.5