diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index f98b678..e1e4b90 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -18,7 +18,8 @@
   }
   factory ApplyWorkspaceEditParams.fromJson(Map<String, dynamic> json) {
     final label = json['label'];
-    final edit = new WorkspaceEdit.fromJson(json['edit']);
+    final edit =
+        json['edit'] != null ? new WorkspaceEdit.fromJson(json['edit']) : null;
     return new ApplyWorkspaceEditParams(label, edit);
   }
 
@@ -107,10 +108,12 @@
 class ClientCapabilities implements ToJsonable {
   ClientCapabilities(this.workspace, this.textDocument, this.experimental);
   factory ClientCapabilities.fromJson(Map<String, dynamic> json) {
-    final workspace =
-        new WorkspaceClientCapabilities.fromJson(json['workspace']);
-    final textDocument =
-        new TextDocumentClientCapabilities.fromJson(json['textDocument']);
+    final workspace = json['workspace'] != null
+        ? new WorkspaceClientCapabilities.fromJson(json['workspace'])
+        : null;
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentClientCapabilities.fromJson(json['textDocument'])
+        : null;
     final experimental = json['experimental'];
     return new ClientCapabilities(workspace, textDocument, experimental);
   }
@@ -158,11 +161,13 @@
     final title = json['title'];
     final kind = json['kind'];
     final diagnostics = json['diagnostics']
-        ?.map((item) => new Diagnostic.fromJson(item))
+        ?.map((item) => item != null ? new Diagnostic.fromJson(item) : null)
         ?.cast<Diagnostic>()
         ?.toList();
-    final edit = new WorkspaceEdit.fromJson(json['edit']);
-    final command = new Command.fromJson(json['command']);
+    final edit =
+        json['edit'] != null ? new WorkspaceEdit.fromJson(json['edit']) : null;
+    final command =
+        json['command'] != null ? new Command.fromJson(json['command']) : null;
     return new CodeAction(title, kind, diagnostics, edit, command);
   }
 
@@ -219,7 +224,7 @@
   }
   factory CodeActionContext.fromJson(Map<String, dynamic> json) {
     final diagnostics = json['diagnostics']
-        ?.map((item) => new Diagnostic.fromJson(item))
+        ?.map((item) => item != null ? new Diagnostic.fromJson(item) : null)
         ?.cast<Diagnostic>()
         ?.toList();
     final only = json['only']?.map((item) => item)?.cast<String>()?.toList();
@@ -346,10 +351,14 @@
     }
   }
   factory CodeActionParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
-    final range = new Range.fromJson(json['range']);
-    final context = new CodeActionContext.fromJson(json['context']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final context = json['context'] != null
+        ? new CodeActionContext.fromJson(json['context'])
+        : null;
     return new CodeActionParams(textDocument, range, context);
   }
 
@@ -388,7 +397,7 @@
   CodeActionRegistrationOptions(this.documentSelector, this.codeActionKinds);
   factory CodeActionRegistrationOptions.fromJson(Map<String, dynamic> json) {
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     final codeActionKinds =
@@ -438,8 +447,10 @@
     }
   }
   factory CodeLens.fromJson(Map<String, dynamic> json) {
-    final range = new Range.fromJson(json['range']);
-    final command = new Command.fromJson(json['command']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final command =
+        json['command'] != null ? new Command.fromJson(json['command']) : null;
     final data = json['data'];
     return new CodeLens(range, command, data);
   }
@@ -505,8 +516,9 @@
     }
   }
   factory CodeLensParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
     return new CodeLensParams(textDocument);
   }
 
@@ -533,7 +545,7 @@
   factory CodeLensRegistrationOptions.fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new CodeLensRegistrationOptions(resolveProvider, documentSelector);
@@ -626,8 +638,10 @@
     }
   }
   factory ColorInformation.fromJson(Map<String, dynamic> json) {
-    final range = new Range.fromJson(json['range']);
-    final color = new Color.fromJson(json['color']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final color =
+        json['color'] != null ? new Color.fromJson(json['color']) : null;
     return new ColorInformation(range, color);
   }
 
@@ -661,9 +675,11 @@
   }
   factory ColorPresentation.fromJson(Map<String, dynamic> json) {
     final label = json['label'];
-    final textEdit = new TextEdit.fromJson(json['textEdit']);
+    final textEdit = json['textEdit'] != null
+        ? new TextEdit.fromJson(json['textEdit'])
+        : null;
     final additionalTextEdits = json['additionalTextEdits']
-        ?.map((item) => new TextEdit.fromJson(item))
+        ?.map((item) => item != null ? new TextEdit.fromJson(item) : null)
         ?.cast<TextEdit>()
         ?.toList();
     return new ColorPresentation(label, textEdit, additionalTextEdits);
@@ -716,10 +732,13 @@
     }
   }
   factory ColorPresentationParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
-    final color = new Color.fromJson(json['color']);
-    final range = new Range.fromJson(json['range']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final color =
+        json['color'] != null ? new Color.fromJson(json['color']) : null;
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
     return new ColorPresentationParams(textDocument, color, range);
   }
 
