From 306a09020ff570c2a75216da470ed6b1e7c6f452 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke <marijnh@gmail.com>
Date: Thu, 17 Apr 2014 09:37:21 +0200
Subject: [PATCH] [javascript mode] Properly parse quasi quotes without prefix

Closes #2472
---
 mode/javascript/javascript.js | 10 ++++++----
 mode/javascript/test.js       |  3 +++
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index 9318aabe9..daf138ba8 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -366,6 +366,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
     if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
     if (type == "{") return contCommasep(objprop, "}", null, maybeop);
+    if (type == "quasi") { return pass(quasi, maybeop); }
     return cont();
   }
   function maybeexpression(type) {
@@ -390,21 +391,22 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
       if (value == "?") return cont(expression, expect(":"), expr);
       return cont(expr);
     }
-    if (type == "quasi") { cx.cc.push(me); return quasi(value); }
+    if (type == "quasi") { return pass(quasi, me); }
     if (type == ";") return;
     if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
     if (type == ".") return cont(property, me);
     if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
   }
-  function quasi(value) {
-    if (value.slice(value.length - 2) != "${") return cont();
+  function quasi(type, value) {
+    if (type != "quasi") return pass();
+    if (value.slice(value.length - 2) != "${") return cont(quasi);
     return cont(expression, continueQuasi);
   }
   function continueQuasi(type) {
     if (type == "}") {
       cx.marked = "string-2";
       cx.state.tokenize = tokenQuasi;
-      return cont();
+      return cont(quasi);
     }
   }
   function arrowBody(type) {
diff --git a/mode/javascript/test.js b/mode/javascript/test.js
index 36341862f..782f0457f 100644
--- a/mode/javascript/test.js
+++ b/mode/javascript/test.js
@@ -70,6 +70,9 @@
   MT("quasi",
      "[variable re][string-2 `fofdlakj${][variable x] [operator +] ([variable re][string-2 `foo`]) [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]");
 
+  MT("quasi_no_function",
+     "[variable x] [operator =] [string-2 `fofdlakj${][variable x] [operator +] [string-2 `foo`] [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]");
+
   MT("indent_statement",
      "[keyword var] [variable x] [operator =] [number 10]",
      "[variable x] [operator +=] [variable y] [operator +]",
-- 
GitLab