[JS IR] Add tests for JS code KLIB diagnostics

^KT-62425
This commit is contained in:
Alexander Korepanov
2023-10-11 12:19:27 +02:00
committed by Space Team
parent 261527939b
commit 4ebfed04d3
22 changed files with 1223 additions and 0 deletions
@@ -0,0 +1,13 @@
// FIR_IDENTICAL
fun testSimpleString() {
js("var a = 123;")
}
fun testSimpleStringPlus() {
js("var a" + "=" + "123;")
}
fun testSimpleStringConcat() {
js("var a${"="}123;")
}
@@ -0,0 +1,96 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// MODULE: lib1
// FILE: A.kt
class ClassFromOtherModule {
companion object {
val valFromOtherModuleCompanion = "valFromOtherModuleCompanion"
}
}
// FILE: B.kt
class ClassFromOtherModule2 {
companion object {
val valFromOtherModuleCompanion2 = ClassFromOtherModule.valFromOtherModuleCompanion + "2"
}
}
// MODULE: main(lib1)
// FILE: A.kt
class ClassFromOtherFile {
companion object {
val valFromOtherFileCompanion = "valFromOtherFileCompanion"
}
}
// FILE: B.kt
class ClassFromOtherFile2 {
companion object {
val valFromOtherFileCompanion2 = ClassFromOtherFile.valFromOtherFileCompanion + "2"
}
}
// FILE: Main.kt
class ClassFromThisFile {
companion object {
val valFromThisFileCompanion = "valFromThisFileCompanion"
fun testCompanionFromThisCompanion() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!> + " = 1;"<!>)
}
}
fun testCompanionFromThis() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!> + " = 1;"<!>)
}
}
class ClassFromThisFile2 {
companion object {
val valFromThisFileCompanion2 = ClassFromThisFile.valFromThisFileCompanion + "2"
fun testCompanionFromThisCompanion() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!> + " = 1;"<!>)
}
}
fun testCompanionFromThis() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!> + " = 1;"<!>)
}
}
fun testCompanionValFromOtherModule() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromOtherModule.valFromOtherModuleCompanion<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromOtherModule.valFromOtherModuleCompanion<!> + " = 1;"<!>)
}
fun testCompanionValFromOtherModule2() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromOtherModule2.valFromOtherModuleCompanion2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromOtherModule2.valFromOtherModuleCompanion2<!> + " = 1;"<!>)
}
fun testCompanionValFromOtherFile() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromOtherFile.valFromOtherFileCompanion<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromOtherFile.valFromOtherFileCompanion<!> + " = 1;"<!>)
}
fun testCompanionValFromOtherFile2() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromOtherFile2.valFromOtherFileCompanion2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromOtherFile2.valFromOtherFileCompanion2<!> + " = 1;"<!>)
}
fun testCompanionValFromThisFile() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromThisFile.valFromThisFileCompanion<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromThisFile.valFromThisFileCompanion<!> + " = 1;"<!>)
}
fun testCompanionValFromThisFile2() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromThisFile2.valFromThisFileCompanion2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>ClassFromThisFile2.valFromThisFileCompanion2<!> + " = 1;"<!>)
}
@@ -0,0 +1,96 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// MODULE: lib1
// FILE: A.kt
class ClassFromOtherModule {
companion object {
val valFromOtherModuleCompanion = "valFromOtherModuleCompanion"
}
}
// FILE: B.kt
class ClassFromOtherModule2 {
companion object {
val valFromOtherModuleCompanion2 = ClassFromOtherModule.valFromOtherModuleCompanion + "2"
}
}
// MODULE: main(lib1)
// FILE: A.kt
class ClassFromOtherFile {
companion object {
val valFromOtherFileCompanion = "valFromOtherFileCompanion"
}
}
// FILE: B.kt
class ClassFromOtherFile2 {
companion object {
val valFromOtherFileCompanion2 = ClassFromOtherFile.valFromOtherFileCompanion + "2"
}
}
// FILE: Main.kt
class ClassFromThisFile {
companion object {
val valFromThisFileCompanion = "valFromThisFileCompanion"
fun testCompanionFromThisCompanion() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!> + " = 1;")
}
}
fun testCompanionFromThis() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!> + " = 1;")
}
}
class ClassFromThisFile2 {
companion object {
val valFromThisFileCompanion2 = ClassFromThisFile.valFromThisFileCompanion + "2"
fun testCompanionFromThisCompanion() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!> + " = 1;")
}
}
fun testCompanionFromThis() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!> + " = 1;")
}
}
fun testCompanionValFromOtherModule() {
js("var ${ClassFromOtherModule.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModuleCompanion<!>} = 1;")
js("var " + ClassFromOtherModule.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModuleCompanion<!> + " = 1;")
}
fun testCompanionValFromOtherModule2() {
js("var ${ClassFromOtherModule2.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModuleCompanion2<!>} = 1;")
js("var " + ClassFromOtherModule2.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModuleCompanion2<!> + " = 1;")
}
fun testCompanionValFromOtherFile() {
js("var ${ClassFromOtherFile.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFileCompanion<!>} = 1;")
js("var " + ClassFromOtherFile.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFileCompanion<!> + " = 1;")
}
fun testCompanionValFromOtherFile2() {
js("var ${ClassFromOtherFile2.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFileCompanion2<!>} = 1;")
js("var " + ClassFromOtherFile2.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFileCompanion2<!> + " = 1;")
}
fun testCompanionValFromThisFile() {
js("var ${ClassFromThisFile.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!>} = 1;")
js("var " + ClassFromThisFile.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion<!> + " = 1;")
}
fun testCompanionValFromThisFile2() {
js("var ${ClassFromThisFile2.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!>} = 1;")
js("var " + ClassFromThisFile2.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFileCompanion2<!> + " = 1;")
}
@@ -0,0 +1,76 @@
// FIR_IDENTICAL
// MODULE: lib1
// FILE: A.kt
const val constFromOtherModule = "constFromOtherModule"
class ClassFromOtherModule {
companion object {
const val constFromOtherModuleCompanion = "constFromOtherModuleCompanion"
}
}
// MODULE: main(lib1)
// FILE: A.kt
const val constFromOtherFile = "constFromOtherFile"
class ClassFromOtherFile {
companion object {
const val constFromOtherFileCompanion = "constFromOtherFileCompanion"
}
}
// FILE: Main.kt
const val constFromThisFile = "constFromThisFile"
open class ClassFromThisFile {
companion object {
const val constFromThisFileCompanion = "constFromThisFileCompanion"
fun testCompanionFromThisCompanion() {
js("var ${constFromThisFileCompanion} = 1;")
js("var " + constFromThisFileCompanion + " = 1;")
}
}
fun testCompanionFromThis() {
js("var ${constFromThisFileCompanion} = 1;")
js("var " + constFromThisFileCompanion + " = 1;")
}
}
class Class: ClassFromThisFile() {
fun testCompanionFromParent() {
js("var ${constFromThisFileCompanion} = 1;")
js("var " + constFromThisFileCompanion + " = 1;")
}
}
fun testConstFromOtherModule() {
js("var $constFromOtherModule = 1;")
js("var " + constFromOtherModule + " = 1;")
}
fun testCompanionConstFromOtherModule() {
js("var ${ClassFromOtherModule.constFromOtherModuleCompanion} = 1;")
js("var " + ClassFromOtherModule.constFromOtherModuleCompanion + " = 1;")
}
fun testConstFromOtherFile() {
js("var $constFromOtherFile = 1;")
js("var " + constFromOtherFile + " = 1;")
}
fun testCompanionConstFromOtherFile() {
js("var ${ClassFromOtherFile.constFromOtherFileCompanion} = 1;")
js("var " + ClassFromOtherFile.constFromOtherFileCompanion + " = 1;")
}
fun testConstFromThisFile() {
js("var $constFromThisFile = 1;")
js("var " + constFromThisFile + " = 1;")
}
fun testCompanionConstFromThisFile() {
js("var ${ClassFromThisFile.constFromThisFileCompanion} = 1;")
js("var " + ClassFromThisFile.constFromThisFileCompanion + " = 1;")
}
@@ -0,0 +1,39 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// ERROR_POLICY: SEMANTIC
@file:Suppress("NOTHING_TO_INLINE")
fun function1() = "function1"
inline fun inlineFunction1() = "inlineFunction1"
class Class {
fun method1() = "method1"
inline fun inlineMethod1() = "method1"
fun testMethodFromThis() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var a = '${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>method1()<!>}' + '" + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>method1()<!> + "';"<!>)
}
fun testInlineMethodFromThis() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var a = '${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>inlineMethod1()<!>}' + '" + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>inlineMethod1()<!> + "';"<!>)
}
}
fun testFunction() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var a = '${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>function1()<!>}' + '" + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>function1()<!> + "';"<!>)
}
fun testInlineFunction() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var a = '${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>inlineFunction1()<!>}' + '" + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>inlineFunction1()<!> + "';"<!>)
}
fun testMethod() {
val c = Class()
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var a = '${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.method1()}' + '" + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.method1() + "';"<!>)
}
fun testInlineMethod() {
val c = Class()
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var a = '${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.inlineMethod1()}' + '" + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.inlineMethod1() + "';"<!>)
}
@@ -0,0 +1,39 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// ERROR_POLICY: SEMANTIC
@file:Suppress("NOTHING_TO_INLINE")
fun function1() = "function1"
inline fun inlineFunction1() = "inlineFunction1"
class Class {
fun method1() = "method1"
inline fun inlineMethod1() = "method1"
fun testMethodFromThis() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var a = '${method1()}' + '" + method1() + "';"<!>)
}
fun testInlineMethodFromThis() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var a = '${inlineMethod1()}' + '" + inlineMethod1() + "';"<!>)
}
}
fun testFunction() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var a = '${function1()}' + '" + function1() + "';"<!>)
}
fun testInlineFunction() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var a = '${inlineFunction1()}' + '" + inlineFunction1() + "';"<!>)
}
fun testMethod() {
val c = Class()
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var a = '${c.method1()}' + '" + c.method1() + "';"<!>)
}
fun testInlineMethod() {
val c = Class()
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var a = '${c.inlineMethod1()}' + '" + c.inlineMethod1() + "';"<!>)
}
@@ -0,0 +1,122 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// ERROR_POLICY: SEMANTIC
@file:Suppress(
"DEPRECATED_IDENTITY_EQUALS",
"SENSELESS_COMPARISON"
)
fun testTrimMargin() {
js(<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>"""
| var x = 1;
""".<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>trimMargin()<!><!>)
}
fun testTrimIndent() {
js(<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>"""
var x = 1;
""".<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>trimIndent()<!><!>)
}
const val ONE = 1
const val UONE = 1U
const val HALF = 0.5
const val TRUE = true
const val STR = "str"
const val CHAR = 'C'
fun testStringSize() {
js("var a = ${STR.length};")
}
fun testSimpleStringConcat() {
js("{ var a = '${'b'}'; }")
js("{ var a = ${123}; }")
js("{ var a = ${123U}; }")
js("{ var a = ${123L}; }")
js("{ var a = ${123UL}; }")
js("{ var a = ${1.23}; }")
js("{ var a = ${1.23f}; }")
js("{ var a = ${true}; }")
js("{ var a = ${false}; }")
js("{ var a = ${null}; }")
js("{ var a = ${ONE}; }")
js("{ var a = ${UONE}; }")
js("{ var a = ${HALF}; }")
js("{ var a = ${TRUE}; }")
js("{ var a = '${STR}'; }")
js("{ var a = '${CHAR}'; }")
}
fun testArithmeticOperations() {
js("{ var a = ${1 + 2}; }")
js("{ var a = ${1 - 2}; }")
js("{ var a = ${1 * 2}; }")
js("{ var a = ${1 / 2}; }")
js("{ var a = ${1 % 2}; }")
js("{ var a = ${1.1 + 2.1}; }")
js("{ var a = ${1.1 - 2.1}; }")
js("{ var a = ${1.1 * 2.1}; }")
js("{ var a = ${1.1 / 2.1}; }")
js("{ var a = ${ONE + 2}; }")
js("{ var a = ${HALF + 2.1}; }")
js("{ var a = '${"foo" + "bar"}'; }")
js("{ var a = '${"foo" + 'c'}'; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = '${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>'c' + "foo"<!>}'; }"<!>)
js("{ var a = ${STR + STR}; }")
js("{ var a = ${STR + CHAR}; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>CHAR + STR<!>}; }"<!>)
}
fun testLogicOperations() {
js("{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>!true<!>}; }")
js("{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>true or false<!>}; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${true || false}; }"<!>)
js("{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>true and false<!>}; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${true && false}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${TRUE && false}; }"<!>)
js("{ var a = ${TRUE or false}; }")
}
fun testEq() {
js("{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1 == 1<!>}; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1U == 1U<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${UONE == 1U}; }"<!>)
js("{ var a = ${"FOO" == STR}; }")
js("{ var a = ${TRUE == null}; }")
js("{ var a = ${STR == null}; }")
js("{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1 != 1<!>}; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1U != 1U<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${UONE != 1U}; }"<!>)
js("{ var a = ${"FOO" != STR}; }")
js("{ var a = ${TRUE != null}; }")
js("{ var a = ${STR != null}; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1 === 1<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${TRUE === false}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${CHAR === 's'}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1 !== 1<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${TRUE !== false}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${CHAR !== 's'}; }"<!>)
}
fun testCmp() {
js("{ var a = ${1 < 1}; }")
js("{ var a = ${1 <= 1}; }")
js("{ var a = ${1 > 1}; }")
js("{ var a = ${1 >= 1}; }")
js("{ var a = ${"fo=" < "bar"}; }")
js("{ var a = ${'a' > 'c'}; }")
js("{ var a = ${ONE > 1}; }")
js("{ var a = ${STR <= "1"}; }")
}
@@ -0,0 +1,122 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// ERROR_POLICY: SEMANTIC
@file:Suppress(
"DEPRECATED_IDENTITY_EQUALS",
"SENSELESS_COMPARISON"
)
fun testTrimMargin() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"""
| var x = 1;
""".trimMargin()<!>)
}
fun testTrimIndent() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"""
var x = 1;
""".trimIndent()<!>)
}
const val ONE = 1
const val UONE = 1U
const val HALF = 0.5
const val TRUE = true
const val STR = "str"
const val CHAR = 'C'
fun testStringSize() {
js("var a = ${STR.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>length<!>};")
}
fun testSimpleStringConcat() {
js("{ var a = '${'b'}'; }")
js("{ var a = ${123}; }")
js("{ var a = ${123U}; }")
js("{ var a = ${123L}; }")
js("{ var a = ${123UL}; }")
js("{ var a = ${1.23}; }")
js("{ var a = ${1.23f}; }")
js("{ var a = ${true}; }")
js("{ var a = ${false}; }")
js("{ var a = ${null}; }")
js("{ var a = ${ONE}; }")
js("{ var a = ${UONE}; }")
js("{ var a = ${HALF}; }")
js("{ var a = ${TRUE}; }")
js("{ var a = '${STR}'; }")
js("{ var a = '${CHAR}'; }")
}
fun testArithmeticOperations() {
js("{ var a = ${1 + 2}; }")
js("{ var a = ${1 - 2}; }")
js("{ var a = ${1 * 2}; }")
js("{ var a = ${1 / 2}; }")
js("{ var a = ${1 % 2}; }")
js("{ var a = ${1.1 + 2.1}; }")
js("{ var a = ${1.1 - 2.1}; }")
js("{ var a = ${1.1 * 2.1}; }")
js("{ var a = ${1.1 / 2.1}; }")
js("{ var a = ${ONE + 2}; }")
js("{ var a = ${HALF + 2.1}; }")
js("{ var a = '${"foo" + "bar"}'; }")
js("{ var a = '${"foo" + 'c'}'; }")
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = '${'c' + "foo"}'; }"<!>)
js("{ var a = ${STR + STR}; }")
js("{ var a = ${STR + CHAR}; }")
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${CHAR + STR}; }"<!>)
}
fun testLogicOperations() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${!true}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${true or false}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${true || false}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${true and false}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${true && false}; }"<!>)
js("{ var a = ${TRUE && false}; }")
js("{ var a = ${TRUE or false}; }")
}
fun testEq() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1 == 1}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1U == 1U}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${UONE == 1U}; }"<!>)
js("{ var a = ${"FOO" == STR}; }")
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${TRUE == null}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${STR == null}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1 != 1}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1U != 1U}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${UONE != 1U}; }"<!>)
js("{ var a = ${"FOO" != STR}; }")
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${TRUE != null}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${STR != null}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1 === 1}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${TRUE === false}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${CHAR === 's'}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1 !== 1}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${TRUE !== false}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${CHAR !== 's'}; }"<!>)
}
fun testCmp() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1 < 1}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1 <= 1}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1 > 1}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${1 >= 1}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${"fo=" < "bar"}; }"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"{ var a = ${'a' > 'c'}; }"<!>)
js("{ var a = ${ONE > 1}; }")
js("{ var a = ${STR <= "1"}; }")
}
@@ -0,0 +1,58 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// ERROR_POLICY: SEMANTIC
// MODULE: lib1
// FILE: A.kt
val valFromOtherModule = "valFromOtherModule"
// FILE: B.kt
val valFromOtherModule2 = valFromOtherModule + "2"
// MODULE: main(lib1)
// FILE: A.kt
val valFromOtherFile = "valFromOtherFile"
// FILE: B.kt
val valFromOtherFile2 = valFromOtherFile + "2"
// FILE: Main.kt
val valFromThisFile = "valFromThisFile"
val valFromThisFile2 = valFromThisFile + "2"
val valWithGetter: String get() = "valWithGetter"
fun testValFromOtherModule() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModule<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModule<!> + " = 1;"<!>)
}
fun testValFromOtherModule2() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModule2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModule2<!> + " = 1;"<!>)
}
fun testValFromOtherFile() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFile<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFile<!> + " = 1;"<!>)
}
fun testValFromOtherFile2() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFile2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFile2<!> + " = 1;"<!>)
}
fun testValFromThisFile() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFile<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFile<!> + " = 1;"<!>)
}
fun testValFromThisFile2() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFile2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFile2<!> + " = 1;"<!>)
}
fun testValWithGetter() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valWithGetter<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valWithGetter<!> + " = 1;"<!>)
}
@@ -0,0 +1,58 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// ERROR_POLICY: SEMANTIC
// MODULE: lib1
// FILE: A.kt
val valFromOtherModule = "valFromOtherModule"
// FILE: B.kt
val valFromOtherModule2 = valFromOtherModule + "2"
// MODULE: main(lib1)
// FILE: A.kt
val valFromOtherFile = "valFromOtherFile"
// FILE: B.kt
val valFromOtherFile2 = valFromOtherFile + "2"
// FILE: Main.kt
val valFromThisFile = "valFromThisFile"
val valFromThisFile2 = valFromThisFile + "2"
val valWithGetter: String get() = "valWithGetter"
fun testValFromOtherModule() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModule<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModule<!> + " = 1;")
}
fun testValFromOtherModule2() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModule2<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherModule2<!> + " = 1;")
}
fun testValFromOtherFile() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFile<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFile<!> + " = 1;")
}
fun testValFromOtherFile2() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFile2<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromOtherFile2<!> + " = 1;")
}
fun testValFromThisFile() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFile<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFile<!> + " = 1;")
}
fun testValFromThisFile2() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFile2<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFile2<!> + " = 1;")
}
fun testValWithGetter() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var ${valWithGetter} = 1;"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var " + valWithGetter + " = 1;"<!>)
}
@@ -0,0 +1,63 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// ERROR_POLICY: SEMANTIC
fun testValFromThisFunction() {
val valFromThisFunction = "valFromThisFunction"
val valFromThisFunction2 = valFromThisFunction + "2"
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFunction<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFunction<!> + " = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFunction2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFunction2<!> + " = 1;"<!>)
}
fun testVarFromThisFunction() {
var varFromThisFunction = "varFromThisFunction"
var varFromThisFunction2 = varFromThisFunction + "2"
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>varFromThisFunction<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>varFromThisFunction<!> + " = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>varFromThisFunction2<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>varFromThisFunction2<!> + " = 1;"<!>)
}
fun testValFromParam(valFromParam: String) {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromParam<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromParam<!> + " = 1;"<!>)
}
class Class {
val valFromClass = "valFromClass"
val valWithGetter: String get() = "valWithGetter"
fun testValFromThis() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromClass<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromClass<!> + " = 1;"<!>)
}
fun testValWithGetterThis() {
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valWithGetter<!>} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valWithGetter<!> + " = 1;"<!>)
}
}
fun testValFromClassObject() {
val c = Class()
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.valFromClass} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.valFromClass + " = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.valWithGetter} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.valWithGetter + " = 1;"<!>)
}
fun testValFromObject() {
val o = object {
val valFromObject = "valFromClass"
}
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>o<!>.valFromObject} = 1;"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>o<!>.valFromObject + " = 1;"<!>)
}
@@ -0,0 +1,63 @@
// FIR_DIFFERENCE
// The difference is okay: K1 and K2 report a bit differently
// ERROR_POLICY: SEMANTIC
fun testValFromThisFunction() {
val valFromThisFunction = "valFromThisFunction"
val valFromThisFunction2 = valFromThisFunction + "2"
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFunction<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFunction<!> + " = 1;")
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFunction2<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromThisFunction2<!> + " = 1;")
}
fun testVarFromThisFunction() {
var varFromThisFunction = "varFromThisFunction"
var varFromThisFunction2 = varFromThisFunction + "2"
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var ${varFromThisFunction} = 1;"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var " + varFromThisFunction + " = 1;"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var ${varFromThisFunction2} = 1;"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var " + varFromThisFunction2 + " = 1;"<!>)
}
fun testValFromParam(valFromParam: String) {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var ${valFromParam} = 1;"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var " + valFromParam + " = 1;"<!>)
}
class Class {
val valFromClass = "valFromClass"
val valWithGetter: String get() = "valWithGetter"
fun testValFromThis() {
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromClass<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromClass<!> + " = 1;")
}
fun testValWithGetterThis() {
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var ${valWithGetter} = 1;"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var " + valWithGetter + " = 1;"<!>)
}
}
fun testValFromClassObject() {
val c = Class()
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromClass<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>c<!>.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromClass<!> + " = 1;")
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var ${c.valWithGetter} = 1;"<!>)
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>"var " + c.valWithGetter + " = 1;"<!>)
}
fun testValFromObject() {
val o = object {
val valFromObject = "valFromClass"
}
js("var ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>o<!>.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromObject<!>} = 1;")
js("var " + <!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>o<!>.<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>valFromObject<!> + " = 1;")
}
@@ -0,0 +1,19 @@
// FIR_IDENTICAL
// ERROR_POLICY: SEMANTIC
fun testEmptyString() {
js(<!JSCODE_NO_JAVASCRIPT_PRODUCED!>""<!>)
}
const val SPACE = " "
fun testStringWithSpaces() {
js(<!JSCODE_NO_JAVASCRIPT_PRODUCED!>"\n \n$SPACE \t" + " "<!>)
}
fun testComment() {
js(<!JSCODE_NO_JAVASCRIPT_PRODUCED!>"""
// just a comment
$SPACE
"""<!>)
}
@@ -0,0 +1,8 @@
// FIR_IDENTICAL
// ERROR_POLICY: SEMANTIC
const val VALUE = 123
fun testJavaScriptError() {
js(<!JSCODE_ERROR!>"var = $VALUE;"<!>)
}
@@ -0,0 +1,7 @@
// FIR_IDENTICAL
const val VALUE = 888
fun testJavaScriptWarning() {
js(<!JSCODE_WARNING!>"var a = 0$VALUE;"<!>)
}