package com.jetbrains.lang.dart.ide.template; import com.intellij.codeInsight.template.EverywhereContextType; import com.intellij.codeInsight.template.TemplateContextType; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.lang.dart.DartBundle; import com.jetbrains.lang.dart.DartLanguage; import com.jetbrains.lang.dart.highlight.DartSyntaxHighlighter; import com.jetbrains.lang.dart.psi.IDartBlock; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public abstract class DartTemplateContextType extends TemplateContextType { protected DartTemplateContextType(@NotNull @NonNls String id, @NotNull String presentableName, @Nullable Class<? extends TemplateContextType> baseContextType) { super(id, presentableName, baseContextType); } @Override public boolean isInContext(@NotNull PsiFile file, int offset) { if (file.getLanguage() instanceof DartLanguage) { PsiElement element = file.findElementAt(offset); return element != null && isInContext(element); } return false; } protected abstract boolean isInContext(@NotNull PsiElement element); @Nullable @Override public SyntaxHighlighter createHighlighter() { return new DartSyntaxHighlighter(); } public static class Generic extends DartTemplateContextType { public Generic() { super("DART", DartBundle.message("dart.language.id"), EverywhereContextType.class); } @Override protected boolean isInContext(@NotNull PsiElement element) { return true; } } public static class Statement extends DartTemplateContextType { public Statement() { super("DART_STATEMENT", "Statement", Generic.class); } @Override protected boolean isInContext(@NotNull PsiElement element) { return PsiTreeUtil.getNonStrictParentOfType(element, IDartBlock.class, PsiComment.class) instanceof IDartBlock; } } }