diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt index eb92e8657de..6a1e0889294 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt @@ -10,10 +10,7 @@ import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.common.runOnFilePostfix import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.ir.backend.js.lower.* -import org.jetbrains.kotlin.ir.backend.js.lower.inline.FunctionInlining -import org.jetbrains.kotlin.ir.backend.js.lower.inline.ReturnableBlockLowering -import org.jetbrains.kotlin.ir.backend.js.lower.inline.referenceAllTypeExternalClassifiers -import org.jetbrains.kotlin.ir.backend.js.lower.inline.replaceUnboundSymbols +import org.jetbrains.kotlin.ir.backend.js.lower.inline.* import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment @@ -73,6 +70,10 @@ fun JsIrBackendContext.performInlining(moduleFragment: IrModuleFragment) { } while (symbolTable.unboundClasses.isNotEmpty()) moduleFragment.patchDeclarationParents() + + moduleFragment.files.forEach { file -> + RemoveInlineFunctionsWithReifiedTypeParametersLowering.runOnFilePostfix(file) + } } fun JsIrBackendContext.lower(file: IrFile) { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/RemoveInlineFunctionsWithReifiedTypeParametersLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/RemoveInlineFunctionsWithReifiedTypeParametersLowering.kt new file mode 100644 index 00000000000..7ccc860cab6 --- /dev/null +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/RemoveInlineFunctionsWithReifiedTypeParametersLowering.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.ir.backend.js.lower.inline + +import org.jetbrains.kotlin.backend.common.DeclarationContainerLoweringPass +import org.jetbrains.kotlin.ir.backend.js.utils.isReified +import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer +import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.util.deepCopyOld +import org.jetbrains.kotlin.ir.util.transformFlat + + +object RemoveInlineFunctionsWithReifiedTypeParametersLowering: DeclarationContainerLoweringPass { + override fun lower(irDeclarationContainer: IrDeclarationContainer) { + irDeclarationContainer.declarations.transformFlat { + if (it is IrFunction && it.isInline && it.typeParameters.any { it.isReified }) listOf() else null + } + } +} diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/descriptorBasedUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/descriptorBasedUtils.kt index 9d06c789236..92f598e686f 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/descriptorBasedUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/descriptorBasedUtils.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.declarations.IrTypeParameter import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.name.FqName @@ -58,4 +59,7 @@ fun createValueParameter(containingDeclaration: CallableDescriptor, index: Int, val CallableMemberDescriptor.propertyIfAccessor get() = if (this is PropertyAccessorDescriptor) this.correspondingProperty - else this \ No newline at end of file + else this + +val IrTypeParameter.isReified + get() = descriptor.isReified \ No newline at end of file diff --git a/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt index 582b7738312..80e1489d641 100644 --- a/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt +++ b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR fun box(): String { main(array()) return "OK" diff --git a/compiler/testData/codegen/box/inlineClasses/checkForInstanceOfInlineClass.kt b/compiler/testData/codegen/box/inlineClasses/checkForInstanceOfInlineClass.kt index 113f4496976..eab47359aba 100644 --- a/compiler/testData/codegen/box/inlineClasses/checkForInstanceOfInlineClass.kt +++ b/compiler/testData/codegen/box/inlineClasses/checkForInstanceOfInlineClass.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND: JS_IR inline class UInt(val u: Int) { override fun toString(): String { diff --git a/compiler/testData/codegen/box/nullCheckOptimization/isNullable.kt b/compiler/testData/codegen/box/nullCheckOptimization/isNullable.kt index eff0da3bb5a..750f01972a0 100644 --- a/compiler/testData/codegen/box/nullCheckOptimization/isNullable.kt +++ b/compiler/testData/codegen/box/nullCheckOptimization/isNullable.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR inline fun isNullable() = null is T fun box(): String = diff --git a/compiler/testData/codegen/box/smartCasts/genericSet.kt b/compiler/testData/codegen/box/smartCasts/genericSet.kt index 6e910a67f28..48350f84309 100644 --- a/compiler/testData/codegen/box/smartCasts/genericSet.kt +++ b/compiler/testData/codegen/box/smartCasts/genericSet.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR class Wrapper(var x: T) inline fun change(w: Wrapper, x: Any?) { diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/checkObjectClassIsPresent.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/checkObjectClassIsPresent.kt index 1cf71256dd8..dbf8785c928 100644 --- a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/checkObjectClassIsPresent.kt +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/checkObjectClassIsPresent.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // NO_CHECK_LAMBDA_INLINING // FILE: 1.kt package test diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/checkStaticObjectClassIsPresent.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/checkStaticObjectClassIsPresent.kt index db9dbef301c..15317f1e893 100644 --- a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/checkStaticObjectClassIsPresent.kt +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/checkStaticObjectClassIsPresent.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // NO_CHECK_LAMBDA_INLINING // FILE: 1.kt package test diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleErased.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleErased.kt index a9e5c1840f8..2171f31be46 100644 --- a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleErased.kt +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleErased.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // FILE: 1.kt // LANGUAGE_VERSION: 1.2 // SKIP_INLINE_CHECK_IN: inlineFun$default diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleErasedStaticInstance.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleErasedStaticInstance.kt index 627a8b0f64a..ebd9a91bed9 100644 --- a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleErasedStaticInstance.kt +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleErasedStaticInstance.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // FILE: 1.kt // LANGUAGE_VERSION: 1.2 // SKIP_INLINE_CHECK_IN: inlineFun$default diff --git a/js/js.translator/testData/box/inline/jsCode.kt b/js/js.translator/testData/box/inline/jsCode.kt index 750893fcc2b..bbfff47e836 100644 --- a/js/js.translator/testData/box/inline/jsCode.kt +++ b/js/js.translator/testData/box/inline/jsCode.kt @@ -1,3 +1,4 @@ +// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1115 package foo diff --git a/js/js.translator/testData/box/reified/callChain.kt b/js/js.translator/testData/box/reified/callChain.kt index 2b77397d9eb..a609630bac6 100644 --- a/js/js.translator/testData/box/reified/callChain.kt +++ b/js/js.translator/testData/box/reified/callChain.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1116 package foo diff --git a/js/js.translator/testData/box/reified/extensionFun.kt b/js/js.translator/testData/box/reified/extensionFun.kt index dcf63f77d9d..0c75251feb4 100644 --- a/js/js.translator/testData/box/reified/extensionFun.kt +++ b/js/js.translator/testData/box/reified/extensionFun.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1123 package foo diff --git a/js/js.translator/testData/box/reified/extensionLambda.kt b/js/js.translator/testData/box/reified/extensionLambda.kt index dce982353e2..eefb008eae1 100644 --- a/js/js.translator/testData/box/reified/extensionLambda.kt +++ b/js/js.translator/testData/box/reified/extensionLambda.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1119 package foo diff --git a/js/js.translator/testData/box/reified/innerObject.kt b/js/js.translator/testData/box/reified/innerObject.kt index ebbe078ef77..a33cc6eeb23 100644 --- a/js/js.translator/testData/box/reified/innerObject.kt +++ b/js/js.translator/testData/box/reified/innerObject.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1130 package foo diff --git a/js/js.translator/testData/box/reified/isBool.kt b/js/js.translator/testData/box/reified/isBool.kt index 1f25e5c10f7..c62b958ef3b 100644 --- a/js/js.translator/testData/box/reified/isBool.kt +++ b/js/js.translator/testData/box/reified/isBool.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1112 package foo diff --git a/js/js.translator/testData/box/reified/isClass.kt b/js/js.translator/testData/box/reified/isClass.kt index c78fd74668b..36ac5216977 100644 --- a/js/js.translator/testData/box/reified/isClass.kt +++ b/js/js.translator/testData/box/reified/isClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1125 package foo diff --git a/js/js.translator/testData/box/reified/isString.kt b/js/js.translator/testData/box/reified/isString.kt index a7dfab6b4ac..8a20d0afed7 100644 --- a/js/js.translator/testData/box/reified/isString.kt +++ b/js/js.translator/testData/box/reified/isString.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1112 package foo diff --git a/js/js.translator/testData/box/reified/isTNullable.kt b/js/js.translator/testData/box/reified/isTNullable.kt index 6f4900f8c11..f800e204015 100644 --- a/js/js.translator/testData/box/reified/isTNullable.kt +++ b/js/js.translator/testData/box/reified/isTNullable.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1116 package foo diff --git a/js/js.translator/testData/box/reified/multipleTypeParameters.kt b/js/js.translator/testData/box/reified/multipleTypeParameters.kt index 9d31d6c88d5..8447fb98e2e 100644 --- a/js/js.translator/testData/box/reified/multipleTypeParameters.kt +++ b/js/js.translator/testData/box/reified/multipleTypeParameters.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1118 package foo diff --git a/js/js.translator/testData/box/reified/noValueParameters.kt b/js/js.translator/testData/box/reified/noValueParameters.kt index e97a6852113..3dc21f470f7 100644 --- a/js/js.translator/testData/box/reified/noValueParameters.kt +++ b/js/js.translator/testData/box/reified/noValueParameters.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1114 package foo diff --git a/js/js.translator/testData/box/reified/parameterSwap.kt b/js/js.translator/testData/box/reified/parameterSwap.kt index c5ca0a09284..d667a19db9c 100644 --- a/js/js.translator/testData/box/reified/parameterSwap.kt +++ b/js/js.translator/testData/box/reified/parameterSwap.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1118 package foo diff --git a/js/js.translator/testData/box/reified/withInlineTurnedOff.kt b/js/js.translator/testData/box/reified/withInlineTurnedOff.kt index 3b74ff47f43..b6fecf722dc 100644 --- a/js/js.translator/testData/box/reified/withInlineTurnedOff.kt +++ b/js/js.translator/testData/box/reified/withInlineTurnedOff.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1119 package foo diff --git a/js/js.translator/testData/box/rtti/isReifiedObject.kt b/js/js.translator/testData/box/rtti/isReifiedObject.kt index 0b040eb2a34..23c256a0c2c 100644 --- a/js/js.translator/testData/box/rtti/isReifiedObject.kt +++ b/js/js.translator/testData/box/rtti/isReifiedObject.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1114 // NO_INLINE package foo