[Psi2IR] support IrScript

This commit is contained in:
Vitaliy.Tikhonov
2019-08-30 14:21:36 +03:00
committed by romanart
parent 14510c1da3
commit 209a20153e
2 changed files with 51 additions and 4 deletions
@@ -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,
@@ -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)!!
}
}
}
}