don't qualify magic method calls unless it's really needed. qualify instance magic methods with 'this'

This commit is contained in:
peter
2010-08-31 19:29:32 +01:00
parent a0bae733e4
commit 915cf66ef3
5 changed files with 61 additions and 5 deletions
@@ -103,7 +103,7 @@ public class JavaMethodCallElement extends LookupItem<PsiMethod> 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<PsiMethod> 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<PsiMethod> 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, ".");
@@ -0,0 +1,13 @@
import java.io.File;
public class Super {
protected <T> T foo() {}
}
public class Foo extends Super {
{
bar(this.<File>foo());<caret>
}
void bar(java.io.File s) {}
}
@@ -0,0 +1,11 @@
public class Super {
protected <T> T foo() {}
}
public class Foo extends Super {
{
bar(fo<caret>)
}
void bar(java.io.File s) {}
}
@@ -676,4 +676,26 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase {
"""
}
public void testInstanceMagicMethod() throws Exception {
myFixture.configureByText("a.java", """
public class JavaClass {
<T> T magic() {}
void foo() {
mag<caret>
}
}
""")
myFixture.completeBasic()
myFixture.checkResult """
public class JavaClass {
<T> T magic() {}
void foo() {
magic()<caret>
}
}
"""
}
}
@@ -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(); }