package com.jetbrains.lang.dart.ide.template.macro;
import com.google.common.annotations.VisibleForTesting;
import com.intellij.codeInsight.template.Expression;
import com.intellij.codeInsight.template.ExpressionContext;
import com.intellij.codeInsight.template.Result;
import com.intellij.codeInsight.template.TextResult;
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;
public class DartMethodNameMacro extends DartMacroBase {
@Override
public String getName() {
return "dartMethodName";
}
@Override
public Result calculateResult(@NotNull Expression[] params, final ExpressionContext context) {
final String containingFunctionName = getContainingFunctionName(context.getPsiElementAtStartOffset());
return containingFunctionName == null ? null : new TextResult(containingFunctionName);
}
@VisibleForTesting
@Nullable
public String getContainingFunctionName(@Nullable final PsiElement element) {
if (element == null) return null;
final DartComponent parent = PsiTreeUtil.getParentOfType(element,
DartGetterDeclaration.class,
DartSetterDeclaration.class,
DartFunctionDeclarationWithBodyOrNative.class,
DartFactoryConstructorDeclaration.class,
DartNamedConstructorDeclaration.class,
DartMethodDeclaration.class,
DartFunctionDeclarationWithBody.class);
if (parent == null) return null;
final DartComponentName componentName = parent.getComponentName();
return componentName == null ? null : componentName.getName();
}
}