K2 Scripting: add FIR2IR conversion for FirScript
This commit is contained in:
committed by
Space Team
parent
47448d779c
commit
cc9a7480a2
@@ -356,6 +356,10 @@ class Fir2IrConverter(
|
|||||||
is FirRegularClass -> {
|
is FirRegularClass -> {
|
||||||
processClassMembers(declaration)
|
processClassMembers(declaration)
|
||||||
}
|
}
|
||||||
|
is FirScript -> {
|
||||||
|
assert(parent is IrFile)
|
||||||
|
declarationStorage.getOrCreateIrScript(declaration)
|
||||||
|
}
|
||||||
is FirSimpleFunction -> {
|
is FirSimpleFunction -> {
|
||||||
declarationStorage.getOrCreateIrFunction(
|
declarationStorage.getOrCreateIrFunction(
|
||||||
declaration, parent, isLocal = isLocal
|
declaration, parent, isLocal = isLocal
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
|||||||
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin.GeneratedByPlugin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin.GeneratedByPlugin
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.impl.IrScriptImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass
|
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
@@ -73,6 +74,8 @@ class Fir2IrDeclarationStorage(
|
|||||||
|
|
||||||
private val fileCache = ConcurrentHashMap<FirFile, IrFile>()
|
private val fileCache = ConcurrentHashMap<FirFile, IrFile>()
|
||||||
|
|
||||||
|
private val scriptCache = ConcurrentHashMap<FirScript, IrScript>()
|
||||||
|
|
||||||
private val functionCache = ConcurrentHashMap<FirFunction, IrSimpleFunction>()
|
private val functionCache = ConcurrentHashMap<FirFunction, IrSimpleFunction>()
|
||||||
|
|
||||||
private val constructorCache = ConcurrentHashMap<FirConstructor, IrConstructor>()
|
private val constructorCache = ConcurrentHashMap<FirConstructor, IrConstructor>()
|
||||||
@@ -1530,6 +1533,24 @@ class Fir2IrDeclarationStorage(
|
|||||||
return getIrPropertyForwardedSymbol(firVariableSymbol.fir)
|
return getIrPropertyForwardedSymbol(firVariableSymbol.fir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getCachedIrScript(script: FirScript): IrScript? = scriptCache[script]
|
||||||
|
|
||||||
|
fun getOrCreateIrScript(script: FirScript): IrScript =
|
||||||
|
getCachedIrScript(script) ?: script.convertWithOffsets { startOffset, endOffset ->
|
||||||
|
val signature = signatureComposer.composeSignature(script)!!
|
||||||
|
symbolTable.declareScript(signature, { Fir2IrScriptSymbol(signature) }) { symbol ->
|
||||||
|
IrScriptImpl(symbol, script.name, irFactory, startOffset, endOffset).also { irScript ->
|
||||||
|
irScript.metadata = FirMetadataSource.Script(script)
|
||||||
|
irScript.explicitCallParameters = emptyList()
|
||||||
|
irScript.implicitReceiversParameters = emptyList()
|
||||||
|
irScript.providedProperties = emptyList()
|
||||||
|
irScript.providedPropertiesParameters = emptyList()
|
||||||
|
scriptCache[script] = irScript
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun getIrPropertyForwardedSymbol(fir: FirVariable): IrSymbol {
|
private fun getIrPropertyForwardedSymbol(fir: FirVariable): IrSymbol {
|
||||||
return when (fir) {
|
return when (fir) {
|
||||||
is FirProperty -> {
|
is FirProperty -> {
|
||||||
|
|||||||
@@ -192,6 +192,25 @@ class Fir2IrVisitor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitScript(script: FirScript, data: Any?): IrElement {
|
||||||
|
return declarationStorage.getCachedIrScript(script)!!.also { irScript ->
|
||||||
|
irScript.parent = conversionScope.parentFromStack()
|
||||||
|
symbolTable.enterScope(irScript)
|
||||||
|
conversionScope.withParent(irScript) {
|
||||||
|
for (statement in script.statements) {
|
||||||
|
if (statement is FirDeclaration) {
|
||||||
|
val irDeclaration = statement.accept(this@Fir2IrVisitor, null) as IrDeclaration
|
||||||
|
irScript.statements.add(irDeclaration)
|
||||||
|
} else {
|
||||||
|
val irStatement = statement.toIrStatement()!!
|
||||||
|
irScript.statements.add(irStatement)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
symbolTable.leaveScope(irScript)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitAnonymousObjectExpression(anonymousObjectExpression: FirAnonymousObjectExpression, data: Any?): IrElement {
|
override fun visitAnonymousObjectExpression(anonymousObjectExpression: FirAnonymousObjectExpression, data: Any?): IrElement {
|
||||||
return visitAnonymousObject(anonymousObjectExpression.anonymousObject, data)
|
return visitAnonymousObject(anonymousObjectExpression.anonymousObject, data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,4 +40,6 @@ sealed class FirMetadataSource : MetadataSource {
|
|||||||
class Property(override val fir: FirProperty) : FirMetadataSource(), MetadataSource.Property {
|
class Property(override val fir: FirProperty) : FirMetadataSource(), MetadataSource.Property {
|
||||||
override val isConst: Boolean get() = fir.isConst
|
override val isConst: Boolean get() = fir.isConst
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Script(override val fir: FirScript) : FirMetadataSource(), MetadataSource.Script
|
||||||
}
|
}
|
||||||
|
|||||||
+10
@@ -52,6 +52,9 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
|||||||
//platformSpecificClass(descriptor)
|
//platformSpecificClass(descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitScript(script: FirScript, data: Any?) {
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Any?) {
|
override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Any?) {
|
||||||
setExpected(typeAlias.isExpect)
|
setExpected(typeAlias.isExpect)
|
||||||
}
|
}
|
||||||
@@ -140,6 +143,13 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
|||||||
builder.hashId, builder.mask
|
builder.hashId, builder.mask
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
is FirScript -> {
|
||||||
|
IdSignature.CommonSignature(
|
||||||
|
declaration.name.asString(), // TODO: find package id
|
||||||
|
declaration.name.asString(),
|
||||||
|
builder.hashId, builder.mask
|
||||||
|
)
|
||||||
|
}
|
||||||
else -> error("Unsupported FIR declaration in signature composer: ${declaration.render()}")
|
else -> error("Unsupported FIR declaration in signature composer: ${declaration.render()}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,3 +39,6 @@ class Fir2IrPropertySymbol(
|
|||||||
) : Fir2IrBindableSymbol<PropertyDescriptor, IrProperty>(signature, containerSource),
|
) : Fir2IrBindableSymbol<PropertyDescriptor, IrProperty>(signature, containerSource),
|
||||||
IrPropertySymbol
|
IrPropertySymbol
|
||||||
|
|
||||||
|
class Fir2IrScriptSymbol(signature: IdSignature) :
|
||||||
|
Fir2IrBindableSymbol<ScriptDescriptor, IrScript>(signature),
|
||||||
|
IrScriptSymbol
|
||||||
|
|||||||
@@ -556,6 +556,7 @@ fun FirBasedSymbol<*>.getOwnerLookupTag(): ConeClassLikeLookupTag? {
|
|||||||
is FirBackingFieldSymbol -> fir.propertySymbol.getOwnerLookupTag()
|
is FirBackingFieldSymbol -> fir.propertySymbol.getOwnerLookupTag()
|
||||||
is FirClassLikeSymbol<*> -> getContainingClassLookupTag()
|
is FirClassLikeSymbol<*> -> getContainingClassLookupTag()
|
||||||
is FirCallableSymbol<*> -> containingClassLookupTag()
|
is FirCallableSymbol<*> -> containingClassLookupTag()
|
||||||
|
is FirScriptSymbol -> null
|
||||||
else -> error("Unsupported owner search for ${fir.javaClass}: ${fir.render()}")
|
else -> error("Unsupported owner search for ${fir.javaClass}: ${fir.render()}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationG
|
|||||||
fun generateScriptDeclaration(ktScript: KtScript): IrDeclaration? {
|
fun generateScriptDeclaration(ktScript: KtScript): IrDeclaration? {
|
||||||
val descriptor = getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktScript) as ScriptDescriptor
|
val descriptor = getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktScript) as ScriptDescriptor
|
||||||
|
|
||||||
return context.symbolTable.declareScript(descriptor).buildWithScope { irScript ->
|
return context.symbolTable.declareScript(ktScript.startOffsetSkippingComments, ktScript.endOffset, descriptor).buildWithScope { irScript ->
|
||||||
|
|
||||||
irScript.metadata = DescriptorMetadataSource.Script(descriptor)
|
irScript.metadata = DescriptorMetadataSource.Script(descriptor)
|
||||||
|
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ class IrScriptImpl(
|
|||||||
override val symbol: IrScriptSymbol,
|
override val symbol: IrScriptSymbol,
|
||||||
override var name: Name,
|
override var name: Name,
|
||||||
override val factory: IrFactory,
|
override val factory: IrFactory,
|
||||||
|
override val startOffset: Int,
|
||||||
|
override val endOffset: Int,
|
||||||
) : IrScript() {
|
) : IrScript() {
|
||||||
override val startOffset: Int get() = UNDEFINED_OFFSET
|
|
||||||
override val endOffset: Int get() = UNDEFINED_OFFSET
|
|
||||||
override var origin: IrDeclarationOrigin = SCRIPT_ORIGIN
|
override var origin: IrDeclarationOrigin = SCRIPT_ORIGIN
|
||||||
|
|
||||||
private var _parent: IrDeclarationParent? = null
|
private var _parent: IrDeclarationParent? = null
|
||||||
|
|||||||
@@ -127,6 +127,8 @@ open class DeepCopyIrTreeWithSymbols(
|
|||||||
symbolRemapper.getDeclaredScript(declaration.symbol),
|
symbolRemapper.getDeclaredScript(declaration.symbol),
|
||||||
declaration.name,
|
declaration.name,
|
||||||
declaration.factory,
|
declaration.factory,
|
||||||
|
declaration.startOffset,
|
||||||
|
declaration.endOffset
|
||||||
).also { scriptCopy ->
|
).also { scriptCopy ->
|
||||||
scriptCopy.thisReceiver = declaration.thisReceiver.transform()
|
scriptCopy.thisReceiver = declaration.thisReceiver.transform()
|
||||||
declaration.statements.mapTo(scriptCopy.statements) { it.transform() }
|
declaration.statements.mapTo(scriptCopy.statements) { it.transform() }
|
||||||
|
|||||||
@@ -429,9 +429,11 @@ open class SymbolTable(
|
|||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
fun declareScript(
|
fun declareScript(
|
||||||
|
startOffset: Int,
|
||||||
|
endOffset: Int,
|
||||||
descriptor: ScriptDescriptor,
|
descriptor: ScriptDescriptor,
|
||||||
scriptFactory: (IrScriptSymbol) -> IrScript = { symbol: IrScriptSymbol ->
|
scriptFactory: (IrScriptSymbol) -> IrScript = { symbol: IrScriptSymbol ->
|
||||||
IrScriptImpl(symbol, nameProvider.nameForDeclaration(descriptor), irFactory)
|
IrScriptImpl(symbol, nameProvider.nameForDeclaration(descriptor), irFactory, startOffset, endOffset)
|
||||||
}
|
}
|
||||||
): IrScript {
|
): IrScript {
|
||||||
return scriptSymbolTable.declare(
|
return scriptSymbolTable.declare(
|
||||||
@@ -441,6 +443,18 @@ open class SymbolTable(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun declareScript(
|
||||||
|
sig: IdSignature,
|
||||||
|
symbolFactory: () -> IrScriptSymbol,
|
||||||
|
scriptFactory: (IrScriptSymbol) -> IrScript
|
||||||
|
): IrScript {
|
||||||
|
return scriptSymbolTable.declare(
|
||||||
|
sig,
|
||||||
|
symbolFactory,
|
||||||
|
scriptFactory
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
override fun referenceScript(descriptor: ScriptDescriptor): IrScriptSymbol =
|
override fun referenceScript(descriptor: ScriptDescriptor): IrScriptSymbol =
|
||||||
scriptSymbolTable.referenced(descriptor) { IrScriptSymbolImpl(descriptor) }
|
scriptSymbolTable.referenced(descriptor) { IrScriptSymbolImpl(descriptor) }
|
||||||
|
|||||||
Reference in New Issue
Block a user