From 915cf66ef32022e1dcf24ad3bee399432db3309a Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 31 Aug 2010 19:27:58 +0100 Subject: [PATCH] don't qualify magic method calls unless it's really needed. qualify instance magic methods with 'this' --- .../completion/JavaMethodCallElement.java | 18 ++++++++++----- ...ethodTypeParametersFromSuperClass-out.java | 13 +++++++++++ ...citMethodTypeParametersFromSuperClass.java | 11 ++++++++++ .../completion/NormalCompletionTest.groovy | 22 +++++++++++++++++++ .../completion/SmartTypeCompletionTest.java | 2 ++ 5 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/ExplicitMethodTypeParametersFromSuperClass-out.java create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/ExplicitMethodTypeParametersFromSuperClass.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java index d29bed8aaf62..fa9b27fb0569 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java @@ -103,7 +103,7 @@ public class JavaMethodCallElement extends LookupItem implements Type final int startOffset = context.getStartOffset(); final OffsetKey refStart = context.trackOffset(startOffset, true); - if (SmartCompletionDecorator.hasUnboundTypeParams(method)) { + if (shouldInsertTypeParameters(context)) { qualifyMethodCall(file, startOffset, document); insertExplicitTypeParameters(context, refStart); } @@ -133,6 +133,17 @@ public class JavaMethodCallElement extends LookupItem implements Type } + private boolean shouldInsertTypeParameters(InsertionContext context) { + final PsiElement leaf = context.getFile().findElementAt(context.getStartOffset()); + if (PsiTreeUtil.getParentOfType(leaf, PsiExpressionList.class, true, PsiCodeBlock.class, PsiModifierListOwner.class) == null) { + if (PsiTreeUtil.getParentOfType(leaf, PsiConditionalExpression.class, true, PsiCodeBlock.class, PsiModifierListOwner.class) == null) { + return false; + } + } + + return SmartCompletionDecorator.hasUnboundTypeParams(getObject()); + } + private boolean insertExplicitTypeParameters(InsertionContext context, OffsetKey refStart) { context.commitDocument(); @@ -169,10 +180,7 @@ public class JavaMethodCallElement extends LookupItem implements Type final PsiMethod method = getObject(); if (!method.hasModifierProperty(PsiModifier.STATIC)) { document.insertString(startOffset, "this."); - - if (method.getManager().areElementsEquivalent(myContainingClass, PsiTreeUtil.findElementOfClassAtOffset(file, startOffset, PsiClass.class, false))) { - return; - } + return; } document.insertString(startOffset, "."); diff --git a/java/java-tests/testData/codeInsight/completion/smartType/ExplicitMethodTypeParametersFromSuperClass-out.java b/java/java-tests/testData/codeInsight/completion/smartType/ExplicitMethodTypeParametersFromSuperClass-out.java new file mode 100644 index 000000000000..831ff2db4f9e --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/ExplicitMethodTypeParametersFromSuperClass-out.java @@ -0,0 +1,13 @@ +import java.io.File; + +public class Super { + protected T foo() {} +} + +public class Foo extends Super { + { + bar(this.foo()); + } + + void bar(java.io.File s) {} +} diff --git a/java/java-tests/testData/codeInsight/completion/smartType/ExplicitMethodTypeParametersFromSuperClass.java b/java/java-tests/testData/codeInsight/completion/smartType/ExplicitMethodTypeParametersFromSuperClass.java new file mode 100644 index 000000000000..8d685e306b3a --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/ExplicitMethodTypeParametersFromSuperClass.java @@ -0,0 +1,11 @@ +public class Super { + protected T foo() {} +} + +public class Foo extends Super { + { + bar(fo) + } + + void bar(java.io.File s) {} +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index 79e8afefae4f..8289b184e876 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -676,4 +676,26 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { """ } + public void testInstanceMagicMethod() throws Exception { + myFixture.configureByText("a.java", """ + public class JavaClass { + T magic() {} + + void foo() { + mag + } + } + """) + myFixture.completeBasic() + myFixture.checkResult """ + public class JavaClass { + T magic() {} + + void foo() { + magic() + } + } + """ + } + } 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 6abecd9398e0..4ec831a36d0b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java @@ -961,6 +961,8 @@ public class SmartTypeCompletionTest extends LightCompletionTestCase { public void testExplicitMethodTypeParametersQualify() throws Throwable { doTest(); } + public void testExplicitMethodTypeParametersFromSuperClass() throws Throwable { doTest(); } + public void testWildcardedInstanceof() throws Throwable { doTest(); } public void testWildcardedInstanceof2() throws Throwable { doTest(); } public void testWildcardedInstanceof3() throws Throwable { doTest(); }