From 0ac67b10862d5b0350613dbc3775e98c60d7a20b Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke <marijn@haverbeke.nl>
Date: Thu, 25 May 2017 11:17:56 +0200
Subject: [PATCH] Add a dedicated 'type' token type

Rather than abusing variable-3. Coloring is the same for now.
---
 lib/codemirror.css            |  2 +-
 mode/clike/clike.js           |  8 ++---
 mode/clike/test.js            | 12 +++----
 mode/elm/elm.js               |  2 +-
 mode/javascript/javascript.js |  4 +--
 mode/javascript/test.js       | 64 +++++++++++++++++------------------
 mode/jsx/test.js              |  4 +--
 theme/abcdef.css              |  2 +-
 theme/ambiance.css            |  2 +-
 theme/cobalt.css              |  2 +-
 theme/colorforth.css          |  2 +-
 theme/dracula.css             |  2 +-
 theme/duotone-dark.css        |  2 +-
 theme/duotone-light.css       |  2 +-
 theme/eclipse.css             |  2 +-
 theme/erlang-dark.css         |  2 +-
 theme/icecoder.css            |  2 +-
 theme/lesser-dark.css         |  2 +-
 theme/liquibyte.css           |  2 +-
 theme/material.css            |  4 +--
 theme/mdn-like.css            |  2 +-
 theme/monokai.css             |  2 +-
 theme/night.css               |  2 +-
 theme/panda-syntax.css        |  2 +-
 theme/pastel-on-dark.css      |  2 +-
 theme/rubyblue.css            |  2 +-
 theme/seti.css                |  2 +-
 theme/solarized.css           |  2 +-
 theme/the-matrix.css          |  2 +-
 theme/ttcn.css                |  2 +-
 theme/twilight.css            |  2 +-
 theme/vibrant-ink.css         |  2 +-
 theme/xq-dark.css             |  2 +-
 theme/xq-light.css            |  2 +-
 theme/yeti.css                |  2 +-
 35 files changed, 77 insertions(+), 77 deletions(-)

