From ee33583d8e702aeaf0c774d561efe5d4cd254799 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Fri, 22 May 2020 00:22:07 -0400 Subject: [PATCH] Bug 563455: Always return same instance of CElementImageDescriptor to platform Because of a bug in the platform implementation of equals/hashCode under some circumstances, we can workaround the problem by returning the same instance of CElementImageDescriptor when the objects are equal(). Change-Id: I6ff15cffa4b48080dcc6c9a023622edf4ae2d497 --- .../ui/viewsupport/CElementImageProvider.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java index fcafb95ebf7..bc4bbcabd1e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java @@ -16,6 +16,9 @@ *******************************************************************************/ package org.eclipse.cdt.internal.ui.viewsupport; +import java.util.HashMap; +import java.util.Map; + import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; @@ -114,6 +117,12 @@ public class CElementImageProvider { //DESC_OBJ_FOLDER= images.getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER); } + /** + * Map of a descriptor back to its canonical one. This is needed to work around a bug in + * the Eclipse platform, see Bug 563454 + */ + private final Map allDescriptors = new HashMap<>(); + public CElementImageProvider() { } @@ -300,7 +309,9 @@ public class CElementImageProvider { Point size = useSmallSize(flags) ? SMALL_SIZE : BIG_SIZE; ImageDescriptor desc = getBaseImageDescriptor(element, flags); if (desc != null) { - return new CElementImageDescriptor(desc, adornmentFlags, size); + CElementImageDescriptor descriptor = new CElementImageDescriptor(desc, adornmentFlags, size); + descriptor = allDescriptors.computeIfAbsent(descriptor, (k) -> k); + return descriptor; } return null; }