method reference: ref qualified isExact fixed (IDEA-120370)

This commit is contained in:
Anna Kozlova
2014-02-11 18:31:20 +01:00
parent 76846b723a
commit c99aa93112
4 changed files with 45 additions and 11 deletions

View File

@@ -117,20 +117,24 @@ public class CheckedExceptionCompatibilityConstraint extends InputOutputConstrai
thrownTypes.addAll(ExceptionUtil.getUnhandledExceptions(body));
}
} else {
final PsiMethodReferenceUtil.QualifierResolveResult qualifierResolveResult = PsiMethodReferenceUtil.getQualifierResolveResult((PsiMethodReferenceExpression)myExpression);
final PsiSubstitutor psiSubstitutor = qualifierResolveResult.getSubstitutor();
final PsiMethod method;
if (((PsiMethodReferenceExpression)myExpression).isExact()) {
final PsiElement resolve = ((PsiMethodReferenceExpression)myExpression).resolve();
if (resolve instanceof PsiMethod) {
for (PsiClassType type : ((PsiMethod)resolve).getThrowsList().getReferencedTypes()) {
if (!ExceptionUtil.isUncheckedException(type)) {
thrownTypes.add(type);
}
}
method = (PsiMethod)resolve;
} else {
method = null;
}
}
else {
PsiSubstitutor psiSubstitutor =
PsiMethodReferenceUtil.getQualifierResolveResult((PsiMethodReferenceExpression)myExpression).getSubstitutor();
for (PsiType type : interfaceMethod.getThrowsList().getReferencedTypes()) {
method = interfaceMethod;
}
if (method != null) {
for (PsiType type : method.getThrowsList().getReferencedTypes()) {
type = psiSubstitutor.substitute(type);
if (type instanceof PsiClassType && !ExceptionUtil.isUncheckedException((PsiClassType)type)) {
thrownTypes.add(type);

View File

@@ -175,9 +175,12 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase
}
}
} else if (qualifier instanceof PsiReferenceExpression) {
final PsiReferenceParameterList parameterList = ((PsiReferenceExpression)qualifier).getParameterList();
if (parameterList == null || parameterList.getTypeParameterElements().length == 0) {
return null;
final PsiReferenceExpression expression = (PsiReferenceExpression)qualifier;
if (qualifierResolveResult.isReferenceTypeQualified()) {
final PsiReferenceParameterList parameterList = expression.getParameterList();
if (parameterList == null || parameterList.getTypeParameterElements().length == 0) {
return null;
}
}
}
}

View File

@@ -0,0 +1,23 @@
import java.util.List;
import java.util.concurrent.Callable;
public class Tmp {
static void doo(Runnable action){}
static void doo(Callable<?> action){}
interface X<T> {
void bar();
}
interface Y {
void bar();
}
void test(X<String> x1, X x2, Y y) {
doo(x1::bar);
doo(x2::bar);
doo(y::bar);
}
}

View File

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