[JS IR BE] Validate parents

This commit is contained in:
Svyatoslav Kuzmich
2018-11-20 16:16:43 +03:00
parent 39cdee8d6c
commit 59032c384e
15 changed files with 87 additions and 17 deletions
@@ -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)
@@ -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,
@@ -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)
@@ -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))
}
}
@@ -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 {
@@ -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(