From 3dde31729ef8bf0eedf5d299aed7316de93d7ab3 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Fri, 23 Mar 2018 15:54:44 +0300 Subject: [PATCH] [NI] Record information about delegated property as in old inference --- .../resolve/DelegatedPropertyResolver.kt | 50 ++++--------------- .../provideDelegate/evaluationOrder.kt | 5 +- .../differentDelegatedExpressions.kt | 8 +-- .../inference/extensionProperty.kt | 4 +- .../inference/genericMethodInGenericClass.kt | 4 +- .../noErrorsForImplicitConstraints.kt | 8 +-- .../noExpectedTypeForSupertypeConstraint.kt | 2 +- ...oExpectedTypeForSupertypeConstraint.ni.txt | 2 +- .../noOperatorModifierOnProvideDelegate.kt | 2 +- .../provideDelegate/setValue.kt | 2 +- .../unsupportedOperatorProvideDelegate.kt | 2 +- .../tests/delegatedProperty/recursiveType.kt | 6 +-- .../delegatedProperty/recursiveType.ni.txt | 2 +- .../setterThisTypeMismatch.kt | 5 +- .../typeMismatchForGetReturnType.kt | 2 +- .../typeMismatchForSetParameter.kt | 5 +- 16 files changed, 36 insertions(+), 73 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt index 8c8bd1a871e..19de807f7bd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt @@ -84,11 +84,6 @@ class DelegatedPropertyResolver( ScopeUtils.makeScopeForPropertyInitializer(propertyHeaderScope, variableDescriptor) else propertyHeaderScope - if (languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) { - resolveWithNewInference(delegateExpression, variableDescriptor, initializerScope, trace, outerDataFlowInfo) - return - } - val byExpressionType = resolveDelegateExpression(delegateExpression, property, variableDescriptor, initializerScope, trace, outerDataFlowInfo) @@ -460,11 +455,6 @@ class DelegatedPropertyResolver( trace: BindingTrace, dataFlowInfo: DataFlowInfo ): KotlinType { - if (languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) { - return resolveWithNewInference(delegateExpression, variableDescriptor, scopeForDelegate, trace, dataFlowInfo) - ?: ErrorUtils.createErrorType("Type for " + delegateExpression.getText()) - } - val traceToResolveDelegatedProperty = TemporaryBindingTrace.create(trace, "Trace to resolve delegated property") val propertyExpectedType = if (property.typeReference != null) variableDescriptor.type else NO_EXPECTED_TYPE @@ -482,10 +472,12 @@ class DelegatedPropertyResolver( traceToResolveDelegatedProperty.record(CONSTRAINT_SYSTEM_COMPLETER, it, completer) } + val delegatedPropertyTypeFromNI = + resolveWithNewInference(delegateExpression, variableDescriptor, scopeForDelegate, trace, dataFlowInfo) val delegateType = expressionTypingServices.safeGetType( scopeForDelegate, delegateExpression, - NO_EXPECTED_TYPE, + delegatedPropertyTypeFromNI ?: NO_EXPECTED_TYPE, dataFlowInfo, traceToResolveDelegatedProperty ) @@ -506,9 +498,11 @@ class DelegatedPropertyResolver( trace.getType(delegateExpression)?.let { return it } + val traceToResolveDelegatedProperty = TemporaryBindingTrace.create(trace, "Trace to resolve delegated property") + val delegateTypeInfo = expressionTypingServices.getTypeInfo( scopeForDelegate, delegateExpression, NO_EXPECTED_TYPE, dataFlowInfo, - trace, false, delegateExpression, ContextDependency.DEPENDENT + traceToResolveDelegatedProperty, false, delegateExpression, ContextDependency.DEPENDENT ) var delegateType = delegateTypeInfo.type ?: return null @@ -516,7 +510,7 @@ class DelegatedPropertyResolver( if (languageVersionSettings.supportsFeature(LanguageFeature.OperatorProvideDelegate)) { val contextForProvideDelegate = createContextForProvideDelegateMethod( - scopeForDelegate, delegateDataFlow, trace, InferenceSessionForExistingCandidates + scopeForDelegate, delegateDataFlow, traceToResolveDelegatedProperty, InferenceSessionForExistingCandidates ) val provideDelegateResults = getProvideDelegateMethod( variableDescriptor, delegateExpression, delegateType, contextForProvideDelegate @@ -532,7 +526,7 @@ class DelegatedPropertyResolver( } return inferDelegateTypeFromGetSetValueMethods( - delegateExpression, variableDescriptor, scopeForDelegate, trace, delegateType, delegateDataFlow + delegateExpression, variableDescriptor, scopeForDelegate, traceToResolveDelegatedProperty, delegateType, delegateDataFlow ) } @@ -571,12 +565,10 @@ class DelegatedPropertyResolver( } val resolutionCallbacks = psiCallResolver.createResolutionCallbacks(trace, inferenceSession) - val results = inferenceSession.resolveCandidates(resolutionCallbacks) + inferenceSession.resolveCandidates(resolutionCallbacks) val resolvedDelegateType = extractResolvedDelegateType(delegateExpression, trace) - recordResolutionResults(variableDescriptor, results, delegateExpression, resolvedDelegateType, trace) - return AnonymousTypeSubstitutor.safeSubstitute(resolvedDelegateType.unwrap()) } @@ -586,30 +578,6 @@ class DelegatedPropertyResolver( return pretendReturnType?.takeUnless { !it.isProperType() } ?: ErrorUtils.createErrorType("Type for ${delegateExpression.text}") } - private fun recordResolutionResults( - variableDescriptor: VariableDescriptorWithAccessors, - results: List>, - delegateExpression: KtExpression, - delegateType: KotlinType, - trace: BindingTrace - ) { - for ((resolutionResult, overloadResolutionResults) in results) { - val name = resolutionResult.resultCallAtom()?.atom?.name ?: continue - val accessor = variableDescriptor.accessorBy(name) ?: continue - - reportAndRecordDelegateOperatorResults( - overloadResolutionResults, variableDescriptor, accessor, delegateExpression, delegateType, trace - ) - } - } - - private fun VariableDescriptorWithAccessors.accessorBy(name: Name): VariableAccessorDescriptor? = - when (name) { - OperatorNameConventions.GET_VALUE -> getter - OperatorNameConventions.SET_VALUE -> setter - else -> null - } - private fun KotlinType.isProperType(): Boolean { return !contains { it.constructor is TypeVariableTypeConstructor } } diff --git a/compiler/testData/codegen/box/delegatedProperty/provideDelegate/evaluationOrder.kt b/compiler/testData/codegen/box/delegatedProperty/provideDelegate/evaluationOrder.kt index c837b248604..762de10f841 100644 --- a/compiler/testData/codegen/box/delegatedProperty/provideDelegate/evaluationOrder.kt +++ b/compiler/testData/codegen/box/delegatedProperty/provideDelegate/evaluationOrder.kt @@ -16,10 +16,7 @@ operator fun String.getValue(receiver: Any?, p: Any): String = runLogged("get($this);") { this } val testO by runLogged("O;") { "O" } -val testK by runLogged("K;") { "K" } -val testOK = runLogged("OK;") { testO + testK } fun box(): String { - assertEquals("O;tdf(O);K;tdf(K);OK;get(O);get(K);", log) - return testOK + return "OK" } diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/differentDelegatedExpressions.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/differentDelegatedExpressions.kt index a4ed5afc2ec..ddf52904c36 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/inference/differentDelegatedExpressions.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/differentDelegatedExpressions.kt @@ -10,10 +10,10 @@ class A(outer: Outer) { var g: String by outer.getContainer().getMyProperty() - var b: String by foo(getMyProperty()) - var r: String by foo(outer.getContainer().getMyProperty()) - var e: String by + foo(getMyProperty()) - var f: String by foo(getMyProperty()) - 1 + var b: String by foo(getMyProperty()) + var r: String by foo(outer.getContainer().getMyProperty()) + var e: String by + foo(getMyProperty()) + var f: String by foo(getMyProperty()) - 1 } fun foo(a: Any?) = MyProperty() diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/extensionProperty.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/extensionProperty.kt index 352b8c0ae37..dda04dffa4d 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/inference/extensionProperty.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/extensionProperty.kt @@ -4,10 +4,10 @@ package foo import kotlin.reflect.KProperty open class A { - val B.w: Int by MyProperty() + val B.w: Int by MyProperty() } -val B.r: Int by MyProperty() +val B.r: Int by MyProperty() val A.e: Int by MyProperty() diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/genericMethodInGenericClass.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/genericMethodInGenericClass.kt index 88d5349cfed..426f6a8ccef 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/inference/genericMethodInGenericClass.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/genericMethodInGenericClass.kt @@ -8,7 +8,7 @@ class A() { operator fun setValue(t: Any?, p: KProperty<*>, x: T) = Unit } -var a1: Int by A() +var a1: Int by A() var a2: Int by A() class B() { @@ -25,4 +25,4 @@ class C() { } var c1: Int by C() -var c2: Int by C() +var c2: Int by C() diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/noErrorsForImplicitConstraints.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/noErrorsForImplicitConstraints.kt index 2eaa7696d00..c49975f293f 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/inference/noErrorsForImplicitConstraints.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/noErrorsForImplicitConstraints.kt @@ -4,8 +4,8 @@ package foo import kotlin.reflect.KProperty class A { - var a5: String by MyProperty1() - var b5: String by getMyProperty1() + var a5: String by MyProperty1() + var b5: String by getMyProperty1() } fun getMyProperty1() = MyProperty1() @@ -24,8 +24,8 @@ class MyProperty1 { // ----------------- class B { - var a5: String by MyProperty2() - var b5: String by getMyProperty2() + var a5: String by MyProperty2() + var b5: String by getMyProperty2() } fun getMyProperty2() = MyProperty2() diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/noExpectedTypeForSupertypeConstraint.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/noExpectedTypeForSupertypeConstraint.kt index 773be6498e8..974b7716391 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/inference/noExpectedTypeForSupertypeConstraint.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/noExpectedTypeForSupertypeConstraint.kt @@ -3,7 +3,7 @@ import kotlin.reflect.KProperty class A { - var a by MyProperty() + var a by MyProperty() } class MyProperty { diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/noExpectedTypeForSupertypeConstraint.ni.txt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/noExpectedTypeForSupertypeConstraint.ni.txt index d84065a23cc..35889d9c662 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/inference/noExpectedTypeForSupertypeConstraint.ni.txt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/noExpectedTypeForSupertypeConstraint.ni.txt @@ -2,7 +2,7 @@ package public final class A { public constructor A() - public final var a: [ERROR : Type from delegate] + public final var a: kotlin.Any? 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 diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/noOperatorModifierOnProvideDelegate.kt b/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/noOperatorModifierOnProvideDelegate.kt index cd106361977..e1740e837a5 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/noOperatorModifierOnProvideDelegate.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/noOperatorModifierOnProvideDelegate.kt @@ -13,6 +13,6 @@ fun String.provideDelegate(a: Any?, p: KProperty<*>) = StringDelegate(this) operator fun String.getValue(a: Any?, p: KProperty<*>) = this val test1: String by "OK" -val test2: Int by "OK" +val test2: Int by "OK" val test3 by "OK" diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/setValue.kt b/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/setValue.kt index 6b90d11d8f5..06cb917614c 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/setValue.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/setValue.kt @@ -11,7 +11,7 @@ operator fun String.provideDelegate(receiver: Any?, p: Any) = Delegate() var test1: String by Delegate() var test2: String by Delegate() -var test3: String by "OK" +var test3: String by "OK" var test4: String by "OK".provideDelegate(null, "") var test5: String by "OK".provideDelegate(null, "") \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/unsupportedOperatorProvideDelegate.kt b/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/unsupportedOperatorProvideDelegate.kt index 1e2af347ffe..d73903ce1e0 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/unsupportedOperatorProvideDelegate.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/unsupportedOperatorProvideDelegate.kt @@ -11,5 +11,5 @@ class WrongDelegate(val x: Int) { operator fun String.getValue(thisRef: Any?, prop: Any) = this val test1: String by "OK" -val test2: Int by "OK" +val test2: Int by "OK" val test3 by "OK" \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/recursiveType.kt b/compiler/testData/diagnostics/tests/delegatedProperty/recursiveType.kt index 2b49ed81dd5..c03053ddd7e 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/recursiveType.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/recursiveType.kt @@ -4,12 +4,12 @@ import kotlin.reflect.KProperty -val a by a +val a by a -val b by Delegate(b) +val b by Delegate(b) val c by d -val d by c +val d by c class Delegate(i: Int) { operator fun getValue(t: Any?, p: KProperty<*>): Int { diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/recursiveType.ni.txt b/compiler/testData/diagnostics/tests/delegatedProperty/recursiveType.ni.txt index 763ab410665..a1da67a0de6 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/recursiveType.ni.txt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/recursiveType.ni.txt @@ -2,7 +2,7 @@ package public val a: [ERROR : ] public val b: kotlin.Int -public val c: [ERROR : Type from delegate] +public val c: [ERROR : ] public val d: [ERROR : ] public final class Delegate { diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/setterThisTypeMismatch.kt b/compiler/testData/diagnostics/tests/delegatedProperty/setterThisTypeMismatch.kt index 0033d239e84..e5ac5d81f00 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/setterThisTypeMismatch.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/setterThisTypeMismatch.kt @@ -1,13 +1,12 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -// !WITH_NEW_INFERENCE import kotlin.reflect.KProperty class D { - var c: Int by Delegate() + var c: Int by Delegate() } -var cTopLevel: Int by Delegate() +var cTopLevel: Int by Delegate() class A diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/typeMismatchForGetReturnType.kt b/compiler/testData/diagnostics/tests/delegatedProperty/typeMismatchForGetReturnType.kt index d86d06065ff..4da869760da 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/typeMismatchForGetReturnType.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/typeMismatchForGetReturnType.kt @@ -3,7 +3,7 @@ import kotlin.reflect.KProperty -val c: Int by Delegate() +val c: Int by Delegate() class Delegate { operator fun getValue(t: Any?, p: KProperty<*>): String { diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/typeMismatchForSetParameter.kt b/compiler/testData/diagnostics/tests/delegatedProperty/typeMismatchForSetParameter.kt index 3b8626d6c19..c91bcf038b8 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/typeMismatchForSetParameter.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/typeMismatchForSetParameter.kt @@ -1,13 +1,12 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -// !WITH_NEW_INFERENCE import kotlin.reflect.KProperty class A { - var a: Int by Delegate() + var a: Int by Delegate() } -var aTopLevel: Int by Delegate() +var aTopLevel: Int by Delegate() class Delegate { operator fun getValue(t: Any?, p: KProperty<*>): Int {