From a9d38e8d229d5722efedef30e39dca7bbf6e9f0c Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 14 Apr 2015 17:59:01 +0300 Subject: [PATCH] JS: decomposition of vars --- .../kotlin/js/inline/ExpressionDecomposer.kt | 19 +++++++++++ .../kotlin/js/translate/utils/astUtils.kt | 6 +++- .../cases/multiDeclaration.kt | 19 +++++++++++ .../cases/multiDeclarationComplex.kt | 33 +++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/inlineEvaluationOrder/cases/multiDeclaration.kt create mode 100644 js/js.translator/testData/inlineEvaluationOrder/cases/multiDeclarationComplex.kt diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/ExpressionDecomposer.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/ExpressionDecomposer.kt index cf3a0f8da1c..2572402670f 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/ExpressionDecomposer.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/ExpressionDecomposer.kt @@ -76,6 +76,25 @@ class ExpressionDecomposer private ( } } + // TODO: add test case (after KT-7371 fix): var a = foo(), b = foo() + inlineBar() + override fun visit(x: JsVars, ctx: JsContext<*>): Boolean { + val vars = x.getVars() + var prevVars = SmartList() + + for (jsVar in vars) { + if (jsVar in containsExtractable && prevVars.isNotEmpty()) { + addStatement(JsVars(prevVars, x.isMultiline())) + prevVars = SmartList() + } + + jsVar.initExpression = accept(jsVar.initExpression) + prevVars.add(jsVar) + } + + vars.clear() + vars.addAll(prevVars) + return false + } override fun visit(x: JsWhile, ctx: JsContext<*>): Boolean { x.process(true) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/astUtils.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/astUtils.kt index a95bb6b21b2..8b70dd9f116 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/astUtils.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/astUtils.kt @@ -97,4 +97,8 @@ public var JsBinaryOperation.arg2: JsExpression set(value) = setArg2(value) public val JsBinaryOperation.operator: JsBinaryOperator - get() = getOperator() \ No newline at end of file + get() = getOperator() + +public var JsVars.JsVar.initExpression: JsExpression? + get() = getInitExpression() + set(value) = setInitExpression(value) \ No newline at end of file diff --git a/js/js.translator/testData/inlineEvaluationOrder/cases/multiDeclaration.kt b/js/js.translator/testData/inlineEvaluationOrder/cases/multiDeclaration.kt new file mode 100644 index 00000000000..565610c6b37 --- /dev/null +++ b/js/js.translator/testData/inlineEvaluationOrder/cases/multiDeclaration.kt @@ -0,0 +1,19 @@ +package foo + +// CHECK_NOT_CALLED: component2 + +class A(val x: Int, val y: Int) + +fun A.component1(): Int = fizz(x) + +inline +fun A.component2(): Int = buzz(y) + +fun box(): String { + val (a, b) = A(1, 2) + assertEquals(a, 1) + assertEquals(b, 2) + assertEquals("fizz(1);buzz(2);", pullLog()) + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/inlineEvaluationOrder/cases/multiDeclarationComplex.kt b/js/js.translator/testData/inlineEvaluationOrder/cases/multiDeclarationComplex.kt new file mode 100644 index 00000000000..5b02c0a358e --- /dev/null +++ b/js/js.translator/testData/inlineEvaluationOrder/cases/multiDeclarationComplex.kt @@ -0,0 +1,33 @@ +package foo + +// CHECK_NOT_CALLED: component2 +// CHECK_NOT_CALLED: component3 +// CHECK_NOT_CALLED: component5 + +class A(val a: Int, val b: Int, val c: Int, val d: Int, val e: Int) + +fun A.component1(): Int = fizz(a) + +inline +fun A.component2(): Int = buzz(b) + +inline +fun A.component3(): Int = buzz(c) + +fun A.component4(): Int = fizz(d) + +inline +fun A.component5(): Int = buzz(e) + +fun box(): String { + val (a, b, c, d, e) = A(1, 2, 3, 4, 5) + + assertEquals(1, a) + assertEquals(2, b) + assertEquals(3, c) + assertEquals(4, d) + assertEquals(5, e) + assertEquals("fizz(1);buzz(2);buzz(3);fizz(4);buzz(5);", pullLog()) + + return "OK" +} \ No newline at end of file