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 DartMethodReturnTypeMacro extends DartMacroBase {
@Override
public String getName() {
return "dartReturnType";
}
@Nullable
@Override
public Result calculateResult(@NotNull final Expression[] params, final ExpressionContext context) {
final String returnType = getContainingFunctionReturnType(context.getPsiElementAtStartOffset());
return returnType == null ? null : new TextResult(returnType);
}
@VisibleForTesting
@Nullable
public String getContainingFunctionReturnType(@Nullable final PsiElement element) {
if (element == null) return null;
final DartComponent parent = PsiTreeUtil.getParentOfType(element,
DartGetterDeclaration.class,
DartFunctionDeclarationWithBodyOrNative.class,
DartMethodDeclaration.class,
DartFunctionDeclarationWithBody.class);
if (parent instanceof DartGetterDeclaration) {
return getReturnTypeString(((DartGetterDeclaration)parent).getReturnType());
}
if (parent instanceof DartMethodDeclaration) {
return getReturnTypeString(((DartMethodDeclaration)parent).getReturnType());
}
if (parent instanceof DartFunctionDeclarationWithBodyOrNative) {
return getReturnTypeString(((DartFunctionDeclarationWithBodyOrNative)parent).getReturnType());
}
if (parent instanceof DartFunctionDeclarationWithBody) {
return getReturnTypeString(((DartFunctionDeclarationWithBody)parent).getReturnType());
}
return null;
}
private static String getReturnTypeString(@Nullable final DartReturnType returnType) {
return returnType == null ? null : returnType.getText();
}
}