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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -270,6 +270,7 @@
|
||||
return cache.value;
|
||||
}
|
||||
|
||||
Kotlin.jsTypeOf = function(a) { return typeof a; };
|
||||
|
||||
////////////////////////////////// packages & modules //////////////////////////////
|
||||
|
||||
|
||||
Reference in New Issue
Block a user