Inline function removal + body copying
This commit is contained in:
committed by
Anton Bannykh
parent
76c7668162
commit
38d409a487
@@ -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
|
||||
|
||||
+38
-7
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user