From 925cc2fba6873d7973d918558204e9f8a85551cd Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 8 Mar 2011 19:48:31 +0100 Subject: [PATCH] [ and < to finish completion in groovy (IDEA-40461) --- .../completion/JavaCharFilter.java | 24 ++++++++------- .../completion/GroovyReferenceCharFilter.java | 11 +++++-- .../completion/GroovyCompletionTest.groovy | 30 +++++++++++++++++++ 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java index db9f107d87df..769476ab91d4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java @@ -41,22 +41,24 @@ public class JavaCharFilter extends CharFilter { public Result acceptChar(char c, final int prefixLength, final Lookup lookup) { if (!lookup.isCompletion()) return null; + if (!(lookup.getPsiFile() instanceof PsiJavaFile)) { + return null; + } + LookupElement item = lookup.getCurrentItem(); if (item == null) return null; if (c == '!') { - if (lookup.getPsiFile() instanceof PsiJavaFile) { - final Object o = item.getObject(); - if (o instanceof PsiVariable) { - if (PsiType.BOOLEAN.isAssignableFrom(((PsiVariable)o).getType())) return Result.SELECT_ITEM_AND_FINISH_LOOKUP; - } - if (o instanceof PsiMethod) { - final PsiType type = ((PsiMethod)o).getReturnType(); - if (type != null && PsiType.BOOLEAN.isAssignableFrom(type)) return Result.SELECT_ITEM_AND_FINISH_LOOKUP; - } - - return null; + final Object o = item.getObject(); + if (o instanceof PsiVariable) { + if (PsiType.BOOLEAN.isAssignableFrom(((PsiVariable)o).getType())) return Result.SELECT_ITEM_AND_FINISH_LOOKUP; } + if (o instanceof PsiMethod) { + final PsiType type = ((PsiMethod)o).getReturnType(); + if (type != null && PsiType.BOOLEAN.isAssignableFrom(type)) return Result.SELECT_ITEM_AND_FINISH_LOOKUP; + } + + return null; } if (c == '.' && isWithinLiteral(lookup)) return Result.ADD_TO_PREFIX; if (c == '[') return CharFilter.Result.SELECT_ITEM_AND_FINISH_LOOKUP; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java index 3f82af576b82..01192094320b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java @@ -17,6 +17,8 @@ package org.jetbrains.plugins.groovy.lang.completion; import com.intellij.codeInsight.lookup.CharFilter; import com.intellij.codeInsight.lookup.Lookup; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; @@ -30,12 +32,15 @@ public class GroovyReferenceCharFilter extends CharFilter { final PsiFile psiFile = lookup.getPsiFile(); if (psiFile != null && !psiFile.getViewProvider().getLanguages().contains(GroovyFileType.GROOVY_LANGUAGE)) return null; + LookupElement item = lookup.getCurrentItem(); + if (item == null) return null; + if (Character.isJavaIdentifierPart(c) || c == '\'') { return Result.ADD_TO_PREFIX; } - if (c == '\n' || c == '\t') { - return Result.SELECT_ITEM_AND_FINISH_LOOKUP; - } + + if (c == '[') return CharFilter.Result.SELECT_ITEM_AND_FINISH_LOOKUP; + if (c == '<' && item.getObject() instanceof PsiClass) return Result.SELECT_ITEM_AND_FINISH_LOOKUP; return null; } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy index 76df8dd40eed..34b817f0be9f 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy @@ -604,4 +604,34 @@ return fo""" def foo(def a) {2} return foo()""" } + + void checkCompletion(String before, String type, String after) { + myFixture.configureByText("a.groovy", before) + myFixture.completeBasic() + myFixture.type(type) + myFixture.checkResult(after) + } + + public void testFinishClassNameWithSquareBracket() { + myFixture.addClass("class AbcdClass {}; class AbcdeClass {}") + checkCompletion("Abcd", '[', "AbcdClass[]") + } + + public void testFinishMethodNameWithSquareBracket() { + myFixture.addClass("""class AbcdClass { + static int[] foo(int x){} + static int[] fobar(){} + }""") + checkCompletion("AbcdClass.fo", '[', "AbcdClass.fobar()[]") + } + + public void testFinishVariableNameWithSquareBracket() { + checkCompletion("int[] fooo, foobar; foo", '[', "int[] fooo, foobar; foobar[]") + } + + public void testFinishClassNameWithLt() { + myFixture.addClass("class AbcdClass {}; class AbcdeClass {}") + checkCompletion("Abcd", '<', "AbcdClass<>") + } + } \ No newline at end of file