From 40a60e430f0029d735d9bf77475a66d54a508cd8 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 8 Sep 2016 12:44:59 +0300 Subject: [PATCH] - Compact representation for empty blocks. - Fix some issues in IrBlockImpl. --- .../kotlin/ir/expressions/IrBlock.kt | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt index fb7d63fc12d..77f30d64b16 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt @@ -32,13 +32,33 @@ fun IrBlockImpl.addIfNotNull(statement: IrStatement?) { if (statement != null) addStatement(statement) } -class IrBlockImpl( - startOffset: Int, - endOffset: Int, - type: KotlinType, - override val operator: IrOperator? = null -) : IrExpressionBase(startOffset, endOffset, type), IrBlock { - override val statements: MutableList = ArrayList() +class IrEmptyBlockImpl(startOffset: Int, endOffset: Int, type: KotlinType, override val operator: IrOperator? = null) : + IrExpressionBase(startOffset, endOffset, type), IrBlock { + override val statements: List get() = emptyList() + + override fun getChild(slot: Int): IrElement? = null + + override fun replaceChild(slot: Int, newChild: IrElement) { + // no children + } + + override fun accept(visitor: IrElementVisitor, data: D): R { + return visitor.visitBlock(this, data) + } + + override fun acceptChildren(visitor: IrElementVisitor, data: D) { + // no children + } +} + +class IrBlockImpl(startOffset: Int, endOffset: Int, type: KotlinType, override val operator: IrOperator? = null): + IrExpressionBase(startOffset, endOffset, type), IrBlock { + constructor(startOffset: Int, endOffset: Int, type: KotlinType, operator: IrOperator?, statements: List) : + this(startOffset, endOffset, type, operator) { + addAll(statements) + } + + override val statements: MutableList = ArrayList(2) fun addStatement(statement: IrStatement) { statement.assertDetached() @@ -46,11 +66,11 @@ class IrBlockImpl( statements.add(statement) } - fun addAll(statements: List) { - statements.forEach { it.assertDetached() } - val originalSize = statements.size - this.statements.addAll(statements) - statements.forEachIndexed { i, irStatement -> + fun addAll(newStatements: List) { + newStatements.forEach { it.assertDetached() } + val originalSize = this.statements.size + this.statements.addAll(newStatements) + newStatements.forEachIndexed { i, irStatement -> irStatement.setTreeLocation(this, originalSize + i) } }