@@ -819,7 +838,9 @@
     }
   }
   factory CompletionContext.fromJson(Map<String, dynamic> json) {
-    final triggerKind = new CompletionTriggerKind.fromJson(json['triggerKind']);
+    final triggerKind = json['triggerKind'] != null
+        ? new CompletionTriggerKind.fromJson(json['triggerKind'])
+        : null;
     final triggerCharacter = json['triggerCharacter'];
     return new CompletionContext(triggerKind, triggerCharacter);
   }
@@ -871,29 +892,37 @@
   }
   factory CompletionItem.fromJson(Map<String, dynamic> json) {
     final label = json['label'];
-    final kind = new CompletionItemKind.fromJson(json['kind']);
+    final kind = json['kind'] != null
+        ? new CompletionItemKind.fromJson(json['kind'])
+        : null;
     final detail = json['detail'];
     final documentation = json['documentation'] is String
         ? new Either2<String, MarkupContent>.t1(json['documentation'])
         : (MarkupContent.canParse(json['documentation'])
             ? new Either2<String, MarkupContent>.t2(
-                new MarkupContent.fromJson(json['documentation']))
+                json['documentation'] != null
+                    ? new MarkupContent.fromJson(json['documentation'])
+                    : null)
             : (throw '''${json['documentation']} was not one of (string, MarkupContent)'''));
     final deprecated = json['deprecated'];
     final preselect = json['preselect'];
     final sortText = json['sortText'];
     final filterText = json['filterText'];
     final insertText = json['insertText'];
-    final insertTextFormat =
-        new InsertTextFormat.fromJson(json['insertTextFormat']);
-    final textEdit = new TextEdit.fromJson(json['textEdit']);
+    final insertTextFormat = json['insertTextFormat'] != null
+        ? new InsertTextFormat.fromJson(json['insertTextFormat'])
+        : null;
+    final textEdit = json['textEdit'] != null
+        ? new TextEdit.fromJson(json['textEdit'])
+        : null;
     final additionalTextEdits = json['additionalTextEdits']
-        ?.map((item) => new TextEdit.fromJson(item))
+        ?.map((item) => item != null ? new TextEdit.fromJson(item) : null)
         ?.cast<TextEdit>()
         ?.toList();
     final commitCharacters =
         json['commitCharacters']?.map((item) => item)?.cast<String>()?.toList();
-    final command = new Command.fromJson(json['command']);
+    final command =
+        json['command'] != null ? new Command.fromJson(json['command']) : null;
     final data = json['data'];
     return new CompletionItem(
         label,
@@ -1141,7 +1170,7 @@
   factory CompletionList.fromJson(Map<String, dynamic> json) {
     final isIncomplete = json['isIncomplete'];
     final items = json['items']
-        ?.map((item) => new CompletionItem.fromJson(item))
+        ?.map((item) => item != null ? new CompletionItem.fromJson(item) : null)
         ?.cast<CompletionItem>()
         ?.toList();
     return new CompletionList(isIncomplete, items);
@@ -1218,10 +1247,15 @@
     }
   }
   factory CompletionParams.fromJson(Map<String, dynamic> json) {
-    final context = new CompletionContext.fromJson(json['context']);
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
-    final position = new Position.fromJson(json['position']);
+    final context = json['context'] != null
+        ? new CompletionContext.fromJson(json['context'])
+        : null;
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position = json['position'] != null
+        ? new Position.fromJson(json['position'])
+        : null;
     return new CompletionParams(context, textDocument, position);
   }
 
@@ -1268,7 +1302,7 @@
         ?.toList();
     final resolveProvider = json['resolveProvider'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new CompletionRegistrationOptions(
@@ -1396,7 +1430,8 @@
   }
   factory ConfigurationParams.fromJson(Map<String, dynamic> json) {
     final items = json['items']
-        ?.map((item) => new ConfigurationItem.fromJson(item))
+        ?.map((item) =>
+            item != null ? new ConfigurationItem.fromJson(item) : null)
         ?.cast<ConfigurationItem>()
         ?.toList();
     return new ConfigurationParams(items);
@@ -1429,7 +1464,9 @@
   }
   factory CreateFile.fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
-    final options = new CreateFileOptions.fromJson(json['options']);
+    final options = json['options'] != null
+        ? new CreateFileOptions.fromJson(json['options'])
+        : null;
     return new CreateFile(uri, options);
   }
 
@@ -1495,7 +1532,9 @@
   }
   factory DeleteFile.fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
-    final options = new DeleteFileOptions.fromJson(json['options']);
+    final options = json['options'] != null
+        ? new DeleteFileOptions.fromJson(json['options'])
+        : null;
     return new DeleteFile(uri, options);
   }
 
