package com.jetbrains.lang.dart.psi.impl;
import com.intellij.icons.AllIcons;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.NavigationItem;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.ui.RowIcon;
import com.intellij.util.PlatformIcons;
import com.jetbrains.lang.dart.psi.*;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
abstract public class DartFunctionExpressionBase extends DartExpressionImpl {
private static final RowIcon ICON = new RowIcon(AllIcons.Nodes.Function, PlatformIcons.PRIVATE_ICON);
public DartFunctionExpressionBase(ASTNode node) {
super(node);
}
@Override
public Icon getIcon(int flags) {
return ICON;
}
@Override
public ItemPresentation getPresentation() {
// Hard to believe there is no marker interface to identify a declaration that contains executable code...
// TODO: Create one! Executable code marker, that is.
final PsiElement parent = PsiTreeUtil.getParentOfType(this, DartFunctionExpressionBase.class, DartMethodDeclaration.class,
DartFunctionDeclarationWithBodyOrNative.class,
DartFactoryConstructorDeclaration.class,
DartNamedConstructorDeclaration.class, DartFunctionDeclarationWithBody.class,
DartGetterDeclaration.class, DartSetterDeclaration.class);
if (parent != null) {
return new ItemPresentation() {
@Nullable
@Override
public String getPresentableText() {
ItemPresentation container = ((NavigationItem)parent).getPresentation();
return container == null ? null : "() in " + container.getPresentableText();
}
@Nullable
@Override
public String getLocationString() {
ItemPresentation container = ((NavigationItem)parent).getPresentation();
return container == null ? null : container.getLocationString();
}
@Nullable
@Override
public Icon getIcon(boolean unused) {
return DartFunctionExpressionBase.this.getIcon(0);
}
};
}
return null;
}
}