mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 09:19:13 +07:00
methods refs: check if default constructor is acceptable
This commit is contained in:
+11
-2
@@ -279,6 +279,7 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase
|
||||
}
|
||||
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
|
||||
final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(resolveResult);
|
||||
final MethodSignature signature = interfaceMethod != null ? interfaceMethod.getSignature(resolveResult.getSubstitutor()) : null;
|
||||
final PsiType interfaceMethodReturnType = LambdaUtil.getFunctionalInterfaceReturnType(functionalInterfaceType);
|
||||
final LanguageLevel languageLevel = PsiUtil.getLanguageLevel(PsiMethodReferenceExpressionImpl.this);
|
||||
if (isConstructor && interfaceMethod != null) {
|
||||
@@ -293,11 +294,19 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase
|
||||
if (containingClass.getConstructors().length == 0 &&
|
||||
!containingClass.isEnum() &&
|
||||
!containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) {
|
||||
return new JavaResolveResult[]{new ClassCandidateInfo(containingClass, substitutor)};
|
||||
boolean hasReceiver = false;
|
||||
final PsiType[] parameterTypes = signature.getParameterTypes();
|
||||
|
||||
if (parameterTypes.length == 1 && LambdaUtil.isReceiverType(parameterTypes[0], containingClass, substitutor)) {
|
||||
hasReceiver = true;
|
||||
}
|
||||
if (parameterTypes.length == 0 || hasReceiver && !(containingClass.getContainingClass() == null || containingClass.hasModifierProperty(PsiModifier.STATIC))) {
|
||||
return new JavaResolveResult[]{new ClassCandidateInfo(containingClass, substitutor)};
|
||||
}
|
||||
return JavaResolveResult.EMPTY_ARRAY;
|
||||
}
|
||||
}
|
||||
|
||||
final MethodSignature signature = interfaceMethod != null ? interfaceMethod.getSignature(resolveResult.getSubstitutor()) : null;
|
||||
final MethodReferenceConflictResolver conflictResolver =
|
||||
new MethodReferenceConflictResolver(containingClass, substitutor, signature, beginsWithReferenceType);
|
||||
final PsiConflictResolver[] resolvers;
|
||||
|
||||
+12
@@ -44,3 +44,15 @@ class DefaultConstructor1 {
|
||||
Runnable b1 = DefaultConstructor1 :: new;
|
||||
}
|
||||
}
|
||||
|
||||
class DefaultConstructor2 {
|
||||
interface I {
|
||||
void foo(DefaultConstructor2 e);
|
||||
}
|
||||
|
||||
|
||||
void f() {
|
||||
<error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor2.I'">I i1 = DefaultConstructor2 :: new;</error>
|
||||
<error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor2.I'">I i2 = this::new;</error>
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user