JS: generate temporary names for function parameters. Remove tests for js() function that references parameters. Remove such usages of js() function from stdlib

This commit is contained in:
Alexey Andreev
2016-12-09 13:35:25 +03:00
parent b634c2cbe3
commit 39de1a7659
13 changed files with 51 additions and 55 deletions
@@ -95,7 +95,7 @@ open class JsFunctionScope(parent: JsScope, description: String) : JsScope(paren
"eval", "arguments",
// global identifiers usually declared in a typical JS interpreter
"NaN", "Infinity", "undefined",
"NaN", "isNaN", "Infinity", "undefined",
"Error", "Object", "Math", "String", "Number", "Boolean", "Date", "Array", "RegExp", "JSON",
// global identifiers usually declared in know environments (node.js, browser, require.js, WebWorkers, etc)
+1 -1
View File
@@ -30,7 +30,7 @@ public class Enum<T : Enum<T>> : Comparable<Enum<T>> {
override fun equals(other: Any?) = this === other
override fun hashCode(): Int = js("Kotlin.identityHashCode(this)")
override fun hashCode(): Int = js("Kotlin.identityHashCode")(this)
override fun toString() = name
+3 -3
View File
@@ -18,7 +18,7 @@
internal abstract class BaseOutput {
@JsName("println")
open fun println(a: Any?) {
if (js("typeof a") !== "undefined") {
if (jsTypeOf(a) != "undefined") {
print(a)
}
print("\n")
@@ -43,7 +43,7 @@ internal class OutputToConsoleLog : BaseOutput() {
}
override fun println(a: Any?) {
console.log(if (js("typeof a") !== "undefined") a else "")
console.log(if (jsTypeOf(a) != "undefined") a else "")
}
}
@@ -85,4 +85,4 @@ internal var `out` = {
if (isNode) NodeJsOutput(js("process.stdout")) else BufferedOutputToConsoleLog()
}()
private inline fun String(value: Any?): String = js("String(value)")
private inline fun String(value: Any?): String = js("String")(value)
+1 -1
View File
@@ -32,7 +32,7 @@ public external fun js(code: String): dynamic = noImpl
/**
* Function corresponding to JavaScript's `typeof` operator
*/
public inline fun jsTypeOf(a: Any?): String = js("typeof a")
public inline fun jsTypeOf(a: Any?): String = js("Kotlin").jsTypeOf(a)
@library
internal fun deleteProperty(`object`: Any, property: Any): Unit = noImpl
+1 -1
View File
@@ -30,7 +30,7 @@ public operator fun dynamic.iterator(): Iterator<dynamic> {
return when {
this["iterator"] != null ->
this["iterator"]()
js("Array.isArray(r)") ->
js("Array").isArray(r) ->
r.unsafeCast<Array<*>>().iterator()
else ->
@@ -3788,18 +3788,6 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
doTest(fileName);
}
@TestMetadata("jsCode.kt")
public void testJsCode() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inline/jsCode.kt");
doTest(fileName);
}
@TestMetadata("jsCodeVarDeclared.kt")
public void testJsCodeVarDeclared() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inline/jsCodeVarDeclared.kt");
doTest(fileName);
}
@TestMetadata("lambdaInLambda.kt")
public void testLambdaInLambda() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inline/lambdaInLambda.kt");
@@ -5575,6 +5563,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/nameClashes/propertyAndNativeMethod.kt");
doTest(fileName);
}
@TestMetadata("topLevelFunctionAndParameter.kt")
public void testTopLevelFunctionAndParameter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/nameClashes/topLevelFunctionAndParameter.kt");
doTest(fileName);
}
}
@TestMetadata("js/js.translator/testData/box/native")
@@ -5657,6 +5651,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
doTest(fileName);
}
@TestMetadata("jsTypeOf.kt")
public void testJsTypeOf() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/jsTypeOf.kt");
doTest(fileName);
}
@TestMetadata("kt2209.kt")
public void testKt2209() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/kt2209.kt");
@@ -369,7 +369,9 @@ public final class StaticContext {
JsName name = nameCache.get(suggested.getDescriptor());
if (name == null) {
String baseName = suggested.getNames().get(0);
if (suggested.getDescriptor() instanceof LocalVariableDescriptor) {
if (suggested.getDescriptor() instanceof LocalVariableDescriptor ||
suggested.getDescriptor() instanceof ValueParameterDescriptor
) {
name = scope.declareTemporaryName(baseName);
}
else {
@@ -149,7 +149,7 @@ public final class FunctionTranslator extends AbstractTranslator {
jsParameters.add(new JsParameter(paramNameForType));
String suggestedName = Namer.isInstanceSuggestedName(type);
JsName paramName = functionObject.getScope().declareName(suggestedName);
JsName paramName = functionObject.getScope().declareTemporaryName(suggestedName);
jsParameters.add(new JsParameter(paramName));
aliases.put(type, paramName.makeRef());
}
-14
View File
@@ -1,14 +0,0 @@
package foo
// CHECK_CONTAINS_NO_CALLS: test
internal inline fun sum(x: Int, y: Int): Int = js("x + y")
internal fun test(x: Int, y: Int): Int = sum(sum(x, x), sum(y, y))
fun box(): String {
assertEquals(4, test(1, 1))
assertEquals(8, test(1, 3))
return "OK"
}
@@ -1,20 +0,0 @@
package foo
// CHECK_CONTAINS_NO_CALLS: test
internal inline fun sum(x: Int, y: Int): Int = js("var a = x; a + y")
internal fun test(x: Int, y: Int): Int {
val xx = sum(x, x)
js("var a = 0;")
val yy = sum(y, y)
return sum(xx, yy)
}
fun box(): String {
assertEquals(4, test(1, 1))
assertEquals(8, test(1, 3))
return "OK"
}
@@ -0,0 +1,9 @@
fun f(x: Int) = x * 2
fun test(f: (Long) -> Long) = Pair(f(23 as Int), f(42L))
fun box(): String {
val result = test { it * 3 }
if (result != Pair(46, 126L)) return "fail: $result"
return "OK"
}
+18
View File
@@ -0,0 +1,18 @@
fun box(): String {
var result = jsTypeOf(23)
if (result != "number") return "fail1: $result"
result = jsTypeOf("23")
if (result != "string") return "fail2: $result"
result = jsTypeOf({ x: Int -> x })
if (result != "function") return "fail3: $result"
result = jsTypeOf(object {})
if (result != "object") return "fail4: $result"
result = jsTypeOf(true)
if (result != "boolean") return "fail5: $result"
return "OK"
}
+1
View File
@@ -270,6 +270,7 @@
return cache.value;
}
Kotlin.jsTypeOf = function(a) { return typeof a; };
////////////////////////////////// packages & modules //////////////////////////////