package org.angularjs.codeInsight.attributes;
import com.intellij.lang.javascript.psi.stubs.JSImplicitElement;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.xml.XmlAttribute;
import org.angularjs.codeInsight.DirectiveUtil;
import org.angularjs.index.AngularControllerIndex;
import org.angularjs.index.AngularDirectivesDocIndex;
import org.angularjs.index.AngularIndexUtil;
import org.angularjs.index.AngularModuleIndex;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Dennis.Ushakov
*/
public class AngularAttributesRegistry {
static AngularAttributeDescriptor createDescriptor(@Nullable final Project project,
@NotNull String directiveName,
@Nullable PsiElement declaration) {
if ("ng-controller".equals(directiveName)) {
return new AngularAttributeDescriptor(project, directiveName, AngularControllerIndex.KEY, declaration);
}
if ("ng-app".equals(directiveName)) {
return new AngularAttributeDescriptor(project, directiveName, AngularModuleIndex.KEY, declaration);
}
return new AngularAttributeDescriptor(project, directiveName, null, declaration);
}
public static boolean isAngularExpressionAttribute(XmlAttribute parent) {
final String attributeName = DirectiveUtil.normalizeAttributeName(parent.getName());
final JSImplicitElement directive = AngularIndexUtil.resolve(parent.getProject(), AngularDirectivesDocIndex.KEY, attributeName);
if (directive != null) {
final String restrict = directive.getTypeString();
final String param = restrict != null ? restrict.split(";", -1)[2] : "";
return param.endsWith("expression") || param.startsWith("string");
}
return false;
}
public static boolean isJSONAttribute(XmlAttribute parent) {
final String value = parent.getValue();
if (value == null || !value.startsWith("{")) return false;
final String attributeName = DirectiveUtil.normalizeAttributeName(parent.getName());
final JSImplicitElement directive = AngularIndexUtil.resolve(parent.getProject(), AngularDirectivesDocIndex.KEY, attributeName);
if (directive != null) {
final String restrict = directive.getTypeString();
final String type = restrict != null ? restrict.split(";", -1)[2] : "";
return type.contains("object literal") || type.equals("mixed");
}
return false;
}
public static boolean isEventAttribute(String name, Project project) {
return name.startsWith("(") && name.endsWith(")") && AngularIndexUtil.hasAngularJS2(project);
}
public static boolean isVariableAttribute(String name, Project project) {
return name.startsWith("#") && AngularIndexUtil.hasAngularJS2(project);
}
public static boolean isTemplateAttribute(String name, Project project) {
return name.startsWith("*") && AngularIndexUtil.hasAngularJS2(project);
}
public static boolean isBindingAttribute(String name, Project project) {
return name.startsWith("[") && name.endsWith("]") && AngularIndexUtil.hasAngularJS2(project);
}
}