diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ClassMapCachingNulls.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ClassMapCachingNulls.java index e852278b8e0d..58885b674497 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ClassMapCachingNulls.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ClassMapCachingNulls.java @@ -16,22 +16,27 @@ package com.intellij.psi.impl.source.tree.injected; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.JBIterable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; public class ClassMapCachingNulls { private final Map myBackingMap; private final T[] myEmptyArray; + private final List myOrderingArray; private final Map myMap = ContainerUtil.newConcurrentMap(); - public ClassMapCachingNulls(@NotNull Map backingMap, T[] emptyArray) { + public ClassMapCachingNulls(@NotNull Map backingMap, T[] emptyArray, @NotNull List orderingArray) { myBackingMap = backingMap; myEmptyArray = emptyArray; + myOrderingArray = orderingArray; } @Nullable @@ -64,29 +69,29 @@ public class ClassMapCachingNulls { return value; } + @Nullable private List getFromBackingMap(Class aClass) { T[] value = myBackingMap.get(aClass); - List result = null; + Set result = null; if (value != null) { assert value.length != 0; - result = new ArrayList<>(Arrays.asList(value)); + result = new HashSet<>(Arrays.asList(value)); } - for (final Class aClass1 : aClass.getInterfaces()) { - result = addFromUpper(result, aClass1); - } - final Class superclass = aClass.getSuperclass(); - if (superclass != null) { + for (final Class superclass : JBIterable.of(aClass.getSuperclass()).append(aClass.getInterfaces())) { result = addFromUpper(result, superclass); } - return result; + + if (result == null) return null; + final Set _result = result; + return myOrderingArray.stream().filter(_result::contains).collect(Collectors.toList()); } - private List addFromUpper(List value, Class superclass) { + private Set addFromUpper(Set value, Class superclass) { T[] fromUpper = get(superclass); if (fromUpper != null) { assert fromUpper.length != 0; if (value == null) { - value = new ArrayList<>(fromUpper.length); + value = new HashSet<>(fromUpper.length); } for (T t : fromUpper) { if (!value.contains(t)) { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java index 482ea972df93..ccefc4b8ac96 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java @@ -241,7 +241,7 @@ public class InjectedLanguageManagerImpl extends InjectedLanguageManager impleme } } - ClassMapCachingNulls result = new ClassMapCachingNulls<>(injectors, new MultiHostInjector[0]); + ClassMapCachingNulls result = new ClassMapCachingNulls<>(injectors, new MultiHostInjector[0], allInjectors); cachedInjectors = result; return result; } diff --git a/plugins/IntelliLang/src/META-INF/plugin.xml b/plugins/IntelliLang/src/META-INF/plugin.xml index 51515dbf5a86..a9789064a1f2 100644 --- a/plugins/IntelliLang/src/META-INF/plugin.xml +++ b/plugins/IntelliLang/src/META-INF/plugin.xml @@ -45,8 +45,8 @@ - - + + - +