From 6954ddde73d24174a5540391050267b79204fbfb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oskar=20Segersv=C3=A4rd?= <oseg@google.com>
Date: Tue, 11 Oct 2016 17:38:17 +0200
Subject: [PATCH] [javascript mode] Fix tokenization for class expressions

---
 mode/javascript/javascript.js |  6 ++++++
 mode/javascript/test.js       | 10 ++++++++++
 2 files changed, 16 insertions(+)

diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index 8ff38b81b..a71774589 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -395,6 +395,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
     if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
     if (type == "function") return cont(functiondef, maybeop);
+    if (type == "class") return cont(pushlex("form"), classExpression, poplex);
     if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
     if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop);
     if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
@@ -619,6 +620,11 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     if (type == "spread") return cont(funarg);
     return pass(pattern, maybetype, maybeAssign);
   }
+  function classExpression(type, value) {
+    // Class expressions may have an optional name.
+    if (type == "variable") return className(type, value);
+    return classNameAfter(type, value);
+  }
   function className(type, value) {
     if (type == "variable") {register(value); return cont(classNameAfter);}
   }
diff --git a/mode/javascript/test.js b/mode/javascript/test.js
index 91c8b7434..41765e75d 100644
--- a/mode/javascript/test.js
+++ b/mode/javascript/test.js
@@ -38,6 +38,16 @@
      "  }",
      "}");
 
+  MT("anonymous_class_expression",
+     "[keyword const] [def Adder] [operator =] [keyword class] [keyword extends] [variable Arithmetic] {",
+     "  [property add]([def a], [def b]) {}",
+     "};");
+
+  MT("named_class_expression",
+     "[keyword const] [def Subber] [operator =] [keyword class] [def Subtract] {",
+     "  [property sub]([def a], [def b]) {}",
+     "};");
+
   MT("import",
      "[keyword function] [def foo]() {",
      "  [keyword import] [def $] [keyword from] [string 'jquery'];",
-- 
GitLab