blob: c2d01a8416f60c94e2ec51f4cdfb3791038cf71a [file] [log] [blame]
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package kotlin.js
import kotlin.reflect.KProperty
internal fun getPropertyCallableRef(
name: String,
paramCount: Int,
superType: dynamic,
getter: dynamic,
setter: dynamic
): KProperty<*> {
getter.get = getter
getter.set = setter
getter.callableName = name
return getPropertyRefClass(
getter,
getKPropMetadata(paramCount, setter),
getInterfaceMaskFor(getter, superType)
).unsafeCast<KProperty<*>>()
}
internal fun getLocalDelegateReference(name: String, superType: dynamic, mutable: Boolean, lambda: dynamic): KProperty<*> {
return getPropertyCallableRef(name, 0, superType, lambda, if (mutable) lambda else null)
}
private fun getPropertyRefClass(obj: Ctor, metadata: Metadata, imask: BitMask): dynamic {
obj.`$metadata$` = metadata
obj.constructor = obj
obj.`$imask$` = imask
return obj;
}
private fun getInterfaceMaskFor(obj: Ctor, superType: dynamic): BitMask =
obj.`$imask$` ?: implement(arrayOf(superType))
@Suppress("UNUSED_PARAMETER")
private fun getKPropMetadata(paramCount: Int, setter: Any?): dynamic {
return propertyRefClassMetadataCache[paramCount][if (setter == null) 0 else 1]
}
private fun metadataObject(): Metadata {
return classMeta(VOID, VOID, VOID, VOID)
}
private val propertyRefClassMetadataCache: Array<Array<dynamic>> = arrayOf<Array<dynamic>>(
// immutable , mutable
arrayOf<dynamic>(metadataObject(), metadataObject()), // 0
arrayOf<dynamic>(metadataObject(), metadataObject()), // 1
arrayOf<dynamic>(metadataObject(), metadataObject()) // 2
)