diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/JvmFir2IrExtensions.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/JvmFir2IrExtensions.kt index 000531fd155..74f3867431d 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/JvmFir2IrExtensions.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/JvmFir2IrExtensions.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrConversionScope import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions import org.jetbrains.kotlin.fir.backend.InjectedValue +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.ir.IrBuiltIns @@ -103,6 +104,5 @@ class JvmFir2IrExtensions( ) override fun hasBackingField(property: FirProperty, session: FirSession): Boolean = - // NOTE maybe there might be platform-specific logic, similar to JvmGeneratorExtensionsImpl.isPropertyWithPlatformField() - Fir2IrExtensions.Default.hasBackingField(property, session) + property.origin is FirDeclarationOrigin.Java || Fir2IrExtensions.Default.hasBackingField(property, session) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 9bc0d1e5e8d..33a241ea5af 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -634,14 +634,12 @@ class Fir2IrDeclarationStorage( return createFakeOverridePropertySymbols(property, fakeOverrideOwnerLookupTag) } + val isJavaOrigin = property.origin is FirDeclarationOrigin.Java val propertySymbol = IrPropertySymbolImpl() - val getterSymbol = createFunctionSymbol(signature = null) + val getterSymbol = runIf(!isJavaOrigin) { createFunctionSymbol(signature = null) } + val setterSymbol = runIf(!isJavaOrigin && property.isVar) { createFunctionSymbol(signature = null) } - val setterSymbol = runIf(property.isVar) { - createFunctionSymbol(signature = null) - } - - val backingFieldSymbol = runIf(property.delegate != null || property.hasBackingField) { + val backingFieldSymbol = runIf(property.delegate != null || extensions.hasBackingField(property, session)) { createFieldSymbol() } @@ -660,7 +658,9 @@ class Fir2IrDeclarationStorage( val containingClassSymbol = findContainingIrClassSymbol(property, fakeOverrideOwnerLookupTag) val propertySymbol = IrPropertyFakeOverrideSymbol(originalSymbols.propertySymbol, containingClassSymbol, idSignature = null) - val getterSymbol = IrFunctionFakeOverrideSymbol(originalSymbols.getterSymbol, containingClassSymbol, idSignature = null) + val getterSymbol = originalSymbols.getterSymbol?.let { + IrFunctionFakeOverrideSymbol(it, containingClassSymbol, idSignature = null) + } val setterSymbol = runIf(property.isVar) { val setterIsVisible = property.setter?.let { setter -> @@ -683,7 +683,7 @@ class Fir2IrDeclarationStorage( backingFieldForPropertyCache[irPropertySymbol] = it propertyForBackingFieldCache[it] = irPropertySymbol } - symbols.getterSymbol.let { + symbols.getterSymbol?.let { getterForPropertyCache[irPropertySymbol] = it } symbols.setterSymbol?.let { @@ -1597,7 +1597,7 @@ internal fun IrBindableSymbol<*, D>.ownerIfBound(): D? { data class PropertySymbols( val propertySymbol: IrPropertySymbol, - val getterSymbol: IrSimpleFunctionSymbol, + val getterSymbol: IrSimpleFunctionSymbol?, val setterSymbol: IrSimpleFunctionSymbol?, val backingFieldSymbol: IrFieldSymbol?, ) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt index fe5b55526b4..32a1bad982a 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt @@ -315,26 +315,28 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi if (irParent != null) { backingField?.parent = irParent } - this.getter = getter.convertWithOffsets(startOffset, endOffset) { startOffset, endOffset -> - createIrPropertyAccessor( - getter, property, this, symbols.getterSymbol, type, irParent, false, - when { - origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin - origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER -> origin - delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR - origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin - origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin - getter == null || getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR - else -> origin - }, - startOffset, endOffset, - property.unwrapFakeOverrides().getter, - ) + this.getter = symbols.getterSymbol?.let { getterSymbol -> + getter.convertWithOffsets(startOffset, endOffset) { startOffset, endOffset -> + createIrPropertyAccessor( + getter, property, this, getterSymbol, type, irParent, false, + when { + origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin + origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER -> origin + delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR + origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin + origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin + getter == null || getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR + else -> origin + }, + startOffset, endOffset, + property.unwrapFakeOverrides().getter, + ) + } } - if (property.isVar) { + if (property.isVar && symbols.setterSymbol != null) { this.setter = setter.convertWithOffsets(startOffset, endOffset) { startOffset, endOffset -> createIrPropertyAccessor( - setter, property, this, symbols.setterSymbol!!, type, irParent, true, + setter, property, this, symbols.setterSymbol, type, irParent, true, when { delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt index d96835cdcc7..5a49f3cc392 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt @@ -129,6 +129,7 @@ class Fir2IrLazyProperty( } override var backingField: IrField? = when { + symbols.backingFieldSymbol == null -> null fir.hasExplicitBackingField -> { val backingFieldType = with(typeConverter) { fir.backingField?.returnTypeRef?.toIrType() @@ -139,7 +140,7 @@ class Fir2IrLazyProperty( this@Fir2IrLazyProperty, fir, IrDeclarationOrigin.PROPERTY_BACKING_FIELD, - symbols.backingFieldSymbol!!, + symbols.backingFieldSymbol, components.visibilityConverter.convertToDescriptorVisibility(visibility), fir.name, fir.isVal, @@ -149,12 +150,24 @@ class Fir2IrLazyProperty( field.initializer = toIrInitializer(initializer) } } - extensions.hasBackingField(fir, session) && origin != IrDeclarationOrigin.FAKE_OVERRIDE -> { + fir.delegate != null -> { + callablesGenerator.createBackingField( + this@Fir2IrLazyProperty, + fir, + IrDeclarationOrigin.PROPERTY_DELEGATE, + symbols.backingFieldSymbol, + components.visibilityConverter.convertToDescriptorVisibility(fir.visibility), + NameUtils.propertyDelegateName(fir.name), + true, + fir.delegate + ) + } + origin != IrDeclarationOrigin.FAKE_OVERRIDE -> { callablesGenerator.createBackingField( this@Fir2IrLazyProperty, fir, IrDeclarationOrigin.PROPERTY_BACKING_FIELD, - symbols.backingFieldSymbol!!, + symbols.backingFieldSymbol, components.visibilityConverter.convertToDescriptorVisibility(fir.visibility), fir.name, fir.isVal, @@ -164,21 +177,7 @@ class Fir2IrLazyProperty( field.initializer = toIrInitializer(fir.initializer) } } - fir.delegate != null -> { - callablesGenerator.createBackingField( - this@Fir2IrLazyProperty, - fir, - IrDeclarationOrigin.PROPERTY_DELEGATE, - symbols.backingFieldSymbol!!, - components.visibilityConverter.convertToDescriptorVisibility(fir.visibility), - NameUtils.propertyDelegateName(fir.name), - true, - fir.delegate - ) - } - else -> { - null - } + else -> null }?.apply { this.parent = this@Fir2IrLazyProperty.parent this.annotations = fir.backingField?.annotations?.mapNotNull { @@ -186,30 +185,32 @@ class Fir2IrLazyProperty( }.orEmpty() } - override var getter: IrSimpleFunction? = Fir2IrLazyPropertyAccessor( - components, startOffset, endOffset, - origin = when { - origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin - fir.delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR - origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin - origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin - fir.getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR - else -> origin - }, - firAccessor = fir.getter, - isSetter = false, - firParentProperty = fir, - firParentClass = containingClass, - symbol = symbols.getterSymbol, - parent = this@Fir2IrLazyProperty.parent, - isFakeOverride = isFakeOverride, - correspondingPropertySymbol = this.symbol - ).apply { - classifiersGenerator.setTypeParameters(this, this@Fir2IrLazyProperty.fir, ConversionTypeOrigin.DEFAULT) + override var getter: IrSimpleFunction? = symbols.getterSymbol?.let { + Fir2IrLazyPropertyAccessor( + components, startOffset, endOffset, + origin = when { + origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin + fir.delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR + origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin + origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin + fir.getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR + else -> origin + }, + firAccessor = fir.getter, + isSetter = false, + firParentProperty = fir, + firParentClass = containingClass, + symbol = it, + parent = this@Fir2IrLazyProperty.parent, + isFakeOverride = isFakeOverride, + correspondingPropertySymbol = this.symbol + ).apply { + classifiersGenerator.setTypeParameters(this, this@Fir2IrLazyProperty.fir, ConversionTypeOrigin.DEFAULT) + } } override var setter: IrSimpleFunction? = run { - if (!fir.isVar) return@run null + if (!fir.isVar || symbols.setterSymbol == null) return@run null Fir2IrLazyPropertyAccessor( components, startOffset, endOffset, origin = when { @@ -223,7 +224,7 @@ class Fir2IrLazyProperty( firAccessor = fir.setter, isSetter = true, firParentProperty = fir, firParentClass = containingClass, - symbol = symbols.setterSymbol!!, + symbol = symbols.setterSymbol, parent = this@Fir2IrLazyProperty.parent, isFakeOverride = isFakeOverride, correspondingPropertySymbol = this.symbol diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java index efed6fb8356..c41921b280d 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java @@ -3964,6 +3964,12 @@ public class FirLightTreeJvmIrTextTestGenerated extends AbstractFirLightTreeJvmI runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt"); } + @Test + @TestMetadata("FieldsFromJavaClass.kt") + public void testFieldsFromJavaClass() { + runTest("compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt"); + } + @Test @TestMetadata("Fir2IrClassifierStorage.kt") public void testFir2IrClassifierStorage() { @@ -4078,12 +4084,6 @@ public class FirLightTreeJvmIrTextTestGenerated extends AbstractFirLightTreeJvmI runTest("compiler/testData/ir/irText/firProblems/LocalSuspendFun.kt"); } - @Test - @TestMetadata("MissingFieldInJavaClass.kt") - public void testMissingFieldInJavaClass() { - runTest("compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt"); - } - @Test @TestMetadata("Modality.kt") public void testModality() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java index 591e4f5ee36..ee6c566561c 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java @@ -3964,6 +3964,12 @@ public class FirPsiJvmIrTextTestGenerated extends AbstractFirPsiJvmIrTextTest { runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt"); } + @Test + @TestMetadata("FieldsFromJavaClass.kt") + public void testFieldsFromJavaClass() { + runTest("compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt"); + } + @Test @TestMetadata("Fir2IrClassifierStorage.kt") public void testFir2IrClassifierStorage() { @@ -4078,12 +4084,6 @@ public class FirPsiJvmIrTextTestGenerated extends AbstractFirPsiJvmIrTextTest { runTest("compiler/testData/ir/irText/firProblems/LocalSuspendFun.kt"); } - @Test - @TestMetadata("MissingFieldInJavaClass.kt") - public void testMissingFieldInJavaClass() { - runTest("compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt"); - } - @Test @TestMetadata("Modality.kt") public void testModality() { diff --git a/compiler/testData/codegen/box/fir/callableReferenceToJavaField.fir.ir.txt b/compiler/testData/codegen/box/fir/callableReferenceToJavaField.fir.ir.txt index 9f0ae3adb43..5887135f3db 100644 --- a/compiler/testData/codegen/box/fir/callableReferenceToJavaField.fir.ir.txt +++ b/compiler/testData/codegen/box/fir/callableReferenceToJavaField.fir.ir.txt @@ -67,7 +67,7 @@ FILE fqName:foo fileName:/main.kt $this: CALL 'public final fun CHECK_NOT_NULL (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): {T0 of kotlin.internal.ir.CHECK_NOT_NULL & Any} declared in kotlin.internal.ir' type=java.lang.reflect.Field origin=EXCLEXCL : java.lang.reflect.Field arg0: CALL 'public final fun (): java.lang.reflect.Field? declared in kotlin.reflect.jvm' type=java.lang.reflect.Field? origin=GET_PROPERTY - $receiver: PROPERTY_REFERENCE 'protected/*protected and package*/ open a: @[FlexibleNullability] foo.A?' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:a type:@[FlexibleNullability] foo.A? visibility:protected/*protected and package*/' getter='protected/*protected and package*/ open fun (): @[FlexibleNullability] foo.A? declared in bar.Base' setter='protected/*protected and package*/ open fun (: @[FlexibleNullability] foo.A?): kotlin.Unit declared in bar.Base' type=kotlin.reflect.KMutableProperty1 origin=null + $receiver: PROPERTY_REFERENCE 'protected/*protected and package*/ open a: @[FlexibleNullability] foo.A?' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:a type:@[FlexibleNullability] foo.A? visibility:protected/*protected and package*/' getter=null setter=null type=kotlin.reflect.KMutableProperty1 origin=null p0: GET_VAR ': foo.Derived declared in foo.Derived.foo' type=foo.Derived origin=null p1: CONSTRUCTOR_CALL 'public constructor (s: kotlin.String) declared in foo.A' type=foo.A origin=null s: CONST String type=kotlin.String value="OK" diff --git a/compiler/testData/ir/irText/expressions/protectedJavaFieldRef.fir.ir.txt b/compiler/testData/ir/irText/expressions/protectedJavaFieldRef.fir.ir.txt index 0119eca07b5..6a4ce443c6f 100644 --- a/compiler/testData/ir/irText/expressions/protectedJavaFieldRef.fir.ir.txt +++ b/compiler/testData/ir/irText/expressions/protectedJavaFieldRef.fir.ir.txt @@ -9,7 +9,7 @@ FILE fqName: fileName:/protectedJavaFieldRef.kt PROPERTY name:ref visibility:public modality:FINAL [val] FIELD PROPERTY_BACKING_FIELD name:ref type:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> visibility:private [final] EXPRESSION_BODY - PROPERTY_REFERENCE 'protected/*protected and package*/ open j: @[FlexibleNullability] kotlin.String?' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:j type:@[FlexibleNullability] kotlin.String? visibility:protected/*protected and package*/' getter='protected/*protected and package*/ open fun (): @[FlexibleNullability] kotlin.String? declared in p.Base' setter='protected/*protected and package*/ open fun (: @[FlexibleNullability] kotlin.String?): kotlin.Unit declared in p.Base' type=kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> origin=null + PROPERTY_REFERENCE 'protected/*protected and package*/ open j: @[FlexibleNullability] kotlin.String?' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:j type:@[FlexibleNullability] kotlin.String? visibility:protected/*protected and package*/' getter=null setter=null type=kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> origin=null $this: GET_VAR ': .Derived declared in .Derived' type=.Derived origin=null FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.Derived) returnType:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> correspondingProperty: PROPERTY name:ref visibility:public modality:FINAL [val] diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J.fir.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J.fir.ir.txt similarity index 93% rename from compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J.fir.ir.txt rename to compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J.fir.ir.txt index 5f37607c7b0..767e7335ac9 100644 --- a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J.fir.ir.txt @@ -1,6 +1,6 @@ -CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J modality:OPEN visibility:public/*package*/ superTypes:[kotlin.Any] +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J modality:OPEN visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.J - CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:.J [primary] + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.J [primary] FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:kotlin.Int visibility:public FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 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,operator] diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J.ir.txt similarity index 94% rename from compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J.ir.txt rename to compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J.ir.txt index d4315c12f8e..ddff2a04941 100644 --- a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J.ir.txt +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J.ir.txt @@ -1,6 +1,6 @@ -CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J modality:OPEN visibility:public/*package*/ superTypes:[kotlin.Any] +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J modality:OPEN visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.J - CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:.J [primary] + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.J [primary] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J1.fir.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J1.fir.ir.txt similarity index 93% rename from compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J1.fir.ir.txt rename to compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J1.fir.ir.txt index 3a6d6193ab4..183b74611d5 100644 --- a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J1.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J1.fir.ir.txt @@ -1,7 +1,7 @@ -CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J1 modality:OPEN visibility:public/*package*/ superTypes:[kotlin.Any] +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J1 modality:OPEN visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.J1.J1> TYPE_PARAMETER name:T index:0 variance: superTypes:[@[FlexibleNullability] kotlin.Any?] reified:false - CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:.J1.J1> [primary] + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.J1.J1> [primary] FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:@[FlexibleNullability] T of .J1? visibility:public FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 type:@[FlexibleNullability] T of .J1? visibility:public FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J1.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J1.ir.txt similarity index 94% rename from compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J1.ir.txt rename to compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J1.ir.txt index 97b856c043f..b83283b42c8 100644 --- a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__J1.ir.txt +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J1.ir.txt @@ -1,7 +1,7 @@ -CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J1 modality:OPEN visibility:public/*package*/ superTypes:[kotlin.Any] +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J1 modality:OPEN visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.J1.J1> TYPE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:T index:0 variance: superTypes:[@[FlexibleNullability] kotlin.Any?] reified:false - CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:.J1.J1> [primary] + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.J1.J1> [primary] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X.fir.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X.fir.ir.txt similarity index 93% rename from compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X.fir.ir.txt rename to compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X.fir.ir.txt index 37d217304f3..aa2202d72ae 100644 --- a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X.fir.ir.txt @@ -1,6 +1,6 @@ -CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X modality:OPEN visibility:public/*package*/ superTypes:[.J] +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X modality:OPEN visibility:public superTypes:[.J] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.X - CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:.X [primary] + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.X [primary] FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 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,operator] overridden: diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X.ir.txt similarity index 95% rename from compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X.ir.txt rename to compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X.ir.txt index 997faa8bd83..758e7981f5a 100644 --- a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X.ir.txt +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X.ir.txt @@ -1,6 +1,6 @@ -CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X modality:OPEN visibility:public/*package*/ superTypes:[.J] +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X modality:OPEN visibility:public superTypes:[.J] $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.X - CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:.X [primary] + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.X [primary] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .J diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X1.fir.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X1.fir.ir.txt similarity index 100% rename from compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X1.fir.ir.txt rename to compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X1.fir.ir.txt diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X1.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X1.ir.txt similarity index 100% rename from compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.__X1.ir.txt rename to compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X1.ir.txt diff --git a/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.fir.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.fir.ir.txt new file mode 100644 index 00000000000..74745acd8f4 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.fir.ir.txt @@ -0,0 +1,24 @@ +FILE fqName: fileName:/Main.kt + FUN name:f visibility:public modality:FINAL <> (j:.J, x:.X, j1:.J1) returnType:kotlin.Unit + VALUE_PARAMETER name:j index:0 type:.J + VALUE_PARAMETER name:x index:1 type:.X + VALUE_PARAMETER name:j1 index:2 type:.J1 + BLOCK_BODY + VAR name:jf type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public open f: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:kotlin.Int visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + $this: GET_VAR 'j: .J declared in .f' type=.J origin=null + VAR name:js type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public open s: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s type:kotlin.Int visibility:public [static]' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + VAR name:xf type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public open f: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:kotlin.Int visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + $this: GET_VAR 'x: .X declared in .f' type=.X origin=null + VAR name:xs type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public open s: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s type:kotlin.Int visibility:public [static]' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + VAR name:xf2 type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public open f2: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 type:kotlin.Int visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + $this: GET_VAR 'x: .X declared in .f' type=.X origin=null + VAR name:xs2 type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public open s2: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 type:kotlin.Int visibility:public [static]' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + VAR name:j1f type:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> [val] + PROPERTY_REFERENCE 'public open f: @[FlexibleNullability] T of .J1?' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:@[FlexibleNullability] T of .J1? visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> origin=null + $this: GET_VAR 'j1: .J1 declared in .f' type=.J1 origin=null diff --git a/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.fir.kt.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.fir.kt.txt new file mode 100644 index 00000000000..d4facb95217 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.fir.kt.txt @@ -0,0 +1,10 @@ +fun f(j: J, x: X, j1: J1) { + val jf: KMutableProperty0 = j::f + val js: KMutableProperty0 = J::s + val xf: KMutableProperty0 = x::f + val xs: KMutableProperty0 = X::s + val xf2: KMutableProperty0 = x::f2 + val xs2: KMutableProperty0 = X::s2 + val j1f: KMutableProperty0<@FlexibleNullability String?> = j1::f +} + diff --git a/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.ir.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.ir.txt new file mode 100644 index 00000000000..a8fccafdfa0 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.ir.txt @@ -0,0 +1,24 @@ +FILE fqName: fileName:/Main.kt + FUN name:f visibility:public modality:FINAL <> (j:.J, x:.X, j1:.J1) returnType:kotlin.Unit + VALUE_PARAMETER name:j index:0 type:.J + VALUE_PARAMETER name:x index:1 type:.X + VALUE_PARAMETER name:j1 index:2 type:.J1 + BLOCK_BODY + VAR name:jf type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public final f: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:kotlin.Int visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + $this: GET_VAR 'j: .J declared in .f' type=.J origin=null + VAR name:js type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public final s: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s type:kotlin.Int visibility:public [static]' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + VAR name:xf type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public final f: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:kotlin.Int visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + $this: GET_VAR 'x: .X declared in .f' type=.X origin=null + VAR name:xs type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public final s: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s type:kotlin.Int visibility:public [static]' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + VAR name:xf2 type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public final f2: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 type:kotlin.Int visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + $this: GET_VAR 'x: .X declared in .f' type=.X origin=null + VAR name:xs2 type:kotlin.reflect.KMutableProperty0 [val] + PROPERTY_REFERENCE 'public final s2: kotlin.Int' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 type:kotlin.Int visibility:public [static]' getter=null setter=null type=kotlin.reflect.KMutableProperty0 origin=null + VAR name:j1f type:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> [val] + PROPERTY_REFERENCE 'public final f: @[FlexibleNullability] T of .J1?' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:@[FlexibleNullability] T of .J1? visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> origin=null + $this: GET_VAR 'j1: .J1 declared in .f' type=.J1 origin=null diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt similarity index 66% rename from compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt rename to compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt index 81232226820..2c6edbe230c 100644 --- a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt @@ -1,14 +1,14 @@ -// FIR_IDENTICAL // TARGET_BACKEND: JVM -// ISSUE: KT-61362 +// ISSUE: KT-61362, KT-65722 // DUMP_EXTERNAL_CLASS: J // DUMP_EXTERNAL_CLASS: X // DUMP_EXTERNAL_CLASS: J1 // DUMP_EXTERNAL_CLASS: X1 +// DUMP_IR // FILE: J.java -class J { +public class J { public int f = 0; public static int s = 0; @@ -18,14 +18,14 @@ class J { // FILE: X.java -class X extends J { +public class X extends J { public int f2 = 1; public static int s2 = 1; } // FILE: J1.java -class J1 { +public class J1 { public T f = null; public static T s = null; @@ -38,4 +38,16 @@ class J1 { class X1 extends J1 { public String f2 = "s1"; public static String s2 = "s2"; +} + +// FILE: Main.kt + +fun f(j: J, x: X, j1: J1) { + val jf = j::f + val js = J::s + val xf = x::f + val xs = X::s + val xf2 = x::f2 + val xs2 = X::s2 + val j1f = j1::f } \ No newline at end of file diff --git a/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt.txt new file mode 100644 index 00000000000..d4facb95217 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt.txt @@ -0,0 +1,10 @@ +fun f(j: J, x: X, j1: J1) { + val jf: KMutableProperty0 = j::f + val js: KMutableProperty0 = J::s + val xf: KMutableProperty0 = x::f + val xs: KMutableProperty0 = X::s + val xf2: KMutableProperty0 = x::f2 + val xs2: KMutableProperty0 = X::s2 + val j1f: KMutableProperty0<@FlexibleNullability String?> = j1::f +} + diff --git a/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.sig.kt.txt b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.sig.kt.txt new file mode 100644 index 00000000000..365bedf1367 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.sig.kt.txt @@ -0,0 +1,6 @@ +// CHECK: +// Mangled name: #f(J;X;J1){} +// Public signature: /f|-2688577840123949128[0] +// Public signature debug description: f(J;X;J1){} +fun f(j: J, x: X, j1: J1): Unit + diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt.txt b/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt.txt deleted file mode 100644 index 8b137891791..00000000000 --- a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.sig.kt.txt b/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.sig.kt.txt deleted file mode 100644 index 8b137891791..00000000000 --- a/compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.sig.kt.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java index c5c26cd4af7..3000d15beda 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java @@ -3964,6 +3964,12 @@ public class ClassicJvmIrTextTestGenerated extends AbstractClassicJvmIrTextTest runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt"); } + @Test + @TestMetadata("FieldsFromJavaClass.kt") + public void testFieldsFromJavaClass() { + runTest("compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt"); + } + @Test @TestMetadata("Fir2IrClassifierStorage.kt") public void testFir2IrClassifierStorage() { @@ -4078,12 +4084,6 @@ public class ClassicJvmIrTextTestGenerated extends AbstractClassicJvmIrTextTest runTest("compiler/testData/ir/irText/firProblems/LocalSuspendFun.kt"); } - @Test - @TestMetadata("MissingFieldInJavaClass.kt") - public void testMissingFieldInJavaClass() { - runTest("compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt"); - } - @Test @TestMetadata("Modality.kt") public void testModality() {