prevent SOE when a non-xml language has HTML base language (EA-120937)

The following case is addressed: https://plugins.jetbrains.com/plugin/10253-illuminated-cloud-2 plugin has
"com.illuminatedcloud.intellij.EmbeddedMarkupLanguage extends Language" with "HTML" base language. Also, there is "com.illuminatedcloud.intellij.editor.EmbeddedMarkupLineMarkerProvider extends HtmlLineMarkerProvider", which was probably added to prevent SOA previously.
This commit is contained in:
Sergey Simonchik
2018-05-23 18:39:22 +03:00
parent 6cc97299ca
commit bc03062f24
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.daemon.LineMarkerProvider;
import com.intellij.codeInsight.daemon.LineMarkerProviders;
import com.intellij.lang.Language;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.util.containers.ContainerUtil;
@@ -37,8 +36,6 @@ import java.util.Map;
*/
public class HtmlLineMarkerProvider implements LineMarkerProvider {
private static final Logger LOG = Logger.getInstance(HtmlLineMarkerProvider.class);
private final Map<Language, List<LineMarkerProvider>> embeddedLanguagesLineMarkerProviders = ContainerUtil.newConcurrentMap();
@Override
@@ -49,10 +46,7 @@ public class HtmlLineMarkerProvider implements LineMarkerProvider {
if (!(language instanceof XMLLanguage)) {
List<LineMarkerProvider> markerProviders = getAllLineMarkerProvidersForLanguage(language, embeddedLanguagesLineMarkerProviders);
for (LineMarkerProvider provider : markerProviders) {
if (provider == this) {
LOG.error("Found " + HtmlLineMarkerProvider.class.getName() + " in " + LineMarkerProviders.EP_NAME + " for " + language);
continue;
}
if (provider instanceof HtmlLineMarkerProvider) continue;
LineMarkerInfo info = provider.getLineMarkerInfo(element);
if (info != null) {
return info;
@@ -92,6 +86,7 @@ public class HtmlLineMarkerProvider implements LineMarkerProvider {
List<LineMarkerProvider> lineMarkerProviders = getAllLineMarkerProvidersForLanguage(language,
localEmbeddedLanguagesLineMarkerProviders);
for (LineMarkerProvider provider : lineMarkerProviders) {
if (provider instanceof HtmlLineMarkerProvider) continue;
if (embeddedLineMarkersWorkItems == null) embeddedLineMarkersWorkItems = new THashMap<>();
List<PsiElement> elementList = embeddedLineMarkersWorkItems.computeIfAbsent(provider, k -> new ArrayList<>(5));