expression-statement applicability conflict resolved

This commit is contained in:
peter
2011-09-06 09:03:41 +02:00
parent 3ffbe0e0bf
commit 736daa2cd7
3 changed files with 25 additions and 42 deletions
@@ -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;
}
}
@@ -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);
@@ -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<TemplateContextType> set = new LinkedHashSet<TemplateContextType>();
LinkedList<TemplateContextType> 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;
}
}