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.ConstraintSystem
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl
|
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData
|
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.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.FROM_COMPLETER
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsImpl
|
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsImpl
|
||||||
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus
|
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus
|
||||||
@@ -132,8 +131,8 @@ public class CallCompleter(
|
|||||||
expectedType: JetType,
|
expectedType: JetType,
|
||||||
trace: BindingTrace
|
trace: BindingTrace
|
||||||
) {
|
) {
|
||||||
fun updateSystemIfSuccessful(update: (ConstraintSystem) -> Boolean) {
|
fun updateSystemIfSuccessful(update: (ConstraintSystemImpl) -> Boolean) {
|
||||||
val copy = (getConstraintSystem() as ConstraintSystemImpl).copy()
|
val copy = (getConstraintSystem() as ConstraintSystemImpl).copy() as ConstraintSystemImpl
|
||||||
if (update(copy)) {
|
if (update(copy)) {
|
||||||
setConstraintSystem(copy)
|
setConstraintSystem(copy)
|
||||||
}
|
}
|
||||||
@@ -146,11 +145,13 @@ public class CallCompleter(
|
|||||||
|
|
||||||
val constraintSystemCompleter = trace[CONSTRAINT_SYSTEM_COMPLETER, getCall().getCalleeExpression()]
|
val constraintSystemCompleter = trace[CONSTRAINT_SYSTEM_COMPLETER, getCall().getCalleeExpression()]
|
||||||
if (constraintSystemCompleter != null) {
|
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 {
|
updateSystemIfSuccessful {
|
||||||
system ->
|
system ->
|
||||||
constraintSystemCompleter.completeConstraintSystem(system, this)
|
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
|
package foo
|
||||||
|
|
||||||
open class A {
|
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()
|
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);
|
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")
|
@TestMetadata("kt6081SubstituteIntoClassCorrectly.kt")
|
||||||
public void testKt6081SubstituteIntoClassCorrectly() throws Exception {
|
public void testKt6081SubstituteIntoClassCorrectly() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/substitutions/kt6081SubstituteIntoClassCorrectly.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/substitutions/kt6081SubstituteIntoClassCorrectly.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user