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.*
|
||||||
import org.jetbrains.kotlin.ir.backend.js.lower.calls.CallsLowering
|
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.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.backend.js.lower.inline.RemoveInlineFunctionsWithReifiedTypeParametersLowering
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
@@ -120,6 +121,13 @@ private val functionInliningPhase = makeCustomJsModulePhase(
|
|||||||
prerequisite = setOf(expectDeclarationsRemovingPhase)
|
prerequisite = setOf(expectDeclarationsRemovingPhase)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val copyInlineFunctionBodyLoweringPhase = makeJsModulePhase(
|
||||||
|
::CopyInlineFunctionBodyLowering,
|
||||||
|
name = "CopyInlineFunctionBody",
|
||||||
|
description = "Copy inline function body",
|
||||||
|
prerequisite = setOf(functionInliningPhase)
|
||||||
|
)
|
||||||
|
|
||||||
private val removeInlineFunctionsWithReifiedTypeParametersLoweringPhase = makeJsModulePhase(
|
private val removeInlineFunctionsWithReifiedTypeParametersLoweringPhase = makeJsModulePhase(
|
||||||
{ RemoveInlineFunctionsWithReifiedTypeParametersLowering() },
|
{ RemoveInlineFunctionsWithReifiedTypeParametersLowering() },
|
||||||
name = "RemoveInlineFunctionsWithReifiedTypeParametersLowering",
|
name = "RemoveInlineFunctionsWithReifiedTypeParametersLowering",
|
||||||
@@ -446,6 +454,7 @@ val jsPhases = namedIrModulePhase(
|
|||||||
stripTypeAliasDeclarationsPhase then
|
stripTypeAliasDeclarationsPhase then
|
||||||
arrayConstructorPhase then
|
arrayConstructorPhase then
|
||||||
functionInliningPhase then
|
functionInliningPhase then
|
||||||
|
copyInlineFunctionBodyLoweringPhase then
|
||||||
createScriptFunctionsPhase then
|
createScriptFunctionsPhase then
|
||||||
provisionalFunctionExpressionPhase then
|
provisionalFunctionExpressionPhase then
|
||||||
lateinitNullableFieldsPhase then
|
lateinitNullableFieldsPhase then
|
||||||
|
|||||||
+38
-7
@@ -5,16 +5,47 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.lower.inline
|
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.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 transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
override fun lower(irDeclarationContainer: IrDeclarationContainer) {
|
|
||||||
irDeclarationContainer.transformDeclarationsFlat {
|
if (declaration is IrFunction && declaration.isInline && declaration.typeParameters.any { it.isReified }) {
|
||||||
if (it is IrFunction && it.isInline && it.typeParameters.any { it.isReified }) listOf() else null
|
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