From 9532172a22ca1ad67b7d687d0a6107a86f0d7f4d Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Fri, 9 Feb 2024 16:07:45 +0100 Subject: [PATCH] [Fir2IR] Don't use FIR f/o builder when IR f/o builder is enabled Before this commit, fir f/o builder was inconsistently disabled in some places, while it should work only for lazy declarations Attempt to use it for non-lazy declarations, without maintaining invariant, that it would also be used for super classes led to unpredictable results. This commit introduces opt-in, and marks all related API to three types * Propagate error to user * Fine to use, as it's checked if ir f/o builder is enabled * Fine to use, as it is definitely a lazy class. Several cases of missing checks was fixed. ^KT-65707 --- ...LFirBlackBoxCodegenBasedTestGenerated.java | 6 +++++ ...rsedBlackBoxCodegenBasedTestGenerated.java | 6 +++++ .../kotlin/fir/backend/Fir2IrComponents.kt | 1 + .../fir/backend/Fir2IrComponentsStorage.kt | 1 + .../kotlin/fir/backend/Fir2IrConverter.kt | 26 ++++++++++++++----- .../fir/backend/Fir2IrDeclarationStorage.kt | 3 +++ .../kotlin/fir/backend/FirIrProvider.kt | 2 ++ .../generators/ClassMemberGenerator.kt | 3 +++ .../generators/DelegatedMemberGenerator.kt | 2 ++ .../generators/FakeOverrideGenerator.kt | 10 +++++++ .../Fir2IrCallableDeclarationsGenerator.kt | 2 +- .../kotlin/fir/lazy/Fir2IrLazyClass.kt | 2 ++ .../kotlin/fir/lazy/Fir2IrLazyProperty.kt | 2 ++ .../fir/lazy/Fir2IrLazySimpleFunction.kt | 2 ++ ...LightTreeBlackBoxCodegenTestGenerated.java | 6 +++++ ...hIrFakeOverrideGeneratorTestGenerated.java | 6 +++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 +++++ .../codegen/box/fakeOverride/kt65707.kt | 19 ++++++++++++++ .../JvmAbiConsistencyTestBoxGenerated.java | 6 +++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ 23 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/box/fakeOverride/kt65707.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java index 291053c3b4a..2c44a342e3c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java @@ -19388,6 +19388,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @Test + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @Test @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java index 0239b2a6686..f71989ade61 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java @@ -19388,6 +19388,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @Test + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @Test @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponents.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponents.kt index d00237bbebf..3ac07d82a87 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponents.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponents.kt @@ -51,6 +51,7 @@ interface Fir2IrComponents { val annotationGenerator: AnnotationGenerator val callGenerator: CallAndReferenceGenerator + @FirBasedFakeOverrideGenerator val fakeOverrideGenerator: FakeOverrideGenerator val delegatedMemberGenerator: DelegatedMemberGenerator val fakeOverrideBuilder: IrFakeOverrideBuilder diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponentsStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponentsStorage.kt index 9389ff463bb..6b5797db7a2 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponentsStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponentsStorage.kt @@ -66,6 +66,7 @@ class Fir2IrComponentsStorage( override val annotationGenerator: AnnotationGenerator = AnnotationGenerator(this) override val callGenerator: CallAndReferenceGenerator = CallAndReferenceGenerator(this, fir2IrVisitor, conversionScope) + @FirBasedFakeOverrideGenerator override val fakeOverrideGenerator: FakeOverrideGenerator = FakeOverrideGenerator(this, conversionScope) override val delegatedMemberGenerator: DelegatedMemberGenerator = DelegatedMemberGenerator(this) override val symbolsMappingForLazyClasses: Fir2IrSymbolsMappingForLazyClasses = Fir2IrSymbolsMappingForLazyClasses() diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index f757c565ab3..16697816cbc 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol import org.jetbrains.kotlin.fir.backend.generators.DataClassMembersGenerator +import org.jetbrains.kotlin.fir.backend.generators.FirBasedFakeOverrideGenerator import org.jetbrains.kotlin.fir.backend.generators.addDeclarationToParent import org.jetbrains.kotlin.fir.backend.generators.setParent import org.jetbrains.kotlin.fir.declarations.* @@ -67,6 +68,7 @@ class Fir2IrConverter( private val generatorExtensions = session.extensionService.declarationGenerators + @FirBasedFakeOverrideGenerator private var wereSourcesFakeOverridesBound = false private val postponedDeclarationsForFakeOverridesBinding = mutableListOf() @@ -91,13 +93,18 @@ class Fir2IrConverter( processFileAndClassMembers(firFile) } // 4. Override processing which sets overridden symbols for everything inside non-local regular classes - for (firFile in allFirFiles) { - bindFakeOverridesInFile(firFile) - } + @OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder + if (!configuration.useIrFakeOverrideBuilder) { + for (firFile in allFirFiles) { + bindFakeOverridesInFile(firFile) + } - wereSourcesFakeOverridesBound = true - fakeOverrideGenerator.bindOverriddenSymbols(postponedDeclarationsForFakeOverridesBinding) - postponedDeclarationsForFakeOverridesBinding.clear() + wereSourcesFakeOverridesBound = true + fakeOverrideGenerator.bindOverriddenSymbols(postponedDeclarationsForFakeOverridesBinding) + postponedDeclarationsForFakeOverridesBinding.clear() + } else { + require(postponedDeclarationsForFakeOverridesBinding.isEmpty()) + } // Do (3) and (4) for local classes encountered during (3) classifierStorage.processMembersOfClassesCreatedOnTheFly() @@ -127,6 +134,7 @@ class Fir2IrConverter( } } + @FirBasedFakeOverrideGenerator fun bindFakeOverridesOrPostpone(declarations: List) { // Do not run binding for lazy classes until all sources declarations are processed if (wereSourcesFakeOverridesBound) { @@ -280,6 +288,7 @@ class Fir2IrConverter( } if (!configuration.useIrFakeOverrideBuilder) { + @OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder fakeOverrideGenerator.computeFakeOverrides(klass, irClass, allDeclarations) } @@ -372,6 +381,7 @@ class Fir2IrConverter( return irClass } + @FirBasedFakeOverrideGenerator private fun bindFakeOverridesInFile(file: FirFile) { val irFile = declarationStorage.getIrFile(file) // `irFile` definitely is not a lazy class @@ -384,8 +394,10 @@ class Fir2IrConverter( } // `irClass` is a source class and definitely is not a lazy class - @OptIn(UnsafeDuringIrConstructionAPI::class) + // checked for useIrFakeOverrideBuilder + @OptIn(UnsafeDuringIrConstructionAPI::class, FirBasedFakeOverrideGenerator::class) fun bindFakeOverridesInClass(klass: IrClass) { + if (configuration.useIrFakeOverrideBuilder) return require(klass !is Fir2IrLazyClass) fakeOverrideGenerator.bindOverriddenSymbols(klass.declarations) delegatedMemberGenerator.bindDelegatedMembersOverriddenSymbols(klass) 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 7007cfdfe5e..29c2c1ab179 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 @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.analysis.checkers.isVisibleInClass +import org.jetbrains.kotlin.fir.backend.generators.FirBasedFakeOverrideGenerator import org.jetbrains.kotlin.fir.backend.generators.isExternalParent import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.buildProperty @@ -705,6 +706,7 @@ class Fir2IrDeclarationStorage( val irParent = findIrParent(property, fakeOverrideOwnerLookupTag) if (irParent?.isExternalParent() == true) { val symbols = createPropertySymbols(property, fakeOverrideOwnerLookupTag, parentIsExternal = true) + @OptIn(FirBasedFakeOverrideGenerator::class) // only for lazy val firForLazyProperty = calculateFirForLazyDeclaration( property, fakeOverrideOwnerLookupTag, irParent, fakeOverrideGenerator::createFirPropertyFakeOverrideIfNeeded @@ -1085,6 +1087,7 @@ class Fir2IrDeclarationStorage( val irParent = findIrParent(function, fakeOverrideOwnerLookupTag) if (irParent?.isExternalParent() == true) { val symbol = createMemberFunctionSymbol(function, fakeOverrideOwnerLookupTag, parentIsExternal = true) + @OptIn(FirBasedFakeOverrideGenerator::class) // only for lazy val firForLazyFunction = calculateFirForLazyDeclaration( function, fakeOverrideOwnerLookupTag, irParent, fakeOverrideGenerator::createFirFunctionFakeOverrideIfNeeded diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt index 9f359921b52..41145f7cf20 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.backend import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData.SymbolKind import org.jetbrains.kotlin.backend.common.serialization.kind import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator +import org.jetbrains.kotlin.fir.backend.generators.FirBasedFakeOverrideGenerator import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.classId import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider @@ -26,6 +27,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled +@OptIn(FirBasedFakeOverrideGenerator::class) // only for lazy class FirIrProvider(val components: Fir2IrComponents) : IrProvider { private val symbolProvider = components.session.symbolProvider private val declarationStorage = components.declarationStorage diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt index 5e414397d34..8173cfe4867 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt @@ -216,6 +216,7 @@ internal class ClassMemberGenerator( * recalculates this value from scratch. Also, it's quite meaningless in non-platform modules anyway. */ if (!configuration.useIrFakeOverrideBuilder) { + @OptIn(FirBasedFakeOverrideGenerator::class) irFunction.overriddenSymbols = firFunction.generateOverriddenFunctionSymbols(containingClass) } } @@ -234,6 +235,7 @@ internal class ClassMemberGenerator( * recalculates this value from scratch. Also, it's quite meaningless in non-platform modules anyway. */ if (!configuration.useIrFakeOverrideBuilder) { + @OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder irProperty.overriddenSymbols = property.generateOverriddenPropertySymbols(containingClass) } } @@ -348,6 +350,7 @@ internal class ClassMemberGenerator( } } if (containingClass != null && !components.configuration.useIrFakeOverrideBuilder) { + @OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder this.overriddenSymbols = property.generateOverriddenAccessorSymbols(containingClass, isGetter) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt index 038bdbd347e..64590e3afaf 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt @@ -197,7 +197,9 @@ class DelegatedMemberGenerator(private val components: Fir2IrComponents) : Fir2I return result } + @OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder fun bindDelegatedMembersOverriddenSymbols(irClass: IrClass) { + if (components.configuration.useIrFakeOverrideBuilder) return val superClasses by lazy(LazyThreadSafetyMode.NONE) { irClass.superTypes.mapNotNullTo(mutableSetOf()) { // All class symbols should be already bound at this moment 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 bd1e8e2fe67..48d1bebfb1a 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 @@ -31,6 +31,13 @@ import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name +@RequiresOptIn( + level = RequiresOptIn.Level.ERROR, + message = "This api is planned for deprecation. Make sure, you don't use it with useIrFakeOverrideBuilder=true and non-lazy classes" +) +annotation class FirBasedFakeOverrideGenerator + +@FirBasedFakeOverrideGenerator class FakeOverrideGenerator( private val components: Fir2IrComponents, private val conversionScope: Fir2IrConversionScope @@ -574,6 +581,7 @@ class FakeOverrideGenerator( } context(Fir2IrComponents) +@FirBasedFakeOverrideGenerator internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirClass, isGetter: Boolean): List { val scope = containingClass.unsubstitutedScope() scope.processPropertiesByName(name) {} @@ -603,6 +611,7 @@ internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirC } context(Fir2IrComponents) +@FirBasedFakeOverrideGenerator internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirClass): List { val superClasses = containingClass.getSuperTypesAsIrClasses() val overriddenSet = mutableSetOf() @@ -618,6 +627,7 @@ internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirC } context(Fir2IrComponents) +@FirBasedFakeOverrideGenerator internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(containingClass: FirClass): List { val superClasses = containingClass.getSuperTypesAsIrClasses() val overriddenSet = mutableSetOf() 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 b892e35670d..0f6e6d74e6b 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 @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub import org.jetbrains.kotlin.fir.java.declarations.FirJavaField import org.jetbrains.kotlin.fir.java.hasJvmFieldAnnotation import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass -import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyConstructor import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyProperty import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol @@ -472,6 +471,7 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi ) } if (correspondingProperty is Fir2IrLazyProperty && correspondingProperty.containingClass != null && !isFakeOverride && dispatchReceiverType != null) { + @OptIn(FirBasedFakeOverrideGenerator::class) // for lazy this.overriddenSymbols = correspondingProperty.fir.generateOverriddenAccessorSymbols( correspondingProperty.containingClass, !isSetter ) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index 6d5da13fcb9..aa613ec2fd6 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.lazy import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.* +import org.jetbrains.kotlin.fir.backend.generators.FirBasedFakeOverrideGenerator import org.jetbrains.kotlin.fir.backend.generators.isFakeOverride import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.* @@ -30,6 +31,7 @@ import org.jetbrains.kotlin.ir.util.isEnumClass import org.jetbrains.kotlin.ir.util.isObject import org.jetbrains.kotlin.name.Name +@OptIn(FirBasedFakeOverrideGenerator::class) // only for lazy class Fir2IrLazyClass( components: Fir2IrComponents, override val startOffset: Int, 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 e0afe4da653..a45826ce753 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 @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.isAnnotationClass import org.jetbrains.kotlin.fir.backend.* +import org.jetbrains.kotlin.fir.backend.generators.FirBasedFakeOverrideGenerator import org.jetbrains.kotlin.fir.backend.generators.generateOverriddenPropertySymbols import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirRegularClass @@ -30,6 +31,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.NameUtils import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource +@OptIn(FirBasedFakeOverrideGenerator::class) class Fir2IrLazyProperty( private val components: Fir2IrComponents, override val startOffset: Int, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt index 1600f657e40..a5acfe98063 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.lazy import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.contextReceiversForFunctionOrContainingProperty import org.jetbrains.kotlin.fir.backend.generators.Fir2IrCallableDeclarationsGenerator +import org.jetbrains.kotlin.fir.backend.generators.FirBasedFakeOverrideGenerator import org.jetbrains.kotlin.fir.backend.generators.generateOverriddenFunctionSymbols import org.jetbrains.kotlin.fir.backend.lazyMappedFunctionListVar import org.jetbrains.kotlin.fir.backend.toIrType @@ -24,6 +25,7 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource +@OptIn(FirBasedFakeOverrideGenerator::class) // only for lazy @Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE") // K2 warning suppression, TODO: KT-62472 class Fir2IrLazySimpleFunction( components: Fir2IrComponents, diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 2972483b292..a51493a28d8 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -19377,6 +19377,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @Test + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @Test @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java index b58cb02a96e..9ad91ed613c 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java @@ -19377,6 +19377,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @Test + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @Test @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 10539163fe2..4832b9de382 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -19377,6 +19377,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @Test + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @Test @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { diff --git a/compiler/testData/codegen/box/fakeOverride/kt65707.kt b/compiler/testData/codegen/box/fakeOverride/kt65707.kt new file mode 100644 index 00000000000..1d6db7c7ac8 --- /dev/null +++ b/compiler/testData/codegen/box/fakeOverride/kt65707.kt @@ -0,0 +1,19 @@ +// TARGET_BACKEND: JVM +// FILE: A.java +public interface A { + String f(); +} + +// FILE: B.kt +interface B : A + +// FILE: C.java +public interface C extends B { } + +// FILE: CImpl.kt +class CImpl(p: C) : C by p + +// FILE: box.kt +fun g(c: C): String = c.f() + +fun box(): String = g(CImpl { "OK" }) \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java index 45f0cf5202a..b95b6330750 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java @@ -19377,6 +19377,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @Test + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @Test @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 36bc6146036..f39117b9200 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -18513,6 +18513,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @Test + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @Test @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index dfadbb82016..da6cb27462f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -19377,6 +19377,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @Test + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @Test @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 37003f2a0b2..fac7ca60bc8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -19377,6 +19377,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @Test + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @Test @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 9b6597a3bbb..51a7b795180 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -16144,6 +16144,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt"); } + @TestMetadata("kt65707.kt") + public void testKt65707() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/kt65707.kt"); + } + @TestMetadata("methodOfAnyFromInterface.kt") public void testMethodOfAnyFromInterface() throws Exception { runTest("compiler/testData/codegen/box/fakeOverride/methodOfAnyFromInterface.kt");