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:
Svetlana Isakova
2015-06-27 14:26:03 +03:00
parent 9a5abf368f
commit cf64687b02
5 changed files with 41 additions and 8 deletions
@@ -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)
} }
} }
@@ -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()
@@ -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
@@ -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");