package com.jetbrains.lang.dart.ide.template.macro;
import com.intellij.codeInsight.template.*;
import com.intellij.psi.PsiElement;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.lang.dart.psi.DartClass;
import com.jetbrains.lang.dart.psi.DartComponentName;
import com.jetbrains.lang.dart.util.DartClassResolveResult;
import com.jetbrains.lang.dart.util.DartRefactoringUtil;
import com.jetbrains.lang.dart.util.DartResolveUtil;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.Set;
public abstract class DartFilterByClassMacro extends Macro {
@Override
public Result calculateResult(@NotNull Expression[] params, ExpressionContext context) {
final PsiElement at = context.getPsiElementAtStartOffset();
final Set<DartComponentName> variables = DartRefactoringUtil.collectUsedComponents(at);
final List<DartComponentName> filtered = ContainerUtil.filter(variables, name -> {
final PsiElement nameParent = name.getParent();
if (nameParent instanceof DartClass) {
return false;
}
final DartClassResolveResult result = DartResolveUtil.getDartClassResolveResult(nameParent);
final DartClass dartClass = result.getDartClass();
return dartClass != null && filter(dartClass);
});
return filtered.isEmpty() ? null : new PsiElementResult(filtered.iterator().next());
}
protected abstract boolean filter(@NotNull DartClass dartClass);
}