mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
provide applicability substitutor when inference fails for parent expression
This commit is contained in:
+11
@@ -137,6 +137,17 @@ public class InferenceSessionContainer {
|
||||
final InferenceSession childSession = new InferenceSession(initialInferenceState);
|
||||
final List<String> errorMessages = parentSession.getIncompatibleErrorMessages();
|
||||
if (errorMessages != null) {
|
||||
PsiElement context = parentSession.getContext();
|
||||
if (context instanceof PsiCallExpression) {
|
||||
PsiMethod outerCallerMethod = ((PsiCallExpression)context).resolveMethod();
|
||||
//caller on the upper level would provide better error:
|
||||
//given foo(lambda) and failed checked exception compatibility constraint
|
||||
//starting inference from lambda body, if accept self substitution,
|
||||
//lambda body would have errors with completely failed inference, e.g. unhandled exception with non-inferred type or similar
|
||||
if (outerCallerMethod != null && outerCallerMethod.hasTypeParameters()) {
|
||||
return properties.getInfo().getSubstitutor(false);
|
||||
}
|
||||
}
|
||||
return childSession.prepareSubstitution();
|
||||
}
|
||||
return childSession.collectAdditionalAndInfer(parameters, arguments, properties, compoundInitialState.getInitialSubstitutor());
|
||||
|
||||
+3
-3
@@ -20,10 +20,10 @@ class TestIDEA128101 {
|
||||
|
||||
public static void test() {
|
||||
construct(String.class, createPath(integerAttribute), createPath(stringAttribute));
|
||||
construct1<error descr="'construct1(java.lang.Class<T>, TestIDEA128101.Path<K>...)' in 'TestIDEA128101' cannot be applied to '(java.lang.Class<java.lang.String>, TestIDEA128101.Path<Y>, TestIDEA128101.Path<java.lang.String>)'">(String.class, createPath(integerAttribute), createPath(stringAttribute))</error>;
|
||||
construct1<error descr="'construct1(java.lang.Class<T>, TestIDEA128101.Path<K>...)' in 'TestIDEA128101' cannot be applied to '(java.lang.Class<java.lang.String>, TestIDEA128101.Path<java.lang.Integer>, TestIDEA128101.Path<java.lang.String>)'">(String.class, createPath(integerAttribute), createPath(stringAttribute))</error>;
|
||||
construct2(String.class, createPath(integerAttribute), createPath(stringAttribute));
|
||||
construct3<error descr="'construct3(java.lang.Class<java.lang.String>, TestIDEA128101.Path<? super K>...)' in 'TestIDEA128101' cannot be applied to '(java.lang.Class<java.lang.String>, TestIDEA128101.Path<Y>, TestIDEA128101.Path<Y>)'">(String.class, createPath(integerAttribute), createPath(stringAttribute))</error>;
|
||||
construct4<error descr="'construct4(java.lang.Class<java.lang.String>, TestIDEA128101.Path<? super K>, TestIDEA128101.Path<? super K>)' in 'TestIDEA128101' cannot be applied to '(java.lang.Class<java.lang.String>, TestIDEA128101.Path<Y>, TestIDEA128101.Path<Y>)'">(String.class, createPath(integerAttribute), createPath(stringAttribute))</error>;
|
||||
construct3<error descr="'construct3(java.lang.Class<java.lang.String>, TestIDEA128101.Path<? super K>...)' in 'TestIDEA128101' cannot be applied to '(java.lang.Class<java.lang.String>, TestIDEA128101.Path<java.lang.Integer>, TestIDEA128101.Path<java.lang.String>)'">(String.class, createPath(integerAttribute), createPath(stringAttribute))</error>;
|
||||
construct4<error descr="'construct4(java.lang.Class<java.lang.String>, TestIDEA128101.Path<? super K>, TestIDEA128101.Path<? super K>)' in 'TestIDEA128101' cannot be applied to '(java.lang.Class<java.lang.String>, TestIDEA128101.Path<java.lang.Integer>, TestIDEA128101.Path<java.lang.String>)'">(String.class, createPath(integerAttribute), createPath(stringAttribute))</error>;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+4
-1
@@ -26,7 +26,10 @@ abstract class NoFormalParamTypeInferenceNeeded {
|
||||
{
|
||||
map(a -> zip(text -> text));
|
||||
zip(a -> zip(text -> text));
|
||||
Integer zip = zip(a -> zip(text -> <error descr="Bad return type in lambda expression: Object cannot be converted to R">text</error>));
|
||||
Integer zip = zip(<error descr="no instance(s) of type variable(s) exist so that Object conforms to Integer
|
||||
inference variable R has incompatible bounds:
|
||||
lower bounds: Object
|
||||
upper bounds: Object, Integer">a -> zip(text -> text)</error>);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ import java.util.function.Function;
|
||||
|
||||
class Main {
|
||||
{
|
||||
List<Optional<Function<String, String>>> list = asList(of(<error descr="T is not a functional interface">Main::identity</error>));
|
||||
List<Optional<Function<String, String>>> list = asList(of(<error descr="Object is not a functional interface">Main::identity</error>));
|
||||
}
|
||||
|
||||
static <T> List<T> asList(T a) { return null;}
|
||||
|
||||
Reference in New Issue
Block a user