package org.angularjs.codeInsight; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.xml.SchemaPrefix; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlTag; import com.intellij.xml.HtmlXmlExtension; import org.angularjs.index.AngularIndexUtil; import org.jetbrains.annotations.Nullable; /** * @author Dennis.Ushakov */ public class AngularJSHtmlExtension extends HtmlXmlExtension { @Override public boolean isAvailable(PsiFile file) { return super.isAvailable(file) && AngularIndexUtil.hasAngularJS(file.getProject()); } @Override public boolean isRequiredAttributeImplicitlyPresent(XmlTag tag, String attrName) { for (XmlAttribute attribute : tag.getAttributes()) { if (("ng-" + attrName).equals(DirectiveUtil.normalizeAttributeName(attribute.getName()))) { return true; } if (("[" + attrName + "]").equals(attribute.getName())) { return true; } } return super.isRequiredAttributeImplicitlyPresent(tag, attrName); } @Override public SchemaPrefix getPrefixDeclaration(XmlTag context, String namespacePrefix) { if ("ng".equals(namespacePrefix)) { SchemaPrefix attribute = findAttributeSchema(context, namespacePrefix, 0); if (attribute != null) return attribute; } if (namespacePrefix != null && (namespacePrefix.startsWith("(") || namespacePrefix.startsWith("["))) { SchemaPrefix attribute = findAttributeSchema(context, namespacePrefix, 1); if (attribute != null) return attribute; } return super.getPrefixDeclaration(context, namespacePrefix); } @Nullable private static SchemaPrefix findAttributeSchema(XmlTag context, String namespacePrefix, int offset) { for (XmlAttribute attribute : context.getAttributes()) { if (attribute.getName().startsWith(namespacePrefix)) { return new SchemaPrefix(attribute, TextRange.create(offset, namespacePrefix.length()), namespacePrefix.substring(offset)); } } return null; } }