@@ -1563,8 +1602,11 @@
     }
   }
   factory Diagnostic.fromJson(Map<String, dynamic> json) {
-    final range = new Range.fromJson(json['range']);
-    final severity = new DiagnosticSeverity.fromJson(json['severity']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final severity = json['severity'] != null
+        ? new DiagnosticSeverity.fromJson(json['severity'])
+        : null;
     final code = json['code'] is num
         ? new Either2<num, String>.t1(json['code'])
         : (json['code'] is String
@@ -1573,7 +1615,9 @@
     final source = json['source'];
     final message = json['message'];
     final relatedInformation = json['relatedInformation']
-        ?.map((item) => new DiagnosticRelatedInformation.fromJson(item))
+        ?.map((item) => item != null
+            ? new DiagnosticRelatedInformation.fromJson(item)
+            : null)
         ?.cast<DiagnosticRelatedInformation>()
         ?.toList();
     return new Diagnostic(
@@ -1644,7 +1688,9 @@
     }
   }
   factory DiagnosticRelatedInformation.fromJson(Map<String, dynamic> json) {
-    final location = new Location.fromJson(json['location']);
+    final location = json['location'] != null
+        ? new Location.fromJson(json['location'])
+        : null;
     final message = json['message'];
     return new DiagnosticRelatedInformation(location, message);
   }
@@ -1749,10 +1795,13 @@
     }
   }
   factory DidChangeTextDocumentParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new VersionedTextDocumentIdentifier.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new VersionedTextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
     final contentChanges = json['contentChanges']
-        ?.map((item) => new TextDocumentContentChangeEvent.fromJson(item))
+        ?.map((item) => item != null
+            ? new TextDocumentContentChangeEvent.fromJson(item)
+            : null)
         ?.cast<TextDocumentContentChangeEvent>()
         ?.toList();
     return new DidChangeTextDocumentParams(textDocument, contentChanges);
@@ -1797,7 +1846,7 @@
   }
   factory DidChangeWatchedFilesParams.fromJson(Map<String, dynamic> json) {
     final changes = json['changes']
-        ?.map((item) => new FileEvent.fromJson(item))
+        ?.map((item) => item != null ? new FileEvent.fromJson(item) : null)
         ?.cast<FileEvent>()
         ?.toList();
     return new DidChangeWatchedFilesParams(changes);
@@ -1833,7 +1882,8 @@
   factory DidChangeWatchedFilesRegistrationOptions.fromJson(
       Map<String, dynamic> json) {
     final watchers = json['watchers']
-        ?.map((item) => new FileSystemWatcher.fromJson(item))
+        ?.map((item) =>
+            item != null ? new FileSystemWatcher.fromJson(item) : null)
         ?.cast<FileSystemWatcher>()
         ?.toList();
     return new DidChangeWatchedFilesRegistrationOptions(watchers);
@@ -1866,7 +1916,9 @@
     }
   }
   factory DidChangeWorkspaceFoldersParams.fromJson(Map<String, dynamic> json) {
-    final event = new WorkspaceFoldersChangeEvent.fromJson(json['event']);
+    final event = json['event'] != null
+        ? new WorkspaceFoldersChangeEvent.fromJson(json['event'])
+        : null;
     return new DidChangeWorkspaceFoldersParams(event);
   }
 
@@ -1893,8 +1945,9 @@
     }
   }
   factory DidCloseTextDocumentParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
     return new DidCloseTextDocumentParams(textDocument);
   }
 
@@ -1922,7 +1975,9 @@
     }
   }
   factory DidOpenTextDocumentParams.fromJson(Map<String, dynamic> json) {
-    final textDocument = new TextDocumentItem.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentItem.fromJson(json['textDocument'])
+        : null;
     return new DidOpenTextDocumentParams(textDocument);
   }
 
@@ -1950,8 +2005,9 @@
     }
   }
   factory DidSaveTextDocumentParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
     final text = json['text'];
     return new DidSaveTextDocumentParams(textDocument, text);
   }
@@ -2027,9 +2083,12 @@
     }
   }
   factory DocumentFormattingParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
-    final options = new FormattingOptions.fromJson(json['options']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final options = json['options'] != null
+        ? new FormattingOptions.fromJson(json['options'])
+        : null;
     return new DocumentFormattingParams(textDocument, options);
   }
 
@@ -2067,8 +2126,11 @@
     }
   }
   factory DocumentHighlight.fromJson(Map<String, dynamic> json) {
-    final range = new Range.fromJson(json['range']);
-    final kind = new DocumentHighlightKind.fromJson(json['kind']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final kind = json['kind'] != null
+        ? new DocumentHighlightKind.fromJson(json['kind'])
+        : null;
     return new DocumentHighlight(range, kind);
   }
 
@@ -2141,7 +2203,8 @@
     }
   }
   factory DocumentLink.fromJson(Map<String, dynamic> json) {
-    final range = new Range.fromJson(json['range']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
     final target = json['target'];
     final data = json['data'];
     return new DocumentLink(range, target, data);
@@ -2208,8 +2271,9 @@
     }
   }
   factory DocumentLinkParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
     return new DocumentLinkParams(textDocument);
   }
 
