package org.angularjs.index; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiFile; import com.intellij.psi.XmlRecursiveElementWalkingVisitor; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.psi.xml.XmlFile; import com.intellij.util.indexing.DataIndexer; import com.intellij.util.indexing.FileContent; import org.angularjs.codeInsight.DirectiveUtil; import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.Map; /** * @author Irina.Chernushina on 3/17/2016. */ public class AngularAttributeIndexer implements DataIndexer<String, AngularNamedItemDefinition, FileContent> { private final String myAttributeName; public AngularAttributeIndexer(@NotNull final String attributeName) { myAttributeName = attributeName; } @NotNull @Override public Map<String, AngularNamedItemDefinition> map(@NotNull FileContent inputData) { final Map<String, AngularNamedItemDefinition> map = new HashMap<>(); final PsiFile file = inputData.getPsiFile(); if (file instanceof XmlFile) { file.accept( new XmlRecursiveElementWalkingVisitor() { @Override public void visitXmlAttribute(XmlAttribute attribute) { if (myAttributeName.equals(DirectiveUtil.normalizeAttributeName(attribute.getName()))) { final XmlAttributeValue element = attribute.getValueElement(); if (element == null) { map.put("", new AngularNamedItemDefinition("", attribute.getTextRange().getStartOffset())); } else { final String name = StringUtil.unquoteString(element.getText()); map.put(name, new AngularNamedItemDefinition(name, element.getTextRange().getStartOffset())); } } } } ); } return map; } }