[NI] Don't return resulting call if return type has uninferred types

This commit is contained in:
Mikhail Zarechenskiy
2019-04-25 12:47:15 +03:00
parent db4ca059bd
commit ac0a1d984f
16 changed files with 40 additions and 26 deletions
@@ -19,13 +19,14 @@ package org.jetbrains.kotlin.resolve.calls.results;
import com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.config.LanguageFeature;
import org.jetbrains.kotlin.descriptors.CallableDescriptor;
import org.jetbrains.kotlin.resolve.calls.context.ContextDependency;
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext;
import org.jetbrains.kotlin.resolve.calls.model.MutableResolvedCall;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.resolve.calls.tower.KotlinToResolvedCallTransformerKt;
import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl;
import org.jetbrains.kotlin.resolve.calls.tower.NewVariableAsFunctionResolvedCallImpl;
import org.jetbrains.kotlin.types.KotlinType;
import java.util.Collection;
@@ -56,15 +57,21 @@ public class OverloadResolutionResultsUtil {
) {
if (results.isSingleResult() && context.contextDependency == ContextDependency.INDEPENDENT) {
ResolvedCall<D> resultingCall = results.getResultingCall();
if (!context.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) {
if (!((MutableResolvedCall<D>) resultingCall).hasInferredReturnType()) {
return null;
}
NewResolvedCallImpl<?> newResolvedCall;
if (resultingCall instanceof NewVariableAsFunctionResolvedCallImpl) {
newResolvedCall = ((NewVariableAsFunctionResolvedCallImpl) resultingCall).getFunctionCall();
}
else {
if (KotlinToResolvedCallTransformerKt.isNewNotCompleted(resultingCall)) {
else if (resultingCall instanceof NewResolvedCallImpl) {
newResolvedCall = (NewResolvedCallImpl<?>) resultingCall;
} else {
newResolvedCall = null;
}
if (newResolvedCall != null) {
if (!KotlinToResolvedCallTransformerKt.hasInferredReturnType(newResolvedCall)) {
return null;
}
} else if (!((MutableResolvedCall<D>) resultingCall).hasInferredReturnType()) {
return null;
}
}
return results.isSingleResult() ? results.getResultingCall() : null;
@@ -764,3 +764,10 @@ fun ResolvedCall<*>.isNewNotCompleted(): Boolean {
}
return false
}
fun NewResolvedCallImpl<*>.hasInferredReturnType(): Boolean {
if (isNewNotCompleted()) return false
val returnType = this.resultingDescriptor.returnType ?: return false
return !returnType.contains { ErrorUtils.isUninferredParameter(it) }
}
+1 -1
View File
@@ -21,7 +21,7 @@ fun test(<!UNUSED_PARAMETER!>l<!> : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.util
val <!UNUSED_VARIABLE!>f<!> : java.io.File? = null
Collections.<!FUNCTION_CALL_EXPECTED, NI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>emptyList<!>
Collections.<!FUNCTION_CALL_EXPECTED, NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>emptyList<!>
Collections.<!FUNCTION_CALL_EXPECTED!>emptyList<Int><!>
Collections.emptyList<Int>()
Collections.<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>emptyList<!>()
@@ -2,7 +2,7 @@ package
public val x1: kotlin.Unit
public val x2: kotlin.Unit
public val x3: ???
public val x3: [ERROR : Type for apply(true, ::foo)]
public fun </*0*/ T, /*1*/ R> apply(/*0*/ x: T, /*1*/ f: (T) -> R): R
public fun foo(/*0*/ i: kotlin.Int): kotlin.Unit
public fun foo(/*0*/ s: kotlin.String): kotlin.Unit
@@ -12,8 +12,8 @@ class A(outer: Outer) {
var b: String by foo(<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>getMyProperty<!>())
var r: String by foo(outer.getContainer().<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>getMyProperty<!>())
var e: String by <!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> <!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo<!>(<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>getMyProperty<!>())
var f: String by <!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo<!>(<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>getMyProperty<!>()) <!OI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>-<!> 1
var e: String by <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> <!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo<!>(<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>getMyProperty<!>())
var f: String by <!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo<!>(<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>getMyProperty<!>()) <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>-<!> 1
}
fun <A, B> foo(<!UNUSED_PARAMETER!>a<!>: Any?) = MyProperty<A, B>()
@@ -2,7 +2,7 @@ package
public final class A {
public constructor A()
public final var a: ???
public final var a: [ERROR : <ERROR FUNCTION RETURN TYPE>]
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -2,7 +2,7 @@ package
public final class B {
public constructor B()
public final val c: kotlin.Int
public final val c: [ERROR : <ERROR FUNCTION RETURN TYPE>]
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -1,7 +1,7 @@
package
public fun </*0*/ T : A, /*1*/ R : T> emptyStrangeMap(): kotlin.collections.Map<T, R>
public fun test(): kotlin.collections.Map<???, ???>
public fun test(): [ERROR : Error function type]
public fun test7(): kotlin.collections.Map<A, A>
public interface A {
@@ -4,7 +4,7 @@ package typeInferenceExpectedTypeMismatch
import java.util.*
fun test() {
val s : Set<Int> = <!NI;TYPE_MISMATCH, NI;TYPE_MISMATCH, OI;TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>newList()<!>
val s : Set<Int> = <!NI;TYPE_MISMATCH, OI;TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>newList()<!>
use(s)
}
@@ -1,8 +1,8 @@
package
public fun manyArguments(): Outer.Nested<???>
public fun manyArguments(): [ERROR : Error function type]
public fun nested(): Outer.Nested<kotlin.Int>
public fun noArguments(): Outer.Nested<???>
public fun noArguments(): [ERROR : Error function type]
public fun noArgumentsExpectedType(): Outer.Nested<kotlin.String>
public final class Outer {
@@ -1,6 +1,6 @@
package
public val x: ???
public val y: kotlin.collections.List<???>
public val x: [ERROR : Error function type]
public val y: [ERROR : Error function type]
public fun </*0*/ E> bar(): kotlin.collections.List<E>
public fun </*0*/ E> foo(): E
@@ -10,8 +10,8 @@ public final class A {
public final val b: [ERROR : Error function type]
public final val u: [ERROR : Error function type]
public final val y: [ERROR : Error function type]
public final val z1: ???
public final val z2: kotlin.collections.List<???>
public final val z1: [ERROR : Error function type]
public final val z2: [ERROR : Error function type]
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -2,12 +2,12 @@ package
public val u: kotlin.String
public val x: [ERROR : No type, no body]
public val x1: ???
public val x1: [ERROR : Error function type]
public val x2: kotlin.String
public var x3: kotlin.Int
public val x4: [ERROR : Error function type]
public val x5: kotlin.Nothing?
public val y1: kotlin.collections.List<???>
public val y1: [ERROR : Error function type]
public val y2: kotlin.collections.List<kotlin.Int>
public val y5: kotlin.Nothing
public val z2: kotlin.collections.List<kotlin.Int>
+1 -1
View File
@@ -1,7 +1,7 @@
// !WITH_NEW_INFERENCE
// NI_EXPECTED_FILE
// See EA-76890 / KT-10843: NPE during analysis
fun lambda(x : Int?) = x?.<!FUNCTION_CALL_EXPECTED, NI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NO_VALUE_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>let<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>l<!> {
fun lambda(x : Int?) = x?.<!FUNCTION_CALL_EXPECTED, NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NO_VALUE_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>let<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>l<!> {
<!OI;CANNOT_INFER_PARAMETER_TYPE!>y<!> ->
if (<!OI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>y<!> <!NI;UNREACHABLE_CODE!><!NI;UNRESOLVED_REFERENCE, OI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>><!> 0<!>) <!NI;UNREACHABLE_CODE!>return<!UNRESOLVED_REFERENCE!>@l<!> x<!>
<!NI;UNREACHABLE_CODE, OI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>y<!>
@@ -4,7 +4,7 @@ public val x1: A
public val x2: A
public val x3: A
public val y1: B<kotlin.Int>
public val y10: B<???>
public val y10: [ERROR : Type for B("")]
public val y2: B<kotlin.Int>
public val y3: B<kotlin.Int>
public val y4: B<kotlin.Int>
@@ -3,7 +3,7 @@ package
public val test0: N<kotlin.Int> /* = Num<kotlin.Int> */
public val test1: N<kotlin.String> /* = Num<kotlin.String> */
public val test2: C<kotlin.Int> /* = Cons<kotlin.Int> */
public val test3: CC<???> /* = Cons<Cons<???>> */
public val test3: [ERROR : Type for CC(1, 2)]
public val test4: CC<kotlin.Int> /* = Cons<Cons<kotlin.Int>> */
public val test5: PL<kotlin.Int> /* = Pair<kotlin.Int, kotlin.collections.List<kotlin.Int>> */
public fun testProjections1(/*0*/ x: Pair<in kotlin.Int, out kotlin.String>): Foo<out kotlin.String>