@@ -2236,7 +2300,7 @@
   factory DocumentLinkRegistrationOptions.fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new DocumentLinkRegistrationOptions(
@@ -2328,11 +2392,16 @@
     }
   }
   factory DocumentOnTypeFormattingParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
-    final position = new Position.fromJson(json['position']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position = json['position'] != null
+        ? new Position.fromJson(json['position'])
+        : null;
     final ch = json['ch'];
-    final options = new FormattingOptions.fromJson(json['options']);
+    final options = json['options'] != null
+        ? new FormattingOptions.fromJson(json['options'])
+        : null;
     return new DocumentOnTypeFormattingParams(
         textDocument, position, ch, options);
   }
@@ -2390,7 +2459,7 @@
         ?.cast<String>()
         ?.toList();
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new DocumentOnTypeFormattingRegistrationOptions(
@@ -2444,10 +2513,14 @@
     }
   }
   factory DocumentRangeFormattingParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
-    final range = new Range.fromJson(json['range']);
-    final options = new FormattingOptions.fromJson(json['options']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final options = json['options'] != null
+        ? new FormattingOptions.fromJson(json['options'])
+        : null;
     return new DocumentRangeFormattingParams(textDocument, range, options);
   }
 
@@ -2505,12 +2578,16 @@
   factory DocumentSymbol.fromJson(Map<String, dynamic> json) {
     final name = json['name'];
     final detail = json['detail'];
-    final kind = new SymbolKind.fromJson(json['kind']);
+    final kind =
+        json['kind'] != null ? new SymbolKind.fromJson(json['kind']) : null;
     final deprecated = json['deprecated'];
-    final range = new Range.fromJson(json['range']);
-    final selectionRange = new Range.fromJson(json['selectionRange']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final selectionRange = json['selectionRange'] != null
+        ? new Range.fromJson(json['selectionRange'])
+        : null;
     final children = json['children']
-        ?.map((item) => new DocumentSymbol.fromJson(item))
+        ?.map((item) => item != null ? new DocumentSymbol.fromJson(item) : null)
         ?.cast<DocumentSymbol>()
         ?.toList();
     return new DocumentSymbol(
@@ -2582,8 +2659,9 @@
     }
   }
   factory DocumentSymbolParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
     return new DocumentSymbolParams(textDocument);
   }
 
@@ -2850,7 +2928,8 @@
   }
   factory FileSystemWatcher.fromJson(Map<String, dynamic> json) {
     final globPattern = json['globPattern'];
-    final kind = new WatchKind.fromJson(json['kind']);
+    final kind =
+        json['kind'] != null ? new WatchKind.fromJson(json['kind']) : null;
     return new FileSystemWatcher(globPattern, kind);
   }
 
@@ -2895,7 +2974,9 @@
     final startCharacter = json['startCharacter'];
     final endLine = json['endLine'];
     final endCharacter = json['endCharacter'];
-    final kind = new FoldingRangeKind.fromJson(json['kind']);
+    final kind = json['kind'] != null
+        ? new FoldingRangeKind.fromJson(json['kind'])
+        : null;
     return new FoldingRange(
         startLine, startCharacter, endLine, endCharacter, kind);
   }
@@ -2992,8 +3073,9 @@
     }
   }
   factory FoldingRangeParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
     return new FoldingRangeParams(textDocument);
   }
 
@@ -3076,22 +3158,26 @@
   factory Hover.fromJson(Map<String, dynamic> json) {
     final contents = MarkedString.canParse(json['contents'])
         ? new Either3<MarkedString, List<MarkedString>, MarkupContent>.t1(
-            new MarkedString.fromJson(json['contents']))
+            json['contents'] != null
+                ? new MarkedString.fromJson(json['contents'])
+                : null)
         : ((json['contents'] is List &&
                 (json['contents'].length == 0 ||
                     json['contents']
                         .every((item) => MarkedString.canParse(item))))
-            ? new Either3<MarkedString, List<MarkedString>, MarkupContent>.t2(
-                json['contents']
-                    ?.map((item) => new MarkedString.fromJson(item))
-                    ?.cast<MarkedString>()
-                    ?.toList())
+            ? new Either3<MarkedString, List<MarkedString>, MarkupContent>.t2(json['contents']
+                ?.map((item) =>
+                    item != null ? new MarkedString.fromJson(item) : null)
+                ?.cast<MarkedString>()
+                ?.toList())
             : (MarkupContent.canParse(json['contents'])
-                ? new Either3<MarkedString, List<MarkedString>,
-                        MarkupContent>.t3(
-                    new MarkupContent.fromJson(json['contents']))
+                ? new Either3<MarkedString, List<MarkedString>, MarkupContent>.t3(
+                    json['contents'] != null
+                        ? new MarkupContent.fromJson(json['contents'])
+                        : null)
                 : (throw '''${json['contents']} was not one of (MarkedString, MarkedString[], MarkupContent)''')));
-    final range = new Range.fromJson(json['range']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
     return new Hover(contents, range);
   }
 
