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) {
|
class JvmLower(val context: JvmBackendContext) {
|
||||||
fun lower(irFile: IrFile) {
|
fun lower(irFile: IrFile) {
|
||||||
// TODO run lowering passes as callbacks in bottom-up visitor
|
// TODO run lowering passes as callbacks in bottom-up visitor
|
||||||
JvmCoercionToUnitPatcher(
|
JvmCoercionToUnitPatcher(context).lower(irFile)
|
||||||
context.builtIns,
|
|
||||||
context.irBuiltIns,
|
|
||||||
TypeTranslator(context.ir.symbols.externalSymbolTable, context.state.languageVersionSettings)
|
|
||||||
).lower(irFile)
|
|
||||||
FileClassLowering(context).lower(irFile)
|
FileClassLowering(context).lower(irFile)
|
||||||
KCallableNamePropertyLowering(context).lower(irFile)
|
KCallableNamePropertyLowering(context).lower(irFile)
|
||||||
|
|
||||||
|
|||||||
+30
@@ -46,5 +46,35 @@ class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass {
|
|||||||
irFile.declarations.clear()
|
irFile.declarations.clear()
|
||||||
irFile.declarations.addAll(classes)
|
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
|
package org.jetbrains.kotlin.backend.jvm.lower
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
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.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
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.util.TypeTranslator
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.psi2ir.transformations.InsertImplicitCasts
|
import org.jetbrains.kotlin.psi2ir.transformations.InsertImplicitCasts
|
||||||
|
|
||||||
class JvmCoercionToUnitPatcher(builtIns: KotlinBuiltIns, irBuiltIns: IrBuiltIns, typeTranslator: TypeTranslator) :
|
class JvmCoercionToUnitPatcher(val context: JvmBackendContext) :
|
||||||
InsertImplicitCasts(builtIns, irBuiltIns, typeTranslator), FileLoweringPass {
|
InsertImplicitCasts(
|
||||||
|
context.builtIns, context.irBuiltIns,
|
||||||
|
TypeTranslator(context.ir.symbols.externalSymbolTable, context.state.languageVersionSettings)
|
||||||
|
),
|
||||||
|
FileLoweringPass {
|
||||||
|
|
||||||
override fun lower(irFile: IrFile) {
|
override fun lower(irFile: IrFile) {
|
||||||
irFile.transformChildrenVoid(this)
|
irFile.transformChildrenVoid(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun IrExpression.coerceToUnit(): IrExpression {
|
override fun IrExpression.coerceToUnit(): IrExpression {
|
||||||
if (isUnitSubtype(getKotlinType(this)) && this is IrCall) {
|
if (type.isSubtypeOf(context.irBuiltIns.unitType) && this is IrCall) {
|
||||||
return coerceToUnitIfNeeded(this.symbol.descriptor.original.returnType!!)
|
return coerceToUnitIfNeeded(symbol.owner.returnType.toKotlinType())
|
||||||
}
|
}
|
||||||
|
|
||||||
return this
|
return this
|
||||||
|
|||||||
Reference in New Issue
Block a user