JVM_IR: remove descriptors from JvmCoercionToUnitPatcher

This commit is contained in:
Georgy Bronnikov
2018-10-20 10:22:23 +03:00
parent c9477d94ad
commit 95fbe29350
3 changed files with 42 additions and 11 deletions
@@ -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)
@@ -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
}
}
@@ -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