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",
|
"eval", "arguments",
|
||||||
|
|
||||||
// global identifiers usually declared in a typical JS interpreter
|
// 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",
|
"Error", "Object", "Math", "String", "Number", "Boolean", "Date", "Array", "RegExp", "JSON",
|
||||||
|
|
||||||
// global identifiers usually declared in know environments (node.js, browser, require.js, WebWorkers, etc)
|
// 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 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
|
override fun toString() = name
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
internal abstract class BaseOutput {
|
internal abstract class BaseOutput {
|
||||||
@JsName("println")
|
@JsName("println")
|
||||||
open fun println(a: Any?) {
|
open fun println(a: Any?) {
|
||||||
if (js("typeof a") !== "undefined") {
|
if (jsTypeOf(a) != "undefined") {
|
||||||
print(a)
|
print(a)
|
||||||
}
|
}
|
||||||
print("\n")
|
print("\n")
|
||||||
@@ -43,7 +43,7 @@ internal class OutputToConsoleLog : BaseOutput() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun println(a: Any?) {
|
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()
|
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
|
* 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
|
@library
|
||||||
internal fun deleteProperty(`object`: Any, property: Any): Unit = noImpl
|
internal fun deleteProperty(`object`: Any, property: Any): Unit = noImpl
|
||||||
@@ -30,7 +30,7 @@ public operator fun dynamic.iterator(): Iterator<dynamic> {
|
|||||||
return when {
|
return when {
|
||||||
this["iterator"] != null ->
|
this["iterator"] != null ->
|
||||||
this["iterator"]()
|
this["iterator"]()
|
||||||
js("Array.isArray(r)") ->
|
js("Array").isArray(r) ->
|
||||||
r.unsafeCast<Array<*>>().iterator()
|
r.unsafeCast<Array<*>>().iterator()
|
||||||
|
|
||||||
else ->
|
else ->
|
||||||
|
|||||||
@@ -3788,18 +3788,6 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("lambdaInLambda.kt")
|
||||||
public void testLambdaInLambda() throws Exception {
|
public void testLambdaInLambda() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inline/lambdaInLambda.kt");
|
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");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/nameClashes/propertyAndNativeMethod.kt");
|
||||||
doTest(fileName);
|
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")
|
@TestMetadata("js/js.translator/testData/box/native")
|
||||||
@@ -5657,6 +5651,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("kt2209.kt")
|
||||||
public void testKt2209() throws Exception {
|
public void testKt2209() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/kt2209.kt");
|
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());
|
JsName name = nameCache.get(suggested.getDescriptor());
|
||||||
if (name == null) {
|
if (name == null) {
|
||||||
String baseName = suggested.getNames().get(0);
|
String baseName = suggested.getNames().get(0);
|
||||||
if (suggested.getDescriptor() instanceof LocalVariableDescriptor) {
|
if (suggested.getDescriptor() instanceof LocalVariableDescriptor ||
|
||||||
|
suggested.getDescriptor() instanceof ValueParameterDescriptor
|
||||||
|
) {
|
||||||
name = scope.declareTemporaryName(baseName);
|
name = scope.declareTemporaryName(baseName);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
+1
-1
@@ -149,7 +149,7 @@ public final class FunctionTranslator extends AbstractTranslator {
|
|||||||
jsParameters.add(new JsParameter(paramNameForType));
|
jsParameters.add(new JsParameter(paramNameForType));
|
||||||
|
|
||||||
String suggestedName = Namer.isInstanceSuggestedName(type);
|
String suggestedName = Namer.isInstanceSuggestedName(type);
|
||||||
JsName paramName = functionObject.getScope().declareName(suggestedName);
|
JsName paramName = functionObject.getScope().declareTemporaryName(suggestedName);
|
||||||
jsParameters.add(new JsParameter(paramName));
|
jsParameters.add(new JsParameter(paramName));
|
||||||
aliases.put(type, paramName.makeRef());
|
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;
|
return cache.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Kotlin.jsTypeOf = function(a) { return typeof a; };
|
||||||
|
|
||||||
////////////////////////////////// packages & modules //////////////////////////////
|
////////////////////////////////// packages & modules //////////////////////////////
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user