From 91fb0a03ac70807e6007cca1ac2c89adcde420aa Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 11 Sep 2014 18:32:16 +0200 Subject: [PATCH] a special tail type when smart-completing something in a parenthesized expression (IDEA-129485) --- .../codeInsight/ExpectedTypesProvider.java | 28 +++++++++++++++---- .../com/intellij/codeInsight/TailTypes.java | 6 ++++ .../NoSemicolonInsideParentheses-out.java | 7 +++++ .../NoSemicolonInsideParentheses.java | 7 +++++ .../completion/SmartTypeCompletionTest.java | 2 ++ 5 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/NoSemicolonInsideParentheses-out.java create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/NoSemicolonInsideParentheses.java diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index 08a071231410..0bf1c1cd7218 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -31,7 +31,10 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.psi.search.searches.DeepestSuperMethodsSearch; import com.intellij.psi.tree.IElementType; -import com.intellij.psi.util.*; +import com.intellij.psi.util.PropertyUtil; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.NullableFunction; import com.intellij.util.Processor; @@ -126,10 +129,6 @@ public class ExpectedTypesProvider { final boolean voidable, boolean usedAfter) { if (expr == null) return ExpectedTypeInfo.EMPTY_ARRAY; PsiElement parent = expr.getParent(); - while (parent instanceof PsiParenthesizedExpression) { - expr = (PsiExpression)parent; - parent = parent.getParent(); - } MyParentVisitor visitor = new MyParentVisitor(expr, forCompletion, classProvider, voidable, usedAfter); if (parent != null) { parent.accept(visitor); @@ -242,6 +241,25 @@ public class ExpectedTypesProvider { return myResult.toArray(new ExpectedTypeInfo[myResult.size()]); } + @Override + public void visitParenthesizedExpression(PsiParenthesizedExpression expression) { + PsiElement parent = expression.getParent(); + if (parent != null) { + final MyParentVisitor visitor = new MyParentVisitor(expression, myForCompletion, myClassProvider, myVoidable, myUsedAfter); + parent.accept(visitor); + for (final ExpectedTypeInfo info : visitor.myResult) { + myResult.add(createInfoImpl(info.getType(), info.getKind(), info.getDefaultType(), TailTypes.RPARENTH, info.getCalledMethod(), + new NullableComputable() { + @Nullable + @Override + public String compute() { + return ((ExpectedTypeInfoImpl)info).getExpectedName(); + } + })); + } + } + } + @Override public void visitAnnotationMethod(@NotNull final PsiAnnotationMethod method) { if (myExpr == method.getDefaultValue()) { diff --git a/java/java-impl/src/com/intellij/codeInsight/TailTypes.java b/java/java-impl/src/com/intellij/codeInsight/TailTypes.java index 923dd8213019..244067bd3f36 100644 --- a/java/java-impl/src/com/intellij/codeInsight/TailTypes.java +++ b/java/java-impl/src/com/intellij/codeInsight/TailTypes.java @@ -28,6 +28,12 @@ public class TailTypes { return styleSettings.SPACE_WITHIN_METHOD_CALL_PARENTHESES && editor.getDocument().getCharsSequence().charAt(tailOffset - 1) != '('; } }; + public static final TailType RPARENTH = new RParenthTailType(){ + @Override + protected boolean isSpaceWithinParentheses(final CommonCodeStyleSettings styleSettings, final Editor editor, final int tailOffset) { + return styleSettings.SPACE_WITHIN_PARENTHESES; + } + }; public static final TailType IF_RPARENTH = new RParenthTailType(){ @Override protected boolean isSpaceWithinParentheses(final CommonCodeStyleSettings styleSettings, final Editor editor, final int tailOffset) { diff --git a/java/java-tests/testData/codeInsight/completion/smartType/NoSemicolonInsideParentheses-out.java b/java/java-tests/testData/codeInsight/completion/smartType/NoSemicolonInsideParentheses-out.java new file mode 100644 index 000000000000..3199c94ee908 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/NoSemicolonInsideParentheses-out.java @@ -0,0 +1,7 @@ +public class MyAspect { + + public void foo() { + String nameToUse = /*adjustName*/(toString()); //todo + } + +} diff --git a/java/java-tests/testData/codeInsight/completion/smartType/NoSemicolonInsideParentheses.java b/java/java-tests/testData/codeInsight/completion/smartType/NoSemicolonInsideParentheses.java new file mode 100644 index 000000000000..30c2f7d757af --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/NoSemicolonInsideParentheses.java @@ -0,0 +1,7 @@ +public class MyAspect { + + public void foo() { + String nameToUse = /*adjustName*/(to); //todo + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java index 967de28820e8..2db5b7fbbfea 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java @@ -701,6 +701,8 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { doTest(); } + public void testNoSemicolonInsideParentheses() { doTest(); } + public void testAssignFromTheSameFieldOfAnotherObject() throws Throwable { doTest(); }