package fr.adrienbrault.idea.symfony2plugin.dic.linemarker; import com.intellij.codeInsight.daemon.LineMarkerInfo; import com.intellij.codeInsight.daemon.LineMarkerProvider; import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder; import com.intellij.psi.PsiElement; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.config.yaml.YamlElementPatternHelper; import fr.adrienbrault.idea.symfony2plugin.dic.ContainerService; import fr.adrienbrault.idea.symfony2plugin.stubs.ServiceIndexUtil; import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceUtil; import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.yaml.psi.YAMLKeyValue; import java.util.Collection; import java.util.List; import java.util.Map; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class YamlLineMarkerProvider implements LineMarkerProvider { @Nullable private Map<String, Collection<ContainerService>> decoratedServiceCache; @Nullable @Override public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement psiElement) { return null; } @Override public void collectSlowLineMarkers(@NotNull List<PsiElement> psiElements, @NotNull Collection<LineMarkerInfo> result) { if(psiElements.size() == 0 || !Symfony2ProjectComponent.isEnabled(psiElements.get(0))) { return; } // services -> service_name psiElements.stream() .filter(psiElement -> psiElement instanceof YAMLKeyValue && YamlElementPatternHelper.getServiceIdKeyValuePattern().accepts(psiElement)) .forEach(psiElement -> visitServiceId((YAMLKeyValue) psiElement, result)); decoratedServiceCache = null; } private void visitServiceId(@NotNull YAMLKeyValue yamlKeyValue, @NotNull Collection<LineMarkerInfo> result) { String id = yamlKeyValue.getKeyText(); if(StringUtils.isBlank(id)) { return; } // decorates: @foobar String decorates = YamlHelper.getYamlKeyValueAsString(yamlKeyValue, "decorates"); if(StringUtils.isNotBlank(decorates)) { result.add(ServiceUtil.getLineMarkerForDecoratesServiceId(yamlKeyValue, decorates, result)); } if(this.decoratedServiceCache == null) { this.decoratedServiceCache = ServiceIndexUtil.getDecoratedServices(yamlKeyValue.getProject()); } NavigationGutterIconBuilder<PsiElement> lineMarker = ServiceUtil.getLineMarkerForDecoratedServiceId( yamlKeyValue.getProject(), this.decoratedServiceCache, id ); if(lineMarker == null) { return; } result.add(lineMarker.createLineMarkerInfo(yamlKeyValue)); } }