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 10ed6e23632..63628b89322 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 @@ -21,6 +21,7 @@ interface IrField : val isFinal: Boolean val isExternal: Boolean val isStatic: Boolean + val isFakeOverride: Boolean var initializer: IrExpressionBody? 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 c4970983d71..005705aec6f 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 @@ -43,7 +43,8 @@ class IrFieldImpl( override val visibility: Visibility, override val isFinal: Boolean, override val isExternal: Boolean, - override val isStatic: Boolean + override val isStatic: Boolean, + override val isFakeOverride: Boolean ) : IrDeclarationBase(startOffset, endOffset, origin), IrField { @@ -60,7 +61,8 @@ class IrFieldImpl( symbol.descriptor.name, type, visibility, isFinal = !symbol.descriptor.isVar, isExternal = symbol.descriptor.isEffectivelyExternal(), - isStatic = symbol.descriptor.dispatchReceiverParameter == null + isStatic = symbol.descriptor.dispatchReceiverParameter == null, + isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE ) constructor( 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 index 3c0bfc4a4b8..6a8f025f59e 100644 --- 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 @@ -34,6 +34,7 @@ class IrLazyField( override val isFinal: Boolean, override val isExternal: Boolean, override val isStatic: Boolean, + override val isFakeOverride: Boolean, stubGenerator: DeclarationStubGenerator, typeTranslator: TypeTranslator ) : IrLazyDeclarationBase(startOffset, endOffset, origin, stubGenerator, typeTranslator), @@ -50,11 +51,12 @@ class IrLazyField( startOffset, endOffset, origin, symbol, symbol.descriptor.name, symbol.descriptor.visibility, - !symbol.descriptor.isVar, - symbol.descriptor.isEffectivelyExternal(), - symbol.descriptor.dispatchReceiverParameter == null, - stubGenerator, - typeTranslator + isFinal = !symbol.descriptor.isVar, + isExternal = symbol.descriptor.isEffectivelyExternal(), + isStatic = symbol.descriptor.dispatchReceiverParameter == null, + isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE, + stubGenerator = stubGenerator, + typeTranslator = typeTranslator ) init { 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 52d2a4fc423..2d60e6d091f 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 @@ -243,9 +243,10 @@ open class DeepCopyIrTreeWithSymbols( symbolRenamer.getFieldName(declaration.symbol), declaration.type.remapType(), declaration.visibility, - declaration.isFinal, - declaration.isExternal, - declaration.isStatic + isFinal = declaration.isFinal, + isExternal = declaration.isExternal, + isStatic = declaration.isStatic, + isFakeOverride = declaration.isFakeOverride ).apply { transformAnnotations(declaration) declaration.overriddenSymbols.mapTo(overriddenSymbols) { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt index b2c82c99a9b..7f105bc68c2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt @@ -431,7 +431,8 @@ class RenderIrElementVisitor : IrElementVisitor { renderFlagsList( "final".takeIf { isFinal }, "external".takeIf { isExternal }, - "static".takeIf { isStatic } + "static".takeIf { isStatic }, + "fake_override".takeIf { isFakeOverride } ) override fun visitClass(declaration: IrClass, data: Nothing?): String = diff --git a/compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.txt b/compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.txt index 2477ce75f7c..742299fb779 100644 --- a/compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.txt +++ b/compiler/testData/ir/irText/expressions/jvmInstanceFieldReference.txt @@ -7,24 +7,24 @@ FILE fqName: fileName:/Derived.kt INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Derived modality:FINAL visibility:public superTypes:[.Base]' ANONYMOUS_INITIALIZER isStatic=false BLOCK_BODY - SET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public' type=kotlin.Unit origin=EQ + SET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public [fake_override]' type=kotlin.Unit origin=EQ receiver: GET_VAR ': .Derived declared in .Derived' type=.Derived origin=null value: CONST Int type=kotlin.Int value=0 FUN name:getValue visibility:public modality:FINAL <> ($this:.Derived) returnType:kotlin.Int $this: VALUE_PARAMETER name: type:.Derived BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun getValue (): kotlin.Int declared in .Derived' - GET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public' type=kotlin.Int origin=GET_PROPERTY + GET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public [fake_override]' type=kotlin.Int origin=GET_PROPERTY receiver: GET_VAR ': .Derived declared in .Derived.getValue' type=.Derived origin=null FUN name:setValue visibility:public modality:FINAL <> ($this:.Derived, value:kotlin.Int) returnType:kotlin.Unit $this: VALUE_PARAMETER name: type:.Derived VALUE_PARAMETER name:value index:0 type:kotlin.Int BLOCK_BODY - SET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public' type=kotlin.Unit origin=EQ + SET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public [fake_override]' type=kotlin.Unit origin=EQ receiver: GET_VAR ': .Derived declared in .Derived.setValue' type=.Derived origin=null value: GET_VAR 'value: kotlin.Int declared in .Derived.setValue' type=kotlin.Int origin=null PROPERTY FAKE_OVERRIDE name:value visibility:public modality:FINAL [fake_override,var] - FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public + FIELD FAKE_OVERRIDE name:value type:kotlin.Int visibility:public [fake_override] overridden: FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:kotlin.Int visibility:public FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override] diff --git a/compiler/testData/ir/irText/expressions/kt16904.txt b/compiler/testData/ir/irText/expressions/kt16904.txt index 36d8a6d1567..9b5bf529b71 100644 --- a/compiler/testData/ir/irText/expressions/kt16904.txt +++ b/compiler/testData/ir/irText/expressions/kt16904.txt @@ -132,11 +132,11 @@ FILE fqName: fileName:/kt16904.kt INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Test2 modality:FINAL visibility:public superTypes:[.J]' ANONYMOUS_INITIALIZER isStatic=false BLOCK_BODY - SET_FIELD 'FIELD FAKE_OVERRIDE name:field type:kotlin.Int visibility:public' type=kotlin.Unit origin=EQ + SET_FIELD 'FIELD FAKE_OVERRIDE name:field type:kotlin.Int visibility:public [fake_override]' type=kotlin.Unit origin=EQ receiver: GET_VAR ': .Test2 declared in .Test2' type=.Test2 origin=null value: CONST Int type=kotlin.Int value=42 PROPERTY FAKE_OVERRIDE name:field visibility:public modality:FINAL [fake_override,var] - FIELD FAKE_OVERRIDE name:field type:kotlin.Int visibility:public + FIELD FAKE_OVERRIDE name:field type:kotlin.Int visibility:public [fake_override] overridden: FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:field type:kotlin.Int visibility:public FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override] diff --git a/compiler/testData/ir/irText/expressions/setFieldWithImplicitCast.txt b/compiler/testData/ir/irText/expressions/setFieldWithImplicitCast.txt index 08a5066fbec..df8e71c5426 100644 --- a/compiler/testData/ir/irText/expressions/setFieldWithImplicitCast.txt +++ b/compiler/testData/ir/irText/expressions/setFieldWithImplicitCast.txt @@ -14,12 +14,12 @@ FILE fqName: fileName:/Derived.kt if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=kotlin.String GET_VAR 'v: kotlin.Any declared in .Derived.setValue' type=kotlin.Any origin=null then: BLOCK type=kotlin.Unit origin=null - SET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.String? visibility:public' type=kotlin.Unit origin=EQ + SET_FIELD 'FIELD FAKE_OVERRIDE name:value type:kotlin.String? visibility:public [fake_override]' type=kotlin.Unit origin=EQ receiver: GET_VAR ': .Derived declared in .Derived.setValue' type=.Derived origin=null value: TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String GET_VAR 'v: kotlin.Any declared in .Derived.setValue' type=kotlin.Any origin=null PROPERTY FAKE_OVERRIDE name:value visibility:public modality:FINAL [fake_override,var] - FIELD FAKE_OVERRIDE name:value type:kotlin.String? visibility:public + FIELD FAKE_OVERRIDE name:value type:kotlin.String? visibility:public [fake_override] overridden: FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:kotlin.String? visibility:public FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override] diff --git a/compiler/testData/ir/irText/stubs/javaInnerClass.txt b/compiler/testData/ir/irText/stubs/javaInnerClass.txt index 0d54aa65e77..b6b36c07e8f 100644 --- a/compiler/testData/ir/irText/stubs/javaInnerClass.txt +++ b/compiler/testData/ir/irText/stubs/javaInnerClass.txt @@ -18,7 +18,7 @@ FILE fqName: fileName:/javaInnerClass.kt GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test type:.J.JInner visibility:private [final]' type=.J.JInner origin=null receiver: GET_VAR ': .Test1 declared in .Test1.' type=.Test1 origin=null PROPERTY FAKE_OVERRIDE name:x visibility:public modality:FINAL [fake_override,var] - FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public + FIELD FAKE_OVERRIDE name:x type:kotlin.Int visibility:public [fake_override] overridden: FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:x type:kotlin.Int visibility:public FUN FAKE_OVERRIDE name:bar visibility:public modality:OPEN <> ($this:.J) returnType:kotlin.Unit [fake_override] diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/ir/AbstractIrTextTestCase.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/ir/AbstractIrTextTestCase.kt index 1d7fc883d72..7f5f48e611c 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/ir/AbstractIrTextTestCase.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/ir/AbstractIrTextTestCase.kt @@ -205,6 +205,14 @@ abstract class AbstractIrTextTestCase : AbstractIrGeneratorTestCase() { } } + override fun visitField(declaration: IrField) { + visitDeclaration(declaration) + + require((declaration.origin == IrDeclarationOrigin.FAKE_OVERRIDE) == declaration.isFakeOverride) { + "${declaration.descriptor}: origin: ${declaration.origin}; isFakeOverride: ${declaration.isFakeOverride}" + } + } + override fun visitFunction(declaration: IrFunction) { visitDeclaration(declaration)