incompatible parameter types in lambda expression message expanded (IDEA-134941)

This commit is contained in:
Anna Kozlova
2015-01-07 17:10:09 +01:00
parent 777397d0d2
commit af7da7a8f4
9 changed files with 29 additions and 25 deletions

View File

@@ -333,12 +333,9 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(resolveResult);
if (interfaceMethod != null) {
final PsiParameter[] parameters = interfaceMethod.getParameterList().getParameters();
PsiElement incompatibleElt = LambdaHighlightingUtil
HighlightInfo result = LambdaHighlightingUtil
.checkParametersCompatible(expression, parameters, LambdaUtil.getSubstitutor(interfaceMethod, resolveResult));
if (incompatibleElt != null) {
final String incompatibleTypesMessage = "Incompatible parameter types in lambda expression";
HighlightInfo result = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(incompatibleElt)
.descriptionAndTooltip(incompatibleTypesMessage).create();
if (result != null) {
myHolder.add(result);
} else {
final PsiClass samClass = resolveResult.getElement();

View File

@@ -15,6 +15,8 @@
*/
package com.intellij.codeInsight.daemon.impl.analysis;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInsight.daemon.impl.HighlightInfoType;
import com.intellij.psi.*;
import com.intellij.psi.util.MethodSignature;
import com.intellij.psi.util.PsiTypesUtil;
@@ -47,12 +49,17 @@ public class LambdaHighlightingUtil {
}
@Nullable
public static PsiElement checkParametersCompatible(PsiLambdaExpression expression,
PsiParameter[] methodParameters,
PsiSubstitutor substitutor) {
public static HighlightInfo checkParametersCompatible(PsiLambdaExpression expression,
PsiParameter[] methodParameters,
PsiSubstitutor substitutor) {
final PsiParameter[] lambdaParameters = expression.getParameterList().getParameters();
String incompatibleTypesMessage = "Incompatible parameter types in lambda expression: ";
if (lambdaParameters.length != methodParameters.length) {
return expression;
incompatibleTypesMessage += "wrong number of parameters: expected " + methodParameters.length + " but found " + lambdaParameters.length;
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(expression.getParameterList())
.descriptionAndTooltip(incompatibleTypesMessage)
.create();
}
else {
boolean hasFormalParameterTypes = expression.hasFormalParameterTypes();
@@ -60,14 +67,14 @@ public class LambdaHighlightingUtil {
PsiParameter lambdaParameter = lambdaParameters[i];
PsiType lambdaParameterType = lambdaParameter.getType();
PsiType substitutedParamType = substitutor.substitute(methodParameters[i].getType());
if (hasFormalParameterTypes) {
if (!PsiTypesUtil.compareTypes(lambdaParameterType, substitutedParamType, true)) {
return lambdaParameter;
}
} else {
if (!TypeConversionUtil.isAssignable(substitutedParamType, lambdaParameterType)) {
return lambdaParameter;
}
if (hasFormalParameterTypes &&!PsiTypesUtil.compareTypes(lambdaParameterType, substitutedParamType, true) ||
!TypeConversionUtil.isAssignable(substitutedParamType, lambdaParameterType)) {
final String expectedType = substitutedParamType != null ? substitutedParamType.getPresentableText() : null;
final String actualType = lambdaParameterType.getPresentableText();
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(expression.getParameterList())
.descriptionAndTooltip(incompatibleTypesMessage + "expected " + expectedType + " but found " + actualType)
.create();
}
}
}

View File

@@ -27,7 +27,7 @@ class Test {
I i = flag ? (() -> 123) : (() -> 222);
I i1 = flag ? (() -> {<error descr="Missing return statement">}</error>) : (() -> 222);
Object i2 = flag ? (<error descr="Target type of a lambda conversion must be an interface">() -> 42</error>) : (<error descr="Target type of a lambda conversion must be an interface">() -> 222</error>);
I i3 = flag ? (<error descr="Incompatible parameter types in lambda expression">(x) -> 42</error>) : (() -> 222);
I i3 = flag ? (<error descr="Incompatible parameter types in lambda expression: wrong number of parameters: expected 0 but found 1">(x)</error> -> 42) : (() -> 222);
I i4 = flag ? (() -> 42) : new I() {
@Override
public int m() {

View File

@@ -3,6 +3,6 @@ class LambdaConv10 {
interface I<T, R> { public R call( T t); }
{
I<Integer,Integer> in = (<error descr="Incompatible parameter types in lambda expression">int i</error>) -> 2 * i;
I<Integer,Integer> in = <error descr="Incompatible parameter types in lambda expression: expected Integer but found int">(int i)</error> -> 2 * i;
}
}

View File

@@ -5,7 +5,7 @@ public class Test {
{
Predicate<? super Integer> p = (Number n) -> n.equals(23);
Predicate<Integer> p1 = (<error descr="Incompatible parameter types in lambda expression">Number n</error>) -> n.equals(23);
Predicate<Integer> p1 = <error descr="Incompatible parameter types in lambda expression: expected Integer but found Number">(Number n)</error> -> n.equals(23);
Predicate<Number> p2 = (Number n) -> n.equals(23);
}
}

View File

@@ -11,7 +11,7 @@ class Foo {
};
void bazz() {
bar((<error descr="Incompatible parameter types in lambda expression">String s</error>) -> {
bar(<error descr="Incompatible parameter types in lambda expression: expected int but found String">(String s)</error> -> {
System.out.println(s);});
bar((int i) -> {System.out.println(i);});
}

View File

@@ -1,7 +1,7 @@
class XXX {
Runnable bar() {
return <error descr="Incompatible parameter types in lambda expression">(o)->{
return <error descr="Incompatible parameter types in lambda expression: wrong number of parameters: expected 0 but found 1">(o)</error>->{
System.out.println();
}</error>;
};
}
}

View File

@@ -1,6 +1,6 @@
class Test {
{
Comparable c = (<error descr="Incompatible parameter types in lambda expression">String o</error>)->{
Comparable c = <error descr="Incompatible parameter types in lambda expression: expected Object but found String">(String o)</error>->{
return 0;
};
}

View File

@@ -1,6 +1,6 @@
class IDEA100385 {
void foo(N<Double> n){
n.forEach((<error descr="Incompatible parameter types in lambda expression">double e</error>) -> { });
n.forEach(<error descr="Incompatible parameter types in lambda expression: expected Double but found double">(double e)</error> -> { });
}
static interface N<E> {
void forEach(Consumer<? extends E> consumer);