[fir2ir] Just refactoring before classes receiver fix for evaluator
KT-61144
This commit is contained in:
committed by
Space Team
parent
7be877ce74
commit
c520aeb5aa
+25
-30
@@ -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,
|
||||||
|
|||||||
+5
-2
@@ -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()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user