more on inst applicability in groovy

This commit is contained in:
peter
2011-09-13 10:17:47 +02:00
parent 31ee6b6479
commit 1d6bd69e35
2 changed files with 12 additions and 10 deletions
@@ -18,18 +18,18 @@ package org.jetbrains.plugins.groovy.template;
import com.intellij.codeInsight.template.EverywhereContextType;
import com.intellij.codeInsight.template.TemplateContextType;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.patterns.ElementPattern;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.GroovyFileType;
import org.jetbrains.plugins.groovy.lang.completion.GroovyCompletionData;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrIfStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
@@ -37,8 +37,6 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrRefere
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import static com.intellij.patterns.PsiJavaPatterns.psiElement;
/**
* @author peter
*/
@@ -95,10 +93,6 @@ public abstract class GroovyTemplateContextType extends TemplateContextType {
}
}
public static class Expression extends GroovyTemplateContextType {
private static final ElementPattern<PsiElement> INFIX_OPERATOR = psiElement().afterLeaf(
psiElement().inside(
psiElement(GrExpression.class).afterLeaf(
psiElement().withText("(").withParent(GrIfStatement.class))));
public Expression() {
super("GROOVY_EXPRESSION", "Expression", Generic.class);
@@ -120,8 +114,13 @@ public abstract class GroovyTemplateContextType extends TemplateContextType {
if (parent.getParent() instanceof GrCall) {
return false;
}
if (INFIX_OPERATOR.accepts(element)) {
return false;
ProcessingContext context = new ProcessingContext();
if (PlatformPatterns.psiElement().inside(GrExpression.class).afterLeaf(
PlatformPatterns.psiElement().inside(PlatformPatterns.psiElement(GrExpression.class).save("prevExpr"))).accepts(element, context)) {
PsiElement prevExpr = (PsiElement)context.get("prevExpr");
if (prevExpr.getTextRange().getEndOffset() <= element.getTextRange().getStartOffset()) {
return false;
}
}
return true;
}
@@ -49,7 +49,9 @@ public class GroovyLiveTemplatesTest extends LightCodeInsightFixtureTestCase{
assertFalse(isApplicable("class Foo {{ if (a inst<caret>) }}", template));
assertTrue(isApplicable("class Foo {{ inst<caret> }}", template));
assertTrue(isApplicable("inst<caret>", template));
assertTrue(isApplicable("<caret>inst", template));
assertFalse(isApplicable("class Foo {{ return (inst<caret>) }}", template));
assertFalse(isApplicable("class Foo {{ return a <caret>inst) }}", template));
}
public void testGroovyExpressionContext() throws Exception {
@@ -59,6 +61,7 @@ public class GroovyLiveTemplatesTest extends LightCodeInsightFixtureTestCase{
assertTrue(isApplicable("xxx<caret>", template));
assertTrue(isApplicable("<caret>xxx", template));
assertTrue(isApplicable("class Foo {{ return (toar<caret>) }}", template));
assertFalse(isApplicable("class Foo {{ return (xxx <caret>yyy) }}", template));
}
public void testGroovyDeclarationContext() throws Exception {