mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
incompatible parameter types in lambda expression message expanded (IDEA-134941)
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);});
|
||||
}
|
||||
|
||||
@@ -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>;
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user