diff options
author | Jean-Baptiste Queru <jbq@google.com> | 2013-02-08 15:14:04 -0800 |
---|---|---|
committer | Jean-Baptiste Queru <jbq@google.com> | 2013-02-08 15:14:04 -0800 |
commit | 9edc8f6b58f71ec510ba36b838f115718d9a174d (patch) | |
tree | 06f6df92024fa534ff27e1c0b5fc8b2002848093 /java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java | |
parent | b56ea2a18f232d79481e778085fd64e8ae486fc3 (diff) | |
download | idea-9edc8f6b58f71ec510ba36b838f115718d9a174d.tar.gz |
Snapshot of commit 84dc01e773388c2c72a1fc437f313dd5747e7809
from branch master of git://git.jetbrains.org/idea/community.git
Diffstat (limited to 'java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java')
-rw-r--r-- | java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java | 85 |
1 files changed, 8 insertions, 77 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 1d01037048bb..635f4ce4539a 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java @@ -16,9 +16,7 @@ package com.intellij.psi; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.Comparing; import com.intellij.psi.codeStyle.JavaCodeStyleManager; -import com.intellij.psi.infos.CandidateInfo; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.MethodSignature; import com.intellij.psi.util.PsiUtil; @@ -26,7 +24,6 @@ import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.Nullable; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -116,6 +113,12 @@ public class PsiMethodReferenceUtil { public static boolean isAcceptable(@Nullable final PsiMethodReferenceExpression methodReferenceExpression, PsiType left) { if (methodReferenceExpression == null) return false; + if (left instanceof PsiIntersectionType) { + for (PsiType conjunct : ((PsiIntersectionType)left).getConjuncts()) { + if (isAcceptable(methodReferenceExpression, conjunct)) return true; + } + return false; + } Map<PsiMethodReferenceExpression, PsiType> map = ourRefs.get(); if (map == null) { map = new HashMap<PsiMethodReferenceExpression, PsiType>(); @@ -240,7 +243,7 @@ public class PsiMethodReferenceUtil { final int min = Math.min(signatureParameterTypes2.length, signatureParameterTypes1.length); for (int i = 0; i < min; i++) { - final PsiType type1 = psiSubstitutor.substitute(GenericsUtil.eliminateWildcards(signatureParameterTypes1[offset + i])); + final PsiType type1 = GenericsUtil.eliminateWildcards(psiSubstitutor.substitute(signatureParameterTypes1[offset + i])); if (isVarargs && i == min - 1) { if (!TypeConversionUtil.isAssignable(((PsiArrayType)signatureParameterTypes2[i]).getComponentType(), type1) && !TypeConversionUtil.isAssignable(signatureParameterTypes2[i], type1)) { @@ -248,7 +251,7 @@ public class PsiMethodReferenceUtil { } } else { - if (!TypeConversionUtil.isAssignable(signatureParameterTypes2[i], psiSubstitutor.substitute(GenericsUtil.eliminateWildcards(type1)))) { + if (!TypeConversionUtil.isAssignable(signatureParameterTypes2[i], type1)) { return false; } } @@ -266,76 +269,4 @@ public class PsiMethodReferenceUtil { methodReferenceExpression); return (PsiLocalVariable)((PsiDeclarationStatement)assignmentFromText).getDeclaredElements()[0]; } - - public static void processMethodReferenceReturnType(List<CandidateInfo> conflicts, int functionalInterfaceIdx) { - final CandidateInfo[] newConflictsArray = conflicts.toArray(new CandidateInfo[conflicts.size()]); - for (int i = 1; i < newConflictsArray.length; i++) { - final CandidateInfo method = newConflictsArray[i]; - final PsiType interfaceReturnType = getReturnType(functionalInterfaceIdx, method); - for (int j = 0; j < i; j++) { - final CandidateInfo conflict = newConflictsArray[j]; - assert conflict != method; - final PsiType interfaceReturnType1 = getReturnType(functionalInterfaceIdx, conflict); - if (interfaceReturnType != null && interfaceReturnType1 != null && !Comparing.equal(interfaceReturnType, interfaceReturnType1)) { - int moreSpecific = isMoreSpecific(interfaceReturnType, interfaceReturnType1); - if (moreSpecific > 0) { - conflicts.remove(method); - break; - } - else if (moreSpecific < 0) { - conflicts.remove(conflict); - } - } - } - } - } - - private static int isMoreSpecific(PsiType returnType, PsiType returnType1) { - final PsiClassType.ClassResolveResult r = PsiUtil.resolveGenericsClassInType(returnType); - final PsiClass rClass = r.getElement(); - final PsiClassType.ClassResolveResult r1 = PsiUtil.resolveGenericsClassInType(returnType1); - final PsiClass rClass1 = r1.getElement(); - if (rClass != null && rClass1 != null) { - if (rClass == rClass1) { - int moreSpecific = 0; - for (PsiTypeParameter parameter : rClass.getTypeParameters()) { - final PsiType t = r.getSubstitutor().substituteWithBoundsPromotion(parameter); - final PsiType t1 = r1.getSubstitutor().substituteWithBoundsPromotion(parameter); - if (t == null || t1 == null) continue; - if (t1.isAssignableFrom(t) && !GenericsUtil.eliminateWildcards(t1).equals(t)) { - if (moreSpecific == 1) { - return 0; - } - moreSpecific = -1; - } - else if (t.isAssignableFrom(t1) && !GenericsUtil.eliminateWildcards(t).equals(t1)) { - if (moreSpecific == -1) { - return 0; - } - moreSpecific = 1; - } - else { - return 0; - } - } - return moreSpecific; - } - else if (rClass1.isInheritor(rClass, true)) { - return 1; - } - else if (rClass.isInheritor(rClass1, true)) { - return -1; - } - } - return 0; - } - - @Nullable - private static PsiType getReturnType(int functionalTypeIdx, CandidateInfo method) { - final PsiParameter[] methodParameters = ((PsiMethod)method.getElement()).getParameterList().getParameters(); - if (methodParameters.length == 0) return null; - final PsiParameter param = functionalTypeIdx < methodParameters.length ? methodParameters[functionalTypeIdx] : methodParameters[methodParameters.length - 1]; - final PsiType functionalInterfaceType = method.getSubstitutor().substitute(param.getType()); - return LambdaUtil.getFunctionalInterfaceReturnType(functionalInterfaceType); - } } |