package com.jetbrains.lang.dart; import com.intellij.icons.AllIcons; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.lang.dart.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; public enum DartComponentType { CLASS(AllIcons.Nodes.Class) { @Override public Icon getIcon(@NotNull DartComponent component) { return component instanceof DartEnumDefinition ? AllIcons.Nodes.Enum : component.isAbstract() ? AllIcons.Nodes.AbstractClass : getIcon(); } }, FUNCTION(AllIcons.Nodes.Function) { @Override public Icon getIcon(@NotNull DartComponent component) { if (component.isGetter()) { return AllIcons.Nodes.PropertyReadStatic; } if (component.isSetter()) { return AllIcons.Nodes.PropertyWriteStatic; } return getIcon(); } }, METHOD(AllIcons.Nodes.Method) { @Override public Icon getIcon(@NotNull DartComponent component) { if (component.isGetter()) { return component.isStatic() ? AllIcons.Nodes.PropertyReadStatic : AllIcons.Nodes.PropertyRead; } if (component.isSetter()) { return component.isStatic() ? AllIcons.Nodes.PropertyWriteStatic : AllIcons.Nodes.PropertyWrite; } return component.isAbstract() ? AllIcons.Nodes.AbstractMethod : getIcon(); } }, VARIABLE(AllIcons.Nodes.Variable), FIELD(AllIcons.Nodes.Field), PARAMETER(AllIcons.Nodes.Parameter), TYPEDEF(AllIcons.Nodes.Annotationtype), CONSTRUCTOR(AllIcons.Nodes.Method), OPERATOR(AllIcons.Nodes.ClassInitializer), LABEL(AllIcons.Nodes.Variable); private final Icon myIcon; DartComponentType(final Icon icon) { myIcon = icon; } public int getKey() { return ordinal(); } public Icon getIcon() { return myIcon; } public Icon getIcon(@NotNull DartComponent component) { // Overridden in appropriate subclasses return getIcon(); } @Nullable public static DartComponentType valueOf(int key) { return key >= 0 && key < values().length ? values()[key] : null; } @Nullable public static DartComponentType typeOf(@Nullable PsiElement element) { if (element instanceof DartComponentName) { return typeOf(element.getParent()); } if ((element instanceof DartComponent && PsiTreeUtil.getParentOfType(element, DartNormalFormalParameter.class, false) != null) || element instanceof DartNormalFormalParameter) { return PARAMETER; } if (element instanceof DartClass) { return CLASS; } if (element instanceof DartEnumConstantDeclaration) { return FIELD; } if (element instanceof DartFunctionTypeAlias) { return TYPEDEF; } if (element instanceof DartNamedConstructorDeclaration || element instanceof DartFactoryConstructorDeclaration) { return CONSTRUCTOR; } if (element instanceof DartFunctionFormalParameter || element instanceof DartFunctionDeclarationWithBody || element instanceof DartFunctionDeclarationWithBodyOrNative || element instanceof DartFunctionExpression) { return FUNCTION; } if (element instanceof DartGetterDeclaration || element instanceof DartSetterDeclaration) { final PsiElement dartClassCandidate = PsiTreeUtil.getParentOfType(element, DartComponent.class); return dartClassCandidate instanceof DartClass ? METHOD : FUNCTION; } if (element instanceof DartMethodDeclaration) { if (((DartMethodDeclaration)element).isOperator()) { return OPERATOR; } final DartClass dartClass = PsiTreeUtil.getParentOfType(element, DartClass.class); final String dartClassName = dartClass != null ? dartClass.getName() : null; return dartClassName != null && dartClassName.equals(((DartComponent)element).getName()) ? CONSTRUCTOR : METHOD; } if (element instanceof DartVarAccessDeclaration || element instanceof DartVarDeclarationListPart) { return PsiTreeUtil.getParentOfType(element, DartComponent.class) instanceof DartClass ? FIELD : VARIABLE; } if (element instanceof DartForInPart) { return VARIABLE; } if (element instanceof DartLabel) { return LABEL; } return null; } }