From e6357ca1ddcae7c1b7fff1c408b65abde9987319 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 1 Feb 2016 13:46:09 +0300 Subject: [PATCH] method refs: fix getClass() return type in case of method references --- .../src/com/intellij/psi/util/PsiTypesUtil.java | 4 ++++ .../lambda/methodRef/GetClassSpecifics.java | 2 +- .../GetClassReturnTypeInMethodRefrence.java | 10 ++++++++++ .../daemon/lambda/NewMethodRefHighlightingTest.java | 4 ++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/GetClassReturnTypeInMethodRefrence.java diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java index 94e335a6031a..6635e42324a5 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java @@ -145,6 +145,10 @@ public class PsiTypesUtil { @NotNull LanguageLevel languageLevel) { //JLS3 15.8.2 if (languageLevel.isAtLeast(LanguageLevel.JDK_1_5) && isGetClass(method)) { + if (methodExpression instanceof PsiMethodReferenceExpression) { + final PsiType qualifierType = PsiMethodReferenceUtil.getQualifierType((PsiMethodReferenceExpression)methodExpression); + return qualifierType != null ? createJavaLangClassType(methodExpression, qualifierType, true) : null; + } PsiExpression qualifier = methodExpression.getQualifierExpression(); PsiType qualifierType = null; final Project project = call.getProject(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/GetClassSpecifics.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/GetClassSpecifics.java index 868fada42363..a6041ed429f6 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/GetClassSpecifics.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/GetClassSpecifics.java @@ -10,6 +10,6 @@ class GetClassTest { void test(int[] iarr, List ls) { GetCl c4 = ls::getClass; - GetClReturnTypeProblems c5 = ls::getClass; + GetClReturnTypeProblems c5 = ls::getClass; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/GetClassReturnTypeInMethodRefrence.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/GetClassReturnTypeInMethodRefrence.java new file mode 100644 index 000000000000..4564b2609fbd --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/GetClassReturnTypeInMethodRefrence.java @@ -0,0 +1,10 @@ + +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; + +class Test { + public void some() { + Function, ? extends Class> a = AtomicReference::getClass; + Function, ? extends Class> b = AtomicReference::getClass; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java index befffbb3c128..e0215e0d99b1 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java @@ -490,6 +490,10 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testGetClassReturnTypeInMethodRefrence() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }