[FIR2IR] Remove non-existent accessors from property references on Java fields

Rename `MissingFieldInJavaClass` to `FieldsFromJavaClass` to correspond its content

^KT-65722 Fixed

Merge-request: KT-MR-14837
This commit is contained in:
Ivan Kochurkin
2024-03-08 10:10:05 +00:00
committed by Space Team
parent 2d4f4b9bb5
commit ea44d4defd
25 changed files with 194 additions and 107 deletions
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.Fir2IrConversionScope import org.jetbrains.kotlin.fir.backend.Fir2IrConversionScope
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
import org.jetbrains.kotlin.fir.backend.InjectedValue 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.declarations.FirProperty
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrBuiltIns
@@ -103,6 +104,5 @@ class JvmFir2IrExtensions(
) )
override fun hasBackingField(property: FirProperty, session: FirSession): Boolean = override fun hasBackingField(property: FirProperty, session: FirSession): Boolean =
// NOTE maybe there might be platform-specific logic, similar to JvmGeneratorExtensionsImpl.isPropertyWithPlatformField() property.origin is FirDeclarationOrigin.Java || Fir2IrExtensions.Default.hasBackingField(property, session)
Fir2IrExtensions.Default.hasBackingField(property, session)
} }
@@ -634,14 +634,12 @@ class Fir2IrDeclarationStorage(
return createFakeOverridePropertySymbols(property, fakeOverrideOwnerLookupTag) return createFakeOverridePropertySymbols(property, fakeOverrideOwnerLookupTag)
} }
val isJavaOrigin = property.origin is FirDeclarationOrigin.Java
val propertySymbol = IrPropertySymbolImpl() 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) { val backingFieldSymbol = runIf(property.delegate != null || extensions.hasBackingField(property, session)) {
createFunctionSymbol(signature = null)
}
val backingFieldSymbol = runIf(property.delegate != null || property.hasBackingField) {
createFieldSymbol() createFieldSymbol()
} }
@@ -660,7 +658,9 @@ class Fir2IrDeclarationStorage(
val containingClassSymbol = findContainingIrClassSymbol(property, fakeOverrideOwnerLookupTag) val containingClassSymbol = findContainingIrClassSymbol(property, fakeOverrideOwnerLookupTag)
val propertySymbol = IrPropertyFakeOverrideSymbol(originalSymbols.propertySymbol, containingClassSymbol, idSignature = null) 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 setterSymbol = runIf(property.isVar) {
val setterIsVisible = property.setter?.let { setter -> val setterIsVisible = property.setter?.let { setter ->
@@ -683,7 +683,7 @@ class Fir2IrDeclarationStorage(
backingFieldForPropertyCache[irPropertySymbol] = it backingFieldForPropertyCache[irPropertySymbol] = it
propertyForBackingFieldCache[it] = irPropertySymbol propertyForBackingFieldCache[it] = irPropertySymbol
} }
symbols.getterSymbol.let { symbols.getterSymbol?.let {
getterForPropertyCache[irPropertySymbol] = it getterForPropertyCache[irPropertySymbol] = it
} }
symbols.setterSymbol?.let { symbols.setterSymbol?.let {
@@ -1597,7 +1597,7 @@ internal fun <D : IrDeclaration> IrBindableSymbol<*, D>.ownerIfBound(): D? {
data class PropertySymbols( data class PropertySymbols(
val propertySymbol: IrPropertySymbol, val propertySymbol: IrPropertySymbol,
val getterSymbol: IrSimpleFunctionSymbol, val getterSymbol: IrSimpleFunctionSymbol?,
val setterSymbol: IrSimpleFunctionSymbol?, val setterSymbol: IrSimpleFunctionSymbol?,
val backingFieldSymbol: IrFieldSymbol?, val backingFieldSymbol: IrFieldSymbol?,
) )
@@ -315,26 +315,28 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
if (irParent != null) { if (irParent != null) {
backingField?.parent = irParent backingField?.parent = irParent
} }
this.getter = getter.convertWithOffsets(startOffset, endOffset) { startOffset, endOffset -> this.getter = symbols.getterSymbol?.let { getterSymbol ->
createIrPropertyAccessor( getter.convertWithOffsets(startOffset, endOffset) { startOffset, endOffset ->
getter, property, this, symbols.getterSymbol, type, irParent, false, createIrPropertyAccessor(
when { getter, property, this, getterSymbol, type, irParent, false,
origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin when {
origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER -> origin origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin
delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER -> origin
origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR
origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin
getter == null || getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin
else -> origin getter == null || getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
}, else -> origin
startOffset, endOffset, },
property.unwrapFakeOverrides().getter, startOffset, endOffset,
) property.unwrapFakeOverrides().getter,
)
}
} }
if (property.isVar) { if (property.isVar && symbols.setterSymbol != null) {
this.setter = setter.convertWithOffsets(startOffset, endOffset) { startOffset, endOffset -> this.setter = setter.convertWithOffsets(startOffset, endOffset) { startOffset, endOffset ->
createIrPropertyAccessor( createIrPropertyAccessor(
setter, property, this, symbols.setterSymbol!!, type, irParent, true, setter, property, this, symbols.setterSymbol, type, irParent, true,
when { when {
delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR
origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin
@@ -129,6 +129,7 @@ class Fir2IrLazyProperty(
} }
override var backingField: IrField? = when { override var backingField: IrField? = when {
symbols.backingFieldSymbol == null -> null
fir.hasExplicitBackingField -> { fir.hasExplicitBackingField -> {
val backingFieldType = with(typeConverter) { val backingFieldType = with(typeConverter) {
fir.backingField?.returnTypeRef?.toIrType() fir.backingField?.returnTypeRef?.toIrType()
@@ -139,7 +140,7 @@ class Fir2IrLazyProperty(
this@Fir2IrLazyProperty, this@Fir2IrLazyProperty,
fir, fir,
IrDeclarationOrigin.PROPERTY_BACKING_FIELD, IrDeclarationOrigin.PROPERTY_BACKING_FIELD,
symbols.backingFieldSymbol!!, symbols.backingFieldSymbol,
components.visibilityConverter.convertToDescriptorVisibility(visibility), components.visibilityConverter.convertToDescriptorVisibility(visibility),
fir.name, fir.name,
fir.isVal, fir.isVal,
@@ -149,12 +150,24 @@ class Fir2IrLazyProperty(
field.initializer = toIrInitializer(initializer) 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( callablesGenerator.createBackingField(
this@Fir2IrLazyProperty, this@Fir2IrLazyProperty,
fir, fir,
IrDeclarationOrigin.PROPERTY_BACKING_FIELD, IrDeclarationOrigin.PROPERTY_BACKING_FIELD,
symbols.backingFieldSymbol!!, symbols.backingFieldSymbol,
components.visibilityConverter.convertToDescriptorVisibility(fir.visibility), components.visibilityConverter.convertToDescriptorVisibility(fir.visibility),
fir.name, fir.name,
fir.isVal, fir.isVal,
@@ -164,21 +177,7 @@ class Fir2IrLazyProperty(
field.initializer = toIrInitializer(fir.initializer) field.initializer = toIrInitializer(fir.initializer)
} }
} }
fir.delegate != null -> { else -> 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
}
}?.apply { }?.apply {
this.parent = this@Fir2IrLazyProperty.parent this.parent = this@Fir2IrLazyProperty.parent
this.annotations = fir.backingField?.annotations?.mapNotNull { this.annotations = fir.backingField?.annotations?.mapNotNull {
@@ -186,30 +185,32 @@ class Fir2IrLazyProperty(
}.orEmpty() }.orEmpty()
} }
override var getter: IrSimpleFunction? = Fir2IrLazyPropertyAccessor( override var getter: IrSimpleFunction? = symbols.getterSymbol?.let {
components, startOffset, endOffset, Fir2IrLazyPropertyAccessor(
origin = when { components, startOffset, endOffset,
origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin origin = when {
fir.delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin
origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin fir.delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR
origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin
fir.getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin
else -> origin fir.getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
}, else -> origin
firAccessor = fir.getter, },
isSetter = false, firAccessor = fir.getter,
firParentProperty = fir, isSetter = false,
firParentClass = containingClass, firParentProperty = fir,
symbol = symbols.getterSymbol, firParentClass = containingClass,
parent = this@Fir2IrLazyProperty.parent, symbol = it,
isFakeOverride = isFakeOverride, parent = this@Fir2IrLazyProperty.parent,
correspondingPropertySymbol = this.symbol isFakeOverride = isFakeOverride,
).apply { correspondingPropertySymbol = this.symbol
classifiersGenerator.setTypeParameters(this, this@Fir2IrLazyProperty.fir, ConversionTypeOrigin.DEFAULT) ).apply {
classifiersGenerator.setTypeParameters(this, this@Fir2IrLazyProperty.fir, ConversionTypeOrigin.DEFAULT)
}
} }
override var setter: IrSimpleFunction? = run { override var setter: IrSimpleFunction? = run {
if (!fir.isVar) return@run null if (!fir.isVar || symbols.setterSymbol == null) return@run null
Fir2IrLazyPropertyAccessor( Fir2IrLazyPropertyAccessor(
components, startOffset, endOffset, components, startOffset, endOffset,
origin = when { origin = when {
@@ -223,7 +224,7 @@ class Fir2IrLazyProperty(
firAccessor = fir.setter, isSetter = true, firAccessor = fir.setter, isSetter = true,
firParentProperty = fir, firParentProperty = fir,
firParentClass = containingClass, firParentClass = containingClass,
symbol = symbols.setterSymbol!!, symbol = symbols.setterSymbol,
parent = this@Fir2IrLazyProperty.parent, parent = this@Fir2IrLazyProperty.parent,
isFakeOverride = isFakeOverride, isFakeOverride = isFakeOverride,
correspondingPropertySymbol = this.symbol correspondingPropertySymbol = this.symbol
@@ -3964,6 +3964,12 @@ public class FirLightTreeJvmIrTextTestGenerated extends AbstractFirLightTreeJvmI
runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt"); runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt");
} }
@Test
@TestMetadata("FieldsFromJavaClass.kt")
public void testFieldsFromJavaClass() {
runTest("compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt");
}
@Test @Test
@TestMetadata("Fir2IrClassifierStorage.kt") @TestMetadata("Fir2IrClassifierStorage.kt")
public void testFir2IrClassifierStorage() { public void testFir2IrClassifierStorage() {
@@ -4078,12 +4084,6 @@ public class FirLightTreeJvmIrTextTestGenerated extends AbstractFirLightTreeJvmI
runTest("compiler/testData/ir/irText/firProblems/LocalSuspendFun.kt"); runTest("compiler/testData/ir/irText/firProblems/LocalSuspendFun.kt");
} }
@Test
@TestMetadata("MissingFieldInJavaClass.kt")
public void testMissingFieldInJavaClass() {
runTest("compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt");
}
@Test @Test
@TestMetadata("Modality.kt") @TestMetadata("Modality.kt")
public void testModality() { public void testModality() {
@@ -3964,6 +3964,12 @@ public class FirPsiJvmIrTextTestGenerated extends AbstractFirPsiJvmIrTextTest {
runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt"); runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt");
} }
@Test
@TestMetadata("FieldsFromJavaClass.kt")
public void testFieldsFromJavaClass() {
runTest("compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt");
}
@Test @Test
@TestMetadata("Fir2IrClassifierStorage.kt") @TestMetadata("Fir2IrClassifierStorage.kt")
public void testFir2IrClassifierStorage() { public void testFir2IrClassifierStorage() {
@@ -4078,12 +4084,6 @@ public class FirPsiJvmIrTextTestGenerated extends AbstractFirPsiJvmIrTextTest {
runTest("compiler/testData/ir/irText/firProblems/LocalSuspendFun.kt"); runTest("compiler/testData/ir/irText/firProblems/LocalSuspendFun.kt");
} }
@Test
@TestMetadata("MissingFieldInJavaClass.kt")
public void testMissingFieldInJavaClass() {
runTest("compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt");
}
@Test @Test
@TestMetadata("Modality.kt") @TestMetadata("Modality.kt")
public void testModality() { public void testModality() {
@@ -67,7 +67,7 @@ FILE fqName:foo fileName:/main.kt
$this: CALL 'public final fun CHECK_NOT_NULL <T0> (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 $this: CALL 'public final fun CHECK_NOT_NULL <T0> (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
<T0>: java.lang.reflect.Field <T0>: java.lang.reflect.Field
arg0: CALL 'public final fun <get-javaField> (): java.lang.reflect.Field? declared in kotlin.reflect.jvm' type=java.lang.reflect.Field? origin=GET_PROPERTY arg0: CALL 'public final fun <get-javaField> (): 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 <get-a> (): @[FlexibleNullability] foo.A? declared in bar.Base' setter='protected/*protected and package*/ open fun <set-a> (<set-?>: @[FlexibleNullability] foo.A?): kotlin.Unit declared in bar.Base' type=kotlin.reflect.KMutableProperty1<foo.Derived, @[FlexibleNullability] foo.A?> 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<foo.Derived, @[FlexibleNullability] foo.A?> origin=null
p0: GET_VAR '<this>: foo.Derived declared in foo.Derived.foo' type=foo.Derived origin=null p0: GET_VAR '<this>: foo.Derived declared in foo.Derived.foo' type=foo.Derived origin=null
p1: CONSTRUCTOR_CALL 'public constructor <init> (s: kotlin.String) declared in foo.A' type=foo.A origin=null p1: CONSTRUCTOR_CALL 'public constructor <init> (s: kotlin.String) declared in foo.A' type=foo.A origin=null
s: CONST String type=kotlin.String value="OK" s: CONST String type=kotlin.String value="OK"
@@ -9,7 +9,7 @@ FILE fqName:<root> fileName:/protectedJavaFieldRef.kt
PROPERTY name:ref visibility:public modality:FINAL [val] PROPERTY name:ref visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:ref type:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:ref type:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> visibility:private [final]
EXPRESSION_BODY 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 <get-j> (): @[FlexibleNullability] kotlin.String? declared in p.Base' setter='protected/*protected and package*/ open fun <set-j> (<set-?>: @[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 '<this>: <root>.Derived declared in <root>.Derived' type=<root>.Derived origin=null $this: GET_VAR '<this>: <root>.Derived declared in <root>.Derived' type=<root>.Derived origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-ref> visibility:public modality:FINAL <> ($this:<root>.Derived) returnType:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> FUN DEFAULT_PROPERTY_ACCESSOR name:<get-ref> visibility:public modality:FINAL <> ($this:<root>.Derived) returnType:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?>
correspondingProperty: PROPERTY name:ref visibility:public modality:FINAL [val] correspondingProperty: PROPERTY name:ref visibility:public modality:FINAL [val]
@@ -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:<this> type:<root>.J $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.J
CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:<root>.J [primary] CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:<root>.J [primary]
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:kotlin.Int visibility:public 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 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] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
@@ -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:<this> type:<root>.J $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name:<this> type:<root>.J
CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:<root>.J [primary] CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:<root>.J [primary]
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
@@ -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:<this> type:<root>.J1<T of <root>.J1> $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.J1<T of <root>.J1>
TYPE_PARAMETER name:T index:0 variance: superTypes:[@[FlexibleNullability] kotlin.Any?] reified:false TYPE_PARAMETER name:T index:0 variance: superTypes:[@[FlexibleNullability] kotlin.Any?] reified:false
CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:<root>.J1<T of <root>.J1> [primary] CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:<root>.J1<T of <root>.J1> [primary]
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:@[FlexibleNullability] T of <root>.J1? visibility:public FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:@[FlexibleNullability] T of <root>.J1? visibility:public
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 type:@[FlexibleNullability] T of <root>.J1? visibility:public FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 type:@[FlexibleNullability] T of <root>.J1? visibility:public
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
@@ -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:<this> type:<root>.J1<T of <root>.J1> $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name:<this> type:<root>.J1<T of <root>.J1>
TYPE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:T index:0 variance: superTypes:[@[FlexibleNullability] kotlin.Any?] reified:false 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:<root>.J1<T of <root>.J1> [primary] CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:<root>.J1<T of <root>.J1> [primary]
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
@@ -1,6 +1,6 @@
CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X modality:OPEN visibility:public/*package*/ superTypes:[<root>.J] CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X modality:OPEN visibility:public superTypes:[<root>.J]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.X $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.X
CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:<root>.X [primary] CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:<root>.X [primary]
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 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] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden: overridden:
@@ -1,6 +1,6 @@
CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X modality:OPEN visibility:public/*package*/ superTypes:[<root>.J] CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X modality:OPEN visibility:public superTypes:[<root>.J]
$this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name:<this> type:<root>.X $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name:<this> type:<root>.X
CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:<root>.X [primary] CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:<root>.X [primary]
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in <root>.J public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in <root>.J
@@ -0,0 +1,24 @@
FILE fqName:<root> fileName:/Main.kt
FUN name:f visibility:public modality:FINAL <> (j:<root>.J, x:<root>.X, j1:<root>.J1<kotlin.String>) returnType:kotlin.Unit
VALUE_PARAMETER name:j index:0 type:<root>.J
VALUE_PARAMETER name:x index:1 type:<root>.X
VALUE_PARAMETER name:j1 index:2 type:<root>.J1<kotlin.String>
BLOCK_BODY
VAR name:jf type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
$this: GET_VAR 'j: <root>.J declared in <root>.f' type=<root>.J origin=null
VAR name:js type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
VAR name:xf type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
$this: GET_VAR 'x: <root>.X declared in <root>.f' type=<root>.X origin=null
VAR name:xs type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
VAR name:xf2 type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
$this: GET_VAR 'x: <root>.X declared in <root>.f' type=<root>.X origin=null
VAR name:xs2 type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
VAR name:j1f type:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> [val]
PROPERTY_REFERENCE 'public open f: @[FlexibleNullability] T of <root>.J1?' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:@[FlexibleNullability] T of <root>.J1? visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> origin=null
$this: GET_VAR 'j1: <root>.J1<kotlin.String> declared in <root>.f' type=<root>.J1<kotlin.String> origin=null
@@ -0,0 +1,10 @@
fun f(j: J, x: X, j1: J1<String>) {
val jf: KMutableProperty0<Int> = j::f
val js: KMutableProperty0<Int> = J::s
val xf: KMutableProperty0<Int> = x::f
val xs: KMutableProperty0<Int> = X::s
val xf2: KMutableProperty0<Int> = x::f2
val xs2: KMutableProperty0<Int> = X::s2
val j1f: KMutableProperty0<@FlexibleNullability String?> = j1::f
}
@@ -0,0 +1,24 @@
FILE fqName:<root> fileName:/Main.kt
FUN name:f visibility:public modality:FINAL <> (j:<root>.J, x:<root>.X, j1:<root>.J1<kotlin.String>) returnType:kotlin.Unit
VALUE_PARAMETER name:j index:0 type:<root>.J
VALUE_PARAMETER name:x index:1 type:<root>.X
VALUE_PARAMETER name:j1 index:2 type:<root>.J1<kotlin.String>
BLOCK_BODY
VAR name:jf type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
$this: GET_VAR 'j: <root>.J declared in <root>.f' type=<root>.J origin=null
VAR name:js type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
VAR name:xf type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
$this: GET_VAR 'x: <root>.X declared in <root>.f' type=<root>.X origin=null
VAR name:xs type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
VAR name:xf2 type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
$this: GET_VAR 'x: <root>.X declared in <root>.f' type=<root>.X origin=null
VAR name:xs2 type:kotlin.reflect.KMutableProperty0<kotlin.Int> [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<kotlin.Int> origin=null
VAR name:j1f type:kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> [val]
PROPERTY_REFERENCE 'public final f: @[FlexibleNullability] T of <root>.J1?' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:@[FlexibleNullability] T of <root>.J1? visibility:public' getter=null setter=null type=kotlin.reflect.KMutableProperty0<@[FlexibleNullability] kotlin.String?> origin=null
$this: GET_VAR 'j1: <root>.J1<kotlin.String> declared in <root>.f' type=<root>.J1<kotlin.String> origin=null
@@ -1,14 +1,14 @@
// FIR_IDENTICAL
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// ISSUE: KT-61362 // ISSUE: KT-61362, KT-65722
// DUMP_EXTERNAL_CLASS: J // DUMP_EXTERNAL_CLASS: J
// DUMP_EXTERNAL_CLASS: X // DUMP_EXTERNAL_CLASS: X
// DUMP_EXTERNAL_CLASS: J1 // DUMP_EXTERNAL_CLASS: J1
// DUMP_EXTERNAL_CLASS: X1 // DUMP_EXTERNAL_CLASS: X1
// DUMP_IR
// FILE: J.java // FILE: J.java
class J { public class J {
public int f = 0; public int f = 0;
public static int s = 0; public static int s = 0;
@@ -18,14 +18,14 @@ class J {
// FILE: X.java // FILE: X.java
class X extends J { public class X extends J {
public int f2 = 1; public int f2 = 1;
public static int s2 = 1; public static int s2 = 1;
} }
// FILE: J1.java // FILE: J1.java
class J1<T> { public class J1<T> {
public T f = null; public T f = null;
public static T s = null; public static T s = null;
@@ -39,3 +39,15 @@ class X1<T> extends J1<String> {
public String f2 = "s1"; public String f2 = "s1";
public static String s2 = "s2"; public static String s2 = "s2";
} }
// FILE: Main.kt
fun f(j: J, x: X, j1: J1<String>) {
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
}
@@ -0,0 +1,10 @@
fun f(j: J, x: X, j1: J1<String>) {
val jf: KMutableProperty0<Int> = j::f
val js: KMutableProperty0<Int> = J::s
val xf: KMutableProperty0<Int> = x::f
val xs: KMutableProperty0<Int> = X::s
val xf2: KMutableProperty0<Int> = x::f2
val xs2: KMutableProperty0<Int> = X::s2
val j1f: KMutableProperty0<@FlexibleNullability String?> = j1::f
}
@@ -0,0 +1,6 @@
// CHECK:
// Mangled name: #f(J;X;J1<kotlin.String>){}
// Public signature: /f|-2688577840123949128[0]
// Public signature debug description: f(J;X;J1<kotlin.String>){}
fun f(j: J, x: X, j1: J1<String>): Unit
@@ -1 +0,0 @@
@@ -1 +0,0 @@
@@ -3964,6 +3964,12 @@ public class ClassicJvmIrTextTestGenerated extends AbstractClassicJvmIrTextTest
runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt"); runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt");
} }
@Test
@TestMetadata("FieldsFromJavaClass.kt")
public void testFieldsFromJavaClass() {
runTest("compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.kt");
}
@Test @Test
@TestMetadata("Fir2IrClassifierStorage.kt") @TestMetadata("Fir2IrClassifierStorage.kt")
public void testFir2IrClassifierStorage() { public void testFir2IrClassifierStorage() {
@@ -4078,12 +4084,6 @@ public class ClassicJvmIrTextTestGenerated extends AbstractClassicJvmIrTextTest
runTest("compiler/testData/ir/irText/firProblems/LocalSuspendFun.kt"); runTest("compiler/testData/ir/irText/firProblems/LocalSuspendFun.kt");
} }
@Test
@TestMetadata("MissingFieldInJavaClass.kt")
public void testMissingFieldInJavaClass() {
runTest("compiler/testData/ir/irText/firProblems/MissingFieldInJavaClass.kt");
}
@Test @Test
@TestMetadata("Modality.kt") @TestMetadata("Modality.kt")
public void testModality() { public void testModality() {