JS backend: add the support function expression
#KT-7242 Fixed
This commit is contained in:
@@ -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"
|
||||
|
||||
+2
-2
@@ -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"
|
||||
|
||||
+3
-1
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+61
@@ -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);
|
||||
}
|
||||
}
|
||||
+5
-1
@@ -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/")
|
||||
|
||||
+4
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user