[fir2ir] Just refactoring before classes receiver fix for evaluator

KT-61144
This commit is contained in:
Alexey Merkulov
2023-07-27 13:37:09 +02:00
committed by Space Team
parent 7be877ce74
commit c520aeb5aa
4 changed files with 36 additions and 35 deletions
@@ -37,6 +37,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.utils.addToStdlib.getOrPut
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.addToStdlib.runUnless
@@ -135,40 +136,34 @@ class Fir2IrClassifierStorage(
preCacheTypeParameters(klass, symbol)
setTypeParameters(klass)
if (klass is FirRegularClass) {
val fieldsForContextReceiversOfCurrentClass = createContextReceiverFields(klass)
if (fieldsForContextReceiversOfCurrentClass.isNotEmpty()) {
declarations.addAll(fieldsForContextReceiversOfCurrentClass)
fieldsForContextReceivers[this] = fieldsForContextReceiversOfCurrentClass
val fieldsForContextReceiversOfCurrentClass = getFieldsWithContextReceiversForClass(this, klass)
declarations.addAll(fieldsForContextReceiversOfCurrentClass)
}
}
fun getFieldsWithContextReceiversForClass(irClass: IrClass, klass: FirClass): List<IrField> {
if (klass !is FirRegularClass || klass.contextReceivers.isEmpty()) return emptyList()
return fieldsForContextReceivers.getOrPut(irClass) {
klass.contextReceivers.withIndex().map { (index, contextReceiver) ->
components.irFactory.createField(
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
origin = IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER,
name = Name.identifier("contextReceiverField$index"),
visibility = DescriptorVisibilities.PRIVATE,
symbol = IrFieldSymbolImpl(),
type = contextReceiver.typeRef.toIrType(),
isFinal = true,
isStatic = false,
isExternal = false,
).also {
it.parent = irClass
}
}
}
}
fun IrClass.createContextReceiverFields(klass: FirRegularClass): List<IrField> {
if (klass.contextReceivers.isEmpty()) return emptyList()
val contextReceiverFields = mutableListOf<IrField>()
for ((index, contextReceiver) in klass.contextReceivers.withIndex()) {
val irField = components.irFactory.createField(
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
origin = IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER,
name = Name.identifier("contextReceiverField$index"),
visibility = DescriptorVisibilities.PRIVATE,
symbol = IrFieldSymbolImpl(),
type = contextReceiver.typeRef.toIrType(),
isFinal = true,
isStatic = false,
isExternal = false,
)
irField.parent = this@createContextReceiverFields
contextReceiverFields.add(irField)
}
return contextReceiverFields
}
fun getFieldsWithContextReceiversForClass(irClass: IrClass): List<IrField>? = fieldsForContextReceivers[irClass]
private fun IrClass.declareSupertypes(klass: FirClass) {
superTypes = klass.superTypeRefs.map { superTypeRef -> superTypeRef.toIrType() }
}
@@ -691,8 +691,11 @@ class Fir2IrVisitor(
IrGetValueImpl(startOffset, endOffset, constructorParameter.type, constructorParameter.symbol)
} else {
val contextReceivers =
components.classifierStorage.getFieldsWithContextReceiversForClass(irClass)
?: error("Not defined context receivers for $irClass")
components.classifierStorage.getFieldsWithContextReceiversForClass(irClass, firClass)
require(contextReceivers.size > calleeReference.contextReceiverNumber) {
"Not defined context receiver #${calleeReference.contextReceiverNumber} for $irClass. " +
"Context receivers found: $contextReceivers"
}
IrGetFieldImpl(
startOffset, endOffset, contextReceivers[calleeReference.contextReceiverNumber].symbol,
@@ -130,13 +130,16 @@ internal class ClassMemberGenerator(
if (containingClass is FirRegularClass && containingClass.contextReceivers.isNotEmpty()) {
val contextReceiverFields =
components.classifierStorage.getFieldsWithContextReceiversForClass(irClass)
?: error("Not found context receiver fields")
components.classifierStorage.getFieldsWithContextReceiversForClass(irClass, containingClass)
val thisParameter =
conversionScope.dispatchReceiverParameter(irClass) ?: error("No found this parameter for $irClass")
for (index in containingClass.contextReceivers.indices) {
require(contextReceiverFields.size > index) {
"Not defined context receiver #${index} for $irClass. " +
"Context receivers found: $contextReceiverFields"
}
val irValueParameter = valueParameters[index]
body.statements.add(
IrSetFieldImpl(
@@ -209,7 +209,7 @@ class Fir2IrLazyClass(
addDeclarationsFromScope(fir.staticScope(session, scopeSession))
with(classifierStorage) {
result.addAll(this@Fir2IrLazyClass.createContextReceiverFields(fir))
result.addAll(getFieldsWithContextReceiversForClass(this@Fir2IrLazyClass, fir))
}
for (name in scope.getCallableNames()) {