From 102a3d60e03930ad59b2719e1a5438fff213b1ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Fri, 30 Aug 2019 12:29:10 +0200 Subject: [PATCH] IR: Consistently copyAttributes in DeepCopyIrTreeWithSymbols This was missing for IrFunctionReferences, which caused problems when copying default parameters before CallableReferenceLowering in the JVM_IR backend. --- .../kotlin/ir/util/DeepCopyIrTree.kt | 0 .../ir/util/DeepCopyIrTreeWithSymbols.kt | 77 +++++++++---------- .../mangledDefaultParameterFunction.kt | 7 ++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 ++ .../LightAnalysisModeTestGenerated.java | 5 ++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 ++ .../IrJsCodegenBoxTestGenerated.java | 5 ++ .../semantics/JsCodegenBoxTestGenerated.java | 5 ++ 8 files changed, 69 insertions(+), 40 deletions(-) delete mode 100644 compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt create mode 100644 compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 384fd3c3aae..b05320a9e36 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -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 visitConst(expression: IrConst): IrConst = - 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.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) } - - diff --git a/compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt b/compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt new file mode 100644 index 00000000000..fd636563a6d --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt @@ -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")) +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 916ea9ee7b3..54c3364326a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 55dc39dd4ae..7ca79ef221a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index dd2d996136e..649ff92ce01 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -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"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 48781cd8845..bf788a32c27 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -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"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index d6b2778c4d6..b445e3d2739 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -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");