diff --git a/platform/core-api/src/com/intellij/openapi/editor/markup/TextAttributesEffectsBuilder.java b/platform/core-api/src/com/intellij/openapi/editor/markup/TextAttributesEffectsBuilder.java index f5b1bc17f2fc..c84932099cae 100644 --- a/platform/core-api/src/com/intellij/openapi/editor/markup/TextAttributesEffectsBuilder.java +++ b/platform/core-api/src/com/intellij/openapi/editor/markup/TextAttributesEffectsBuilder.java @@ -8,8 +8,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; -import java.util.List; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; import java.util.function.BiConsumer; import static com.intellij.openapi.editor.markup.EffectType.*; @@ -109,14 +111,6 @@ public class TextAttributesEffectsBuilder { return this; } - /** - * @return list of descriptors of current effects - */ - @NotNull - List getDescriptorsList() { - return myEffectsMap.isEmpty() ? ContainerUtil.emptyList() : new ArrayList<>(myEffectsMap.values()); - } - /** * @return map of {@link EffectType} => {@link Color} representation of builder state */ @@ -138,22 +132,34 @@ public class TextAttributesEffectsBuilder { * Applies effects from the current state to the target attributes * * @param targetAttributes passed targetAttributes + * @apiNote this method is not a thread safe, builder can't be modified in some other thread when applying to something */ @NotNull public TextAttributes applyTo(@NotNull final TextAttributes targetAttributes) { - List allEffects = getDescriptorsList(); - if (allEffects.isEmpty()) { + Iterator effectsIterator = myEffectsMap.values().iterator(); + if (!effectsIterator.hasNext()) { targetAttributes.setEffectColor(null); targetAttributes.setEffectType(BOXED); targetAttributes.setAdditionalEffects(Collections.emptyMap()); } else { - Map effectsMap = new HashMap<>(); - EffectDescriptor mainEffectDescriptor = allEffects.remove(0); + EffectDescriptor mainEffectDescriptor = effectsIterator.next(); targetAttributes.setEffectType(mainEffectDescriptor.effectType); targetAttributes.setEffectColor(mainEffectDescriptor.effectColor); - allEffects.forEach(it -> effectsMap.put(it.effectType, it.effectColor)); - targetAttributes.setAdditionalEffects(effectsMap); + + int effectsLeft = myEffectsMap.size() - 1; + if (effectsLeft == 0) { + targetAttributes.setAdditionalEffects(Collections.emptyMap()); + } + else if (effectsLeft == 1) { + EffectDescriptor additionalEffect = effectsIterator.next(); + targetAttributes.setAdditionalEffects(Collections.singletonMap(additionalEffect.effectType, additionalEffect.effectColor)); + } + else { + Map effectsMap = new HashMap<>(effectsLeft); + effectsIterator.forEachRemaining(it -> effectsMap.put(it.effectType, it.effectColor)); + targetAttributes.setAdditionalEffects(effectsMap); + } } return targetAttributes; }