From 0d23833b3f7b99d3f74f0dc4add09e9fcc118cc1 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 28 Feb 2017 18:15:15 +0300 Subject: [PATCH] make allForLanguage() always include the ones for a baseLanguage --- .../lang/ExternalLanguageAnnotators.java | 9 ++----- .../com/intellij/lang/LanguageExtension.java | 25 +++++++++++++------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/platform/analysis-api/src/com/intellij/lang/ExternalLanguageAnnotators.java b/platform/analysis-api/src/com/intellij/lang/ExternalLanguageAnnotators.java index 35ec2354e236..0b3cfb09563c 100644 --- a/platform/analysis-api/src/com/intellij/lang/ExternalLanguageAnnotators.java +++ b/platform/analysis-api/src/com/intellij/lang/ExternalLanguageAnnotators.java @@ -27,7 +27,6 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.List; -import java.util.Set; public class ExternalLanguageAnnotators extends LanguageExtension { public static final ExtensionPointName> EP_NAME = ExtensionPointName.create("com.intellij.externalAnnotator"); @@ -40,12 +39,8 @@ public class ExternalLanguageAnnotators extends LanguageExtension allForFile(@NotNull Language language, @NotNull final PsiFile file) { - final Set annotators = ContainerUtil.newHashSet(); - while (language != null) { - annotators.addAll(INSTANCE.forKey(language)); - language = language.getBaseLanguage(); - } - final ExternalAnnotatorsFilter[] filters = Extensions.getExtensions(ExternalAnnotatorsFilter.EXTENSION_POINT_NAME); + List annotators = INSTANCE.allForLanguage(language); + ExternalAnnotatorsFilter[] filters = Extensions.getExtensions(ExternalAnnotatorsFilter.EXTENSION_POINT_NAME); return ContainerUtil.findAll(annotators, annotator -> { for (ExternalAnnotatorsFilter filter : filters) { if (filter.isProhibited(annotator, file)) { diff --git a/platform/core-api/src/com/intellij/lang/LanguageExtension.java b/platform/core-api/src/com/intellij/lang/LanguageExtension.java index b851f3a05dd6..f94c033acbbe 100644 --- a/platform/core-api/src/com/intellij/lang/LanguageExtension.java +++ b/platform/core-api/src/com/intellij/lang/LanguageExtension.java @@ -21,6 +21,7 @@ package com.intellij.lang; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.KeyedExtensionCollector; +import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -86,15 +87,25 @@ public class LanguageExtension extends KeyedExtensionCollector { * @see #allForLanguageOrAny(Language) */ @NotNull - public List allForLanguage(@NotNull Language l) { - List list = forKey(l); - if (list.isEmpty()) { - Language base = l.getBaseLanguage(); - if (base != null) { - return allForLanguage(base); + public List allForLanguage(@NotNull Language language) { + boolean copyList = true; + List result = null; + for (Language l = language; l != null; l = l.getBaseLanguage()) { + List list = forKey(l); + if (result == null) { + result = list; + } + else if (!list.isEmpty()) { + if (copyList) { + result = ContainerUtil.newArrayList(ContainerUtil.concat(result, list)); + copyList = false; + } + else { + result.addAll(list); + } } } - return list; + return result; } @NotNull