diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt index 52247b3d0d2..019af2df6c0 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt @@ -16,10 +16,7 @@ package org.jetbrains.kotlin.psi2ir.generators -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrErrorDeclarationImpl import org.jetbrains.kotlin.ir.declarations.impl.IrTypeAliasImpl @@ -51,6 +48,8 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { generateClassOrObjectDeclaration(ktDeclaration) is KtTypeAlias -> generateTypeAliasDeclaration(ktDeclaration) + is KtScript -> + ScriptGenerator(this).generateScriptDeclaration(ktDeclaration) else -> IrErrorDeclarationImpl( ktDeclaration.startOffsetSkippingComments, ktDeclaration.endOffset, 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 new file mode 100644 index 00000000000..cd28b7c9baa --- /dev/null +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.psi2ir.generators + +import org.jetbrains.kotlin.descriptors.ScriptDescriptor +import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin +import org.jetbrains.kotlin.psi.KtScript +import org.jetbrains.kotlin.psi.KtScriptInitializer +import org.jetbrains.kotlin.psi.psiUtil.pureEndOffset +import org.jetbrains.kotlin.psi.psiUtil.pureStartOffset +import org.jetbrains.kotlin.resolve.BindingContext + +class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) { + fun generateScriptDeclaration(ktScript: KtScript): IrDeclaration? { + val descriptor = getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktScript) as ScriptDescriptor + + val existedScripts = context.symbolTable.listExistedScripts() + + return context.symbolTable.declareScript(descriptor).buildWithScope { irScript -> + + // TODO: since script could reference instances of previous one their receivers have to be enlisted in its scope + // Remove this code once script is no longer represented by Class + existedScripts.forEach { context.symbolTable.introduceValueParameter(it.owner.thisReceiver) } + + val startOffset = ktScript.pureStartOffset + val endOffset = ktScript.pureEndOffset + + irScript.thisReceiver = context.symbolTable.declareValueParameter( + startOffset, endOffset, + IrDeclarationOrigin.INSTANCE_RECEIVER, + descriptor.thisAsReceiverParameter, + descriptor.thisAsReceiverParameter.type.toIrType() + ).also { it.parent = irScript } + + for (d in ktScript.declarations) { + if (d is KtScriptInitializer) irScript.statements += BodyGenerator( + irScript.symbol, + context + ).generateExpressionBody(d.body!!).expression + else irScript.declarations += declarationGenerator.generateMemberDeclaration(d)!! + } + } + } +}