JS backend: add the support function expression

#KT-7242 Fixed
This commit is contained in:
Zalim Bashorov
2015-04-20 19:08:08 +03:00
parent 02071c5bdd
commit 1ef9b9db1f
7 changed files with 83 additions and 8 deletions
@@ -18,12 +18,12 @@ fun box() : String {
if( 1.(fun Int.(i: Int) = i + this)(1) != 2) return "test 6 failed";
if( (fooT1<String>()("mama")) != "mama") return "test 7 failed";
val a = [A] fun Int.() = this + 1 //
val a = [A] fun Int.() = this + 1
if (1.a() != 2) return "test 8 failed"
val b = ( fun Int.() = this + 1)
if (1.a() != 2) return "test 9 failed"
if (1.b() != 2) return "test 9 failed"
val c = (@c fun Int.() = this + 1)
if (1.a() != 2) return "test 10 failed"
if (1.c() != 2) return "test 10 failed"
val d = @d fun (): Int { return@d 4}
if (d() != 4) return "test 11 failed"
@@ -21,9 +21,9 @@ fun box() : String {
val a = [A] fun Int.name() = this + 1 // name
if (1.a() != 2) return "test 8 failed"
val b = ( fun Int.name() = this + 1)
if (1.a() != 2) return "test 9 failed"
if (1.b() != 2) return "test 9 failed"
val c = (@c fun Int.name() = this + 1)
if (1.a() != 2) return "test 10 failed"
if (1.c() != 2) return "test 10 failed"
val d = fun name(): Int { return@name 4}
if (d() != 4) return "test 11 failed"
@@ -10,6 +10,8 @@ fun fooT1<T>(t : T) = { t.toString() }
fun fooT2<T>(t: T) = { x:T -> t.toString() + x.toString() }
object t
fun box() : String {
if( (10.foo1())() != "23910") return "foo1 fail"
if( (10.foo2())(1) != 11 ) return "foo2 fail"
@@ -18,7 +20,7 @@ fun box() : String {
if( {1}() != 1) return "test 4 failed";
if( {x : Int -> x}(1) != 1) return "test 5 failed";
if( 1.(fun Int.(x: Int) = x + this)(1) != 2) return "test 6 failed";
if( 1.(fun Int.() = this)() != 1) return "test 7 failed";
if( t.(fun Any.() = this)() != t) return "test 7 failed";
if( (fooT1<String>("mama"))() != "mama") return "test 8 failed";
if( (fooT2<String>("mama"))("papa") != "mamapapa") return "test 9 failed";
return "OK"
@@ -843,6 +843,11 @@ fun main(args: Array<String>) {
testClass(javaClass<AbstractCompanionObjectTest>()) {
model("codegen/box/objectIntrinsics", targetBackend = TargetBackend.JS)
}
testClass(javaClass<AbstractFunctionExpressionTest>()) {
model("codegen/box/functions/functionExpression", targetBackend = TargetBackend.JS)
}
}
}
@@ -0,0 +1,61 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.js.test.semantics;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
import org.jetbrains.kotlin.test.JetTestUtils;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.runner.RunWith;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("compiler/testData/codegen/box/functions/functionExpression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public class FunctionExpressionTestGenerated extends AbstractFunctionExpressionTest {
public void testAllFilesPresentInFunctionExpression() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/functions/functionExpression"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("functionExpression.kt")
public void testFunctionExpression() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/functions/functionExpression/functionExpression.kt");
doTest(fileName);
}
@TestMetadata("functionExpressionWithName.kt")
public void testFunctionExpressionWithName() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/functions/functionExpression/functionExpressionWithName.kt");
doTest(fileName);
}
@TestMetadata("functionExpressionWithThisReference.kt")
public void testFunctionExpressionWithThisReference() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/functions/functionExpression/functionExpressionWithThisReference.kt");
doTest(fileName);
}
@TestMetadata("functionLiteralExpression.kt")
public void testFunctionLiteralExpression() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/functions/functionExpression/functionLiteralExpression.kt");
doTest(fileName);
}
}
@@ -20,16 +20,20 @@ import org.jetbrains.kotlin.js.test.AbstractSingleFileTranslationWithDirectivesT
import org.jetbrains.kotlin.js.test.MultipleModulesTranslationTest
import org.jetbrains.kotlin.js.test.SingleFileTranslationTest
public abstract class AbstractBridgeTest : SingleFileTranslationTest("bridges/") {
private abstract class AbstractBlackBoxTest(d: String) : SingleFileTranslationTest(d) {
override fun doTest(filename: String) = checkBlackBoxIsOkByPath(filename)
}
public abstract class AbstractBridgeTest : AbstractBlackBoxTest("bridges/")
public abstract class AbstractCallableReferenceTest(main: String) : SingleFileTranslationTest("callableReference/" + main)
public abstract class AbstractCompanionObjectTest : SingleFileTranslationTest("objectIntrinsics/")
public abstract class AbstractDynamicTest : SingleFileTranslationTest("dynamic/")
public abstract class AbstractFunctionExpressionTest : AbstractBlackBoxTest("functionExpression/")
public abstract class AbstractInlineEvaluationOrderTest : AbstractSingleFileTranslationWithDirectivesTest("inlineEvaluationOrder/")
public abstract class AbstractInlineJsStdlibTest : AbstractSingleFileTranslationWithDirectivesTest("inlineStdlib/")
@@ -417,7 +417,10 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
MetadataPackage.setStaticRef(name, alias);
}
return new JsVars(new JsVars.JsVar(name, alias)).source(expression);
boolean isExpression = BindingContextUtilPackage.isUsedAsExpression(expression, context.bindingContext());
JsNode result = isExpression ? alias : JsAstUtils.newVar(name, alias);
return result.source(expression);
}
@Override