diff --git a/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java b/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java index f087e17081d3..4dddf67e39bb 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java @@ -98,28 +98,7 @@ public abstract class JavaCodeContextType extends TemplateContextType { } private static boolean isStatementContext(PsiElement element) { - if (!(element.getParent() instanceof PsiReferenceExpression)) { - return false; - } - if (((PsiReferenceExpression)element.getParent()).isQualified()) { - return false; - } - - - if (element.getParent().getParent() instanceof PsiExpressionStatement) { - if ( - psiElement().afterLeaf( - psiElement().inside( - psiElement(PsiExpression.class).afterLeaf( - psiElement().withText("(").withParent(PsiIfStatement.class)))) - .accepts(element)) { - return false; - } - - return true; - } - - return false; + return Expression.isExpressionContext(element) && element.getParent().getParent() instanceof PsiExpressionStatement; } } public static class Expression extends JavaCodeContextType { @@ -129,6 +108,10 @@ public abstract class JavaCodeContextType extends TemplateContextType { @Override protected boolean isInContext(@NotNull PsiElement element) { + return isExpressionContext(element); + } + + private static boolean isExpressionContext(PsiElement element) { final PsiElement parent = element.getParent(); if (!(parent instanceof PsiReferenceExpression)) { return false; @@ -139,6 +122,14 @@ public abstract class JavaCodeContextType extends TemplateContextType { if (parent.getParent() instanceof PsiMethodCallExpression) { return false; } + if ( + psiElement().afterLeaf( + psiElement().inside( + psiElement(PsiExpression.class).afterLeaf( + psiElement().withText("(").withParent(PsiIfStatement.class)))) + .accepts(element)) { + return false; + } return true; } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateManager.java b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateManager.java index 960847206223..48d3d7eedba3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateManager.java @@ -17,9 +17,7 @@ package com.intellij.codeInsight.template; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; import com.intellij.util.PairProcessor; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -51,9 +49,6 @@ public abstract class TemplateManager { public abstract boolean startTemplate(@NotNull Editor editor, char shortcutChar); - public abstract TemplateContextType getContextType(@NotNull PsiFile file, int offset); - public abstract TemplateContextType getContextType(@NotNull FileType fileType); - public abstract Template createTemplate(@NotNull String key, String group); public abstract Template createTemplate(@NotNull String key, String group, @NonNls String text); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateManagerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateManagerImpl.java index 8d5ca7dbd943..ffbce303141f 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateManagerImpl.java @@ -430,11 +430,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo return result; } - public TemplateContextType getContextType(@NotNull PsiFile file, int offset) { - return getContextType(file, offset, null); - } - - private static TemplateContextType getContextType(@Nullable PsiFile file, int offset, @Nullable FileType fileType) { + private static boolean isEnabled(@Nullable PsiFile file, int offset, @Nullable FileType fileType, TemplateContext context) { LinkedHashSet set = new LinkedHashSet(); LinkedList contexts = buildOrderedContextTypes(); for (TemplateContextType contextType : contexts) { @@ -450,7 +446,13 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo continue removeBases; } } - return set.iterator().next(); + + for (TemplateContextType type : set) { + if (context.isEnabled(type)) { + return true; + } + } + return false; } } @@ -468,11 +470,6 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo return userDefinedExtensionsFirst; } - @Override - public TemplateContextType getContextType(@NotNull FileType fileType) { - return getContextType(null, 0, fileType); - } - public static TemplateContextType[] getAllContextTypes() { return Extensions.getExtensions(TemplateContextType.EP_NAME); } @@ -491,7 +488,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo public static boolean isApplicable(PsiFile file, int offset, TemplateImpl template) { TemplateManager instance = getInstance(file.getProject()); TemplateContext context = template.getTemplateContext(); - if (context.isEnabled(instance.getContextType(file, offset))) { + if (isEnabled(file, offset, null, context)) { return true; } @@ -499,7 +496,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo if (baseLanguage != file.getLanguage()) { PsiFile basePsi = file.getViewProvider().getPsi(baseLanguage); - if (basePsi != null && context.isEnabled(instance.getContextType(basePsi, offset))) { + if (basePsi != null && isEnabled(basePsi, offset, null, context)) { return true; } } @@ -508,7 +505,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo if (baseLanguageForBaseLanguage != null) { final LanguageFileType associatedFileType = baseLanguageForBaseLanguage.getAssociatedFileType(); if (associatedFileType != null && associatedFileType != file.getFileType()) { - if (context.isEnabled(instance.getContextType(associatedFileType))) { + if (isEnabled(null, 0, associatedFileType, context)) { return true; } } @@ -519,7 +516,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo if (offset > 0) { final Language prevLanguage = PsiUtilBase.getLanguageAtOffset(file, offset - 1); final PsiFile prevPsi = file.getViewProvider().getPsi(prevLanguage); - if (prevPsi != null && context.isEnabled(instance.getContextType(prevPsi, offset - 1))) { + if (prevPsi != null && isEnabled(prevPsi, offset - 1, null, context)) { return true; } }