mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 09:19:13 +07:00
method reference: take type args into account
This commit is contained in:
+10
-5
@@ -63,7 +63,6 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm
|
||||
final PsiType[] typeParameters = myExpression.getTypeParameters();
|
||||
|
||||
final PsiMethodReferenceUtil.QualifierResolveResult qualifierResolveResult = PsiMethodReferenceUtil.getQualifierResolveResult(myExpression);
|
||||
PsiSubstitutor psiSubstitutor = qualifierResolveResult.getSubstitutor();
|
||||
|
||||
if (!myExpression.isExact()) {
|
||||
for (PsiParameter parameter : targetParameters) {
|
||||
@@ -78,6 +77,7 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm
|
||||
final PsiClass applicableMemberContainingClass = applicableMember.getContainingClass();
|
||||
final PsiClass containingClass = qualifierResolveResult.getContainingClass();
|
||||
|
||||
PsiSubstitutor psiSubstitutor = qualifierResolveResult.getSubstitutor();
|
||||
psiSubstitutor = applicableMemberContainingClass == null || containingClass == null || myExpression.isConstructor()
|
||||
? psiSubstitutor
|
||||
: TypeConversionUtil.getSuperClassSubstitutor(applicableMemberContainingClass, containingClass, psiSubstitutor);
|
||||
@@ -146,11 +146,16 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm
|
||||
final PsiType referencedMethodReturnType;
|
||||
final PsiClass containingClass = method.getContainingClass();
|
||||
LOG.assertTrue(containingClass != null, method);
|
||||
|
||||
PsiClass qContainingClass = qualifierResolveResult.getContainingClass();
|
||||
if (qContainingClass != null && InheritanceUtil.isInheritorOrSelf(qContainingClass, containingClass, true)) {
|
||||
psiSubstitutor = TypeConversionUtil.getClassSubstitutor(containingClass, qContainingClass, PsiSubstitutor.EMPTY);
|
||||
LOG.assertTrue(psiSubstitutor != null);
|
||||
PsiSubstitutor psiSubstitutor = qualifierResolveResult.getSubstitutor();
|
||||
if (qContainingClass != null) {
|
||||
if ( PsiUtil.isRawSubstitutor(qContainingClass, psiSubstitutor)) {
|
||||
psiSubstitutor = PsiSubstitutor.EMPTY;
|
||||
}
|
||||
if (qContainingClass.isInheritor(containingClass, true)) {
|
||||
psiSubstitutor = TypeConversionUtil.getClassSubstitutor(containingClass, qContainingClass, PsiSubstitutor.EMPTY);
|
||||
LOG.assertTrue(psiSubstitutor != null);
|
||||
}
|
||||
}
|
||||
|
||||
if (method.isConstructor()) {
|
||||
|
||||
+1
@@ -5,6 +5,7 @@ class Test {
|
||||
|
||||
void foo(final Stream<String> stream){
|
||||
stream.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
|
||||
stream.collect(ArrayList<String>::new, ArrayList::add, ArrayList::addAll);
|
||||
stream.collect(ArrayList::new, Collection::add, Collection::addAll);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user