From 23ceb5d08a37f0c26c2241b0a40c7abc871e28ae Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 14 Sep 2023 18:26:29 +0200 Subject: [PATCH] K2: do not build fake overrides for substituted package-private members For example, `java.util.ArrayList.elementData` is a generic package-private method. Not unwrapping intersection/substitution fake overrides resulted in incorrect FQ names being compared in the package visibility check, which led to the fake override always being created in any subclass of ArrayList. This change will help in testing IR fake overrides (KT-61360) because in the current (temporary) mode, IrFakeOverrideRebuilder throws an exception if initial fake overrides constructed by fir2ir differ from the ones rebuilt by the IR -- and here they'll be different after fixing KT-61366. --- .../fir/backend/generators/FakeOverrideGenerator.kt | 7 +++---- .../irText/firProblems/ArrayListOverrides.fir.ir.txt | 10 ---------- .../ir/irText/firProblems/MultiList.fir.ir.txt | 10 ---------- 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index 18b4a528173..705289872f1 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -236,11 +236,10 @@ class FakeOverrideGenerator( // But they are treated differently in IR (real declarations have already been declared before) and such methods are present among realDeclarationSymbols if (originalSymbol in realDeclarationSymbols) return - if (!session.visibilityChecker.isVisibleForOverriding(klass.moduleData, klass.symbol, originalDeclaration)) return - - val origin = IrDeclarationOrigin.FAKE_OVERRIDE val baseSymbol = originalSymbol.unwrapSubstitutionAndIntersectionOverrides() as S + if (!session.visibilityChecker.isVisibleForOverriding(klass.moduleData, klass.symbol, baseSymbol.fir)) return + val (fakeOverrideFirDeclaration, baseFirSymbolsForFakeOverride) = when { originalSymbol.shouldHaveComputedBaseSymbolsForClass(classLookupTag) -> { // Substitution or intersection case @@ -268,7 +267,7 @@ class FakeOverrideGenerator( ?: createIrDeclaration( fakeOverrideFirDeclaration, irClass, - origin, + IrDeclarationOrigin.FAKE_OVERRIDE, isLocal ) if (containsErrorTypes(irDeclaration)) { diff --git a/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.ir.txt b/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.ir.txt index d2643dcc7ca..c4a1b7933a5 100644 --- a/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.ir.txt @@ -6,11 +6,6 @@ FILE fqName: fileName:/ArrayListOverrides.kt DELEGATING_CONSTRUCTOR_CALL 'public constructor () declared in java.util.ArrayList' : kotlin.String INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:A1 modality:FINAL visibility:public superTypes:[java.util.ArrayList]' - FUN FAKE_OVERRIDE name:elementData visibility:public/*package*/ modality:OPEN <> ($this:java.util.ArrayList, p0:kotlin.Int) returnType:@[FlexibleNullability] kotlin.String? [fake_override] - overridden: - public/*package*/ open fun elementData (p0: kotlin.Int): @[FlexibleNullability] E of java.util.ArrayList? declared in java.util.ArrayList - $this: VALUE_PARAMETER name: type:java.util.ArrayList - VALUE_PARAMETER name:p0 index:0 type:kotlin.Int PROPERTY FAKE_OVERRIDE name:size visibility:public modality:OPEN [fake_override,val] overridden: public open size: kotlin.Int @@ -208,11 +203,6 @@ FILE fqName: fileName:/ArrayListOverrides.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public open fun remove (x: kotlin.String): kotlin.Boolean declared in .A2' CONST Boolean type=kotlin.Boolean value=true - FUN FAKE_OVERRIDE name:elementData visibility:public/*package*/ modality:OPEN <> ($this:java.util.ArrayList, p0:kotlin.Int) returnType:@[FlexibleNullability] kotlin.String? [fake_override] - overridden: - public/*package*/ open fun elementData (p0: kotlin.Int): @[FlexibleNullability] E of java.util.ArrayList? declared in java.util.ArrayList - $this: VALUE_PARAMETER name: type:java.util.ArrayList - VALUE_PARAMETER name:p0 index:0 type:kotlin.Int PROPERTY FAKE_OVERRIDE name:size visibility:public modality:OPEN [fake_override,val] overridden: public open size: kotlin.Int diff --git a/compiler/testData/ir/irText/firProblems/MultiList.fir.ir.txt b/compiler/testData/ir/irText/firProblems/MultiList.fir.ir.txt index 173550fe022..debd99c2da4 100644 --- a/compiler/testData/ir/irText/firProblems/MultiList.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/MultiList.fir.ir.txt @@ -354,11 +354,6 @@ FILE fqName: fileName:/MultiList.kt public open fun forEach (p0: @[FlexibleNullability] java.util.function.Consumer?): kotlin.Unit declared in java.util.ArrayList $this: VALUE_PARAMETER name: type:java.util.ArrayList<.Some.SomeList>> VALUE_PARAMETER name:p0 index:0 type:@[FlexibleNullability] java.util.function.Consumer.Some.SomeList>?>? - FUN FAKE_OVERRIDE name:elementData visibility:public/*package*/ modality:OPEN <> ($this:java.util.ArrayList<.Some.SomeList>>, p0:kotlin.Int) returnType:@[FlexibleNullability] .Some.SomeList>? [fake_override] - overridden: - public/*package*/ open fun elementData (p0: kotlin.Int): @[FlexibleNullability] E of java.util.ArrayList? declared in java.util.ArrayList - $this: VALUE_PARAMETER name: type:java.util.ArrayList<.Some.SomeList>> - VALUE_PARAMETER name:p0 index:0 type:kotlin.Int FUN FAKE_OVERRIDE name:trimToSize visibility:public modality:OPEN <> ($this:java.util.ArrayList<.Some.SomeList>>) returnType:kotlin.Unit [fake_override] overridden: public open fun trimToSize (): kotlin.Unit declared in java.util.ArrayList @@ -548,11 +543,6 @@ FILE fqName: fileName:/MultiList.kt public open fun forEach (p0: @[FlexibleNullability] java.util.function.Consumer.Some.SomeList>?>?): kotlin.Unit declared in .SomeList $this: VALUE_PARAMETER name: type:java.util.ArrayList<.Some> VALUE_PARAMETER name:p0 index:0 type:@[FlexibleNullability] java.util.function.Consumer.Some?>? - FUN FAKE_OVERRIDE name:elementData visibility:public/*package*/ modality:OPEN <> ($this:java.util.ArrayList<.Some>, p0:kotlin.Int) returnType:@[FlexibleNullability] .Some? [fake_override] - overridden: - public/*package*/ open fun elementData (p0: kotlin.Int): @[FlexibleNullability] .Some.SomeList>? declared in .SomeList - $this: VALUE_PARAMETER name: type:java.util.ArrayList<.Some> - VALUE_PARAMETER name:p0 index:0 type:kotlin.Int FUN FAKE_OVERRIDE name:trimToSize visibility:public modality:OPEN <> ($this:java.util.ArrayList<.Some>) returnType:kotlin.Unit [fake_override] overridden: public open fun trimToSize (): kotlin.Unit declared in .SomeList