Remove PropertyMetadata from project and bytecode, migrate code to KProperty

This commit is contained in:
Alexander Udalov
2015-11-20 16:37:47 +03:00
parent fb61dc7e81
commit 7b3b157707
22 changed files with 99 additions and 74 deletions
@@ -484,13 +484,13 @@ public abstract class MemberCodegen<T extends KtElement/* TODO: & JetDeclaration
if (delegatedProperties.isEmpty()) return; if (delegatedProperties.isEmpty()) return;
v.newField(NO_ORIGIN, ACC_PRIVATE | ACC_STATIC | ACC_FINAL | ACC_SYNTHETIC, JvmAbi.DELEGATED_PROPERTIES_ARRAY_NAME, v.newField(NO_ORIGIN, ACC_PRIVATE | ACC_STATIC | ACC_FINAL | ACC_SYNTHETIC, JvmAbi.DELEGATED_PROPERTIES_ARRAY_NAME,
"[" + PROPERTY_METADATA_TYPE, null, null); "[" + K_PROPERTY_TYPE, null, null);
if (state.getClassBuilderMode() == ClassBuilderMode.LIGHT_CLASSES) return; if (state.getClassBuilderMode() == ClassBuilderMode.LIGHT_CLASSES) return;
InstructionAdapter iv = createOrGetClInitCodegen().v; InstructionAdapter iv = createOrGetClInitCodegen().v;
iv.iconst(delegatedProperties.size()); iv.iconst(delegatedProperties.size());
iv.newarray(PROPERTY_METADATA_TYPE); iv.newarray(K_PROPERTY_TYPE);
for (int i = 0, size = delegatedProperties.size(); i < size; i++) { for (int i = 0, size = delegatedProperties.size(); i < size; i++) {
PropertyDescriptor property = PropertyDescriptor property =
@@ -529,12 +529,12 @@ public abstract class MemberCodegen<T extends KtElement/* TODO: & JetDeclaration
); );
} }
value.put(PROPERTY_METADATA_TYPE, iv); value.put(K_PROPERTY_TYPE, iv);
iv.astore(PROPERTY_METADATA_TYPE); iv.astore(K_PROPERTY_TYPE);
} }
iv.putstatic(thisAsmType.getInternalName(), JvmAbi.DELEGATED_PROPERTIES_ARRAY_NAME, "[" + PROPERTY_METADATA_TYPE); iv.putstatic(thisAsmType.getInternalName(), JvmAbi.DELEGATED_PROPERTIES_ARRAY_NAME, "[" + K_PROPERTY_TYPE);
} }
public String getClassName() { public String getClassName() {
@@ -58,7 +58,7 @@ import static org.jetbrains.kotlin.codegen.AsmUtil.*;
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface;
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.*; import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.*;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.*; import static org.jetbrains.kotlin.resolve.DescriptorUtils.*;
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.PROPERTY_METADATA_TYPE; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.K_PROPERTY_TYPE;
import static org.jetbrains.kotlin.resolve.jvm.annotations.AnnotationUtilKt.hasJvmFieldAnnotation; import static org.jetbrains.kotlin.resolve.jvm.annotations.AnnotationUtilKt.hasJvmFieldAnnotation;
import static org.jetbrains.org.objectweb.asm.Opcodes.*; import static org.jetbrains.org.objectweb.asm.Opcodes.*;
@@ -521,13 +521,15 @@ public class PropertyCodegen {
codegen.tempVariables.put( codegen.tempVariables.put(
resolvedCall.getCall().getValueArguments().get(propertyMetadataArgumentIndex).asElement(), resolvedCall.getCall().getValueArguments().get(propertyMetadataArgumentIndex).asElement(),
new StackValue(PROPERTY_METADATA_TYPE) { new StackValue(K_PROPERTY_TYPE) {
@Override @Override
public void putSelector(@NotNull Type type, @NotNull InstructionAdapter v) { public void putSelector(@NotNull Type type, @NotNull InstructionAdapter v) {
Field array = StackValue Field array = StackValue.field(
.field(Type.getType("[" + PROPERTY_METADATA_TYPE), owner, JvmAbi.DELEGATED_PROPERTIES_ARRAY_NAME, true, Type.getType("[" + K_PROPERTY_TYPE), owner, JvmAbi.DELEGATED_PROPERTIES_ARRAY_NAME, true, StackValue.none()
StackValue.none()); );
StackValue.arrayElement(PROPERTY_METADATA_TYPE, array, StackValue.constant(indexInPropertyMetadataArray, Type.INT_TYPE)).put(type, v); StackValue.arrayElement(
K_PROPERTY_TYPE, array, StackValue.constant(indexInPropertyMetadataArray, Type.INT_TYPE)
).put(type, v);
} }
} }
); );
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.container package org.jetbrains.kotlin.container
import kotlin.reflect.KProperty
public fun createContainer(id: String, init: StorageComponentContainer.() -> Unit): StorageComponentContainer { public fun createContainer(id: String, init: StorageComponentContainer.() -> Unit): StorageComponentContainer {
val c = StorageComponentContainer(id) val c = StorageComponentContainer(id)
c.init() c.init()
@@ -24,11 +26,11 @@ public fun createContainer(id: String, init: StorageComponentContainer.() -> Uni
} }
public inline fun <reified T : Any> StorageComponentContainer.useImpl() { public inline fun <reified T : Any> StorageComponentContainer.useImpl() {
registerSingleton(javaClass<T>()) registerSingleton(T::class.java)
} }
public inline fun <reified T : Any> ComponentProvider.get(): T { public inline fun <reified T : Any> ComponentProvider.get(): T {
return getService(javaClass<T>()) return getService(T::class.java)
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -40,6 +42,6 @@ public fun StorageComponentContainer.useInstance(instance: Any) {
registerInstance(instance) registerInstance(instance)
} }
inline operator fun <reified T : Any> ComponentProvider.getValue(thisRef: Any?, desc: PropertyMetadata): T { inline operator fun <reified T : Any> ComponentProvider.getValue(thisRef: Any?, desc: KProperty<*>): T {
return getService(javaClass<T>()) return getService(T::class.java)
} }
@@ -31,7 +31,6 @@ public class AsmTypes {
public static final Type JAVA_CLASS_TYPE = getType(Class.class); public static final Type JAVA_CLASS_TYPE = getType(Class.class);
public static final Type UNIT_TYPE = Type.getObjectType("kotlin/Unit"); public static final Type UNIT_TYPE = Type.getObjectType("kotlin/Unit");
public static final Type PROPERTY_METADATA_TYPE = Type.getObjectType("kotlin/PropertyMetadata");
public static final Type LAMBDA = Type.getObjectType("kotlin/jvm/internal/Lambda"); public static final Type LAMBDA = Type.getObjectType("kotlin/jvm/internal/Lambda");
public static final Type FUNCTION_REFERENCE = Type.getObjectType("kotlin/jvm/internal/FunctionReference"); public static final Type FUNCTION_REFERENCE = Type.getObjectType("kotlin/jvm/internal/FunctionReference");
@@ -59,6 +58,7 @@ public class AsmTypes {
public static final Type K_FUNCTION = reflect("KFunction"); public static final Type K_FUNCTION = reflect("KFunction");
public static final Type K_PROPERTY_TYPE = reflect("KProperty");
public static final Type K_PROPERTY0_TYPE = reflect("KProperty0"); public static final Type K_PROPERTY0_TYPE = reflect("KProperty0");
public static final Type K_PROPERTY1_TYPE = reflect("KProperty1"); public static final Type K_PROPERTY1_TYPE = reflect("KProperty1");
public static final Type K_PROPERTY2_TYPE = reflect("KProperty2"); public static final Type K_PROPERTY2_TYPE = reflect("KProperty2");
@@ -25,11 +25,11 @@ class CustomDelegate3 {
operator fun set(thisRef: Any?, prop: KProperty<*>, value: String) {} operator fun set(thisRef: Any?, prop: KProperty<*>, value: String) {}
} }
operator fun OkDelegate.get(thisRef: Any?, prop: <!DEPRECATION!>PropertyMetadata<!>): Int = 4 operator fun OkDelegate.get(thisRef: Any?, prop: KProperty<*>): Int = 4
operator fun OkDelegate.set(thisRef: Any?, prop: <!DEPRECATION!>PropertyMetadata<!>, value: Int) {} operator fun OkDelegate.set(thisRef: Any?, prop: KProperty<*>, value: Int) {}
operator fun CustomDelegate3.getValue(thisRef: Any?, prop: <!DEPRECATION!>PropertyMetadata<!>): Int = 4 operator fun CustomDelegate3.getValue(thisRef: Any?, prop: KProperty<*>): Int = 4
operator fun CustomDelegate3.setValue(thisRef: Any?, prop: <!DEPRECATION!>PropertyMetadata<!>, value: Int) {} operator fun CustomDelegate3.setValue(thisRef: Any?, prop: KProperty<*>, value: Int) {}
class Example { class Example {
@@ -1,9 +1,9 @@
package package
public operator fun OkDelegate.get(/*0*/ thisRef: kotlin.Any?, /*1*/ prop: kotlin.PropertyMetadata): kotlin.Int public operator fun OkDelegate.get(/*0*/ thisRef: kotlin.Any?, /*1*/ prop: kotlin.reflect.KProperty<*>): kotlin.Int
public operator fun CustomDelegate3.getValue(/*0*/ thisRef: kotlin.Any?, /*1*/ prop: kotlin.PropertyMetadata): kotlin.Int public operator fun CustomDelegate3.getValue(/*0*/ thisRef: kotlin.Any?, /*1*/ prop: kotlin.reflect.KProperty<*>): kotlin.Int
public operator fun OkDelegate.set(/*0*/ thisRef: kotlin.Any?, /*1*/ prop: kotlin.PropertyMetadata, /*2*/ value: kotlin.Int): kotlin.Unit public operator fun OkDelegate.set(/*0*/ thisRef: kotlin.Any?, /*1*/ prop: kotlin.reflect.KProperty<*>, /*2*/ value: kotlin.Int): kotlin.Unit
public operator fun CustomDelegate3.setValue(/*0*/ thisRef: kotlin.Any?, /*1*/ prop: kotlin.PropertyMetadata, /*2*/ value: kotlin.Int): kotlin.Unit public operator fun CustomDelegate3.setValue(/*0*/ thisRef: kotlin.Any?, /*1*/ prop: kotlin.reflect.KProperty<*>, /*2*/ value: kotlin.Int): kotlin.Unit
public final class CustomDelegate { public final class CustomDelegate {
public constructor CustomDelegate() public constructor CustomDelegate()
@@ -1,11 +1,13 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION // !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
operator fun Any.getValue(x: Any?, y: Any): Any = null!! operator fun Any.getValue(x: Any?, y: Any): Any = null!!
class <!CONFLICTING_JVM_DECLARATIONS!>C<!> { class <!CONFLICTING_JVM_DECLARATIONS!>C<!> {
val x by 1 val x by 1
<!CONFLICTING_JVM_DECLARATIONS!>val `$$delegatedProperties`: Array<PropertyMetadata><!> = null!! <!CONFLICTING_JVM_DECLARATIONS!>val `$$delegatedProperties`: Array<KProperty<*>><!> = null!!
} }
val x by 1 val x by 1
<!CONFLICTING_JVM_DECLARATIONS!>val `$$delegatedProperties`: Array<PropertyMetadata><!> = null!! <!CONFLICTING_JVM_DECLARATIONS!>val `$$delegatedProperties`: Array<KProperty<*>><!> = null!!
@@ -1,12 +1,12 @@
package package
public val `$$delegatedProperties`: kotlin.Array<kotlin.PropertyMetadata> public val `$$delegatedProperties`: kotlin.Array<kotlin.reflect.KProperty<*>>
public val x: kotlin.Any public val x: kotlin.Any
public operator fun kotlin.Any.getValue(/*0*/ x: kotlin.Any?, /*1*/ y: kotlin.Any): kotlin.Any public operator fun kotlin.Any.getValue(/*0*/ x: kotlin.Any?, /*1*/ y: kotlin.Any): kotlin.Any
public final class C { public final class C {
public constructor C() public constructor C()
public final val `$$delegatedProperties`: kotlin.Array<kotlin.PropertyMetadata> public final val `$$delegatedProperties`: kotlin.Array<kotlin.reflect.KProperty<*>>
public final val x: kotlin.Any public final val x: kotlin.Any
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 hashCode(): kotlin.Int
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
import java.util.* import java.util.*
import kotlin.reflect.KProperty
val KOTLIN_REFLECT_FQ_NAME = FqName("kotlin.reflect") val KOTLIN_REFLECT_FQ_NAME = FqName("kotlin.reflect")
@@ -43,7 +44,7 @@ public class ReflectionTypes(private val module: ModuleDescriptor) {
} }
private object ClassLookup { private object ClassLookup {
operator fun getValue(types: ReflectionTypes, property: PropertyMetadata): ClassDescriptor { operator fun getValue(types: ReflectionTypes, property: KProperty<*>): ClassDescriptor {
return types.find(property.name.capitalize()) return types.find(property.name.capitalize())
} }
} }
@@ -75,7 +76,7 @@ public class ReflectionTypes(private val module: ModuleDescriptor) {
): KotlinType { ): KotlinType {
val arguments = KotlinBuiltIns.getFunctionTypeArgumentProjections(receiverType, parameterTypes, returnType) val arguments = KotlinBuiltIns.getFunctionTypeArgumentProjections(receiverType, parameterTypes, returnType)
val classDescriptor = getKFunction(arguments.size() - 1 /* return type */) val classDescriptor = getKFunction(arguments.size - 1 /* return type */)
if (ErrorUtils.isError(classDescriptor)) { if (ErrorUtils.isError(classDescriptor)) {
return classDescriptor.defaultType return classDescriptor.defaultType
@@ -19,12 +19,10 @@ package org.jetbrains.kotlin.renderer
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
import kotlin.jvm.internal.PropertyReference1Impl
import kotlin.properties.Delegates import kotlin.properties.Delegates
import kotlin.properties.ObservableProperty import kotlin.properties.ObservableProperty
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KParameter
import kotlin.reflect.KProperty
import kotlin.reflect.KType
internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions { internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions {
public var isLocked: Boolean = false public var isLocked: Boolean = false
@@ -43,22 +41,11 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions {
if (field.modifiers.and(Modifier.STATIC) != 0) continue if (field.modifiers.and(Modifier.STATIC) != 0) continue
field.isAccessible = true field.isAccessible = true
val property = field.get(this) as? ObservableProperty<*> ?: continue val property = field.get(this) as? ObservableProperty<*> ?: continue
val value = property.getValue(this, object : KProperty<Any?>, PropertyMetadata { assert(!field.name.startsWith("is")) { "Fields named is* are not supported here yet" }
override val parameters: List<KParameter> val value = property.getValue(
get() = error("Should not be called") this,
override val returnType: KType PropertyReference1Impl(DescriptorRendererOptionsImpl::class, field.name, "get" + field.name.capitalize())
get() = error("Should not be called") )
override val getter: KProperty.Getter<Any?>
get() = error("Should not be called")
override val annotations: List<Annotation>
get() = error("Should not be called")
override fun call(vararg args: Any?): Any? = error("Should not be called")
override fun callBy(args: Map<KParameter, Any?>): Any? = error("Should not be called")
override val name = "" /* not used */
})
field.set(copy, copy.property(value as Any)) field.set(copy, copy.property(value as Any))
} }
@@ -14,6 +14,22 @@
* limitations under the License. * limitations under the License.
*/ */
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package kotlin package kotlin
@Deprecated("Please use KProperty instead.") @Deprecated("Please use KProperty instead.")
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.storage package org.jetbrains.kotlin.storage
import kotlin.reflect.KProperty
public interface MemoizedFunctionToNotNull<P, R : Any> : Function1<P, R> { public interface MemoizedFunctionToNotNull<P, R : Any> : Function1<P, R> {
public fun isComputed(key: P): Boolean public fun isComputed(key: P): Boolean
} }
@@ -32,6 +34,6 @@ public interface NullableLazyValue<T : Any> : Function0<T?> {
public fun isComputed(): Boolean public fun isComputed(): Boolean
} }
public operator fun <T : Any> NotNullLazyValue<T>.getValue(_this: Any?, p: PropertyMetadata): T = invoke() public operator fun <T : Any> NotNullLazyValue<T>.getValue(_this: Any?, p: KProperty<*>): T = invoke()
public operator fun <T : Any> NullableLazyValue<T>.getValue(_this: Any?, p: PropertyMetadata): T? = invoke() public operator fun <T : Any> NullableLazyValue<T>.getValue(_this: Any?, p: KProperty<*>): T? = invoke()
+3 -2
View File
@@ -1,6 +1,7 @@
import pack.oldFun1 import pack.oldFun1
import pack.oldFun2 // should not be removed for non-deprecated overload used import pack.oldFun2 // should not be removed for non-deprecated overload used
import pack.oldFun3 import pack.oldFun3
import kotlin.reflect.KProperty
class A private() class A private()
@@ -40,8 +41,8 @@ annotation class Fancy(val param: Int)
@Fancy(<caret>i) class D @Fancy(<caret>i) class D
class CustomDelegate { class CustomDelegate {
operator fun get(thisRef: Any?, prop: PropertyMetadata): String = "" operator fun get(thisRef: Any?, prop: KProperty<*>): String = ""
operator fun set(thisRef: Any?, prop: PropertyMetadata, value: String) {} operator fun set(thisRef: Any?, prop: KProperty<*>, value: String) {}
} }
class B { class B {
@@ -15,12 +15,14 @@ class BigTest {
// FILE: second.kt // FILE: second.kt
package some package some
import kotlin.reflect.KProperty
class DelegateImpl<T> { class DelegateImpl<T> {
val value: T = null!! val value: T = null!!
} }
public fun <T> DelegateImpl<T>.getValue(thisRef: Any?, property: PropertyMetadata): T = value public fun <T> DelegateImpl<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value
public fun <T> DelegateImpl<T>.setValue(thisRef: Any, propertyMetadata: PropertyMetadata, t: T) {} public fun <T> DelegateImpl<T>.setValue(thisRef: Any, property: KProperty<*>, t: T) {}
@@ -38,5 +40,3 @@ import some.setValue
class BigTest { class BigTest {
var a by <caret>DelegateImpl<Int>() var a by <caret>DelegateImpl<Int>()
} }
@@ -15,11 +15,13 @@ class BigTest {
// FILE: second.kt // FILE: second.kt
package some package some
import kotlin.reflect.KProperty
class DelegateImpl<T> { class DelegateImpl<T> {
val value: T = null!! val value: T = null!!
} }
public fun <T> DelegateImpl<T>.getValue(thisRef: Any?, property: PropertyMetadata): T = value public fun <T> DelegateImpl<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value
@@ -15,12 +15,14 @@ class BigTest {
// FILE: second.kt // FILE: second.kt
package some package some
import kotlin.reflect.KProperty
class DelegateImpl<T> { class DelegateImpl<T> {
val value: T = null!! val value: T = null!!
} }
operator fun <T> DelegateImpl<T>.getValue(thisRef: Any?, property: PropertyMetadata): T = value operator fun <T> DelegateImpl<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value
operator fun <T> DelegateImpl<T>.setValue(thisRef: Any, propertyMetadata: PropertyMetadata, t: T) {} operator fun <T> DelegateImpl<T>.setValue(thisRef: Any, property: KProperty<*>, t: T) {}
@@ -37,5 +39,3 @@ import some.setValue
class BigTest { class BigTest {
var a by <caret>DelegateImpl<Int>() var a by <caret>DelegateImpl<Int>()
} }
@@ -1,7 +1,9 @@
// "Rename to 'getValue'" "true" // "Rename to 'getValue'" "true"
import kotlin.reflect.KProperty
class CustomDelegate class CustomDelegate
operator fun CustomDelegate.get(thisRef: Any?, prop: PropertyMetadata): String = "" operator fun CustomDelegate.get(thisRef: Any?, prop: KProperty<*>): String = ""
class Example { class Example {
val a: String <caret>by CustomDelegate() val a: String <caret>by CustomDelegate()
@@ -1,7 +1,9 @@
// "Rename to 'getValue'" "true" // "Rename to 'getValue'" "true"
import kotlin.reflect.KProperty
class CustomDelegate class CustomDelegate
operator fun CustomDelegate.getValue(thisRef: Any?, prop: PropertyMetadata): String = "" operator fun CustomDelegate.getValue(thisRef: Any?, prop: KProperty<*>): String = ""
class Example { class Example {
val a: String by CustomDelegate() val a: String by CustomDelegate()
@@ -1,9 +1,11 @@
// "Rename to 'setValue'" "true" // "Rename to 'setValue'" "true"
// ERROR: 'get' method convention on type 'CustomDelegate' is deprecated. Rename to 'getValue' // ERROR: 'get' method convention on type 'CustomDelegate' is deprecated. Rename to 'getValue'
import kotlin.reflect.KProperty
class CustomDelegate { class CustomDelegate {
operator fun get(thisRef: Any?, prop: PropertyMetadata): String = "" operator fun get(thisRef: Any?, prop: KProperty<*>): String = ""
operator fun set(thisRef: Any?, prop: PropertyMetadata, value: String) {} operator fun set(thisRef: Any?, prop: KProperty<*>, value: String) {}
} }
class Example { class Example {
@@ -1,9 +1,11 @@
// "Rename to 'setValue'" "true" // "Rename to 'setValue'" "true"
// ERROR: 'get' method convention on type 'CustomDelegate' is deprecated. Rename to 'getValue' // ERROR: 'get' method convention on type 'CustomDelegate' is deprecated. Rename to 'getValue'
import kotlin.reflect.KProperty
class CustomDelegate { class CustomDelegate {
operator fun get(thisRef: Any?, prop: PropertyMetadata): String = "" operator fun get(thisRef: Any?, prop: KProperty<*>): String = ""
operator fun setValue(thisRef: Any?, prop: PropertyMetadata, value: String) {} operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) {}
} }
class Example { class Example {
@@ -16,13 +16,15 @@
package com.google.dart.compiler.backend.js.ast.metadata package com.google.dart.compiler.backend.js.ast.metadata
import kotlin.reflect.KProperty
internal class MetadataProperty<in T : HasMetadata, R>(val default: R) { internal class MetadataProperty<in T : HasMetadata, R>(val default: R) {
operator fun getValue(thisRef: T, desc: PropertyMetadata): R { operator fun getValue(thisRef: T, desc: KProperty<*>): R {
if (!thisRef.hasData(desc.name)) return default if (!thisRef.hasData(desc.name)) return default
return thisRef.getData<R>(desc.name) return thisRef.getData<R>(desc.name)
} }
operator fun setValue(thisRef: T, desc: PropertyMetadata, value: R) { operator fun setValue(thisRef: T, desc: KProperty<*>, value: R) {
thisRef.setData(desc.name, value) thisRef.setData(desc.name, value)
} }
} }