[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
This commit is contained in:
committed by
Space Team
parent
74193aefb4
commit
9532172a22
+6
@@ -19388,6 +19388,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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
|
@Test
|
||||||
@TestMetadata("methodOfAnyFromInterface.kt")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
|
|||||||
+6
@@ -19388,6 +19388,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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
|
@Test
|
||||||
@TestMetadata("methodOfAnyFromInterface.kt")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ interface Fir2IrComponents {
|
|||||||
|
|
||||||
val annotationGenerator: AnnotationGenerator
|
val annotationGenerator: AnnotationGenerator
|
||||||
val callGenerator: CallAndReferenceGenerator
|
val callGenerator: CallAndReferenceGenerator
|
||||||
|
@FirBasedFakeOverrideGenerator
|
||||||
val fakeOverrideGenerator: FakeOverrideGenerator
|
val fakeOverrideGenerator: FakeOverrideGenerator
|
||||||
val delegatedMemberGenerator: DelegatedMemberGenerator
|
val delegatedMemberGenerator: DelegatedMemberGenerator
|
||||||
val fakeOverrideBuilder: IrFakeOverrideBuilder
|
val fakeOverrideBuilder: IrFakeOverrideBuilder
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ class Fir2IrComponentsStorage(
|
|||||||
|
|
||||||
override val annotationGenerator: AnnotationGenerator = AnnotationGenerator(this)
|
override val annotationGenerator: AnnotationGenerator = AnnotationGenerator(this)
|
||||||
override val callGenerator: CallAndReferenceGenerator = CallAndReferenceGenerator(this, fir2IrVisitor, conversionScope)
|
override val callGenerator: CallAndReferenceGenerator = CallAndReferenceGenerator(this, fir2IrVisitor, conversionScope)
|
||||||
|
@FirBasedFakeOverrideGenerator
|
||||||
override val fakeOverrideGenerator: FakeOverrideGenerator = FakeOverrideGenerator(this, conversionScope)
|
override val fakeOverrideGenerator: FakeOverrideGenerator = FakeOverrideGenerator(this, conversionScope)
|
||||||
override val delegatedMemberGenerator: DelegatedMemberGenerator = DelegatedMemberGenerator(this)
|
override val delegatedMemberGenerator: DelegatedMemberGenerator = DelegatedMemberGenerator(this)
|
||||||
override val symbolsMappingForLazyClasses: Fir2IrSymbolsMappingForLazyClasses = Fir2IrSymbolsMappingForLazyClasses()
|
override val symbolsMappingForLazyClasses: Fir2IrSymbolsMappingForLazyClasses = Fir2IrSymbolsMappingForLazyClasses()
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.descriptors.Modality
|
|||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
|
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.backend.generators.DataClassMembersGenerator
|
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.addDeclarationToParent
|
||||||
import org.jetbrains.kotlin.fir.backend.generators.setParent
|
import org.jetbrains.kotlin.fir.backend.generators.setParent
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
@@ -67,6 +68,7 @@ class Fir2IrConverter(
|
|||||||
|
|
||||||
private val generatorExtensions = session.extensionService.declarationGenerators
|
private val generatorExtensions = session.extensionService.declarationGenerators
|
||||||
|
|
||||||
|
@FirBasedFakeOverrideGenerator
|
||||||
private var wereSourcesFakeOverridesBound = false
|
private var wereSourcesFakeOverridesBound = false
|
||||||
private val postponedDeclarationsForFakeOverridesBinding = mutableListOf<IrDeclaration>()
|
private val postponedDeclarationsForFakeOverridesBinding = mutableListOf<IrDeclaration>()
|
||||||
|
|
||||||
@@ -91,13 +93,18 @@ class Fir2IrConverter(
|
|||||||
processFileAndClassMembers(firFile)
|
processFileAndClassMembers(firFile)
|
||||||
}
|
}
|
||||||
// 4. Override processing which sets overridden symbols for everything inside non-local regular classes
|
// 4. Override processing which sets overridden symbols for everything inside non-local regular classes
|
||||||
for (firFile in allFirFiles) {
|
@OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder
|
||||||
bindFakeOverridesInFile(firFile)
|
if (!configuration.useIrFakeOverrideBuilder) {
|
||||||
}
|
for (firFile in allFirFiles) {
|
||||||
|
bindFakeOverridesInFile(firFile)
|
||||||
|
}
|
||||||
|
|
||||||
wereSourcesFakeOverridesBound = true
|
wereSourcesFakeOverridesBound = true
|
||||||
fakeOverrideGenerator.bindOverriddenSymbols(postponedDeclarationsForFakeOverridesBinding)
|
fakeOverrideGenerator.bindOverriddenSymbols(postponedDeclarationsForFakeOverridesBinding)
|
||||||
postponedDeclarationsForFakeOverridesBinding.clear()
|
postponedDeclarationsForFakeOverridesBinding.clear()
|
||||||
|
} else {
|
||||||
|
require(postponedDeclarationsForFakeOverridesBinding.isEmpty())
|
||||||
|
}
|
||||||
|
|
||||||
// Do (3) and (4) for local classes encountered during (3)
|
// Do (3) and (4) for local classes encountered during (3)
|
||||||
classifierStorage.processMembersOfClassesCreatedOnTheFly()
|
classifierStorage.processMembersOfClassesCreatedOnTheFly()
|
||||||
@@ -127,6 +134,7 @@ class Fir2IrConverter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@FirBasedFakeOverrideGenerator
|
||||||
fun bindFakeOverridesOrPostpone(declarations: List<IrDeclaration>) {
|
fun bindFakeOverridesOrPostpone(declarations: List<IrDeclaration>) {
|
||||||
// Do not run binding for lazy classes until all sources declarations are processed
|
// Do not run binding for lazy classes until all sources declarations are processed
|
||||||
if (wereSourcesFakeOverridesBound) {
|
if (wereSourcesFakeOverridesBound) {
|
||||||
@@ -280,6 +288,7 @@ class Fir2IrConverter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!configuration.useIrFakeOverrideBuilder) {
|
if (!configuration.useIrFakeOverrideBuilder) {
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder
|
||||||
fakeOverrideGenerator.computeFakeOverrides(klass, irClass, allDeclarations)
|
fakeOverrideGenerator.computeFakeOverrides(klass, irClass, allDeclarations)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,6 +381,7 @@ class Fir2IrConverter(
|
|||||||
return irClass
|
return irClass
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@FirBasedFakeOverrideGenerator
|
||||||
private fun bindFakeOverridesInFile(file: FirFile) {
|
private fun bindFakeOverridesInFile(file: FirFile) {
|
||||||
val irFile = declarationStorage.getIrFile(file)
|
val irFile = declarationStorage.getIrFile(file)
|
||||||
// `irFile` definitely is not a lazy class
|
// `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
|
// `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) {
|
fun bindFakeOverridesInClass(klass: IrClass) {
|
||||||
|
if (configuration.useIrFakeOverrideBuilder) return
|
||||||
require(klass !is Fir2IrLazyClass)
|
require(klass !is Fir2IrLazyClass)
|
||||||
fakeOverrideGenerator.bindOverriddenSymbols(klass.declarations)
|
fakeOverrideGenerator.bindOverriddenSymbols(klass.declarations)
|
||||||
delegatedMemberGenerator.bindDelegatedMembersOverriddenSymbols(klass)
|
delegatedMemberGenerator.bindDelegatedMembersOverriddenSymbols(klass)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
|||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
|
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.isVisibleInClass
|
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.backend.generators.isExternalParent
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||||
@@ -705,6 +706,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
val irParent = findIrParent(property, fakeOverrideOwnerLookupTag)
|
val irParent = findIrParent(property, fakeOverrideOwnerLookupTag)
|
||||||
if (irParent?.isExternalParent() == true) {
|
if (irParent?.isExternalParent() == true) {
|
||||||
val symbols = createPropertySymbols(property, fakeOverrideOwnerLookupTag, parentIsExternal = true)
|
val symbols = createPropertySymbols(property, fakeOverrideOwnerLookupTag, parentIsExternal = true)
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class) // only for lazy
|
||||||
val firForLazyProperty = calculateFirForLazyDeclaration(
|
val firForLazyProperty = calculateFirForLazyDeclaration(
|
||||||
property, fakeOverrideOwnerLookupTag, irParent,
|
property, fakeOverrideOwnerLookupTag, irParent,
|
||||||
fakeOverrideGenerator::createFirPropertyFakeOverrideIfNeeded
|
fakeOverrideGenerator::createFirPropertyFakeOverrideIfNeeded
|
||||||
@@ -1085,6 +1087,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
val irParent = findIrParent(function, fakeOverrideOwnerLookupTag)
|
val irParent = findIrParent(function, fakeOverrideOwnerLookupTag)
|
||||||
if (irParent?.isExternalParent() == true) {
|
if (irParent?.isExternalParent() == true) {
|
||||||
val symbol = createMemberFunctionSymbol(function, fakeOverrideOwnerLookupTag, parentIsExternal = true)
|
val symbol = createMemberFunctionSymbol(function, fakeOverrideOwnerLookupTag, parentIsExternal = true)
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class) // only for lazy
|
||||||
val firForLazyFunction = calculateFirForLazyDeclaration(
|
val firForLazyFunction = calculateFirForLazyDeclaration(
|
||||||
function, fakeOverrideOwnerLookupTag, irParent,
|
function, fakeOverrideOwnerLookupTag, irParent,
|
||||||
fakeOverrideGenerator::createFirFunctionFakeOverrideIfNeeded
|
fakeOverrideGenerator::createFirFunctionFakeOverrideIfNeeded
|
||||||
|
|||||||
@@ -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.encodings.BinarySymbolData.SymbolKind
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.kind
|
import org.jetbrains.kotlin.backend.common.serialization.kind
|
||||||
import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
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.name.Name
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
|
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
|
||||||
|
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class) // only for lazy
|
||||||
class FirIrProvider(val components: Fir2IrComponents) : IrProvider {
|
class FirIrProvider(val components: Fir2IrComponents) : IrProvider {
|
||||||
private val symbolProvider = components.session.symbolProvider
|
private val symbolProvider = components.session.symbolProvider
|
||||||
private val declarationStorage = components.declarationStorage
|
private val declarationStorage = components.declarationStorage
|
||||||
|
|||||||
+3
@@ -216,6 +216,7 @@ internal class ClassMemberGenerator(
|
|||||||
* recalculates this value from scratch. Also, it's quite meaningless in non-platform modules anyway.
|
* recalculates this value from scratch. Also, it's quite meaningless in non-platform modules anyway.
|
||||||
*/
|
*/
|
||||||
if (!configuration.useIrFakeOverrideBuilder) {
|
if (!configuration.useIrFakeOverrideBuilder) {
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class)
|
||||||
irFunction.overriddenSymbols = firFunction.generateOverriddenFunctionSymbols(containingClass)
|
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.
|
* recalculates this value from scratch. Also, it's quite meaningless in non-platform modules anyway.
|
||||||
*/
|
*/
|
||||||
if (!configuration.useIrFakeOverrideBuilder) {
|
if (!configuration.useIrFakeOverrideBuilder) {
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder
|
||||||
irProperty.overriddenSymbols = property.generateOverriddenPropertySymbols(containingClass)
|
irProperty.overriddenSymbols = property.generateOverriddenPropertySymbols(containingClass)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -348,6 +350,7 @@ internal class ClassMemberGenerator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (containingClass != null && !components.configuration.useIrFakeOverrideBuilder) {
|
if (containingClass != null && !components.configuration.useIrFakeOverrideBuilder) {
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder
|
||||||
this.overriddenSymbols = property.generateOverriddenAccessorSymbols(containingClass, isGetter)
|
this.overriddenSymbols = property.generateOverriddenAccessorSymbols(containingClass, isGetter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
@@ -197,7 +197,9 @@ class DelegatedMemberGenerator(private val components: Fir2IrComponents) : Fir2I
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class) // checked for useIrFakeOverrideBuilder
|
||||||
fun bindDelegatedMembersOverriddenSymbols(irClass: IrClass) {
|
fun bindDelegatedMembersOverriddenSymbols(irClass: IrClass) {
|
||||||
|
if (components.configuration.useIrFakeOverrideBuilder) return
|
||||||
val superClasses by lazy(LazyThreadSafetyMode.NONE) {
|
val superClasses by lazy(LazyThreadSafetyMode.NONE) {
|
||||||
irClass.superTypes.mapNotNullTo(mutableSetOf()) {
|
irClass.superTypes.mapNotNullTo(mutableSetOf()) {
|
||||||
// All class symbols should be already bound at this moment
|
// All class symbols should be already bound at this moment
|
||||||
|
|||||||
+10
@@ -31,6 +31,13 @@ import org.jetbrains.kotlin.ir.util.parentAsClass
|
|||||||
import org.jetbrains.kotlin.name.CallableId
|
import org.jetbrains.kotlin.name.CallableId
|
||||||
import org.jetbrains.kotlin.name.Name
|
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(
|
class FakeOverrideGenerator(
|
||||||
private val components: Fir2IrComponents,
|
private val components: Fir2IrComponents,
|
||||||
private val conversionScope: Fir2IrConversionScope
|
private val conversionScope: Fir2IrConversionScope
|
||||||
@@ -574,6 +581,7 @@ class FakeOverrideGenerator(
|
|||||||
}
|
}
|
||||||
|
|
||||||
context(Fir2IrComponents)
|
context(Fir2IrComponents)
|
||||||
|
@FirBasedFakeOverrideGenerator
|
||||||
internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirClass, isGetter: Boolean): List<IrSimpleFunctionSymbol> {
|
internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirClass, isGetter: Boolean): List<IrSimpleFunctionSymbol> {
|
||||||
val scope = containingClass.unsubstitutedScope()
|
val scope = containingClass.unsubstitutedScope()
|
||||||
scope.processPropertiesByName(name) {}
|
scope.processPropertiesByName(name) {}
|
||||||
@@ -603,6 +611,7 @@ internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirC
|
|||||||
}
|
}
|
||||||
|
|
||||||
context(Fir2IrComponents)
|
context(Fir2IrComponents)
|
||||||
|
@FirBasedFakeOverrideGenerator
|
||||||
internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirClass): List<IrPropertySymbol> {
|
internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirClass): List<IrPropertySymbol> {
|
||||||
val superClasses = containingClass.getSuperTypesAsIrClasses()
|
val superClasses = containingClass.getSuperTypesAsIrClasses()
|
||||||
val overriddenSet = mutableSetOf<IrPropertySymbol>()
|
val overriddenSet = mutableSetOf<IrPropertySymbol>()
|
||||||
@@ -618,6 +627,7 @@ internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirC
|
|||||||
}
|
}
|
||||||
|
|
||||||
context(Fir2IrComponents)
|
context(Fir2IrComponents)
|
||||||
|
@FirBasedFakeOverrideGenerator
|
||||||
internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(containingClass: FirClass): List<IrSimpleFunctionSymbol> {
|
internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(containingClass: FirClass): List<IrSimpleFunctionSymbol> {
|
||||||
val superClasses = containingClass.getSuperTypesAsIrClasses()
|
val superClasses = containingClass.getSuperTypesAsIrClasses()
|
||||||
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
|
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
|
||||||
|
|||||||
+1
-1
@@ -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.declarations.FirJavaField
|
||||||
import org.jetbrains.kotlin.fir.java.hasJvmFieldAnnotation
|
import org.jetbrains.kotlin.fir.java.hasJvmFieldAnnotation
|
||||||
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass
|
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.lazy.Fir2IrLazyProperty
|
||||||
import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol
|
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) {
|
if (correspondingProperty is Fir2IrLazyProperty && correspondingProperty.containingClass != null && !isFakeOverride && dispatchReceiverType != null) {
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class) // for lazy
|
||||||
this.overriddenSymbols = correspondingProperty.fir.generateOverriddenAccessorSymbols(
|
this.overriddenSymbols = correspondingProperty.fir.generateOverriddenAccessorSymbols(
|
||||||
correspondingProperty.containingClass, !isSetter
|
correspondingProperty.containingClass, !isSetter
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.lazy
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.backend.*
|
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.backend.generators.isFakeOverride
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
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.ir.util.isObject
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class) // only for lazy
|
||||||
class Fir2IrLazyClass(
|
class Fir2IrLazyClass(
|
||||||
components: Fir2IrComponents,
|
components: Fir2IrComponents,
|
||||||
override val startOffset: Int,
|
override val startOffset: Int,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.Modality
|
|||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.isAnnotationClass
|
import org.jetbrains.kotlin.descriptors.isAnnotationClass
|
||||||
import org.jetbrains.kotlin.fir.backend.*
|
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.backend.generators.generateOverriddenPropertySymbols
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
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.name.NameUtils
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
|
||||||
|
@OptIn(FirBasedFakeOverrideGenerator::class)
|
||||||
class Fir2IrLazyProperty(
|
class Fir2IrLazyProperty(
|
||||||
private val components: Fir2IrComponents,
|
private val components: Fir2IrComponents,
|
||||||
override val startOffset: Int,
|
override val startOffset: Int,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.lazy
|
|||||||
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
||||||
import org.jetbrains.kotlin.fir.backend.contextReceiversForFunctionOrContainingProperty
|
import org.jetbrains.kotlin.fir.backend.contextReceiversForFunctionOrContainingProperty
|
||||||
import org.jetbrains.kotlin.fir.backend.generators.Fir2IrCallableDeclarationsGenerator
|
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.generators.generateOverriddenFunctionSymbols
|
||||||
import org.jetbrains.kotlin.fir.backend.lazyMappedFunctionListVar
|
import org.jetbrains.kotlin.fir.backend.lazyMappedFunctionListVar
|
||||||
import org.jetbrains.kotlin.fir.backend.toIrType
|
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.name.Name
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
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
|
@Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE") // K2 warning suppression, TODO: KT-62472
|
||||||
class Fir2IrLazySimpleFunction(
|
class Fir2IrLazySimpleFunction(
|
||||||
components: Fir2IrComponents,
|
components: Fir2IrComponents,
|
||||||
|
|||||||
+6
@@ -19377,6 +19377,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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
|
@Test
|
||||||
@TestMetadata("methodOfAnyFromInterface.kt")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
|
|||||||
+6
@@ -19377,6 +19377,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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
|
@Test
|
||||||
@TestMetadata("methodOfAnyFromInterface.kt")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
|
|||||||
+6
@@ -19377,6 +19377,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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
|
@Test
|
||||||
@TestMetadata("methodOfAnyFromInterface.kt")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
|
|||||||
@@ -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" })
|
||||||
+6
@@ -19377,6 +19377,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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
|
@Test
|
||||||
@TestMetadata("methodOfAnyFromInterface.kt")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
|
|||||||
+6
@@ -18513,6 +18513,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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
|
@Test
|
||||||
@TestMetadata("methodOfAnyFromInterface.kt")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
|
|||||||
+6
@@ -19377,6 +19377,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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
|
@Test
|
||||||
@TestMetadata("methodOfAnyFromInterface.kt")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
|
|||||||
+6
@@ -19377,6 +19377,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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
|
@Test
|
||||||
@TestMetadata("methodOfAnyFromInterface.kt")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
|
|||||||
+5
@@ -16144,6 +16144,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/fakeOverride/kt65695.kt");
|
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")
|
@TestMetadata("methodOfAnyFromInterface.kt")
|
||||||
public void testMethodOfAnyFromInterface() throws Exception {
|
public void testMethodOfAnyFromInterface() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/fakeOverride/methodOfAnyFromInterface.kt");
|
runTest("compiler/testData/codegen/box/fakeOverride/methodOfAnyFromInterface.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user