/* * 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>() } 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, VOID) } private val propertyRefClassMetadataCache: Array> = arrayOf>( // immutable , mutable arrayOf(metadataObject(), metadataObject()), // 0 arrayOf(metadataObject(), metadataObject()), // 1 arrayOf(metadataObject(), metadataObject()) // 2 )