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