From 32d0c992894b485b71263089ec35024662fbc83d Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 7 Dec 2020 20:02:52 +0100 Subject: [PATCH] Implement metadata handling for IR scripts --- .../src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt | 6 ++++++ .../jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt | 2 ++ .../jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt | 5 +++++ .../jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt | 2 +- .../jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt | 3 +++ .../src/org/jetbrains/kotlin/ir/declarations/IrScript.kt | 2 +- .../jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt | 2 ++ .../kotlin/types/TypeSystemCommonBackendContext.kt | 1 + 8 files changed, 21 insertions(+), 2 deletions(-) diff --git a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt index d1483bf3ff6..e39ea2c5c5c 100644 --- a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt +++ b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt @@ -116,6 +116,12 @@ object AbstractTypeMapper { return asmType } + typeConstructor.isScript() -> { + val asmType = AsmTypes.JAVA_CLASS_TYPE + with(context) { sw?.writeGenericType(type, asmType, mode) } + return asmType + } + typeConstructor.isTypeParameter() -> { val typeParameter = typeConstructor as TypeParameterMarker return mapType(context, typeParameter.representativeUpperBound(), mode, null).also { asmType -> diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt index 4650709cff2..8ffbb80a85a 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt @@ -210,6 +210,8 @@ class ConeTypeSystemCommonBackendContextForTypeMapping( } } + override fun TypeConstructorMarker.isScript(): Boolean = false + override fun SimpleTypeMarker.isSuspendFunction(): Boolean { require(this is ConeSimpleKotlinType) return isSuspendFunctionType(session) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt index 58e3d4985e8..034ca808618 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrPackageFragment import org.jetbrains.kotlin.ir.declarations.IrTypeParameter import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* @@ -221,6 +222,10 @@ private class IrTypeCheckerContextForTypeMapping( } } + override fun TypeConstructorMarker.isScript(): Boolean { + return this is IrScriptSymbol + } + override fun SimpleTypeMarker.isSuspendFunction(): Boolean { require(this is IrSimpleType) return isSuspendFunctionImpl() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt index 501929fb039..3c03db79421 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt @@ -77,6 +77,7 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext) { }.also { irScriptClass -> irScriptClass.superTypes += context.irBuiltIns.anyType irScriptClass.parent = irFile + irScriptClass.metadata = irScript.metadata } } @@ -159,7 +160,6 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext) { } irScriptClass.annotations += (irScriptClass.parent as IrFile).annotations - irScriptClass.metadata = (irScriptClass.parent as IrFile).metadata irScript.resultProperty?.owner?.let { irResultProperty -> context.state.scriptSpecific.resultFieldName = irResultProperty.name.identifier diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt index 40537f04296..6ff3a093fc7 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.ParameterDescriptor import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.ir.assertCast +import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrValueParameter @@ -42,6 +43,8 @@ class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationG return context.symbolTable.declareScript(descriptor).buildWithScope { irScript -> + irScript.metadata = DescriptorMetadataSource.Class(descriptor) + // A workaround for the JS/REPL backend: // JS backend doesn't save previously executed snippets anywhere, they should be taken for now from the context.symbolTable.listExistedScripts() // on the other hand imported scripts are also stored there so to avoid clashes the imported scripts should be filtered out diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrScript.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrScript.kt index 2ab4f201e8a..8729dda5d45 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrScript.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrScript.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.ir.types.IrType //NOTE: declarations and statements stored separately abstract class IrScript : IrDeclarationBase(), IrDeclarationWithName, - IrDeclarationParent, IrStatementContainer { + IrDeclarationParent, IrStatementContainer, IrMetadataSourceOwner { abstract override val symbol: IrScriptSymbol diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt index b91e299bd8e..f1913f11744 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt @@ -43,6 +43,8 @@ class IrScriptImpl( override val statements: MutableList = mutableListOf() + override var metadata: MetadataSource? = null + override lateinit var thisReceiver: IrValueParameter override lateinit var baseClass: IrType diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/TypeSystemCommonBackendContext.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/TypeSystemCommonBackendContext.kt index 5d5c0cca33b..1fd2917e485 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/types/TypeSystemCommonBackendContext.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/types/TypeSystemCommonBackendContext.kt @@ -54,6 +54,7 @@ interface TypeSystemCommonBackendContext : TypeSystemContext { interface TypeSystemCommonBackendContextForTypeMapping : TypeSystemCommonBackendContext { fun TypeConstructorMarker.isTypeParameter(): Boolean fun TypeConstructorMarker.defaultType(): KotlinTypeMarker + fun TypeConstructorMarker.isScript(): Boolean fun SimpleTypeMarker.isSuspendFunction(): Boolean fun SimpleTypeMarker.isKClass(): Boolean