method refs: fix getClass() return type in case of method references

This commit is contained in:
Anna Kozlova
2016-02-01 13:46:09 +03:00
parent b82907366b
commit e6357ca1dd
4 changed files with 19 additions and 1 deletions

View File

@@ -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();

View File

@@ -10,6 +10,6 @@ class GetClassTest {
void test(int[] iarr, List<String> ls) {
GetCl c4 = ls::getClass;
GetClReturnTypeProblems c5 = <error descr="Bad return type in method reference: cannot convert java.lang.Class<? extends java.util.List> to java.lang.Class<java.util.List<java.lang.String>>">ls::getClass</error>;
GetClReturnTypeProblems c5 = <error descr="Bad return type in method reference: cannot convert java.lang.Class<? extends java.util.List<java.lang.String>> to java.lang.Class<java.util.List<java.lang.String>>">ls::getClass</error>;
}
}

View File

@@ -0,0 +1,10 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
class Test {
public <T> void some() {
Function<AtomicReference<T>, ? extends Class<? extends AtomicReference>> a = AtomicReference<T>::getClass;
Function<AtomicReference<T>, ? extends Class<? extends AtomicReference>> b = AtomicReference::getClass;
}
}

View File

@@ -490,6 +490,10 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase {
doTest();
}
public void testGetClassReturnTypeInMethodRefrence() throws Exception {
doTest();
}
private void doTest() {
doTest(false);
}