Fix for KT-12891: Allow to omit type in local delegated property declaration

#KT-12891 Fixed
This commit is contained in:
Michael Bogdanov
2016-07-05 17:18:46 +03:00
parent 191dfa1f2b
commit 6b8e8cee17
7 changed files with 80 additions and 6 deletions
@@ -16,7 +16,7 @@
package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors
import org.jetbrains.kotlin.descriptors.impl.VariableDescriptorWithInitializerImpl
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.diagnostics.Errors.VARIABLE_WITH_NO_TYPE_NO_INITIALIZER
@@ -62,7 +62,7 @@ class VariableTypeResolver(
return type
}
!variable.hasInitializer() -> {
if (hasDelegate && variableDescriptor is PropertyDescriptor) {
if (hasDelegate && variableDescriptor is VariableDescriptorWithAccessors) {
val property = variable as KtProperty
if (property.hasDelegateExpression()) {
return DeferredType.createRecursionIntolerant(
@@ -131,18 +131,18 @@ class VariableTypeResolver(
private fun resolveDelegatedPropertyType(
property: KtProperty,
propertyDescriptor: PropertyDescriptor,
variableDescriptor: VariableDescriptorWithAccessors,
scopeForInitializer: LexicalScope,
delegateExpression: KtExpression,
dataFlowInfo: DataFlowInfo,
trace: BindingTrace
): KotlinType {
val type = delegatedPropertyResolver.resolveDelegateExpression(
delegateExpression, property, propertyDescriptor, scopeForInitializer, trace, dataFlowInfo)
delegateExpression, property, variableDescriptor, scopeForInitializer, trace, dataFlowInfo)
val delegateFunctionsScope = ScopeUtils.makeScopeForDelegateConventionFunctions(scopeForInitializer, propertyDescriptor)
val delegateFunctionsScope = ScopeUtils.makeScopeForDelegateConventionFunctions(scopeForInitializer, variableDescriptor)
val getterReturnType = delegatedPropertyResolver.getDelegatedPropertyGetMethodReturnType(
propertyDescriptor, delegateExpression, type, trace, delegateFunctionsScope, dataFlowInfo
variableDescriptor, delegateExpression, type, trace, delegateFunctionsScope, dataFlowInfo
)
if (getterReturnType != null) {
return getterReturnType
@@ -0,0 +1,5 @@
//WITH_RUNTIME
fun box(): String {
val x by lazy { "OK" }
return x
}
@@ -0,0 +1,12 @@
package foo
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(t: Any?, p: KProperty<*>): Int = 1
}
fun box(): String {
val prop by Delegate()
return if (prop == 1) "OK" else "fail"
}
@@ -0,0 +1,19 @@
package foo
import kotlin.reflect.KProperty
class Delegate {
var inner = 1
operator fun getValue(t: Any?, p: KProperty<*>): Int = inner
operator fun setValue(t: Any?, p: KProperty<*>, i: Int) {
inner = i
}
}
fun box(): String {
var prop by Delegate()
if (prop != 1) return "fail get"
prop = 2
if (prop != 2) return "fail set"
return "OK"
}
@@ -0,0 +1,14 @@
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(t: Any?, p: KProperty<*>): Int = 3
}
fun foo(): Int {
val prop by Delegate()
return prop
}
val x = foo()
// expected: x: 3
@@ -5322,17 +5322,35 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest(fileName);
}
@TestMetadata("kt12891.kt")
public void testKt12891() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/local/kt12891.kt");
doTest(fileName);
}
@TestMetadata("localVal.kt")
public void testLocalVal() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/local/localVal.kt");
doTest(fileName);
}
@TestMetadata("localValNoExplicitType.kt")
public void testLocalValNoExplicitType() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/local/localValNoExplicitType.kt");
doTest(fileName);
}
@TestMetadata("localVar.kt")
public void testLocalVar() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/local/localVar.kt");
doTest(fileName);
}
@TestMetadata("localVarNoExplicitType.kt")
public void testLocalVarNoExplicitType() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/local/localVarNoExplicitType.kt");
doTest(fileName);
}
}
}
@@ -71,6 +71,12 @@ public class ScriptCodegenTestGenerated extends AbstractScriptCodegenTest {
doTest(fileName);
}
@TestMetadata("localDelegatedPropertyNoExplicitType.kts")
public void testLocalDelegatedPropertyNoExplicitType() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/script/localDelegatedPropertyNoExplicitType.kts");
doTest(fileName);
}
@TestMetadata("localFunction.kts")
public void testLocalFunction() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/script/localFunction.kts");