[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.Name
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.name.StandardClassIds 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.runIf
import org.jetbrains.kotlin.utils.addToStdlib.runUnless import org.jetbrains.kotlin.utils.addToStdlib.runUnless
@@ -135,40 +136,34 @@ class Fir2IrClassifierStorage(
preCacheTypeParameters(klass, symbol) preCacheTypeParameters(klass, symbol)
setTypeParameters(klass) setTypeParameters(klass)
if (klass is FirRegularClass) { if (klass is FirRegularClass) {
val fieldsForContextReceiversOfCurrentClass = createContextReceiverFields(klass) val fieldsForContextReceiversOfCurrentClass = getFieldsWithContextReceiversForClass(this, klass)
if (fieldsForContextReceiversOfCurrentClass.isNotEmpty()) { declarations.addAll(fieldsForContextReceiversOfCurrentClass)
declarations.addAll(fieldsForContextReceiversOfCurrentClass) }
fieldsForContextReceivers[this] = 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) { private fun IrClass.declareSupertypes(klass: FirClass) {
superTypes = klass.superTypeRefs.map { superTypeRef -> superTypeRef.toIrType() } superTypes = klass.superTypeRefs.map { superTypeRef -> superTypeRef.toIrType() }
} }
@@ -691,8 +691,11 @@ class Fir2IrVisitor(
IrGetValueImpl(startOffset, endOffset, constructorParameter.type, constructorParameter.symbol) IrGetValueImpl(startOffset, endOffset, constructorParameter.type, constructorParameter.symbol)
} else { } else {
val contextReceivers = val contextReceivers =
components.classifierStorage.getFieldsWithContextReceiversForClass(irClass) components.classifierStorage.getFieldsWithContextReceiversForClass(irClass, firClass)
?: error("Not defined context receivers for $irClass") require(contextReceivers.size > calleeReference.contextReceiverNumber) {
"Not defined context receiver #${calleeReference.contextReceiverNumber} for $irClass. " +
"Context receivers found: $contextReceivers"
}
IrGetFieldImpl( IrGetFieldImpl(
startOffset, endOffset, contextReceivers[calleeReference.contextReceiverNumber].symbol, startOffset, endOffset, contextReceivers[calleeReference.contextReceiverNumber].symbol,
@@ -130,13 +130,16 @@ internal class ClassMemberGenerator(
if (containingClass is FirRegularClass && containingClass.contextReceivers.isNotEmpty()) { if (containingClass is FirRegularClass && containingClass.contextReceivers.isNotEmpty()) {
val contextReceiverFields = val contextReceiverFields =
components.classifierStorage.getFieldsWithContextReceiversForClass(irClass) components.classifierStorage.getFieldsWithContextReceiversForClass(irClass, containingClass)
?: error("Not found context receiver fields")
val thisParameter = val thisParameter =
conversionScope.dispatchReceiverParameter(irClass) ?: error("No found this parameter for $irClass") conversionScope.dispatchReceiverParameter(irClass) ?: error("No found this parameter for $irClass")
for (index in containingClass.contextReceivers.indices) { 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] val irValueParameter = valueParameters[index]
body.statements.add( body.statements.add(
IrSetFieldImpl( IrSetFieldImpl(
@@ -209,7 +209,7 @@ class Fir2IrLazyClass(
addDeclarationsFromScope(fir.staticScope(session, scopeSession)) addDeclarationsFromScope(fir.staticScope(session, scopeSession))
with(classifierStorage) { with(classifierStorage) {
result.addAll(this@Fir2IrLazyClass.createContextReceiverFields(fir)) result.addAll(getFieldsWithContextReceiversForClass(this@Fir2IrLazyClass, fir))
} }
for (name in scope.getCallableNames()) { for (name in scope.getCallableNames()) {