diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyDeclarationBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyDeclarationBase.kt index 5b1f47975e4..baec2fbccc0 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyDeclarationBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyDeclarationBase.kt @@ -6,12 +6,12 @@ package org.jetbrains.kotlin.ir.declarations.lazy import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.ir.IrElementBase import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrValueParameter +import org.jetbrains.kotlin.ir.declarations.impl.IrDeclarationBase import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator @@ -22,10 +22,10 @@ import org.jetbrains.kotlin.types.KotlinType abstract class IrLazyDeclarationBase( startOffset: Int, endOffset: Int, - override var origin: IrDeclarationOrigin, + origin: IrDeclarationOrigin, private val stubGenerator: DeclarationStubGenerator, protected val typeTranslator: TypeTranslator -) : IrElementBase(startOffset, endOffset), IrDeclaration { +) : IrDeclarationBase(startOffset, endOffset, origin) { protected fun KotlinType.toIrType() = typeTranslator.translateType(this) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt new file mode 100644 index 00000000000..c4b7834b388 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt @@ -0,0 +1,104 @@ +/* + * Copyright 2010-2019 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.ir.declarations.lazy + +import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin +import org.jetbrains.kotlin.ir.declarations.IrField +import org.jetbrains.kotlin.ir.declarations.IrProperty +import org.jetbrains.kotlin.ir.expressions.IrCall +import org.jetbrains.kotlin.ir.expressions.IrExpressionBody +import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl +import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol +import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol +import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator +import org.jetbrains.kotlin.ir.util.TypeTranslator +import org.jetbrains.kotlin.ir.visitors.IrElementTransformer +import org.jetbrains.kotlin.ir.visitors.IrElementVisitor +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal + +class IrLazyField( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + override val symbol: IrFieldSymbol, + override val name: Name, + override val visibility: Visibility, + override val isFinal: Boolean, + override val isExternal: Boolean, + override val isStatic: Boolean, + stubGenerator: DeclarationStubGenerator, + typeTranslator: TypeTranslator +) : IrLazyDeclarationBase(startOffset, endOffset, origin, stubGenerator, typeTranslator), + IrField { + + constructor( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrFieldSymbol, + stubGenerator: DeclarationStubGenerator, + typeTranslator: TypeTranslator + ) : this( + startOffset, endOffset, origin, symbol, + symbol.descriptor.name, + symbol.descriptor.visibility, + !symbol.descriptor.isVar, + symbol.descriptor.isEffectivelyExternal(), + symbol.descriptor.dispatchReceiverParameter == null, + stubGenerator, + typeTranslator + ) + + init { + symbol.bind(this) + } + + override val annotations: MutableList = mutableListOf() + + override val descriptor: PropertyDescriptor = symbol.descriptor + + override val overriddenSymbols: MutableList = mutableListOf() + + override var type: IrType by lazyVar { + descriptor.type.toIrType() + } + + override var initializer: IrExpressionBody? by lazyVar { + descriptor.compileTimeInitializer?.let { + IrExpressionBodyImpl( + typeTranslator.constantValueGenerator.generateConstantValueAsExpression(UNDEFINED_OFFSET, UNDEFINED_OFFSET, it) + ) + } + } + + @Suppress("OverridingDeprecatedMember") + override var correspondingProperty: IrProperty? + get() = correspondingPropertySymbol?.owner + set(value) { + correspondingPropertySymbol = value?.symbol + } + + override var correspondingPropertySymbol: IrPropertySymbol? by lazyVar { + stubGenerator.generatePropertyStub(descriptor).symbol + } + + override fun accept(visitor: IrElementVisitor, data: D): R { + return visitor.visitField(this, data) + } + + override fun acceptChildren(visitor: IrElementVisitor, data: D) { + initializer?.accept(visitor, data) + } + + override fun transformChildren(transformer: IrElementTransformer, data: D) { + initializer = initializer?.transform(transformer, 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 9e4415d7e85..918530f1417 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 @@ -113,13 +113,7 @@ class DeclarationStubGenerator( return symbolTable.declareField(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor.original, descriptor.type.toIrType()) { deserializer?.findDeserializedDeclaration(referenced) as? IrField - ?: IrFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, it, descriptor.type.toIrType()) - }.apply { - initializer = descriptor.compileTimeInitializer?.let { - IrExpressionBodyImpl( - constantValueGenerator.generateConstantValueAsExpression(UNDEFINED_OFFSET, UNDEFINED_OFFSET, it) - ) - } + ?: IrLazyField(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, it, this, typeTranslator) } } diff --git a/compiler/testData/codegen/bytecodeText/inlineJavaConstantFromSubclass.kt b/compiler/testData/codegen/bytecodeText/inlineJavaConstantFromSubclass.kt index cca511becd0..7511d6c1903 100644 --- a/compiler/testData/codegen/bytecodeText/inlineJavaConstantFromSubclass.kt +++ b/compiler/testData/codegen/bytecodeText/inlineJavaConstantFromSubclass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // FILE: first/JavaSuperclass.java package first;