]> git.kaiwu.me - njs.git/commitdiff
Parser: fixed line counting in template literals.
authorAlexander Borisov <alexander.borisov@nginx.com>
Fri, 19 Jun 2020 16:48:13 +0000 (19:48 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Fri, 19 Jun 2020 16:48:13 +0000 (19:48 +0300)
This closes #321 issue on GitHub.

src/njs_parser.c
src/test/njs_unit_test.c

index 9b4632d8fd0158c58530e1166d92bb8d9d26ac68..be232f1881e1a4f4e532bad3572444d4b032bacd 100644 (file)
@@ -1141,7 +1141,7 @@ njs_parser_primary_expression_test(njs_parser_t *parser,
         parser->node = node;
 
         njs_parser_next(parser, njs_parser_template_literal);
-        break;
+        return NJS_OK;
 
     /* CoverParenthesizedExpressionAndArrowParameterList */
     case NJS_TOKEN_OPEN_PARENTHESIS:
@@ -1322,6 +1322,9 @@ njs_parser_template_literal(njs_parser_t *parser, njs_lexer_token_t *token,
 
     parser->target = temp;
 
+    token->text.start++;
+    token->text.length = 0;
+
     njs_parser_next(parser, njs_parser_template_literal_string);
 
     return NJS_OK;
@@ -2199,8 +2202,6 @@ njs_parser_property(njs_parser_t *parser, njs_lexer_token_t *token,
 
         parser->node = node;
 
-        njs_lexer_consume_token(parser->lexer, 1);
-
         njs_parser_next(parser, njs_parser_template_literal);
 
         break;
@@ -7820,28 +7821,33 @@ njs_parser_template_string(njs_parser_t *parser, njs_lexer_token_t *token)
 
         c = *p++;
 
-        if (c == '\\') {
+        switch (c) {
+        case '\\':
             if (p == lexer->end) {
-                break;
+                return NJS_ERROR;
             }
 
             p++;
             escape = 1;
 
             continue;
-        }
 
-        if (c == '`') {
+        case '`':
             text->length = p - text->start - 1;
             goto done;
-        }
 
-        if (c == '$') {
+        case '$':
             if (p < lexer->end && *p == '{') {
                 p++;
                 text->length = p - text->start - 2;
                 goto done;
             }
+
+            break;
+
+        case '\n':
+            parser->lexer->line++;
+            break;
         }
     }
 
index b7052caf863210994840713e9a00e421138984f3..c8b8b09e4e49215bede147e1ea1a2efd2dcb86a0 100644 (file)
@@ -6330,6 +6330,9 @@ static njs_unit_test_t  njs_test[] =
                  "foo`That ${person} is a ${age}`;"),
       njs_str("That  is a Mike21") },
 
+    { njs_str("`\n`.length"),
+      njs_str("1") },
+
     /* Strings. */
 
     { njs_str("var a = '0123456789' + '012345';"
@@ -17889,6 +17892,10 @@ static njs_unit_test_t  njs_shell_test[] =
       njs_str("ReferenceError: \"a\" is not defined in 2\n"
               "    at main (:2)\n") },
 
+    { njs_str("\n`\n${Object}\n${a}`" ENTER),
+      njs_str("ReferenceError: \"a\" is not defined in 4\n"
+              "    at main (:4)\n") },
+
     { njs_str("function log(v) {}\nlog({}\n.a\n.a)" ENTER),
       njs_str("TypeError: cannot get property \"a\" of undefined\n"
               "    at main (:4)\n") },