diff --git a/lib/codemirror.css b/lib/codemirror.css
index b962b3837..b008351a6 100644
--- a/lib/codemirror.css
+++ b/lib/codemirror.css
@@ -119,7 +119,7 @@
 .cm-s-default .cm-property,
 .cm-s-default .cm-operator {}
 .cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
 .cm-s-default .cm-comment {color: #a50;}
 .cm-s-default .cm-string {color: #a11;}
 .cm-s-default .cm-string-2 {color: #f50;}
diff --git a/mode/clike/clike.js b/mode/clike/clike.js
index 4c2acd6cf..56c3a05b4 100644
--- a/mode/clike/clike.js
+++ b/mode/clike/clike.js
@@ -33,7 +33,7 @@ function popContext(state) {
 }
 
 function typeBefore(stream, state, pos) {
-  if (state.prevToken == "variable" || state.prevToken == "variable-3") return true;
+  if (state.prevToken == "variable" || state.prevToken == "type") return true;
   if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true;
   if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;
 }
@@ -112,7 +112,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
       if (contains(defKeywords, cur)) isDefKeyword = true;
       return "keyword";
     }
-    if (contains(types, cur)) return "variable-3";
+    if (contains(types, cur)) return "type";
     if (contains(builtin, cur)) {
       if (contains(blockKeywords, cur)) curPunc = "newstatement";
       return "builtin";
@@ -281,7 +281,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
   }
 
   function pointerHook(_stream, state) {
-    if (state.prevToken == "variable-3") return "variable-3";
+    if (state.prevToken == "type") return "type";
     return false;
   }
 
@@ -774,7 +774,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
         return "atom";
       },
       token: function(_stream, state, style) {
-          if ((style == "variable" || style == "variable-3") &&
+          if ((style == "variable" || style == "type") &&
               state.prevToken == ".") {
             return "variable-2";
           }
diff --git a/mode/clike/test.js b/mode/clike/test.js
index 17e652b76..dad2e246a 100644
--- a/mode/clike/test.js
+++ b/mode/clike/test.js
@@ -6,8 +6,8 @@
   function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
 
   MT("indent",
-     "[variable-3 void] [def foo]([variable-3 void*] [variable a], [variable-3 int] [variable b]) {",
-     "  [variable-3 int] [variable c] [operator =] [variable b] [operator +]",
+     "[type void] [def foo]([type void*] [variable a], [type int] [variable b]) {",
+     "  [type int] [variable c] [operator =] [variable b] [operator +]",
      "    [number 1];",
      "  [keyword return] [operator *][variable a];",
      "}");
@@ -21,9 +21,9 @@
      "}");
 
   MT("def",
-     "[variable-3 void] [def foo]() {}",
+     "[type void] [def foo]() {}",
      "[keyword struct] [def bar]{}",
-     "[variable-3 int] [variable-3 *][def baz]() {}");
+     "[type int] [type *][def baz]() {}");
 
   MT("def_new_line",
      "::[variable std]::[variable SomeTerribleType][operator <][variable T][operator >]",
@@ -37,10 +37,10 @@
 
   MT("preprocessor",
      "[meta #define FOO 3]",
-     "[variable-3 int] [variable foo];",
+     "[type int] [variable foo];",
      "[meta #define BAR\\]",
      "[meta 4]",
-     "[variable-3 unsigned] [variable-3 int] [variable bar] [operator =] [number 8];",
+     "[type unsigned] [type int] [variable bar] [operator =] [number 8];",
      "[meta #include <baz> ][comment // comment]")
 
 
diff --git a/mode/elm/elm.js b/mode/elm/elm.js
index b31e66375..9fcfc8837 100644
--- a/mode/elm/elm.js
+++ b/mode/elm/elm.js
@@ -70,7 +70,7 @@
         if (smallRE.test(ch)) {
           var isDef = source.pos === 1;
           source.eatWhile(idRE);
-          return isDef ? "variable-3" : "variable";
+          return isDef ? "type" : "variable";
         }
 
         if (digitRE.test(ch)) {
diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index d150d4c7b..c24fafd95 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -46,7 +46,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
 
     // Extend the 'normal' keywords with the TypeScript language extensions
     if (isTS) {
-      var type = {type: "variable", style: "variable-3"};
+      var type = {type: "variable", style: "type"};
       var tsKeywords = {
         // object-like things
         "interface": kw("class"),
@@ -543,7 +543,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     }
   }
   function typeexpr(type) {
-    if (type == "variable") {cx.marked = "variable-3"; return cont(afterType);}
+    if (type == "variable") {cx.marked = "type"; return cont(afterType);}
     if (type == "string" || type == "number" || type == "atom") return cont(afterType);
     if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType)
     if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType)
diff --git a/mode/javascript/test.js b/mode/javascript/test.js
index bfb238fb7..d0f4f96d4 100644
--- a/mode/javascript/test.js
+++ b/mode/javascript/test.js
@@ -238,15 +238,15 @@
   }
 
   TS("typescript_extend_type",
-     "[keyword class] [def Foo] [keyword extends] [variable-3 Some][operator <][variable-3 Type][operator >] {}")
+     "[keyword class] [def Foo] [keyword extends] [type Some][operator <][type Type][operator >] {}")
 
   TS("typescript_arrow_type",
-     "[keyword let] [def x]: ([variable arg]: [variable-3 Type]) [operator =>] [variable-3 ReturnType]")
+     "[keyword let] [def x]: ([variable arg]: [type Type]) [operator =>] [type ReturnType]")
 
   TS("typescript_class",
      "[keyword class] [def Foo] {",
      "  [keyword public] [keyword static] [property main]() {}",
-     "  [keyword private] [property _foo]: [variable-3 string];",
+     "  [keyword private] [property _foo]: [type string];",
      "}")
 
   TS("typescript_literal_types",
@@ -255,85 +255,85 @@
      "  [property truthy]: [string 'true'] [operator |] [number 1] [operator |] [atom true];",
      "  [property falsy]: [string 'false'] [operator |] [number 0] [operator |] [atom false];",
      "}",
-     "[keyword interface] [def MyInstance] [keyword extends] [variable-3 Sequelize].[variable-3 Instance] [operator <] [variable-3 MyAttributes] [operator >] {",
-     "  [property rawAttributes]: [variable-3 MyAttributes];",
+     "[keyword interface] [def MyInstance] [keyword extends] [type Sequelize].[type Instance] [operator <] [type MyAttributes] [operator >] {",
+     "  [property rawAttributes]: [type MyAttributes];",
      "  [property truthy]: [string 'true'] [operator |] [number 1] [operator |] [atom true];",
      "  [property falsy]: [string 'false'] [operator |] [number 0] [operator |] [atom false];",
      "}")
 
   TS("typescript_extend_operators",
      "[keyword export] [keyword interface] [def UserModel] [keyword extends]",
-     "  [variable-3 Sequelize].[variable-3 Model] [operator <] [variable-3 UserInstance], [variable-3 UserAttributes] [operator >] {",
+     "  [type Sequelize].[type Model] [operator <] [type UserInstance], [type UserAttributes] [operator >] {",
      "    [property findById]: (",
-     "    [variable userId]: [variable-3 number]",
-     "    ) [operator =>] [variable-3 Promise] [operator <] [variable-3 Array] [operator <] { [property id], [property name] } [operator >>];",
+     "    [variable userId]: [type number]",
+     "    ) [operator =>] [type Promise] [operator <] [type Array] [operator <] { [property id], [property name] } [operator >>];",
      "    [property updateById]: (",
-     "    [variable userId]: [variable-3 number],",
-     "    [variable isActive]: [variable-3 boolean]",
-     "    ) [operator =>] [variable-3 Promise] [operator <] [variable-3 AccountHolderNotificationPreferenceInstance] [operator >];",
+     "    [variable userId]: [type number],",
+     "    [variable isActive]: [type boolean]",
+     "    ) [operator =>] [type Promise] [operator <] [type AccountHolderNotificationPreferenceInstance] [operator >];",
      "  }")
 
   TS("typescript_interface_with_const",
      "[keyword const] [def hello]: {",
-     "  [property prop1][operator ?]: [variable-3 string];",
-     "  [property prop2][operator ?]: [variable-3 string];",
+     "  [property prop1][operator ?]: [type string];",
+     "  [property prop2][operator ?]: [type string];",
      "} [operator =] {};")
 
   TS("typescript_double_extend",
      "[keyword export] [keyword interface] [def UserAttributes] {",
-     "  [property id][operator ?]: [variable-3 number];",
-     "  [property createdAt][operator ?]: [variable-3 Date];",
+     "  [property id][operator ?]: [type number];",
+     "  [property createdAt][operator ?]: [type Date];",
      "}",
-     "[keyword export] [keyword interface] [def UserInstance] [keyword extends] [variable-3 Sequelize].[variable-3 Instance][operator <][variable-3 UserAttributes][operator >], [variable-3 UserAttributes] {",
-     "  [property id]: [variable-3 number];",
-     "  [property createdAt]: [variable-3 Date];",
+     "[keyword export] [keyword interface] [def UserInstance] [keyword extends] [type Sequelize].[type Instance][operator <][type UserAttributes][operator >], [type UserAttributes] {",
+     "  [property id]: [type number];",
+     "  [property createdAt]: [type Date];",
      "}");
 
   TS("typescript_index_signature",
      "[keyword interface] [def A] {",
-     "  [[ [variable prop]: [variable-3 string] ]]: [variable-3 any];",
-     "  [property prop1]: [variable-3 any];",
+     "  [[ [variable prop]: [type string] ]]: [type any];",
+     "  [property prop1]: [type any];",
      "}");
 
   TS("typescript_generic_class",
-     "[keyword class] [def Foo][operator <][variable-3 T][operator >] {",
+     "[keyword class] [def Foo][operator <][type T][operator >] {",
      "  [property bar]() {}",
-     "  [property foo](): [variable-3 Foo] {}",
+     "  [property foo](): [type Foo] {}",
      "}")
 
   TS("typescript_type_when_keyword",
-     "[keyword export] [keyword type] [variable-3 AB] [operator =] [variable-3 A] [operator |] [variable-3 B];",
-     "[keyword type] [variable-3 Flags] [operator =] {",
-     "  [property p1]: [variable-3 string];",
-     "  [property p2]: [variable-3 boolean];",
+     "[keyword export] [keyword type] [type AB] [operator =] [type A] [operator |] [type B];",
+     "[keyword type] [type Flags] [operator =] {",
+     "  [property p1]: [type string];",
+     "  [property p2]: [type boolean];",
      "};")
 
   TS("typescript_type_when_not_keyword",
      "[keyword class] [def HasType] {",
-     "  [property type]: [variable-3 string];",
-     "  [property constructor]([def type]: [variable-3 string]) {",
+     "  [property type]: [type string];",
+     "  [property constructor]([def type]: [type string]) {",
      "    [keyword this].[property type] [operator =] [variable-2 type];",
      "  }",
-     "  [property setType]({ [def type] }: { [property type]: [variable-3 string]; }) {",
+     "  [property setType]({ [def type] }: { [property type]: [type string]; }) {",
      "    [keyword this].[property type] [operator =] [variable-2 type];",
      "  }",
      "}")
 
   TS("typescript_function_generics",
      "[keyword function] [def a]() {}",
-     "[keyword function] [def b][operator <][variable-3 IA] [keyword extends] [variable-3 object], [variable-3 IB] [keyword extends] [variable-3 object][operator >]() {}",
+     "[keyword function] [def b][operator <][type IA] [keyword extends] [type object], [type IB] [keyword extends] [type object][operator >]() {}",
      "[keyword function] [def c]() {}")
 
   TS("typescript_complex_return_type",
      "[keyword function] [def A]() {",
      "  [keyword return] [keyword this].[property property];",
      "}",
-     "[keyword function] [def B](): [variable-3 Promise][operator <]{ [[ [variable key]: [variable-3 string] ]]: [variable-3 any] } [operator |] [atom null][operator >] {",
+     "[keyword function] [def B](): [type Promise][operator <]{ [[ [variable key]: [type string] ]]: [type any] } [operator |] [atom null][operator >] {",
      "  [keyword return] [keyword this].[property property];",
      "}")
 
   TS("typescript_complex_type_casting",
-     "[keyword const] [def giftpay] [operator =] [variable config].[property get]([string 'giftpay']) [keyword as] { [[ [variable platformUuid]: [variable-3 string] ]]: { [property version]: [variable-3 number]; [property apiCode]: [variable-3 string]; } };")
+     "[keyword const] [def giftpay] [operator =] [variable config].[property get]([string 'giftpay']) [keyword as] { [[ [variable platformUuid]: [type string] ]]: { [property version]: [type number]; [property apiCode]: [type string]; } };")
 
   var jsonld_mode = CodeMirror.getMode(
     {indentUnit: 2},
diff --git a/mode/jsx/test.js b/mode/jsx/test.js
index c7def5a3e..4a63b4eec 100644
--- a/mode/jsx/test.js
+++ b/mode/jsx/test.js
@@ -72,9 +72,9 @@
 
   TS("tsx_react_integration",
      "[keyword interface] [def Props] {",
-     "  [property foo]: [variable-3 string];",
+     "  [property foo]: [type string];",
      "}",
-     "[keyword class] [def MyComponent] [keyword extends] [variable-3 React].[variable-3 Component] [operator <] [variable-3 Props], [variable-3 any] [operator >] {",
+     "[keyword class] [def MyComponent] [keyword extends] [type React].[type Component] [operator <] [type Props], [type any] [operator >] {",
      "  [property render]() {",
      "    [keyword return] [bracket&tag <][tag span][bracket&tag >]{[keyword this].[property props].[property foo]}[bracket&tag </][tag span][bracket&tag >]",
      "  }",
diff --git a/theme/abcdef.css b/theme/abcdef.css
index 7f9d78870..cf9353094 100644
--- a/theme/abcdef.css
+++ b/theme/abcdef.css
@@ -14,7 +14,7 @@
 .cm-s-abcdef span.cm-def { color: #fffabc; }
 .cm-s-abcdef span.cm-variable { color: #abcdef; }
 .cm-s-abcdef span.cm-variable-2 { color: #cacbcc; }
-.cm-s-abcdef span.cm-variable-3 { color: #def; }
+.cm-s-abcdef span.cm-variable-3, .cm-s-abcdef span.cm-type { color: #def; }
 .cm-s-abcdef span.cm-property { color: #fedcba; }
 .cm-s-abcdef span.cm-operator { color: #ff0; }
 .cm-s-abcdef span.cm-comment { color: #7a7b7c; font-style: italic;}
diff --git a/theme/ambiance.css b/theme/ambiance.css
index bce344649..782fca43f 100644
--- a/theme/ambiance.css
+++ b/theme/ambiance.css
@@ -11,7 +11,7 @@
 .cm-s-ambiance .cm-def { color: #aac6e3; }
 .cm-s-ambiance .cm-variable { color: #ffb795; }
 .cm-s-ambiance .cm-variable-2 { color: #eed1b3; }
-.cm-s-ambiance .cm-variable-3 { color: #faded3; }
+.cm-s-ambiance .cm-variable-3, .cm-s-ambiance .cm-type { color: #faded3; }
 .cm-s-ambiance .cm-property { color: #eed1b3; }
 .cm-s-ambiance .cm-operator { color: #fa8d6a; }
 .cm-s-ambiance .cm-comment { color: #555; font-style:italic; }
diff --git a/theme/cobalt.css b/theme/cobalt.css
index d88223ed8..bbbda3b54 100644
--- a/theme/cobalt.css
+++ b/theme/cobalt.css
@@ -15,7 +15,7 @@
 .cm-s-cobalt span.cm-string { color: #3ad900; }
 .cm-s-cobalt span.cm-meta { color: #ff9d00; }
 .cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; }
-.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def { color: white; }
+.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def, .cm-s-cobalt .cm-type { color: white; }
 .cm-s-cobalt span.cm-bracket { color: #d8d8d8; }
 .cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; }
 .cm-s-cobalt span.cm-link { color: #845dc4; }
diff --git a/theme/colorforth.css b/theme/colorforth.css
index 606899f30..19095e41d 100644
--- a/theme/colorforth.css
+++ b/theme/colorforth.css
@@ -15,7 +15,7 @@
 .cm-s-colorforth span.cm-atom        { color: #606060; }
 
 .cm-s-colorforth span.cm-variable-2  { color: #EEE; }
-.cm-s-colorforth span.cm-variable-3  { color: #DDD; }
+.cm-s-colorforth span.cm-variable-3, .cm-s-colorforth span.cm-type { color: #DDD; }
 .cm-s-colorforth span.cm-property    {}
 .cm-s-colorforth span.cm-operator    {}
 
diff --git a/theme/dracula.css b/theme/dracula.css
index 53a660b52..253133efe 100644
--- a/theme/dracula.css
+++ b/theme/dracula.css
@@ -34,7 +34,7 @@
 .cm-s-dracula span.cm-qualifier { color: #50fa7b; }
 .cm-s-dracula span.cm-property { color: #66d9ef; }
 .cm-s-dracula span.cm-builtin { color: #50fa7b; }
-.cm-s-dracula span.cm-variable-3 { color: #ffb86c; }
+.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }
 
 .cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }
 .cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }
diff --git a/theme/duotone-dark.css b/theme/duotone-dark.css
index b09a585c9..88fdc76c8 100644
--- a/theme/duotone-dark.css
+++ b/theme/duotone-dark.css
@@ -24,7 +24,7 @@ CodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bra
 .cm-s-duotone-dark span.cm-operator { color: #ffad5c; }
 .cm-s-duotone-dark span.cm-positive { color: #6a51e6; }
 
-.cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm-string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; }
+.cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm-type, .cm-s-duotone-dark span.cm-string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; }
 .cm-s-duotone-dark span.cm-def, .cm-s-duotone-dark span.cm-tag, .cm-s-duotone-dark span.cm-builtin, .cm-s-duotone-dark span.cm-qualifier, .cm-s-duotone-dark span.cm-header, .cm-s-duotone-dark span.cm-em { color: #eeebff; }
 .cm-s-duotone-dark span.cm-bracket, .cm-s-duotone-dark span.cm-comment { color: #6c6783; }
 
diff --git a/theme/duotone-light.css b/theme/duotone-light.css
index 80203d15d..d99480f7c 100644
--- a/theme/duotone-light.css
+++ b/theme/duotone-light.css
@@ -23,7 +23,7 @@ CodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bra
 .cm-s-duotone-light span.cm-string, .cm-s-duotone-light span.cm-operator { color: #1659df; }
 .cm-s-duotone-light span.cm-positive { color: #896724; }
 
-.cm-s-duotone-light span.cm-variable-2, .cm-s-duotone-light span.cm-variable-3, .cm-s-duotone-light span.cm-string-2, .cm-s-duotone-light span.cm-url { color: #896724; }
+.cm-s-duotone-light span.cm-variable-2, .cm-s-duotone-light span.cm-variable-3, .cm-s-duotone-light span.cm-type, .cm-s-duotone-light span.cm-string-2, .cm-s-duotone-light span.cm-url { color: #896724; }
 .cm-s-duotone-light span.cm-def, .cm-s-duotone-light span.cm-tag, .cm-s-duotone-light span.cm-builtin, .cm-s-duotone-light span.cm-qualifier, .cm-s-duotone-light span.cm-header, .cm-s-duotone-light span.cm-em { color: #2d2006; }
 .cm-s-duotone-light span.cm-bracket, .cm-s-duotone-light span.cm-comment { color: #b6ad9a; }
 
diff --git a/theme/eclipse.css b/theme/eclipse.css
index 1bde460e9..800d603f6 100644
--- a/theme/eclipse.css
+++ b/theme/eclipse.css
@@ -5,7 +5,7 @@
 .cm-s-eclipse span.cm-def { color: #00f; }
 .cm-s-eclipse span.cm-variable { color: black; }
 .cm-s-eclipse span.cm-variable-2 { color: #0000C0; }
-.cm-s-eclipse span.cm-variable-3 { color: #0000C0; }
+.cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; }
 .cm-s-eclipse span.cm-property { color: black; }
 .cm-s-eclipse span.cm-operator { color: black; }
 .cm-s-eclipse span.cm-comment { color: #3F7F5F; }
diff --git a/theme/erlang-dark.css b/theme/erlang-dark.css
index 65fe4814c..8c8a4171a 100644
--- a/theme/erlang-dark.css
+++ b/theme/erlang-dark.css
@@ -27,7 +27,7 @@
 .cm-s-erlang-dark span.cm-tag        { color: #9effff; }
 .cm-s-erlang-dark span.cm-variable   { color: #50fe50; }
 .cm-s-erlang-dark span.cm-variable-2 { color: #e0e; }
-.cm-s-erlang-dark span.cm-variable-3 { color: #ccc; }
+.cm-s-erlang-dark span.cm-variable-3, .cm-s-erlang-dark span.cm-type { color: #ccc; }
 .cm-s-erlang-dark span.cm-error      { color: #9d1e15; }
 
 .cm-s-erlang-dark .CodeMirror-activeline-background { background: #013461; }
diff --git a/theme/icecoder.css b/theme/icecoder.css
index ffebaf2f0..5440fbe27 100644
--- a/theme/icecoder.css
+++ b/theme/icecoder.css
@@ -11,7 +11,7 @@ ICEcoder default theme by Matt Pass, used in code editor available at https://ic
 
 .cm-s-icecoder span.cm-variable { color: #6cb5d9; }                /* blue */
 .cm-s-icecoder span.cm-variable-2 { color: #cc1e5c; }              /* pink */
-.cm-s-icecoder span.cm-variable-3 { color: #f9602c; }              /* orange */
+.cm-s-icecoder span.cm-variable-3, .cm-s-icecoder span.cm-type { color: #f9602c; } /* orange */
 
 .cm-s-icecoder span.cm-property { color: #eee; }                   /* off-white 1 */
 .cm-s-icecoder span.cm-operator { color: #9179bb; }                /* purple */
diff --git a/theme/lesser-dark.css b/theme/lesser-dark.css
index 690c183d7..b2ec418fd 100644
--- a/theme/lesser-dark.css
+++ b/theme/lesser-dark.css
@@ -27,7 +27,7 @@ Ported to CodeMirror by Peter Kroon
 .cm-s-lesser-dark span.cm-def { color: white; }
 .cm-s-lesser-dark span.cm-variable { color:#D9BF8C; }
 .cm-s-lesser-dark span.cm-variable-2 { color: #669199; }
-.cm-s-lesser-dark span.cm-variable-3 { color: white; }
+.cm-s-lesser-dark span.cm-variable-3, .cm-s-lesser-dark span.cm-type { color: white; }
 .cm-s-lesser-dark span.cm-property { color: #92A75C; }
 .cm-s-lesser-dark span.cm-operator { color: #92A75C; }
 .cm-s-lesser-dark span.cm-comment { color: #666; }
diff --git a/theme/liquibyte.css b/theme/liquibyte.css
index ce0477fe7..393825e02 100644
--- a/theme/liquibyte.css
+++ b/theme/liquibyte.css
@@ -36,7 +36,7 @@
 .cm-s-liquibyte span.cm-atom        { color: #bf3030; font-weight: bold; }
 
 .cm-s-liquibyte span.cm-variable-2  { color: #007f7f; font-weight: bold; }
-.cm-s-liquibyte span.cm-variable-3  { color: #c080ff; font-weight: bold; }
+.cm-s-liquibyte span.cm-variable-3, .cm-s-liquibyte span.cm-type { color: #c080ff; font-weight: bold; }
 .cm-s-liquibyte span.cm-property    { color: #999; font-weight: bold; }
 .cm-s-liquibyte span.cm-operator    { color: #fff; }
 
diff --git a/theme/material.css b/theme/material.css
index 01d867932..84962a244 100644
--- a/theme/material.css
+++ b/theme/material.css
@@ -27,7 +27,7 @@
 .cm-s-material .cm-keyword { color: rgba(199, 146, 234, 1); }
 .cm-s-material .cm-operator { color: rgba(233, 237, 237, 1); }
 .cm-s-material .cm-variable-2 { color: #80CBC4; }
-.cm-s-material .cm-variable-3 { color: #82B1FF; }
+.cm-s-material .cm-variable-3, .cm-s-material .cm-type { color: #82B1FF; }
 .cm-s-material .cm-builtin { color: #DECB6B; }
 .cm-s-material .cm-atom { color: #F77669; }
 .cm-s-material .cm-number { color: #F77669; }
@@ -41,7 +41,7 @@
 .cm-s-material .cm-attribute { color: #FFCB6B; }
 .cm-s-material .cm-property { color: #80CBAE; }
 .cm-s-material .cm-qualifier { color: #DECB6B; }
-.cm-s-material .cm-variable-3 { color: #DECB6B; }
+.cm-s-material .cm-variable-3, .cm-s-material .cm-type { color: #DECB6B; }
 .cm-s-material .cm-tag { color: rgba(255, 83, 112, 1); }
 .cm-s-material .cm-error {
   color: rgba(255, 255, 255, 1.0);
diff --git a/theme/mdn-like.css b/theme/mdn-like.css
index f325d4500..622ed3efb 100644
--- a/theme/mdn-like.css
+++ b/theme/mdn-like.css
@@ -21,7 +21,7 @@
 .cm-s-mdn-like .cm-number { color:  #ca7841; }
 .cm-s-mdn-like .cm-def { color: #8DA6CE; }
 .cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; }
-.cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def { color: #07a; }
+.cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def, .cm-s-mdn-like span.cm-type { color: #07a; }
 
 .cm-s-mdn-like .cm-variable { color: #07a; }
 .cm-s-mdn-like .cm-property { color: #905; }
diff --git a/theme/monokai.css b/theme/monokai.css
index 7c8a4c5d0..b5edd13fe 100644
--- a/theme/monokai.css
+++ b/theme/monokai.css
@@ -21,7 +21,7 @@
 
 .cm-s-monokai span.cm-variable { color: #f8f8f2; }
 .cm-s-monokai span.cm-variable-2 { color: #9effff; }
-.cm-s-monokai span.cm-variable-3 { color: #66d9ef; }
+.cm-s-monokai span.cm-variable-3, .cm-s-monokai span.cm-type { color: #66d9ef; }
 .cm-s-monokai span.cm-def { color: #fd971f; }
 .cm-s-monokai span.cm-bracket { color: #f8f8f2; }
 .cm-s-monokai span.cm-tag { color: #f92672; }
diff --git a/theme/night.css b/theme/night.css
index fd4e56193..f631bf42c 100644
--- a/theme/night.css
+++ b/theme/night.css
@@ -17,7 +17,7 @@
 .cm-s-night span.cm-string { color: #37f14a; }
 .cm-s-night span.cm-meta { color: #7678e2; }
 .cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; }
-.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; }
+.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def, .cm-s-night span.cm-type { color: white; }
 .cm-s-night span.cm-bracket { color: #8da6ce; }
 .cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; }
 .cm-s-night span.cm-link { color: #845dc4; }
diff --git a/theme/panda-syntax.css b/theme/panda-syntax.css
index c93b2ea03..6de58b56f 100644
--- a/theme/panda-syntax.css
+++ b/theme/panda-syntax.css
@@ -52,7 +52,7 @@
 .cm-s-panda-syntax .cm-variable-2 {
 	color: #ff9ac1;
 }
-.cm-s-panda-syntax .cm-variable-3 {
+.cm-s-panda-syntax .cm-variable-3, .cm-s-panda-syntax .cm-type {
 	color: #ff9ac1;
 }
 
diff --git a/theme/pastel-on-dark.css b/theme/pastel-on-dark.css
index 2603d3620..60435dd15 100644
--- a/theme/pastel-on-dark.css
+++ b/theme/pastel-on-dark.css
@@ -34,7 +34,7 @@
 .cm-s-pastel-on-dark span.cm-string { color: #66A968; }
 .cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; }
 .cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; }
-.cm-s-pastel-on-dark span.cm-variable-3 { color: #DE8E30; }
+.cm-s-pastel-on-dark span.cm-variable-3, .cm-s-pastel-on-dark span.cm-type { color: #DE8E30; }
 .cm-s-pastel-on-dark span.cm-def { color: #757aD8; }
 .cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; }
 .cm-s-pastel-on-dark span.cm-tag { color: #C1C144; }
diff --git a/theme/rubyblue.css b/theme/rubyblue.css
index 76d33e779..1f181b06e 100644
--- a/theme/rubyblue.css
+++ b/theme/rubyblue.css
@@ -15,7 +15,7 @@
 .cm-s-rubyblue span.cm-string { color: #F08047; }
 .cm-s-rubyblue span.cm-meta { color: #F0F; }
 .cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; }
-.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def { color: white; }
+.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def, .cm-s-rubyblue span.cm-type { color: white; }
 .cm-s-rubyblue span.cm-bracket { color: #F0F; }
 .cm-s-rubyblue span.cm-link { color: #F4C20B; }
 .cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; }
diff --git a/theme/seti.css b/theme/seti.css
index 6632d3fc7..814f76f7d 100644
--- a/theme/seti.css
+++ b/theme/seti.css
@@ -38,7 +38,7 @@
 .cm-s-seti span.cm-attribute { color: #9fca56; }
 .cm-s-seti span.cm-qualifier { color: #9fca56; }
 .cm-s-seti span.cm-property { color: #a074c4; }
-.cm-s-seti span.cm-variable-3 { color: #9fca56; }
+.cm-s-seti span.cm-variable-3, .cm-s-seti span.cm-type { color: #9fca56; }
 .cm-s-seti span.cm-builtin { color: #9fca56; }
 .cm-s-seti .CodeMirror-activeline-background { background: #101213; }
 .cm-s-seti .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }
diff --git a/theme/solarized.css b/theme/solarized.css
index 1f39c7edb..d95f6c1b2 100644
--- a/theme/solarized.css
+++ b/theme/solarized.css
@@ -57,7 +57,7 @@ http://ethanschoonover.com/solarized/img/solarized-palette.png
 
 .cm-s-solarized .cm-variable { color: #839496; }
 .cm-s-solarized .cm-variable-2 { color: #b58900; }
-.cm-s-solarized .cm-variable-3 { color: #6c71c4; }
+.cm-s-solarized .cm-variable-3, .cm-s-solarized .cm-type { color: #6c71c4; }
 
 .cm-s-solarized .cm-property { color: #2aa198; }
 .cm-s-solarized .cm-operator { color: #6c71c4; }
diff --git a/theme/the-matrix.css b/theme/the-matrix.css
index 3912a8dbd..c4c93c11e 100644
--- a/theme/the-matrix.css
+++ b/theme/the-matrix.css
@@ -14,7 +14,7 @@
 .cm-s-the-matrix span.cm-def { color: #99C; }
 .cm-s-the-matrix span.cm-variable { color: #F6C; }
 .cm-s-the-matrix span.cm-variable-2 { color: #C6F; }
-.cm-s-the-matrix span.cm-variable-3 { color: #96F; }
+.cm-s-the-matrix span.cm-variable-3, .cm-s-the-matrix span.cm-type { color: #96F; }
 .cm-s-the-matrix span.cm-property { color: #62FFA0; }
 .cm-s-the-matrix span.cm-operator { color: #999; }
 .cm-s-the-matrix span.cm-comment { color: #CCCCCC; }
diff --git a/theme/ttcn.css b/theme/ttcn.css
index b3d465645..0b14ac35d 100644
--- a/theme/ttcn.css
+++ b/theme/ttcn.css
@@ -29,7 +29,7 @@
 .cm-s-ttcn .cm-tag { color: #170; }
 .cm-s-ttcn .cm-variable { color: #8B2252; }
 .cm-s-ttcn .cm-variable-2 { color: #05a; }
-.cm-s-ttcn .cm-variable-3 { color: #085; }
+.cm-s-ttcn .cm-variable-3, .cm-s-ttcn .cm-type { color: #085; }
 
 .cm-s-ttcn .cm-invalidchar { color: #f00; }
 
diff --git a/theme/twilight.css b/theme/twilight.css
index d342b899f..b2b1b2aa9 100644
--- a/theme/twilight.css
+++ b/theme/twilight.css
@@ -14,7 +14,7 @@
 .cm-s-twilight .cm-number { color:  #ca7841; } /**/
 .cm-s-twilight .cm-def { color: #8DA6CE; }
 .cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/
-.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def { color: #607392; } /**/
+.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def, .cm-s-twilight span.cm-type { color: #607392; } /**/
 .cm-s-twilight .cm-operator { color: #cda869; } /**/
 .cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/
 .cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/
diff --git a/theme/vibrant-ink.css b/theme/vibrant-ink.css
index ac4ec6d87..b13ecf216 100644
--- a/theme/vibrant-ink.css
+++ b/theme/vibrant-ink.css
@@ -16,7 +16,7 @@
 .cm-s-vibrant-ink .cm-number { color:  #FFEE98; }
 .cm-s-vibrant-ink .cm-def { color: #8DA6CE; }
 .cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D; }
-.cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def { color: #FFC66D; }
+.cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def, .cm-s-vibrant span.cm-type { color: #FFC66D; }
 .cm-s-vibrant-ink .cm-operator { color: #888; }
 .cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; }
 .cm-s-vibrant-ink .cm-string { color:  #A5C25C; }
diff --git a/theme/xq-dark.css b/theme/xq-dark.css
index e3bd960bb..7da1a0f70 100644
--- a/theme/xq-dark.css
+++ b/theme/xq-dark.css
@@ -36,7 +36,7 @@ THE SOFTWARE.
 .cm-s-xq-dark span.cm-def { color: #FFF; text-decoration:underline; }
 .cm-s-xq-dark span.cm-variable { color: #FFF; }
 .cm-s-xq-dark span.cm-variable-2 { color: #EEE; }
-.cm-s-xq-dark span.cm-variable-3 { color: #DDD; }
+.cm-s-xq-dark span.cm-variable-3, .cm-s-xq-dark span.cm-type { color: #DDD; }
 .cm-s-xq-dark span.cm-property {}
 .cm-s-xq-dark span.cm-operator {}
 .cm-s-xq-dark span.cm-comment { color: gray; }
diff --git a/theme/xq-light.css b/theme/xq-light.css
index 8d2fcb667..7b182ea99 100644
--- a/theme/xq-light.css
+++ b/theme/xq-light.css
@@ -26,7 +26,7 @@ THE SOFTWARE.
 .cm-s-xq-light span.cm-def { text-decoration:underline; }
 .cm-s-xq-light span.cm-variable { color: black; }
 .cm-s-xq-light span.cm-variable-2 { color:black; }
-.cm-s-xq-light span.cm-variable-3 { color: black; }
+.cm-s-xq-light span.cm-variable-3, .cm-s-xq-light span.cm-type { color: black; }
 .cm-s-xq-light span.cm-property {}
 .cm-s-xq-light span.cm-operator {}
 .cm-s-xq-light span.cm-comment { color: #0080FF; font-style: italic; }
diff --git a/theme/yeti.css b/theme/yeti.css
index c70d4d214..d085f7249 100644
--- a/theme/yeti.css
+++ b/theme/yeti.css
@@ -39,6 +39,6 @@
 .cm-s-yeti span.cm-qualifier { color: #96c0d8; }
 .cm-s-yeti span.cm-property { color: #a074c4; }
 .cm-s-yeti span.cm-builtin { color: #a074c4; }
-.cm-s-yeti span.cm-variable-3 { color: #96c0d8; }
+.cm-s-yeti span.cm-variable-3, .cm-s-yeti span.cm-type { color: #96c0d8; }
 .cm-s-yeti .CodeMirror-activeline-background { background: #E7E4E0; }
 .cm-s-yeti .CodeMirror-matchingbracket { text-decoration: underline; }
-- 
GitLab