another fix for too eager casting in completion

This commit is contained in:
peter
2012-03-15 17:14:23 +04:00
parent c0dcdcd22c
commit d165428546
4 changed files with 51 additions and 13 deletions

View File

@@ -504,28 +504,29 @@ public class JavaCompletionUtil {
}
if (plainQualifier != null) {
Object o = item.getObject();
if (containsMember(plainQualifier, o)) {
if (!(o instanceof PsiMethod)) {
return item;
}
if (o instanceof PsiMethod) {
PsiType castType = castTypeItem.getPsiType();
if (plainQualifier instanceof PsiClassType && castType instanceof PsiClassType) {
PsiMethod method = (PsiMethod)o;
PsiClassType.ClassResolveResult plainResult = ((PsiClassType)plainQualifier).resolveGenerics();
PsiClass plainClass = plainResult.getElement();
PsiClass castClass = ((PsiClassType)castType).resolveGenerics().getElement();
if (plainClass != null && plainClass.findMethodBySignature(method, true) != null) {
PsiClass castClass = ((PsiClassType)castType).resolveGenerics().getElement();
if (castClass == null || plainClass == null || !castClass.isInheritor(plainClass, true)) {
return item;
}
if (castClass == null || !castClass.isInheritor(plainClass, true)) {
return item;
}
PsiSubstitutor plainSub = plainResult.getSubstitutor();
PsiSubstitutor castSub = TypeConversionUtil.getSuperClassSubstitutor(plainClass, (PsiClassType)castType);
if (method.getSignature(plainSub).equals(method.getSignature(castSub)) &&
plainSub.substitute(method.getReturnType()).equals(castSub.substitute(method.getReturnType()))) {
return item;
PsiSubstitutor plainSub = plainResult.getSubstitutor();
PsiSubstitutor castSub = TypeConversionUtil.getSuperClassSubstitutor(plainClass, (PsiClassType)castType);
if (method.getSignature(plainSub).equals(method.getSignature(castSub)) &&
plainSub.substitute(method.getReturnType()).equals(castSub.substitute(method.getReturnType()))) {
return item;
}
}
}
} else if (containsMember(plainQualifier, o)) {
return item;
}
}

View File

@@ -0,0 +1,18 @@
public class Util2 {
void foo(XmlAttribute o ) {
if (o instanceof XmlAttributeImpl) {
o.getpar<caret>
}
}
}
interface PsiElement {
PsiElement getParent();
}
interface XmlAttribute extends PsiElement {}
class XmlAttributeImpl implements XmlAttribute {
@Override
public PsiElement getParent() {
return null;
}
}

View File

@@ -0,0 +1,18 @@
public class Util2 {
void foo(XmlAttribute o ) {
if (o instanceof XmlAttributeImpl) {
o.getParent()<caret>
}
}
}
interface PsiElement {
PsiElement getParent();
}
interface XmlAttribute extends PsiElement {}
class XmlAttributeImpl implements XmlAttribute {
@Override
public PsiElement getParent() {
return null;
}
}

View File

@@ -1325,5 +1325,6 @@ public class ListUtils {
}
public void testListArrayListCast() { doTest('\n') }
public void testInterfaceImplementationNoCast() { doTest() }
}