From 85e30ec82cb4c7e6681ca2f0019eaf98bdba28bb Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 26 Jan 2011 18:44:14 +0100 Subject: [PATCH] for expected class types insert the parentheses (groovy) --- .../JavaClassNameInsertHandler.java | 18 +++++++--------- .../completion/JavaCompletionUtil.java | 13 ++++++++++++ .../GroovyClassNameInsertHandler.java | 21 ++++++++++++++----- .../completion/GroovyCompletionTest.groovy | 16 +++++++++++++- 4 files changed, 51 insertions(+), 17 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java index 735f28ab713e..91d463da7694 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java @@ -30,6 +30,9 @@ import com.intellij.psi.*; import com.intellij.psi.filters.FilterPositionUtil; import com.intellij.psi.javadoc.PsiDocTag; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.containers.hash.HashSet; + +import java.util.Set; /** * @author peter @@ -129,20 +132,13 @@ class JavaClassNameInsertHandler implements InsertHandler expectedTypes = new HashSet(); for (ExpectedTypeInfo info : ExpectedTypesProvider.getExpectedTypes((PsiExpression)prevElement.getParent(), true)) { - final PsiType type = info.getType(); - - if (info.isArrayTypeInfo()) { - return false; - } - - if (type instanceof PsiClassType && ((PsiClassType)type).rawType().isAssignableFrom(classType)) { - return true; - } + expectedTypes.add(info.getType()); } - return !JavaCompletionUtil.hasAccessibleInnerClass(psiClass, position); + + return JavaCompletionUtil.isDefinitelyExpected(psiClass, expectedTypes, position); } return false; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 15f529c6979f..1ed63329b999 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -1032,4 +1032,17 @@ public class JavaCompletionUtil { return true; } + + public static boolean isDefinitelyExpected(PsiClass psiClass, Set expectedTypes, PsiElement position) { + final PsiClassType classType = JavaPsiFacade.getElementFactory(psiClass.getProject()).createType(psiClass); + for (PsiType expectedType : expectedTypes) { + if (expectedType instanceof PsiArrayType) return false; + } + for (PsiType type : expectedTypes) { + if (type instanceof PsiClassType && ((PsiClassType)type).rawType().isAssignableFrom(classType)) { + return true; + } + } + return !hasAccessibleInnerClass(psiClass, position); + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java index 90813a2f10b8..7d9cbf7aa07a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java @@ -20,24 +20,29 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; +import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider; /** * @author Maxim.Medvedev */ public class GroovyClassNameInsertHandler implements InsertHandler { - public static boolean isReferenceInNewExpression(PsiElement reference) { - if (!(reference instanceof GrCodeReferenceElement)) return false; + @Nullable + private static GrNewExpression findNewExpression(@Nullable PsiElement position) { + if (position == null) return null; + final PsiElement reference = position.getParent(); + if (!(reference instanceof GrCodeReferenceElement)) return null; PsiElement parent = reference.getParent(); while (parent instanceof GrCodeReferenceElement) parent = parent.getParent(); if (parent instanceof GrAnonymousClassDefinition) parent = parent.getParent(); - return parent instanceof GrNewExpression; + return parent instanceof GrNewExpression ? (GrNewExpression)parent : null; } @Override @@ -51,7 +56,7 @@ public class GroovyClassNameInsertHandler implements InsertHandler" myFixture.completeBasic() - myFixture.checkResult "Zzoo l = new Zzoo" + myFixture.checkResult "Zzoo l = new Zzoo()" } public void testNothingAfterIntegerLiteral() { @@ -428,6 +428,20 @@ format""" myFixture.checkResult "def foo(@AbcdAnno ) {}" } + public void testParenthesesForExpectedClassTypeRegardlessInners() { + myFixture.addClass "class Fooooo { interface Bar {} }" + myFixture.configureByText "a.groovy", "Fooooo f = new Foo" + myFixture.completeBasic() + myFixture.checkResult "Fooooo f = new Fooooo()" + } + + public void testParenthesesForUnexpectedClassTypeRegardingInners() { + myFixture.addClass "class Fooooo { interface Bar {} }" + myFixture.configureByText "a.groovy", "Fooooo.Bar f = new Foo" + myFixture.completeBasic() + myFixture.checkResult "Fooooo.Bar f = new Fooooo" + } + public void testOnlyExceptionsInCatch() { myFixture.addClass "package foo; public class AbcdClass {}; public class AbcdException extends Throwable {}" myFixture.configureByText "a.groovy", "try {} catch (Abcd"