More accurate error reporting
with type inference error for delegated properties Add the constraints from completer if they don't lead to errors except errors from upper bounds to improve diagnostics
This commit is contained in:
@@ -32,8 +32,7 @@ import org.jetbrains.kotlin.resolve.calls.context.CheckValueArgumentsMode
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystem
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.EXPECTED_TYPE_POSITION
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.FROM_COMPLETER
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.*
|
||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsImpl
|
||||
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus
|
||||
@@ -132,8 +131,8 @@ public class CallCompleter(
|
||||
expectedType: JetType,
|
||||
trace: BindingTrace
|
||||
) {
|
||||
fun updateSystemIfSuccessful(update: (ConstraintSystem) -> Boolean) {
|
||||
val copy = (getConstraintSystem() as ConstraintSystemImpl).copy()
|
||||
fun updateSystemIfSuccessful(update: (ConstraintSystemImpl) -> Boolean) {
|
||||
val copy = (getConstraintSystem() as ConstraintSystemImpl).copy() as ConstraintSystemImpl
|
||||
if (update(copy)) {
|
||||
setConstraintSystem(copy)
|
||||
}
|
||||
@@ -146,11 +145,13 @@ public class CallCompleter(
|
||||
|
||||
val constraintSystemCompleter = trace[CONSTRAINT_SYSTEM_COMPLETER, getCall().getCalleeExpression()]
|
||||
if (constraintSystemCompleter != null) {
|
||||
//todo improve error reporting with errors in constraints from completer
|
||||
// todo improve error reporting with errors in constraints from completer
|
||||
// todo add constraints from completer unconditionally; improve constraints from completer for generic methods
|
||||
// add the constraints only if they don't lead to errors (except errors from upper bounds to improve diagnostics)
|
||||
updateSystemIfSuccessful {
|
||||
system ->
|
||||
constraintSystemCompleter.completeConstraintSystem(system, this)
|
||||
!system.getStatus().hasOnlyErrorsFromPosition(FROM_COMPLETER.position())
|
||||
!system.filterConstraintsOut(TYPE_BOUND_POSITION).getStatus().hasOnlyErrorsDerivedFrom(FROM_COMPLETER)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -1,10 +1,10 @@
|
||||
package foo
|
||||
|
||||
open class A {
|
||||
val B.w: Int by <!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>MyProperty<!>()
|
||||
val B.w: Int by <!TYPE_INFERENCE_UPPER_BOUND_VIOLATED!>MyProperty<!>()
|
||||
}
|
||||
|
||||
val B.r: Int by <!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>MyProperty<!>()
|
||||
val B.r: Int by <!TYPE_INFERENCE_UPPER_BOUND_VIOLATED!>MyProperty<!>()
|
||||
|
||||
val A.e: Int by MyProperty()
|
||||
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
class A(val map: MutableMap<String, CharSequence>) {
|
||||
|
||||
var a: String by map.withDefault1 { "foo" }
|
||||
}
|
||||
|
||||
fun <G> MutableMap<in String, in G>.get(thisRef: Any?, property: PropertyMetadata): G = throw Exception()
|
||||
|
||||
fun <S> MutableMap<in String, in S>.set(thisRef: Any?, property: PropertyMetadata, value: S) {}
|
||||
|
||||
fun <K, V> MutableMap<K, V>.withDefault1(default: (key: K) -> V): MutableMap<K, V> = this
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package
|
||||
|
||||
internal fun </*0*/ G> kotlin.MutableMap<in kotlin.String, in G>.get(/*0*/ thisRef: kotlin.Any?, /*1*/ property: kotlin.PropertyMetadata): G
|
||||
internal fun </*0*/ S> kotlin.MutableMap<in kotlin.String, in S>.set(/*0*/ thisRef: kotlin.Any?, /*1*/ property: kotlin.PropertyMetadata, /*2*/ value: S): kotlin.Unit
|
||||
internal fun </*0*/ K, /*1*/ V> kotlin.MutableMap<K, V>.withDefault1(/*0*/ default: (K) -> V): kotlin.MutableMap<K, V>
|
||||
|
||||
internal final class A {
|
||||
public constructor A(/*0*/ map: kotlin.MutableMap<kotlin.String, kotlin.CharSequence>)
|
||||
internal final var a: kotlin.String
|
||||
internal final val map: kotlin.MutableMap<kotlin.String, kotlin.CharSequence>
|
||||
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
|
||||
}
|
||||
@@ -7142,6 +7142,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/substitutions"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("delegationAndInference.kt")
|
||||
public void testDelegationAndInference() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/substitutions/delegationAndInference.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt6081SubstituteIntoClassCorrectly.kt")
|
||||
public void testKt6081SubstituteIntoClassCorrectly() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/substitutions/kt6081SubstituteIntoClassCorrectly.kt");
|
||||
|
||||
Reference in New Issue
Block a user