internal/lsp/protocol/typescript: code for latest 3.16 LSP

Typescript code to generate internal/lsp/protocol/ts*.go for
the latest 3.16 version of the language server protocol.

Change-Id: Ie5bb0f44ffb83c69e30578a36d057820e55fee76
Reviewed-on: https://go-review.googlesource.com/c/tools/+/265579
Run-TryBot: Peter Weinberger <pjw@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Peter Weinberger <pjw@google.com>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/lsp/protocol/typescript/code.ts b/internal/lsp/protocol/typescript/code.ts
index 39cea15..54c0678 100644
--- a/internal/lsp/protocol/typescript/code.ts
+++ b/internal/lsp/protocol/typescript/code.ts
@@ -185,9 +185,7 @@
   const f = function (na: ts.NodeArray<any>): number {
     return na.length
   };
-  return `D(${d.name}) g;${f(d.generics)} a:${f(d.as)} p:${f(d.properties)} s:${
-    f(d.statements)} e:${f(d.enums)} m:${f(d.members)} ${
-    d.alias != undefined}`
+  return `D(${d.name}) g;${f(d.generics)} a:${f(d.as)} p:${f(d.properties)} s:${f(d.statements)} e:${f(d.enums)} m:${f(d.members)} ${d.alias != undefined}`
 }
 
 let data = new Map<string, Data>();            // parsed data types
@@ -401,6 +399,7 @@
     n.kind == ts.SyntaxKind.StringKeyword ||
     n.kind == ts.SyntaxKind.NumberKeyword ||
     n.kind == ts.SyntaxKind.AnyKeyword ||
+    n.kind == ts.SyntaxKind.UnknownKeyword ||
     n.kind == ts.SyntaxKind.NullKeyword ||
     n.kind == ts.SyntaxKind.BooleanKeyword ||
     n.kind == ts.SyntaxKind.ObjectKeyword ||
@@ -433,7 +432,7 @@
     if (ts.isStringLiteral(n.initializer)) return;
     throw new Error(`EnumMember ${strKind(n.initializer)} ${n.name.getText()}`)
   } else {
-    throw new Error(`saw ${strKind(n)} in underlying. ${n.getText()}`)
+    throw new Error(`saw ${strKind(n)} in underlying. ${n.getText()} at ${loc(n)}`)
   }
 }
 
@@ -532,7 +531,7 @@
         gt = '*' + gt;
       };
     })
-    ans = ans.concat(`${goName(n.name.getText())} ${gt}`, json, '\n')
+    ans = ans.concat(`${goName(n.name.getText())} ${gt}`, json, '\n');
   };
   d.properties.forEach(g)
   // heritage clauses become embedded types
@@ -607,8 +606,7 @@
 function goTypeAlias(d: Data, nm: string) {
   if (d.as.length != 0 || d.generics.length != 0) {
     if (nm != 'ServerCapabilities')
-      throw new Error(`${nm} has extra fields(${d.as.length},${
-        d.generics.length}) ${d.me.getText()}`);
+      throw new Error(`${nm} has extra fields(${d.as.length},${d.generics.length}) ${d.me.getText()}`);
   }
   typesOut.push(getComments(d.me))
   // d.alias doesn't seem to have comments
@@ -631,7 +629,7 @@
     return 'float64';
   } else if (strKind(n) == 'BooleanKeyword') {
     return 'bool';
-  } else if (strKind(n) == 'AnyKeyword') {
+  } else if (strKind(n) == 'AnyKeyword' || strKind(n) == 'UnknownKeyword') {
     return 'interface{}';
   } else if (strKind(n) == 'NullKeyword') {
     return 'nil'
@@ -669,9 +667,9 @@
   // range?: boolean | {\n	};
   // full?: boolean | {\n		/**\n		 * The server supports deltas for full documents.\n		 */\n		delta?: boolean;\n	}
   // These are handled specially:
-  if (parent == 'SemanticTokensOptions') {
-    if (nm == 'range') help = help.replace(/\n/, '');
-    if (nm == 'full') help = '/*boolean | <elided struct>*/';
+  if (nm == 'range') help = help.replace(/\n/, '');
+  if (nm == 'full' && help.indexOf('\n') != -1) {
+    help = '/*boolean | <elided struct>*/';
   }
   // handle all the special cases
   switch (n.types.length) {
@@ -693,6 +691,7 @@
       if (a == 'BooleanKeyword') {  // usually want bool
         if (nm == 'codeActionProvider') return `interface{} ${help}`;
         if (nm == 'renameProvider') return `interface{} ${help}`;
+        if (nm == 'full') return `interface{} ${help}`; // there's a struct
         if (nm == 'save') return `${goType(n.types[1], '680')} ${help}`;
         return `${goType(n.types[0], 'b')} ${help}`
       }
@@ -1003,8 +1002,7 @@
     const p2 = a == '' ? 'nil' : 'params';
     const returnType = indirect(b) ? `*${b}` : b;
     callBody = `var result ${returnType}
-			if err := Call(ctx, s.Conn, "${m}", ${
-      p2}, &result); err != nil {
+			if err := Call(ctx, s.Conn, "${m}", ${p2}, &result); err != nil {
 				return nil, err
       }
       return result, nil
diff --git a/internal/lsp/protocol/typescript/util.ts b/internal/lsp/protocol/typescript/util.ts
index 77b2023..5fdd563 100644
--- a/internal/lsp/protocol/typescript/util.ts
+++ b/internal/lsp/protocol/typescript/util.ts
@@ -14,7 +14,7 @@
   `${dir}/${srcDir}/protocol/src/browser/main.ts`, `${dir}${srcDir}/types/src/main.ts`,
   `${dir}${srcDir}/jsonrpc/src/node/main.ts`
 ];
-export const gitHash = '60a5a7825e6f54f57917091f394fd8db7d1724bc'
+export const gitHash = '901fd40345060d159f07d234bbc967966a929a34'
 let outFname = 'tsprotocol.go';
 let fda: number, fdb: number, fde: number;  // file descriptors