diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt index f15aa5918c6..7529de2f2a1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass +import org.jetbrains.kotlin.backend.common.descriptors.WrappedTypeParameterDescriptor import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDescriptor import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.IrStatement @@ -13,10 +14,12 @@ import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.utils.Namer import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.impl.IrTypeParameterImpl import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.symbols.IrValueSymbol +import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.toIrType @@ -50,6 +53,7 @@ class CallableReferenceLowering(val context: JsIrBackendContext) : FileLoweringP inner class CallableReferenceLowerTransformer : IrElementTransformerVoid() { override fun visitFunctionReference(expression: IrFunctionReference): IrExpression { + expression.transformChildrenVoid(this) val declaration = expression.symbol.owner if (declaration.origin == JsIrBackendContext.callableClosureOrigin) return expression val key = makeCallableKey(declaration, expression) @@ -58,6 +62,7 @@ class CallableReferenceLowering(val context: JsIrBackendContext) : FileLoweringP } override fun visitPropertyReference(expression: IrPropertyReference): IrExpression { + expression.transformChildrenVoid(this) val declaration = expression.getter!!.owner val key = makeCallableKey(declaration, expression) val factory = callableToGetterFunction.getOrPut(key) { lowerKPropertyReference(declaration, expression) } @@ -65,6 +70,7 @@ class CallableReferenceLowering(val context: JsIrBackendContext) : FileLoweringP } override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference): IrExpression { + expression.transformChildrenVoid(this) val key = makeCallableKey(expression.getter.owner, expression) val factory = callableToGetterFunction.getOrPut(key) { lowerLocalKPropertyReference(expression) } return redirectToFunction(expression, factory) @@ -446,6 +452,26 @@ class CallableReferenceLowering(val context: JsIrBackendContext) : FileLoweringP } } + val typeParameters = + if (declaration is IrConstructor) (declaration.parent as IrClass).typeParameters else declaration.typeParameters + + for (t in typeParameters) { + val descriptor = WrappedTypeParameterDescriptor() + refGetDeclaration.typeParameters += IrTypeParameterImpl( + t.startOffset, + t.endOffset, + t.origin, + IrTypeParameterSymbolImpl(descriptor), + t.name, + t.index, + t.isReified, + t.variance + ).also { + descriptor.bind(it) + it.parent = refGetDeclaration + } + } + return refGetDeclaration } diff --git a/compiler/testData/codegen/box/callableReference/function/genericWithDependentType.kt b/compiler/testData/codegen/box/callableReference/function/genericWithDependentType.kt index e7cc88880f8..79959ec1436 100644 --- a/compiler/testData/codegen/box/callableReference/function/genericWithDependentType.kt +++ b/compiler/testData/codegen/box/callableReference/function/genericWithDependentType.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // WITH_RUNTIME class Wrapper(val value: T) diff --git a/compiler/testData/codegen/box/callableReference/property/genericProperty.kt b/compiler/testData/codegen/box/callableReference/property/genericProperty.kt index abe6586810a..f5fd8da8415 100644 --- a/compiler/testData/codegen/box/callableReference/property/genericProperty.kt +++ b/compiler/testData/codegen/box/callableReference/property/genericProperty.kt @@ -1,6 +1,5 @@ // IGNORE_BACKEND: NATIVE // IGNORE_BACKEND: JVM_IR -// IGNORE_BACKEND: JS_IR //For KT-6020 import kotlin.reflect.KProperty1 import kotlin.reflect.KMutableProperty1 diff --git a/compiler/testData/codegen/box/callableReference/property/kt14330_2.kt b/compiler/testData/codegen/box/callableReference/property/kt14330_2.kt index 6d4f821343d..97e258f5511 100644 --- a/compiler/testData/codegen/box/callableReference/property/kt14330_2.kt +++ b/compiler/testData/codegen/box/callableReference/property/kt14330_2.kt @@ -1,5 +1,4 @@ // IGNORE_BACKEND: JVM_IR -// IGNORE_BACKEND: JS_IR var recivier : Any? = "fail" var value2 : Any? = "fail2" diff --git a/compiler/testData/codegen/box/callableReference/property/kt15447.kt b/compiler/testData/codegen/box/callableReference/property/kt15447.kt index 5959e075a45..1650640bb68 100644 --- a/compiler/testData/codegen/box/callableReference/property/kt15447.kt +++ b/compiler/testData/codegen/box/callableReference/property/kt15447.kt @@ -1,5 +1,4 @@ // IGNORE_BACKEND: JVM_IR -// IGNORE_BACKEND: JS_IR //WITH_RUNTIME fun box(): String {