diff --git a/js/js.libraries/src/js/callableReferenceUtils.js b/js/js.libraries/src/js/callableReferenceUtils.js index 2f989620a85..7d9bf8716f5 100644 --- a/js/js.libraries/src/js/callableReferenceUtils.js +++ b/js/js.libraries/src/js/callableReferenceUtils.js @@ -19,18 +19,11 @@ Kotlin.getCallableRef = function(name, f) { return f; }; -Kotlin.getCallableRefZeroArg = function(name, getter, setter) { +Kotlin.getPropertyCallableRef = function(name, paramCount, getter, setter) { getter.get = getter; getter.set = setter; getter.callableName = name; - return getPropertyRefClass(getter, setter, propertyRefClassMetadataCache.zeroArg); -}; - -Kotlin.getCallableRefOneArg = function(name, getter, setter) { - getter.get = getter; - getter.set = setter; - getter.callableName = name; - return getPropertyRefClass(getter, setter, propertyRefClassMetadataCache.oneArg); + return getPropertyRefClass(getter, setter, propertyRefClassMetadataCache[paramCount]); }; function getPropertyRefClass(obj, setter, cache) { @@ -39,8 +32,8 @@ function getPropertyRefClass(obj, setter, cache) { return obj; } -var propertyRefClassMetadataCache = { - zeroArg: { +var propertyRefClassMetadataCache = [ + { mutable: { value: null, implementedInterface: function () { return Kotlin.kotlin.reflect.KMutableProperty0 } }, @@ -48,7 +41,7 @@ var propertyRefClassMetadataCache = { return Kotlin.kotlin.reflect.KProperty0 } } }, - oneArg: { + { mutable: { value: null, implementedInterface: function () { return Kotlin.kotlin.reflect.KMutableProperty1 } }, @@ -56,7 +49,7 @@ var propertyRefClassMetadataCache = { return Kotlin.kotlin.reflect.KProperty1 } } } -}; +]; function getPropertyRefMetadata(cache) { if (cache.value === null) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java index 77cd8afa24e..141652dcfeb 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java @@ -192,9 +192,7 @@ public final class Namer { @NotNull public static final String FUNCTION_CALLABLE_REF = "getCallableRef"; @NotNull - public static final String PROPERTY_CALLABLE_REF_ZERO_ARG = "getCallableRefZeroArg"; - @NotNull - public static final String PROPERTY_CALLABLE_REF_ONE_ARG = "getCallableRefOneArg"; + public static final String PROPERTY_CALLABLE_REF = "getPropertyCallableRef"; @NotNull private final JsExpression callGetProperty; @NotNull diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt index 5eeb286d841..9597eee6474 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt @@ -17,10 +17,7 @@ package org.jetbrains.kotlin.js.translate.reference import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor -import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.backend.ast.metadata.SideEffectKind import org.jetbrains.kotlin.js.backend.ast.metadata.isCallableReference @@ -207,14 +204,14 @@ object CallableReferenceTranslator { getter: JsExpression, setter: JsExpression? ): JsExpression { - var argCount = if (descriptor.dispatchReceiverParameter != null || descriptor.extensionReceiverParameter != null) 1 else 0 + var argCount = if (descriptor.containingDeclaration is ClassDescriptor || descriptor.extensionReceiverParameter != null) 1 else 0 if (receiver != null) { argCount-- } val nameLiteral = context.program().getStringLiteral(name) - val invokeName = if (argCount == 0) Namer.PROPERTY_CALLABLE_REF_ZERO_ARG else Namer.PROPERTY_CALLABLE_REF_ONE_ARG - val invokeFun = JsNameRef(invokeName, Namer.kotlinObject()) - val invocation = JsInvocation(invokeFun, nameLiteral, getter) + val argCountLiteral = context.program().getNumberLiteral(argCount) + val invokeFun = JsNameRef(Namer.PROPERTY_CALLABLE_REF, Namer.kotlinObject()) + val invocation = JsInvocation(invokeFun, nameLiteral, argCountLiteral, getter) if (setter != null) { invocation.arguments += setter }