Skip to content

Commit 1499254

Browse files
demiurg906Space Team
authored and
Space Team
committed
[FIR2IR] Add static fields to the list of declarations of lazy IR java class
^KT-69735 Fixed
1 parent 8f121bc commit 1499254

File tree

7 files changed

+29
-5
lines changed

7 files changed

+29
-5
lines changed

compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/backend/Fir2IrFakeOverrideStrategy.kt

+6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirSession
1212
import org.jetbrains.kotlin.fir.declarations.FirClass
1313
import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
1414
import org.jetbrains.kotlin.fir.isDelegated
15+
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyPropertyForPureField
1516
import org.jetbrains.kotlin.fir.resolve.ScopeSession
1617
import org.jetbrains.kotlin.fir.scopes.processAllFunctions
1718
import org.jetbrains.kotlin.fir.scopes.processAllProperties
@@ -49,6 +50,11 @@ class Fir2IrFakeOverrideStrategy(
4950
) : FakeOverrideBuilderStrategy.BindToPrivateSymbols(friendModules, delegatedMemberGenerationStrategy) {
5051
private val fieldOnlyProperties: MutableList<IrPropertyWithLateBinding> = mutableListOf()
5152

53+
override fun fakeOverrideMember(superType: IrType, member: IrOverridableMember, clazz: IrClass): IrOverridableMember? {
54+
if (member is Fir2IrLazyPropertyForPureField && member.backingField?.isStatic == true) return null
55+
return super.fakeOverrideMember(superType, member, clazz)
56+
}
57+
5258
override fun linkPropertyFakeOverride(property: IrPropertyWithLateBinding, manglerCompatibleMode: Boolean) {
5359
super.linkPropertyFakeOverride(property, manglerCompatibleMode)
5460

compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ class Fir2IrLazyClass(
199199
when {
200200
!shouldBuildStub(symbol.fir) -> {}
201201
symbol is FirFieldSymbol -> {
202-
if (!symbol.isStatic) {
202+
if (shouldBuildIrField(symbol)) {
203203
// Lazy declarations are created together with their symbol, so it's safe to take the owner here
204204
@OptIn(UnsafeDuringIrConstructionAPI::class)
205205
result += declarationStorage.getIrSymbolForField(
@@ -250,6 +250,12 @@ class Fir2IrLazyClass(
250250
}
251251
}
252252

253+
private fun shouldBuildIrField(fieldSymbol: FirFieldSymbol): Boolean {
254+
if (!fieldSymbol.isStatic) return true
255+
// we need to create IR for static fields only if they are not fake-overrides
256+
return fir.isJava && !fieldSymbol.fir.isFakeOverride(fir)
257+
}
258+
253259
override var metadata: MetadataSource?
254260
get() = null
255261
set(_) = error("We should never need to store metadata of external declarations.")

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/FakeOverrideBuilderStrategy.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.util.hasAnnotation
2121
import org.jetbrains.kotlin.ir.util.render
2222
import org.jetbrains.kotlin.name.StandardClassIds
2323
import org.jetbrains.kotlin.types.Variance
24+
import org.jetbrains.kotlin.utils.addToStdlib.runIf
2425

2526
/**
2627
* This class is a customization point for IrFakeOverrideBuilder.
@@ -64,11 +65,10 @@ abstract class FakeOverrideBuilderStrategy(
6465
* Creates a fake override for [member] from [superType] to be added to the class [clazz] or returns null,
6566
* if no fake override should be created for this member
6667
*/
67-
fun fakeOverrideMember(superType: IrType, member: IrOverridableMember, clazz: IrClass): IrOverridableMember? {
68-
return if (isVisibleForOverrideInClass(member, clazz))
68+
open fun fakeOverrideMember(superType: IrType, member: IrOverridableMember, clazz: IrClass): IrOverridableMember? {
69+
return runIf(isVisibleForOverrideInClass(member, clazz)) {
6970
buildFakeOverrideMember(superType, member, clazz, unimplementedOverridesStrategy)
70-
else
71-
null
71+
}
7272
}
7373

7474
/**

compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J.fir.ir.txt

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J modality:OPEN visibility:pu
44
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:kotlin.Int visibility:public
55
PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 visibility:public modality:FINAL [var]
66
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 type:kotlin.Int visibility:public
7+
PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:s visibility:public modality:FINAL [var]
8+
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s type:kotlin.Int visibility:public [static]
9+
PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 visibility:public modality:FINAL [var]
10+
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 type:kotlin.Int visibility:public [static]
711
CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:<root>.J [primary]
812
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
913
overridden:

compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__J1.fir.ir.txt

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J1 modality:OPEN visibility:p
55
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:@[FlexibleNullability] T of <root>.J1? visibility:public
66
PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 visibility:public modality:FINAL [var]
77
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f2 type:@[FlexibleNullability] T of <root>.J1? visibility:public
8+
PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:s visibility:public modality:FINAL [var]
9+
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s type:@[FlexibleNullability] T of <root>.J1? visibility:public [static]
10+
PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 visibility:public modality:FINAL [var]
11+
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 type:@[FlexibleNullability] T of <root>.J1? visibility:public [static]
812
CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:<root>.J1<T of <root>.J1> [primary]
913
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
1014
overridden:

compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X.fir.ir.txt

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X modality:OPEN visibility:pu
66
overridden:
77
public final f: kotlin.Int [var] declared in <root>.J
88
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:kotlin.Int visibility:public
9+
PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 visibility:public modality:FINAL [var]
10+
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 type:kotlin.Int visibility:public [static]
911
CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:<root>.X [primary]
1012
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
1113
overridden:

compiler/testData/ir/irText/firProblems/FieldsFromJavaClass.__X1.fir.ir.txt

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:X1 modality:OPEN visibility:p
77
overridden:
88
public final f: @[FlexibleNullability] T of <root>.J1? [var] declared in <root>.J1
99
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:f type:@[FlexibleNullability] kotlin.String? visibility:public
10+
PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 visibility:public modality:FINAL [var]
11+
FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:s2 type:@[FlexibleNullability] kotlin.String? visibility:public [static]
1012
CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public/*package*/ <> () returnType:<root>.X1<T of <root>.X1> [primary]
1113
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
1214
overridden:

0 commit comments

Comments
 (0)