From 0706510a1ebf56c878990c735fd078ea2b36f97a Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 10 Oct 2012 16:17:13 +0200 Subject: [PATCH] method refs: correct static flag detection in case of default constructors (IDEA-92735) --- .../PsiMethodReferenceExpressionImpl.java | 20 +++++++++++-- .../lambda/methodRef/DefaultConstructor.java | 30 +++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) 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 50e1a10e5405..4689e4e4270f 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 @@ -300,10 +300,24 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase 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)}; + boolean insideStaticClass = containingClass.getContainingClass() == null; + if (!insideStaticClass) { //inner class + PsiClass parentClass = containingClass; + while (parentClass != null) { + if (parentClass.hasModifierProperty(PsiModifier.STATIC)) { + insideStaticClass = true; + break; + } + + parentClass = parentClass.getContainingClass(); + } } - return JavaResolveResult.EMPTY_ARRAY; + final boolean innerClassOuterClassReference = containingClass.getContainingClass() != null && !containingClass.hasModifierProperty(PsiModifier.STATIC); + ClassCandidateInfo candidateInfo = null; + if (insideStaticClass && parameterTypes.length == 0 || hasReceiver && innerClassOuterClassReference) { + candidateInfo = new ClassCandidateInfo(containingClass, substitutor); + } + return candidateInfo == null ? JavaResolveResult.EMPTY_ARRAY : new JavaResolveResult[]{candidateInfo}; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/DefaultConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/DefaultConstructor.java index d216021ee7ca..ea53a0933bd4 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/DefaultConstructor.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/DefaultConstructor.java @@ -56,3 +56,33 @@ class DefaultConstructor2 { I i2 = this::new; } } + +class DefaultConstructor3 { + public class Inner {} + public static class StaticInner {} + + static I i = Inner::new; + static I1 i1 = StaticInner::new; + interface I { + Inner foo(); + } + + interface I1 { + StaticInner foo(); + } +} + +class DefaultConstructor4 { + public class Inner {} + public static class StaticInner {} + + static I i = Inner::new; + static I1 i1 = StaticInner::new; + interface I { + Inner foo(DefaultConstructor4 receiver); + } + + interface I1 { + StaticInner foo(DefaultConstructor4 receiver); + } +}