From 50e8f7efc7e118b60d6dd5acadcce68cac2b3be1 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 15 Aug 2018 14:33:13 +0300 Subject: [PATCH] Track fake overrides for IrField --- .../kotlin/descriptors/descriptorPsiUtils.kt | 4 +- .../jetbrains/kotlin/resolve/resolveUtil.kt | 17 ++++ .../psi2ir/generators/DeclarationGenerator.kt | 25 +----- .../psi2ir/generators/ModuleGenerator.kt | 2 +- .../psi2ir/generators/PropertyGenerator.kt | 40 +++++++-- .../kotlin/ir/declarations/IrDeclaration.kt | 5 ++ .../kotlin/ir/declarations/IrField.kt | 4 +- .../ir/declarations/IrSimpleFunction.kt | 4 +- .../ir/declarations/impl/IrFieldImpl.kt | 1 + .../ir/util/DeclarationStubGenerator.kt | 11 +-- .../kotlin/ir/util/DeepCopyIrTree.kt | 9 ++ .../ir/util/DeepCopyIrTreeWithSymbols.kt | 8 +- .../jetbrains/kotlin/ir/util/DumpIrTree.kt | 10 +++ .../ir/util/ExternalDependenciesGenerator.kt | 9 +- .../jetbrains/kotlin/ir/util/SymbolTable.kt | 3 +- .../org/jetbrains/kotlin/ir/util/overrides.kt | 31 ++++++- ...tReorderingInDelegatingConstructorCall.txt | 12 +++ .../testData/ir/irText/classes/classes.txt | 1 - ...gConstructorCallToTypeAliasConstructor.txt | 1 - compiler/testData/ir/irText/classes/enum.txt | 7 +- .../irText/classes/enumWithSecondaryCtor.txt | 7 +- .../annotations/classesWithAnnotations.txt | 1 - .../enumEntriesWithAnnotations.txt | 1 - .../enumsInAnnotationArguments.txt | 1 - .../multiplatform/expectedEnumClass.txt | 1 - .../expressions/enumEntryAsReceiver.txt | 1 - .../expressions/jvmInstanceFieldReference.txt | 2 + .../ir/irText/expressions/kt16904.txt | 9 +- .../expressions/multipleThisReferences.txt | 4 +- .../irText/expressions/objectAsCallable.txt | 1 - ...ferenceInClosureInSuperConstructorCall.txt | 3 + .../expressions/setFieldWithImplicitCast.txt | 2 + .../expressions/thisOfGenericOuterClass.txt | 1 - .../testData/ir/irText/expressions/values.txt | 1 - .../ir/irText/singletons/enumEntry.txt | 1 - .../stubs/genericClassInDifferentModule.kt | 23 +++++ .../genericClassInDifferentModule_m1.txt | 57 +++++++++++++ .../genericClassInDifferentModule_m2.txt | 84 +++++++++++++++++++ .../ir/irText/stubs/javaInnerClass.txt | 2 + .../kotlin/ir/IrTextTestCaseGenerated.java | 5 ++ 40 files changed, 341 insertions(+), 70 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/resolveUtil.kt create mode 100644 compiler/testData/ir/irText/stubs/genericClassInDifferentModule.kt create mode 100644 compiler/testData/ir/irText/stubs/genericClassInDifferentModule_m1.txt create mode 100644 compiler/testData/ir/irText/stubs/genericClassInDifferentModule_m2.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/descriptorPsiUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/descriptorPsiUtils.kt index ae4b931263a..7f273f1d1c6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/descriptorPsiUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/descriptorPsiUtils.kt @@ -17,11 +17,11 @@ package org.jetbrains.kotlin.descriptors import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor -import org.jetbrains.kotlin.psi.KtPropertyAccessor +import org.jetbrains.kotlin.psi.KtDeclarationWithBody import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils fun PropertyAccessorDescriptor.hasBody(): Boolean { - val ktAccessor = DescriptorToSourceUtils.getSourceFromDescriptor(this) as? KtPropertyAccessor + val ktAccessor = DescriptorToSourceUtils.getSourceFromDescriptor(this) as? KtDeclarationWithBody return ktAccessor != null && ktAccessor.hasBody() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/resolveUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/resolveUtil.kt new file mode 100644 index 00000000000..554be43bd94 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/resolveUtil.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve + +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.resolve.source.KotlinSourceElement + +fun PropertyDescriptor.hasBackingField(bindingContext: BindingContext?): Boolean = when { + kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE -> overriddenDescriptors.any { it.hasBackingField(bindingContext) } + source is KotlinSourceElement && bindingContext != null -> bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, this) ?: false + getter != null -> false + else -> true +} diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt index 3b0791ccc40..9928bc81819 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt @@ -155,29 +155,8 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { } } - private fun generateFakeOverrideProperty(propertyDescriptor: PropertyDescriptor, ktElement: KtPureElement): IrProperty { - val startOffset = ktElement.pureStartOffsetOrUndefined - val endOffset = ktElement.pureEndOffsetOrUndefined - - val backingField = - if (propertyDescriptor.getter == null) - context.symbolTable.declareField( - startOffset, endOffset, IrDeclarationOrigin.FAKE_OVERRIDE, - propertyDescriptor, propertyDescriptor.type.toIrType() - ) - else - null - - return IrPropertyImpl( - startOffset, endOffset, - IrDeclarationOrigin.FAKE_OVERRIDE, - false, - propertyDescriptor, - backingField, - propertyDescriptor.getter?.let { generateFakeOverrideFunction(it, ktElement) }, - propertyDescriptor.setter?.let { generateFakeOverrideFunction(it, ktElement) } - ) - } + private fun generateFakeOverrideProperty(propertyDescriptor: PropertyDescriptor, ktElement: KtPureElement): IrProperty = + PropertyGenerator(this).generateFakeOverrideProperty(propertyDescriptor, ktElement) private fun generateFakeOverrideFunction(functionDescriptor: FunctionDescriptor, ktElement: KtPureElement): IrSimpleFunction = FunctionGenerator(this).generateFakeOverrideFunction(functionDescriptor, ktElement) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt index 75720ce09f4..3234a921571 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt @@ -42,7 +42,7 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator { fun generateUnboundSymbolsAsDependencies(irModule: IrModuleFragment) { ExternalDependenciesGenerator( irModule.descriptor, context.symbolTable, context.irBuiltIns - ).generateUnboundSymbolsAsDependencies(irModule) + ).generateUnboundSymbolsAsDependencies(irModule, context.bindingContext) } private fun generateFiles(ktFiles: Collection): List { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt index 2f2e2b7035b..ab53ad8220a 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.psi2ir.generators +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrPropertyImpl @@ -23,13 +24,15 @@ import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.KtProperty -import org.jetbrains.kotlin.psi.KtPropertyDelegate +import org.jetbrains.kotlin.ir.util.declareFieldWithOverrides +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset +import org.jetbrains.kotlin.psi2ir.pureEndOffsetOrUndefined +import org.jetbrains.kotlin.psi2ir.pureStartOffsetOrUndefined import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.hasBackingField +import org.jetbrains.kotlin.resolve.source.KotlinSourceElement class PropertyGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) { fun generatePropertyDeclaration(ktProperty: KtProperty): IrProperty { @@ -106,7 +109,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio propertyDescriptor ).buildWithScope { irProperty -> irProperty.backingField = - if (propertyDescriptor.hasBackingField()) + if (propertyDescriptor.hasBackingField(context.bindingContext)) generatePropertyBackingField(ktProperty, propertyDescriptor) { irField -> ktProperty.initializer?.let { ktInitializer -> declarationGenerator.generateInitializerBody(irField.symbol, ktInitializer) @@ -119,8 +122,30 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio irProperty.setter = generateSetterIfRequired(ktProperty, propertyDescriptor) } - private fun PropertyDescriptor.hasBackingField(): Boolean = - get(BindingContext.BACKING_FIELD_REQUIRED, this) ?: false + fun generateFakeOverrideProperty(propertyDescriptor: PropertyDescriptor, ktElement: KtPureElement): IrProperty { + val startOffset = ktElement.pureStartOffsetOrUndefined + val endOffset = ktElement.pureEndOffsetOrUndefined + + val backingField = + if (propertyDescriptor.hasBackingField(context.bindingContext)) + context.symbolTable.declareFieldWithOverrides( + startOffset, endOffset, IrDeclarationOrigin.FAKE_OVERRIDE, + propertyDescriptor, propertyDescriptor.type.toIrType(), + { it.hasBackingField(context.bindingContext) } + ) + else + null + + return IrPropertyImpl( + startOffset, endOffset, + IrDeclarationOrigin.FAKE_OVERRIDE, + false, + propertyDescriptor, + backingField, + propertyDescriptor.getter?.let { FunctionGenerator(declarationGenerator).generateFakeOverrideFunction(it, ktElement) }, + propertyDescriptor.setter?.let { FunctionGenerator(declarationGenerator).generateFakeOverrideFunction(it, ktElement) } + ) + } private fun generateGetterIfRequired(ktProperty: KtProperty, property: PropertyDescriptor): IrSimpleFunction? { val getter = property.getter ?: return null @@ -138,3 +163,4 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio return variableDescriptor as? PropertyDescriptor ?: TODO("not a property?") } } + 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 45ca314bcf6..2f69f8bd230 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 @@ -41,6 +41,11 @@ interface IrSymbolDeclaration : IrDeclaration, IrSymbolOwner { override val symbol: S } +interface IrOverridableDeclaration : IrDeclaration { + val overriddenSymbols: MutableList +} + interface IrDeclarationWithVisibility : IrDeclaration { val visibility: Visibility } + 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 2c3210bdf03..310d928a376 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 @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.name.Name -interface IrField : IrSymbolDeclaration, IrDeclarationWithVisibility { +interface IrField : IrSymbolDeclaration, IrOverridableDeclaration, IrDeclarationWithVisibility { override val descriptor: PropertyDescriptor val name: Name @@ -23,4 +23,4 @@ interface IrField : IrSymbolDeclaration, IrDeclarationWithVisibil var initializer: IrExpressionBody? var correspondingProperty: IrProperty? -} \ No newline at end of file +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrSimpleFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrSimpleFunction.kt index 6c68c3d6f09..41c637ba239 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrSimpleFunction.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrSimpleFunction.kt @@ -19,14 +19,12 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol -interface IrSimpleFunction : IrFunction, IrSymbolDeclaration { +interface IrSimpleFunction : IrFunction, IrSymbolDeclaration, IrOverridableDeclaration { val modality: Modality val isTailrec: Boolean val isSuspend: Boolean var correspondingProperty: IrProperty? - - val overriddenSymbols: MutableList } val IrFunction.isPropertyAccessor: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt index 10d6d11ad2d..f7c5220293d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt @@ -88,6 +88,7 @@ class IrFieldImpl( override var initializer: IrExpressionBody? = null override var correspondingProperty: IrProperty? = null + override val overriddenSymbols: MutableList = mutableListOf() override fun accept(visitor: IrElementVisitor, data: D): R { return visitor.visitField(this, data) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 3f85022cc51..51cde83544c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -20,14 +20,14 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrPropertyImpl import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl import org.jetbrains.kotlin.ir.declarations.lazy.* -import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.hasBackingField import org.jetbrains.kotlin.types.KotlinType class DeclarationStubGenerator( @@ -79,10 +79,10 @@ class DeclarationStubGenerator( throw AssertionError("Unexpected member descriptor: $descriptor") } - internal fun generatePropertyStub(descriptor: PropertyDescriptor): IrProperty = + internal fun generatePropertyStub(descriptor: PropertyDescriptor, bindingContext: BindingContext? = null): IrProperty = IrPropertyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor).also { irProperty -> val getterDescriptor = descriptor.getter - if (getterDescriptor == null) { + if (descriptor.hasBackingField(bindingContext)) { irProperty.backingField = symbolTable.declareField( UNDEFINED_OFFSET, @@ -91,7 +91,8 @@ class DeclarationStubGenerator( descriptor.original, descriptor.type.toIrType() ) - } else { + } + if (getterDescriptor != null) { irProperty.getter = generateFunctionStub(getterDescriptor) } 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 index 86ddd6912ad..ba61db6670e 100644 --- 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 @@ -243,6 +243,15 @@ open class DeepCopyIrTree : IrElementTransformerVoid() { declaration.initializer?.transform() ).apply { transformAnnotations(declaration) + if (declaration.origin == IrDeclarationOrigin.FAKE_OVERRIDE) { + descriptor.overriddenDescriptors.mapIndexedTo(overriddenSymbols) { index, overriddenDescriptor -> + val oldOverriddenSymbol = declaration.overriddenSymbols.getOrNull(index) + if (overriddenDescriptor.original == oldOverriddenSymbol?.descriptor?.original) + oldOverriddenSymbol + else + IrFieldSymbolImpl(overriddenDescriptor.original) + } + } } override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrLocalDelegatedProperty = 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 7f0c9b94244..dc2a11996e7 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 @@ -22,10 +22,7 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* -import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol -import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol -import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid @@ -175,6 +172,9 @@ open class DeepCopyIrTreeWithSymbols( declaration.type.remapType() ).apply { transformAnnotations(declaration) + declaration.overriddenSymbols.mapTo(overriddenSymbols) { + symbolRemapper.getReferencedField(it) + } initializer = declaration.initializer?.transform() } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt index 19fbc7296aa..7dd84590761 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt @@ -144,6 +144,16 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor { } } + override fun visitField(declaration: IrField, data: String) { + declaration.dumpLabeledElementWith(data) { + dumpAnnotations(declaration) + declaration.overriddenSymbols.dumpItems("overridden") { + it.dumpDeclarationElementOrDescriptor() + } + declaration.initializer?.accept(this, "") + } + } + private fun List.dumpElements() { forEach { it.accept(this@DumpIrTreeVisitor, "") } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt index c67d61a9a24..c7cd2f8fb79 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns +import org.jetbrains.kotlin.resolve.BindingContext class ExternalDependenciesGenerator( moduleDescriptor: ModuleDescriptor, @@ -30,11 +31,11 @@ class ExternalDependenciesGenerator( moduleDescriptor, symbolTable, IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, irBuiltIns.languageVersionSettings ) - fun generateUnboundSymbolsAsDependencies(irModule: IrModuleFragment) { - DependencyGenerationTask(irModule).run() + fun generateUnboundSymbolsAsDependencies(irModule: IrModuleFragment, bindingContext: BindingContext? = null) { + DependencyGenerationTask(irModule, bindingContext).run() } - private inner class DependencyGenerationTask(val irModule: IrModuleFragment) { + private inner class DependencyGenerationTask(val irModule: IrModuleFragment, val bindingContext: BindingContext?) { fun run() { stubGenerator.unboundSymbolGeneration = true @@ -48,7 +49,7 @@ class ExternalDependenciesGenerator( stubGenerator.generateEnumEntryStub(it.descriptor) } ArrayList(symbolTable.unboundFields).forEach { - stubGenerator.generatePropertyStub(it.descriptor) + stubGenerator.generatePropertyStub(it.descriptor, bindingContext) } ArrayList(symbolTable.unboundSimpleFunctions).forEach { stubGenerator.generateFunctionStub(it.descriptor) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index b504c8f7794..c65b99179cd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -124,8 +124,7 @@ open class SymbolTable : ReferenceSymbolTable { private var currentScope: Scope? = null override fun get(d: D): S? { - val scope = currentScope - ?: throw AssertionError("No active scope") + val scope = currentScope ?: return null return scope[d] } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt index 00512e7fbd5..966011b585e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt @@ -6,7 +6,9 @@ package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin +import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.types.IrType @@ -17,10 +19,11 @@ fun SymbolTable.declareSimpleFunctionWithOverrides( descriptor: FunctionDescriptor ) = declareSimpleFunction(startOffset, endOffset, origin, descriptor).also { declaration -> - generateOverriddenSymbols(declaration, this) + generateOverriddenFunctionSymbols(declaration, this) } -fun generateOverriddenSymbols( + +fun generateOverriddenFunctionSymbols( declaration: IrSimpleFunction, symbolTable: SymbolTable ) { @@ -28,3 +31,27 @@ fun generateOverriddenSymbols( symbolTable.referenceSimpleFunction(it.original) } } + +fun SymbolTable.declareFieldWithOverrides( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + descriptor: PropertyDescriptor, + type: IrType, + hasBackingField: (PropertyDescriptor) -> Boolean +) = + declareField(startOffset, endOffset, origin, descriptor, type).also { declaration -> + generateOverriddenFieldSymbols(declaration, this, hasBackingField) + } + +fun generateOverriddenFieldSymbols( + declaration: IrField, + symbolTable: SymbolTable, + hasBackingField: (PropertyDescriptor) -> Boolean +) { + declaration.descriptor.overriddenDescriptors.mapNotNullTo(declaration.overriddenSymbols) { + if (hasBackingField(it)) { + symbolTable.referenceField(it.original) + } else null + } +} \ No newline at end of file diff --git a/compiler/testData/ir/irText/classes/argumentReorderingInDelegatingConstructorCall.txt b/compiler/testData/ir/irText/classes/argumentReorderingInDelegatingConstructorCall.txt index 8181df3cd4b..2c16bb0a499 100644 --- a/compiler/testData/ir/irText/classes/argumentReorderingInDelegatingConstructorCall.txt +++ b/compiler/testData/ir/irText/classes/argumentReorderingInDelegatingConstructorCall.txt @@ -58,12 +58,18 @@ FILE fqName: fileName:/argumentReorderingInDelegatingConstructorCall.kt y: GET_VAR 'tmp0_y: Int' type=kotlin.Int origin=null INSTANCE_INITIALIZER_CALL classDescriptor='Test1' PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:Base) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val overridden: FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:Base) returnType:kotlin.Int flags: $this: VALUE_PARAMETER name: type:Base flags: PROPERTY FAKE_OVERRIDE name:y visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:y type:kotlin.Int visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:y type:kotlin.Int visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:Base) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:y visibility:public modality:FINAL flags:val overridden: @@ -111,12 +117,18 @@ FILE fqName: fileName:/argumentReorderingInDelegatingConstructorCall.kt xx: GET_VAR 'tmp1_xx: Int' type=kotlin.Int origin=null yy: GET_VAR 'tmp0_yy: Int' type=kotlin.Int origin=null PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:Base) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val overridden: FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:Base) returnType:kotlin.Int flags: $this: VALUE_PARAMETER name: type:Base flags: PROPERTY FAKE_OVERRIDE name:y visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:y type:kotlin.Int visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:y type:kotlin.Int visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:Base) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:y visibility:public modality:FINAL flags:val overridden: diff --git a/compiler/testData/ir/irText/classes/classes.txt b/compiler/testData/ir/irText/classes/classes.txt index 4f3ff6ab373..b40cbcc9a61 100644 --- a/compiler/testData/ir/irText/classes/classes.txt +++ b/compiler/testData/ir/irText/classes/classes.txt @@ -122,4 +122,3 @@ FILE fqName: fileName:/classes.kt FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestEnumClass flags: VALUE_PARAMETER name:value index:0 type:kotlin.String flags: SYNTHETIC_BODY kind=ENUM_VALUEOF - diff --git a/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.txt b/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.txt index 264f04ee635..5d526006835 100644 --- a/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.txt +++ b/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.txt @@ -87,4 +87,3 @@ FILE fqName: fileName:/delegatingConstructorCallToTypeAliasConstructor.kt overridden: FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: $this: VALUE_PARAMETER name: type:kotlin.Any flags: - diff --git a/compiler/testData/ir/irText/classes/enum.txt b/compiler/testData/ir/irText/classes/enum.txt index 883b1ac00cd..efc4d8d5515 100644 --- a/compiler/testData/ir/irText/classes/enum.txt +++ b/compiler/testData/ir/irText/classes/enum.txt @@ -323,6 +323,9 @@ FILE fqName: fileName:/enum.kt FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: $this: VALUE_PARAMETER name: type:kotlin.Enum flags: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:TestEnum4) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val overridden: @@ -404,6 +407,9 @@ FILE fqName: fileName:/enum.kt FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: $this: VALUE_PARAMETER name: type:kotlin.Enum flags: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:TestEnum4) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val overridden: @@ -537,4 +543,3 @@ FILE fqName: fileName:/enum.kt FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestEnum5 flags: VALUE_PARAMETER name:value index:0 type:kotlin.String flags: SYNTHETIC_BODY kind=ENUM_VALUEOF - diff --git a/compiler/testData/ir/irText/classes/enumWithSecondaryCtor.txt b/compiler/testData/ir/irText/classes/enumWithSecondaryCtor.txt index aaf56161d4f..77a0107a92e 100644 --- a/compiler/testData/ir/irText/classes/enumWithSecondaryCtor.txt +++ b/compiler/testData/ir/irText/classes/enumWithSecondaryCtor.txt @@ -221,6 +221,9 @@ FILE fqName: fileName:/enumWithSecondaryCtor.kt FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: $this: VALUE_PARAMETER name: type:kotlin.Enum flags: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:Test2) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val overridden: @@ -287,6 +290,9 @@ FILE fqName: fileName:/enumWithSecondaryCtor.kt FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int flags: $this: VALUE_PARAMETER name: type:kotlin.Enum flags: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:Test2) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val overridden: @@ -349,4 +355,3 @@ FILE fqName: fileName:/enumWithSecondaryCtor.kt FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:Test2 flags: VALUE_PARAMETER name:value index:0 type:kotlin.String flags: SYNTHETIC_BODY kind=ENUM_VALUEOF - diff --git a/compiler/testData/ir/irText/declarations/annotations/classesWithAnnotations.txt b/compiler/testData/ir/irText/declarations/annotations/classesWithAnnotations.txt index e2ab49dae30..d917bcf4381 100644 --- a/compiler/testData/ir/irText/declarations/annotations/classesWithAnnotations.txt +++ b/compiler/testData/ir/irText/declarations/annotations/classesWithAnnotations.txt @@ -206,4 +206,3 @@ FILE fqName: fileName:/classesWithAnnotations.kt overridden: FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: $this: VALUE_PARAMETER name: type:kotlin.Any flags: - diff --git a/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.txt b/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.txt index ef996ad5356..689b04e929f 100644 --- a/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.txt +++ b/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.txt @@ -155,4 +155,3 @@ FILE fqName: fileName:/enumEntriesWithAnnotations.kt FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:TestEnum flags: VALUE_PARAMETER name:value index:0 type:kotlin.String flags: SYNTHETIC_BODY kind=ENUM_VALUEOF - diff --git a/compiler/testData/ir/irText/declarations/annotations/enumsInAnnotationArguments.txt b/compiler/testData/ir/irText/declarations/annotations/enumsInAnnotationArguments.txt index 319a2cab24d..4ac5492c528 100644 --- a/compiler/testData/ir/irText/declarations/annotations/enumsInAnnotationArguments.txt +++ b/compiler/testData/ir/irText/declarations/annotations/enumsInAnnotationArguments.txt @@ -94,4 +94,3 @@ FILE fqName: fileName:/enumsInAnnotationArguments.kt CALL 'constructor TestAnn(En)' type=TestAnn origin=null x: GET_ENUM 'A' type=En BLOCK_BODY - diff --git a/compiler/testData/ir/irText/declarations/multiplatform/expectedEnumClass.txt b/compiler/testData/ir/irText/declarations/multiplatform/expectedEnumClass.txt index 8cff869c1c8..8c094232086 100644 --- a/compiler/testData/ir/irText/declarations/multiplatform/expectedEnumClass.txt +++ b/compiler/testData/ir/irText/declarations/multiplatform/expectedEnumClass.txt @@ -110,4 +110,3 @@ FILE fqName: fileName:/expectedEnumClass.kt FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:MyEnum flags: VALUE_PARAMETER name:value index:0 type:kotlin.String flags: SYNTHETIC_BODY kind=ENUM_VALUEOF - diff --git a/compiler/testData/ir/irText/expressions/enumEntryAsReceiver.txt b/compiler/testData/ir/irText/expressions/enumEntryAsReceiver.txt index 135be47c41d..7080325ba0c 100644 --- a/compiler/testData/ir/irText/expressions/enumEntryAsReceiver.txt +++ b/compiler/testData/ir/irText/expressions/enumEntryAsReceiver.txt @@ -145,4 +145,3 @@ FILE fqName: fileName:/enumEntryAsReceiver.kt CALL 'invoke(): String' type=kotlin.String origin=INVOKE $this: CALL '(): () -> String' type=() -> kotlin.String origin=GET_PROPERTY $this: GET_ENUM 'B' type=X - diff --git a/compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.txt b/compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.txt index 6c5cb6bf0dd..e24352010db 100644 --- a/compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.txt +++ b/compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.txt @@ -25,6 +25,8 @@ FILE fqName: fileName:/Derived.kt value: GET_VAR 'value-parameter value: Int' type=kotlin.Int origin=null PROPERTY FAKE_OVERRIDE name:value visibility:public modality:FINAL flags:var FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public flags: + overridden: + FIELD IR_EXTERNAL_DECLARATION_STUB name:value type:kotlin.Int visibility:public flags: FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: overridden: FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: diff --git a/compiler/testData/ir/irText/expressions/kt16904.txt b/compiler/testData/ir/irText/expressions/kt16904.txt index f677f3a4170..a673f62d45d 100644 --- a/compiler/testData/ir/irText/expressions/kt16904.txt +++ b/compiler/testData/ir/irText/expressions/kt16904.txt @@ -94,12 +94,18 @@ FILE fqName: fileName:/kt16904.kt $this: GET_VAR 'tmp1_this: Test1' type=Test1 origin=null other: CONST Int type=kotlin.Int value=42 PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:x type:B visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:x type:B visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:A) returnType:B flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val overridden: FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:A) returnType:B flags: $this: VALUE_PARAMETER name: type:A flags: PROPERTY FAKE_OVERRIDE name:y visibility:public modality:FINAL flags:var + FIELD FAKE_OVERRIDE name:y type:kotlin.Int visibility:public flags: + overridden: + FIELD PROPERTY_BACKING_FIELD name:y type:kotlin.Int visibility:public flags: FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:A) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:y visibility:public modality:FINAL flags:var overridden: @@ -137,6 +143,8 @@ FILE fqName: fileName:/kt16904.kt value: CONST Int type=kotlin.Int value=42 PROPERTY FAKE_OVERRIDE name:field visibility:public modality:FINAL flags:var FIELD FAKE_OVERRIDE name:field type:kotlin.Int visibility:public flags: + overridden: + FIELD IR_EXTERNAL_DECLARATION_STUB name:field type:kotlin.Int visibility:public flags: FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: overridden: FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: @@ -150,4 +158,3 @@ FILE fqName: fileName:/kt16904.kt overridden: FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: $this: VALUE_PARAMETER name: type:kotlin.Any flags: - diff --git a/compiler/testData/ir/irText/expressions/multipleThisReferences.txt b/compiler/testData/ir/irText/expressions/multipleThisReferences.txt index d9cc4c8575f..a50415df9e7 100644 --- a/compiler/testData/ir/irText/expressions/multipleThisReferences.txt +++ b/compiler/testData/ir/irText/expressions/multipleThisReferences.txt @@ -98,6 +98,9 @@ FILE fqName: fileName:/multipleThisReferences.kt GET_FIELD 'xx: Int' type=kotlin.Int origin=null receiver: GET_VAR 'this@: ' type=Host.test. origin=null PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:Outer.Inner) returnType:kotlin.Int flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val overridden: @@ -130,4 +133,3 @@ FILE fqName: fileName:/multipleThisReferences.kt overridden: FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: $this: VALUE_PARAMETER name: type:kotlin.Any flags: - diff --git a/compiler/testData/ir/irText/expressions/objectAsCallable.txt b/compiler/testData/ir/irText/expressions/objectAsCallable.txt index a1e535a43eb..5c7dcfb30b8 100644 --- a/compiler/testData/ir/irText/expressions/objectAsCallable.txt +++ b/compiler/testData/ir/irText/expressions/objectAsCallable.txt @@ -108,4 +108,3 @@ FILE fqName: fileName:/objectAsCallable.kt BLOCK_BODY RETURN type=kotlin.Nothing from='(): Int' GET_FIELD 'test2: Int' type=kotlin.Int origin=null - diff --git a/compiler/testData/ir/irText/expressions/objectReferenceInClosureInSuperConstructorCall.txt b/compiler/testData/ir/irText/expressions/objectReferenceInClosureInSuperConstructorCall.txt index 0a45db87a74..dc9bca3fb13 100644 --- a/compiler/testData/ir/irText/expressions/objectReferenceInClosureInSuperConstructorCall.txt +++ b/compiler/testData/ir/irText/expressions/objectReferenceInClosureInSuperConstructorCall.txt @@ -43,6 +43,9 @@ FILE fqName: fileName:/objectReferenceInClosureInSuperConstructorCall.kt FUNCTION_REFERENCE '(): Test' type=() -> Test origin=LAMBDA INSTANCE_INITIALIZER_CALL classDescriptor='Test' PROPERTY FAKE_OVERRIDE name:lambda visibility:public modality:FINAL flags:val + FIELD FAKE_OVERRIDE name:lambda type:() -> kotlin.Any visibility:public flags:final + overridden: + FIELD PROPERTY_BACKING_FIELD name:lambda type:() -> kotlin.Any visibility:public flags:final FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:Base) returnType:() -> kotlin.Any flags: correspondingProperty: PROPERTY FAKE_OVERRIDE name:lambda visibility:public modality:FINAL flags:val overridden: diff --git a/compiler/testData/ir/irText/expressions/setFieldWithImplicitCast.txt b/compiler/testData/ir/irText/expressions/setFieldWithImplicitCast.txt index cc26df17abc..7d7bdeadcac 100644 --- a/compiler/testData/ir/irText/expressions/setFieldWithImplicitCast.txt +++ b/compiler/testData/ir/irText/expressions/setFieldWithImplicitCast.txt @@ -22,6 +22,8 @@ FILE fqName: fileName:/Derived.kt GET_VAR 'value-parameter v: Any' type=kotlin.Any origin=null PROPERTY FAKE_OVERRIDE name:value visibility:public modality:FINAL flags:var FIELD FAKE_OVERRIDE name:value type:kotlin.String? visibility:public flags: + overridden: + FIELD IR_EXTERNAL_DECLARATION_STUB name:value type:kotlin.String? visibility:public flags: FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: overridden: FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: diff --git a/compiler/testData/ir/irText/expressions/thisOfGenericOuterClass.txt b/compiler/testData/ir/irText/expressions/thisOfGenericOuterClass.txt index 35c7d966c91..51bf90de891 100644 --- a/compiler/testData/ir/irText/expressions/thisOfGenericOuterClass.txt +++ b/compiler/testData/ir/irText/expressions/thisOfGenericOuterClass.txt @@ -111,4 +111,3 @@ FILE fqName: fileName:/thisOfGenericOuterClass.kt FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: $this: VALUE_PARAMETER name: type:kotlin.Any flags: CALL 'constructor ()' type=test. origin=OBJECT_LITERAL - diff --git a/compiler/testData/ir/irText/expressions/values.txt b/compiler/testData/ir/irText/expressions/values.txt index 42d86cb708e..d55dcd54705 100644 --- a/compiler/testData/ir/irText/expressions/values.txt +++ b/compiler/testData/ir/irText/expressions/values.txt @@ -137,4 +137,3 @@ FILE fqName: fileName:/values.kt BLOCK_BODY RETURN type=kotlin.Nothing from='test4(): Z.Companion' GET_OBJECT 'companion object of Z' type=Z.Companion - diff --git a/compiler/testData/ir/irText/singletons/enumEntry.txt b/compiler/testData/ir/irText/singletons/enumEntry.txt index de27e301d7a..7db3e8abf63 100644 --- a/compiler/testData/ir/irText/singletons/enumEntry.txt +++ b/compiler/testData/ir/irText/singletons/enumEntry.txt @@ -132,4 +132,3 @@ FILE fqName: fileName:/enumEntry.kt FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:Z flags: VALUE_PARAMETER name:value index:0 type:kotlin.String flags: SYNTHETIC_BODY kind=ENUM_VALUEOF - diff --git a/compiler/testData/ir/irText/stubs/genericClassInDifferentModule.kt b/compiler/testData/ir/irText/stubs/genericClassInDifferentModule.kt new file mode 100644 index 00000000000..3cdf31bb63d --- /dev/null +++ b/compiler/testData/ir/irText/stubs/genericClassInDifferentModule.kt @@ -0,0 +1,23 @@ +// MODULE: m1 +// FILE: genericClassInDifferentModule_m1.kt + +abstract class Base(val x: T) { + abstract fun foo(y: Y): T + + abstract var bar: T + + abstract var Z.exn: T +} + +// MODULE: m2(m1) +// FILE: genericClassInDifferentModule_m2.kt + +class Derived1(x: T) : Base(x) { + override fun foo(y: Y): T = x + + override var bar: T = x + + override var Z.exn: T + get() = x + set(value) {} +} \ No newline at end of file diff --git a/compiler/testData/ir/irText/stubs/genericClassInDifferentModule_m1.txt b/compiler/testData/ir/irText/stubs/genericClassInDifferentModule_m1.txt new file mode 100644 index 00000000000..b005d85ca0f --- /dev/null +++ b/compiler/testData/ir/irText/stubs/genericClassInDifferentModule_m1.txt @@ -0,0 +1,57 @@ +FILE fqName: fileName:/genericClassInDifferentModule_m1.kt + CLASS CLASS name:Base modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:Base flags: + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] + CONSTRUCTOR visibility:public <> (x:T) returnType:Base flags:primary + VALUE_PARAMETER name:x index:0 type:T flags: + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Any()' + INSTANCE_INITIALIZER_CALL classDescriptor='Base' + PROPERTY name:x visibility:public modality:FINAL flags:val + FIELD PROPERTY_BACKING_FIELD name:x type:T visibility:public flags:final + EXPRESSION_BODY + GET_VAR 'value-parameter x: T' type=T origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:Base) returnType:T flags: + correspondingProperty: PROPERTY name:x visibility:public modality:FINAL flags:val + $this: VALUE_PARAMETER name: type:Base flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='(): T' + GET_FIELD 'x: T' type=T origin=null + receiver: GET_VAR 'this@Base: Base' type=Base origin=null + FUN name:foo visibility:public modality:ABSTRACT ($this:Base, y:Y) returnType:T flags: + TYPE_PARAMETER name:Y index:0 variance: superTypes:[kotlin.Any?] + $this: VALUE_PARAMETER name: type:Base flags: + VALUE_PARAMETER name:y index:0 type:Y flags: + PROPERTY name:bar visibility:public modality:ABSTRACT flags:var + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT <> ($this:Base) returnType:T flags: + correspondingProperty: PROPERTY name:bar visibility:public modality:ABSTRACT flags:var + $this: VALUE_PARAMETER name: type:Base flags: + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT <> ($this:Base, :T) returnType:kotlin.Unit flags: + correspondingProperty: PROPERTY name:bar visibility:public modality:ABSTRACT flags:var + $this: VALUE_PARAMETER name: type:Base flags: + VALUE_PARAMETER name: index:0 type:T flags: + PROPERTY name:exn visibility:public modality:ABSTRACT flags:var + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT ($this:Base, $receiver:Z) returnType:T flags: + correspondingProperty: PROPERTY name:exn visibility:public modality:ABSTRACT flags:var + TYPE_PARAMETER name:Z index:0 variance: superTypes:[kotlin.Any?] + $this: VALUE_PARAMETER name: type:Base flags: + $receiver: VALUE_PARAMETER name: type:Z flags: + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT ($this:Base, $receiver:Z, :T) returnType:kotlin.Unit flags: + correspondingProperty: PROPERTY name:exn visibility:public modality:ABSTRACT flags:var + TYPE_PARAMETER name:Z index:0 variance: superTypes:[kotlin.Any?] + $this: VALUE_PARAMETER name: type:Base flags: + $receiver: VALUE_PARAMETER name: type:Z flags: + VALUE_PARAMETER name: index:0 type:T flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: diff --git a/compiler/testData/ir/irText/stubs/genericClassInDifferentModule_m2.txt b/compiler/testData/ir/irText/stubs/genericClassInDifferentModule_m2.txt new file mode 100644 index 00000000000..7693b07562f --- /dev/null +++ b/compiler/testData/ir/irText/stubs/genericClassInDifferentModule_m2.txt @@ -0,0 +1,84 @@ +FILE fqName: fileName:/genericClassInDifferentModule_m2.kt + CLASS CLASS name:Derived1 modality:FINAL visibility:public flags: superTypes:[Base] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:Derived1 flags: + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] + CONSTRUCTOR visibility:public <> (x:T) returnType:Derived1 flags:primary + VALUE_PARAMETER name:x index:0 type:T flags: + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Base(T)' + : T + x: GET_VAR 'value-parameter x: T' type=T origin=null + INSTANCE_INITIALIZER_CALL classDescriptor='Derived1' + FUN name:foo visibility:public modality:OPEN ($this:Derived1, y:Y) returnType:T flags: + overridden: + FUN name:foo visibility:public modality:ABSTRACT ($this:Base, y:Y) returnType:T flags: + TYPE_PARAMETER name:Y index:0 variance: superTypes:[kotlin.Any?] + $this: VALUE_PARAMETER name: type:Derived1 flags: + VALUE_PARAMETER name:y index:0 type:Y flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='foo(Y): T' + CALL '(): T' type=T origin=GET_PROPERTY + $this: GET_VAR 'this@Derived1: Derived1' type=Derived1 origin=null + PROPERTY name:bar visibility:public modality:OPEN flags:var + FIELD PROPERTY_BACKING_FIELD name:bar type:T visibility:public flags: + EXPRESSION_BODY + GET_VAR 'value-parameter x: T' type=T origin=null + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:OPEN <> ($this:Derived1) returnType:T flags: + correspondingProperty: PROPERTY name:bar visibility:public modality:OPEN flags:var + overridden: + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT <> ($this:Base) returnType:T flags: + $this: VALUE_PARAMETER name: type:Derived1 flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='(): T' + GET_FIELD 'bar: T' type=T origin=null + receiver: GET_VAR 'this@Derived1: Derived1' type=Derived1 origin=null + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:OPEN <> ($this:Derived1, :T) returnType:kotlin.Unit flags: + correspondingProperty: PROPERTY name:bar visibility:public modality:OPEN flags:var + overridden: + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT <> ($this:Base, :T) returnType:kotlin.Unit flags: + $this: VALUE_PARAMETER name: type:Derived1 flags: + VALUE_PARAMETER name: index:0 type:T flags: + BLOCK_BODY + SET_FIELD 'bar: T' type=kotlin.Unit origin=null + receiver: GET_VAR 'this@Derived1: Derived1' type=Derived1 origin=null + value: GET_VAR 'value-parameter : T' type=T origin=null + PROPERTY name:exn visibility:public modality:OPEN flags:var + FUN name: visibility:public modality:OPEN ($this:Derived1, $receiver:Z) returnType:T flags: + correspondingProperty: PROPERTY name:exn visibility:public modality:OPEN flags:var + overridden: + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT ($this:Base, $receiver:Z) returnType:T flags: + TYPE_PARAMETER name:Z index:0 variance: superTypes:[kotlin.Any?] + $this: VALUE_PARAMETER name: type:Derived1 flags: + $receiver: VALUE_PARAMETER name: type:Z flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='() on Z: T' + CALL '(): T' type=T origin=GET_PROPERTY + $this: GET_VAR 'this@Derived1: Derived1' type=Derived1 origin=null + FUN name: visibility:public modality:OPEN ($this:Derived1, $receiver:Z, value:T) returnType:kotlin.Unit flags: + correspondingProperty: PROPERTY name:exn visibility:public modality:OPEN flags:var + overridden: + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT ($this:Base, $receiver:Z, :T) returnType:kotlin.Unit flags: + TYPE_PARAMETER name:Z index:0 variance: superTypes:[kotlin.Any?] + $this: VALUE_PARAMETER name: type:Derived1 flags: + $receiver: VALUE_PARAMETER name: type:Z flags: + VALUE_PARAMETER name:value index:0 type:T flags: + BLOCK_BODY + PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:Base) returnType:T flags: + correspondingProperty: PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:val + overridden: + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:Base) returnType:T flags: + $this: VALUE_PARAMETER name: type:Base flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: + overridden: + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags: + overridden: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: + overridden: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: diff --git a/compiler/testData/ir/irText/stubs/javaInnerClass.txt b/compiler/testData/ir/irText/stubs/javaInnerClass.txt index 3632844d6a2..20bf1c4e27a 100644 --- a/compiler/testData/ir/irText/stubs/javaInnerClass.txt +++ b/compiler/testData/ir/irText/stubs/javaInnerClass.txt @@ -19,6 +19,8 @@ FILE fqName: fileName:/javaInnerClass.kt receiver: GET_VAR 'this@Test1: Test1' type=Test1 origin=null PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL flags:var FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public flags: + overridden: + FIELD IR_EXTERNAL_DECLARATION_STUB name:x type:kotlin.Int visibility:public flags: FUN FAKE_OVERRIDE name:bar visibility:public modality:OPEN <> ($this:J) returnType:kotlin.Unit flags: overridden: FUN IR_EXTERNAL_DECLARATION_STUB name:bar visibility:public modality:OPEN <> ($this:J) returnType:kotlin.Unit flags: diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index b6f8de2ee70..e5046ecc996 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -1395,6 +1395,11 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { runTest("compiler/testData/ir/irText/stubs/builtinMap.kt"); } + @TestMetadata("genericClassInDifferentModule.kt") + public void testGenericClassInDifferentModule() throws Exception { + runTest("compiler/testData/ir/irText/stubs/genericClassInDifferentModule.kt"); + } + @TestMetadata("javaEnum.kt") public void testJavaEnum() throws Exception { runTest("compiler/testData/ir/irText/stubs/javaEnum.kt");