Inline function removal + body copying

This commit is contained in:
Anton Bannykh
2019-12-24 20:33:51 +03:00
committed by Anton Bannykh
parent 76c7668162
commit 38d409a487
2 changed files with 47 additions and 7 deletions
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.backend.common.phaser.*
import org.jetbrains.kotlin.ir.backend.js.lower.*
import org.jetbrains.kotlin.ir.backend.js.lower.calls.CallsLowering
import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.JsSuspendFunctionsLowering
import org.jetbrains.kotlin.ir.backend.js.lower.inline.CopyInlineFunctionBodyLowering
import org.jetbrains.kotlin.ir.backend.js.lower.inline.RemoveInlineFunctionsWithReifiedTypeParametersLowering
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
@@ -120,6 +121,13 @@ private val functionInliningPhase = makeCustomJsModulePhase(
prerequisite = setOf(expectDeclarationsRemovingPhase)
)
private val copyInlineFunctionBodyLoweringPhase = makeJsModulePhase(
::CopyInlineFunctionBodyLowering,
name = "CopyInlineFunctionBody",
description = "Copy inline function body",
prerequisite = setOf(functionInliningPhase)
)
private val removeInlineFunctionsWithReifiedTypeParametersLoweringPhase = makeJsModulePhase(
{ RemoveInlineFunctionsWithReifiedTypeParametersLowering() },
name = "RemoveInlineFunctionsWithReifiedTypeParametersLowering",
@@ -446,6 +454,7 @@ val jsPhases = namedIrModulePhase(
stripTypeAliasDeclarationsPhase then
arrayConstructorPhase then
functionInliningPhase then
copyInlineFunctionBodyLoweringPhase then
createScriptFunctionsPhase then
provisionalFunctionExpressionPhase then
lateinitNullableFieldsPhase then
@@ -5,16 +5,47 @@
package org.jetbrains.kotlin.ir.backend.js.lower.inline
import org.jetbrains.kotlin.backend.common.DeclarationContainerLoweringPass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.util.transformDeclarationsFlat
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
class RemoveInlineFunctionsWithReifiedTypeParametersLowering: DeclarationTransformer {
class RemoveInlineFunctionsWithReifiedTypeParametersLowering: DeclarationContainerLoweringPass {
override fun lower(irDeclarationContainer: IrDeclarationContainer) {
irDeclarationContainer.transformDeclarationsFlat {
if (it is IrFunction && it.isInline && it.typeParameters.any { it.isReified }) listOf() else null
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
if (declaration is IrFunction && declaration.isInline && declaration.typeParameters.any { it.isReified }) {
return emptyList()
}
return null
}
}
class CopyInlineFunctionBodyLowering(val context: JsIrBackendContext) : DeclarationTransformer {
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
if (declaration is IrFunction && declaration.isInline) {
declaration.body?.let { originalBody ->
declaration.body = IrBlockBodyImpl(originalBody.startOffset, originalBody.endOffset) {
statements += (originalBody.deepCopyWithSymbols(declaration) as IrBlockBody).statements
}
}
}
if (declaration is IrValueParameter && declaration.parent.let { it is IrFunction && it.isInline }) {
declaration.defaultValue?.let { originalDefault ->
declaration.defaultValue = IrExpressionBodyImpl(originalDefault.startOffset, originalDefault.endOffset) {
expression = originalDefault.expression.deepCopyWithSymbols(declaration.parent)
}
}
}
return null
}
}