From ca7062d7766986b5dcb5b77a3072f00f185c9d38 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Mon, 24 Apr 2017 12:17:52 +0300 Subject: [PATCH] Fix JS parser to properly handle "." sequence --- .../src/com/google/gwt/dev/js/rhino/Parser.java | 3 ++- .../com/google/gwt/dev/js/rhino/TokenStream.java | 3 ++- .../js/test/semantics/BoxJsTestGenerated.java | 6 ++++++ .../box/inlineMultiModule/keywordAsMemberName.kt | 13 +++++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 js/js.translator/testData/box/inlineMultiModule/keywordAsMemberName.kt diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java index 7b2d877fd97..55a2f57e5d2 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java @@ -995,8 +995,9 @@ public class Parser extends Observable { int tt; while ((tt = ts.getToken()) > ts.EOF) { if (tt == ts.DOT) { + ts.treatKeywordAsIdentifier = true; mustMatchToken(ts, ts.NAME, "msg.no.name.after.dot"); - String s = ts.getString(); + ts.treatKeywordAsIdentifier = false; pn = nf.createBinary(ts.DOT, pn, nf.createName(ts.getString())); /* * pn = nf.createBinary(ts.DOT, pn, memberExpr(ts)) is the version in diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/TokenStream.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/TokenStream.java index 8d46d5024ec..c52b98e2592 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/TokenStream.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/TokenStream.java @@ -695,7 +695,7 @@ public class TokenStream { in.unread(); String str = getStringFromBuffer(); - if (!containsEscape) { + if (!containsEscape && !treatKeywordAsIdentifier) { // OPT we shouldn't have to make a string (object!) to // check if it's a keyword. @@ -1477,6 +1477,7 @@ public class TokenStream { CodePosition lastPosition; private int op; + public boolean treatKeywordAsIdentifier; // Set this to an inital non-null value so that the Parser has // something to retrieve even if an error has occured and no diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index d0d4df64194..2afac13e9ec 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -4664,6 +4664,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("keywordAsMemberName.kt") + public void testKeywordAsMemberName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/keywordAsMemberName.kt"); + doTest(fileName); + } + @TestMetadata("kt16144.kt") public void testKt16144() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/kt16144.kt"); diff --git a/js/js.translator/testData/box/inlineMultiModule/keywordAsMemberName.kt b/js/js.translator/testData/box/inlineMultiModule/keywordAsMemberName.kt new file mode 100644 index 00000000000..a5b5a499a86 --- /dev/null +++ b/js/js.translator/testData/box/inlineMultiModule/keywordAsMemberName.kt @@ -0,0 +1,13 @@ +// MINIFICATION_THRESHOLD: 481 +// MODULE: lib +// FILE: lib.kt +class A { + fun instanceof() = "OK" +} + +inline fun foo() = A().instanceof() + +// MODULE: main(lib) +// FILE: main.kt + +fun box() = foo() \ No newline at end of file