[JS IR BE] Validate parents
This commit is contained in:
@@ -105,6 +105,7 @@ private fun JsIrBackendContext.lower(moduleFragment: IrModuleFragment, dependenc
|
||||
val validateIr = {
|
||||
val visitor = IrValidator(this, validatorConfig)
|
||||
moduleFragment.acceptVoid(visitor)
|
||||
moduleFragment.checkDeclarationParents()
|
||||
}
|
||||
validateIr()
|
||||
ThrowableSuccessorsLowering(this).lower(moduleFragment)
|
||||
@@ -144,7 +145,8 @@ private fun JsIrBackendContext.lower(moduleFragment: IrModuleFragment, dependenc
|
||||
validateIr()
|
||||
AutoboxingTransformer(this).lower(moduleFragment)
|
||||
BlockDecomposerLowering(this).runOnFilesPostfix(moduleFragment)
|
||||
|
||||
// TODO: Fix BlockDecomposerLowering parents
|
||||
moduleFragment.patchDeclarationParents()
|
||||
ClassReferenceLowering(this).lower(moduleFragment)
|
||||
PrimitiveCompanionLowering(this).lower(moduleFragment)
|
||||
ConstLowering(this).lower(moduleFragment)
|
||||
|
||||
+5
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.ir.types.makeNotNull
|
||||
import org.jetbrains.kotlin.ir.util.getInlinedClass
|
||||
import org.jetbrains.kotlin.ir.util.isInlined
|
||||
import org.jetbrains.kotlin.ir.util.isNullable
|
||||
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
||||
|
||||
|
||||
// Copied and adapted from Kotlin/Native
|
||||
@@ -24,6 +25,9 @@ import org.jetbrains.kotlin.ir.util.isNullable
|
||||
class AutoboxingTransformer(val context: JsIrBackendContext) : AbstractValueUsageTransformer(context.irBuiltIns), FileLoweringPass {
|
||||
override fun lower(irFile: IrFile) {
|
||||
irFile.transformChildrenVoid()
|
||||
|
||||
// TODO: Track & insert parents for temporary variables
|
||||
irFile.patchDeclarationParents()
|
||||
}
|
||||
|
||||
override fun IrExpression.useAs(type: IrType): IrExpression {
|
||||
@@ -101,6 +105,7 @@ class AutoboxingTransformer(val context: JsIrBackendContext) : AbstractValueUsag
|
||||
if (!actualType.isNullable())
|
||||
return call(arg)
|
||||
return JsIrBuilder.run {
|
||||
// TODO: Set parent of local variables
|
||||
val tmp = buildVar(actualType, parent = null, initializer = arg)
|
||||
val nullCheck = buildIfElse(
|
||||
type = resultType,
|
||||
|
||||
+3
-1
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
||||
import org.jetbrains.kotlin.ir.util.transformDeclarationsFlat
|
||||
import org.jetbrains.kotlin.ir.util.transformFlat
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
@@ -47,6 +48,7 @@ class BlockDecomposerLowering(context: JsIrBackendContext) : DeclarationContaine
|
||||
}
|
||||
|
||||
private fun IrExpressionBody.toBlockBody(containingFunction: IrFunction): IrBlockBody {
|
||||
expression.patchDeclarationParents(containingFunction)
|
||||
val returnStatement = JsIrBuilder.buildReturn(containingFunction.symbol, expression, nothingType)
|
||||
return IrBlockBodyImpl(expression.startOffset, expression.endOffset).apply {
|
||||
statements += returnStatement
|
||||
@@ -63,7 +65,7 @@ class BlockDecomposerLowering(context: JsIrBackendContext) : DeclarationContaine
|
||||
)
|
||||
|
||||
val newBody = toBlockBody(initFunction)
|
||||
|
||||
newBody.patchDeclarationParents(initFunction)
|
||||
initFunction.body = newBody
|
||||
|
||||
lower(initFunction)
|
||||
|
||||
+6
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.makeNullable
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import java.util.*
|
||||
|
||||
@@ -332,6 +333,9 @@ class EnumClassTransformer(val context: JsIrBackendContext, private val irClass:
|
||||
for ((entry, instanceVar) in enumEntries.zip(entryInstances)) {
|
||||
+irSetVar(instanceVar.symbol, entry.initializerExpression!!)
|
||||
}
|
||||
}.also {
|
||||
// entry.initializerExpression can have local declarations
|
||||
it.acceptVoid(PatchDeclarationParentsVisitor(irClass))
|
||||
}
|
||||
|
||||
private fun createEntryInstancesInitializedVar(): IrVariable {
|
||||
@@ -429,6 +433,8 @@ class EnumClassTransformer(val context: JsIrBackendContext, private val irClass:
|
||||
copyParameterDeclarationsFrom(enumConstructor)
|
||||
body = enumConstructor.body
|
||||
loweredEnumConstructors[enumConstructor.symbol] = this
|
||||
|
||||
this.acceptVoid(PatchDeclarationParentsVisitor(enumClass))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-3
@@ -11,9 +11,9 @@ import org.jetbrains.kotlin.backend.common.utils.isSubtypeOf
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrBranchImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCatchImpl
|
||||
@@ -58,8 +58,9 @@ class MultipleCatchesLowering(val context: JsIrBackendContext) : FileLoweringPas
|
||||
override fun lower(irFile: IrFile) {
|
||||
irFile.transformChildren(object : IrElementTransformer<IrDeclarationParent> {
|
||||
|
||||
override fun visitFunction(declaration: IrFunction, data: IrDeclarationParent): IrStatement {
|
||||
return super.visitFunction(declaration, declaration)
|
||||
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent): IrStatement {
|
||||
val parent = (declaration as? IrDeclarationParent) ?: data
|
||||
return super.visitDeclaration(declaration, parent)
|
||||
}
|
||||
|
||||
override fun visitTry(aTry: IrTry, data: IrDeclarationParent): IrExpression {
|
||||
|
||||
+3
-2
@@ -258,8 +258,9 @@ internal class SuspendFunctionsLowering(val context: JsIrBackendContext): FileLo
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return coroutine.coroutineClass
|
||||
val coroutineClass = coroutine.coroutineClass
|
||||
coroutineClass.patchDeclarationParents(coroutineClass.parent)
|
||||
return coroutineClass
|
||||
}
|
||||
|
||||
private class BuiltCoroutine(
|
||||
|
||||
Reference in New Issue
Block a user