blob: 1d6e5bdad35a408af991f55ce1ef60b06a9afc8a [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.html;
import com.intellij.codeInsight.daemon.LineMarkerInfo;
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.psi.PsiElement;
import com.intellij.psi.PsiWhiteSpace;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* @author Maxim.Mossienko
* Date: Oct 14, 2008
* Time: 11:38:46 PM
*/
public class HtmlLineMarkerProvider implements LineMarkerProvider {
private final Map<Language, LineMarkerProvider> embeddedLanguagesLineMarkerProviders = new THashMap<Language, LineMarkerProvider>();
@Override
public LineMarkerInfo getLineMarkerInfo(@NotNull final PsiElement element) {
if (element instanceof PsiWhiteSpace) return null;
final Language language = element.getLanguage();
if (!(language instanceof XMLLanguage)) {
final LineMarkerProvider markerProvider = getLineMarkerProviderFromLanguage(language, embeddedLanguagesLineMarkerProviders);
if (markerProvider != null) return markerProvider.getLineMarkerInfo(element);
}
return null;
}
private static LineMarkerProvider getLineMarkerProviderFromLanguage(final Language language,
final Map<Language, LineMarkerProvider> embeddedLanguagesLineMarkerProviders) {
final LineMarkerProvider markerProvider;
if (!embeddedLanguagesLineMarkerProviders.containsKey(language)) {
embeddedLanguagesLineMarkerProviders.put(language, markerProvider = LineMarkerProviders.INSTANCE.forLanguage(language));
} else {
markerProvider = embeddedLanguagesLineMarkerProviders.get(language);
}
return markerProvider;
}
@Override
public void collectSlowLineMarkers(@NotNull final List<PsiElement> elements, @NotNull final Collection<LineMarkerInfo> result) {
Map<Language, LineMarkerProvider> localEmbeddedLanguagesLineMarkerProviders = null;
Map<LineMarkerProvider, List<PsiElement>> embeddedLineMarkersWorkItems = null;
for(PsiElement element:elements) {
if(element instanceof PsiWhiteSpace) continue;
final Language language = element.getLanguage();
if (!(language instanceof XMLLanguage)) {
if(localEmbeddedLanguagesLineMarkerProviders == null) {
localEmbeddedLanguagesLineMarkerProviders = new THashMap<Language, LineMarkerProvider>();
}
final LineMarkerProvider lineMarkerProvider = getLineMarkerProviderFromLanguage(language, localEmbeddedLanguagesLineMarkerProviders);
if (lineMarkerProvider != null) {
if (embeddedLineMarkersWorkItems == null) embeddedLineMarkersWorkItems = new THashMap<LineMarkerProvider, List<PsiElement>>();
List<PsiElement> elementList = embeddedLineMarkersWorkItems.get(lineMarkerProvider);
if (elementList == null) {
elementList = new ArrayList<PsiElement>(5);
embeddedLineMarkersWorkItems.put(lineMarkerProvider, elementList);
}
elementList.add(element);
}
}
}
if (embeddedLineMarkersWorkItems != null) {
for(Map.Entry<LineMarkerProvider, List<PsiElement>> entry:embeddedLineMarkersWorkItems.entrySet()) {
entry.getKey().collectSlowLineMarkers(entry.getValue(), result);
}
}
}
}