From da0a8239928cb81028130acd196165444f82c847 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Tue, 13 Nov 2018 18:15:26 +0300 Subject: [PATCH] Remove descriptors from LocalDeclarationslowering --- .../common/lower/LocalDeclarationsLowering.kt | 12 +++++----- .../common/lower/SharedVariablesLowering.kt | 6 ++--- .../kotlin/ir/declarations/IrClass.kt | 6 +++-- .../kotlin/ir/declarations/IrDeclaration.kt | 5 +++++ .../kotlin/ir/declarations/IrEnumEntry.kt | 5 +---- .../kotlin/ir/declarations/IrField.kt | 2 -- .../kotlin/ir/declarations/IrFunction.kt | 6 ++--- .../declarations/IrLocalDelegatedProperty.kt | 4 +--- .../kotlin/ir/declarations/IrProperty.kt | 5 +---- .../kotlin/ir/declarations/IrTypeParameter.kt | 4 +--- .../ir/declarations/IrValueDeclaration.kt | 5 +---- .../closures/crossinlineLocalDeclaration.kt | 22 +++++++++++++++++++ .../crossInlineWithCapturedOuterReceiver.kt | 1 + .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 18 files changed, 74 insertions(+), 34 deletions(-) create mode 100644 compiler/testData/codegen/box/closures/crossinlineLocalDeclaration.kt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt index 3f3f7261577..804d5e158ca 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt @@ -40,8 +40,8 @@ import org.jetbrains.kotlin.name.NameUtils import java.util.* interface LocalNameProvider { - fun localName(descriptor: DeclarationDescriptor): String = - descriptor.name.asString() + fun localName(declaration: IrDeclarationWithName): String = + declaration.name.asString() companion object { val DEFAULT = object : LocalNameProvider {} @@ -465,13 +465,13 @@ class LocalDeclarationsLowering( } } - private fun suggestLocalName(declaration: IrDeclaration): String { + private fun suggestLocalName(declaration: IrDeclarationWithName): String { localFunctions[declaration]?.let { if (it.index >= 0) return "lambda-${it.index}" } - return localNameProvider.localName(declaration.descriptor) + return localNameProvider.localName(declaration) } private fun generateNameForLiftedDeclaration( @@ -481,7 +481,7 @@ class LocalDeclarationsLowering( Name.identifier( declaration.parentsWithSelf .takeWhile { it != newOwner } - .toList().reversed().joinToString(separator = "$") { suggestLocalName(it as IrDeclaration) } + .toList().reversed().joinToString(separator = "$") { suggestLocalName(it as IrDeclarationWithName) } ) private fun createLiftedDeclaration(localFunctionContext: LocalFunctionContext) { @@ -773,4 +773,4 @@ class LocalDeclarationsLowering( } } -} \ No newline at end of file +} diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt index 9e5883f7f1a..77ea77feb9c 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt @@ -89,7 +89,7 @@ class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPas } private fun rewriteSharedVariables() { - val transformedDescriptors = HashMap() + val transformedSymbols = HashMap() irFunction.transformChildrenVoid(object : IrElementTransformerVoid() { override fun visitVariable(declaration: IrVariable): IrStatement { @@ -99,7 +99,7 @@ class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPas val newDeclaration = context.sharedVariablesManager.declareSharedVariable(declaration) newDeclaration.parent = irFunction - transformedDescriptors[declaration.symbol] = newDeclaration.symbol + transformedSymbols[declaration.symbol] = newDeclaration.symbol return context.sharedVariablesManager.defineSharedValue(declaration, newDeclaration) } @@ -123,7 +123,7 @@ class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPas } private fun getTransformedSymbol(oldSymbol: IrValueSymbol): IrVariableSymbol? = - transformedDescriptors.getOrElse(oldSymbol) { + transformedSymbols.getOrElse(oldSymbol) { assert(oldSymbol.owner !in sharedVariables) { "Shared variable is not transformed: ${oldSymbol.owner.dump()}" } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt index bbf7d75e4ef..c59fca4f864 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt @@ -24,10 +24,12 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.name.Name -interface IrClass : IrSymbolDeclaration, IrDeclarationWithVisibility, IrDeclarationContainer, IrTypeParametersContainer { +interface IrClass : + IrSymbolDeclaration, IrDeclarationWithName, IrDeclarationWithVisibility, + IrDeclarationContainer, IrTypeParametersContainer { + override val descriptor: ClassDescriptor - val name: Name val kind: ClassKind val modality: Modality val isCompanion: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt index 2f69f8bd230..9b162ea64b3 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.visitors.IrElementTransformer +import org.jetbrains.kotlin.name.Name interface IrSymbolOwner : IrElement { val symbol: IrSymbol @@ -49,3 +50,7 @@ interface IrDeclarationWithVisibility : IrDeclaration { val visibility: Visibility } +interface IrDeclarationWithName : IrDeclaration { + val name: Name +} + diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrEnumEntry.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrEnumEntry.kt index 160c0eceddf..93252f854ff 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrEnumEntry.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrEnumEntry.kt @@ -19,13 +19,10 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol -import org.jetbrains.kotlin.name.Name -interface IrEnumEntry : IrSymbolDeclaration { +interface IrEnumEntry : IrSymbolDeclaration, IrDeclarationWithName { override val descriptor: ClassDescriptor - val name: Name - var correspondingClass: IrClass? var initializerExpression: IrExpression? } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt index b5f770b9c35..8b55518304e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt @@ -9,12 +9,10 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.name.Name interface IrField : IrSymbolDeclaration, IrOverridableDeclaration, IrDeclarationWithVisibility, IrDeclarationParent { override val descriptor: PropertyDescriptor - val name: Name val type: IrType val isFinal: Boolean val isExternal: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt index d4d69e31695..3547a2b57a5 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt @@ -22,13 +22,13 @@ import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.name.Name -interface IrFunction : IrDeclarationWithVisibility, IrTypeParametersContainer, IrSymbolOwner, IrDeclarationParent, IrReturnTarget { +interface IrFunction : + IrDeclarationWithName, IrDeclarationWithVisibility, IrTypeParametersContainer, IrSymbolOwner, IrDeclarationParent, IrReturnTarget { + override val descriptor: FunctionDescriptor override val symbol: IrFunctionSymbol - val name: Name val isInline: Boolean // NB: there's an inline constructor for Array and each primitive array class val isExternal: Boolean var returnType: IrType diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt index a08662334ea..b31f45d4a0f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt @@ -18,12 +18,10 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.name.Name -interface IrLocalDelegatedProperty : IrDeclaration { +interface IrLocalDelegatedProperty : IrDeclarationWithName { override val descriptor: VariableDescriptorWithAccessors - val name: Name val type: IrType val isVar: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt index fe80b3c54b6..6c2710bcb4c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt @@ -18,13 +18,10 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.name.Name -interface IrProperty : IrDeclarationWithVisibility { +interface IrProperty : IrDeclarationWithName, IrDeclarationWithVisibility { override val descriptor: PropertyDescriptor - val name: Name val modality: Modality val isVar: Boolean val isConst: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt index d0e9ce3323b..f13063b5d82 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt @@ -20,13 +20,11 @@ import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.visitors.IrElementTransformer -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance -interface IrTypeParameter : IrSymbolDeclaration { +interface IrTypeParameter : IrSymbolDeclaration, IrDeclarationWithName { override val descriptor: TypeParameterDescriptor - val name: Name val variance: Variance val index: Int val isReified: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrValueDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrValueDeclaration.kt index 8eea46c008f..362434e3b4b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrValueDeclaration.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrValueDeclaration.kt @@ -8,13 +8,10 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.ValueDescriptor import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.types.KotlinType -interface IrValueDeclaration : IrDeclaration, IrSymbolOwner { +interface IrValueDeclaration : IrDeclarationWithName, IrSymbolOwner { override val descriptor: ValueDescriptor override val symbol: IrValueSymbol - val name: Name val type: IrType } \ No newline at end of file diff --git a/compiler/testData/codegen/box/closures/crossinlineLocalDeclaration.kt b/compiler/testData/codegen/box/closures/crossinlineLocalDeclaration.kt new file mode 100644 index 00000000000..b58ffae7cc2 --- /dev/null +++ b/compiler/testData/codegen/box/closures/crossinlineLocalDeclaration.kt @@ -0,0 +1,22 @@ +// IGNORE_BACKEND: JVM_IR +// IGNORE_BACKEND: JS_IR +// WITH_RUNTIME + +interface Wrapper { fun runBlock() } + +inline fun crossInlineBuildWrapper(crossinline block: () -> Unit) = object : Wrapper { + override fun runBlock() { + block() + } +} + +class Container { + val wrapper = crossInlineBuildWrapper { + object { } + } +} + +fun box(): String { + Container().wrapper.runBlock() + return "OK" +} diff --git a/compiler/testData/codegen/box/coroutines/crossInlineWithCapturedOuterReceiver.kt b/compiler/testData/codegen/box/coroutines/crossInlineWithCapturedOuterReceiver.kt index 96459e600c5..11336deb527 100644 --- a/compiler/testData/codegen/box/coroutines/crossInlineWithCapturedOuterReceiver.kt +++ b/compiler/testData/codegen/box/coroutines/crossInlineWithCapturedOuterReceiver.kt @@ -1,4 +1,5 @@ // IGNORE_BACKEND: JVM_IR +// IGNORE_BACKEND: JS_IR // WITH_RUNTIME // COMMON_COROUTINES_TEST // WITH_COROUTINES diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 6c681793048..5031eb8d2fd 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -3686,6 +3686,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/closures/closureWithParameterAndBoxing.kt"); } + @TestMetadata("crossinlineLocalDeclaration.kt") + public void testCrossinlineLocalDeclaration() throws Exception { + runTest("compiler/testData/codegen/box/closures/crossinlineLocalDeclaration.kt"); + } + @TestMetadata("doubleEnclosedLocalVariable.kt") public void testDoubleEnclosedLocalVariable() throws Exception { runTest("compiler/testData/codegen/box/closures/doubleEnclosedLocalVariable.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index a13694535fc..6d42d8dc846 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -3686,6 +3686,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/closures/closureWithParameterAndBoxing.kt"); } + @TestMetadata("crossinlineLocalDeclaration.kt") + public void testCrossinlineLocalDeclaration() throws Exception { + runTest("compiler/testData/codegen/box/closures/crossinlineLocalDeclaration.kt"); + } + @TestMetadata("doubleEnclosedLocalVariable.kt") public void testDoubleEnclosedLocalVariable() throws Exception { runTest("compiler/testData/codegen/box/closures/doubleEnclosedLocalVariable.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 0bfb452e9d4..2e4a3fcc4ea 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -3686,6 +3686,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/closures/closureWithParameterAndBoxing.kt"); } + @TestMetadata("crossinlineLocalDeclaration.kt") + public void testCrossinlineLocalDeclaration() throws Exception { + runTest("compiler/testData/codegen/box/closures/crossinlineLocalDeclaration.kt"); + } + @TestMetadata("doubleEnclosedLocalVariable.kt") public void testDoubleEnclosedLocalVariable() throws Exception { runTest("compiler/testData/codegen/box/closures/doubleEnclosedLocalVariable.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index e5350b0141f..0504e95cc66 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -3086,6 +3086,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/closures/closureWithParameterAndBoxing.kt"); } + @TestMetadata("crossinlineLocalDeclaration.kt") + public void testCrossinlineLocalDeclaration() throws Exception { + runTest("compiler/testData/codegen/box/closures/crossinlineLocalDeclaration.kt"); + } + @TestMetadata("doubleEnclosedLocalVariable.kt") public void testDoubleEnclosedLocalVariable() throws Exception { runTest("compiler/testData/codegen/box/closures/doubleEnclosedLocalVariable.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 ea96098d9b3..ec98f0a906d 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 @@ -3086,6 +3086,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/closures/closureWithParameterAndBoxing.kt"); } + @TestMetadata("crossinlineLocalDeclaration.kt") + public void testCrossinlineLocalDeclaration() throws Exception { + runTest("compiler/testData/codegen/box/closures/crossinlineLocalDeclaration.kt"); + } + @TestMetadata("doubleEnclosedLocalVariable.kt") public void testDoubleEnclosedLocalVariable() throws Exception { runTest("compiler/testData/codegen/box/closures/doubleEnclosedLocalVariable.kt");