From 0b4a8e2873f7a26a4a5cb9ba653629e4841dd507 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 4 Oct 2012 15:09:54 +0200 Subject: [PATCH] method refs: check access problems (II) --- .../PsiMethodReferenceExpressionImpl.java | 12 +++++- .../lambda/methodRef/AccessModifiers.java | 39 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 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 87e96a7a143b..8ac099bcd592 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 @@ -186,7 +186,12 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase try { final PsiExpression expression = getQualifierExpression(); if (expression != null) { - PsiClassType.ClassResolveResult result = PsiUtil.resolveGenericsClassInType(expression.getType()); + final PsiType expressionType = expression.getType(); + if (expressionType instanceof PsiArrayType) { + containingClass = JavaPsiFacade.getInstance(getProject()).findClass(CommonClassNames.JAVA_LANG_OBJECT, getResolveScope()); + return false; + } + PsiClassType.ClassResolveResult result = PsiUtil.resolveGenericsClassInType(expressionType); containingClass = result.getElement(); if (containingClass != null) { substitutor = result.getSubstitutor(); @@ -302,7 +307,10 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase }; processor.setIsConstructor(isConstructor); processor.setName(isConstructor ? containingClass.getName() : element.getText()); - processor.setAccessClass(containingClass); + final PsiExpression expression = getQualifierExpression(); + if (expression == null || !(expression.getType() instanceof PsiArrayType)) { + processor.setAccessClass(containingClass); + } if (beginsWithReferenceType) { if (containingClass.getContainingClass() == null || !containingClass.hasModifierProperty(PsiModifier.STATIC)) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java index fa01f7ef6d46..40b69484a1ed 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java @@ -34,3 +34,42 @@ class AlienTest { IInt i7 = MyTest.Foo::foo; } } + + +class MyTest1 { + + interface I1 { + int[] _(); + } + + interface I2 { + Object _(); + } + + interface I3 { + char[] _(); + } + + interface I4 { + + boolean _(); + } + + interface I5 { + Class _(); + } + + interface I6 { + Class _(); + } + + void foo(Object[] arr) { + I1 c1 = arr :: clone; + I2 c2 = arr :: clone; + I3 c3 = arr::clone; + I4 c5 = arr::clone; + + I5 c4 = this::getClass; + I6 c6 = this::getClass; + } +}