@@ -3137,9 +3223,12 @@
     final rootPath = json['rootPath'];
     final rootUri = json['rootUri'];
     final initializationOptions = json['initializationOptions'];
-    final capabilities = new ClientCapabilities.fromJson(json['capabilities']);
+    final capabilities = json['capabilities'] != null
+        ? new ClientCapabilities.fromJson(json['capabilities'])
+        : null;
     final workspaceFolders = json['workspaceFolders']
-        ?.map((item) => new WorkspaceFolder.fromJson(item))
+        ?.map(
+            (item) => item != null ? new WorkspaceFolder.fromJson(item) : null)
         ?.cast<WorkspaceFolder>()
         ?.toList();
     return new InitializeParams(processId, rootPath, rootUri,
@@ -3213,7 +3302,9 @@
     }
   }
   factory InitializeResult.fromJson(Map<String, dynamic> json) {
-    final capabilities = new ServerCapabilities.fromJson(json['capabilities']);
+    final capabilities = json['capabilities'] != null
+        ? new ServerCapabilities.fromJson(json['capabilities'])
+        : null;
     return new InitializeResult(capabilities);
   }
 
@@ -3297,7 +3388,8 @@
   }
   factory Location.fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
-    final range = new Range.fromJson(json['range']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
     return new Location(uri, range);
   }
 
@@ -3330,7 +3422,8 @@
     }
   }
   factory LogMessageParams.fromJson(Map<String, dynamic> json) {
-    final type = new MessageType.fromJson(json['type']);
+    final type =
+        json['type'] != null ? new MessageType.fromJson(json['type']) : null;
     final message = json['message'];
     return new LogMessageParams(type, message);
   }
@@ -3428,7 +3521,8 @@
     }
   }
   factory MarkupContent.fromJson(Map<String, dynamic> json) {
-    final kind = new MarkupKind.fromJson(json['kind']);
+    final kind =
+        json['kind'] != null ? new MarkupKind.fromJson(json['kind']) : null;
     final value = json['value'];
     return new MarkupContent(kind, value);
   }
@@ -3603,7 +3697,7 @@
                 json['params'].every((item) => true)))
         ? new Either2<List<dynamic>, dynamic>.t1(
             json['params']?.map((item) => item)?.cast<dynamic>()?.toList())
-        : (json['params']);
+        : (new Either2<List<dynamic>, dynamic>.t2(json['params']));
     final jsonrpc = json['jsonrpc'];
     return new NotificationMessage(method, params, jsonrpc);
   }
@@ -3650,7 +3744,9 @@
         ? new Either2<String, MarkupContent>.t1(json['documentation'])
         : (MarkupContent.canParse(json['documentation'])
             ? new Either2<String, MarkupContent>.t2(
-                new MarkupContent.fromJson(json['documentation']))
+                json['documentation'] != null
+                    ? new MarkupContent.fromJson(json['documentation'])
+                    : null)
             : (throw '''${json['documentation']} was not one of (string, MarkupContent)'''));
     return new ParameterInformation(label, documentation);
   }
@@ -3734,7 +3830,7 @@
   factory PublishDiagnosticsParams.fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
     final diagnostics = json['diagnostics']
-        ?.map((item) => new Diagnostic.fromJson(item))
+        ?.map((item) => item != null ? new Diagnostic.fromJson(item) : null)
         ?.cast<Diagnostic>()
         ?.toList();
     return new PublishDiagnosticsParams(uri, diagnostics);
@@ -3775,8 +3871,9 @@
     }
   }
   factory Range.fromJson(Map<String, dynamic> json) {
-    final start = new Position.fromJson(json['start']);
-    final end = new Position.fromJson(json['end']);
+    final start =
+        json['start'] != null ? new Position.fromJson(json['start']) : null;
+    final end = json['end'] != null ? new Position.fromJson(json['end']) : null;
     return new Range(start, end);
   }
 
@@ -3843,10 +3940,15 @@
     }
   }
   factory ReferenceParams.fromJson(Map<String, dynamic> json) {
-    final context = new ReferenceContext.fromJson(json['context']);
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
-    final position = new Position.fromJson(json['position']);
+    final context = json['context'] != null
+        ? new ReferenceContext.fromJson(json['context'])
+        : null;
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position = json['position'] != null
+        ? new Position.fromJson(json['position'])
+        : null;
     return new ReferenceParams(context, textDocument, position);
   }
 
@@ -3934,7 +4036,7 @@
   }
   factory RegistrationParams.fromJson(Map<String, dynamic> json) {
     final registrations = json['registrations']
-        ?.map((item) => new Registration.fromJson(item))
+        ?.map((item) => item != null ? new Registration.fromJson(item) : null)
         ?.cast<Registration>()
         ?.toList();
     return new RegistrationParams(registrations);
@@ -3972,7 +4074,9 @@
   factory RenameFile.fromJson(Map<String, dynamic> json) {
     final oldUri = json['oldUri'];
     final newUri = json['newUri'];
-    final options = new RenameFileOptions.fromJson(json['options']);
+    final options = json['options'] != null
+        ? new RenameFileOptions.fromJson(json['options'])
+        : null;
     return new RenameFile(oldUri, newUri, options);
   }
 
@@ -4074,9 +4178,12 @@
     }
   }
   factory RenameParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
