diff --git a/xml/impl/src/com/intellij/html/HtmlLineMarkerProvider.java b/xml/impl/src/com/intellij/html/HtmlLineMarkerProvider.java index ef2b29661806..5538f40b51f3 100644 --- a/xml/impl/src/com/intellij/html/HtmlLineMarkerProvider.java +++ b/xml/impl/src/com/intellij/html/HtmlLineMarkerProvider.java @@ -34,7 +34,7 @@ import java.util.Map; * @author Maxim.Mossienko */ public class HtmlLineMarkerProvider implements LineMarkerProvider { - private final Map embeddedLanguagesLineMarkerProviders = new THashMap<>(); + private final Map> embeddedLanguagesLineMarkerProviders = new THashMap<>(); @Override public LineMarkerInfo getLineMarkerInfo(@NotNull final PsiElement element) { @@ -42,29 +42,33 @@ public class HtmlLineMarkerProvider implements LineMarkerProvider { final Language language = element.getLanguage(); if (!(language instanceof XMLLanguage)) { - final LineMarkerProvider markerProvider = getLineMarkerProviderFromLanguage(language, embeddedLanguagesLineMarkerProviders); - - if (markerProvider != null) return markerProvider.getLineMarkerInfo(element); + List markerProviders = getAllLineMarkerProvidersForLanguage(language, embeddedLanguagesLineMarkerProviders); + for (LineMarkerProvider provider : markerProviders) { + LineMarkerInfo info = provider.getLineMarkerInfo(element); + if (info != null) { + return info; + } + } } return null; } - private static LineMarkerProvider getLineMarkerProviderFromLanguage(final Language language, - final Map embeddedLanguagesLineMarkerProviders) { - final LineMarkerProvider markerProvider; - - if (!embeddedLanguagesLineMarkerProviders.containsKey(language)) { - embeddedLanguagesLineMarkerProviders.put(language, markerProvider = LineMarkerProviders.INSTANCE.forLanguage(language)); + @NotNull + private static List getAllLineMarkerProvidersForLanguage( + @NotNull Language language, + @NotNull Map> embeddedLanguagesLineMarkerProviders + ) { + List markerProviders = embeddedLanguagesLineMarkerProviders.get(language); + if (markerProviders == null) { + markerProviders = LineMarkerProviders.INSTANCE.allForLanguage(language); + embeddedLanguagesLineMarkerProviders.put(language, markerProviders); } - else { - markerProvider = embeddedLanguagesLineMarkerProviders.get(language); - } - return markerProvider; + return markerProviders; } @Override public void collectSlowLineMarkers(@NotNull final List elements, @NotNull final Collection result) { - Map localEmbeddedLanguagesLineMarkerProviders = null; + Map> localEmbeddedLanguagesLineMarkerProviders = null; Map> embeddedLineMarkersWorkItems = null; for(PsiElement element:elements) { @@ -76,11 +80,11 @@ public class HtmlLineMarkerProvider implements LineMarkerProvider { localEmbeddedLanguagesLineMarkerProviders = new THashMap<>(); } - final LineMarkerProvider lineMarkerProvider = getLineMarkerProviderFromLanguage(language, localEmbeddedLanguagesLineMarkerProviders); - - if (lineMarkerProvider != null) { + List lineMarkerProviders = getAllLineMarkerProvidersForLanguage(language, + localEmbeddedLanguagesLineMarkerProviders); + for (LineMarkerProvider provider : lineMarkerProviders) { if (embeddedLineMarkersWorkItems == null) embeddedLineMarkersWorkItems = new THashMap<>(); - List elementList = embeddedLineMarkersWorkItems.computeIfAbsent(lineMarkerProvider, k -> new ArrayList<>(5)); + List elementList = embeddedLineMarkersWorkItems.computeIfAbsent(provider, k -> new ArrayList<>(5)); elementList.add(element); }