mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 11:50:54 +07:00
another fix for too eager casting in completion
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -1325,5 +1325,6 @@ public class ListUtils {
|
||||
}
|
||||
|
||||
public void testListArrayListCast() { doTest('\n') }
|
||||
public void testInterfaceImplementationNoCast() { doTest() }
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user