-    final position = new Position.fromJson(json['position']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position = json['position'] != null
+        ? new Position.fromJson(json['position'])
+        : null;
     final newName = json['newName'];
     return new RenameParams(textDocument, position, newName);
   }
@@ -4120,7 +4227,7 @@
   factory RenameRegistrationOptions.fromJson(Map<String, dynamic> json) {
     final prepareProvider = json['prepareProvider'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new RenameRegistrationOptions(prepareProvider, documentSelector);
@@ -4178,7 +4285,7 @@
                 json['params'].every((item) => true)))
         ? new Either2<List<dynamic>, dynamic>.t1(
             json['params']?.map((item) => item)?.cast<dynamic>()?.toList())
-        : (json['params']);
+        : (new Either2<List<dynamic>, dynamic>.t2(json['params']));
     final jsonrpc = json['jsonrpc'];
     return new RequestMessage(id, method, params, jsonrpc);
   }
@@ -4401,16 +4508,20 @@
     final textDocumentSync = TextDocumentSyncOptions.canParse(
             json['textDocumentSync'])
         ? new Either2<TextDocumentSyncOptions, num>.t1(
-            new TextDocumentSyncOptions.fromJson(json['textDocumentSync']))
+            json['textDocumentSync'] != null
+                ? new TextDocumentSyncOptions.fromJson(json['textDocumentSync'])
+                : null)
         : (json['textDocumentSync'] is num
             ? new Either2<TextDocumentSyncOptions, num>.t2(
                 json['textDocumentSync'])
             : (throw '''${json['textDocumentSync']} was not one of (TextDocumentSyncOptions, number)'''));
     final hoverProvider = json['hoverProvider'];
-    final completionProvider =
-        new CompletionOptions.fromJson(json['completionProvider']);
-    final signatureHelpProvider =
-        new SignatureHelpOptions.fromJson(json['signatureHelpProvider']);
+    final completionProvider = json['completionProvider'] != null
+        ? new CompletionOptions.fromJson(json['completionProvider'])
+        : null;
+    final signatureHelpProvider = json['signatureHelpProvider'] != null
+        ? new SignatureHelpOptions.fromJson(json['signatureHelpProvider'])
+        : null;
     final definitionProvider = json['definitionProvider'];
     final referencesProvider = json['referencesProvider'];
     final documentHighlightProvider = json['documentHighlightProvider'];
@@ -4420,26 +4531,34 @@
         ? new Either2<bool, CodeActionOptions>.t1(json['codeActionProvider'])
         : (CodeActionOptions.canParse(json['codeActionProvider'])
             ? new Either2<bool, CodeActionOptions>.t2(
-                new CodeActionOptions.fromJson(json['codeActionProvider']))
+                json['codeActionProvider'] != null
+                    ? new CodeActionOptions.fromJson(json['codeActionProvider'])
+                    : null)
             : (throw '''${json['codeActionProvider']} was not one of (boolean, CodeActionOptions)'''));
-    final codeLensProvider =
-        new CodeLensOptions.fromJson(json['codeLensProvider']);
+    final codeLensProvider = json['codeLensProvider'] != null
+        ? new CodeLensOptions.fromJson(json['codeLensProvider'])
+        : null;
     final documentFormattingProvider = json['documentFormattingProvider'];
     final documentRangeFormattingProvider =
         json['documentRangeFormattingProvider'];
     final documentOnTypeFormattingProvider =
-        new DocumentOnTypeFormattingOptions.fromJson(
-            json['documentOnTypeFormattingProvider']);
+        json['documentOnTypeFormattingProvider'] != null
+            ? new DocumentOnTypeFormattingOptions.fromJson(
+                json['documentOnTypeFormattingProvider'])
+            : null;
     final renameProvider = json['renameProvider'] is bool
         ? new Either2<bool, RenameOptions>.t1(json['renameProvider'])
         : (RenameOptions.canParse(json['renameProvider'])
-            ? new Either2<bool, RenameOptions>.t2(
-                new RenameOptions.fromJson(json['renameProvider']))
+            ? new Either2<bool, RenameOptions>.t2(json['renameProvider'] != null
+                ? new RenameOptions.fromJson(json['renameProvider'])
+                : null)
             : (throw '''${json['renameProvider']} was not one of (boolean, RenameOptions)'''));
-    final documentLinkProvider =
-        new DocumentLinkOptions.fromJson(json['documentLinkProvider']);
-    final executeCommandProvider =
-        new ExecuteCommandOptions.fromJson(json['executeCommandProvider']);
+    final documentLinkProvider = json['documentLinkProvider'] != null
+        ? new DocumentLinkOptions.fromJson(json['documentLinkProvider'])
+        : null;
+    final executeCommandProvider = json['executeCommandProvider'] != null
+        ? new ExecuteCommandOptions.fromJson(json['executeCommandProvider'])
+        : null;
     final supported = json['supported'];
     final changeNotifications = json['changeNotifications'] is String
         ? new Either2<String, bool>.t1(json['changeNotifications'])
