JVM_IR: remove descriptors from JvmCoercionToUnitPatcher
This commit is contained in:
@@ -30,11 +30,7 @@ import org.jetbrains.kotlin.name.NameUtils
|
||||
class JvmLower(val context: JvmBackendContext) {
|
||||
fun lower(irFile: IrFile) {
|
||||
// TODO run lowering passes as callbacks in bottom-up visitor
|
||||
JvmCoercionToUnitPatcher(
|
||||
context.builtIns,
|
||||
context.irBuiltIns,
|
||||
TypeTranslator(context.ir.symbols.externalSymbolTable, context.state.languageVersionSettings)
|
||||
).lower(irFile)
|
||||
JvmCoercionToUnitPatcher(context).lower(irFile)
|
||||
FileClassLowering(context).lower(irFile)
|
||||
KCallableNamePropertyLowering(context).lower(irFile)
|
||||
|
||||
|
||||
+30
@@ -46,5 +46,35 @@ class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass {
|
||||
irFile.declarations.clear()
|
||||
irFile.declarations.addAll(classes)
|
||||
}
|
||||
|
||||
fun createFileClass(irFile: IrFile, fileClassMembers: List<IrDeclaration>): IrClass {
|
||||
val fileEntry = irFile.fileEntry
|
||||
val ktFile = context.psiSourceManager.getKtFile(fileEntry as PsiSourceManager.PsiFileEntry)
|
||||
?: throw AssertionError("Unexpected file entry: $fileEntry")
|
||||
val fileClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(ktFile)
|
||||
val descriptor = WrappedClassDescriptor(sourceElement = KotlinSourceElement(ktFile))
|
||||
return IrClassImpl(
|
||||
0, fileEntry.maxOffset,
|
||||
IrDeclarationOrigin.DEFINED,
|
||||
symbol = IrClassSymbolImpl(descriptor),
|
||||
name = fileClassInfo.fileClassFqName.shortName(),
|
||||
kind = ClassKind.CLASS,
|
||||
visibility = Visibilities.PUBLIC,
|
||||
modality = Modality.FINAL,
|
||||
isCompanion = false,
|
||||
isInner = false,
|
||||
isData = false,
|
||||
isExternal = false,
|
||||
isInline = false
|
||||
).apply {
|
||||
descriptor.bind(this)
|
||||
superTypes.add(context.irBuiltIns.anyType)
|
||||
parent = irFile
|
||||
declarations.addAll(fileClassMembers)
|
||||
// TODO: figure out why reparenting leads to failing tests.
|
||||
// fileClassMembers.forEach { it.parent = this }
|
||||
}
|
||||
// TODO file annotations
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+11
-6
@@ -6,25 +6,30 @@
|
||||
package org.jetbrains.kotlin.backend.jvm.lower
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.backend.common.utils.isSubtypeOf
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.types.toKotlinType
|
||||
import org.jetbrains.kotlin.ir.util.TypeTranslator
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.psi2ir.transformations.InsertImplicitCasts
|
||||
|
||||
class JvmCoercionToUnitPatcher(builtIns: KotlinBuiltIns, irBuiltIns: IrBuiltIns, typeTranslator: TypeTranslator) :
|
||||
InsertImplicitCasts(builtIns, irBuiltIns, typeTranslator), FileLoweringPass {
|
||||
class JvmCoercionToUnitPatcher(val context: JvmBackendContext) :
|
||||
InsertImplicitCasts(
|
||||
context.builtIns, context.irBuiltIns,
|
||||
TypeTranslator(context.ir.symbols.externalSymbolTable, context.state.languageVersionSettings)
|
||||
),
|
||||
FileLoweringPass {
|
||||
|
||||
override fun lower(irFile: IrFile) {
|
||||
irFile.transformChildrenVoid(this)
|
||||
}
|
||||
|
||||
override fun IrExpression.coerceToUnit(): IrExpression {
|
||||
if (isUnitSubtype(getKotlinType(this)) && this is IrCall) {
|
||||
return coerceToUnitIfNeeded(this.symbol.descriptor.original.returnType!!)
|
||||
if (type.isSubtypeOf(context.irBuiltIns.unitType) && this is IrCall) {
|
||||
return coerceToUnitIfNeeded(symbol.owner.returnType.toKotlinType())
|
||||
}
|
||||
|
||||
return this
|
||||
|
||||
Reference in New Issue
Block a user