IR: remove field fake overrides

This commit is contained in:
Georgy Bronnikov
2020-06-15 14:57:17 +03:00
parent 1bb3f60bad
commit c015463926
41 changed files with 67 additions and 192 deletions
@@ -651,7 +651,6 @@ class Fir2IrDeclarationStorage(
name: Name, name: Name,
isFinal: Boolean, isFinal: Boolean,
firInitializerExpression: FirExpression?, firInitializerExpression: FirExpression?,
thisReceiverOwner: IrClass?,
type: IrType? = null type: IrType? = null
): IrField { ): IrField {
val inferredType = type ?: firInitializerExpression!!.typeRef.toIrType() val inferredType = type ?: firInitializerExpression!!.typeRef.toIrType()
@@ -664,12 +663,8 @@ class Fir2IrDeclarationStorage(
visibility, isFinal = isFinal, visibility, isFinal = isFinal,
isExternal = property.isExternal, isExternal = property.isExternal,
isStatic = property.isStatic || parent !is IrClass, isStatic = property.isStatic || parent !is IrClass,
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE
).also { ).also {
it.correspondingPropertySymbol = this@createBackingField.symbol it.correspondingPropertySymbol = this@createBackingField.symbol
if (!isFakeOverride && thisReceiverOwner != null) {
it.populateOverriddenSymbols(thisReceiverOwner)
}
}.apply { }.apply {
metadata = FirMetadataSource.Property(property) metadata = FirMetadataSource.Property(property)
convertAnnotationsFromLibrary(property) convertAnnotationsFromLibrary(property)
@@ -738,7 +733,7 @@ class Fir2IrDeclarationStorage(
backingField = createBackingField( backingField = createBackingField(
property, IrDeclarationOrigin.PROPERTY_BACKING_FIELD, descriptor, property, IrDeclarationOrigin.PROPERTY_BACKING_FIELD, descriptor,
property.fieldVisibility, property.name, property.isVal, initializer, property.fieldVisibility, property.name, property.isVal, initializer,
thisReceiverOwner, type type
).also { field -> ).also { field ->
if (initializer is FirConstExpression<*>) { if (initializer is FirConstExpression<*>) {
// TODO: Normally we shouldn't have error type here // TODO: Normally we shouldn't have error type here
@@ -749,8 +744,7 @@ class Fir2IrDeclarationStorage(
} else if (delegate != null) { } else if (delegate != null) {
backingField = createBackingField( backingField = createBackingField(
property, IrDeclarationOrigin.PROPERTY_DELEGATE, descriptor, property, IrDeclarationOrigin.PROPERTY_DELEGATE, descriptor,
property.fieldVisibility, Name.identifier("${property.name}\$delegate"), true, delegate, property.fieldVisibility, Name.identifier("${property.name}\$delegate"), true, delegate
thisReceiverOwner
) )
} }
if (irParent != null) { if (irParent != null) {
@@ -803,8 +797,7 @@ class Fir2IrDeclarationStorage(
field.name, type, field.visibility, field.name, type, field.visibility,
isFinal = field.modality == Modality.FINAL, isFinal = field.modality == Modality.FINAL,
isExternal = false, isExternal = false,
isStatic = field.isStatic, isStatic = field.isStatic
isFakeOverride = false
).apply { ).apply {
metadata = FirMetadataSource.Variable(field) metadata = FirMetadataSource.Variable(field)
descriptor.bind(this) descriptor.bind(this)
@@ -1028,13 +1021,6 @@ class Fir2IrDeclarationStorage(
} }
} }
private fun IrField.populateOverriddenSymbols(thisReceiverOwner: IrClass) {
thisReceiverOwner.findMatchingOverriddenSymbolsFromSupertypes(components.irBuiltIns, this)
.filterIsInstance<IrFieldSymbol>().singleOrNull()?.let {
overriddenSymbols = listOf(it)
}
}
private fun IrMutableAnnotationContainer.convertAnnotationsFromLibrary(firAnnotationContainer: FirAnnotationContainer) { private fun IrMutableAnnotationContainer.convertAnnotationsFromLibrary(firAnnotationContainer: FirAnnotationContainer) {
if ((firAnnotationContainer as? FirDeclaration)?.isFromLibrary == true) { if ((firAnnotationContainer as? FirDeclaration)?.isFromLibrary == true) {
annotationGenerator?.generate(this, firAnnotationContainer) annotationGenerator?.generate(this, firAnnotationContainer)
@@ -1012,6 +1012,11 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest {
runTest("compiler/testData/ir/irText/expressions/javaSyntheticPropertyAccess.kt"); runTest("compiler/testData/ir/irText/expressions/javaSyntheticPropertyAccess.kt");
} }
@TestMetadata("jvmFieldReferenceWithIntersectionTypes.kt")
public void testJvmFieldReferenceWithIntersectionTypes() throws Exception {
runTest("compiler/testData/ir/irText/expressions/jvmFieldReferenceWithIntersectionTypes.kt");
}
@TestMetadata("jvmInstanceFieldReference.kt") @TestMetadata("jvmInstanceFieldReference.kt")
public void testJvmInstanceFieldReference() throws Exception { public void testJvmInstanceFieldReference() throws Exception {
runTest("compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.kt"); runTest("compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.kt");
@@ -681,8 +681,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
Visibilities.PRIVATE, Visibilities.PRIVATE,
isFinal = !isMutable, isFinal = !isMutable,
isExternal = false, isExternal = false,
isStatic = false, isStatic = false
isFakeOverride = false
).also { ).also {
descriptor.bind(it) descriptor.bind(it)
it.parent = this it.parent = this
@@ -775,8 +775,7 @@ class LocalDeclarationsLowering(
visibility, visibility,
isFinal = true, isFinal = true,
isExternal = false, isExternal = false,
isStatic = false, isStatic = false
isFakeOverride = false
).also { ).also {
descriptor.bind(it) descriptor.bind(it)
it.parent = parent it.parent = parent
@@ -44,7 +44,7 @@ fun IrFieldBuilder.buildField(): IrField {
return IrFieldImpl( return IrFieldImpl(
startOffset, endOffset, origin, startOffset, endOffset, origin,
IrFieldSymbolImpl(wrappedDescriptor), IrFieldSymbolImpl(wrappedDescriptor),
name, type, visibility, isFinal, isExternal, isStatic, isFakeOverride name, type, visibility, isFinal, isExternal, isStatic,
).also { ).also {
it.metadata = metadata it.metadata = metadata
wrappedDescriptor.bind(it) wrappedDescriptor.bind(it)
@@ -67,8 +67,7 @@ class JsDeclarationFactory(mapping: JsMapping) : DeclarationFactory {
visibility, visibility,
isFinal = true, isFinal = true,
isExternal = false, isExternal = false,
isStatic = false, isStatic = false
isFakeOverride = false
).also { ).also {
descriptor.bind(it) descriptor.bind(it)
it.parent = parent it.parent = parent
@@ -160,8 +160,7 @@ class JsSharedVariablesManager(val builtIns: IrBuiltIns, val implicitDeclaration
Visibilities.PUBLIC, Visibilities.PUBLIC,
isFinal = false, isFinal = false,
isExternal = false, isExternal = false,
isStatic = false, isStatic = false
isFakeOverride = false
).also { ).also {
descriptor.bind(it) descriptor.bind(it)
it.parent = closureBoxClassDeclaration it.parent = closureBoxClassDeclaration
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.ir.backend.js.lower package org.jetbrains.kotlin.ir.backend.js.lower
import org.jetbrains.kotlin.backend.common.BodyLoweringPass import org.jetbrains.kotlin.backend.common.BodyLoweringPass
import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.backend.common.DeclarationTransformer import org.jetbrains.kotlin.backend.common.DeclarationTransformer
import org.jetbrains.kotlin.backend.common.getOrPut import org.jetbrains.kotlin.backend.common.getOrPut
import org.jetbrains.kotlin.backend.common.ir.copyParameterDeclarationsFrom import org.jetbrains.kotlin.backend.common.ir.copyParameterDeclarationsFrom
@@ -70,8 +69,7 @@ class EnumUsageLowering(val context: JsIrBackendContext) : BodyLoweringPass {
return entry.run { return entry.run {
IrFieldImpl( IrFieldImpl(
startOffset, endOffset, origin, symbol, name, irClass.defaultType, Visibilities.PUBLIC, startOffset, endOffset, origin, symbol, name, irClass.defaultType, Visibilities.PUBLIC,
isFinal = false, isExternal = true, isStatic = true, isFinal = false, isExternal = true, isStatic = true
isFakeOverride = entry.isFakeOverride
).also { ).also {
descriptor.bind(it) descriptor.bind(it)
it.parent = irClass it.parent = irClass
@@ -557,8 +557,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
Visibilities.PRIVATE, Visibilities.PRIVATE,
isFinal = !isMutable, isFinal = !isMutable,
isExternal = false, isExternal = false,
isStatic = false, isStatic = false
isFakeOverride = false
).also { ).also {
descriptor.bind(it) descriptor.bind(it)
it.parent = this it.parent = this
@@ -229,8 +229,6 @@ abstract class ClassCodegen protected constructor(
protected abstract fun bindFieldMetadata(field: IrField, fieldType: Type, fieldName: String) protected abstract fun bindFieldMetadata(field: IrField, fieldType: Type, fieldName: String)
private fun generateField(field: IrField) { private fun generateField(field: IrField) {
if (field.isFakeOverride) return
val fieldType = typeMapper.mapType(field) val fieldType = typeMapper.mapType(field)
val fieldSignature = val fieldSignature =
if (field.origin == IrDeclarationOrigin.PROPERTY_DELEGATE) null if (field.origin == IrDeclarationOrigin.PROPERTY_DELEGATE) null
@@ -535,9 +535,8 @@ class ExpressionCodegen(
assert(callee.constantValue() == null) { "access of const val: ${expression.dump()}" } assert(callee.constantValue() == null) { "access of const val: ${expression.dump()}" }
} }
val realField = callee val fieldType = typeMapper.mapType(callee.type)
val fieldType = typeMapper.mapType(realField.type) val fieldName = callee.name.asString()
val fieldName = realField.name.asString()
val isStatic = expression.receiver == null val isStatic = expression.receiver == null
expression.markLineNumber(startOffset = true) expression.markLineNumber(startOffset = true)
@@ -191,17 +191,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
} }
} }
private val receiverFieldFromSuper = context.ir.symbols.functionReferenceReceiverField.owner private val receiverField = context.ir.symbols.functionReferenceReceiverField.owner
val fakeOverrideReceiverField = functionReferenceClass.addField {
name = receiverFieldFromSuper.name
isFakeOverride = true
origin = IrDeclarationOrigin.FAKE_OVERRIDE
type = receiverFieldFromSuper.type
isFinal = receiverFieldFromSuper.isFinal
isStatic = receiverFieldFromSuper.isStatic
visibility = receiverFieldFromSuper.visibility
}
fun build(): IrExpression = context.createJvmIrBuilder(currentScope!!.scope.scopeOwnerSymbol).run { fun build(): IrExpression = context.createJvmIrBuilder(currentScope!!.scope.scopeOwnerSymbol).run {
irBlock(irFunctionReference.startOffset, irFunctionReference.endOffset) { irBlock(irFunctionReference.startOffset, irFunctionReference.endOffset) {
@@ -418,7 +408,9 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
// will put it into a field. // will put it into a field.
if (samSuperType == null) if (samSuperType == null)
irImplicitCast( irImplicitCast(
irGetField(irGet(dispatchReceiverParameter!!), fakeOverrideReceiverField), irGetField(irGet(dispatchReceiverParameter!!),
this@FunctionReferenceBuilder.receiverField
),
boundReceiver.second.type boundReceiver.second.type
) )
else else
@@ -299,17 +299,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
referenceClass.addOverride(getSignature) { computeSignatureString(expression) } referenceClass.addOverride(getSignature) { computeSignatureString(expression) }
} }
val receiverField = referenceClass.addField { val backingField = superClass.properties.single { it.name.asString() == "receiver" }.backingField!!
val backingFieldFromSuper = superClass.properties.single { it.name.asString() == "receiver" }.backingField!!
name = backingFieldFromSuper.name
isFakeOverride = true
origin = IrDeclarationOrigin.FAKE_OVERRIDE
type = backingFieldFromSuper.type
isFinal = backingFieldFromSuper.isFinal
isStatic = backingFieldFromSuper.isStatic
visibility = backingFieldFromSuper.visibility
}
val get = superClass.functions.find { it.name.asString() == "get" } val get = superClass.functions.find { it.name.asString() == "get" }
val set = superClass.functions.find { it.name.asString() == "set" } val set = superClass.functions.find { it.name.asString() == "set" }
val invoke = superClass.functions.find { it.name.asString() == "invoke" } val invoke = superClass.functions.find { it.name.asString() == "invoke" }
@@ -321,13 +311,13 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
call.copyTypeArgumentsFrom(expression) call.copyTypeArgumentsFrom(expression)
call.dispatchReceiver = call.symbol.owner.dispatchReceiverParameter?.let { call.dispatchReceiver = call.symbol.owner.dispatchReceiverParameter?.let {
if (expression.dispatchReceiver != null) if (expression.dispatchReceiver != null)
irImplicitCast(irGetField(irGet(arguments[0]), receiverField), it.type) irImplicitCast(irGetField(irGet(arguments[0]), backingField), it.type)
else else
irImplicitCast(irGet(arguments[index++]), it.type) irImplicitCast(irGet(arguments[index++]), it.type)
} }
call.extensionReceiver = call.symbol.owner.extensionReceiverParameter?.let { call.extensionReceiver = call.symbol.owner.extensionReceiverParameter?.let {
if (expression.extensionReceiver != null) if (expression.extensionReceiver != null)
irImplicitCast(irGetField(irGet(arguments[0]), receiverField), it.type) irImplicitCast(irGetField(irGet(arguments[0]), backingField), it.type)
else else
irImplicitCast(irGet(arguments[index++]), it.type) irImplicitCast(irGet(arguments[index++]), it.type)
} }
@@ -354,7 +344,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
field.isStatic -> field.isStatic ->
null null
expression.dispatchReceiver != null -> expression.dispatchReceiver != null ->
irImplicitCast(irGetField(irGet(arguments[0]), receiverField), field.parentAsClass.defaultType) irImplicitCast(irGetField(irGet(arguments[0]), backingField), field.parentAsClass.defaultType)
else -> else ->
irImplicitCast(irGet(arguments[1]), field.parentAsClass.defaultType) irImplicitCast(irGet(arguments[1]), field.parentAsClass.defaultType)
} }
@@ -96,9 +96,7 @@ private class FieldNameCollector : IrElementVisitorVoid {
} }
override fun visitField(declaration: IrField) { override fun visitField(declaration: IrField) {
if (!declaration.isFakeOverride) { nameToField.getOrPut(declaration.parent to declaration.name) { mutableListOf() }.add(declaration)
nameToField.getOrPut(declaration.parent to declaration.name) { mutableListOf() }.add(declaration)
}
} }
} }
@@ -113,7 +111,6 @@ private class FieldRenamer(private val newNames: Map<IrField, Name>) : IrElement
return IrFieldImpl( return IrFieldImpl(
declaration.startOffset, declaration.endOffset, declaration.origin, symbol, newName, declaration.startOffset, declaration.endOffset, declaration.origin, symbol, newName,
declaration.type, declaration.visibility, declaration.isFinal, declaration.isExternal, declaration.isStatic, declaration.type, declaration.visibility, declaration.isFinal, declaration.isExternal, declaration.isStatic,
isFakeOverride = declaration.isFakeOverride
).also { ).also {
descriptor.bind(it) descriptor.bind(it)
it.parent = declaration.parent it.parent = declaration.parent
@@ -160,10 +160,9 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
val symbol = expression.symbol val symbol = expression.symbol
val parent = val parent =
symbol.owner.accessorParent(dispatchReceiverType?.classOrNull?.owner ?: symbol.owner.parent) as IrClass symbol.owner.accessorParent(dispatchReceiverType?.classOrNull?.owner ?: symbol.owner.parent) as IrClass
val symbolToAccess = symbol.owner.findDescendantIn(parent)?.symbol ?: symbol
modifyGetterExpression( modifyGetterExpression(
expression, expression,
getterMap.getOrPut(Pair(symbolToAccess, parent)) { makeGetterAccessorSymbol(symbolToAccess, parent) } getterMap.getOrPut(Pair(symbol, parent)) { makeGetterAccessorSymbol(symbol, parent) }
) )
} else { } else {
expression expression
@@ -178,10 +177,9 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
val symbol = expression.symbol val symbol = expression.symbol
val parent = val parent =
symbol.owner.accessorParent(dispatchReceiverType?.classOrNull?.owner ?: symbol.owner.parent) as IrClass symbol.owner.accessorParent(dispatchReceiverType?.classOrNull?.owner ?: symbol.owner.parent) as IrClass
val symbolToAccess = symbol.owner.findDescendantIn(parent)?.symbol ?: symbol
modifySetterExpression( modifySetterExpression(
expression, expression,
setterMap.getOrPut(Pair(symbolToAccess, parent)) { makeSetterAccessorSymbol(symbolToAccess, parent) } setterMap.getOrPut(Pair(symbol, parent)) { makeSetterAccessorSymbol(symbol, parent) }
) )
} else { } else {
expression expression
@@ -189,11 +187,6 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
) )
} }
private fun IrField.findDescendantIn(derivedClass: IrClass): IrField? =
derivedClass.fields.singleOrNull { candidate ->
candidate.name == this.name && candidate.overrides(this)
}
override fun visitConstructor(declaration: IrConstructor): IrStatement { override fun visitConstructor(declaration: IrConstructor): IrStatement {
if (declaration.isOrShouldBeHidden) { if (declaration.isOrShouldBeHidden) {
pendingAccessorsToAdd.add(handleHiddenConstructor(declaration)) pendingAccessorsToAdd.add(handleHiddenConstructor(declaration))
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.util.declareFieldWithOverrides
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
@@ -16,7 +16,6 @@ class IrFieldBuilder : IrDeclarationBuilder() {
var isFinal: Boolean = false var isFinal: Boolean = false
var isExternal: Boolean = false var isExternal: Boolean = false
var isStatic: Boolean = false var isStatic: Boolean = false
var isFakeOverride: Boolean = false
var metadata: MetadataSource? = null var metadata: MetadataSource? = null
fun updateFrom(from: IrField) { fun updateFrom(from: IrField) {
@@ -26,7 +25,6 @@ class IrFieldBuilder : IrDeclarationBuilder() {
isFinal = from.isFinal isFinal = from.isFinal
isExternal = from.isExternal isExternal = from.isExternal
isStatic = from.isStatic isStatic = from.isStatic
isFakeOverride = from.isFakeOverride
metadata = from.metadata metadata = from.metadata
} }
} }
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
interface IrField : interface IrField :
IrSymbolDeclaration<IrFieldSymbol>, IrOverridableDeclaration<IrFieldSymbol>, IrSymbolDeclaration<IrFieldSymbol>,
IrDeclarationWithName, IrDeclarationWithVisibility, IrDeclarationParent { IrDeclarationWithName, IrDeclarationWithVisibility, IrDeclarationParent {
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
@@ -23,7 +23,6 @@ interface IrField :
val isFinal: Boolean val isFinal: Boolean
val isExternal: Boolean val isExternal: Boolean
val isStatic: Boolean val isStatic: Boolean
val isFakeOverride: Boolean
var initializer: IrExpressionBody? var initializer: IrExpressionBody?
@@ -42,8 +42,7 @@ class IrFieldImpl(
override val visibility: Visibility, override val visibility: Visibility,
override val isFinal: Boolean, override val isFinal: Boolean,
override val isExternal: Boolean, override val isExternal: Boolean,
override val isStatic: Boolean, override val isStatic: Boolean
override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE
) : IrDeclarationBase<FieldCarrier>(startOffset, endOffset, origin), ) : IrDeclarationBase<FieldCarrier>(startOffset, endOffset, origin),
IrField, IrField,
FieldCarrier { FieldCarrier {
@@ -96,16 +95,6 @@ class IrFieldImpl(
} }
} }
override var overridenSymbolsField: List<IrFieldSymbol> = emptyList()
override var overriddenSymbols: List<IrFieldSymbol>
get() = getCarrier().overridenSymbolsField
set(v) {
if (overriddenSymbols !== v) {
setCarrier().overridenSymbolsField = v
}
}
override var metadataField: MetadataSource? = null override var metadataField: MetadataSource? = null
override var metadata: MetadataSource? override var metadata: MetadataSource?
@@ -10,14 +10,12 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.MetadataSource import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
interface FieldCarrier : DeclarationCarrier<FieldCarrier> { interface FieldCarrier : DeclarationCarrier<FieldCarrier> {
var initializerField: IrExpressionBody? var initializerField: IrExpressionBody?
var correspondingPropertySymbolField: IrPropertySymbol? var correspondingPropertySymbolField: IrPropertySymbol?
var metadataField: MetadataSource? var metadataField: MetadataSource?
var overridenSymbolsField: List<IrFieldSymbol>
override fun clone(): FieldCarrier { override fun clone(): FieldCarrier {
return FieldCarrierImpl( return FieldCarrierImpl(
@@ -27,8 +25,7 @@ interface FieldCarrier : DeclarationCarrier<FieldCarrier> {
annotationsField, annotationsField,
initializerField, initializerField,
correspondingPropertySymbolField, correspondingPropertySymbolField,
metadataField, metadataField
overridenSymbolsField
) )
} }
} }
@@ -40,6 +37,5 @@ class FieldCarrierImpl(
override var annotationsField: List<IrConstructorCall>, override var annotationsField: List<IrConstructorCall>,
override var initializerField: IrExpressionBody?, override var initializerField: IrExpressionBody?,
override var correspondingPropertySymbolField: IrPropertySymbol?, override var correspondingPropertySymbolField: IrPropertySymbol?,
override var metadataField: MetadataSource?, override var metadataField: MetadataSource?
override var overridenSymbolsField: List<IrFieldSymbol>
): FieldCarrier ): FieldCarrier
@@ -35,7 +35,6 @@ class IrLazyField(
override val isFinal: Boolean, override val isFinal: Boolean,
override val isExternal: Boolean, override val isExternal: Boolean,
override val isStatic: Boolean, override val isStatic: Boolean,
override val isFakeOverride: Boolean,
stubGenerator: DeclarationStubGenerator, stubGenerator: DeclarationStubGenerator,
typeTranslator: TypeTranslator typeTranslator: TypeTranslator
) : IrLazyDeclarationBase(startOffset, endOffset, origin, stubGenerator, typeTranslator), ) : IrLazyDeclarationBase(startOffset, endOffset, origin, stubGenerator, typeTranslator),
@@ -51,12 +50,6 @@ class IrLazyField(
?: mutableListOf() ?: mutableListOf()
} }
override var overriddenSymbols: List<IrFieldSymbol> by lazyVar {
symbol.descriptor.overriddenDescriptors.map {
stubGenerator.generateFieldStub(it.original).symbol
}.toMutableList()
}
override var type: IrType by lazyVar { override var type: IrType by lazyVar {
descriptor.type.toIrType() descriptor.type.toIrType()
} }
@@ -991,8 +991,7 @@ open class WrappedFieldDescriptor(
override fun hasSynthesizedParameterNames() = false override fun hasSynthesizedParameterNames() = false
override fun getOverriddenDescriptors(): MutableCollection<out PropertyDescriptor> = override fun getOverriddenDescriptors(): MutableCollection<out PropertyDescriptor> = mutableListOf()
owner.overriddenSymbols.map { it.descriptor }.toMutableList()
override fun copy( override fun copy(
newOwner: DeclarationDescriptor?, newOwner: DeclarationDescriptor?,
@@ -78,18 +78,6 @@ fun IrSimpleFunction.overrides(other: IrSimpleFunction): Boolean {
return false return false
} }
fun IrField.overrides(other: IrField): Boolean {
if (this == other) return true
this.overriddenSymbols.forEach {
if (it.owner.overrides(other)) {
return true
}
}
return false
}
private val IrConstructorCall.annotationClass private val IrConstructorCall.annotationClass
get() = this.symbol.owner.constructedClass get() = this.symbol.owner.constructedClass
@@ -173,20 +173,14 @@ class DeclarationStubGenerator(
return referenced.owner return referenced.owner
} }
val origin = return symbolTable.declareField(UNDEFINED_OFFSET, UNDEFINED_OFFSET, computeOrigin(descriptor), descriptor.original, descriptor.type.toIrType()) {
if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE)
IrDeclarationOrigin.FAKE_OVERRIDE
else computeOrigin(descriptor)
return symbolTable.declareField(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor.original, descriptor.type.toIrType()) {
IrLazyField( IrLazyField(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, UNDEFINED_OFFSET, UNDEFINED_OFFSET, computeOrigin(descriptor),
it, descriptor, it, descriptor,
descriptor.name, descriptor.visibility, descriptor.name, descriptor.visibility,
isFinal = !descriptor.isVar, isFinal = !descriptor.isVar,
isExternal = descriptor.isEffectivelyExternal(), isExternal = descriptor.isEffectivelyExternal(),
isStatic = (descriptor.dispatchReceiverParameter == null), isStatic = (descriptor.dispatchReceiverParameter == null),
isFakeOverride = (origin == IrDeclarationOrigin.FAKE_OVERRIDE),
stubGenerator = this, typeTranslator = typeTranslator stubGenerator = this, typeTranslator = typeTranslator
) )
} }
@@ -245,12 +245,8 @@ open class DeepCopyIrTreeWithSymbols(
isFinal = declaration.isFinal, isFinal = declaration.isFinal,
isExternal = declaration.isExternal, isExternal = declaration.isExternal,
isStatic = declaration.isStatic, isStatic = declaration.isStatic,
isFakeOverride = declaration.isFakeOverride
).apply { ).apply {
transformAnnotations(declaration) transformAnnotations(declaration)
overriddenSymbols = declaration.overriddenSymbols.map {
symbolRemapper.getReferencedField(it)
}
initializer = declaration.initializer?.transform() initializer = declaration.initializer?.transform()
} }
@@ -145,9 +145,6 @@ class DumpIrTreeVisitor(
override fun visitField(declaration: IrField, data: String) { override fun visitField(declaration: IrField, data: String) {
declaration.dumpLabeledElementWith(data) { declaration.dumpLabeledElementWith(data) {
dumpAnnotations(declaration) dumpAnnotations(declaration)
declaration.overriddenSymbols.dumpItems("overridden") {
it.dump()
}
declaration.initializer?.accept(this, "") declaration.initializer?.accept(this, "")
} }
} }
@@ -15,7 +15,6 @@ val IrDeclaration.isFakeOverride: Boolean
get() = when (this) { get() = when (this) {
is IrSimpleFunction -> isFakeOverride is IrSimpleFunction -> isFakeOverride
is IrProperty -> isFakeOverride is IrProperty -> isFakeOverride
is IrField -> isFakeOverride
else -> false else -> false
} }
@@ -31,15 +30,6 @@ val IrFunction.target: IrFunction get() = when (this) {
else -> error(this) else -> error(this)
} }
fun IrField.resolveFakeOverride(): IrField? {
var toVisit = setOf(this)
val nonOverridden = mutableSetOf<IrField>()
while (toVisit.isNotEmpty()) {
nonOverridden += toVisit.filter { it.overriddenSymbols.isEmpty() }
toVisit = toVisit.flatMap { it.overriddenSymbols }.map { it.owner }.toSet()
}
return nonOverridden.singleOrNull()
}
fun IrSimpleFunction.collectRealOverrides(toSkip: (IrSimpleFunction) -> Boolean = { false }): Set<IrSimpleFunction> { fun IrSimpleFunction.collectRealOverrides(toSkip: (IrSimpleFunction) -> Boolean = { false }): Set<IrSimpleFunction> {
if (isReal && !toSkip(this)) return setOf(this) if (isReal && !toSkip(this)) return setOf(this)
@@ -445,7 +445,6 @@ class RenderIrElementVisitor(private val normalizeNames: Boolean = false) : IrEl
"final".takeIf { isFinal }, "final".takeIf { isFinal },
"external".takeIf { isExternal }, "external".takeIf { isExternal },
"static".takeIf { isStatic }, "static".takeIf { isStatic },
"fake_override".takeIf { isFakeOverride }
) )
override fun visitClass(declaration: IrClass, data: Nothing?): String = override fun visitClass(declaration: IrClass, data: Nothing?): String =
@@ -45,29 +45,3 @@ fun generateOverriddenFunctionSymbols(
symbolTable.referenceSimpleFunction(it.original) symbolTable.referenceSimpleFunction(it.original)
} }
} }
@ObsoleteDescriptorBasedAPI
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)
}
@ObsoleteDescriptorBasedAPI
fun generateOverriddenFieldSymbols(
declaration: IrField,
symbolTable: SymbolTable,
hasBackingField: (PropertyDescriptor) -> Boolean
) {
declaration.overriddenSymbols = declaration.descriptor.overriddenDescriptors.mapNotNull {
if (hasBackingField(it)) {
symbolTable.referenceField(it.original)
} else null
}
}
@@ -1234,7 +1234,6 @@ abstract class IrFileDeserializer(val logger: LoggingContext, val builtIns: IrBu
flags.isFinal, flags.isFinal,
flags.isExternal, flags.isExternal,
flags.isStatic, flags.isStatic,
flags.isFakeOverride
) )
}.usingParent { }.usingParent {
if (proto.hasInitializer()) if (proto.hasInitializer())
@@ -69,15 +69,13 @@ public class IrFlags extends Flags {
ProtoBuf.Visibility visibility, ProtoBuf.Visibility visibility,
boolean isFinal, boolean isFinal,
boolean isExternal, boolean isExternal,
boolean isStatic, boolean isStatic
boolean isFakeOverride
) { ) {
return HAS_ANNOTATIONS.toFlags(hasAnnotations) return HAS_ANNOTATIONS.toFlags(hasAnnotations)
| VISIBILITY.toFlags(visibility) | VISIBILITY.toFlags(visibility)
| IS_FINAL.toFlags(isFinal) | IS_FINAL.toFlags(isFinal)
| IS_EXTERNAL_FIELD.toFlags(isExternal) | IS_EXTERNAL_FIELD.toFlags(isExternal)
| IS_STATIC.toFlags(isStatic) | IS_STATIC.toFlags(isStatic)
| IS_FAKE_OVERRIDE.toFlags(isFakeOverride)
; ;
} }
@@ -191,13 +191,12 @@ inline class FieldFlags(val flags: Long) {
val isFinal: Boolean get() = IrFlags.IS_FINAL.get(flags.toInt()) val isFinal: Boolean get() = IrFlags.IS_FINAL.get(flags.toInt())
val isExternal: Boolean get() = IrFlags.IS_EXTERNAL_FIELD.get(flags.toInt()) val isExternal: Boolean get() = IrFlags.IS_EXTERNAL_FIELD.get(flags.toInt())
val isStatic: Boolean get() = IrFlags.IS_STATIC.get(flags.toInt()) val isStatic: Boolean get() = IrFlags.IS_STATIC.get(flags.toInt())
val isFakeOverride: Boolean get() = IrFlags.IS_FAKE_OVERRIDE.get(flags.toInt())
companion object { companion object {
fun encode(field: IrField): Long { fun encode(field: IrField): Long {
return field.run { return field.run {
val visibility = ProtoEnumFlags.visibility(visibility) val visibility = ProtoEnumFlags.visibility(visibility)
IrFlags.getFieldFlags(annotations.isNotEmpty(), visibility, isFinal, isExternal, isStatic, isFakeOverride).toLong() IrFlags.getFieldFlags(annotations.isNotEmpty(), visibility, isFinal, isExternal, isStatic).toLong()
} }
} }
@@ -1,5 +1,4 @@
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// IGNORE_BACKEND_FIR: JVM_IR
// FILE: ProtectedField.java // FILE: ProtectedField.java
public abstract class ProtectedField { public abstract class ProtectedField {
@@ -1,5 +1,4 @@
// !LANGUAGE: -ProhibitProtectedCallFromInline // !LANGUAGE: -ProhibitProtectedCallFromInline
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// FILE: JavaClass.java // FILE: JavaClass.java
@@ -7,20 +7,20 @@ FILE fqName:<root> fileName:/Derived.kt
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Derived modality:FINAL visibility:public superTypes:[<root>.Base]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Derived modality:FINAL visibility:public superTypes:[<root>.Base]'
ANONYMOUS_INITIALIZER isStatic=false ANONYMOUS_INITIALIZER isStatic=false
BLOCK_BODY BLOCK_BODY
SET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public [fake_override]' type=kotlin.Unit origin=EQ SET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:kotlin.Int visibility:public' type=kotlin.Unit origin=EQ
receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived' type=<root>.Derived origin=null receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived' type=<root>.Derived origin=null
value: CONST Int type=kotlin.Int value=0 value: CONST Int type=kotlin.Int value=0
FUN name:getValue visibility:public modality:FINAL <> ($this:<root>.Derived) returnType:kotlin.Int FUN name:getValue visibility:public modality:FINAL <> ($this:<root>.Derived) returnType:kotlin.Int
$this: VALUE_PARAMETER name:<this> type:<root>.Derived $this: VALUE_PARAMETER name:<this> type:<root>.Derived
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun getValue (): kotlin.Int declared in <root>.Derived' RETURN type=kotlin.Nothing from='public final fun getValue (): kotlin.Int declared in <root>.Derived'
GET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public [fake_override]' type=kotlin.Int origin=GET_PROPERTY GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:kotlin.Int visibility:public' type=kotlin.Int origin=GET_PROPERTY
receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.getValue' type=<root>.Derived origin=null receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.getValue' type=<root>.Derived origin=null
FUN name:setValue visibility:public modality:FINAL <> ($this:<root>.Derived, value:kotlin.Int) returnType:kotlin.Unit FUN name:setValue visibility:public modality:FINAL <> ($this:<root>.Derived, value:kotlin.Int) returnType:kotlin.Unit
$this: VALUE_PARAMETER name:<this> type:<root>.Derived $this: VALUE_PARAMETER name:<this> type:<root>.Derived
VALUE_PARAMETER name:value index:0 type:kotlin.Int VALUE_PARAMETER name:value index:0 type:kotlin.Int
BLOCK_BODY BLOCK_BODY
SET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public [fake_override]' type=kotlin.Unit origin=EQ SET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:kotlin.Int visibility:public' type=kotlin.Unit origin=EQ
receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.setValue' type=<root>.Derived origin=null receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.setValue' type=<root>.Derived origin=null
value: GET_VAR 'value: kotlin.Int declared in <root>.Derived.setValue' type=kotlin.Int origin=null value: GET_VAR 'value: kotlin.Int declared in <root>.Derived.setValue' type=kotlin.Int origin=null
PROPERTY FAKE_OVERRIDE name:value visibility:public modality:FINAL [fake_override,var] PROPERTY FAKE_OVERRIDE name:value visibility:public modality:FINAL [fake_override,var]
+1 -1
View File
@@ -132,7 +132,7 @@ FILE fqName:<root> fileName:/kt16904.kt
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Test2 modality:FINAL visibility:public superTypes:[<root>.J]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Test2 modality:FINAL visibility:public superTypes:[<root>.J]'
ANONYMOUS_INITIALIZER isStatic=false ANONYMOUS_INITIALIZER isStatic=false
BLOCK_BODY BLOCK_BODY
SET_FIELD 'FIELD FAKE_OVERRIDE name:field type:kotlin.Int visibility:public [fake_override]' type=kotlin.Unit origin=EQ SET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:field type:kotlin.Int visibility:public' type=kotlin.Unit origin=EQ
receiver: GET_VAR '<this>: <root>.Test2 declared in <root>.Test2' type=<root>.Test2 origin=null receiver: GET_VAR '<this>: <root>.Test2 declared in <root>.Test2' type=<root>.Test2 origin=null
value: CONST Int type=kotlin.Int value=42 value: CONST Int type=kotlin.Int value=42
PROPERTY FAKE_OVERRIDE name:field visibility:public modality:FINAL [fake_override,var] PROPERTY FAKE_OVERRIDE name:field visibility:public modality:FINAL [fake_override,var]
@@ -14,7 +14,7 @@ FILE fqName:<root> fileName:/Derived.kt
if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=kotlin.String if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=kotlin.String
GET_VAR 'v: kotlin.Any declared in <root>.Derived.setValue' type=kotlin.Any origin=null GET_VAR 'v: kotlin.Any declared in <root>.Derived.setValue' type=kotlin.Any origin=null
then: BLOCK type=kotlin.Unit origin=null then: BLOCK type=kotlin.Unit origin=null
SET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.String? visibility:public [fake_override]' type=kotlin.Unit origin=EQ SET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:kotlin.String? visibility:public' type=kotlin.Unit origin=EQ
receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.setValue' type=<root>.Derived origin=null receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.setValue' type=<root>.Derived origin=null
value: TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String value: TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String
GET_VAR 'v: kotlin.Any declared in <root>.Derived.setValue' type=kotlin.Any origin=null GET_VAR 'v: kotlin.Any declared in <root>.Derived.setValue' type=kotlin.Any origin=null
@@ -210,14 +210,6 @@ abstract class AbstractIrTextTestCase : AbstractIrGeneratorTestCase() {
} }
} }
override fun visitField(declaration: IrField) {
visitDeclaration(declaration)
require((declaration.origin == IrDeclarationOrigin.FAKE_OVERRIDE) == declaration.isFakeOverride) {
"${declaration.render()}: origin: ${declaration.origin}; isFakeOverride: ${declaration.isFakeOverride}"
}
}
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
override fun visitFunction(declaration: IrFunction) { override fun visitFunction(declaration: IrFunction) {
visitDeclaration(declaration) visitDeclaration(declaration)
@@ -199,6 +199,16 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
runTest("compiler/testData/codegen/bytecodeText/javaExtensionPropertyIntrinsic.kt"); runTest("compiler/testData/codegen/bytecodeText/javaExtensionPropertyIntrinsic.kt");
} }
@TestMetadata("javaFields.kt")
public void testJavaFields() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/javaFields.kt");
}
@TestMetadata("javaFieldsWithIntersectionTypes.kt")
public void testJavaFieldsWithIntersectionTypes() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/javaFieldsWithIntersectionTypes.kt");
}
@TestMetadata("javaStatics.kt") @TestMetadata("javaStatics.kt")
public void testJavaStatics() throws Exception { public void testJavaStatics() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/javaStatics.kt"); runTest("compiler/testData/codegen/bytecodeText/javaStatics.kt");
@@ -199,6 +199,16 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest {
runTest("compiler/testData/codegen/bytecodeText/javaExtensionPropertyIntrinsic.kt"); runTest("compiler/testData/codegen/bytecodeText/javaExtensionPropertyIntrinsic.kt");
} }
@TestMetadata("javaFields.kt")
public void testJavaFields() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/javaFields.kt");
}
@TestMetadata("javaFieldsWithIntersectionTypes.kt")
public void testJavaFieldsWithIntersectionTypes() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/javaFieldsWithIntersectionTypes.kt");
}
@TestMetadata("javaStatics.kt") @TestMetadata("javaStatics.kt")
public void testJavaStatics() throws Exception { public void testJavaStatics() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/javaStatics.kt"); runTest("compiler/testData/codegen/bytecodeText/javaStatics.kt");
@@ -1011,6 +1011,11 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
runTest("compiler/testData/ir/irText/expressions/javaSyntheticPropertyAccess.kt"); runTest("compiler/testData/ir/irText/expressions/javaSyntheticPropertyAccess.kt");
} }
@TestMetadata("jvmFieldReferenceWithIntersectionTypes.kt")
public void testJvmFieldReferenceWithIntersectionTypes() throws Exception {
runTest("compiler/testData/ir/irText/expressions/jvmFieldReferenceWithIntersectionTypes.kt");
}
@TestMetadata("jvmInstanceFieldReference.kt") @TestMetadata("jvmInstanceFieldReference.kt")
public void testJvmInstanceFieldReference() throws Exception { public void testJvmInstanceFieldReference() throws Exception {
runTest("compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.kt"); runTest("compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.kt");