Fix handling of JSON with interfaces nested within Unions
Change-Id: I926c2374860824db3ceae6d74286474feb730676
Reviewed-on: https://dart-review.googlesource.com/c/81100
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Danny Tuppeny <dantup@google.com>
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index d6fb0e5..f98b678 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -10,7 +10,7 @@
import 'dart:core' as core show deprecated;
import 'package:analysis_server/lsp_protocol/protocol_special.dart';
-class ApplyWorkspaceEditParams {
+class ApplyWorkspaceEditParams implements ToJsonable {
ApplyWorkspaceEditParams(this.label, this.edit) {
if (edit == null) {
throw 'edit is required but was not provided';
@@ -45,7 +45,7 @@
}
}
-class ApplyWorkspaceEditResponse {
+class ApplyWorkspaceEditResponse implements ToJsonable {
ApplyWorkspaceEditResponse(this.applied) {
if (applied == null) {
throw 'applied is required but was not provided';
@@ -73,7 +73,7 @@
}
}
-class CancelParams {
+class CancelParams implements ToJsonable {
CancelParams(this.id) {
if (id == null) {
throw 'id is required but was not provided';
@@ -104,7 +104,7 @@
}
}
-class ClientCapabilities {
+class ClientCapabilities implements ToJsonable {
ClientCapabilities(this.workspace, this.textDocument, this.experimental);
factory ClientCapabilities.fromJson(Map<String, dynamic> json) {
final workspace =
@@ -148,7 +148,7 @@
///
/// A CodeAction must set either `edit` and/or a `command`. If both are
/// supplied, the `edit` is applied first, then the `command` is executed.
-class CodeAction {
+class CodeAction implements ToJsonable {
CodeAction(this.title, this.kind, this.diagnostics, this.edit, this.command) {
if (title == null) {
throw 'title is required but was not provided';
@@ -211,7 +211,7 @@
/// Contains additional diagnostic information about the context in which a code
/// action is run.
-class CodeActionContext {
+class CodeActionContext implements ToJsonable {
CodeActionContext(this.diagnostics, this.only) {
if (diagnostics == null) {
throw 'diagnostics is required but was not provided';
@@ -305,7 +305,7 @@
}
/// Code Action options.
-class CodeActionOptions {
+class CodeActionOptions implements ToJsonable {
CodeActionOptions(this.codeActionKinds);
factory CodeActionOptions.fromJson(Map<String, dynamic> json) {
final codeActionKinds =
@@ -333,7 +333,7 @@
}
/// Params for the CodeActionRequest
-class CodeActionParams {
+class CodeActionParams implements ToJsonable {
CodeActionParams(this.textDocument, this.range, this.context) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -384,7 +384,7 @@
}
class CodeActionRegistrationOptions
- implements TextDocumentRegistrationOptions, CodeActionOptions {
+ implements TextDocumentRegistrationOptions, CodeActionOptions, ToJsonable {
CodeActionRegistrationOptions(this.documentSelector, this.codeActionKinds);
factory CodeActionRegistrationOptions.fromJson(Map<String, dynamic> json) {
final documentSelector = json['documentSelector']
@@ -431,7 +431,7 @@
/// A code lens is _unresolved_ when no command is associated to it. For
/// performance reasons the creation of a code lens and resolving should be done
/// in two stages.
-class CodeLens {
+class CodeLens implements ToJsonable {
CodeLens(this.range, this.command, this.data) {
if (range == null) {
throw 'range is required but was not provided';
@@ -475,7 +475,7 @@
}
/// Code Lens options.
-class CodeLensOptions {
+class CodeLensOptions implements ToJsonable {
CodeLensOptions(this.resolveProvider);
factory CodeLensOptions.fromJson(Map<String, dynamic> json) {
final resolveProvider = json['resolveProvider'];
@@ -498,7 +498,7 @@
}
}
-class CodeLensParams {
+class CodeLensParams implements ToJsonable {
CodeLensParams(this.textDocument) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -527,7 +527,8 @@
}
}
-class CodeLensRegistrationOptions implements TextDocumentRegistrationOptions {
+class CodeLensRegistrationOptions
+ implements TextDocumentRegistrationOptions, ToJsonable {
CodeLensRegistrationOptions(this.resolveProvider, this.documentSelector);
factory CodeLensRegistrationOptions.fromJson(Map<String, dynamic> json) {
final resolveProvider = json['resolveProvider'];
@@ -565,7 +566,7 @@
}
/// Represents a color in RGBA space.
-class Color {
+class Color implements ToJsonable {
Color(this.red, this.green, this.blue, this.alpha) {
if (red == null) {
throw 'red is required but was not provided';
@@ -615,7 +616,7 @@
}
}
-class ColorInformation {
+class ColorInformation implements ToJsonable {
ColorInformation(this.range, this.color) {
if (range == null) {
throw 'range is required but was not provided';
@@ -652,7 +653,7 @@
}
}
-class ColorPresentation {
+class ColorPresentation implements ToJsonable {
ColorPresentation(this.label, this.textEdit, this.additionalTextEdits) {
if (label == null) {
throw 'label is required but was not provided';
@@ -702,7 +703,7 @@
}
}
-class ColorPresentationParams {
+class ColorPresentationParams implements ToJsonable {
ColorPresentationParams(this.textDocument, this.color, this.range) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -752,7 +753,7 @@
}
/// Color provider options.
-class ColorProviderOptions {
+class ColorProviderOptions implements ToJsonable {
Map<String, dynamic> toJson() {
Map<String, dynamic> __result = {};
return __result;
@@ -763,7 +764,7 @@
}
}
-class Command {
+class Command implements ToJsonable {
Command(this.title, this.command, this.arguments) {
if (title == null) {
throw 'title is required but was not provided';
@@ -811,7 +812,7 @@
/// Contains additional information about the context in which a completion
/// request is triggered.
-class CompletionContext {
+class CompletionContext implements ToJsonable {
CompletionContext(this.triggerKind, this.triggerCharacter) {
if (triggerKind == null) {
throw 'triggerKind is required but was not provided';
@@ -847,7 +848,7 @@
}
}
-class CompletionItem {
+class CompletionItem implements ToJsonable {
CompletionItem(
this.label,
this.kind,
@@ -1128,7 +1129,7 @@
/// Represents a collection of completion items ([CompletionItem]) to be
/// presented in the editor.
-class CompletionList {
+class CompletionList implements ToJsonable {
CompletionList(this.isIncomplete, this.items) {
if (isIncomplete == null) {
throw 'isIncomplete is required but was not provided';
@@ -1173,7 +1174,7 @@
}
/// Completion options.
-class CompletionOptions {
+class CompletionOptions implements ToJsonable {
CompletionOptions(this.resolveProvider, this.triggerCharacters);
factory CompletionOptions.fromJson(Map<String, dynamic> json) {
final resolveProvider = json['resolveProvider'];
@@ -1207,7 +1208,7 @@
}
}
-class CompletionParams implements TextDocumentPositionParams {
+class CompletionParams implements TextDocumentPositionParams, ToJsonable {
CompletionParams(this.context, this.textDocument, this.position) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -1256,7 +1257,8 @@
}
}
-class CompletionRegistrationOptions implements TextDocumentRegistrationOptions {
+class CompletionRegistrationOptions
+ implements TextDocumentRegistrationOptions, ToJsonable {
CompletionRegistrationOptions(
this.triggerCharacters, this.resolveProvider, this.documentSelector);
factory CompletionRegistrationOptions.fromJson(Map<String, dynamic> json) {
@@ -1356,7 +1358,7 @@
bool operator ==(o) => o is CompletionTriggerKind && o._value == _value;
}
-class ConfigurationItem {
+class ConfigurationItem implements ToJsonable {
ConfigurationItem(this.scopeUri, this.section);
factory ConfigurationItem.fromJson(Map<String, dynamic> json) {
final scopeUri = json['scopeUri'];
@@ -1386,7 +1388,7 @@
}
}
-class ConfigurationParams {
+class ConfigurationParams implements ToJsonable {
ConfigurationParams(this.items) {
if (items == null) {
throw 'items is required but was not provided';
@@ -1419,7 +1421,7 @@
}
/// Create file operation
-class CreateFile implements FileOperation {
+class CreateFile implements FileOperation, ToJsonable {
CreateFile(this.uri, this.options) {
if (uri == null) {
throw 'uri is required but was not provided';
@@ -1454,7 +1456,7 @@
}
/// Options to create a file.
-class CreateFileOptions {
+class CreateFileOptions implements ToJsonable {
CreateFileOptions(this.overwrite, this.ignoreIfExists);
factory CreateFileOptions.fromJson(Map<String, dynamic> json) {
final overwrite = json['overwrite'];
@@ -1485,7 +1487,7 @@
}
/// Delete file operation
-class DeleteFile implements FileOperation {
+class DeleteFile implements FileOperation, ToJsonable {
DeleteFile(this.uri, this.options) {
if (uri == null) {
throw 'uri is required but was not provided';
@@ -1520,7 +1522,7 @@
}
/// Delete file options
-class DeleteFileOptions {
+class DeleteFileOptions implements ToJsonable {
DeleteFileOptions(this.recursive, this.ignoreIfNotExists);
factory DeleteFileOptions.fromJson(Map<String, dynamic> json) {
final recursive = json['recursive'];
@@ -1550,7 +1552,7 @@
}
}
-class Diagnostic {
+class Diagnostic implements ToJsonable {
Diagnostic(this.range, this.severity, this.code, this.source, this.message,
this.relatedInformation) {
if (range == null) {
@@ -1632,7 +1634,7 @@
/// Represents a related message and source code location for a diagnostic.
/// This should be used to point to code locations that cause or related to
/// a diagnostics, e.g when duplicating a symbol in a scope.
-class DiagnosticRelatedInformation {
+class DiagnosticRelatedInformation implements ToJsonable {
DiagnosticRelatedInformation(this.location, this.message) {
if (location == null) {
throw 'location is required but was not provided';
@@ -1711,7 +1713,7 @@
bool operator ==(o) => o is DiagnosticSeverity && o._value == _value;
}
-class DidChangeConfigurationParams {
+class DidChangeConfigurationParams implements ToJsonable {
DidChangeConfigurationParams(this.settings) {
if (settings == null) {
throw 'settings is required but was not provided';
@@ -1737,7 +1739,7 @@
}
}
-class DidChangeTextDocumentParams {
+class DidChangeTextDocumentParams implements ToJsonable {
DidChangeTextDocumentParams(this.textDocument, this.contentChanges) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -1787,7 +1789,7 @@
}
}
-class DidChangeWatchedFilesParams {
+class DidChangeWatchedFilesParams implements ToJsonable {
DidChangeWatchedFilesParams(this.changes) {
if (changes == null) {
throw 'changes is required but was not provided';
@@ -1822,7 +1824,7 @@
/// Describe options to be used when registering for text document change
/// events.
-class DidChangeWatchedFilesRegistrationOptions {
+class DidChangeWatchedFilesRegistrationOptions implements ToJsonable {
DidChangeWatchedFilesRegistrationOptions(this.watchers) {
if (watchers == null) {
throw 'watchers is required but was not provided';
@@ -1857,7 +1859,7 @@
}
}
-class DidChangeWorkspaceFoldersParams {
+class DidChangeWorkspaceFoldersParams implements ToJsonable {
DidChangeWorkspaceFoldersParams(this.event) {
if (event == null) {
throw 'event is required but was not provided';
@@ -1884,7 +1886,7 @@
}
}
-class DidCloseTextDocumentParams {
+class DidCloseTextDocumentParams implements ToJsonable {
DidCloseTextDocumentParams(this.textDocument) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -1913,7 +1915,7 @@
}
}
-class DidOpenTextDocumentParams {
+class DidOpenTextDocumentParams implements ToJsonable {
DidOpenTextDocumentParams(this.textDocument) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -1941,7 +1943,7 @@
}
}
-class DidSaveTextDocumentParams {
+class DidSaveTextDocumentParams implements ToJsonable {
DidSaveTextDocumentParams(this.textDocument, this.text) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -1978,7 +1980,7 @@
}
}
-class DocumentFilter {
+class DocumentFilter implements ToJsonable {
DocumentFilter(this.language, this.scheme, this.pattern);
factory DocumentFilter.fromJson(Map<String, dynamic> json) {
final language = json['language'];
@@ -2015,7 +2017,7 @@
}
}
-class DocumentFormattingParams {
+class DocumentFormattingParams implements ToJsonable {
DocumentFormattingParams(this.textDocument, this.options) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -2058,7 +2060,7 @@
/// A document highlight is a range inside a text document which deserves
/// special attention. Usually a document highlight is visualized by
/// changing the background color of its range.
-class DocumentHighlight {
+class DocumentHighlight implements ToJsonable {
DocumentHighlight(this.range, this.kind) {
if (range == null) {
throw 'range is required but was not provided';
@@ -2132,7 +2134,7 @@
/// A document link is a range in a text document that links to an
/// internal or external resource, like another text document or a web
/// site.
-class DocumentLink {
+class DocumentLink implements ToJsonable {
DocumentLink(this.range, this.target, this.data) {
if (range == null) {
throw 'range is required but was not provided';
@@ -2176,7 +2178,7 @@
}
/// Document link options.
-class DocumentLinkOptions {
+class DocumentLinkOptions implements ToJsonable {
DocumentLinkOptions(this.resolveProvider);
factory DocumentLinkOptions.fromJson(Map<String, dynamic> json) {
final resolveProvider = json['resolveProvider'];
@@ -2199,7 +2201,7 @@
}
}
-class DocumentLinkParams {
+class DocumentLinkParams implements ToJsonable {
DocumentLinkParams(this.textDocument) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -2229,7 +2231,7 @@
}
class DocumentLinkRegistrationOptions
- implements TextDocumentRegistrationOptions {
+ implements TextDocumentRegistrationOptions, ToJsonable {
DocumentLinkRegistrationOptions(this.resolveProvider, this.documentSelector);
factory DocumentLinkRegistrationOptions.fromJson(Map<String, dynamic> json) {
final resolveProvider = json['resolveProvider'];
@@ -2269,7 +2271,7 @@
}
/// Format document on type options.
-class DocumentOnTypeFormattingOptions {
+class DocumentOnTypeFormattingOptions implements ToJsonable {
DocumentOnTypeFormattingOptions(
this.firstTriggerCharacter, this.moreTriggerCharacter) {
if (firstTriggerCharacter == null) {
@@ -2309,7 +2311,7 @@
}
}
-class DocumentOnTypeFormattingParams {
+class DocumentOnTypeFormattingParams implements ToJsonable {
DocumentOnTypeFormattingParams(
this.textDocument, this.position, this.ch, this.options) {
if (textDocument == null) {
@@ -2373,7 +2375,7 @@
}
class DocumentOnTypeFormattingRegistrationOptions
- implements TextDocumentRegistrationOptions {
+ implements TextDocumentRegistrationOptions, ToJsonable {
DocumentOnTypeFormattingRegistrationOptions(this.firstTriggerCharacter,
this.moreTriggerCharacter, this.documentSelector) {
if (firstTriggerCharacter == null) {
@@ -2429,7 +2431,7 @@
}
}
-class DocumentRangeFormattingParams {
+class DocumentRangeFormattingParams implements ToJsonable {
DocumentRangeFormattingParams(this.textDocument, this.range, this.options) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -2484,7 +2486,7 @@
/// hierarchical and they have two ranges: one that encloses its
/// definition and one that points to its most interesting range, e.g.
/// the range of an identifier.
-class DocumentSymbol {
+class DocumentSymbol implements ToJsonable {
DocumentSymbol(this.name, this.detail, this.kind, this.deprecated, this.range,
this.selectionRange, this.children) {
if (name == null) {
@@ -2573,7 +2575,7 @@
}
}
-class DocumentSymbolParams {
+class DocumentSymbolParams implements ToJsonable {
DocumentSymbolParams(this.textDocument) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -2616,7 +2618,7 @@
}
/// Execute command options.
-class ExecuteCommandOptions {
+class ExecuteCommandOptions implements ToJsonable {
ExecuteCommandOptions(this.commands) {
if (commands == null) {
throw 'commands is required but was not provided';
@@ -2647,7 +2649,7 @@
}
}
-class ExecuteCommandParams {
+class ExecuteCommandParams implements ToJsonable {
ExecuteCommandParams(this.command, this.arguments) {
if (command == null) {
throw 'command is required but was not provided';
@@ -2684,7 +2686,7 @@
}
/// Execute command registration options.
-class ExecuteCommandRegistrationOptions {
+class ExecuteCommandRegistrationOptions implements ToJsonable {
ExecuteCommandRegistrationOptions(this.commands) {
if (commands == null) {
throw 'commands is required but was not provided';
@@ -2803,7 +2805,7 @@
}
/// An event describing a file change.
-class FileEvent {
+class FileEvent implements ToJsonable {
FileEvent(this.uri, this.type) {
if (uri == null) {
throw 'uri is required but was not provided';
@@ -2840,7 +2842,7 @@
}
}
-class FileSystemWatcher {
+class FileSystemWatcher implements ToJsonable {
FileSystemWatcher(this.globPattern, this.kind) {
if (globPattern == null) {
throw 'globPattern is required but was not provided';
@@ -2878,7 +2880,7 @@
}
/// Represents a folding range.
-class FoldingRange {
+class FoldingRange implements ToJsonable {
FoldingRange(this.startLine, this.startCharacter, this.endLine,
this.endCharacter, this.kind) {
if (startLine == null) {
@@ -2983,7 +2985,7 @@
bool operator ==(o) => o is FoldingRangeKind && o._value == _value;
}
-class FoldingRangeParams {
+class FoldingRangeParams implements ToJsonable {
FoldingRangeParams(this.textDocument) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -3013,7 +3015,7 @@
}
/// Folding range provider options.
-class FoldingRangeProviderOptions {
+class FoldingRangeProviderOptions implements ToJsonable {
Map<String, dynamic> toJson() {
Map<String, dynamic> __result = {};
return __result;
@@ -3025,7 +3027,7 @@
}
/// Value-object describing what options formatting should use.
-class FormattingOptions {
+class FormattingOptions implements ToJsonable {
FormattingOptions(this.tabSize, this.insertSpaces) {
if (tabSize == null) {
throw 'tabSize is required but was not provided';
@@ -3065,7 +3067,7 @@
}
/// The result of a hover request.
-class Hover {
+class Hover implements ToJsonable {
Hover(this.contents, this.range) {
if (contents == null) {
throw 'contents is required but was not provided';
@@ -3123,7 +3125,7 @@
}
}
-class InitializeParams {
+class InitializeParams implements ToJsonable {
InitializeParams(this.processId, this.rootPath, this.rootUri,
this.initializationOptions, this.capabilities, this.workspaceFolders) {
if (capabilities == null) {
@@ -3204,7 +3206,7 @@
}
}
-class InitializeResult {
+class InitializeResult implements ToJsonable {
InitializeResult(this.capabilities) {
if (capabilities == null) {
throw 'capabilities is required but was not provided';
@@ -3232,7 +3234,7 @@
}
}
-class InitializedParams {
+class InitializedParams implements ToJsonable {
Map<String, dynamic> toJson() {
Map<String, dynamic> __result = {};
return __result;
@@ -3284,7 +3286,7 @@
bool operator ==(o) => o is InsertTextFormat && o._value == _value;
}
-class Location {
+class Location implements ToJsonable {
Location(this.uri, this.range) {
if (uri == null) {
throw 'uri is required but was not provided';
@@ -3318,7 +3320,7 @@
}
}
-class LogMessageParams {
+class LogMessageParams implements ToJsonable {
LogMessageParams(this.type, this.message) {
if (type == null) {
throw 'type is required but was not provided';
@@ -3356,7 +3358,7 @@
}
}
-class MarkedString {
+class MarkedString implements ToJsonable {
MarkedString(this.language, this.value) {
if (language == null) {
throw 'language is required but was not provided';
@@ -3416,7 +3418,7 @@
/// *Please Note* that clients might sanitize the return
/// markdown. A client could decide to remove HTML from the
/// markdown to avoid script execution.
-class MarkupContent {
+class MarkupContent implements ToJsonable {
MarkupContent(this.kind, this.value) {
if (kind == null) {
throw 'kind is required but was not provided';
@@ -3491,7 +3493,7 @@
bool operator ==(o) => o is MarkupKind && o._value == _value;
}
-class Message {
+class Message implements ToJsonable {
Message(this.jsonrpc) {
if (jsonrpc == null) {
throw 'jsonrpc is required but was not provided';
@@ -3518,7 +3520,7 @@
}
}
-class MessageActionItem {
+class MessageActionItem implements ToJsonable {
MessageActionItem(this.title) {
if (title == null) {
throw 'title is required but was not provided';
@@ -3585,7 +3587,7 @@
bool operator ==(o) => o is MessageType && o._value == _value;
}
-class NotificationMessage implements Message {
+class NotificationMessage implements Message, ToJsonable {
NotificationMessage(this.method, this.params, this.jsonrpc) {
if (method == null) {
throw 'method is required but was not provided';
@@ -3636,7 +3638,7 @@
/// Represents a parameter of a callable-signature. A
/// parameter can have a label and a doc-comment.
-class ParameterInformation {
+class ParameterInformation implements ToJsonable {
ParameterInformation(this.label, this.documentation) {
if (label == null) {
throw 'label is required but was not provided';
@@ -3676,7 +3678,7 @@
}
}
-class Position {
+class Position implements ToJsonable {
Position(this.line, this.character) {
if (line == null) {
throw 'line is required but was not provided';
@@ -3720,7 +3722,7 @@
}
}
-class PublishDiagnosticsParams {
+class PublishDiagnosticsParams implements ToJsonable {
PublishDiagnosticsParams(this.uri, this.diagnostics) {
if (uri == null) {
throw 'uri is required but was not provided';
@@ -3763,7 +3765,7 @@
}
}
-class Range {
+class Range implements ToJsonable {
Range(this.start, this.end) {
if (start == null) {
throw 'start is required but was not provided';
@@ -3800,7 +3802,7 @@
}
}
-class ReferenceContext {
+class ReferenceContext implements ToJsonable {
ReferenceContext(this.includeDeclaration) {
if (includeDeclaration == null) {
throw 'includeDeclaration is required but was not provided';
@@ -3828,7 +3830,7 @@
}
}
-class ReferenceParams implements TextDocumentPositionParams {
+class ReferenceParams implements TextDocumentPositionParams, ToJsonable {
ReferenceParams(this.context, this.textDocument, this.position) {
if (context == null) {
throw 'context is required but was not provided';
@@ -3879,7 +3881,7 @@
}
/// General parameters to register for a capability.
-class Registration {
+class Registration implements ToJsonable {
Registration(this.id, this.method, this.registerOptions) {
if (id == null) {
throw 'id is required but was not provided';
@@ -3924,7 +3926,7 @@
}
}
-class RegistrationParams {
+class RegistrationParams implements ToJsonable {
RegistrationParams(this.registrations) {
if (registrations == null) {
throw 'registrations is required but was not provided';
@@ -3958,7 +3960,7 @@
}
/// Rename file operation
-class RenameFile implements FileOperation {
+class RenameFile implements FileOperation, ToJsonable {
RenameFile(this.oldUri, this.newUri, this.options) {
if (oldUri == null) {
throw 'oldUri is required but was not provided';
@@ -4003,7 +4005,7 @@
}
/// Rename file options
-class RenameFileOptions {
+class RenameFileOptions implements ToJsonable {
RenameFileOptions(this.overwrite, this.ignoreIfExists);
factory RenameFileOptions.fromJson(Map<String, dynamic> json) {
final overwrite = json['overwrite'];
@@ -4035,7 +4037,7 @@
}
/// Rename options
-class RenameOptions {
+class RenameOptions implements ToJsonable {
RenameOptions(this.prepareProvider);
factory RenameOptions.fromJson(Map<String, dynamic> json) {
final prepareProvider = json['prepareProvider'];
@@ -4059,7 +4061,7 @@
}
}
-class RenameParams {
+class RenameParams implements ToJsonable {
RenameParams(this.textDocument, this.position, this.newName) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -4112,7 +4114,8 @@
}
}
-class RenameRegistrationOptions implements TextDocumentRegistrationOptions {
+class RenameRegistrationOptions
+ implements TextDocumentRegistrationOptions, ToJsonable {
RenameRegistrationOptions(this.prepareProvider, this.documentSelector);
factory RenameRegistrationOptions.fromJson(Map<String, dynamic> json) {
final prepareProvider = json['prepareProvider'];
@@ -4151,7 +4154,7 @@
}
}
-class RequestMessage implements Message {
+class RequestMessage implements Message, ToJsonable {
RequestMessage(this.id, this.method, this.params, this.jsonrpc) {
if (id == null) {
throw 'id is required but was not provided';
@@ -4249,7 +4252,7 @@
bool operator ==(o) => o is ResourceOperationKind && o._value == _value;
}
-class ResponseError<D> {
+class ResponseError<D> implements ToJsonable {
ResponseError(this.code, this.message, this.data) {
if (code == null) {
throw 'code is required but was not provided';
@@ -4296,7 +4299,7 @@
}
}
-class ResponseMessage implements Message {
+class ResponseMessage implements Message, ToJsonable {
ResponseMessage(this.id, this.result, this.error, this.jsonrpc) {
if (jsonrpc == null) {
throw 'jsonrpc is required but was not provided';
@@ -4349,7 +4352,7 @@
}
/// Save options.
-class SaveOptions {
+class SaveOptions implements ToJsonable {
SaveOptions(this.includeText);
factory SaveOptions.fromJson(Map<String, dynamic> json) {
final includeText = json['includeText'];
@@ -4373,7 +4376,7 @@
}
}
-class ServerCapabilities {
+class ServerCapabilities implements ToJsonable {
ServerCapabilities(
this.textDocumentSync,
this.hoverProvider,
@@ -4609,7 +4612,7 @@
}
}
-class ShowMessageParams {
+class ShowMessageParams implements ToJsonable {
ShowMessageParams(this.type, this.message) {
if (type == null) {
throw 'type is required but was not provided';
@@ -4647,7 +4650,7 @@
}
}
-class ShowMessageRequestParams {
+class ShowMessageRequestParams implements ToJsonable {
ShowMessageRequestParams(this.type, this.message, this.actions) {
if (type == null) {
throw 'type is required but was not provided';
@@ -4698,7 +4701,7 @@
/// Signature help represents the signature of something
/// callable. There can be multiple signature but only one
/// active and only one active parameter.
-class SignatureHelp {
+class SignatureHelp implements ToJsonable {
SignatureHelp(this.signatures, this.activeSignature, this.activeParameter) {
if (signatures == null) {
throw 'signatures is required but was not provided';
@@ -4761,7 +4764,7 @@
}
/// Signature help options.
-class SignatureHelpOptions {
+class SignatureHelpOptions implements ToJsonable {
SignatureHelpOptions(this.triggerCharacters);
factory SignatureHelpOptions.fromJson(Map<String, dynamic> json) {
final triggerCharacters = json['triggerCharacters']
@@ -4789,7 +4792,7 @@
}
class SignatureHelpRegistrationOptions
- implements TextDocumentRegistrationOptions {
+ implements TextDocumentRegistrationOptions, ToJsonable {
SignatureHelpRegistrationOptions(
this.triggerCharacters, this.documentSelector);
factory SignatureHelpRegistrationOptions.fromJson(Map<String, dynamic> json) {
@@ -4836,7 +4839,7 @@
/// Represents the signature of something callable. A
/// signature can have a label, like a function-name, a
/// doc-comment, and a set of parameters.
-class SignatureInformation {
+class SignatureInformation implements ToJsonable {
SignatureInformation(this.label, this.documentation, this.parameters) {
if (label == null) {
throw 'label is required but was not provided';
@@ -4889,7 +4892,7 @@
/// Static registration options to be returned in the
/// initialize request.
-class StaticRegistrationOptions {
+class StaticRegistrationOptions implements ToJsonable {
StaticRegistrationOptions(this.id);
factory StaticRegistrationOptions.fromJson(Map<String, dynamic> json) {
final id = json['id'];
@@ -4916,7 +4919,7 @@
/// Represents information about programming constructs
/// like variables, classes, interfaces etc.
-class SymbolInformation {
+class SymbolInformation implements ToJsonable {
SymbolInformation(this.name, this.kind, this.deprecated, this.location,
this.containerName) {
if (name == null) {
@@ -5076,7 +5079,7 @@
/// Describe options to be used when registering for
/// text document change events.
class TextDocumentChangeRegistrationOptions
- implements TextDocumentRegistrationOptions {
+ implements TextDocumentRegistrationOptions, ToJsonable {
TextDocumentChangeRegistrationOptions(this.syncKind, this.documentSelector) {
if (syncKind == null) {
throw 'syncKind is required but was not provided';
@@ -5124,7 +5127,7 @@
}
/// Text document specific client capabilities.
-class TextDocumentClientCapabilities {
+class TextDocumentClientCapabilities implements ToJsonable {
TextDocumentClientCapabilities(this.dynamicRegistration, this.willSave,
this.willSaveWaitUntil, this.didSave);
factory TextDocumentClientCapabilities.fromJson(Map<String, dynamic> json) {
@@ -5178,7 +5181,7 @@
/// An event describing a change to a text document. If
/// range and rangeLength are omitted the new text is
/// considered to be the full content of the document.
-class TextDocumentContentChangeEvent {
+class TextDocumentContentChangeEvent implements ToJsonable {
TextDocumentContentChangeEvent(this.range, this.rangeLength, this.text) {
if (text == null) {
throw 'text is required but was not provided';
@@ -5219,7 +5222,7 @@
}
}
-class TextDocumentEdit implements FileOperation {
+class TextDocumentEdit implements FileOperation, ToJsonable {
TextDocumentEdit(this.textDocument, this.edits) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -5263,7 +5266,7 @@
}
}
-class TextDocumentIdentifier {
+class TextDocumentIdentifier implements ToJsonable {
TextDocumentIdentifier(this.uri) {
if (uri == null) {
throw 'uri is required but was not provided';
@@ -5290,7 +5293,7 @@
}
}
-class TextDocumentItem {
+class TextDocumentItem implements ToJsonable {
TextDocumentItem(this.uri, this.languageId, this.version, this.text) {
if (uri == null) {
throw 'uri is required but was not provided';
@@ -5350,7 +5353,7 @@
}
}
-class TextDocumentPositionParams {
+class TextDocumentPositionParams implements ToJsonable {
TextDocumentPositionParams(this.textDocument, this.position) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -5390,7 +5393,7 @@
}
}
-class TextDocumentRegistrationOptions {
+class TextDocumentRegistrationOptions implements ToJsonable {
TextDocumentRegistrationOptions(this.documentSelector);
factory TextDocumentRegistrationOptions.fromJson(Map<String, dynamic> json) {
final documentSelector = json['documentSelector']
@@ -5460,7 +5463,7 @@
}
class TextDocumentSaveRegistrationOptions
- implements TextDocumentRegistrationOptions {
+ implements TextDocumentRegistrationOptions, ToJsonable {
TextDocumentSaveRegistrationOptions(this.includeText, this.documentSelector);
factory TextDocumentSaveRegistrationOptions.fromJson(
Map<String, dynamic> json) {
@@ -5543,7 +5546,7 @@
bool operator ==(o) => o is TextDocumentSyncKind && o._value == _value;
}
-class TextDocumentSyncOptions {
+class TextDocumentSyncOptions implements ToJsonable {
TextDocumentSyncOptions(this.openClose, this.change, this.willSave,
this.willSaveWaitUntil, this.save);
factory TextDocumentSyncOptions.fromJson(Map<String, dynamic> json) {
@@ -5603,7 +5606,7 @@
}
}
-class TextEdit {
+class TextEdit implements ToJsonable {
TextEdit(this.range, this.newText) {
if (range == null) {
throw 'range is required but was not provided';
@@ -5645,7 +5648,7 @@
}
/// General parameters to unregister a capability.
-class Unregistration {
+class Unregistration implements ToJsonable {
Unregistration(this.id, this.method) {
if (id == null) {
throw 'id is required but was not provided';
@@ -5684,7 +5687,7 @@
}
}
-class UnregistrationParams {
+class UnregistrationParams implements ToJsonable {
UnregistrationParams(this.unregisterations) {
if (unregisterations == null) {
throw 'unregisterations is required but was not provided';
@@ -5717,7 +5720,8 @@
}
}
-class VersionedTextDocumentIdentifier implements TextDocumentIdentifier {
+class VersionedTextDocumentIdentifier
+ implements TextDocumentIdentifier, ToJsonable {
VersionedTextDocumentIdentifier(this.version, this.uri) {
if (uri == null) {
throw 'uri is required but was not provided';
@@ -5801,7 +5805,7 @@
/// The parameters send in a will save text
/// document notification.
-class WillSaveTextDocumentParams {
+class WillSaveTextDocumentParams implements ToJsonable {
WillSaveTextDocumentParams(this.textDocument, this.reason) {
if (textDocument == null) {
throw 'textDocument is required but was not provided';
@@ -5841,7 +5845,7 @@
}
/// Workspace specific client capabilities.
-class WorkspaceClientCapabilities {
+class WorkspaceClientCapabilities implements ToJsonable {
WorkspaceClientCapabilities(this.applyEdit, this.documentChanges,
this.resourceOperations, this.failureHandling);
factory WorkspaceClientCapabilities.fromJson(Map<String, dynamic> json) {
@@ -5897,7 +5901,7 @@
}
}
-class WorkspaceEdit {
+class WorkspaceEdit implements ToJsonable {
WorkspaceEdit(this.changes, this.documentChanges);
factory WorkspaceEdit.fromJson(Map<String, dynamic> json) {
final changes = json['changes'];
@@ -5949,7 +5953,7 @@
}
}
-class WorkspaceFolder {
+class WorkspaceFolder implements ToJsonable {
WorkspaceFolder(this.uri, this.name) {
if (uri == null) {
throw 'uri is required but was not provided';
@@ -5989,7 +5993,7 @@
}
/// The workspace folder change event.
-class WorkspaceFoldersChangeEvent {
+class WorkspaceFoldersChangeEvent implements ToJsonable {
WorkspaceFoldersChangeEvent(this.added, this.removed) {
if (added == null) {
throw 'added is required but was not provided';
@@ -6040,7 +6044,7 @@
}
/// The parameters of a Workspace Symbol Request.
-class WorkspaceSymbolParams {
+class WorkspaceSymbolParams implements ToJsonable {
WorkspaceSymbolParams(this.query) {
if (query == null) {
throw 'query is required but was not provided';
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
index b6f1909..35ae774 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
@@ -4,6 +4,14 @@
Object id(Object obj) => obj;
+Object specToJson(Object obj) {
+ if (obj is ToJsonable) {
+ return obj.toJson();
+ } else {
+ return obj;
+ }
+}
+
class Either2<T1, T2> {
final int _which;
final T1 _t1;
@@ -25,7 +33,7 @@
return _which == 1 ? f1(_t1) : f2(_t2);
}
- Object toJson() => map(id, id);
+ Object toJson() => map(specToJson, specToJson);
/// Checks whether the value of the union equals the supplied value.
bool valueEquals(o) => map((t) => t == o, (t) => t == o);
@@ -69,7 +77,7 @@
}
}
- Object toJson() => map(id, id, id);
+ Object toJson() => map(specToJson, specToJson, specToJson);
/// Checks whether the value of the union equals the supplied value.
bool valueEquals(o) => map((t) => t == o, (t) => t == o, (t) => t == o);
@@ -130,7 +138,7 @@
}
}
- Object toJson() => map(id, id, id, id);
+ Object toJson() => map(specToJson, specToJson, specToJson, specToJson);
/// Checks whether the value of the union equals the supplied value.
bool valueEquals(o) =>
@@ -138,3 +146,7 @@
}
class FileOperation {}
+
+abstract class ToJsonable {
+ Object toJson();
+}
diff --git a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
index bc07300..e12b850 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
@@ -24,6 +24,19 @@
expect(output, equals('{"id":1,"method":"test","jsonrpc":"test"}'));
});
+ test('returns correct output for union types containing interface types',
+ () {
+ final params = new Either2<String, WorkspaceClientCapabilities>.t2(
+ new WorkspaceClientCapabilities(
+ true,
+ null,
+ null,
+ null,
+ ));
+ String output = json.encode(params);
+ expect(output, equals('{"applyEdit":true}'));
+ });
+
test('returns correct output for types with lists', () {
final start = new Position(1, 1);
final end = new Position(2, 2);
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 54b0ee1..43e4bfc 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -400,8 +400,9 @@
_writeDocCommentsAndAnnotations(buffer, interface);
buffer.writeIndented('class ${interface.name} ');
- if (interface.baseTypes.isNotEmpty) {
- buffer.writeIndented('implements ${interface.baseTypes.join(', ')} ');
+ var allBaseTypes = interface.baseTypes.followedBy(['ToJsonable']);
+ if (allBaseTypes.isNotEmpty) {
+ buffer.writeIndented('implements ${allBaseTypes.join(', ')} ');
}
buffer
..writeln('{')