IR: remove some usages of deepCopyWithVariables
At this point, `deepCopyWithVariables` is the same as `deepCopyWithSymbols` except that the former doesn't call `patchDeclarationParents`, which most likely produces incorrect IR in some call sites.
This commit is contained in:
committed by
Space Team
parent
e7e8cba1b4
commit
1d38c01afc
+3
-4
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildVariable
|
|||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.deepCopyWithVariables
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
|
||||||
@@ -23,7 +22,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl
|
|||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.isNothing
|
import org.jetbrains.kotlin.ir.types.isNothing
|
||||||
import org.jetbrains.kotlin.ir.types.isUnit
|
import org.jetbrains.kotlin.ir.types.isUnit
|
||||||
import org.jetbrains.kotlin.ir.util.setDeclarationsParent
|
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
@@ -290,7 +289,7 @@ class FinallyBlocksLowering(val context: CommonBackendContext, private val throw
|
|||||||
}
|
}
|
||||||
|
|
||||||
private inline fun <reified T : IrElement> IrBuilderWithScope.copy(element: T) =
|
private inline fun <reified T : IrElement> IrBuilderWithScope.copy(element: T) =
|
||||||
element.deepCopyWithVariables().setDeclarationsParent(parent)
|
element.deepCopyWithSymbols(parent)
|
||||||
|
|
||||||
fun IrBuilderWithScope.irReturn(target: IrReturnTargetSymbol, value: IrExpression) =
|
fun IrBuilderWithScope.irReturn(target: IrReturnTargetSymbol, value: IrExpression) =
|
||||||
IrReturnImpl(startOffset, endOffset, context.irBuiltIns.nothingType, target, value)
|
IrReturnImpl(startOffset, endOffset, context.irBuiltIns.nothingType, target, value)
|
||||||
@@ -301,4 +300,4 @@ class FinallyBlocksLowering(val context: CommonBackendContext, private val throw
|
|||||||
IrBlockBuilder(context, scope, startOffset, endOffset, null, type, true)
|
IrBlockBuilder(context, scope, startOffset, endOffset, null, type, true)
|
||||||
.block(body).statements
|
.block(body).statements
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-4
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.backend.common.lower
|
|||||||
import org.jetbrains.kotlin.backend.common.BackendContext
|
import org.jetbrains.kotlin.backend.common.BackendContext
|
||||||
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.common.collectTailRecursionCalls
|
import org.jetbrains.kotlin.backend.common.collectTailRecursionCalls
|
||||||
import org.jetbrains.kotlin.ir.deepCopyWithVariables
|
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
@@ -29,6 +28,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
|||||||
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
|
||||||
import org.jetbrains.kotlin.ir.transformStatement
|
import org.jetbrains.kotlin.ir.transformStatement
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||||
import org.jetbrains.kotlin.ir.util.explicitParameters
|
import org.jetbrains.kotlin.ir.util.explicitParameters
|
||||||
import org.jetbrains.kotlin.ir.util.getArgumentsWithIr
|
import org.jetbrains.kotlin.ir.util.getArgumentsWithIr
|
||||||
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
||||||
@@ -40,7 +40,6 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
|||||||
* This pass lowers tail recursion calls in `tailrec` functions.
|
* This pass lowers tail recursion calls in `tailrec` functions.
|
||||||
*
|
*
|
||||||
* Note: it currently can't handle local functions and classes declared in default arguments.
|
* Note: it currently can't handle local functions and classes declared in default arguments.
|
||||||
* See [deepCopyWithVariables].
|
|
||||||
*/
|
*/
|
||||||
open class TailrecLowering(val context: BackendContext) : BodyLoweringPass {
|
open class TailrecLowering(val context: BackendContext) : BodyLoweringPass {
|
||||||
override fun lower(irBody: IrBody, container: IrDeclaration) {
|
override fun lower(irBody: IrBody, container: IrDeclaration) {
|
||||||
@@ -174,7 +173,7 @@ private class BodyTransformer(
|
|||||||
defaultValuedParameters.let { if (lowering.useProperComputationOrderOfTailrecDefaultParameters) it else it.asReversed() }
|
defaultValuedParameters.let { if (lowering.useProperComputationOrderOfTailrecDefaultParameters) it else it.asReversed() }
|
||||||
.associateWithTo(parameterToArgument) { parameter ->
|
.associateWithTo(parameterToArgument) { parameter ->
|
||||||
val originalDefaultValue = parameter.defaultValue?.expression ?: throw Error("no argument specified for $parameter")
|
val originalDefaultValue = parameter.defaultValue?.expression ?: throw Error("no argument specified for $parameter")
|
||||||
irTemporary(originalDefaultValue.deepCopyWithVariables().patchDeclarationParents(parent).transform(remapper, null))
|
irTemporary(originalDefaultValue.deepCopyWithSymbols(parent).transform(remapper, null))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy the new `val`s into the `var`s declared outside the loop:
|
// Copy the new `val`s into the `var`s declared outside the loop:
|
||||||
@@ -194,4 +193,4 @@ private fun IrValueParameterSymbol.suggestVariableName(): String =
|
|||||||
"$" + oldNameStr.substring(1, oldNameStr.length - 1)
|
"$" + oldNameStr.substring(1, oldNameStr.length - 1)
|
||||||
} else {
|
} else {
|
||||||
owner.name.identifier
|
owner.name.identifier
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-5
@@ -9,19 +9,16 @@ import org.jetbrains.kotlin.backend.common.DeclarationTransformer
|
|||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
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.deepCopyWithVariables
|
|
||||||
import org.jetbrains.kotlin.ir.inline.InlineFunctionResolverReplacingCoroutineIntrinsics
|
import org.jetbrains.kotlin.ir.inline.InlineFunctionResolverReplacingCoroutineIntrinsics
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||||
|
|
||||||
internal class SaveInlineFunctionsBeforeInlining(context: JsIrBackendContext) : DeclarationTransformer {
|
internal class SaveInlineFunctionsBeforeInlining(context: JsIrBackendContext) : DeclarationTransformer {
|
||||||
private val inlineFunctionsBeforeInlining = context.mapping.inlineFunctionsBeforeInlining
|
private val inlineFunctionsBeforeInlining = context.mapping.inlineFunctionsBeforeInlining
|
||||||
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
if (declaration is IrFunction && declaration.isInline) {
|
if (declaration is IrFunction && declaration.isInline) {
|
||||||
inlineFunctionsBeforeInlining[declaration] = declaration.deepCopyWithVariables().also {
|
inlineFunctionsBeforeInlining[declaration] = declaration.deepCopyWithSymbols(declaration.parent)
|
||||||
it.patchDeclarationParents(declaration.parent)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
|
|||||||
@@ -921,10 +921,8 @@ fun IrValueParameter.copyTo(
|
|||||||
factory.createExpressionBody(
|
factory.createExpressionBody(
|
||||||
startOffset = originalDefault.startOffset,
|
startOffset = originalDefault.startOffset,
|
||||||
endOffset = originalDefault.endOffset,
|
endOffset = originalDefault.endOffset,
|
||||||
expression = originalDefault.expression.deepCopyWithVariables(),
|
expression = originalDefault.expression.deepCopyWithSymbols(irFunction),
|
||||||
).apply {
|
)
|
||||||
expression.patchDeclarationParents(irFunction)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return factory.createValueParameter(
|
return factory.createValueParameter(
|
||||||
startOffset = startOffset,
|
startOffset = startOffset,
|
||||||
|
|||||||
+1
-3
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.backend.common.lower.inline.*
|
|||||||
import org.jetbrains.kotlin.backend.konan.*
|
import org.jetbrains.kotlin.backend.konan.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.deepCopyWithVariables
|
|
||||||
import org.jetbrains.kotlin.ir.inline.InlineFunctionResolverReplacingCoroutineIntrinsics
|
import org.jetbrains.kotlin.ir.inline.InlineFunctionResolverReplacingCoroutineIntrinsics
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
@@ -21,8 +20,7 @@ internal class InlineFunctionsSupport(mapping: NativeMapping) {
|
|||||||
private val partiallyLoweredInlineFunctions = mapping.partiallyLoweredInlineFunctions
|
private val partiallyLoweredInlineFunctions = mapping.partiallyLoweredInlineFunctions
|
||||||
|
|
||||||
fun savePartiallyLoweredInlineFunction(function: IrFunction) =
|
fun savePartiallyLoweredInlineFunction(function: IrFunction) =
|
||||||
function.deepCopyWithVariables().also {
|
function.deepCopyWithSymbols(function.parent).also {
|
||||||
it.patchDeclarationParents(function.parent)
|
|
||||||
partiallyLoweredInlineFunctions[function.symbol] = it
|
partiallyLoweredInlineFunctions[function.symbol] = it
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-8
@@ -676,10 +676,7 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override
|
|||||||
val enumEntries = enumDescriptor.owner.enumEntries()
|
val enumEntries = enumDescriptor.owner.enumEntries()
|
||||||
val entriesNames = enumEntries.map { it.annotations.serialNameValue?.let { n -> irString(n) } ?: irNull() }
|
val entriesNames = enumEntries.map { it.annotations.serialNameValue?.let { n -> irString(n) } ?: irNull() }
|
||||||
val entriesAnnotations = enumEntries.map {
|
val entriesAnnotations = enumEntries.map {
|
||||||
val annotationConstructors = it.annotations.map { a ->
|
val annotationsConstructors = copyAnnotationsFrom(it.annotations)
|
||||||
a.deepCopyWithVariables()
|
|
||||||
}
|
|
||||||
val annotationsConstructors = copyAnnotationsFrom(annotationConstructors)
|
|
||||||
if (annotationsConstructors.isEmpty()) {
|
if (annotationsConstructors.isEmpty()) {
|
||||||
irNull()
|
irNull()
|
||||||
} else {
|
} else {
|
||||||
@@ -687,10 +684,7 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val classAnnotationConstructors = enumDescriptor.owner.annotations.map { a ->
|
val classAnnotationsConstructors = copyAnnotationsFrom(enumDescriptor.owner.annotations)
|
||||||
a.deepCopyWithVariables()
|
|
||||||
}
|
|
||||||
val classAnnotationsConstructors = copyAnnotationsFrom(classAnnotationConstructors)
|
|
||||||
val classAnnotations = if (classAnnotationsConstructors.isEmpty()) {
|
val classAnnotations = if (classAnnotationsConstructors.isEmpty()) {
|
||||||
irNull()
|
irNull()
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+13
-9
@@ -8,21 +8,29 @@ package org.jetbrains.kotlinx.serialization.compiler.backend.ir
|
|||||||
import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder
|
import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder
|
||||||
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.*
|
import org.jetbrains.kotlin.ir.builders.declarations.addGetter
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.addProperty
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildField
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.deepCopyWithVariables
|
import org.jetbrains.kotlin.ir.deepCopyWithVariables
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.*
|
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.name.*
|
import org.jetbrains.kotlin.name.CallableId
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.platform.jvm.isJvm
|
import org.jetbrains.kotlin.platform.jvm.isJvm
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginContext
|
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginContext
|
||||||
@@ -424,11 +432,7 @@ interface IrBuilderWithPluginContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun IrBuilderWithScope.copyAnnotationsFrom(annotations: List<IrConstructorCall>): List<IrExpression> =
|
fun IrBuilderWithScope.copyAnnotationsFrom(annotations: List<IrConstructorCall>): List<IrExpression> =
|
||||||
annotations.mapNotNull { annotationCall ->
|
annotations.filter { it.symbol.owner.parentAsClass.isSerialInfoAnnotation }.map { it.deepCopyWithVariables() }
|
||||||
val annotationClass = annotationCall.symbol.owner.parentAsClass
|
|
||||||
if (!annotationClass.isSerialInfoAnnotation) return@mapNotNull null
|
|
||||||
annotationCall.deepCopyWithVariables()
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||||
fun IrBuilderWithScope.wrapperClassReference(classType: IrType): IrClassReference {
|
fun IrBuilderWithScope.wrapperClassReference(classType: IrType): IrClassReference {
|
||||||
|
|||||||
+2
-6
@@ -11,15 +11,11 @@ import org.jetbrains.kotlin.ir.builders.*
|
|||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
import org.jetbrains.kotlin.ir.deepCopyWithVariables
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.constructors
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.util.defaultType
|
|
||||||
import org.jetbrains.kotlin.ir.util.functions
|
|
||||||
import org.jetbrains.kotlin.ir.util.properties
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginContext
|
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginContext
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.CallingConventions
|
import org.jetbrains.kotlinx.serialization.compiler.resolve.CallingConventions
|
||||||
@@ -101,7 +97,7 @@ class SerializerForEnumsGenerator(
|
|||||||
+call
|
+call
|
||||||
// serialDesc.pushAnnotation(...)
|
// serialDesc.pushAnnotation(...)
|
||||||
copySerialInfoAnnotationsToDescriptor(
|
copySerialInfoAnnotationsToDescriptor(
|
||||||
entry.annotations.map {it.deepCopyWithVariables()},
|
entry.copyAnnotations(),
|
||||||
localDescriptor,
|
localDescriptor,
|
||||||
serialDescImplClass.functionByName(CallingConventions.addAnnotation)
|
serialDescImplClass.functionByName(CallingConventions.addAnnotation)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user