[FIR2IR] Remove incorrect usages of Fir2IrDeclarationStorage.getOrCreateIrConstructor
See comment to the similar commit about `getOrCreateIrFunction` There are two added TODOs mentioned KT-62856, without them the following tests are failing: - `FirPsiJvmIrTextTestGenerated.FirProblems#testTypeParameterBounds` - `FirPsiJvmIrTextTestGenerated.Declarations#testKt52677`
This commit is contained in:
committed by
Space Team
parent
bced604b57
commit
3ae2a8387e
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.common.actualizer.FakeOverrideRebuilder
|
|||||||
import org.jetbrains.kotlin.backend.common.sourceElement
|
import org.jetbrains.kotlin.backend.common.sourceElement
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
@@ -233,7 +234,13 @@ class Fir2IrConverter(
|
|||||||
irClass.declarations.addAll(classifierStorage.getFieldsWithContextReceiversForClass(irClass, klass))
|
irClass.declarations.addAll(classifierStorage.getFieldsWithContextReceiversForClass(irClass, klass))
|
||||||
|
|
||||||
val irConstructor = klass.primaryConstructorIfAny(session)?.let {
|
val irConstructor = klass.primaryConstructorIfAny(session)?.let {
|
||||||
declarationStorage.getOrCreateIrConstructor(it.fir, irClass, isLocal = klass.isLocal)
|
if (klass.classKind == ClassKind.ANNOTATION_CLASS) {
|
||||||
|
// TODO: this branch should be removed after fix of KT-62856
|
||||||
|
@OptIn(GetOrCreateSensitiveAPI::class)
|
||||||
|
declarationStorage.getOrCreateIrConstructor(it.fir, irClass, isLocal = klass.isLocal)
|
||||||
|
} else {
|
||||||
|
declarationStorage.createAndCacheIrConstructor(it.fir, { irClass }, isLocal = klass.isLocal)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// At least on enum entry creation we may need a default constructor, so ctors should be converted first
|
// At least on enum entry creation we may need a default constructor, so ctors should be converted first
|
||||||
for (declaration in syntheticPropertiesLast(allDeclarations)) {
|
for (declaration in syntheticPropertiesLast(allDeclarations)) {
|
||||||
@@ -532,7 +539,14 @@ class Fir2IrConverter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
is FirConstructor -> if (!declaration.isPrimary) {
|
is FirConstructor -> if (!declaration.isPrimary) {
|
||||||
declarationStorage.getOrCreateIrConstructor(declaration, parent as IrClass, isLocal = isInLocalClass)
|
// the primary constructor was already created in `processClassMembers` function
|
||||||
|
if (containingClass?.classKind == ClassKind.ANNOTATION_CLASS) {
|
||||||
|
// TODO: this branch should be removed after fix of KT-62856
|
||||||
|
@OptIn(GetOrCreateSensitiveAPI::class)
|
||||||
|
declarationStorage.getOrCreateIrConstructor(declaration, parent as IrClass, isLocal = isInLocalClass)
|
||||||
|
} else {
|
||||||
|
declarationStorage.createAndCacheIrConstructor(declaration, { parent as IrClass }, isLocal = isInLocalClass)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
is FirEnumEntry -> {
|
is FirEnumEntry -> {
|
||||||
classifierStorage.getOrCreateIrEnumEntry(declaration, parent as IrClass)
|
classifierStorage.getOrCreateIrEnumEntry(declaration, parent as IrClass)
|
||||||
|
|||||||
@@ -375,6 +375,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetOrCreateSensitiveAPI
|
||||||
fun getOrCreateIrConstructor(
|
fun getOrCreateIrConstructor(
|
||||||
constructor: FirConstructor,
|
constructor: FirConstructor,
|
||||||
irParent: IrClass,
|
irParent: IrClass,
|
||||||
@@ -384,6 +385,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
return getOrCreateIrConstructor(constructor, { irParent }, predefinedOrigin, isLocal)
|
return getOrCreateIrConstructor(constructor, { irParent }, predefinedOrigin, isLocal)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetOrCreateSensitiveAPI
|
||||||
private fun getOrCreateIrConstructor(
|
private fun getOrCreateIrConstructor(
|
||||||
constructor: FirConstructor,
|
constructor: FirConstructor,
|
||||||
irParent: () -> IrClass,
|
irParent: () -> IrClass,
|
||||||
@@ -391,6 +393,15 @@ class Fir2IrDeclarationStorage(
|
|||||||
isLocal: Boolean = false,
|
isLocal: Boolean = false,
|
||||||
): IrConstructor {
|
): IrConstructor {
|
||||||
getCachedIrConstructorSymbol(constructor)?.ownerIfBound()?.let { return it }
|
getCachedIrConstructorSymbol(constructor)?.ownerIfBound()?.let { return it }
|
||||||
|
return createAndCacheIrConstructor(constructor, irParent, predefinedOrigin, isLocal)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createAndCacheIrConstructor(
|
||||||
|
constructor: FirConstructor,
|
||||||
|
irParent: () -> IrClass,
|
||||||
|
predefinedOrigin: IrDeclarationOrigin? = null,
|
||||||
|
isLocal: Boolean = false,
|
||||||
|
): IrConstructor {
|
||||||
// caching of created constructor is not called here, because `callablesGenerator` calls `cacheIrConstructor` by itself
|
// caching of created constructor is not called here, because `callablesGenerator` calls `cacheIrConstructor` by itself
|
||||||
return callablesGenerator.createIrConstructor(constructor, irParent(), predefinedOrigin, isLocal)
|
return callablesGenerator.createIrConstructor(constructor, irParent(), predefinedOrigin, isLocal)
|
||||||
}
|
}
|
||||||
@@ -400,6 +411,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
constructorCache[constructor] = irConstructor.symbol
|
constructorCache[constructor] = irConstructor.symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(GetOrCreateSensitiveAPI::class)
|
||||||
fun getIrConstructorSymbol(firConstructorSymbol: FirConstructorSymbol): IrConstructorSymbol {
|
fun getIrConstructorSymbol(firConstructorSymbol: FirConstructorSymbol): IrConstructorSymbol {
|
||||||
val fir = firConstructorSymbol.fir
|
val fir = firConstructorSymbol.fir
|
||||||
return getOrCreateIrConstructor(fir, { findIrParent(fir, fakeOverrideOwnerLookupTag = null) as IrClass }).symbol
|
return getOrCreateIrConstructor(fir, { findIrParent(fir, fakeOverrideOwnerLookupTag = null) as IrClass }).symbol
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ class FirIrProvider(val components: Fir2IrComponents) : IrProvider {
|
|||||||
val firDeclaration = findDeclarationByHash(firCandidates, signature.id) ?: return null
|
val firDeclaration = findDeclarationByHash(firCandidates, signature.id) ?: return null
|
||||||
val parent = parentClass ?: declarationStorage.getIrExternalPackageFragment(packageFqName, firDeclaration.moduleData)
|
val parent = parentClass ?: declarationStorage.getIrExternalPackageFragment(packageFqName, firDeclaration.moduleData)
|
||||||
|
|
||||||
|
@OptIn(GetOrCreateSensitiveAPI::class)
|
||||||
return when (kind) {
|
return when (kind) {
|
||||||
SymbolKind.CLASS_SYMBOL -> {
|
SymbolKind.CLASS_SYMBOL -> {
|
||||||
classifierStorage.getOrCreateIrClass((firDeclaration as FirRegularClass).symbol)
|
classifierStorage.getOrCreateIrClass((firDeclaration as FirRegularClass).symbol)
|
||||||
@@ -173,7 +174,6 @@ class FirIrProvider(val components: Fir2IrComponents) : IrProvider {
|
|||||||
}
|
}
|
||||||
SymbolKind.FUNCTION_SYMBOL -> {
|
SymbolKind.FUNCTION_SYMBOL -> {
|
||||||
val firSimpleFunction = firDeclaration as FirSimpleFunction
|
val firSimpleFunction = firDeclaration as FirSimpleFunction
|
||||||
@OptIn(GetOrCreateSensitiveAPI::class)
|
|
||||||
declarationStorage.getOrCreateIrFunction(firSimpleFunction, parent)
|
declarationStorage.getOrCreateIrFunction(firSimpleFunction, parent)
|
||||||
}
|
}
|
||||||
SymbolKind.PROPERTY_SYMBOL -> {
|
SymbolKind.PROPERTY_SYMBOL -> {
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ class Fir2IrLazyClass(
|
|||||||
scope.processDeclaredConstructors {
|
scope.processDeclaredConstructors {
|
||||||
val constructor = it.fir
|
val constructor = it.fir
|
||||||
if (shouldBuildStub(constructor)) {
|
if (shouldBuildStub(constructor)) {
|
||||||
|
@OptIn(GetOrCreateSensitiveAPI::class)
|
||||||
result += declarationStorage.getOrCreateIrConstructor(constructor, this, origin)
|
result += declarationStorage.getOrCreateIrConstructor(constructor, this, origin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user