From 95fbe293509e5ac5205fe297a80ca976a0943e7a Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Sat, 20 Oct 2018 10:22:23 +0300 Subject: [PATCH] JVM_IR: remove descriptors from JvmCoercionToUnitPatcher --- .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 6 +--- .../backend/jvm/lower/FileClassLowering.kt | 30 +++++++++++++++++++ .../jvm/lower/JvmCoercionToUnitPatcher.kt | 17 +++++++---- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 1165e3b95b1..25fbd9e61c8 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -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) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt index 5643eb798c1..b8d3c6b561a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt @@ -46,5 +46,35 @@ class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass { irFile.declarations.clear() irFile.declarations.addAll(classes) } + + fun createFileClass(irFile: IrFile, fileClassMembers: List): 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 + } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmCoercionToUnitPatcher.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmCoercionToUnitPatcher.kt index fbb66bb1e3d..0ee45f04826 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmCoercionToUnitPatcher.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmCoercionToUnitPatcher.kt @@ -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