@@ -4622,7 +4741,8 @@
     }
   }
   factory ShowMessageParams.fromJson(Map<String, dynamic> json) {
-    final type = new MessageType.fromJson(json['type']);
+    final type =
+        json['type'] != null ? new MessageType.fromJson(json['type']) : null;
     final message = json['message'];
     return new ShowMessageParams(type, message);
   }
@@ -4660,10 +4780,12 @@
     }
   }
   factory ShowMessageRequestParams.fromJson(Map<String, dynamic> json) {
-    final type = new MessageType.fromJson(json['type']);
+    final type =
+        json['type'] != null ? new MessageType.fromJson(json['type']) : null;
     final message = json['message'];
     final actions = json['actions']
-        ?.map((item) => new MessageActionItem.fromJson(item))
+        ?.map((item) =>
+            item != null ? new MessageActionItem.fromJson(item) : null)
         ?.cast<MessageActionItem>()
         ?.toList();
     return new ShowMessageRequestParams(type, message, actions);
@@ -4709,7 +4831,8 @@
   }
   factory SignatureHelp.fromJson(Map<String, dynamic> json) {
     final signatures = json['signatures']
-        ?.map((item) => new SignatureInformation.fromJson(item))
+        ?.map((item) =>
+            item != null ? new SignatureInformation.fromJson(item) : null)
         ?.cast<SignatureInformation>()
         ?.toList();
     final activeSignature = json['activeSignature'];
@@ -4801,7 +4924,7 @@
         ?.cast<String>()
         ?.toList();
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new SignatureHelpRegistrationOptions(
@@ -4851,10 +4974,13 @@
         ? new Either2<String, MarkupContent>.t1(json['documentation'])
         : (MarkupContent.canParse(json['documentation'])
             ? new Either2<String, MarkupContent>.t2(
-                new MarkupContent.fromJson(json['documentation']))
+                json['documentation'] != null
+                    ? new MarkupContent.fromJson(json['documentation'])
+                    : null)
             : (throw '''${json['documentation']} was not one of (string, MarkupContent)'''));
     final parameters = json['parameters']
-        ?.map((item) => new ParameterInformation.fromJson(item))
+        ?.map((item) =>
+            item != null ? new ParameterInformation.fromJson(item) : null)
         ?.cast<ParameterInformation>()
         ?.toList();
     return new SignatureInformation(label, documentation, parameters);
@@ -4936,7 +5062,9 @@
     final name = json['name'];
     final kind = json['kind'];
     final deprecated = json['deprecated'];
-    final location = new Location.fromJson(json['location']);
+    final location = json['location'] != null
+        ? new Location.fromJson(json['location'])
+        : null;
     final containerName = json['containerName'];
     return new SymbolInformation(
         name, kind, deprecated, location, containerName);
@@ -5089,7 +5217,7 @@
       Map<String, dynamic> json) {
     final syncKind = json['syncKind'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new TextDocumentChangeRegistrationOptions(
@@ -5188,7 +5316,8 @@
     }
   }
   factory TextDocumentContentChangeEvent.fromJson(Map<String, dynamic> json) {
-    final range = new Range.fromJson(json['range']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
     final rangeLength = json['rangeLength'];
     final text = json['text'];
     return new TextDocumentContentChangeEvent(range, rangeLength, text);
@@ -5232,10 +5361,11 @@
     }
   }
   factory TextDocumentEdit.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new VersionedTextDocumentIdentifier.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new VersionedTextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
     final edits = json['edits']
-        ?.map((item) => new TextEdit.fromJson(item))
+        ?.map((item) => item != null ? new TextEdit.fromJson(item) : null)
         ?.cast<TextEdit>()
         ?.toList();
     return new TextDocumentEdit(textDocument, edits);
@@ -5363,9 +5493,12 @@
     }
   }
   factory TextDocumentPositionParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
-    final position = new Position.fromJson(json['position']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position = json['position'] != null
+        ? new Position.fromJson(json['position'])
+        : null;
     return new TextDocumentPositionParams(textDocument, position);
   }
 
