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 -> {
|
||||
processClassMembers(declaration)
|
||||
}
|
||||
is FirScript -> {
|
||||
assert(parent is IrFile)
|
||||
declarationStorage.getOrCreateIrScript(declaration)
|
||||
}
|
||||
is FirSimpleFunction -> {
|
||||
declarationStorage.getOrCreateIrFunction(
|
||||
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.declarations.*
|
||||
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.lazy.IrLazyClass
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
@@ -73,6 +74,8 @@ class Fir2IrDeclarationStorage(
|
||||
|
||||
private val fileCache = ConcurrentHashMap<FirFile, IrFile>()
|
||||
|
||||
private val scriptCache = ConcurrentHashMap<FirScript, IrScript>()
|
||||
|
||||
private val functionCache = ConcurrentHashMap<FirFunction, IrSimpleFunction>()
|
||||
|
||||
private val constructorCache = ConcurrentHashMap<FirConstructor, IrConstructor>()
|
||||
@@ -1530,6 +1533,24 @@ class Fir2IrDeclarationStorage(
|
||||
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 {
|
||||
return when (fir) {
|
||||
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 {
|
||||
return visitAnonymousObject(anonymousObjectExpression.anonymousObject, data)
|
||||
}
|
||||
|
||||
@@ -40,4 +40,6 @@ sealed class FirMetadataSource : MetadataSource {
|
||||
class Property(override val fir: FirProperty) : FirMetadataSource(), MetadataSource.Property {
|
||||
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)
|
||||
}
|
||||
|
||||
override fun visitScript(script: FirScript, data: Any?) {
|
||||
}
|
||||
|
||||
override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Any?) {
|
||||
setExpected(typeAlias.isExpect)
|
||||
}
|
||||
@@ -140,6 +143,13 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
||||
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()}")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,3 +39,6 @@ class Fir2IrPropertySymbol(
|
||||
) : Fir2IrBindableSymbol<PropertyDescriptor, IrProperty>(signature, containerSource),
|
||||
IrPropertySymbol
|
||||
|
||||
class Fir2IrScriptSymbol(signature: IdSignature) :
|
||||
Fir2IrBindableSymbol<ScriptDescriptor, IrScript>(signature),
|
||||
IrScriptSymbol
|
||||
|
||||
@@ -556,6 +556,7 @@ fun FirBasedSymbol<*>.getOwnerLookupTag(): ConeClassLikeLookupTag? {
|
||||
is FirBackingFieldSymbol -> fir.propertySymbol.getOwnerLookupTag()
|
||||
is FirClassLikeSymbol<*> -> getContainingClassLookupTag()
|
||||
is FirCallableSymbol<*> -> containingClassLookupTag()
|
||||
is FirScriptSymbol -> null
|
||||
else -> error("Unsupported owner search for ${fir.javaClass}: ${fir.render()}")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationG
|
||||
fun generateScriptDeclaration(ktScript: KtScript): IrDeclaration? {
|
||||
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)
|
||||
|
||||
|
||||
@@ -24,9 +24,9 @@ class IrScriptImpl(
|
||||
override val symbol: IrScriptSymbol,
|
||||
override var name: Name,
|
||||
override val factory: IrFactory,
|
||||
override val startOffset: Int,
|
||||
override val endOffset: Int,
|
||||
) : IrScript() {
|
||||
override val startOffset: Int get() = UNDEFINED_OFFSET
|
||||
override val endOffset: Int get() = UNDEFINED_OFFSET
|
||||
override var origin: IrDeclarationOrigin = SCRIPT_ORIGIN
|
||||
|
||||
private var _parent: IrDeclarationParent? = null
|
||||
|
||||
@@ -127,6 +127,8 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
symbolRemapper.getDeclaredScript(declaration.symbol),
|
||||
declaration.name,
|
||||
declaration.factory,
|
||||
declaration.startOffset,
|
||||
declaration.endOffset
|
||||
).also { scriptCopy ->
|
||||
scriptCopy.thisReceiver = declaration.thisReceiver.transform()
|
||||
declaration.statements.mapTo(scriptCopy.statements) { it.transform() }
|
||||
|
||||
@@ -429,9 +429,11 @@ open class SymbolTable(
|
||||
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
fun declareScript(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
descriptor: ScriptDescriptor,
|
||||
scriptFactory: (IrScriptSymbol) -> IrScript = { symbol: IrScriptSymbol ->
|
||||
IrScriptImpl(symbol, nameProvider.nameForDeclaration(descriptor), irFactory)
|
||||
IrScriptImpl(symbol, nameProvider.nameForDeclaration(descriptor), irFactory, startOffset, endOffset)
|
||||
}
|
||||
): IrScript {
|
||||
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
|
||||
override fun referenceScript(descriptor: ScriptDescriptor): IrScriptSymbol =
|
||||
scriptSymbolTable.referenced(descriptor) { IrScriptSymbolImpl(descriptor) }
|
||||
|
||||
Reference in New Issue
Block a user