diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index f3f5946f9cb..2a050a21880 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -40,6 +40,7 @@ import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyUtils; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; +import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.util.Box; import org.jetbrains.jet.util.lazy.ReenteringLazyValueComputationException; @@ -576,12 +577,14 @@ public class BodyResolver { private void addConstraintForThisValue(ConstraintSystem constraintSystem, FunctionDescriptor resultingDescriptor) { ReceiverParameterDescriptor receiverParameter = propertyDescriptor.getReceiverParameter(); ReceiverParameterDescriptor thisObject = propertyDescriptor.getExpectedThisObject(); - if (receiverParameter == null && thisObject == null) return; + JetType typeOfThis = + receiverParameter != null ? receiverParameter.getType() : + thisObject != null ? thisObject.getType() : + KotlinBuiltIns.getInstance().getNullableNothingType(); List valueParameters = resultingDescriptor.getValueParameters(); if (valueParameters.isEmpty()) return; ValueParameterDescriptor valueParameterForThis = valueParameters.get(0); - JetType typeOfThis = receiverParameter != null ? receiverParameter.getType() : thisObject.getType(); constraintSystem.addSubtypeConstraint(typeOfThis, valueParameterForThis.getType(), ConstraintPosition.FROM_COMPLETER); } }; diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/useExpectedType.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/useExpectedType.kt index ac018117d76..1d937178eb1 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/inference/useExpectedType.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/useExpectedType.kt @@ -5,7 +5,8 @@ class A1 { var b1: String by getMyProperty1() } -var c1: String by getMyProperty1() +var c1: String by getMyProperty1() +var d1: String by MyProperty1() fun getMyProperty1() = MyProperty1() @@ -28,6 +29,9 @@ class A2 { var b2: String by getMyProperty2() } +var c2: String by getMyProperty2() +var d2: String by MyProperty2() + fun getMyProperty2() = MyProperty2() class MyProperty2 { @@ -49,6 +53,9 @@ class A3 { var b3: String by getMyProperty3() } +var c3: String by getMyProperty3() +var d3: String by MyProperty3() + fun getMyProperty3() = MyProperty3() class MyProperty3 { @@ -63,22 +70,5 @@ class MyProperty3 { } } -//-------------------------- - -class A4 { - val a4: String by MyProperty4() - val b4: String by getMyProperty4() -} - -fun getMyProperty4() = MyProperty4() - -class MyProperty4 { - - public fun get(thisRef: R, desc: PropertyMetadata): T { - println("get $thisRef ${desc.name}") - throw Exception() - } -} - //-------------------------- fun println(a: Any?) = a \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/useExpectedTypeForVal.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/useExpectedTypeForVal.kt new file mode 100644 index 00000000000..5de3690d5d7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/useExpectedTypeForVal.kt @@ -0,0 +1,62 @@ +package foo + +class A1 { + val a1: String by MyProperty1() + val b1: String by getMyProperty1() +} + +val c1: String by getMyProperty1() +val d1: String by MyProperty1() + +fun getMyProperty1() = MyProperty1() + +class MyProperty1 { + + public fun get(thisRef: R, desc: PropertyMetadata): T { + println("get $thisRef ${desc.name}") + throw Exception() + } +} + +//-------------------------- + +class A2 { + val a2: String by MyProperty2() + val b2: String by getMyProperty2() +} + +val c2: String by getMyProperty2() +val d2: String by MyProperty2() + +fun getMyProperty2() = MyProperty2() + +class MyProperty2 { + + public fun get(thisRef: Any?, desc: PropertyMetadata): T { + println("get $thisRef ${desc.name}") + throw Exception() + } +} + +//-------------------------- + +class A3 { + val a3: String by MyProperty3() + val b3: String by getMyProperty3() +} + +val c3: String by getMyProperty3() +val d3: String by MyProperty3() + +fun getMyProperty3() = MyProperty3() + +class MyProperty3 { + + public fun get(thisRef: T, desc: PropertyMetadata): String { + println("get $thisRef ${desc.name}") + return "" + } +} + +//-------------------------- +fun println(a: Any?) = a \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 6c6e4d1a01c..c95d768f16c 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2075,6 +2075,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/useExpectedType.kt"); } + @TestMetadata("useExpectedTypeForVal.kt") + public void testUseExpectedTypeForVal() throws Exception { + doTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/useExpectedTypeForVal.kt"); + } + } public static Test innerSuite() {