@@ -5397,7 +5530,7 @@
   TextDocumentRegistrationOptions(this.documentSelector);
   factory TextDocumentRegistrationOptions.fromJson(Map<String, dynamic> json) {
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new TextDocumentRegistrationOptions(documentSelector);
@@ -5469,7 +5602,7 @@
       Map<String, dynamic> json) {
     final includeText = json['includeText'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => new DocumentFilter.fromJson(item))
+        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new TextDocumentSaveRegistrationOptions(
@@ -5551,10 +5684,13 @@
       this.willSaveWaitUntil, this.save);
   factory TextDocumentSyncOptions.fromJson(Map<String, dynamic> json) {
     final openClose = json['openClose'];
-    final change = new TextDocumentSyncKind.fromJson(json['change']);
+    final change = json['change'] != null
+        ? new TextDocumentSyncKind.fromJson(json['change'])
+        : null;
     final willSave = json['willSave'];
     final willSaveWaitUntil = json['willSaveWaitUntil'];
-    final save = new SaveOptions.fromJson(json['save']);
+    final save =
+        json['save'] != null ? new SaveOptions.fromJson(json['save']) : null;
     return new TextDocumentSyncOptions(
         openClose, change, willSave, willSaveWaitUntil, save);
   }
@@ -5616,7 +5752,8 @@
     }
   }
   factory TextEdit.fromJson(Map<String, dynamic> json) {
-    final range = new Range.fromJson(json['range']);
+    final range =
+        json['range'] != null ? new Range.fromJson(json['range']) : null;
     final newText = json['newText'];
     return new TextEdit(range, newText);
   }
@@ -5695,7 +5832,7 @@
   }
   factory UnregistrationParams.fromJson(Map<String, dynamic> json) {
     final unregisterations = json['unregisterations']
-        ?.map((item) => new Unregistration.fromJson(item))
+        ?.map((item) => item != null ? new Unregistration.fromJson(item) : null)
         ?.cast<Unregistration>()
         ?.toList();
     return new UnregistrationParams(unregisterations);
@@ -5815,8 +5952,9 @@
     }
   }
   factory WillSaveTextDocumentParams.fromJson(Map<String, dynamic> json) {
-    final textDocument =
-        new TextDocumentIdentifier.fromJson(json['textDocument']);
+    final textDocument = json['textDocument'] != null
+        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
     final reason = json['reason'];
     return new WillSaveTextDocumentParams(textDocument, reason);
   }
@@ -5852,11 +5990,13 @@
     final applyEdit = json['applyEdit'];
     final documentChanges = json['documentChanges'];
     final resourceOperations = json['resourceOperations']
-        ?.map((item) => new ResourceOperationKind.fromJson(item))
+        ?.map((item) =>
+            item != null ? new ResourceOperationKind.fromJson(item) : null)
         ?.cast<ResourceOperationKind>()
         ?.toList();
-    final failureHandling =
-        new FailureHandlingKind.fromJson(json['failureHandling']);
+    final failureHandling = json['failureHandling'] != null
+        ? new FailureHandlingKind.fromJson(json['failureHandling'])
+        : null;
     return new WorkspaceClientCapabilities(
         applyEdit, documentChanges, resourceOperations, failureHandling);
   }
@@ -6004,11 +6144,13 @@
   }
   factory WorkspaceFoldersChangeEvent.fromJson(Map<String, dynamic> json) {
     final added = json['added']
-        ?.map((item) => new WorkspaceFolder.fromJson(item))
+        ?.map(
+            (item) => item != null ? new WorkspaceFolder.fromJson(item) : null)
         ?.cast<WorkspaceFolder>()
         ?.toList();
     final removed = json['removed']
-        ?.map((item) => new WorkspaceFolder.fromJson(item))
+        ?.map(
+            (item) => item != null ? new WorkspaceFolder.fromJson(item) : null)
         ?.cast<WorkspaceFolder>()
         ?.toList();
     return new WorkspaceFoldersChangeEvent(added, removed);
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 43e4bfc..79b2b63 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -328,7 +328,7 @@
     buffer.write("$valueCode");
   } else if (_isSpecType(type)) {
     // Our own types have fromJson() constructors we can call.
-    buffer.write("new $type.fromJson($valueCode)");
+    buffer.write("$valueCode != null ? new $type.fromJson($valueCode) : null");
   } else if (_isList(type)) {
     // Lists need to be mapped so we can recursively call (they may need fromJson).
     buffer.write("$valueCode?.map((item) => ");
@@ -352,15 +352,23 @@
   for (var i = 0; i < types.length; i++) {
     final dartType = mapType([types[i]]);
 
+    // Dynamic matches all type checks, so only emit it if required.
     if (dartType != 'dynamic') {
       _writeTypeCheckCondition(buffer, valueCode, dartType);
-      buffer.write(' ? new $unionTypeName.t${i + 1}(');
-      _writeFromJsonCode(buffer, [dartType], valueCode); // Call recursively!
-      buffer.write(') : (');
+      buffer.write(' ? ');
+    }
+
+    // The code to construct a value with this "side" of the union.
+    buffer.write('new $unionTypeName.t${i + 1}(');
+    _writeFromJsonCode(buffer, [dartType], valueCode); // Call recursively!
+    buffer.write(')');
+
+    // If we output the type condition at the top, prepare for the next condition.
+    if (dartType != 'dynamic') {
+      buffer.write(' : (');
       hasIncompleteCondition = true;
       unclosedParens++;
     } else {
-      _writeFromJsonCode(buffer, [dartType], valueCode);
       hasIncompleteCondition = false;
     }
   }
