From 490653454aa985feb60918eeddde823c550e416e Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke <marijn@haverbeke.nl>
Date: Mon, 20 Nov 2017 10:36:30 +0100
Subject: [PATCH] [javascript mode] Resolve ambiguity for type parameters vs
 less-than

See https://github.com/Microsoft/TypeScript/blob/6c4c10c7cf294dc71f943314e29a7dd1b6e88c6a/doc/spec.md#4.15.3

Issue #5090
Issue #5048
---
 mode/javascript/javascript.js | 3 ++-
 mode/javascript/test.js       | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index e43543dd3..0dcd8af39 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -438,7 +438,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
     if (type == "operator") {
       if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me);
-      if (isTS && value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, maybeoperatorNoComma);
+      if (isTS && value == "<" && cx.stream.match(/^([^>]|<.*?>)*>\s*\(/, false))
+        return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me);
       if (value == "?") return cont(expression, expect(":"), expr);
       return cont(expr);
     }
diff --git a/mode/javascript/test.js b/mode/javascript/test.js
index 972a34565..2437edcca 100644
--- a/mode/javascript/test.js
+++ b/mode/javascript/test.js
@@ -372,7 +372,8 @@
      "({[property a]: [def p] [operator =>] [variable-2 p]})")
 
   TS("generic in function call",
-     "[keyword this].[property a][operator <][type Type][operator >]([variable foo]);")
+     "[keyword this].[property a][operator <][type Type][operator >]([variable foo]);",
+     "[keyword this].[property a][operator <][variable Type][operator >][variable foo];")
 
   var jsonld_mode = CodeMirror.getMode(
     {indentUnit: 2},
-- 
GitLab