IR: Consistently copyAttributes in DeepCopyIrTreeWithSymbols
This was missing for IrFunctionReferences, which caused problems when copying default parameters before CallableReferenceLowering in the JVM_IR backend.
This commit is contained in:
committed by
Alexander Udalov
parent
5fc6fa8619
commit
102a3d60e0
@@ -139,8 +139,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
}
|
||||
thisReceiver = declaration.thisReceiver?.transform()
|
||||
declaration.transformDeclarationsTo(this)
|
||||
copyAttributes(declaration)
|
||||
}
|
||||
}.copyAttributes(declaration)
|
||||
|
||||
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction =
|
||||
IrFunctionImpl(
|
||||
@@ -367,14 +366,14 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
throw IllegalArgumentException("Unsupported expression type: $expression")
|
||||
|
||||
override fun <T> visitConst(expression: IrConst<T>): IrConst<T> =
|
||||
expression.copy()
|
||||
expression.copy().copyAttributes(expression)
|
||||
|
||||
override fun visitVararg(expression: IrVararg): IrVararg =
|
||||
IrVarargImpl(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type.remapType(), expression.varargElementType.remapType(),
|
||||
expression.elements.transform()
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitSpreadElement(spread: IrSpreadElement): IrSpreadElement =
|
||||
IrSpreadElementImpl(
|
||||
@@ -391,14 +390,14 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
mapStatementOrigin(expression.origin),
|
||||
expression.statements.map { it.transform() },
|
||||
expression.inlineFunctionSymbol
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
else
|
||||
IrBlockImpl(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type.remapType(),
|
||||
mapStatementOrigin(expression.origin),
|
||||
expression.statements.map { it.transform() }
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitComposite(expression: IrComposite): IrComposite =
|
||||
IrCompositeImpl(
|
||||
@@ -406,28 +405,28 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.type.remapType(),
|
||||
mapStatementOrigin(expression.origin),
|
||||
expression.statements.map { it.transform() }
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitStringConcatenation(expression: IrStringConcatenation): IrStringConcatenation =
|
||||
IrStringConcatenationImpl(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type.remapType(),
|
||||
expression.arguments.map { it.transform() }
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitGetObjectValue(expression: IrGetObjectValue): IrGetObjectValue =
|
||||
IrGetObjectValueImpl(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type.remapType(),
|
||||
symbolRemapper.getReferencedClass(expression.symbol)
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitGetEnumValue(expression: IrGetEnumValue): IrGetEnumValue =
|
||||
IrGetEnumValueImpl(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type.remapType(),
|
||||
symbolRemapper.getReferencedEnumEntry(expression.symbol)
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitGetValue(expression: IrGetValue): IrGetValue =
|
||||
IrGetValueImpl(
|
||||
@@ -435,7 +434,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.type.remapType(),
|
||||
symbolRemapper.getReferencedValue(expression.symbol),
|
||||
mapStatementOrigin(expression.origin)
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitSetVariable(expression: IrSetVariable): IrSetVariable =
|
||||
IrSetVariableImpl(
|
||||
@@ -444,7 +443,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
symbolRemapper.getReferencedVariable(expression.symbol),
|
||||
expression.value.transform(),
|
||||
mapStatementOrigin(expression.origin)
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitGetField(expression: IrGetField): IrGetField =
|
||||
IrGetFieldImpl(
|
||||
@@ -454,7 +453,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.receiver?.transform(),
|
||||
mapStatementOrigin(expression.origin),
|
||||
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitSetField(expression: IrSetField): IrSetField =
|
||||
IrSetFieldImpl(
|
||||
@@ -465,7 +464,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.type.remapType(),
|
||||
mapStatementOrigin(expression.origin),
|
||||
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitCall(expression: IrCall): IrCall =
|
||||
shallowCopyCall(expression).apply {
|
||||
@@ -487,7 +486,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
).apply {
|
||||
copyRemappedTypeArgumentsFrom(expression)
|
||||
transformValueArguments(expression)
|
||||
}
|
||||
}.copyAttributes(expression)
|
||||
}
|
||||
|
||||
private fun IrMemberAccessExpression.copyRemappedTypeArgumentsFrom(other: IrMemberAccessExpression) {
|
||||
@@ -512,7 +511,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
|
||||
).apply {
|
||||
copyRemappedTypeArgumentsFrom(expression)
|
||||
}
|
||||
}.copyAttributes(expression)
|
||||
}
|
||||
|
||||
private fun <T : IrMemberAccessExpression> T.transformReceiverArguments(original: T): T =
|
||||
@@ -539,7 +538,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
).apply {
|
||||
copyRemappedTypeArgumentsFrom(expression)
|
||||
transformValueArguments(expression)
|
||||
}
|
||||
}.copyAttributes(expression)
|
||||
}
|
||||
|
||||
override fun visitEnumConstructorCall(expression: IrEnumConstructorCall): IrEnumConstructorCall {
|
||||
@@ -552,7 +551,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
).apply {
|
||||
copyRemappedTypeArgumentsFrom(expression)
|
||||
transformValueArguments(expression)
|
||||
}
|
||||
}.copyAttributes(expression)
|
||||
}
|
||||
|
||||
override fun visitGetClass(expression: IrGetClass): IrGetClass =
|
||||
@@ -560,7 +559,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type.remapType(),
|
||||
expression.argument.transform()
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitFunctionReference(expression: IrFunctionReference): IrFunctionReference {
|
||||
val symbol = symbolRemapper.getReferencedFunction(expression.symbol)
|
||||
@@ -575,7 +574,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
).apply {
|
||||
copyRemappedTypeArgumentsFrom(expression)
|
||||
transformValueArguments(expression)
|
||||
}
|
||||
}.copyAttributes(expression)
|
||||
}
|
||||
|
||||
override fun visitPropertyReference(expression: IrPropertyReference): IrPropertyReference =
|
||||
@@ -591,7 +590,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
).apply {
|
||||
copyRemappedTypeArgumentsFrom(expression)
|
||||
transformReceiverArguments(expression)
|
||||
}
|
||||
}.copyAttributes(expression)
|
||||
|
||||
override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference): IrLocalDelegatedPropertyReference =
|
||||
IrLocalDelegatedPropertyReferenceImpl(
|
||||
@@ -602,7 +601,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
symbolRemapper.getReferencedSimpleFunction(expression.getter),
|
||||
expression.setter?.let { symbolRemapper.getReferencedSimpleFunction(it) },
|
||||
mapStatementOrigin(expression.origin)
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitFunctionExpression(expression: IrFunctionExpression): IrFunctionExpression =
|
||||
IrFunctionExpressionImpl(
|
||||
@@ -610,7 +609,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.type.remapType(),
|
||||
expression.function.transform(),
|
||||
mapStatementOrigin(expression.origin)!!
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitClassReference(expression: IrClassReference): IrClassReference =
|
||||
IrClassReferenceImpl(
|
||||
@@ -618,14 +617,14 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.type.remapType(),
|
||||
symbolRemapper.getReferencedClassifier(expression.symbol),
|
||||
expression.classType.remapType()
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall): IrInstanceInitializerCall =
|
||||
IrInstanceInitializerCallImpl(
|
||||
expression.startOffset, expression.endOffset,
|
||||
symbolRemapper.getReferencedClass(expression.classSymbol),
|
||||
expression.type.remapType()
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitTypeOperator(expression: IrTypeOperatorCall): IrTypeOperatorCall =
|
||||
IrTypeOperatorCallImpl(
|
||||
@@ -634,7 +633,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.operator,
|
||||
expression.typeOperand.remapType(),
|
||||
expression.argument.transform()
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitWhen(expression: IrWhen): IrWhen =
|
||||
IrWhenImpl(
|
||||
@@ -642,7 +641,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.type.remapType(),
|
||||
mapStatementOrigin(expression.origin),
|
||||
expression.branches.map { it.transform() }
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitBranch(branch: IrBranch): IrBranch =
|
||||
IrBranchImpl(
|
||||
@@ -672,7 +671,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
newLoop.label = loop.label
|
||||
newLoop.condition = loop.condition.transform()
|
||||
newLoop.body = loop.body?.transform()
|
||||
}
|
||||
}.copyAttributes(loop)
|
||||
|
||||
override fun visitDoWhileLoop(loop: IrDoWhileLoop): IrDoWhileLoop =
|
||||
IrDoWhileLoopImpl(loop.startOffset, loop.endOffset, loop.type, mapStatementOrigin(loop.origin)).also { newLoop ->
|
||||
@@ -680,21 +679,21 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
newLoop.label = loop.label
|
||||
newLoop.condition = loop.condition.transform()
|
||||
newLoop.body = loop.body?.transform()
|
||||
}
|
||||
}.copyAttributes(loop)
|
||||
|
||||
override fun visitBreak(jump: IrBreak): IrBreak =
|
||||
IrBreakImpl(
|
||||
jump.startOffset, jump.endOffset,
|
||||
jump.type,
|
||||
getTransformedLoop(jump.loop)
|
||||
).apply { label = jump.label }
|
||||
).apply { label = jump.label }.copyAttributes(jump)
|
||||
|
||||
override fun visitContinue(jump: IrContinue): IrContinue =
|
||||
IrContinueImpl(
|
||||
jump.startOffset, jump.endOffset,
|
||||
jump.type,
|
||||
getTransformedLoop(jump.loop)
|
||||
).apply { label = jump.label }
|
||||
).apply { label = jump.label }.copyAttributes(jump)
|
||||
|
||||
override fun visitTry(aTry: IrTry): IrTry =
|
||||
IrTryImpl(
|
||||
@@ -703,7 +702,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
aTry.tryResult.transform(),
|
||||
aTry.catches.map { it.transform() },
|
||||
aTry.finallyExpression?.transform()
|
||||
)
|
||||
).copyAttributes(aTry)
|
||||
|
||||
override fun visitCatch(aCatch: IrCatch): IrCatch =
|
||||
IrCatchImpl(
|
||||
@@ -718,7 +717,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.type.remapType(),
|
||||
symbolRemapper.getReferencedReturnTarget(expression.returnTargetSymbol),
|
||||
expression.value.transform()
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
private fun SymbolRemapper.getReferencedReturnTarget(returnTarget: IrReturnTargetSymbol) =
|
||||
when (returnTarget) {
|
||||
@@ -732,7 +731,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type.remapType(),
|
||||
expression.value.transform()
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitDynamicOperatorExpression(expression: IrDynamicOperatorExpression): IrDynamicOperatorExpression =
|
||||
IrDynamicOperatorExpressionImpl(
|
||||
@@ -742,7 +741,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
).apply {
|
||||
receiver = expression.receiver.transform()
|
||||
expression.arguments.mapTo(arguments) { it.transform() }
|
||||
}
|
||||
}.copyAttributes(expression)
|
||||
|
||||
override fun visitDynamicMemberExpression(expression: IrDynamicMemberExpression): IrDynamicMemberExpression =
|
||||
IrDynamicMemberExpressionImpl(
|
||||
@@ -750,7 +749,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.type.remapType(),
|
||||
expression.memberName,
|
||||
expression.receiver.transform()
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitErrorDeclaration(declaration: IrErrorDeclaration): IrErrorDeclaration =
|
||||
IrErrorDeclarationImpl(declaration.startOffset, declaration.endOffset, declaration.descriptor)
|
||||
@@ -760,7 +759,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type.remapType(),
|
||||
expression.description
|
||||
)
|
||||
).copyAttributes(expression)
|
||||
|
||||
override fun visitErrorCallExpression(expression: IrErrorCallExpression): IrErrorCallExpression =
|
||||
IrErrorCallExpressionImpl(
|
||||
@@ -770,7 +769,5 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
).apply {
|
||||
explicitReceiver = expression.explicitReceiver?.transform()
|
||||
expression.arguments.transformTo(arguments)
|
||||
}
|
||||
}.copyAttributes(expression)
|
||||
}
|
||||
|
||||
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
inline class X(val s: String)
|
||||
fun foo(x: X, block: (X) -> String = { it.s }) = block(x)
|
||||
|
||||
fun box(): String {
|
||||
return foo(X("OK"))
|
||||
}
|
||||
+5
@@ -12640,6 +12640,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt")
|
||||
public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt");
|
||||
|
||||
+5
@@ -12645,6 +12645,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt")
|
||||
public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt");
|
||||
|
||||
+5
@@ -11525,6 +11525,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt")
|
||||
public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt");
|
||||
|
||||
Generated
+5
@@ -9935,6 +9935,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
||||
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
||||
|
||||
+5
@@ -11090,6 +11090,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
||||
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
||||
|
||||
Reference in New Issue
Block a user