From 19687d9fa4bb4b459b5d9b03b2a6c5d2d9c3dca7 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 30 Oct 2013 14:16:18 +0100 Subject: [PATCH] method refs: ignore same method signatures, include superclass substitutions --- .../src/com/intellij/psi/PsiMethodReferenceUtil.java | 2 +- .../source/tree/java/PsiMethodReferenceExpressionImpl.java | 5 ++++- .../scope/conflictResolvers/JavaMethodsConflictResolver.java | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java index 11931ca6db42..9bbb84e83020 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java @@ -194,7 +194,7 @@ public class PsiMethodReferenceUtil { if (resolve instanceof PsiMethod) { final MethodSignature signature1 = method.getSignature(LambdaUtil.getSubstitutor(method, resolveResult)); PsiSubstitutor subst = PsiSubstitutor.EMPTY; - subst = subst.putAll(qualifierResolveResult.getSubstitutor()); + subst = subst.putAll(TypeConversionUtil.getSuperClassSubstitutor(((PsiMethod)resolve).getContainingClass(), qualifierResolveResult.getContainingClass(), qualifierResolveResult.getSubstitutor())); subst = subst.putAll(result.getSubstitutor()); final MethodSignature signature2 = ((PsiMethod)resolve).getSignature(subst); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java index aba54dcf10b5..eb4d501cdad0 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java @@ -471,7 +471,7 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase final PsiMethod psiMethod = ((MethodCandidateInfo)conflict).getElement(); if (psiMethod == null) continue; PsiSubstitutor subst = PsiSubstitutor.EMPTY; - subst = subst.putAll(mySubstitutor); + subst = subst.putAll(TypeConversionUtil.getSuperClassSubstitutor(psiMethod.getContainingClass(), myQualifierResolveResult.getContainingClass(), mySubstitutor)); subst = subst.putAll(conflict.getSubstitutor()); final PsiType[] signatureParameterTypes2 = psiMethod.getSignature(subst).getParameterTypes(); @@ -534,6 +534,9 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase @Override public CandidateInfo resolveConflict(@NotNull List conflicts) { + checkSameSignatures(conflicts); + if (conflicts.size() == 1) return conflicts.get(0); + checkAccessStaticLevels(conflicts, true); if (conflicts.size() == 1) return conflicts.get(0); diff --git a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java index ba7097f2ff0d..3898f842b455 100644 --- a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java +++ b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java @@ -201,7 +201,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ } } - private void checkSameSignatures(@NotNull List conflicts) { + protected void checkSameSignatures(@NotNull List conflicts) { // candidates should go in order of class hierarchy traversal // in order for this to work Map signatures = new THashMap(conflicts.size());