KJS: fix inlining from modules with non valid identifier name

This commit is contained in:
Zalim Bashorov
2017-01-25 21:16:02 +03:00
parent 487419e762
commit 66fd566df0
4 changed files with 60 additions and 2 deletions
@@ -46,7 +46,7 @@ import java.io.File
private val JS_IDENTIFIER_START = "\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\\$_"
private val JS_IDENTIFIER_PART = "$JS_IDENTIFIER_START\\p{Pc}\\p{Mc}\\p{Mn}\\d"
private val JS_IDENTIFIER="[$JS_IDENTIFIER_START][$JS_IDENTIFIER_PART]*"
private val DEFINE_MODULE_PATTERN = ("($JS_IDENTIFIER)\\.defineModule\\(\\s*(['\"])(\\w+)\\2\\s*,\\s*(\\w+)\\s*\\)").toRegex().toPattern()
private val DEFINE_MODULE_PATTERN = ("($JS_IDENTIFIER)\\.defineModule\\(\\s*(['\"])([^'\"]+)\\2\\s*,\\s*(\\w+)\\s*\\)").toRegex().toPattern()
private val DEFINE_MODULE_FIND_PATTERN = ".defineModule("
class FunctionReader(private val context: TranslationContext) {
@@ -87,7 +87,7 @@ class FunctionReader(private val context: TranslationContext) {
val moduleName = preciseMatcher.group(3)
val moduleVariable = preciseMatcher.group(4)
val kotlinVariable = preciseMatcher.group(1)
assert(moduleName !in moduleJsDefinition) { "Module is defined in more, than one file" }
assert(moduleName !in moduleJsDefinition) { "Module \"$moduleName\" is defined in more, than one file" }
moduleJsDefinition[moduleName] = fileContent
moduleRootVariable[moduleName] = moduleVariable
moduleKotlinVariable[moduleName] = kotlinVariable
@@ -5485,6 +5485,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/multiModuleWrappers/common_js"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.JS, true);
}
@TestMetadata("inlineFromModuleWithNonIdentifierName.kt")
public void testInlineFromModuleWithNonIdentifierName() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/multiModuleWrappers/common_js/inlineFromModuleWithNonIdentifierName.kt");
doTest(fileName);
}
@TestMetadata("moduleWithNonIdentifierName.kt")
public void testModuleWithNonIdentifierName() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/multiModuleWrappers/common_js/moduleWithNonIdentifierName.kt");
@@ -5506,6 +5512,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/multiModuleWrappers/plain"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.JS, true);
}
@TestMetadata("inlineFromModuleWithNonIdentifierName.kt")
public void testInlineFromModuleWithNonIdentifierName() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/multiModuleWrappers/plain/inlineFromModuleWithNonIdentifierName.kt");
doTest(fileName);
}
@TestMetadata("moduleWithNonIdentifierName.kt")
public void testModuleWithNonIdentifierName() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/multiModuleWrappers/plain/moduleWithNonIdentifierName.kt");
@@ -0,0 +1,23 @@
// MODULE: #my-libr@ry
// FILE: bar.kt
// MODULE_KIND: COMMON_JS
// PROPERTY_NOT_WRITTEN_TO: baz
// PROPERTY_NOT_WRITTEN_TO: boo_287e2$
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
inline fun foo() = "foo"
@kotlin.internal.InlineOnly
inline fun baz() = "baz"
inline fun <reified T> boo() = "boo"
// MODULE: main(#my-libr@ry)
// FILE: box.kt
// MODULE_KIND: COMMON_JS
// CHECK_CONTAINS_NO_CALLS: box except=assertEquals
fun box(): String {
assertEquals("foo", foo())
assertEquals("baz", baz())
assertEquals("boo", boo<Int>())
return "OK"
}
@@ -0,0 +1,23 @@
// MODULE: #my-libr@ry
// FILE: bar.kt
// MODULE_KIND: PLAIN
// PROPERTY_NOT_WRITTEN_TO: baz
// PROPERTY_NOT_WRITTEN_TO: boo_287e2$
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
inline fun foo() = "foo"
@kotlin.internal.InlineOnly
inline fun baz() = "baz"
inline fun <reified T> boo() = "boo"
// MODULE: main(#my-libr@ry)
// FILE: box.kt
// MODULE_KIND: PLAIN
// CHECK_CONTAINS_NO_CALLS: box except=assertEquals
fun box(): String {
assertEquals("foo", foo())
assertEquals("baz", baz())
assertEquals("boo", boo<Int>())
return "OK"
}