Version 2.14.0-5.0.dev
Merge commit '37f723520fe5726434e8a1cb75011c27c733f1af' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index f05045e..bfa4d8d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -1261,6 +1261,28 @@
r"""A constant constructor can't call a non-constant super constructor.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String stringOKEmpty)>
+ templateConstEvalBadState =
+ const Template<Message Function(String stringOKEmpty)>(
+ messageTemplate: r"""Bad state: '#stringOKEmpty'""",
+ withArguments: _withArgumentsConstEvalBadState);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String stringOKEmpty)> codeConstEvalBadState =
+ const Code<Message Function(String stringOKEmpty)>(
+ "ConstEvalBadState",
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalBadState(String stringOKEmpty) {
+ // ignore: unnecessary_null_comparison
+ if (stringOKEmpty == null || stringOKEmpty.isEmpty) stringOKEmpty = '(empty)';
+ return new Message(codeConstEvalBadState,
+ message: """Bad state: '${stringOKEmpty}'""",
+ arguments: {'stringOKEmpty': stringOKEmpty});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeConstEvalCircularity = messageConstEvalCircularity;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
index 53800de..4695a19 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
// This file has been automatically generated. Please do not edit it manually.
// To regenerate the file, use the script
// "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
@@ -19,7 +17,6 @@
import 'package:analysis_server/src/lsp/json_parsing.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart';
import 'package:analyzer/src/generated/utilities_general.dart';
-import 'package:meta/meta.dart';
const jsonEncoder = JsonEncoder.withIndent(' ');
@@ -27,11 +24,7 @@
static const jsonHandler = LspJsonHandler(
AnalyzerStatusParams.canParse, AnalyzerStatusParams.fromJson);
- AnalyzerStatusParams({@required this.isAnalyzing}) {
- if (isAnalyzing == null) {
- throw 'isAnalyzing is required but was not provided';
- }
- }
+ AnalyzerStatusParams({required this.isAnalyzing});
static AnalyzerStatusParams fromJson(Map<String, dynamic> json) {
final isAnalyzing = json['isAnalyzing'];
return AnalyzerStatusParams(isAnalyzing: isAnalyzing);
@@ -41,8 +34,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['isAnalyzing'] =
- isAnalyzing ?? (throw 'isAnalyzing is required but was not set');
+ __result['isAnalyzing'] = isAnalyzing;
return __result;
}
@@ -96,16 +88,9 @@
static const jsonHandler =
LspJsonHandler(ClosingLabel.canParse, ClosingLabel.fromJson);
- ClosingLabel({@required this.range, @required this.label}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (label == null) {
- throw 'label is required but was not provided';
- }
- }
+ ClosingLabel({required this.range, required this.label});
static ClosingLabel fromJson(Map<String, dynamic> json) {
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final label = json['label'];
return ClosingLabel(range: range, label: label);
}
@@ -115,9 +100,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['label'] = label ?? (throw 'label is required but was not set');
+ __result['range'] = range.toJson();
+ __result['label'] = label;
return __result;
}
@@ -189,14 +173,7 @@
CompletionItemResolutionInfo.canParse,
CompletionItemResolutionInfo.fromJson);
- CompletionItemResolutionInfo({@required this.file, @required this.offset}) {
- if (file == null) {
- throw 'file is required but was not provided';
- }
- if (offset == null) {
- throw 'offset is required but was not provided';
- }
- }
+ CompletionItemResolutionInfo({required this.file, required this.offset});
static CompletionItemResolutionInfo fromJson(Map<String, dynamic> json) {
if (DartCompletionItemResolutionInfo.canParse(json, nullLspJsonReporter)) {
return DartCompletionItemResolutionInfo.fromJson(json);
@@ -211,8 +188,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['file'] = file ?? (throw 'file is required but was not set');
- __result['offset'] = offset ?? (throw 'offset is required but was not set');
+ __result['file'] = file;
+ __result['offset'] = offset;
return __result;
}
@@ -287,35 +264,13 @@
DartCompletionItemResolutionInfo.fromJson);
DartCompletionItemResolutionInfo(
- {@required this.libId,
- @required this.displayUri,
- @required this.rOffset,
- @required this.iLength,
- @required this.rLength,
- @required this.file,
- @required this.offset}) {
- if (libId == null) {
- throw 'libId is required but was not provided';
- }
- if (displayUri == null) {
- throw 'displayUri is required but was not provided';
- }
- if (rOffset == null) {
- throw 'rOffset is required but was not provided';
- }
- if (iLength == null) {
- throw 'iLength is required but was not provided';
- }
- if (rLength == null) {
- throw 'rLength is required but was not provided';
- }
- if (file == null) {
- throw 'file is required but was not provided';
- }
- if (offset == null) {
- throw 'offset is required but was not provided';
- }
- }
+ {required this.libId,
+ required this.displayUri,
+ required this.rOffset,
+ required this.iLength,
+ required this.rLength,
+ required this.file,
+ required this.offset});
static DartCompletionItemResolutionInfo fromJson(Map<String, dynamic> json) {
final libId = json['libId'];
final displayUri = json['displayUri'];
@@ -344,17 +299,13 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['libId'] = libId ?? (throw 'libId is required but was not set');
- __result['displayUri'] =
- displayUri ?? (throw 'displayUri is required but was not set');
- __result['rOffset'] =
- rOffset ?? (throw 'rOffset is required but was not set');
- __result['iLength'] =
- iLength ?? (throw 'iLength is required but was not set');
- __result['rLength'] =
- rLength ?? (throw 'rLength is required but was not set');
- __result['file'] = file ?? (throw 'file is required but was not set');
- __result['offset'] = offset ?? (throw 'offset is required but was not set');
+ __result['libId'] = libId;
+ __result['displayUri'] = displayUri;
+ __result['rOffset'] = rOffset;
+ __result['iLength'] = iLength;
+ __result['rLength'] = rLength;
+ __result['file'] = file;
+ __result['offset'] = offset;
return __result;
}
@@ -523,11 +474,7 @@
static const jsonHandler = LspJsonHandler(
DartDiagnosticServer.canParse, DartDiagnosticServer.fromJson);
- DartDiagnosticServer({@required this.port}) {
- if (port == null) {
- throw 'port is required but was not provided';
- }
- }
+ DartDiagnosticServer({required this.port});
static DartDiagnosticServer fromJson(Map<String, dynamic> json) {
final port = json['port'];
return DartDiagnosticServer(port: port);
@@ -537,7 +484,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['port'] = port ?? (throw 'port is required but was not set');
+ __result['port'] = port;
return __result;
}
@@ -592,18 +539,11 @@
Element(
{this.range,
- @required this.name,
- @required this.kind,
+ required this.name,
+ required this.kind,
this.parameters,
this.typeParameters,
- this.returnType}) {
- if (name == null) {
- throw 'name is required but was not provided';
- }
- if (kind == null) {
- throw 'kind is required but was not provided';
- }
- }
+ this.returnType});
static Element fromJson(Map<String, dynamic> json) {
final range = json['range'] != null ? Range.fromJson(json['range']) : null;
final name = json['name'];
@@ -622,18 +562,18 @@
final String kind;
final String name;
- final String parameters;
- final Range range;
- final String returnType;
- final String typeParameters;
+ final String? parameters;
+ final Range? range;
+ final String? returnType;
+ final String? typeParameters;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (range != null) {
- __result['range'] = range.toJson();
+ __result['range'] = range?.toJson();
}
- __result['name'] = name ?? (throw 'name is required but was not set');
- __result['kind'] = kind ?? (throw 'kind is required but was not set');
+ __result['name'] = name;
+ __result['kind'] = kind;
if (parameters != null) {
__result['parameters'] = parameters;
}
@@ -761,25 +701,15 @@
LspJsonHandler(FlutterOutline.canParse, FlutterOutline.fromJson);
FlutterOutline(
- {@required this.kind,
+ {required this.kind,
this.label,
this.className,
this.variableName,
this.attributes,
this.dartElement,
- @required this.range,
- @required this.codeRange,
- this.children}) {
- if (kind == null) {
- throw 'kind is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (codeRange == null) {
- throw 'codeRange is required but was not provided';
- }
- }
+ required this.range,
+ required this.codeRange,
+ this.children});
static FlutterOutline fromJson(Map<String, dynamic> json) {
final kind = json['kind'];
final label = json['label'];
@@ -793,9 +723,8 @@
final dartElement = json['dartElement'] != null
? Element.fromJson(json['dartElement'])
: null;
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
- final codeRange =
- json['codeRange'] != null ? Range.fromJson(json['codeRange']) : null;
+ final range = Range.fromJson(json['range']);
+ final codeRange = Range.fromJson(json['codeRange']);
final children = json['children']
?.map((item) => item != null ? FlutterOutline.fromJson(item) : null)
?.cast<FlutterOutline>()
@@ -812,19 +741,19 @@
children: children);
}
- final List<FlutterOutlineAttribute> attributes;
- final List<FlutterOutline> children;
- final String className;
+ final List<FlutterOutlineAttribute>? attributes;
+ final List<FlutterOutline>? children;
+ final String? className;
final Range codeRange;
- final Element dartElement;
+ final Element? dartElement;
final String kind;
- final String label;
+ final String? label;
final Range range;
- final String variableName;
+ final String? variableName;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['kind'] = kind ?? (throw 'kind is required but was not set');
+ __result['kind'] = kind;
if (label != null) {
__result['label'] = label;
}
@@ -835,17 +764,16 @@
__result['variableName'] = variableName;
}
if (attributes != null) {
- __result['attributes'] = attributes.map((item) => item.toJson()).toList();
+ __result['attributes'] =
+ attributes?.map((item) => item.toJson()).toList();
}
if (dartElement != null) {
- __result['dartElement'] = dartElement.toJson();
+ __result['dartElement'] = dartElement?.toJson();
}
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['codeRange'] =
- codeRange?.toJson() ?? (throw 'codeRange is required but was not set');
+ __result['range'] = range.toJson();
+ __result['codeRange'] = codeRange.toJson();
if (children != null) {
- __result['children'] = children.map((item) => item.toJson()).toList();
+ __result['children'] = children?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -1017,14 +945,7 @@
FlutterOutlineAttribute.canParse, FlutterOutlineAttribute.fromJson);
FlutterOutlineAttribute(
- {@required this.name, @required this.label, this.valueRange}) {
- if (name == null) {
- throw 'name is required but was not provided';
- }
- if (label == null) {
- throw 'label is required but was not provided';
- }
- }
+ {required this.name, required this.label, this.valueRange});
static FlutterOutlineAttribute fromJson(Map<String, dynamic> json) {
final name = json['name'];
final label = json['label'];
@@ -1036,14 +957,14 @@
final String label;
final String name;
- final Range valueRange;
+ final Range? valueRange;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['name'] = name ?? (throw 'name is required but was not set');
- __result['label'] = label ?? (throw 'label is required but was not set');
+ __result['name'] = name;
+ __result['label'] = label;
if (valueRange != null) {
- __result['valueRange'] = valueRange.toJson();
+ __result['valueRange'] = valueRange?.toJson();
}
return __result;
}
@@ -1130,26 +1051,14 @@
static const jsonHandler = LspJsonHandler(Outline.canParse, Outline.fromJson);
Outline(
- {@required this.element,
- @required this.range,
- @required this.codeRange,
- this.children}) {
- if (element == null) {
- throw 'element is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (codeRange == null) {
- throw 'codeRange is required but was not provided';
- }
- }
+ {required this.element,
+ required this.range,
+ required this.codeRange,
+ this.children});
static Outline fromJson(Map<String, dynamic> json) {
- final element =
- json['element'] != null ? Element.fromJson(json['element']) : null;
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
- final codeRange =
- json['codeRange'] != null ? Range.fromJson(json['codeRange']) : null;
+ final element = Element.fromJson(json['element']);
+ final range = Range.fromJson(json['range']);
+ final codeRange = Range.fromJson(json['codeRange']);
final children = json['children']
?.map((item) => item != null ? Outline.fromJson(item) : null)
?.cast<Outline>()
@@ -1161,21 +1070,18 @@
children: children);
}
- final List<Outline> children;
+ final List<Outline>? children;
final Range codeRange;
final Element element;
final Range range;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['element'] =
- element?.toJson() ?? (throw 'element is required but was not set');
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['codeRange'] =
- codeRange?.toJson() ?? (throw 'codeRange is required but was not set');
+ __result['element'] = element.toJson();
+ __result['range'] = range.toJson();
+ __result['codeRange'] = codeRange.toJson();
if (children != null) {
- __result['children'] = children.map((item) => item.toJson()).toList();
+ __result['children'] = children?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -1283,18 +1189,11 @@
static const jsonHandler = LspJsonHandler(
PublishClosingLabelsParams.canParse, PublishClosingLabelsParams.fromJson);
- PublishClosingLabelsParams({@required this.uri, @required this.labels}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- if (labels == null) {
- throw 'labels is required but was not provided';
- }
- }
+ PublishClosingLabelsParams({required this.uri, required this.labels});
static PublishClosingLabelsParams fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
final labels = json['labels']
- ?.map((item) => item != null ? ClosingLabel.fromJson(item) : null)
+ ?.map((item) => ClosingLabel.fromJson(item))
?.cast<ClosingLabel>()
?.toList();
return PublishClosingLabelsParams(uri: uri, labels: labels);
@@ -1305,9 +1204,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
- __result['labels'] = labels?.map((item) => item.toJson())?.toList() ??
- (throw 'labels is required but was not set');
+ __result['uri'] = uri;
+ __result['labels'] = labels.map((item) => item.toJson()).toList();
return __result;
}
@@ -1385,19 +1283,10 @@
PublishFlutterOutlineParams.canParse,
PublishFlutterOutlineParams.fromJson);
- PublishFlutterOutlineParams({@required this.uri, @required this.outline}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- if (outline == null) {
- throw 'outline is required but was not provided';
- }
- }
+ PublishFlutterOutlineParams({required this.uri, required this.outline});
static PublishFlutterOutlineParams fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
- final outline = json['outline'] != null
- ? FlutterOutline.fromJson(json['outline'])
- : null;
+ final outline = FlutterOutline.fromJson(json['outline']);
return PublishFlutterOutlineParams(uri: uri, outline: outline);
}
@@ -1406,9 +1295,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
- __result['outline'] =
- outline?.toJson() ?? (throw 'outline is required but was not set');
+ __result['uri'] = uri;
+ __result['outline'] = outline.toJson();
return __result;
}
@@ -1480,18 +1368,10 @@
static const jsonHandler = LspJsonHandler(
PublishOutlineParams.canParse, PublishOutlineParams.fromJson);
- PublishOutlineParams({@required this.uri, @required this.outline}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- if (outline == null) {
- throw 'outline is required but was not provided';
- }
- }
+ PublishOutlineParams({required this.uri, required this.outline});
static PublishOutlineParams fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
- final outline =
- json['outline'] != null ? Outline.fromJson(json['outline']) : null;
+ final outline = Outline.fromJson(json['outline']);
return PublishOutlineParams(uri: uri, outline: outline);
}
@@ -1500,9 +1380,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
- __result['outline'] =
- outline?.toJson() ?? (throw 'outline is required but was not set');
+ __result['uri'] = uri;
+ __result['outline'] = outline.toJson();
return __result;
}
@@ -1575,24 +1454,13 @@
LspJsonHandler(SnippetTextEdit.canParse, SnippetTextEdit.fromJson);
SnippetTextEdit(
- {@required this.insertTextFormat,
- @required this.range,
- @required this.newText}) {
- if (insertTextFormat == null) {
- throw 'insertTextFormat is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (newText == null) {
- throw 'newText is required but was not provided';
- }
- }
+ {required this.insertTextFormat,
+ required this.range,
+ required this.newText});
static SnippetTextEdit fromJson(Map<String, dynamic> json) {
- final insertTextFormat = json['insertTextFormat'] != null
- ? InsertTextFormat.fromJson(json['insertTextFormat'])
- : null;
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final insertTextFormat =
+ InsertTextFormat.fromJson(json['insertTextFormat']);
+ final range = Range.fromJson(json['range']);
final newText = json['newText'];
return SnippetTextEdit(
insertTextFormat: insertTextFormat, range: range, newText: newText);
@@ -1609,12 +1477,9 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['insertTextFormat'] = insertTextFormat?.toJson() ??
- (throw 'insertTextFormat is required but was not set');
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['newText'] =
- newText ?? (throw 'newText is required but was not set');
+ __result['insertTextFormat'] = insertTextFormat.toJson();
+ __result['range'] = range.toJson();
+ __result['newText'] = newText;
return __result;
}
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index ec98cde..c183159 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
// This file has been automatically generated. Please do not edit it manually.
// To regenerate the file, use the script
// "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
@@ -19,7 +17,6 @@
import 'package:analysis_server/src/lsp/json_parsing.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart';
import 'package:analyzer/src/generated/utilities_general.dart';
-import 'package:meta/meta.dart';
const jsonEncoder = JsonEncoder.withIndent(' ');
@@ -30,22 +27,10 @@
LspJsonHandler(AnnotatedTextEdit.canParse, AnnotatedTextEdit.fromJson);
AnnotatedTextEdit(
- {@required this.annotationId,
- @required this.range,
- @required this.newText}) {
- if (annotationId == null) {
- throw 'annotationId is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (newText == null) {
- throw 'newText is required but was not provided';
- }
- }
+ {required this.annotationId, required this.range, required this.newText});
static AnnotatedTextEdit fromJson(Map<String, dynamic> json) {
final annotationId = json['annotationId'];
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final newText = json['newText'];
return AnnotatedTextEdit(
annotationId: annotationId, range: range, newText: newText);
@@ -63,12 +48,9 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['annotationId'] =
- annotationId ?? (throw 'annotationId is required but was not set');
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['newText'] =
- newText ?? (throw 'newText is required but was not set');
+ __result['annotationId'] = annotationId;
+ __result['range'] = range.toJson();
+ __result['newText'] = newText;
return __result;
}
@@ -160,15 +142,10 @@
static const jsonHandler = LspJsonHandler(
ApplyWorkspaceEditParams.canParse, ApplyWorkspaceEditParams.fromJson);
- ApplyWorkspaceEditParams({this.label, @required this.edit}) {
- if (edit == null) {
- throw 'edit is required but was not provided';
- }
- }
+ ApplyWorkspaceEditParams({this.label, required this.edit});
static ApplyWorkspaceEditParams fromJson(Map<String, dynamic> json) {
final label = json['label'];
- final edit =
- json['edit'] != null ? WorkspaceEdit.fromJson(json['edit']) : null;
+ final edit = WorkspaceEdit.fromJson(json['edit']);
return ApplyWorkspaceEditParams(label: label, edit: edit);
}
@@ -177,15 +154,14 @@
/// An optional label of the workspace edit. This label is presented in the
/// user interface for example on an undo stack to undo the workspace edit.
- final String label;
+ final String? label;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (label != null) {
__result['label'] = label;
}
- __result['edit'] =
- edit?.toJson() ?? (throw 'edit is required but was not set');
+ __result['edit'] = edit.toJson();
return __result;
}
@@ -250,11 +226,7 @@
ApplyWorkspaceEditResponse.canParse, ApplyWorkspaceEditResponse.fromJson);
ApplyWorkspaceEditResponse(
- {@required this.applied, this.failureReason, this.failedChange}) {
- if (applied == null) {
- throw 'applied is required but was not provided';
- }
- }
+ {required this.applied, this.failureReason, this.failedChange});
static ApplyWorkspaceEditResponse fromJson(Map<String, dynamic> json) {
final applied = json['applied'];
final failureReason = json['failureReason'];
@@ -272,17 +244,16 @@
/// contain the index of the change that failed. This property is only
/// available if the client signals a `failureHandlingStrategy` in its client
/// capabilities.
- final num failedChange;
+ final num? failedChange;
/// An optional textual description for why the edit was not applied. This may
/// be used by the server for diagnostic logging or to provide a suitable
/// error for a request that triggered the edit.
- final String failureReason;
+ final String? failureReason;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['applied'] =
- applied ?? (throw 'applied is required but was not set');
+ __result['applied'] = applied;
if (failureReason != null) {
__result['failureReason'] = failureReason;
}
@@ -377,7 +348,7 @@
/// `true` the client supports the new `(TextDocumentRegistrationOptions &
/// StaticRegistrationOptions)` return value for the corresponding server
/// capability as well.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -430,19 +401,11 @@
static const jsonHandler = LspJsonHandler(
CallHierarchyIncomingCall.canParse, CallHierarchyIncomingCall.fromJson);
- CallHierarchyIncomingCall({@required this.from, @required this.fromRanges}) {
- if (from == null) {
- throw 'from is required but was not provided';
- }
- if (fromRanges == null) {
- throw 'fromRanges is required but was not provided';
- }
- }
+ CallHierarchyIncomingCall({required this.from, required this.fromRanges});
static CallHierarchyIncomingCall fromJson(Map<String, dynamic> json) {
- final from =
- json['from'] != null ? CallHierarchyItem.fromJson(json['from']) : null;
+ final from = CallHierarchyItem.fromJson(json['from']);
final fromRanges = json['fromRanges']
- ?.map((item) => item != null ? Range.fromJson(item) : null)
+ ?.map((item) => Range.fromJson(item))
?.cast<Range>()
?.toList();
return CallHierarchyIncomingCall(from: from, fromRanges: fromRanges);
@@ -457,11 +420,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['from'] =
- from?.toJson() ?? (throw 'from is required but was not set');
- __result['fromRanges'] =
- fromRanges?.map((item) => item.toJson())?.toList() ??
- (throw 'fromRanges is required but was not set');
+ __result['from'] = from.toJson();
+ __result['fromRanges'] = fromRanges.map((item) => item.toJson()).toList();
return __result;
}
@@ -541,27 +501,22 @@
CallHierarchyIncomingCallsParams.fromJson);
CallHierarchyIncomingCallsParams(
- {@required this.item, this.workDoneToken, this.partialResultToken}) {
- if (item == null) {
- throw 'item is required but was not provided';
- }
- }
+ {required this.item, this.workDoneToken, this.partialResultToken});
static CallHierarchyIncomingCallsParams fromJson(Map<String, dynamic> json) {
- final item =
- json['item'] != null ? CallHierarchyItem.fromJson(json['item']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final item = CallHierarchyItem.fromJson(json['item']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return CallHierarchyIncomingCallsParams(
item: item,
@@ -573,15 +528,14 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['item'] =
- item?.toJson() ?? (throw 'item is required but was not set');
+ __result['item'] = item.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -669,44 +623,25 @@
LspJsonHandler(CallHierarchyItem.canParse, CallHierarchyItem.fromJson);
CallHierarchyItem(
- {@required this.name,
- @required this.kind,
+ {required this.name,
+ required this.kind,
this.tags,
this.detail,
- @required this.uri,
- @required this.range,
- @required this.selectionRange,
- this.data}) {
- if (name == null) {
- throw 'name is required but was not provided';
- }
- if (kind == null) {
- throw 'kind is required but was not provided';
- }
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (selectionRange == null) {
- throw 'selectionRange is required but was not provided';
- }
- }
+ required this.uri,
+ required this.range,
+ required this.selectionRange,
+ this.data});
static CallHierarchyItem fromJson(Map<String, dynamic> json) {
final name = json['name'];
- final kind =
- json['kind'] != null ? SymbolKind.fromJson(json['kind']) : null;
+ final kind = SymbolKind.fromJson(json['kind']);
final tags = json['tags']
?.map((item) => item != null ? SymbolTag.fromJson(item) : null)
?.cast<SymbolTag>()
?.toList();
final detail = json['detail'];
final uri = json['uri'];
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
- final selectionRange = json['selectionRange'] != null
- ? Range.fromJson(json['selectionRange'])
- : null;
+ final range = Range.fromJson(json['range']);
+ final selectionRange = Range.fromJson(json['selectionRange']);
final data = json['data'];
return CallHierarchyItem(
name: name,
@@ -724,7 +659,7 @@
final dynamic data;
/// More detail for this item, e.g. the signature of a function.
- final String detail;
+ final String? detail;
/// The kind of this item.
final SymbolKind kind;
@@ -742,27 +677,24 @@
final Range selectionRange;
/// Tags for this item.
- final List<SymbolTag> tags;
+ final List<SymbolTag>? tags;
/// The resource identifier of this item.
final String uri;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['name'] = name ?? (throw 'name is required but was not set');
- __result['kind'] =
- kind?.toJson() ?? (throw 'kind is required but was not set');
+ __result['name'] = name;
+ __result['kind'] = kind.toJson();
if (tags != null) {
- __result['tags'] = tags.map((item) => item.toJson()).toList();
+ __result['tags'] = tags?.map((item) => item.toJson()).toList();
}
if (detail != null) {
__result['detail'] = detail;
}
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['selectionRange'] = selectionRange?.toJson() ??
- (throw 'selectionRange is required but was not set');
+ __result['uri'] = uri;
+ __result['range'] = range.toJson();
+ __result['selectionRange'] = selectionRange.toJson();
if (data != null) {
__result['data'] = data;
}
@@ -877,15 +809,6 @@
} finally {
reporter.pop();
}
- reporter.push('data');
- try {
- if (obj['data'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type CallHierarchyItem');
@@ -940,7 +863,7 @@
return CallHierarchyOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -993,19 +916,11 @@
static const jsonHandler = LspJsonHandler(
CallHierarchyOutgoingCall.canParse, CallHierarchyOutgoingCall.fromJson);
- CallHierarchyOutgoingCall({@required this.to, @required this.fromRanges}) {
- if (to == null) {
- throw 'to is required but was not provided';
- }
- if (fromRanges == null) {
- throw 'fromRanges is required but was not provided';
- }
- }
+ CallHierarchyOutgoingCall({required this.to, required this.fromRanges});
static CallHierarchyOutgoingCall fromJson(Map<String, dynamic> json) {
- final to =
- json['to'] != null ? CallHierarchyItem.fromJson(json['to']) : null;
+ final to = CallHierarchyItem.fromJson(json['to']);
final fromRanges = json['fromRanges']
- ?.map((item) => item != null ? Range.fromJson(item) : null)
+ ?.map((item) => Range.fromJson(item))
?.cast<Range>()
?.toList();
return CallHierarchyOutgoingCall(to: to, fromRanges: fromRanges);
@@ -1020,10 +935,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['to'] = to?.toJson() ?? (throw 'to is required but was not set');
- __result['fromRanges'] =
- fromRanges?.map((item) => item.toJson())?.toList() ??
- (throw 'fromRanges is required but was not set');
+ __result['to'] = to.toJson();
+ __result['fromRanges'] = fromRanges.map((item) => item.toJson()).toList();
return __result;
}
@@ -1103,27 +1016,22 @@
CallHierarchyOutgoingCallsParams.fromJson);
CallHierarchyOutgoingCallsParams(
- {@required this.item, this.workDoneToken, this.partialResultToken}) {
- if (item == null) {
- throw 'item is required but was not provided';
- }
- }
+ {required this.item, this.workDoneToken, this.partialResultToken});
static CallHierarchyOutgoingCallsParams fromJson(Map<String, dynamic> json) {
- final item =
- json['item'] != null ? CallHierarchyItem.fromJson(json['item']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final item = CallHierarchyItem.fromJson(json['item']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return CallHierarchyOutgoingCallsParams(
item: item,
@@ -1135,15 +1043,14 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['item'] =
- item?.toJson() ?? (throw 'item is required but was not set');
+ __result['item'] = item.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -1232,28 +1139,16 @@
CallHierarchyPrepareParams.canParse, CallHierarchyPrepareParams.fromJson);
CallHierarchyPrepareParams(
- {@required this.textDocument,
- @required this.position,
- this.workDoneToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ {required this.textDocument, required this.position, this.workDoneToken});
static CallHierarchyPrepareParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return CallHierarchyPrepareParams(
textDocument: textDocument,
@@ -1268,14 +1163,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -1388,12 +1281,12 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
- final bool workDoneProgress;
+ final String? id;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -1481,11 +1374,7 @@
static const jsonHandler =
LspJsonHandler(CancelParams.canParse, CancelParams.fromJson);
- CancelParams({@required this.id}) {
- if (id == null) {
- throw 'id is required but was not provided';
- }
- }
+ CancelParams({required this.id});
static CancelParams fromJson(Map<String, dynamic> json) {
final id = json['id'] is num
? Either2<num, String>.t1(json['id'])
@@ -1500,7 +1389,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['id'] = id ?? (throw 'id is required but was not set');
+ __result['id'] = id;
return __result;
}
@@ -1556,11 +1445,7 @@
LspJsonHandler(ChangeAnnotation.canParse, ChangeAnnotation.fromJson);
ChangeAnnotation(
- {@required this.label, this.needsConfirmation, this.description}) {
- if (label == null) {
- throw 'label is required but was not provided';
- }
- }
+ {required this.label, this.needsConfirmation, this.description});
static ChangeAnnotation fromJson(Map<String, dynamic> json) {
final label = json['label'];
final needsConfirmation = json['needsConfirmation'];
@@ -1573,7 +1458,7 @@
/// A human-readable string which is rendered less prominent in the user
/// interface.
- final String description;
+ final String? description;
/// A human-readable string describing the actual change. The string is
/// rendered prominent in the user interface.
@@ -1581,11 +1466,11 @@
/// A flag which indicates that user confirmation is needed before applying
/// the change.
- final bool needsConfirmation;
+ final bool? needsConfirmation;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['label'] = label ?? (throw 'label is required but was not set');
+ __result['label'] = label;
if (needsConfirmation != null) {
__result['needsConfirmation'] = needsConfirmation;
}
@@ -1701,30 +1586,30 @@
/// General client capabilities.
/// @since 3.16.0
- final ClientCapabilitiesGeneral general;
+ final ClientCapabilitiesGeneral? general;
/// Text document specific client capabilities.
- final TextDocumentClientCapabilities textDocument;
+ final TextDocumentClientCapabilities? textDocument;
/// Window specific client capabilities.
- final ClientCapabilitiesWindow window;
+ final ClientCapabilitiesWindow? window;
/// Workspace specific client capabilities.
- final ClientCapabilitiesWorkspace workspace;
+ final ClientCapabilitiesWorkspace? workspace;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (workspace != null) {
- __result['workspace'] = workspace.toJson();
+ __result['workspace'] = workspace?.toJson();
}
if (textDocument != null) {
- __result['textDocument'] = textDocument.toJson();
+ __result['textDocument'] = textDocument?.toJson();
}
if (window != null) {
- __result['window'] = window.toJson();
+ __result['window'] = window?.toJson();
}
if (general != null) {
- __result['general'] = general.toJson();
+ __result['general'] = general?.toJson();
}
if (experimental != null) {
__result['experimental'] = experimental;
@@ -1777,15 +1662,6 @@
} finally {
reporter.pop();
}
- reporter.push('experimental');
- try {
- if (obj['experimental'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type ClientCapabilities');
@@ -1854,26 +1730,26 @@
}
/// The client has support for sending didCreateFiles notifications.
- final bool didCreate;
+ final bool? didCreate;
/// The client has support for sending didDeleteFiles notifications.
- final bool didDelete;
+ final bool? didDelete;
/// The client has support for sending didRenameFiles notifications.
- final bool didRename;
+ final bool? didRename;
/// Whether the client supports dynamic registration for file
/// requests/notifications.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// The client has support for sending willCreateFiles requests.
- final bool willCreate;
+ final bool? willCreate;
/// The client has support for sending willDeleteFiles requests.
- final bool willDelete;
+ final bool? willDelete;
/// The client has support for sending willRenameFiles requests.
- final bool willRename;
+ final bool? willRename;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -2026,19 +1902,19 @@
/// Client capabilities specific to the client's markdown parser.
/// @since 3.16.0
- final MarkdownClientCapabilities markdown;
+ final MarkdownClientCapabilities? markdown;
/// Client capabilities specific to regular expressions.
/// @since 3.16.0
- final RegularExpressionsClientCapabilities regularExpressions;
+ final RegularExpressionsClientCapabilities? regularExpressions;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (regularExpressions != null) {
- __result['regularExpressions'] = regularExpressions.toJson();
+ __result['regularExpressions'] = regularExpressions?.toJson();
}
if (markdown != null) {
- __result['markdown'] = markdown.toJson();
+ __result['markdown'] = markdown?.toJson();
}
return __result;
}
@@ -2119,17 +1995,17 @@
/// Client capabilities for the show document request.
/// @since 3.16.0
- final ShowDocumentClientCapabilities showDocument;
+ final ShowDocumentClientCapabilities? showDocument;
/// Capabilities specific to the showMessage request
/// @since 3.16.0
- final ShowMessageRequestClientCapabilities showMessage;
+ final ShowMessageRequestClientCapabilities? showMessage;
/// Whether client supports handling progress notifications. If set servers
/// are allowed to report in `workDoneProgress` property in the request
/// specific server capabilities.
/// @since 3.15.0
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -2137,10 +2013,10 @@
__result['workDoneProgress'] = workDoneProgress;
}
if (showMessage != null) {
- __result['showMessage'] = showMessage.toJson();
+ __result['showMessage'] = showMessage?.toJson();
}
if (showDocument != null) {
- __result['showDocument'] = showDocument.toJson();
+ __result['showDocument'] = showDocument?.toJson();
}
return __result;
}
@@ -2277,45 +2153,45 @@
/// The client supports applying batch edits to the workspace by supporting
/// the request 'workspace/applyEdit'
- final bool applyEdit;
+ final bool? applyEdit;
/// Capabilities specific to the code lens requests scoped to the workspace.
/// @since 3.16.0
- final CodeLensWorkspaceClientCapabilities codeLens;
+ final CodeLensWorkspaceClientCapabilities? codeLens;
/// The client supports `workspace/configuration` requests.
/// @since 3.6.0
- final bool configuration;
+ final bool? configuration;
/// Capabilities specific to the `workspace/didChangeConfiguration`
/// notification.
- final DidChangeConfigurationClientCapabilities didChangeConfiguration;
+ final DidChangeConfigurationClientCapabilities? didChangeConfiguration;
/// Capabilities specific to the `workspace/didChangeWatchedFiles`
/// notification.
- final DidChangeWatchedFilesClientCapabilities didChangeWatchedFiles;
+ final DidChangeWatchedFilesClientCapabilities? didChangeWatchedFiles;
/// Capabilities specific to the `workspace/executeCommand` request.
- final ExecuteCommandClientCapabilities executeCommand;
+ final ExecuteCommandClientCapabilities? executeCommand;
/// The client has support for file requests/notifications.
/// @since 3.16.0
- final ClientCapabilitiesFileOperations fileOperations;
+ final ClientCapabilitiesFileOperations? fileOperations;
/// Capabilities specific to the semantic token requests scoped to the
/// workspace.
/// @since 3.16.0
- final SemanticTokensWorkspaceClientCapabilities semanticTokens;
+ final SemanticTokensWorkspaceClientCapabilities? semanticTokens;
/// Capabilities specific to the `workspace/symbol` request.
- final WorkspaceSymbolClientCapabilities symbol;
+ final WorkspaceSymbolClientCapabilities? symbol;
/// Capabilities specific to `WorkspaceEdit`s
- final WorkspaceEditClientCapabilities workspaceEdit;
+ final WorkspaceEditClientCapabilities? workspaceEdit;
/// The client has support for workspace folders.
/// @since 3.6.0
- final bool workspaceFolders;
+ final bool? workspaceFolders;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -2323,19 +2199,19 @@
__result['applyEdit'] = applyEdit;
}
if (workspaceEdit != null) {
- __result['workspaceEdit'] = workspaceEdit.toJson();
+ __result['workspaceEdit'] = workspaceEdit?.toJson();
}
if (didChangeConfiguration != null) {
- __result['didChangeConfiguration'] = didChangeConfiguration.toJson();
+ __result['didChangeConfiguration'] = didChangeConfiguration?.toJson();
}
if (didChangeWatchedFiles != null) {
- __result['didChangeWatchedFiles'] = didChangeWatchedFiles.toJson();
+ __result['didChangeWatchedFiles'] = didChangeWatchedFiles?.toJson();
}
if (symbol != null) {
- __result['symbol'] = symbol.toJson();
+ __result['symbol'] = symbol?.toJson();
}
if (executeCommand != null) {
- __result['executeCommand'] = executeCommand.toJson();
+ __result['executeCommand'] = executeCommand?.toJson();
}
if (workspaceFolders != null) {
__result['workspaceFolders'] = workspaceFolders;
@@ -2344,13 +2220,13 @@
__result['configuration'] = configuration;
}
if (semanticTokens != null) {
- __result['semanticTokens'] = semanticTokens.toJson();
+ __result['semanticTokens'] = semanticTokens?.toJson();
}
if (codeLens != null) {
- __result['codeLens'] = codeLens.toJson();
+ __result['codeLens'] = codeLens?.toJson();
}
if (fileOperations != null) {
- __result['fileOperations'] = fileOperations.toJson();
+ __result['fileOperations'] = fileOperations?.toJson();
}
return __result;
}
@@ -2539,18 +2415,14 @@
LspJsonHandler(CodeAction.canParse, CodeAction.fromJson);
CodeAction(
- {@required this.title,
+ {required this.title,
this.kind,
this.diagnostics,
this.isPreferred,
this.disabled,
this.edit,
this.command,
- this.data}) {
- if (title == null) {
- throw 'title is required but was not provided';
- }
- }
+ this.data});
static CodeAction fromJson(Map<String, dynamic> json) {
final title = json['title'];
final kind =
@@ -2581,7 +2453,7 @@
/// A command this code action executes. If a code action provides an edit and
/// a command, first the edit is executed and then the command.
- final Command command;
+ final Command? command;
/// A data entry field that is preserved on a code action between a
/// `textDocument/codeAction` and a `codeAction/resolve` request.
@@ -2589,7 +2461,7 @@
final dynamic data;
/// The diagnostics that this code action resolves.
- final List<Diagnostic> diagnostics;
+ final List<Diagnostic>? diagnostics;
/// Marks that the code action cannot currently be applied.
///
@@ -2607,10 +2479,10 @@
/// a disabled code actions are returned, the client should show the user
/// an error message with `reason` in the editor.
/// @since 3.16.0
- final CodeActionDisabled disabled;
+ final CodeActionDisabled? disabled;
/// The workspace edit this code action performs.
- final WorkspaceEdit edit;
+ final WorkspaceEdit? edit;
/// Marks this as a preferred action. Preferred actions are used by the `auto
/// fix` command and can be targeted by keybindings.
@@ -2619,37 +2491,37 @@
/// underlying error. A refactoring should be marked preferred if it is the
/// most reasonable choice of actions to take.
/// @since 3.15.0
- final bool isPreferred;
+ final bool? isPreferred;
/// The kind of the code action.
///
/// Used to filter code actions.
- final CodeActionKind kind;
+ final CodeActionKind? kind;
/// A short, human-readable, title for this code action.
final String title;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['title'] = title ?? (throw 'title is required but was not set');
+ __result['title'] = title;
if (kind != null) {
- __result['kind'] = kind.toJson();
+ __result['kind'] = kind?.toJson();
}
if (diagnostics != null) {
__result['diagnostics'] =
- diagnostics.map((item) => item.toJson()).toList();
+ diagnostics?.map((item) => item.toJson()).toList();
}
if (isPreferred != null) {
__result['isPreferred'] = isPreferred;
}
if (disabled != null) {
- __result['disabled'] = disabled.toJson();
+ __result['disabled'] = disabled?.toJson();
}
if (edit != null) {
- __result['edit'] = edit.toJson();
+ __result['edit'] = edit?.toJson();
}
if (command != null) {
- __result['command'] = command.toJson();
+ __result['command'] = command?.toJson();
}
if (data != null) {
__result['data'] = data;
@@ -2737,15 +2609,6 @@
} finally {
reporter.pop();
}
- reporter.push('data');
- try {
- if (obj['data'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type CodeAction');
@@ -2828,36 +2691,36 @@
/// The client supports code action literals as a valid response of the
/// `textDocument/codeAction` request.
/// @since 3.8.0
- final CodeActionClientCapabilitiesCodeActionLiteralSupport
+ final CodeActionClientCapabilitiesCodeActionLiteralSupport?
codeActionLiteralSupport;
/// Whether code action supports the `data` property which is preserved
/// between a `textDocument/codeAction` and a `codeAction/resolve` request.
/// @since 3.16.0
- final bool dataSupport;
+ final bool? dataSupport;
/// Whether code action supports the `disabled` property.
/// @since 3.16.0
- final bool disabledSupport;
+ final bool? disabledSupport;
/// Whether code action supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// Whether th client honors the change annotations in text edits and resource
/// operations returned via the `CodeAction#edit` property by for example
/// presenting the workspace edit in the user interface and asking for
/// confirmation.
/// @since 3.16.0
- final bool honorsChangeAnnotations;
+ final bool? honorsChangeAnnotations;
/// Whether code action supports the `isPreferred` property.
/// @since 3.15.0
- final bool isPreferredSupport;
+ final bool? isPreferredSupport;
/// Whether the client supports resolving additional code action properties
/// via a separate `codeAction/resolve` request.
/// @since 3.16.0
- final CodeActionClientCapabilitiesResolveSupport resolveSupport;
+ final CodeActionClientCapabilitiesResolveSupport? resolveSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -2865,7 +2728,7 @@
__result['dynamicRegistration'] = dynamicRegistration;
}
if (codeActionLiteralSupport != null) {
- __result['codeActionLiteralSupport'] = codeActionLiteralSupport.toJson();
+ __result['codeActionLiteralSupport'] = codeActionLiteralSupport?.toJson();
}
if (isPreferredSupport != null) {
__result['isPreferredSupport'] = isPreferredSupport;
@@ -2877,7 +2740,7 @@
__result['dataSupport'] = dataSupport;
}
if (resolveSupport != null) {
- __result['resolveSupport'] = resolveSupport.toJson();
+ __result['resolveSupport'] = resolveSupport?.toJson();
}
if (honorsChangeAnnotations != null) {
__result['honorsChangeAnnotations'] = honorsChangeAnnotations;
@@ -3005,15 +2868,11 @@
CodeActionClientCapabilitiesCodeActionKind.canParse,
CodeActionClientCapabilitiesCodeActionKind.fromJson);
- CodeActionClientCapabilitiesCodeActionKind({@required this.valueSet}) {
- if (valueSet == null) {
- throw 'valueSet is required but was not provided';
- }
- }
+ CodeActionClientCapabilitiesCodeActionKind({required this.valueSet});
static CodeActionClientCapabilitiesCodeActionKind fromJson(
Map<String, dynamic> json) {
final valueSet = json['valueSet']
- ?.map((item) => item != null ? CodeActionKind.fromJson(item) : null)
+ ?.map((item) => CodeActionKind.fromJson(item))
?.cast<CodeActionKind>()
?.toList();
return CodeActionClientCapabilitiesCodeActionKind(valueSet: valueSet);
@@ -3026,8 +2885,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['valueSet'] = valueSet?.map((item) => item.toJson())?.toList() ??
- (throw 'valueSet is required but was not set');
+ __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
return __result;
}
@@ -3089,17 +2947,11 @@
CodeActionClientCapabilitiesCodeActionLiteralSupport.fromJson);
CodeActionClientCapabilitiesCodeActionLiteralSupport(
- {@required this.codeActionKind}) {
- if (codeActionKind == null) {
- throw 'codeActionKind is required but was not provided';
- }
- }
+ {required this.codeActionKind});
static CodeActionClientCapabilitiesCodeActionLiteralSupport fromJson(
Map<String, dynamic> json) {
- final codeActionKind = json['codeActionKind'] != null
- ? CodeActionClientCapabilitiesCodeActionKind.fromJson(
- json['codeActionKind'])
- : null;
+ final codeActionKind = CodeActionClientCapabilitiesCodeActionKind.fromJson(
+ json['codeActionKind']);
return CodeActionClientCapabilitiesCodeActionLiteralSupport(
codeActionKind: codeActionKind);
}
@@ -3109,8 +2961,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['codeActionKind'] = codeActionKind?.toJson() ??
- (throw 'codeActionKind is required but was not set');
+ __result['codeActionKind'] = codeActionKind.toJson();
return __result;
}
@@ -3169,11 +3020,7 @@
CodeActionClientCapabilitiesResolveSupport.canParse,
CodeActionClientCapabilitiesResolveSupport.fromJson);
- CodeActionClientCapabilitiesResolveSupport({@required this.properties}) {
- if (properties == null) {
- throw 'properties is required but was not provided';
- }
- }
+ CodeActionClientCapabilitiesResolveSupport({required this.properties});
static CodeActionClientCapabilitiesResolveSupport fromJson(
Map<String, dynamic> json) {
final properties =
@@ -3186,8 +3033,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['properties'] =
- properties ?? (throw 'properties is required but was not set');
+ __result['properties'] = properties;
return __result;
}
@@ -3247,14 +3093,10 @@
static const jsonHandler =
LspJsonHandler(CodeActionContext.canParse, CodeActionContext.fromJson);
- CodeActionContext({@required this.diagnostics, this.only}) {
- if (diagnostics == null) {
- throw 'diagnostics is required but was not provided';
- }
- }
+ CodeActionContext({required this.diagnostics, this.only});
static CodeActionContext fromJson(Map<String, dynamic> json) {
final diagnostics = json['diagnostics']
- ?.map((item) => item != null ? Diagnostic.fromJson(item) : null)
+ ?.map((item) => Diagnostic.fromJson(item))
?.cast<Diagnostic>()
?.toList();
final only = json['only']
@@ -3276,15 +3118,13 @@
///
/// Actions not of this kind are filtered out by the client before being
/// shown. So servers can omit computing them.
- final List<CodeActionKind> only;
+ final List<CodeActionKind>? only;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['diagnostics'] =
- diagnostics?.map((item) => item.toJson())?.toList() ??
- (throw 'diagnostics is required but was not set');
+ __result['diagnostics'] = diagnostics.map((item) => item.toJson()).toList();
if (only != null) {
- __result['only'] = only.map((item) => item.toJson()).toList();
+ __result['only'] = only?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -3357,11 +3197,7 @@
static const jsonHandler =
LspJsonHandler(CodeActionDisabled.canParse, CodeActionDisabled.fromJson);
- CodeActionDisabled({@required this.reason}) {
- if (reason == null) {
- throw 'reason is required but was not provided';
- }
- }
+ CodeActionDisabled({required this.reason});
static CodeActionDisabled fromJson(Map<String, dynamic> json) {
final reason = json['reason'];
return CodeActionDisabled(reason: reason);
@@ -3374,7 +3210,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['reason'] = reason ?? (throw 'reason is required but was not set');
+ __result['reason'] = reason;
return __result;
}
@@ -3522,19 +3358,19 @@
///
/// The list of kinds may be generic, such as `CodeActionKind.Refactor`, or
/// the server may list out every specific kind they provide.
- final List<CodeActionKind> codeActionKinds;
+ final List<CodeActionKind>? codeActionKinds;
/// The server provides support to resolve additional information for a code
/// action.
/// @since 3.16.0
- final bool resolveProvider;
- final bool workDoneProgress;
+ final bool? resolveProvider;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (codeActionKinds != null) {
__result['codeActionKinds'] =
- codeActionKinds.map((item) => item.toJson()).toList();
+ codeActionKinds?.map((item) => item.toJson()).toList();
}
if (resolveProvider != null) {
__result['resolveProvider'] = resolveProvider;
@@ -3618,42 +3454,28 @@
LspJsonHandler(CodeActionParams.canParse, CodeActionParams.fromJson);
CodeActionParams(
- {@required this.textDocument,
- @required this.range,
- @required this.context,
+ {required this.textDocument,
+ required this.range,
+ required this.context,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (context == null) {
- throw 'context is required but was not provided';
- }
- }
+ this.partialResultToken});
static CodeActionParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
- final context = json['context'] != null
- ? CodeActionContext.fromJson(json['context'])
- : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final range = Range.fromJson(json['range']);
+ final context = CodeActionContext.fromJson(json['context']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return CodeActionParams(
textDocument: textDocument,
@@ -3668,7 +3490,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The range for which the command was invoked.
final Range range;
@@ -3677,16 +3499,13 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['context'] =
- context?.toJson() ?? (throw 'context is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['range'] = range.toJson();
+ __result['context'] = context.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -3839,24 +3658,24 @@
///
/// The list of kinds may be generic, such as `CodeActionKind.Refactor`, or
/// the server may list out every specific kind they provide.
- final List<CodeActionKind> codeActionKinds;
+ final List<CodeActionKind>? codeActionKinds;
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The server provides support to resolve additional information for a code
/// action.
/// @since 3.16.0
- final bool resolveProvider;
- final bool workDoneProgress;
+ final bool? resolveProvider;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
__result['documentSelector'] = documentSelector;
if (codeActionKinds != null) {
__result['codeActionKinds'] =
- codeActionKinds.map((item) => item.toJson()).toList();
+ codeActionKinds?.map((item) => item.toJson()).toList();
}
if (resolveProvider != null) {
__result['resolveProvider'] = resolveProvider;
@@ -3959,11 +3778,7 @@
static const jsonHandler =
LspJsonHandler(CodeDescription.canParse, CodeDescription.fromJson);
- CodeDescription({@required this.href}) {
- if (href == null) {
- throw 'href is required but was not provided';
- }
- }
+ CodeDescription({required this.href});
static CodeDescription fromJson(Map<String, dynamic> json) {
final href = json['href'];
return CodeDescription(href: href);
@@ -3974,7 +3789,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['href'] = href ?? (throw 'href is required but was not set');
+ __result['href'] = href;
return __result;
}
@@ -4033,13 +3848,9 @@
static const jsonHandler =
LspJsonHandler(CodeLens.canParse, CodeLens.fromJson);
- CodeLens({@required this.range, this.command, this.data}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- }
+ CodeLens({required this.range, this.command, this.data});
static CodeLens fromJson(Map<String, dynamic> json) {
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final command =
json['command'] != null ? Command.fromJson(json['command']) : null;
final data = json['data'];
@@ -4047,7 +3858,7 @@
}
/// The command this code lens represents.
- final Command command;
+ final Command? command;
/// A data entry field that is preserved on a code lens item between a code
/// lens and a code lens resolve request.
@@ -4059,10 +3870,9 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
+ __result['range'] = range.toJson();
if (command != null) {
- __result['command'] = command.toJson();
+ __result['command'] = command?.toJson();
}
if (data != null) {
__result['data'] = data;
@@ -4099,15 +3909,6 @@
} finally {
reporter.pop();
}
- reporter.push('data');
- try {
- if (obj['data'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type CodeLens');
@@ -4150,7 +3951,7 @@
}
/// Whether code lens supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -4215,8 +4016,8 @@
}
/// Code lens has a resolve provider as well.
- final bool resolveProvider;
- final bool workDoneProgress;
+ final bool? resolveProvider;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -4286,30 +4087,24 @@
LspJsonHandler(CodeLensParams.canParse, CodeLensParams.fromJson);
CodeLensParams(
- {@required this.textDocument,
+ {required this.textDocument,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- }
+ this.partialResultToken});
static CodeLensParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return CodeLensParams(
textDocument: textDocument,
@@ -4319,18 +4114,17 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The document to request code lens for.
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -4435,11 +4229,11 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// Code lens has a resolve provider as well.
- final bool resolveProvider;
- final bool workDoneProgress;
+ final bool? resolveProvider;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -4543,7 +4337,7 @@
/// code lenses currently shown. It should be used with absolute care and is
/// useful for situation where a server for example detect a project wide
/// change that requires such a calculation.
- final bool refreshSupport;
+ final bool? refreshSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -4597,23 +4391,10 @@
static const jsonHandler = LspJsonHandler(Color.canParse, Color.fromJson);
Color(
- {@required this.red,
- @required this.green,
- @required this.blue,
- @required this.alpha}) {
- if (red == null) {
- throw 'red is required but was not provided';
- }
- if (green == null) {
- throw 'green is required but was not provided';
- }
- if (blue == null) {
- throw 'blue is required but was not provided';
- }
- if (alpha == null) {
- throw 'alpha is required but was not provided';
- }
- }
+ {required this.red,
+ required this.green,
+ required this.blue,
+ required this.alpha});
static Color fromJson(Map<String, dynamic> json) {
final red = json['red'];
final green = json['green'];
@@ -4636,10 +4417,10 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['red'] = red ?? (throw 'red is required but was not set');
- __result['green'] = green ?? (throw 'green is required but was not set');
- __result['blue'] = blue ?? (throw 'blue is required but was not set');
- __result['alpha'] = alpha ?? (throw 'alpha is required but was not set');
+ __result['red'] = red;
+ __result['green'] = green;
+ __result['blue'] = blue;
+ __result['alpha'] = alpha;
return __result;
}
@@ -4750,17 +4531,10 @@
static const jsonHandler =
LspJsonHandler(ColorInformation.canParse, ColorInformation.fromJson);
- ColorInformation({@required this.range, @required this.color}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (color == null) {
- throw 'color is required but was not provided';
- }
- }
+ ColorInformation({required this.range, required this.color});
static ColorInformation fromJson(Map<String, dynamic> json) {
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
- final color = json['color'] != null ? Color.fromJson(json['color']) : null;
+ final range = Range.fromJson(json['range']);
+ final color = Color.fromJson(json['color']);
return ColorInformation(range: range, color: color);
}
@@ -4772,10 +4546,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['color'] =
- color?.toJson() ?? (throw 'color is required but was not set');
+ __result['range'] = range.toJson();
+ __result['color'] = color.toJson();
return __result;
}
@@ -4847,11 +4619,7 @@
LspJsonHandler(ColorPresentation.canParse, ColorPresentation.fromJson);
ColorPresentation(
- {@required this.label, this.textEdit, this.additionalTextEdits}) {
- if (label == null) {
- throw 'label is required but was not provided';
- }
- }
+ {required this.label, this.textEdit, this.additionalTextEdits});
static ColorPresentation fromJson(Map<String, dynamic> json) {
final label = json['label'];
final textEdit =
@@ -4869,7 +4637,7 @@
/// An optional array of additional text edits ([TextEdit]) that are applied
/// when selecting this color presentation. Edits must not overlap with the
/// main [edit](#ColorPresentation.textEdit) nor with themselves.
- final List<TextEdit> additionalTextEdits;
+ final List<TextEdit>? additionalTextEdits;
/// The label of this color presentation. It will be shown on the color picker
/// header. By default this is also the text that is inserted when selecting
@@ -4879,17 +4647,17 @@
/// An edit ([TextEdit]) which is applied to a document when selecting this
/// presentation for the color. When `falsy` the
/// [label](#ColorPresentation.label) is used.
- final TextEdit textEdit;
+ final TextEdit? textEdit;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['label'] = label ?? (throw 'label is required but was not set');
+ __result['label'] = label;
if (textEdit != null) {
- __result['textEdit'] = textEdit.toJson();
+ __result['textEdit'] = textEdit?.toJson();
}
if (additionalTextEdits != null) {
__result['additionalTextEdits'] =
- additionalTextEdits.map((item) => item.toJson()).toList();
+ additionalTextEdits?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -4973,40 +4741,28 @@
ColorPresentationParams.canParse, ColorPresentationParams.fromJson);
ColorPresentationParams(
- {@required this.textDocument,
- @required this.color,
- @required this.range,
+ {required this.textDocument,
+ required this.color,
+ required this.range,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (color == null) {
- throw 'color is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- }
+ this.partialResultToken});
static ColorPresentationParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final color = json['color'] != null ? Color.fromJson(json['color']) : null;
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final color = Color.fromJson(json['color']);
+ final range = Range.fromJson(json['range']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return ColorPresentationParams(
textDocument: textDocument,
@@ -5021,7 +4777,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The range where the color would be inserted. Serves as a context.
final Range range;
@@ -5030,16 +4786,13 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['color'] =
- color?.toJson() ?? (throw 'color is required but was not set');
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['color'] = color.toJson();
+ __result['range'] = range.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -5163,14 +4916,7 @@
class Command implements ToJsonable {
static const jsonHandler = LspJsonHandler(Command.canParse, Command.fromJson);
- Command({@required this.title, @required this.command, this.arguments}) {
- if (title == null) {
- throw 'title is required but was not provided';
- }
- if (command == null) {
- throw 'command is required but was not provided';
- }
- }
+ Command({required this.title, required this.command, this.arguments});
static Command fromJson(Map<String, dynamic> json) {
final title = json['title'];
final command = json['command'];
@@ -5180,7 +4926,7 @@
}
/// Arguments that the command handler should be invoked with.
- final List<dynamic> arguments;
+ final List<dynamic>? arguments;
/// The identifier of the actual command handler.
final String command;
@@ -5190,9 +4936,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['title'] = title ?? (throw 'title is required but was not set');
- __result['command'] =
- command ?? (throw 'command is required but was not set');
+ __result['title'] = title;
+ __result['command'] = command;
if (arguments != null) {
__result['arguments'] = arguments;
}
@@ -5307,15 +5052,15 @@
}
/// The client supports the following `CompletionItem` specific capabilities.
- final CompletionClientCapabilitiesCompletionItem completionItem;
- final CompletionClientCapabilitiesCompletionItemKind completionItemKind;
+ final CompletionClientCapabilitiesCompletionItem? completionItem;
+ final CompletionClientCapabilitiesCompletionItemKind? completionItemKind;
/// The client supports to send additional context information for a
/// `textDocument/completion` request.
- final bool contextSupport;
+ final bool? contextSupport;
/// Whether completion supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -5323,10 +5068,10 @@
__result['dynamicRegistration'] = dynamicRegistration;
}
if (completionItem != null) {
- __result['completionItem'] = completionItem.toJson();
+ __result['completionItem'] = completionItem?.toJson();
}
if (completionItemKind != null) {
- __result['completionItemKind'] = completionItemKind.toJson();
+ __result['completionItemKind'] = completionItemKind?.toJson();
}
if (contextSupport != null) {
__result['contextSupport'] = contextSupport;
@@ -5463,34 +5208,35 @@
}
/// Client supports commit characters on a completion item.
- final bool commitCharactersSupport;
+ final bool? commitCharactersSupport;
/// Client supports the deprecated property on a completion item.
- final bool deprecatedSupport;
+ final bool? deprecatedSupport;
/// Client supports the follow content formats for the documentation property.
/// The order describes the preferred format of the client.
- final List<MarkupKind> documentationFormat;
+ final List<MarkupKind>? documentationFormat;
/// Client supports insert replace edit to control different behavior if a
/// completion item is inserted in the text or should replace text.
/// @since 3.16.0
- final bool insertReplaceSupport;
+ final bool? insertReplaceSupport;
/// The client supports the `insertTextMode` property on a completion item to
/// override the whitespace handling mode as defined by the client (see
/// `insertTextMode`).
/// @since 3.16.0
- final CompletionClientCapabilitiesInsertTextModeSupport insertTextModeSupport;
+ final CompletionClientCapabilitiesInsertTextModeSupport?
+ insertTextModeSupport;
/// Client supports the preselect property on a completion item.
- final bool preselectSupport;
+ final bool? preselectSupport;
/// Indicates which properties a client can resolve lazily on a completion
/// item. Before version 3.16.0 only the predefined properties `documentation`
/// and `details` could be resolved lazily.
/// @since 3.16.0
- final CompletionClientCapabilitiesResolveSupport resolveSupport;
+ final CompletionClientCapabilitiesResolveSupport? resolveSupport;
/// Client supports snippets as insert text.
///
@@ -5498,14 +5244,14 @@
/// `${3:foo}`. `$0` defines the final tab stop, it defaults to the end of the
/// snippet. Placeholders with equal identifiers are linked, that is typing in
/// one will update others too.
- final bool snippetSupport;
+ final bool? snippetSupport;
/// Client supports the tag property on a completion item. Clients supporting
/// tags have to handle unknown tags gracefully. Clients especially need to
/// preserve unknown tags when sending a completion item back to the server in
/// a resolve call.
/// @since 3.15.0
- final CompletionClientCapabilitiesTagSupport tagSupport;
+ final CompletionClientCapabilitiesTagSupport? tagSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -5517,7 +5263,7 @@
}
if (documentationFormat != null) {
__result['documentationFormat'] =
- documentationFormat.map((item) => item.toJson()).toList();
+ documentationFormat?.map((item) => item.toJson()).toList();
}
if (deprecatedSupport != null) {
__result['deprecatedSupport'] = deprecatedSupport;
@@ -5526,16 +5272,16 @@
__result['preselectSupport'] = preselectSupport;
}
if (tagSupport != null) {
- __result['tagSupport'] = tagSupport.toJson();
+ __result['tagSupport'] = tagSupport?.toJson();
}
if (insertReplaceSupport != null) {
__result['insertReplaceSupport'] = insertReplaceSupport;
}
if (resolveSupport != null) {
- __result['resolveSupport'] = resolveSupport.toJson();
+ __result['resolveSupport'] = resolveSupport?.toJson();
}
if (insertTextModeSupport != null) {
- __result['insertTextModeSupport'] = insertTextModeSupport.toJson();
+ __result['insertTextModeSupport'] = insertTextModeSupport?.toJson();
}
return __result;
}
@@ -5707,12 +5453,12 @@
/// If this property is not present the client only supports the completion
/// items kinds from `Text` to `Reference` as defined in the initial version
/// of the protocol.
- final List<CompletionItemKind> valueSet;
+ final List<CompletionItemKind>? valueSet;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (valueSet != null) {
- __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
+ __result['valueSet'] = valueSet?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -5766,15 +5512,11 @@
CompletionClientCapabilitiesInsertTextModeSupport.canParse,
CompletionClientCapabilitiesInsertTextModeSupport.fromJson);
- CompletionClientCapabilitiesInsertTextModeSupport({@required this.valueSet}) {
- if (valueSet == null) {
- throw 'valueSet is required but was not provided';
- }
- }
+ CompletionClientCapabilitiesInsertTextModeSupport({required this.valueSet});
static CompletionClientCapabilitiesInsertTextModeSupport fromJson(
Map<String, dynamic> json) {
final valueSet = json['valueSet']
- ?.map((item) => item != null ? InsertTextMode.fromJson(item) : null)
+ ?.map((item) => InsertTextMode.fromJson(item))
?.cast<InsertTextMode>()
?.toList();
return CompletionClientCapabilitiesInsertTextModeSupport(
@@ -5785,8 +5527,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['valueSet'] = valueSet?.map((item) => item.toJson())?.toList() ??
- (throw 'valueSet is required but was not set');
+ __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
return __result;
}
@@ -5847,11 +5588,7 @@
CompletionClientCapabilitiesResolveSupport.canParse,
CompletionClientCapabilitiesResolveSupport.fromJson);
- CompletionClientCapabilitiesResolveSupport({@required this.properties}) {
- if (properties == null) {
- throw 'properties is required but was not provided';
- }
- }
+ CompletionClientCapabilitiesResolveSupport({required this.properties});
static CompletionClientCapabilitiesResolveSupport fromJson(
Map<String, dynamic> json) {
final properties =
@@ -5864,8 +5601,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['properties'] =
- properties ?? (throw 'properties is required but was not set');
+ __result['properties'] = properties;
return __result;
}
@@ -5924,15 +5660,11 @@
CompletionClientCapabilitiesTagSupport.canParse,
CompletionClientCapabilitiesTagSupport.fromJson);
- CompletionClientCapabilitiesTagSupport({@required this.valueSet}) {
- if (valueSet == null) {
- throw 'valueSet is required but was not provided';
- }
- }
+ CompletionClientCapabilitiesTagSupport({required this.valueSet});
static CompletionClientCapabilitiesTagSupport fromJson(
Map<String, dynamic> json) {
final valueSet = json['valueSet']
- ?.map((item) => item != null ? CompletionItemTag.fromJson(item) : null)
+ ?.map((item) => CompletionItemTag.fromJson(item))
?.cast<CompletionItemTag>()
?.toList();
return CompletionClientCapabilitiesTagSupport(valueSet: valueSet);
@@ -5943,8 +5675,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['valueSet'] = valueSet?.map((item) => item.toJson())?.toList() ??
- (throw 'valueSet is required but was not set');
+ __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
return __result;
}
@@ -6005,15 +5736,9 @@
static const jsonHandler =
LspJsonHandler(CompletionContext.canParse, CompletionContext.fromJson);
- CompletionContext({@required this.triggerKind, this.triggerCharacter}) {
- if (triggerKind == null) {
- throw 'triggerKind is required but was not provided';
- }
- }
+ CompletionContext({required this.triggerKind, this.triggerCharacter});
static CompletionContext fromJson(Map<String, dynamic> json) {
- final triggerKind = json['triggerKind'] != null
- ? CompletionTriggerKind.fromJson(json['triggerKind'])
- : null;
+ final triggerKind = CompletionTriggerKind.fromJson(json['triggerKind']);
final triggerCharacter = json['triggerCharacter'];
return CompletionContext(
triggerKind: triggerKind, triggerCharacter: triggerCharacter);
@@ -6021,15 +5746,14 @@
/// The trigger character (a single character) that has trigger code complete.
/// Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
- final String triggerCharacter;
+ final String? triggerCharacter;
/// How the completion was triggered.
final CompletionTriggerKind triggerKind;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['triggerKind'] = triggerKind?.toJson() ??
- (throw 'triggerKind is required but was not set');
+ __result['triggerKind'] = triggerKind.toJson();
if (triggerCharacter != null) {
__result['triggerCharacter'] = triggerCharacter;
}
@@ -6099,7 +5823,7 @@
LspJsonHandler(CompletionItem.canParse, CompletionItem.fromJson);
CompletionItem(
- {@required this.label,
+ {required this.label,
this.kind,
this.tags,
this.detail,
@@ -6115,11 +5839,7 @@
this.additionalTextEdits,
this.commitCharacters,
this.command,
- this.data}) {
- if (label == null) {
- throw 'label is required but was not provided';
- }
- }
+ this.data});
static CompletionItem fromJson(Map<String, dynamic> json) {
final label = json['label'];
final kind =
@@ -6129,14 +5849,14 @@
?.cast<CompletionItemTag>()
?.toList();
final detail = json['detail'];
- final documentation = json['documentation'] is String
- ? Either2<String, MarkupContent>.t1(json['documentation'])
- : (MarkupContent.canParse(json['documentation'], nullLspJsonReporter)
- ? Either2<String, MarkupContent>.t2(json['documentation'] != null
- ? MarkupContent.fromJson(json['documentation'])
- : null)
- : (json['documentation'] == null
- ? null
+ final documentation = json['documentation'] == null
+ ? null
+ : (json['documentation'] is String
+ ? Either2<String, MarkupContent>.t1(json['documentation'])
+ : (MarkupContent.canParse(
+ json['documentation'], nullLspJsonReporter)
+ ? Either2<String, MarkupContent>.t2(
+ MarkupContent.fromJson(json['documentation']))
: (throw '''${json['documentation']} was not one of (String, MarkupContent)''')));
final deprecated = json['deprecated'];
final preselect = json['preselect'];
@@ -6149,16 +5869,14 @@
final insertTextMode = json['insertTextMode'] != null
? InsertTextMode.fromJson(json['insertTextMode'])
: null;
- final textEdit = TextEdit.canParse(json['textEdit'], nullLspJsonReporter)
- ? Either2<TextEdit, InsertReplaceEdit>.t1(json['textEdit'] != null
- ? TextEdit.fromJson(json['textEdit'])
- : null)
- : (InsertReplaceEdit.canParse(json['textEdit'], nullLspJsonReporter)
- ? Either2<TextEdit, InsertReplaceEdit>.t2(json['textEdit'] != null
- ? InsertReplaceEdit.fromJson(json['textEdit'])
- : null)
- : (json['textEdit'] == null
- ? null
+ final textEdit = json['textEdit'] == null
+ ? null
+ : (TextEdit.canParse(json['textEdit'], nullLspJsonReporter)
+ ? Either2<TextEdit, InsertReplaceEdit>.t1(
+ TextEdit.fromJson(json['textEdit']))
+ : (InsertReplaceEdit.canParse(json['textEdit'], nullLspJsonReporter)
+ ? Either2<TextEdit, InsertReplaceEdit>.t2(
+ InsertReplaceEdit.fromJson(json['textEdit']))
: (throw '''${json['textEdit']} was not one of (TextEdit, InsertReplaceEdit)''')));
final additionalTextEdits = json['additionalTextEdits']
?.map((item) => item != null ? TextEdit.fromJson(item) : null)
@@ -6198,37 +5916,37 @@
/// Additional text edits should be used to change text unrelated to the
/// current cursor position (for example adding an import statement at the top
/// of the file if the completion item will insert an unqualified type).
- final List<TextEdit> additionalTextEdits;
+ final List<TextEdit>? additionalTextEdits;
/// An optional command that is executed *after* inserting this completion.
/// *Note* that additional modifications to the current document should be
/// described with the additionalTextEdits-property.
- final Command command;
+ final Command? command;
/// An optional set of characters that when pressed while this completion is
/// active will accept it first and then type that character. *Note* that all
/// commit characters should have `length=1` and that superfluous characters
/// will be ignored.
- final List<String> commitCharacters;
+ final List<String>? commitCharacters;
/// A data entry field that is preserved on a completion item between a
/// completion and a completion resolve request.
- final CompletionItemResolutionInfo data;
+ final CompletionItemResolutionInfo? data;
/// Indicates if this item is deprecated.
/// @deprecated Use `tags` instead if supported.
- final bool deprecated;
+ final bool? deprecated;
/// A human-readable string with additional information about this item, like
/// type or symbol information.
- final String detail;
+ final String? detail;
/// A human-readable string that represents a doc-comment.
- final Either2<String, MarkupContent> documentation;
+ final Either2<String, MarkupContent>? documentation;
/// A string that should be used when filtering a set of completion items.
/// When `falsy` the label is used.
- final String filterText;
+ final String? filterText;
/// A string that should be inserted into a document when selecting this
/// completion. When `falsy` the label is used.
@@ -6239,23 +5957,23 @@
/// completion item with an `insertText` of `console` is provided it will only
/// insert `sole`. Therefore it is recommended to use `textEdit` instead since
/// it avoids additional client side interpretation.
- final String insertText;
+ final String? insertText;
/// The format of the insert text. The format applies to both the `insertText`
/// property and the `newText` property of a provided `textEdit`. If omitted
/// defaults to `InsertTextFormat.PlainText`.
- final InsertTextFormat insertTextFormat;
+ final InsertTextFormat? insertTextFormat;
/// How whitespace and indentation is handled during completion item
/// insertion. If not provided the client's default value depends on the
/// `textDocument.completion.insertTextMode` client capability.
/// @since 3.16.0
- final InsertTextMode insertTextMode;
+ final InsertTextMode? insertTextMode;
/// The kind of this completion item. Based of the kind an icon is chosen by
/// the editor. The standardized set of available values is defined in
/// `CompletionItemKind`.
- final CompletionItemKind kind;
+ final CompletionItemKind? kind;
/// The label of this completion item. By default also the text that is
/// inserted when selecting this completion.
@@ -6266,15 +5984,15 @@
/// *Note* that only one completion item can be selected and that the tool /
/// client decides which item that is. The rule is that the *first* item of
/// those that match best is selected.
- final bool preselect;
+ final bool? preselect;
/// A string that should be used when comparing this item with other items.
/// When `falsy` the label is used.
- final String sortText;
+ final String? sortText;
/// Tags for this completion item.
/// @since 3.15.0
- final List<CompletionItemTag> tags;
+ final List<CompletionItemTag>? tags;
/// An edit which is applied to a document when selecting this completion.
/// When an edit is provided the value of `insertText` is ignored.
@@ -6296,16 +6014,16 @@
/// must be a prefix of the edit's replace range, that means it must be
/// contained and starting at the same position.
/// @since 3.16.0 additional type `InsertReplaceEdit`
- final Either2<TextEdit, InsertReplaceEdit> textEdit;
+ final Either2<TextEdit, InsertReplaceEdit>? textEdit;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['label'] = label ?? (throw 'label is required but was not set');
+ __result['label'] = label;
if (kind != null) {
- __result['kind'] = kind.toJson();
+ __result['kind'] = kind?.toJson();
}
if (tags != null) {
- __result['tags'] = tags.map((item) => item.toJson()).toList();
+ __result['tags'] = tags?.map((item) => item.toJson()).toList();
}
if (detail != null) {
__result['detail'] = detail;
@@ -6329,26 +6047,26 @@
__result['insertText'] = insertText;
}
if (insertTextFormat != null) {
- __result['insertTextFormat'] = insertTextFormat.toJson();
+ __result['insertTextFormat'] = insertTextFormat?.toJson();
}
if (insertTextMode != null) {
- __result['insertTextMode'] = insertTextMode.toJson();
+ __result['insertTextMode'] = insertTextMode?.toJson();
}
if (textEdit != null) {
__result['textEdit'] = textEdit;
}
if (additionalTextEdits != null) {
__result['additionalTextEdits'] =
- additionalTextEdits.map((item) => item.toJson()).toList();
+ additionalTextEdits?.map((item) => item.toJson()).toList();
}
if (commitCharacters != null) {
__result['commitCharacters'] = commitCharacters;
}
if (command != null) {
- __result['command'] = command.toJson();
+ __result['command'] = command?.toJson();
}
if (data != null) {
- __result['data'] = data.toJson();
+ __result['data'] = data?.toJson();
}
return __result;
}
@@ -6678,18 +6396,11 @@
static const jsonHandler =
LspJsonHandler(CompletionList.canParse, CompletionList.fromJson);
- CompletionList({@required this.isIncomplete, @required this.items}) {
- if (isIncomplete == null) {
- throw 'isIncomplete is required but was not provided';
- }
- if (items == null) {
- throw 'items is required but was not provided';
- }
- }
+ CompletionList({required this.isIncomplete, required this.items});
static CompletionList fromJson(Map<String, dynamic> json) {
final isIncomplete = json['isIncomplete'];
final items = json['items']
- ?.map((item) => item != null ? CompletionItem.fromJson(item) : null)
+ ?.map((item) => CompletionItem.fromJson(item))
?.cast<CompletionItem>()
?.toList();
return CompletionList(isIncomplete: isIncomplete, items: items);
@@ -6704,10 +6415,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['isIncomplete'] =
- isIncomplete ?? (throw 'isIncomplete is required but was not set');
- __result['items'] = items?.map((item) => item.toJson())?.toList() ??
- (throw 'items is required but was not set');
+ __result['isIncomplete'] = isIncomplete;
+ __result['items'] = items.map((item) => item.toJson()).toList();
return __result;
}
@@ -6818,11 +6527,11 @@
/// If a server provides both `allCommitCharacters` and commit characters on
/// an individual completion item the ones on the completion item win.
/// @since 3.2.0
- final List<String> allCommitCharacters;
+ final List<String>? allCommitCharacters;
/// The server provides support to resolve additional information for a
/// completion item.
- final bool resolveProvider;
+ final bool? resolveProvider;
/// Most tools trigger completion request automatically without explicitly
/// requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically they
@@ -6834,8 +6543,8 @@
/// If code complete should automatically be trigger on characters not being
/// valid inside an identifier (for example `.` in JavaScript) list them in
/// `triggerCharacters`.
- final List<String> triggerCharacters;
- final bool workDoneProgress;
+ final List<String>? triggerCharacters;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -6945,39 +6654,29 @@
CompletionParams(
{this.context,
- @required this.textDocument,
- @required this.position,
+ required this.textDocument,
+ required this.position,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ this.partialResultToken});
static CompletionParams fromJson(Map<String, dynamic> json) {
final context = json['context'] != null
? CompletionContext.fromJson(json['context'])
: null;
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return CompletionParams(
context: context,
@@ -6989,11 +6688,11 @@
/// The completion context. This is only available if the client specifies to
/// send this using the client capability `completion.contextSupport === true`
- final CompletionContext context;
+ final CompletionContext? context;
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The position inside the text document.
final Position position;
@@ -7002,17 +6701,15 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (context != null) {
- __result['context'] = context.toJson();
+ __result['context'] = context?.toJson();
}
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -7168,15 +6865,15 @@
/// If a server provides both `allCommitCharacters` and commit characters on
/// an individual completion item the ones on the completion item win.
/// @since 3.2.0
- final List<String> allCommitCharacters;
+ final List<String>? allCommitCharacters;
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The server provides support to resolve additional information for a
/// completion item.
- final bool resolveProvider;
+ final bool? resolveProvider;
/// Most tools trigger completion request automatically without explicitly
/// requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically they
@@ -7188,8 +6885,8 @@
/// If code complete should automatically be trigger on characters not being
/// valid inside an identifier (for example `.` in JavaScript) list them in
/// `triggerCharacters`.
- final List<String> triggerCharacters;
- final bool workDoneProgress;
+ final List<String>? triggerCharacters;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -7361,10 +7058,10 @@
}
/// The scope to get the configuration section for.
- final String scopeUri;
+ final String? scopeUri;
/// The configuration section asked for.
- final String section;
+ final String? section;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -7428,14 +7125,10 @@
static const jsonHandler = LspJsonHandler(
ConfigurationParams.canParse, ConfigurationParams.fromJson);
- ConfigurationParams({@required this.items}) {
- if (items == null) {
- throw 'items is required but was not provided';
- }
- }
+ ConfigurationParams({required this.items});
static ConfigurationParams fromJson(Map<String, dynamic> json) {
final items = json['items']
- ?.map((item) => item != null ? ConfigurationItem.fromJson(item) : null)
+ ?.map((item) => ConfigurationItem.fromJson(item))
?.cast<ConfigurationItem>()
?.toList();
return ConfigurationParams(items: items);
@@ -7445,8 +7138,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['items'] = items?.map((item) => item.toJson())?.toList() ??
- (throw 'items is required but was not set');
+ __result['items'] = items.map((item) => item.toJson()).toList();
return __result;
}
@@ -7507,15 +7199,12 @@
CreateFile(
{this.kind = 'create',
- @required this.uri,
+ required this.uri,
this.options,
this.annotationId}) {
if (kind != 'create') {
throw 'kind may only be the literal \'create\'';
}
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
}
static CreateFile fromJson(Map<String, dynamic> json) {
final kind = json['kind'];
@@ -7530,23 +7219,23 @@
/// An optional annotation identifer describing the operation.
/// @since 3.16.0
- final String annotationId;
+ final String? annotationId;
/// A create
final String kind;
/// Additional options
- final CreateFileOptions options;
+ final CreateFileOptions? options;
/// The resource to create.
final String uri;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['kind'] = kind ?? (throw 'kind is required but was not set');
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
+ __result['kind'] = kind;
+ __result['uri'] = uri;
if (options != null) {
- __result['options'] = options.toJson();
+ __result['options'] = options?.toJson();
}
if (annotationId != null) {
__result['annotationId'] = annotationId;
@@ -7656,10 +7345,10 @@
}
/// Ignore if exists.
- final bool ignoreIfExists;
+ final bool? ignoreIfExists;
/// Overwrite existing file. Overwrite wins over `ignoreIfExists`
- final bool overwrite;
+ final bool? overwrite;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -7728,14 +7417,10 @@
static const jsonHandler =
LspJsonHandler(CreateFilesParams.canParse, CreateFilesParams.fromJson);
- CreateFilesParams({@required this.files}) {
- if (files == null) {
- throw 'files is required but was not provided';
- }
- }
+ CreateFilesParams({required this.files});
static CreateFilesParams fromJson(Map<String, dynamic> json) {
final files = json['files']
- ?.map((item) => item != null ? FileCreate.fromJson(item) : null)
+ ?.map((item) => FileCreate.fromJson(item))
?.cast<FileCreate>()
?.toList();
return CreateFilesParams(files: files);
@@ -7746,8 +7431,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['files'] = files?.map((item) => item.toJson())?.toList() ??
- (throw 'files is required but was not set');
+ __result['files'] = files.map((item) => item.toJson()).toList();
return __result;
}
@@ -7816,10 +7500,10 @@
/// Whether declaration supports dynamic registration. If this is set to
/// `true` the client supports the new `DeclarationRegistrationOptions` return
/// value for the corresponding server capability as well.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// The client supports additional metadata in the form of declaration links.
- final bool linkSupport;
+ final bool? linkSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -7896,7 +7580,7 @@
return DeclarationOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -7955,36 +7639,26 @@
LspJsonHandler(DeclarationParams.canParse, DeclarationParams.fromJson);
DeclarationParams(
- {@required this.textDocument,
- @required this.position,
+ {required this.textDocument,
+ required this.position,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ this.partialResultToken});
static DeclarationParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return DeclarationParams(
textDocument: textDocument,
@@ -7995,7 +7669,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The position inside the text document.
final Position position;
@@ -8004,14 +7678,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -8139,12 +7811,12 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
- final bool workDoneProgress;
+ final String? id;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -8242,11 +7914,11 @@
}
/// Whether definition supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// The client supports additional metadata in the form of definition links.
/// @since 3.14.0
- final bool linkSupport;
+ final bool? linkSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -8323,7 +7995,7 @@
return DefinitionOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -8381,36 +8053,26 @@
LspJsonHandler(DefinitionParams.canParse, DefinitionParams.fromJson);
DefinitionParams(
- {@required this.textDocument,
- @required this.position,
+ {required this.textDocument,
+ required this.position,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ this.partialResultToken});
static DefinitionParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return DefinitionParams(
textDocument: textDocument,
@@ -8421,7 +8083,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The position inside the text document.
final Position position;
@@ -8430,14 +8092,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -8557,8 +8217,8 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
- final bool workDoneProgress;
+ final List<DocumentFilter>? documentSelector;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -8635,15 +8295,12 @@
DeleteFile(
{this.kind = 'delete',
- @required this.uri,
+ required this.uri,
this.options,
this.annotationId}) {
if (kind != 'delete') {
throw 'kind may only be the literal \'delete\'';
}
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
}
static DeleteFile fromJson(Map<String, dynamic> json) {
final kind = json['kind'];
@@ -8658,23 +8315,23 @@
/// An optional annotation identifer describing the operation.
/// @since 3.16.0
- final String annotationId;
+ final String? annotationId;
/// A delete
final String kind;
/// Delete options.
- final DeleteFileOptions options;
+ final DeleteFileOptions? options;
/// The file to delete.
final String uri;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['kind'] = kind ?? (throw 'kind is required but was not set');
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
+ __result['kind'] = kind;
+ __result['uri'] = uri;
if (options != null) {
- __result['options'] = options.toJson();
+ __result['options'] = options?.toJson();
}
if (annotationId != null) {
__result['annotationId'] = annotationId;
@@ -8784,10 +8441,10 @@
}
/// Ignore the operation if the file doesn't exist.
- final bool ignoreIfNotExists;
+ final bool? ignoreIfNotExists;
/// Delete the content recursively if a folder is denoted.
- final bool recursive;
+ final bool? recursive;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -8857,14 +8514,10 @@
static const jsonHandler =
LspJsonHandler(DeleteFilesParams.canParse, DeleteFilesParams.fromJson);
- DeleteFilesParams({@required this.files}) {
- if (files == null) {
- throw 'files is required but was not provided';
- }
- }
+ DeleteFilesParams({required this.files});
static DeleteFilesParams fromJson(Map<String, dynamic> json) {
final files = json['files']
- ?.map((item) => item != null ? FileDelete.fromJson(item) : null)
+ ?.map((item) => FileDelete.fromJson(item))
?.cast<FileDelete>()
?.toList();
return DeleteFilesParams(files: files);
@@ -8875,8 +8528,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['files'] = files?.map((item) => item.toJson())?.toList() ??
- (throw 'files is required but was not set');
+ __result['files'] = files.map((item) => item.toJson()).toList();
return __result;
}
@@ -8934,24 +8586,17 @@
LspJsonHandler(Diagnostic.canParse, Diagnostic.fromJson);
Diagnostic(
- {@required this.range,
+ {required this.range,
this.severity,
this.code,
this.codeDescription,
this.source,
- @required this.message,
+ required this.message,
this.tags,
this.relatedInformation,
- this.data}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (message == null) {
- throw 'message is required but was not provided';
- }
- }
+ this.data});
static Diagnostic fromJson(Map<String, dynamic> json) {
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final severity = json['severity'] != null
? DiagnosticSeverity.fromJson(json['severity'])
: null;
@@ -8984,11 +8629,11 @@
}
/// The diagnostic's code, which might appear in the user interface.
- final String code;
+ final String? code;
/// An optional property to describe the error code.
/// @since 3.16.0
- final CodeDescription codeDescription;
+ final CodeDescription? codeDescription;
/// A data entry field that is preserved between a
/// `textDocument/publishDiagnostics` notification and
@@ -9004,44 +8649,42 @@
/// An array of related diagnostic information, e.g. when symbol-names within
/// a scope collide all definitions can be marked via this property.
- final List<DiagnosticRelatedInformation> relatedInformation;
+ final List<DiagnosticRelatedInformation>? relatedInformation;
/// The diagnostic's severity. Can be omitted. If omitted it is up to the
/// client to interpret diagnostics as error, warning, info or hint.
- final DiagnosticSeverity severity;
+ final DiagnosticSeverity? severity;
/// A human-readable string describing the source of this diagnostic, e.g.
/// 'typescript' or 'super lint'.
- final String source;
+ final String? source;
/// Additional metadata about the diagnostic.
/// @since 3.15.0
- final List<DiagnosticTag> tags;
+ final List<DiagnosticTag>? tags;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
+ __result['range'] = range.toJson();
if (severity != null) {
- __result['severity'] = severity.toJson();
+ __result['severity'] = severity?.toJson();
}
if (code != null) {
__result['code'] = code;
}
if (codeDescription != null) {
- __result['codeDescription'] = codeDescription.toJson();
+ __result['codeDescription'] = codeDescription?.toJson();
}
if (source != null) {
__result['source'] = source;
}
- __result['message'] =
- message ?? (throw 'message is required but was not set');
+ __result['message'] = message;
if (tags != null) {
- __result['tags'] = tags.map((item) => item.toJson()).toList();
+ __result['tags'] = tags?.map((item) => item.toJson()).toList();
}
if (relatedInformation != null) {
__result['relatedInformation'] =
- relatedInformation.map((item) => item.toJson()).toList();
+ relatedInformation?.map((item) => item.toJson()).toList();
}
if (data != null) {
__result['data'] = data;
@@ -9148,15 +8791,6 @@
} finally {
reporter.pop();
}
- reporter.push('data');
- try {
- if (obj['data'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type Diagnostic');
@@ -9214,18 +8848,9 @@
DiagnosticRelatedInformation.canParse,
DiagnosticRelatedInformation.fromJson);
- DiagnosticRelatedInformation(
- {@required this.location, @required this.message}) {
- if (location == null) {
- throw 'location is required but was not provided';
- }
- if (message == null) {
- throw 'message is required but was not provided';
- }
- }
+ DiagnosticRelatedInformation({required this.location, required this.message});
static DiagnosticRelatedInformation fromJson(Map<String, dynamic> json) {
- final location =
- json['location'] != null ? Location.fromJson(json['location']) : null;
+ final location = Location.fromJson(json['location']);
final message = json['message'];
return DiagnosticRelatedInformation(location: location, message: message);
}
@@ -9238,10 +8863,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['location'] =
- location?.toJson() ?? (throw 'location is required but was not set');
- __result['message'] =
- message ?? (throw 'message is required but was not set');
+ __result['location'] = location.toJson();
+ __result['message'] = message;
return __result;
}
@@ -9390,7 +9013,7 @@
}
/// Did change configuration notification supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -9462,19 +9085,6 @@
static bool canParse(Object obj, LspJsonReporter reporter) {
if (obj is Map<String, dynamic>) {
- reporter.push('settings');
- try {
- if (!obj.containsKey('settings')) {
- reporter.reportError('must not be undefined');
- return false;
- }
- if (obj['settings'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type DidChangeConfigurationParams');
@@ -9508,31 +9118,20 @@
DidChangeTextDocumentParams.fromJson);
DidChangeTextDocumentParams(
- {@required this.textDocument, @required this.contentChanges}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (contentChanges == null) {
- throw 'contentChanges is required but was not provided';
- }
- }
+ {required this.textDocument, required this.contentChanges});
static DidChangeTextDocumentParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? VersionedTextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
+ final textDocument =
+ VersionedTextDocumentIdentifier.fromJson(json['textDocument']);
final contentChanges = json['contentChanges']
?.map((item) => TextDocumentContentChangeEvent1.canParse(
item, nullLspJsonReporter)
- ? Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>.t1(
- item != null
- ? TextDocumentContentChangeEvent1.fromJson(item)
- : null)
+ ? Either2<TextDocumentContentChangeEvent1,
+ TextDocumentContentChangeEvent2>.t1(
+ TextDocumentContentChangeEvent1.fromJson(item))
: (TextDocumentContentChangeEvent2.canParse(item, nullLspJsonReporter)
? Either2<TextDocumentContentChangeEvent1,
TextDocumentContentChangeEvent2>.t2(
- item != null
- ? TextDocumentContentChangeEvent2.fromJson(item)
- : null)
+ TextDocumentContentChangeEvent2.fromJson(item))
: (throw '''$item was not one of (TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2)''')))
?.cast<Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>>()
?.toList();
@@ -9563,10 +9162,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['contentChanges'] =
- contentChanges ?? (throw 'contentChanges is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['contentChanges'] = contentChanges;
return __result;
}
@@ -9668,7 +9265,7 @@
/// Did change watched files notification supports dynamic registration.
/// Please note that the current protocol doesn't support static configuration
/// for file changes from the server side.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -9723,14 +9320,10 @@
DidChangeWatchedFilesParams.canParse,
DidChangeWatchedFilesParams.fromJson);
- DidChangeWatchedFilesParams({@required this.changes}) {
- if (changes == null) {
- throw 'changes is required but was not provided';
- }
- }
+ DidChangeWatchedFilesParams({required this.changes});
static DidChangeWatchedFilesParams fromJson(Map<String, dynamic> json) {
final changes = json['changes']
- ?.map((item) => item != null ? FileEvent.fromJson(item) : null)
+ ?.map((item) => FileEvent.fromJson(item))
?.cast<FileEvent>()
?.toList();
return DidChangeWatchedFilesParams(changes: changes);
@@ -9741,8 +9334,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['changes'] = changes?.map((item) => item.toJson())?.toList() ??
- (throw 'changes is required but was not set');
+ __result['changes'] = changes.map((item) => item.toJson()).toList();
return __result;
}
@@ -9802,15 +9394,11 @@
DidChangeWatchedFilesRegistrationOptions.canParse,
DidChangeWatchedFilesRegistrationOptions.fromJson);
- DidChangeWatchedFilesRegistrationOptions({@required this.watchers}) {
- if (watchers == null) {
- throw 'watchers is required but was not provided';
- }
- }
+ DidChangeWatchedFilesRegistrationOptions({required this.watchers});
static DidChangeWatchedFilesRegistrationOptions fromJson(
Map<String, dynamic> json) {
final watchers = json['watchers']
- ?.map((item) => item != null ? FileSystemWatcher.fromJson(item) : null)
+ ?.map((item) => FileSystemWatcher.fromJson(item))
?.cast<FileSystemWatcher>()
?.toList();
return DidChangeWatchedFilesRegistrationOptions(watchers: watchers);
@@ -9821,8 +9409,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['watchers'] = watchers?.map((item) => item.toJson())?.toList() ??
- (throw 'watchers is required but was not set');
+ __result['watchers'] = watchers.map((item) => item.toJson()).toList();
return __result;
}
@@ -9882,15 +9469,9 @@
DidChangeWorkspaceFoldersParams.canParse,
DidChangeWorkspaceFoldersParams.fromJson);
- DidChangeWorkspaceFoldersParams({@required this.event}) {
- if (event == null) {
- throw 'event is required but was not provided';
- }
- }
+ DidChangeWorkspaceFoldersParams({required this.event});
static DidChangeWorkspaceFoldersParams fromJson(Map<String, dynamic> json) {
- final event = json['event'] != null
- ? WorkspaceFoldersChangeEvent.fromJson(json['event'])
- : null;
+ final event = WorkspaceFoldersChangeEvent.fromJson(json['event']);
return DidChangeWorkspaceFoldersParams(event: event);
}
@@ -9899,8 +9480,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['event'] =
- event?.toJson() ?? (throw 'event is required but was not set');
+ __result['event'] = event.toJson();
return __result;
}
@@ -9954,15 +9534,9 @@
static const jsonHandler = LspJsonHandler(
DidCloseTextDocumentParams.canParse, DidCloseTextDocumentParams.fromJson);
- DidCloseTextDocumentParams({@required this.textDocument}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- }
+ DidCloseTextDocumentParams({required this.textDocument});
static DidCloseTextDocumentParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
return DidCloseTextDocumentParams(textDocument: textDocument);
}
@@ -9971,8 +9545,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
return __result;
}
@@ -10026,15 +9599,9 @@
static const jsonHandler = LspJsonHandler(
DidOpenTextDocumentParams.canParse, DidOpenTextDocumentParams.fromJson);
- DidOpenTextDocumentParams({@required this.textDocument}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- }
+ DidOpenTextDocumentParams({required this.textDocument});
static DidOpenTextDocumentParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentItem.fromJson(json['textDocument'])
- : null;
+ final textDocument = TextDocumentItem.fromJson(json['textDocument']);
return DidOpenTextDocumentParams(textDocument: textDocument);
}
@@ -10043,8 +9610,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
return __result;
}
@@ -10098,30 +9664,23 @@
static const jsonHandler = LspJsonHandler(
DidSaveTextDocumentParams.canParse, DidSaveTextDocumentParams.fromJson);
- DidSaveTextDocumentParams({@required this.textDocument, this.text}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- }
+ DidSaveTextDocumentParams({required this.textDocument, this.text});
static DidSaveTextDocumentParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
final text = json['text'];
return DidSaveTextDocumentParams(textDocument: textDocument, text: text);
}
/// Optional the content when saved. Depends on the includeText value when the
/// save notification was requested.
- final String text;
+ final String? text;
/// The document that was saved.
final TextDocumentIdentifier textDocument;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
if (text != null) {
__result['text'] = text;
}
@@ -10197,7 +9756,7 @@
}
/// Whether document color supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -10259,7 +9818,7 @@
return DocumentColorOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -10314,30 +9873,24 @@
DocumentColorParams.canParse, DocumentColorParams.fromJson);
DocumentColorParams(
- {@required this.textDocument,
+ {required this.textDocument,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- }
+ this.partialResultToken});
static DocumentColorParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return DocumentColorParams(
textDocument: textDocument,
@@ -10347,18 +9900,17 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The text document.
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -10468,12 +10020,12 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
- final bool workDoneProgress;
+ final String? id;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -10570,7 +10122,7 @@
}
/// A language id, like `typescript`.
- final String language;
+ final String? language;
/// A glob pattern, like `*.{ts,js}`.
///
@@ -10585,10 +10137,10 @@
/// - `[!...]` to negate a range of characters to match in a path segment
/// (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
/// not `example.0`)
- final String pattern;
+ final String? pattern;
/// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
- final String scheme;
+ final String? scheme;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -10678,7 +10230,7 @@
}
/// Whether formatting supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -10742,7 +10294,7 @@
return DocumentFormattingOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -10796,29 +10348,16 @@
DocumentFormattingParams.canParse, DocumentFormattingParams.fromJson);
DocumentFormattingParams(
- {@required this.textDocument,
- @required this.options,
- this.workDoneToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (options == null) {
- throw 'options is required but was not provided';
- }
- }
+ {required this.textDocument, required this.options, this.workDoneToken});
static DocumentFormattingParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final options = json['options'] != null
- ? FormattingOptions.fromJson(json['options'])
- : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final options = FormattingOptions.fromJson(json['options']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return DocumentFormattingParams(
textDocument: textDocument,
@@ -10833,14 +10372,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['options'] =
- options?.toJson() ?? (throw 'options is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['options'] = options.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -10950,8 +10487,8 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
- final bool workDoneProgress;
+ final List<DocumentFilter>? documentSelector;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -11029,13 +10566,9 @@
static const jsonHandler =
LspJsonHandler(DocumentHighlight.canParse, DocumentHighlight.fromJson);
- DocumentHighlight({@required this.range, this.kind}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- }
+ DocumentHighlight({required this.range, this.kind});
static DocumentHighlight fromJson(Map<String, dynamic> json) {
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final kind = json['kind'] != null
? DocumentHighlightKind.fromJson(json['kind'])
: null;
@@ -11043,17 +10576,16 @@
}
/// The highlight kind, default is DocumentHighlightKind.Text.
- final DocumentHighlightKind kind;
+ final DocumentHighlightKind? kind;
/// The range this highlight applies to.
final Range range;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
+ __result['range'] = range.toJson();
if (kind != null) {
- __result['kind'] = kind.toJson();
+ __result['kind'] = kind?.toJson();
}
return __result;
}
@@ -11128,7 +10660,7 @@
}
/// Whether document highlight supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -11224,7 +10756,7 @@
return DocumentHighlightOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -11283,36 +10815,26 @@
DocumentHighlightParams.canParse, DocumentHighlightParams.fromJson);
DocumentHighlightParams(
- {@required this.textDocument,
- @required this.position,
+ {required this.textDocument,
+ required this.position,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ this.partialResultToken});
static DocumentHighlightParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return DocumentHighlightParams(
textDocument: textDocument,
@@ -11323,7 +10845,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The position inside the text document.
final Position position;
@@ -11332,14 +10854,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -11465,8 +10985,8 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
- final bool workDoneProgress;
+ final List<DocumentFilter>? documentSelector;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -11543,13 +11063,9 @@
static const jsonHandler =
LspJsonHandler(DocumentLink.canParse, DocumentLink.fromJson);
- DocumentLink({@required this.range, this.target, this.tooltip, this.data}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- }
+ DocumentLink({required this.range, this.target, this.tooltip, this.data});
static DocumentLink fromJson(Map<String, dynamic> json) {
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final target = json['target'];
final tooltip = json['tooltip'];
final data = json['data'];
@@ -11565,7 +11081,7 @@
final Range range;
/// The uri this link points to. If missing a resolve request is sent later.
- final String target;
+ final String? target;
/// The tooltip text when you hover over this link.
///
@@ -11574,12 +11090,11 @@
/// specific instructions vary depending on OS, user settings, and
/// localization.
/// @since 3.15.0
- final String tooltip;
+ final String? tooltip;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
+ __result['range'] = range.toJson();
if (target != null) {
__result['target'] = target;
}
@@ -11629,15 +11144,6 @@
} finally {
reporter.pop();
}
- reporter.push('data');
- try {
- if (obj['data'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type DocumentLink');
@@ -11687,11 +11193,11 @@
}
/// Whether document link supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// Whether the client supports the `tooltip` property on `DocumentLink`.
/// @since 3.15.0
- final bool tooltipSupport;
+ final bool? tooltipSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -11771,8 +11277,8 @@
}
/// Document links have a resolve provider as well.
- final bool resolveProvider;
- final bool workDoneProgress;
+ final bool? resolveProvider;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -11843,30 +11349,24 @@
LspJsonHandler(DocumentLinkParams.canParse, DocumentLinkParams.fromJson);
DocumentLinkParams(
- {@required this.textDocument,
+ {required this.textDocument,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- }
+ this.partialResultToken});
static DocumentLinkParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return DocumentLinkParams(
textDocument: textDocument,
@@ -11876,18 +11376,17 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The document to provide document links for.
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -11996,11 +11495,11 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// Document links have a resolve provider as well.
- final bool resolveProvider;
- final bool workDoneProgress;
+ final bool? resolveProvider;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -12099,7 +11598,7 @@
}
/// Whether on type formatting supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -12155,11 +11654,7 @@
DocumentOnTypeFormattingOptions.fromJson);
DocumentOnTypeFormattingOptions(
- {@required this.firstTriggerCharacter, this.moreTriggerCharacter}) {
- if (firstTriggerCharacter == null) {
- throw 'firstTriggerCharacter is required but was not provided';
- }
- }
+ {required this.firstTriggerCharacter, this.moreTriggerCharacter});
static DocumentOnTypeFormattingOptions fromJson(Map<String, dynamic> json) {
if (DocumentOnTypeFormattingRegistrationOptions.canParse(
json, nullLspJsonReporter)) {
@@ -12179,12 +11674,11 @@
final String firstTriggerCharacter;
/// More trigger characters.
- final List<String> moreTriggerCharacter;
+ final List<String>? moreTriggerCharacter;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['firstTriggerCharacter'] = firstTriggerCharacter ??
- (throw 'firstTriggerCharacter is required but was not set');
+ __result['firstTriggerCharacter'] = firstTriggerCharacter;
if (moreTriggerCharacter != null) {
__result['moreTriggerCharacter'] = moreTriggerCharacter;
}
@@ -12260,33 +11754,15 @@
DocumentOnTypeFormattingParams.fromJson);
DocumentOnTypeFormattingParams(
- {@required this.ch,
- @required this.options,
- @required this.textDocument,
- @required this.position}) {
- if (ch == null) {
- throw 'ch is required but was not provided';
- }
- if (options == null) {
- throw 'options is required but was not provided';
- }
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ {required this.ch,
+ required this.options,
+ required this.textDocument,
+ required this.position});
static DocumentOnTypeFormattingParams fromJson(Map<String, dynamic> json) {
final ch = json['ch'];
- final options = json['options'] != null
- ? FormattingOptions.fromJson(json['options'])
- : null;
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
+ final options = FormattingOptions.fromJson(json['options']);
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
return DocumentOnTypeFormattingParams(
ch: ch,
options: options,
@@ -12308,13 +11784,10 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['ch'] = ch ?? (throw 'ch is required but was not set');
- __result['options'] =
- options?.toJson() ?? (throw 'options is required but was not set');
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['ch'] = ch;
+ __result['options'] = options.toJson();
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
return __result;
}
@@ -12433,12 +11906,8 @@
DocumentOnTypeFormattingRegistrationOptions(
{this.documentSelector,
- @required this.firstTriggerCharacter,
- this.moreTriggerCharacter}) {
- if (firstTriggerCharacter == null) {
- throw 'firstTriggerCharacter is required but was not provided';
- }
- }
+ required this.firstTriggerCharacter,
+ this.moreTriggerCharacter});
static DocumentOnTypeFormattingRegistrationOptions fromJson(
Map<String, dynamic> json) {
final documentSelector = json['documentSelector']
@@ -12458,19 +11927,18 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// A character on which formatting should be triggered, like `}`.
final String firstTriggerCharacter;
/// More trigger characters.
- final List<String> moreTriggerCharacter;
+ final List<String>? moreTriggerCharacter;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
__result['documentSelector'] = documentSelector;
- __result['firstTriggerCharacter'] = firstTriggerCharacter ??
- (throw 'firstTriggerCharacter is required but was not set');
+ __result['firstTriggerCharacter'] = firstTriggerCharacter;
if (moreTriggerCharacter != null) {
__result['moreTriggerCharacter'] = moreTriggerCharacter;
}
@@ -12573,7 +12041,7 @@
}
/// Whether formatting supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -12639,7 +12107,7 @@
return DocumentRangeFormattingOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -12695,34 +12163,20 @@
DocumentRangeFormattingParams.fromJson);
DocumentRangeFormattingParams(
- {@required this.textDocument,
- @required this.range,
- @required this.options,
- this.workDoneToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (options == null) {
- throw 'options is required but was not provided';
- }
- }
+ {required this.textDocument,
+ required this.range,
+ required this.options,
+ this.workDoneToken});
static DocumentRangeFormattingParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
- final options = json['options'] != null
- ? FormattingOptions.fromJson(json['options'])
- : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final range = Range.fromJson(json['range']);
+ final options = FormattingOptions.fromJson(json['options']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return DocumentRangeFormattingParams(
textDocument: textDocument,
@@ -12741,16 +12195,13 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['options'] =
- options?.toJson() ?? (throw 'options is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['range'] = range.toJson();
+ __result['options'] = options.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -12879,8 +12330,8 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
- final bool workDoneProgress;
+ final List<DocumentFilter>? documentSelector;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -12960,41 +12411,25 @@
LspJsonHandler(DocumentSymbol.canParse, DocumentSymbol.fromJson);
DocumentSymbol(
- {@required this.name,
+ {required this.name,
this.detail,
- @required this.kind,
+ required this.kind,
this.tags,
this.deprecated,
- @required this.range,
- @required this.selectionRange,
- this.children}) {
- if (name == null) {
- throw 'name is required but was not provided';
- }
- if (kind == null) {
- throw 'kind is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (selectionRange == null) {
- throw 'selectionRange is required but was not provided';
- }
- }
+ required this.range,
+ required this.selectionRange,
+ this.children});
static DocumentSymbol fromJson(Map<String, dynamic> json) {
final name = json['name'];
final detail = json['detail'];
- final kind =
- json['kind'] != null ? SymbolKind.fromJson(json['kind']) : null;
+ final kind = SymbolKind.fromJson(json['kind']);
final tags = json['tags']
?.map((item) => item != null ? SymbolTag.fromJson(item) : null)
?.cast<SymbolTag>()
?.toList();
final deprecated = json['deprecated'];
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
- final selectionRange = json['selectionRange'] != null
- ? Range.fromJson(json['selectionRange'])
- : null;
+ final range = Range.fromJson(json['range']);
+ final selectionRange = Range.fromJson(json['selectionRange']);
final children = json['children']
?.map((item) => item != null ? DocumentSymbol.fromJson(item) : null)
?.cast<DocumentSymbol>()
@@ -13011,14 +12446,14 @@
}
/// Children of this symbol, e.g. properties of a class.
- final List<DocumentSymbol> children;
+ final List<DocumentSymbol>? children;
/// Indicates if this symbol is deprecated.
/// @deprecated Use tags instead
- final bool deprecated;
+ final bool? deprecated;
/// More detail for this symbol, e.g the signature of a function.
- final String detail;
+ final String? detail;
/// The kind of this symbol.
final SymbolKind kind;
@@ -13040,28 +12475,25 @@
/// Tags for this document symbol.
/// @since 3.16.0
- final List<SymbolTag> tags;
+ final List<SymbolTag>? tags;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['name'] = name ?? (throw 'name is required but was not set');
+ __result['name'] = name;
if (detail != null) {
__result['detail'] = detail;
}
- __result['kind'] =
- kind?.toJson() ?? (throw 'kind is required but was not set');
+ __result['kind'] = kind.toJson();
if (tags != null) {
- __result['tags'] = tags.map((item) => item.toJson()).toList();
+ __result['tags'] = tags?.map((item) => item.toJson()).toList();
}
if (deprecated != null) {
__result['deprecated'] = deprecated;
}
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['selectionRange'] = selectionRange?.toJson() ??
- (throw 'selectionRange is required but was not set');
+ __result['range'] = range.toJson();
+ __result['selectionRange'] = selectionRange.toJson();
if (children != null) {
- __result['children'] = children.map((item) => item.toJson()).toList();
+ __result['children'] = children?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -13253,25 +12685,25 @@
}
/// Whether document symbol supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// The client supports hierarchical document symbols.
- final bool hierarchicalDocumentSymbolSupport;
+ final bool? hierarchicalDocumentSymbolSupport;
/// The client supports an additional label presented in the UI when
/// registering a document symbol provider.
/// @since 3.16.0
- final bool labelSupport;
+ final bool? labelSupport;
/// Specific capabilities for the `SymbolKind` in the
/// `textDocument/documentSymbol` request.
- final DocumentSymbolClientCapabilitiesSymbolKind symbolKind;
+ final DocumentSymbolClientCapabilitiesSymbolKind? symbolKind;
/// The client supports tags on `SymbolInformation`. Tags are supported on
/// `DocumentSymbol` if `hierarchicalDocumentSymbolSupport` is set to true.
/// Clients supporting tags have to handle unknown tags gracefully.
/// @since 3.16.0
- final DocumentSymbolClientCapabilitiesTagSupport tagSupport;
+ final DocumentSymbolClientCapabilitiesTagSupport? tagSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -13279,14 +12711,14 @@
__result['dynamicRegistration'] = dynamicRegistration;
}
if (symbolKind != null) {
- __result['symbolKind'] = symbolKind.toJson();
+ __result['symbolKind'] = symbolKind?.toJson();
}
if (hierarchicalDocumentSymbolSupport != null) {
__result['hierarchicalDocumentSymbolSupport'] =
hierarchicalDocumentSymbolSupport;
}
if (tagSupport != null) {
- __result['tagSupport'] = tagSupport.toJson();
+ __result['tagSupport'] = tagSupport?.toJson();
}
if (labelSupport != null) {
__result['labelSupport'] = labelSupport;
@@ -13408,12 +12840,12 @@
///
/// If this property is not present the client only supports the symbol kinds
/// from `File` to `Array` as defined in the initial version of the protocol.
- final List<SymbolKind> valueSet;
+ final List<SymbolKind>? valueSet;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (valueSet != null) {
- __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
+ __result['valueSet'] = valueSet?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -13467,15 +12899,11 @@
DocumentSymbolClientCapabilitiesTagSupport.canParse,
DocumentSymbolClientCapabilitiesTagSupport.fromJson);
- DocumentSymbolClientCapabilitiesTagSupport({@required this.valueSet}) {
- if (valueSet == null) {
- throw 'valueSet is required but was not provided';
- }
- }
+ DocumentSymbolClientCapabilitiesTagSupport({required this.valueSet});
static DocumentSymbolClientCapabilitiesTagSupport fromJson(
Map<String, dynamic> json) {
final valueSet = json['valueSet']
- ?.map((item) => item != null ? SymbolTag.fromJson(item) : null)
+ ?.map((item) => SymbolTag.fromJson(item))
?.cast<SymbolTag>()
?.toList();
return DocumentSymbolClientCapabilitiesTagSupport(valueSet: valueSet);
@@ -13486,8 +12914,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['valueSet'] = valueSet?.map((item) => item.toJson())?.toList() ??
- (throw 'valueSet is required but was not set');
+ __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
return __result;
}
@@ -13560,8 +12987,8 @@
/// A human-readable string that is shown when multiple outlines trees are
/// shown for the same document.
/// @since 3.16.0
- final String label;
- final bool workDoneProgress;
+ final String? label;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -13631,30 +13058,24 @@
DocumentSymbolParams.canParse, DocumentSymbolParams.fromJson);
DocumentSymbolParams(
- {@required this.textDocument,
+ {required this.textDocument,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- }
+ this.partialResultToken});
static DocumentSymbolParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return DocumentSymbolParams(
textDocument: textDocument,
@@ -13664,18 +13085,17 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The text document.
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -13784,13 +13204,13 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// A human-readable string that is shown when multiple outlines trees are
/// shown for the same document.
/// @since 3.16.0
- final String label;
- final bool workDoneProgress;
+ final String? label;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -13940,7 +13360,7 @@
}
/// Execute command supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -13993,11 +13413,7 @@
static const jsonHandler = LspJsonHandler(
ExecuteCommandOptions.canParse, ExecuteCommandOptions.fromJson);
- ExecuteCommandOptions({@required this.commands, this.workDoneProgress}) {
- if (commands == null) {
- throw 'commands is required but was not provided';
- }
- }
+ ExecuteCommandOptions({required this.commands, this.workDoneProgress});
static ExecuteCommandOptions fromJson(Map<String, dynamic> json) {
if (ExecuteCommandRegistrationOptions.canParse(json, nullLspJsonReporter)) {
return ExecuteCommandRegistrationOptions.fromJson(json);
@@ -14011,12 +13427,11 @@
/// The commands to be executed on the server
final List<String> commands;
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['commands'] =
- commands ?? (throw 'commands is required but was not set');
+ __result['commands'] = commands;
if (workDoneProgress != null) {
__result['workDoneProgress'] = workDoneProgress;
}
@@ -14089,39 +13504,34 @@
ExecuteCommandParams.canParse, ExecuteCommandParams.fromJson);
ExecuteCommandParams(
- {@required this.command, this.arguments, this.workDoneToken}) {
- if (command == null) {
- throw 'command is required but was not provided';
- }
- }
+ {required this.command, this.arguments, this.workDoneToken});
static ExecuteCommandParams fromJson(Map<String, dynamic> json) {
final command = json['command'];
final arguments =
json['arguments']?.map((item) => item)?.cast<dynamic>()?.toList();
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return ExecuteCommandParams(
command: command, arguments: arguments, workDoneToken: workDoneToken);
}
/// Arguments that the command should be invoked with.
- final List<dynamic> arguments;
+ final List<dynamic>? arguments;
/// The identifier of the actual command handler.
final String command;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['command'] =
- command ?? (throw 'command is required but was not set');
+ __result['command'] = command;
if (arguments != null) {
__result['arguments'] = arguments;
}
@@ -14213,11 +13623,7 @@
ExecuteCommandRegistrationOptions.fromJson);
ExecuteCommandRegistrationOptions(
- {@required this.commands, this.workDoneProgress}) {
- if (commands == null) {
- throw 'commands is required but was not provided';
- }
- }
+ {required this.commands, this.workDoneProgress});
static ExecuteCommandRegistrationOptions fromJson(Map<String, dynamic> json) {
final commands =
json['commands']?.map((item) => item)?.cast<String>()?.toList();
@@ -14228,12 +13634,11 @@
/// The commands to be executed on the server
final List<String> commands;
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['commands'] =
- commands ?? (throw 'commands is required but was not set');
+ __result['commands'] = commands;
if (workDoneProgress != null) {
__result['workDoneProgress'] = workDoneProgress;
}
@@ -14385,11 +13790,7 @@
static const jsonHandler =
LspJsonHandler(FileCreate.canParse, FileCreate.fromJson);
- FileCreate({@required this.uri}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- }
+ FileCreate({required this.uri});
static FileCreate fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
return FileCreate(uri: uri);
@@ -14400,7 +13801,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
+ __result['uri'] = uri;
return __result;
}
@@ -14455,11 +13856,7 @@
static const jsonHandler =
LspJsonHandler(FileDelete.canParse, FileDelete.fromJson);
- FileDelete({@required this.uri}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- }
+ FileDelete({required this.uri});
static FileDelete fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
return FileDelete(uri: uri);
@@ -14470,7 +13867,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
+ __result['uri'] = uri;
return __result;
}
@@ -14524,14 +13921,7 @@
static const jsonHandler =
LspJsonHandler(FileEvent.canParse, FileEvent.fromJson);
- FileEvent({@required this.uri, @required this.type}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- if (type == null) {
- throw 'type is required but was not provided';
- }
- }
+ FileEvent({required this.uri, required this.type});
static FileEvent fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
final type = json['type'];
@@ -14546,8 +13936,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
- __result['type'] = type ?? (throw 'type is required but was not set');
+ __result['uri'] = uri;
+ __result['type'] = type;
return __result;
}
@@ -14621,16 +14011,10 @@
static const jsonHandler = LspJsonHandler(
FileOperationFilter.canParse, FileOperationFilter.fromJson);
- FileOperationFilter({this.scheme, @required this.pattern}) {
- if (pattern == null) {
- throw 'pattern is required but was not provided';
- }
- }
+ FileOperationFilter({this.scheme, required this.pattern});
static FileOperationFilter fromJson(Map<String, dynamic> json) {
final scheme = json['scheme'];
- final pattern = json['pattern'] != null
- ? FileOperationPattern.fromJson(json['pattern'])
- : null;
+ final pattern = FileOperationPattern.fromJson(json['pattern']);
return FileOperationFilter(scheme: scheme, pattern: pattern);
}
@@ -14638,15 +14022,14 @@
final FileOperationPattern pattern;
/// A Uri like `file` or `untitled`.
- final String scheme;
+ final String? scheme;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (scheme != null) {
__result['scheme'] = scheme;
}
- __result['pattern'] =
- pattern?.toJson() ?? (throw 'pattern is required but was not set');
+ __result['pattern'] = pattern.toJson();
return __result;
}
@@ -14713,11 +14096,7 @@
static const jsonHandler = LspJsonHandler(
FileOperationPattern.canParse, FileOperationPattern.fromJson);
- FileOperationPattern({@required this.glob, this.matches, this.options}) {
- if (glob == null) {
- throw 'glob is required but was not provided';
- }
- }
+ FileOperationPattern({required this.glob, this.matches, this.options});
static FileOperationPattern fromJson(Map<String, dynamic> json) {
final glob = json['glob'];
final matches = json['matches'] != null
@@ -14745,19 +14124,19 @@
/// Whether to match files or folders with this pattern.
///
/// Matches both if undefined.
- final FileOperationPatternKind matches;
+ final FileOperationPatternKind? matches;
/// Additional options used during matching.
- final FileOperationPatternOptions options;
+ final FileOperationPatternOptions? options;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['glob'] = glob ?? (throw 'glob is required but was not set');
+ __result['glob'] = glob;
if (matches != null) {
- __result['matches'] = matches.toJson();
+ __result['matches'] = matches?.toJson();
}
if (options != null) {
- __result['options'] = options.toJson();
+ __result['options'] = options?.toJson();
}
return __result;
}
@@ -14877,7 +14256,7 @@
}
/// The pattern should be matched ignoring casing.
- final bool ignoreCase;
+ final bool? ignoreCase;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -14932,15 +14311,10 @@
FileOperationRegistrationOptions.canParse,
FileOperationRegistrationOptions.fromJson);
- FileOperationRegistrationOptions({@required this.filters}) {
- if (filters == null) {
- throw 'filters is required but was not provided';
- }
- }
+ FileOperationRegistrationOptions({required this.filters});
static FileOperationRegistrationOptions fromJson(Map<String, dynamic> json) {
final filters = json['filters']
- ?.map(
- (item) => item != null ? FileOperationFilter.fromJson(item) : null)
+ ?.map((item) => FileOperationFilter.fromJson(item))
?.cast<FileOperationFilter>()
?.toList();
return FileOperationRegistrationOptions(filters: filters);
@@ -14951,8 +14325,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['filters'] = filters?.map((item) => item.toJson())?.toList() ??
- (throw 'filters is required but was not set');
+ __result['filters'] = filters.map((item) => item.toJson()).toList();
return __result;
}
@@ -15012,14 +14385,7 @@
static const jsonHandler =
LspJsonHandler(FileRename.canParse, FileRename.fromJson);
- FileRename({@required this.oldUri, @required this.newUri}) {
- if (oldUri == null) {
- throw 'oldUri is required but was not provided';
- }
- if (newUri == null) {
- throw 'newUri is required but was not provided';
- }
- }
+ FileRename({required this.oldUri, required this.newUri});
static FileRename fromJson(Map<String, dynamic> json) {
final oldUri = json['oldUri'];
final newUri = json['newUri'];
@@ -15034,8 +14400,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['oldUri'] = oldUri ?? (throw 'oldUri is required but was not set');
- __result['newUri'] = newUri ?? (throw 'newUri is required but was not set');
+ __result['oldUri'] = oldUri;
+ __result['newUri'] = newUri;
return __result;
}
@@ -15106,11 +14472,7 @@
static const jsonHandler =
LspJsonHandler(FileSystemWatcher.canParse, FileSystemWatcher.fromJson);
- FileSystemWatcher({@required this.globPattern, this.kind}) {
- if (globPattern == null) {
- throw 'globPattern is required but was not provided';
- }
- }
+ FileSystemWatcher({required this.globPattern, this.kind});
static FileSystemWatcher fromJson(Map<String, dynamic> json) {
final globPattern = json['globPattern'];
final kind = json['kind'] != null ? WatchKind.fromJson(json['kind']) : null;
@@ -15134,14 +14496,13 @@
/// The kind of events of interest. If omitted it defaults to WatchKind.Create
/// | WatchKind.Change | WatchKind.Delete which is 7.
- final WatchKind kind;
+ final WatchKind? kind;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['globPattern'] =
- globPattern ?? (throw 'globPattern is required but was not set');
+ __result['globPattern'] = globPattern;
if (kind != null) {
- __result['kind'] = kind.toJson();
+ __result['kind'] = kind?.toJson();
}
return __result;
}
@@ -15210,18 +14571,11 @@
LspJsonHandler(FoldingRange.canParse, FoldingRange.fromJson);
FoldingRange(
- {@required this.startLine,
+ {required this.startLine,
this.startCharacter,
- @required this.endLine,
+ required this.endLine,
this.endCharacter,
- this.kind}) {
- if (startLine == null) {
- throw 'startLine is required but was not provided';
- }
- if (endLine == null) {
- throw 'endLine is required but was not provided';
- }
- }
+ this.kind});
static FoldingRange fromJson(Map<String, dynamic> json) {
final startLine = json['startLine'];
final startCharacter = json['startCharacter'];
@@ -15239,7 +14593,7 @@
/// The zero-based character offset before the folded range ends. If not
/// defined, defaults to the length of the end line.
- final num endCharacter;
+ final num? endCharacter;
/// The zero-based end line of the range to fold. The folded area ends with
/// the line's last character. To be valid, the end must be zero or larger and
@@ -15250,11 +14604,11 @@
/// kind is used to categorize folding ranges and used by commands like 'Fold
/// all comments'. See [FoldingRangeKind] for an enumeration of standardized
/// kinds.
- final FoldingRangeKind kind;
+ final FoldingRangeKind? kind;
/// The zero-based character offset from where the folded range starts. If not
/// defined, defaults to the length of the start line.
- final num startCharacter;
+ final num? startCharacter;
/// The zero-based start line of the range to fold. The folded area starts
/// after the line's last character. To be valid, the end must be zero or
@@ -15263,18 +14617,16 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['startLine'] =
- startLine ?? (throw 'startLine is required but was not set');
+ __result['startLine'] = startLine;
if (startCharacter != null) {
__result['startCharacter'] = startCharacter;
}
- __result['endLine'] =
- endLine ?? (throw 'endLine is required but was not set');
+ __result['endLine'] = endLine;
if (endCharacter != null) {
__result['endCharacter'] = endCharacter;
}
if (kind != null) {
- __result['kind'] = kind.toJson();
+ __result['kind'] = kind?.toJson();
}
return __result;
}
@@ -15399,17 +14751,17 @@
/// providers. If this is set to `true` the client supports the new
/// `FoldingRangeRegistrationOptions` return value for the corresponding
/// server capability as well.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// If set, the client signals that it only supports folding complete lines.
/// If set, client will ignore specified `startCharacter` and `endCharacter`
/// properties in a FoldingRange.
- final bool lineFoldingOnly;
+ final bool? lineFoldingOnly;
/// The maximum number of folding ranges that the client prefers to receive
/// per document. The value serves as a hint, servers are free to follow the
/// limit.
- final num rangeLimit;
+ final num? rangeLimit;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -15532,7 +14884,7 @@
return FoldingRangeOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -15587,30 +14939,24 @@
LspJsonHandler(FoldingRangeParams.canParse, FoldingRangeParams.fromJson);
FoldingRangeParams(
- {@required this.textDocument,
+ {required this.textDocument,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- }
+ this.partialResultToken});
static FoldingRangeParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return FoldingRangeParams(
textDocument: textDocument,
@@ -15620,18 +14966,17 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The text document.
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -15741,12 +15086,12 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
- final bool workDoneProgress;
+ final String? id;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -15836,18 +15181,11 @@
LspJsonHandler(FormattingOptions.canParse, FormattingOptions.fromJson);
FormattingOptions(
- {@required this.tabSize,
- @required this.insertSpaces,
+ {required this.tabSize,
+ required this.insertSpaces,
this.trimTrailingWhitespace,
this.insertFinalNewline,
- this.trimFinalNewlines}) {
- if (tabSize == null) {
- throw 'tabSize is required but was not provided';
- }
- if (insertSpaces == null) {
- throw 'insertSpaces is required but was not provided';
- }
- }
+ this.trimFinalNewlines});
static FormattingOptions fromJson(Map<String, dynamic> json) {
final tabSize = json['tabSize'];
final insertSpaces = json['insertSpaces'];
@@ -15864,7 +15202,7 @@
/// Insert a newline character at the end of the file if one does not exist.
/// @since 3.15.0
- final bool insertFinalNewline;
+ final bool? insertFinalNewline;
/// Prefer spaces over tabs.
final bool insertSpaces;
@@ -15874,18 +15212,16 @@
/// Trim all newlines after the final newline at the end of the file.
/// @since 3.15.0
- final bool trimFinalNewlines;
+ final bool? trimFinalNewlines;
/// Trim trailing whitespace on a line.
/// @since 3.15.0
- final bool trimTrailingWhitespace;
+ final bool? trimTrailingWhitespace;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['tabSize'] =
- tabSize ?? (throw 'tabSize is required but was not set');
- __result['insertSpaces'] =
- insertSpaces ?? (throw 'insertSpaces is required but was not set');
+ __result['tabSize'] = tabSize;
+ __result['insertSpaces'] = insertSpaces;
if (trimTrailingWhitespace != null) {
__result['trimTrailingWhitespace'] = trimTrailingWhitespace;
}
@@ -16003,18 +15339,13 @@
class Hover implements ToJsonable {
static const jsonHandler = LspJsonHandler(Hover.canParse, Hover.fromJson);
- Hover({@required this.contents, this.range}) {
- if (contents == null) {
- throw 'contents is required but was not provided';
- }
- }
+ Hover({required this.contents, this.range});
static Hover fromJson(Map<String, dynamic> json) {
final contents = json['contents'] is String
? Either2<String, MarkupContent>.t1(json['contents'])
: (MarkupContent.canParse(json['contents'], nullLspJsonReporter)
- ? Either2<String, MarkupContent>.t2(json['contents'] != null
- ? MarkupContent.fromJson(json['contents'])
- : null)
+ ? Either2<String, MarkupContent>.t2(
+ MarkupContent.fromJson(json['contents']))
: (throw '''${json['contents']} was not one of (String, MarkupContent)'''));
final range = json['range'] != null ? Range.fromJson(json['range']) : null;
return Hover(contents: contents, range: range);
@@ -16025,14 +15356,13 @@
/// An optional range is a range inside a text document that is used to
/// visualize a hover, e.g. by changing the background color.
- final Range range;
+ final Range? range;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['contents'] =
- contents ?? (throw 'contents is required but was not set');
+ __result['contents'] = contents;
if (range != null) {
- __result['range'] = range.toJson();
+ __result['range'] = range?.toJson();
}
return __result;
}
@@ -16112,10 +15442,10 @@
/// Client supports the follow content formats if the content property refers
/// to a `literal of type MarkupContent`. The order describes the preferred
/// format of the client.
- final List<MarkupKind> contentFormat;
+ final List<MarkupKind>? contentFormat;
/// Whether hover supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -16124,7 +15454,7 @@
}
if (contentFormat != null) {
__result['contentFormat'] =
- contentFormat.map((item) => item.toJson()).toList();
+ contentFormat?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -16197,7 +15527,7 @@
return HoverOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -16251,28 +15581,16 @@
LspJsonHandler(HoverParams.canParse, HoverParams.fromJson);
HoverParams(
- {@required this.textDocument,
- @required this.position,
- this.workDoneToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ {required this.textDocument, required this.position, this.workDoneToken});
static HoverParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return HoverParams(
textDocument: textDocument,
@@ -16287,14 +15605,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -16397,8 +15713,8 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
- final bool workDoneProgress;
+ final List<DocumentFilter>? documentSelector;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -16485,11 +15801,11 @@
/// Whether implementation supports dynamic registration. If this is set to
/// `true` the client supports the new `ImplementationRegistrationOptions`
/// return value for the corresponding server capability as well.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// The client supports additional metadata in the form of definition links.
/// @since 3.14.0
- final bool linkSupport;
+ final bool? linkSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -16566,7 +15882,7 @@
return ImplementationOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -16625,36 +15941,26 @@
ImplementationParams.canParse, ImplementationParams.fromJson);
ImplementationParams(
- {@required this.textDocument,
- @required this.position,
+ {required this.textDocument,
+ required this.position,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ this.partialResultToken});
static ImplementationParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return ImplementationParams(
textDocument: textDocument,
@@ -16665,7 +15971,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The position inside the text document.
final Position position;
@@ -16674,14 +15980,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -16810,12 +16114,12 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
- final bool workDoneProgress;
+ final String? id;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -16910,14 +16214,10 @@
this.rootPath,
this.rootUri,
this.initializationOptions,
- @required this.capabilities,
+ required this.capabilities,
this.trace,
this.workspaceFolders,
- this.workDoneToken}) {
- if (capabilities == null) {
- throw 'capabilities is required but was not provided';
- }
- }
+ this.workDoneToken});
static InitializeParams fromJson(Map<String, dynamic> json) {
final processId = json['processId'];
final clientInfo = json['clientInfo'] != null
@@ -16927,9 +16227,7 @@
final rootPath = json['rootPath'];
final rootUri = json['rootUri'];
final initializationOptions = json['initializationOptions'];
- final capabilities = json['capabilities'] != null
- ? ClientCapabilities.fromJson(json['capabilities'])
- : null;
+ final capabilities = ClientCapabilities.fromJson(json['capabilities']);
final trace = const {null, 'off', 'message', 'verbose'}
.contains(json['trace'])
? json['trace']
@@ -16938,12 +16236,12 @@
?.map((item) => item != null ? WorkspaceFolder.fromJson(item) : null)
?.cast<WorkspaceFolder>()
?.toList();
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return InitializeParams(
processId: processId,
@@ -16963,7 +16261,7 @@
/// Information about the client
/// @since 3.15.0
- final InitializeParamsClientInfo clientInfo;
+ final InitializeParamsClientInfo? clientInfo;
/// User provided initialization options.
final dynamic initializationOptions;
@@ -16974,41 +16272,41 @@
/// Uses IETF language tags as the value's syntax (See
/// https://en.wikipedia.org/wiki/IETF_language_tag)
/// @since 3.16.0
- final String locale;
+ final String? locale;
/// The process Id of the parent process that started the server. Is null if
/// the process has not been started by another process. If the parent process
/// is not alive then the server should exit (see exit notification) its
/// process.
- final num processId;
+ final num? processId;
/// The rootPath of the workspace. Is null if no folder is open.
/// @deprecated in favour of `rootUri`.
- final String rootPath;
+ final String? rootPath;
/// The rootUri of the workspace. Is null if no folder is open. If both
/// `rootPath` and `rootUri` are set `rootUri` wins.
/// @deprecated in favour of `workspaceFolders`
- final String rootUri;
+ final String? rootUri;
/// The initial trace setting. If omitted trace is disabled ('off').
- final String trace;
+ final String? trace;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
/// The workspace folders configured in the client when the server starts.
/// This property is only available if the client supports workspace folders.
/// It can be `null` if the client supports workspace folders but none are
/// configured.
/// @since 3.6.0
- final List<WorkspaceFolder> workspaceFolders;
+ final List<WorkspaceFolder>? workspaceFolders;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
__result['processId'] = processId;
if (clientInfo != null) {
- __result['clientInfo'] = clientInfo.toJson();
+ __result['clientInfo'] = clientInfo?.toJson();
}
if (locale != null) {
__result['locale'] = locale;
@@ -17020,14 +16318,13 @@
if (initializationOptions != null) {
__result['initializationOptions'] = initializationOptions;
}
- __result['capabilities'] = capabilities?.toJson() ??
- (throw 'capabilities is required but was not set');
+ __result['capabilities'] = capabilities.toJson();
if (trace != null) {
__result['trace'] = trace;
}
if (workspaceFolders != null) {
__result['workspaceFolders'] =
- workspaceFolders.map((item) => item.toJson()).toList();
+ workspaceFolders?.map((item) => item.toJson()).toList();
}
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
@@ -17092,15 +16389,6 @@
} finally {
reporter.pop();
}
- reporter.push('initializationOptions');
- try {
- if (obj['initializationOptions'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
reporter.push('capabilities');
try {
if (!obj.containsKey('capabilities')) {
@@ -17203,11 +16491,7 @@
static const jsonHandler = LspJsonHandler(
InitializeParamsClientInfo.canParse, InitializeParamsClientInfo.fromJson);
- InitializeParamsClientInfo({@required this.name, this.version}) {
- if (name == null) {
- throw 'name is required but was not provided';
- }
- }
+ InitializeParamsClientInfo({required this.name, this.version});
static InitializeParamsClientInfo fromJson(Map<String, dynamic> json) {
final name = json['name'];
final version = json['version'];
@@ -17218,11 +16502,11 @@
final String name;
/// The client's version as defined by the client.
- final String version;
+ final String? version;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['name'] = name ?? (throw 'name is required but was not set');
+ __result['name'] = name;
if (version != null) {
__result['version'] = version;
}
@@ -17289,15 +16573,9 @@
static const jsonHandler =
LspJsonHandler(InitializeResult.canParse, InitializeResult.fromJson);
- InitializeResult({@required this.capabilities, this.serverInfo}) {
- if (capabilities == null) {
- throw 'capabilities is required but was not provided';
- }
- }
+ InitializeResult({required this.capabilities, this.serverInfo});
static InitializeResult fromJson(Map<String, dynamic> json) {
- final capabilities = json['capabilities'] != null
- ? ServerCapabilities.fromJson(json['capabilities'])
- : null;
+ final capabilities = ServerCapabilities.fromJson(json['capabilities']);
final serverInfo = json['serverInfo'] != null
? InitializeResultServerInfo.fromJson(json['serverInfo'])
: null;
@@ -17309,14 +16587,13 @@
/// Information about the server.
/// @since 3.15.0
- final InitializeResultServerInfo serverInfo;
+ final InitializeResultServerInfo? serverInfo;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['capabilities'] = capabilities?.toJson() ??
- (throw 'capabilities is required but was not set');
+ __result['capabilities'] = capabilities.toJson();
if (serverInfo != null) {
- __result['serverInfo'] = serverInfo.toJson();
+ __result['serverInfo'] = serverInfo?.toJson();
}
return __result;
}
@@ -17384,11 +16661,7 @@
static const jsonHandler = LspJsonHandler(
InitializeResultServerInfo.canParse, InitializeResultServerInfo.fromJson);
- InitializeResultServerInfo({@required this.name, this.version}) {
- if (name == null) {
- throw 'name is required but was not provided';
- }
- }
+ InitializeResultServerInfo({required this.name, this.version});
static InitializeResultServerInfo fromJson(Map<String, dynamic> json) {
final name = json['name'];
final version = json['version'];
@@ -17399,11 +16672,11 @@
final String name;
/// The server's version as defined by the server.
- final String version;
+ final String? version;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['name'] = name ?? (throw 'name is required but was not set');
+ __result['name'] = name;
if (version != null) {
__result['version'] = version;
}
@@ -17513,23 +16786,11 @@
LspJsonHandler(InsertReplaceEdit.canParse, InsertReplaceEdit.fromJson);
InsertReplaceEdit(
- {@required this.newText, @required this.insert, @required this.replace}) {
- if (newText == null) {
- throw 'newText is required but was not provided';
- }
- if (insert == null) {
- throw 'insert is required but was not provided';
- }
- if (replace == null) {
- throw 'replace is required but was not provided';
- }
- }
+ {required this.newText, required this.insert, required this.replace});
static InsertReplaceEdit fromJson(Map<String, dynamic> json) {
final newText = json['newText'];
- final insert =
- json['insert'] != null ? Range.fromJson(json['insert']) : null;
- final replace =
- json['replace'] != null ? Range.fromJson(json['replace']) : null;
+ final insert = Range.fromJson(json['insert']);
+ final replace = Range.fromJson(json['replace']);
return InsertReplaceEdit(
newText: newText, insert: insert, replace: replace);
}
@@ -17545,12 +16806,9 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['newText'] =
- newText ?? (throw 'newText is required but was not set');
- __result['insert'] =
- insert?.toJson() ?? (throw 'insert is required but was not set');
- __result['replace'] =
- replace?.toJson() ?? (throw 'replace is required but was not set');
+ __result['newText'] = newText;
+ __result['insert'] = insert.toJson();
+ __result['replace'] = replace.toJson();
return __result;
}
@@ -17731,7 +16989,7 @@
/// `true` the client supports the new `(TextDocumentRegistrationOptions &
/// StaticRegistrationOptions)` return value for the corresponding server
/// capability as well.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -17795,7 +17053,7 @@
return LinkedEditingRangeOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -17850,28 +17108,16 @@
LinkedEditingRangeParams.canParse, LinkedEditingRangeParams.fromJson);
LinkedEditingRangeParams(
- {@required this.textDocument,
- @required this.position,
- this.workDoneToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ {required this.textDocument, required this.position, this.workDoneToken});
static LinkedEditingRangeParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return LinkedEditingRangeParams(
textDocument: textDocument,
@@ -17886,14 +17132,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -18007,12 +17251,12 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
- final bool workDoneProgress;
+ final String? id;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -18101,14 +17345,10 @@
static const jsonHandler = LspJsonHandler(
LinkedEditingRanges.canParse, LinkedEditingRanges.fromJson);
- LinkedEditingRanges({@required this.ranges, this.wordPattern}) {
- if (ranges == null) {
- throw 'ranges is required but was not provided';
- }
- }
+ LinkedEditingRanges({required this.ranges, this.wordPattern});
static LinkedEditingRanges fromJson(Map<String, dynamic> json) {
final ranges = json['ranges']
- ?.map((item) => item != null ? Range.fromJson(item) : null)
+ ?.map((item) => Range.fromJson(item))
?.cast<Range>()
?.toList();
final wordPattern = json['wordPattern'];
@@ -18123,12 +17363,11 @@
/// An optional word pattern (regular expression) that describes valid
/// contents for the given ranges. If no pattern is provided, the client
/// configuration's word pattern will be used.
- final String wordPattern;
+ final String? wordPattern;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['ranges'] = ranges?.map((item) => item.toJson())?.toList() ??
- (throw 'ranges is required but was not set');
+ __result['ranges'] = ranges.map((item) => item.toJson()).toList();
if (wordPattern != null) {
__result['wordPattern'] = wordPattern;
}
@@ -18198,17 +17437,10 @@
static const jsonHandler =
LspJsonHandler(Location.canParse, Location.fromJson);
- Location({@required this.uri, @required this.range}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- }
+ Location({required this.uri, required this.range});
static Location fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
return Location(uri: uri, range: range);
}
@@ -18217,9 +17449,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
+ __result['uri'] = uri;
+ __result['range'] = range.toJson();
return __result;
}
@@ -18292,30 +17523,16 @@
LocationLink(
{this.originSelectionRange,
- @required this.targetUri,
- @required this.targetRange,
- @required this.targetSelectionRange}) {
- if (targetUri == null) {
- throw 'targetUri is required but was not provided';
- }
- if (targetRange == null) {
- throw 'targetRange is required but was not provided';
- }
- if (targetSelectionRange == null) {
- throw 'targetSelectionRange is required but was not provided';
- }
- }
+ required this.targetUri,
+ required this.targetRange,
+ required this.targetSelectionRange});
static LocationLink fromJson(Map<String, dynamic> json) {
final originSelectionRange = json['originSelectionRange'] != null
? Range.fromJson(json['originSelectionRange'])
: null;
final targetUri = json['targetUri'];
- final targetRange = json['targetRange'] != null
- ? Range.fromJson(json['targetRange'])
- : null;
- final targetSelectionRange = json['targetSelectionRange'] != null
- ? Range.fromJson(json['targetSelectionRange'])
- : null;
+ final targetRange = Range.fromJson(json['targetRange']);
+ final targetSelectionRange = Range.fromJson(json['targetSelectionRange']);
return LocationLink(
originSelectionRange: originSelectionRange,
targetUri: targetUri,
@@ -18327,7 +17544,7 @@
///
/// Used as the underlined span for mouse interaction. Defaults to the word
/// range at the mouse position.
- final Range originSelectionRange;
+ final Range? originSelectionRange;
/// The full target range of this link. If the target for example is a symbol
/// then target range is the range enclosing this symbol not including
@@ -18346,14 +17563,11 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (originSelectionRange != null) {
- __result['originSelectionRange'] = originSelectionRange.toJson();
+ __result['originSelectionRange'] = originSelectionRange?.toJson();
}
- __result['targetUri'] =
- targetUri ?? (throw 'targetUri is required but was not set');
- __result['targetRange'] = targetRange?.toJson() ??
- (throw 'targetRange is required but was not set');
- __result['targetSelectionRange'] = targetSelectionRange?.toJson() ??
- (throw 'targetSelectionRange is required but was not set');
+ __result['targetUri'] = targetUri;
+ __result['targetRange'] = targetRange.toJson();
+ __result['targetSelectionRange'] = targetSelectionRange.toJson();
return __result;
}
@@ -18457,17 +17671,9 @@
static const jsonHandler =
LspJsonHandler(LogMessageParams.canParse, LogMessageParams.fromJson);
- LogMessageParams({@required this.type, @required this.message}) {
- if (type == null) {
- throw 'type is required but was not provided';
- }
- if (message == null) {
- throw 'message is required but was not provided';
- }
- }
+ LogMessageParams({required this.type, required this.message});
static LogMessageParams fromJson(Map<String, dynamic> json) {
- final type =
- json['type'] != null ? MessageType.fromJson(json['type']) : null;
+ final type = MessageType.fromJson(json['type']);
final message = json['message'];
return LogMessageParams(type: type, message: message);
}
@@ -18480,10 +17686,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['type'] =
- type?.toJson() ?? (throw 'type is required but was not set');
- __result['message'] =
- message ?? (throw 'message is required but was not set');
+ __result['type'] = type.toJson();
+ __result['message'] = message;
return __result;
}
@@ -18554,11 +17758,7 @@
static const jsonHandler =
LspJsonHandler(LogTraceParams.canParse, LogTraceParams.fromJson);
- LogTraceParams({@required this.message, this.verbose}) {
- if (message == null) {
- throw 'message is required but was not provided';
- }
- }
+ LogTraceParams({required this.message, this.verbose});
static LogTraceParams fromJson(Map<String, dynamic> json) {
final message = json['message'];
final verbose = json['verbose'];
@@ -18570,12 +17770,11 @@
/// Additional information that can be computed if the `trace` configuration
/// is set to `'verbose'`
- final String verbose;
+ final String? verbose;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['message'] =
- message ?? (throw 'message is required but was not set');
+ __result['message'] = message;
if (verbose != null) {
__result['verbose'] = verbose;
}
@@ -18643,11 +17842,7 @@
static const jsonHandler = LspJsonHandler(
MarkdownClientCapabilities.canParse, MarkdownClientCapabilities.fromJson);
- MarkdownClientCapabilities({@required this.parser, this.version}) {
- if (parser == null) {
- throw 'parser is required but was not provided';
- }
- }
+ MarkdownClientCapabilities({required this.parser, this.version});
static MarkdownClientCapabilities fromJson(Map<String, dynamic> json) {
final parser = json['parser'];
final version = json['version'];
@@ -18658,11 +17853,11 @@
final String parser;
/// The version of the parser.
- final String version;
+ final String? version;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['parser'] = parser ?? (throw 'parser is required but was not set');
+ __result['parser'] = parser;
if (version != null) {
__result['version'] = version;
}
@@ -18750,17 +17945,9 @@
static const jsonHandler =
LspJsonHandler(MarkupContent.canParse, MarkupContent.fromJson);
- MarkupContent({@required this.kind, @required this.value}) {
- if (kind == null) {
- throw 'kind is required but was not provided';
- }
- if (value == null) {
- throw 'value is required but was not provided';
- }
- }
+ MarkupContent({required this.kind, required this.value});
static MarkupContent fromJson(Map<String, dynamic> json) {
- final kind =
- json['kind'] != null ? MarkupKind.fromJson(json['kind']) : null;
+ final kind = MarkupKind.fromJson(json['kind']);
final value = json['value'];
return MarkupContent(kind: kind, value: value);
}
@@ -18773,9 +17960,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['kind'] =
- kind?.toJson() ?? (throw 'kind is required but was not set');
- __result['value'] = value ?? (throw 'value is required but was not set');
+ __result['kind'] = kind.toJson();
+ __result['value'] = value;
return __result;
}
@@ -18882,11 +18068,7 @@
class Message implements ToJsonable {
static const jsonHandler = LspJsonHandler(Message.canParse, Message.fromJson);
- Message({@required this.jsonrpc}) {
- if (jsonrpc == null) {
- throw 'jsonrpc is required but was not provided';
- }
- }
+ Message({required this.jsonrpc});
static Message fromJson(Map<String, dynamic> json) {
if (RequestMessage.canParse(json, nullLspJsonReporter)) {
return RequestMessage.fromJson(json);
@@ -18905,8 +18087,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['jsonrpc'] =
- jsonrpc ?? (throw 'jsonrpc is required but was not set');
+ __result['jsonrpc'] = jsonrpc;
return __result;
}
@@ -18959,11 +18140,7 @@
static const jsonHandler =
LspJsonHandler(MessageActionItem.canParse, MessageActionItem.fromJson);
- MessageActionItem({@required this.title}) {
- if (title == null) {
- throw 'title is required but was not provided';
- }
- }
+ MessageActionItem({required this.title});
static MessageActionItem fromJson(Map<String, dynamic> json) {
final title = json['title'];
return MessageActionItem(title: title);
@@ -18974,7 +18151,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['title'] = title ?? (throw 'title is required but was not set');
+ __result['title'] = title;
return __result;
}
@@ -19334,26 +18511,14 @@
static const jsonHandler = LspJsonHandler(Moniker.canParse, Moniker.fromJson);
Moniker(
- {@required this.scheme,
- @required this.identifier,
- @required this.unique,
- this.kind}) {
- if (scheme == null) {
- throw 'scheme is required but was not provided';
- }
- if (identifier == null) {
- throw 'identifier is required but was not provided';
- }
- if (unique == null) {
- throw 'unique is required but was not provided';
- }
- }
+ {required this.scheme,
+ required this.identifier,
+ required this.unique,
+ this.kind});
static Moniker fromJson(Map<String, dynamic> json) {
final scheme = json['scheme'];
final identifier = json['identifier'];
- final unique = json['unique'] != null
- ? UniquenessLevel.fromJson(json['unique'])
- : null;
+ final unique = UniquenessLevel.fromJson(json['unique']);
final kind =
json['kind'] != null ? MonikerKind.fromJson(json['kind']) : null;
return Moniker(
@@ -19365,7 +18530,7 @@
final String identifier;
/// The moniker kind if known.
- final MonikerKind kind;
+ final MonikerKind? kind;
/// The scheme of the moniker. For example tsc or .Net
final String scheme;
@@ -19375,13 +18540,11 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['scheme'] = scheme ?? (throw 'scheme is required but was not set');
- __result['identifier'] =
- identifier ?? (throw 'identifier is required but was not set');
- __result['unique'] =
- unique?.toJson() ?? (throw 'unique is required but was not set');
+ __result['scheme'] = scheme;
+ __result['identifier'] = identifier;
+ __result['unique'] = unique.toJson();
if (kind != null) {
- __result['kind'] = kind.toJson();
+ __result['kind'] = kind?.toJson();
}
return __result;
}
@@ -19496,7 +18659,7 @@
/// `true` the client supports the new `(TextDocumentRegistrationOptions &
/// StaticRegistrationOptions)` return value for the corresponding server
/// capability as well.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -19590,7 +18753,7 @@
return MonikerOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -19648,36 +18811,26 @@
LspJsonHandler(MonikerParams.canParse, MonikerParams.fromJson);
MonikerParams(
- {@required this.textDocument,
- @required this.position,
+ {required this.textDocument,
+ required this.position,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ this.partialResultToken});
static MonikerParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return MonikerParams(
textDocument: textDocument,
@@ -19688,7 +18841,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The position inside the text document.
final Position position;
@@ -19697,14 +18850,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -19823,8 +18974,8 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
- final bool workDoneProgress;
+ final List<DocumentFilter>? documentSelector;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -19899,17 +19050,9 @@
NotificationMessage.canParse, NotificationMessage.fromJson);
NotificationMessage(
- {@required this.method, this.params, @required this.jsonrpc}) {
- if (method == null) {
- throw 'method is required but was not provided';
- }
- if (jsonrpc == null) {
- throw 'jsonrpc is required but was not provided';
- }
- }
+ {required this.method, this.params, required this.jsonrpc});
static NotificationMessage fromJson(Map<String, dynamic> json) {
- final method =
- json['method'] != null ? Method.fromJson(json['method']) : null;
+ final method = Method.fromJson(json['method']);
final params = json['params'];
final jsonrpc = json['jsonrpc'];
return NotificationMessage(
@@ -19926,13 +19069,11 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['method'] =
- method?.toJson() ?? (throw 'method is required but was not set');
+ __result['method'] = method.toJson();
if (params != null) {
__result['params'] = params;
}
- __result['jsonrpc'] =
- jsonrpc ?? (throw 'jsonrpc is required but was not set');
+ __result['jsonrpc'] = jsonrpc;
return __result;
}
@@ -19955,15 +19096,6 @@
} finally {
reporter.pop();
}
- reporter.push('params');
- try {
- if (obj['params'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
reporter.push('jsonrpc');
try {
if (!obj.containsKey('jsonrpc')) {
@@ -20019,11 +19151,7 @@
OptionalVersionedTextDocumentIdentifier.canParse,
OptionalVersionedTextDocumentIdentifier.fromJson);
- OptionalVersionedTextDocumentIdentifier({this.version, @required this.uri}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- }
+ OptionalVersionedTextDocumentIdentifier({this.version, required this.uri});
static OptionalVersionedTextDocumentIdentifier fromJson(
Map<String, dynamic> json) {
final version = json['version'];
@@ -20043,12 +19171,12 @@
///
/// The version number of a document will increase after each change,
/// including undo/redo. The number doesn't need to be consecutive.
- final num version;
+ final num? version;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
__result['version'] = version;
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
+ __result['uri'] = uri;
return __result;
}
@@ -20119,28 +19247,24 @@
static const jsonHandler = LspJsonHandler(
ParameterInformation.canParse, ParameterInformation.fromJson);
- ParameterInformation({@required this.label, this.documentation}) {
- if (label == null) {
- throw 'label is required but was not provided';
- }
- }
+ ParameterInformation({required this.label, this.documentation});
static ParameterInformation fromJson(Map<String, dynamic> json) {
final label = json['label'];
- final documentation = json['documentation'] is String
- ? Either2<String, MarkupContent>.t1(json['documentation'])
- : (MarkupContent.canParse(json['documentation'], nullLspJsonReporter)
- ? Either2<String, MarkupContent>.t2(json['documentation'] != null
- ? MarkupContent.fromJson(json['documentation'])
- : null)
- : (json['documentation'] == null
- ? null
+ final documentation = json['documentation'] == null
+ ? null
+ : (json['documentation'] is String
+ ? Either2<String, MarkupContent>.t1(json['documentation'])
+ : (MarkupContent.canParse(
+ json['documentation'], nullLspJsonReporter)
+ ? Either2<String, MarkupContent>.t2(
+ MarkupContent.fromJson(json['documentation']))
: (throw '''${json['documentation']} was not one of (String, MarkupContent)''')));
return ParameterInformation(label: label, documentation: documentation);
}
/// The human-readable doc-comment of this parameter. Will be shown in the UI
/// but can be omitted.
- final Either2<String, MarkupContent> documentation;
+ final Either2<String, MarkupContent>? documentation;
/// The label of this parameter information.
///
@@ -20156,7 +19280,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['label'] = label ?? (throw 'label is required but was not set');
+ __result['label'] = label;
if (documentation != null) {
__result['documentation'] = documentation;
}
@@ -20296,19 +19420,19 @@
if (MonikerParams.canParse(json, nullLspJsonReporter)) {
return MonikerParams.fromJson(json);
}
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return PartialResultParams(partialResultToken: partialResultToken);
}
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -20362,14 +19486,7 @@
static const jsonHandler =
LspJsonHandler(Position.canParse, Position.fromJson);
- Position({@required this.line, @required this.character}) {
- if (line == null) {
- throw 'line is required but was not provided';
- }
- if (character == null) {
- throw 'character is required but was not provided';
- }
- }
+ Position({required this.line, required this.character});
static Position fromJson(Map<String, dynamic> json) {
final line = json['line'];
final character = json['character'];
@@ -20389,9 +19506,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['line'] = line ?? (throw 'line is required but was not set');
- __result['character'] =
- character ?? (throw 'character is required but was not set');
+ __result['line'] = line;
+ __result['character'] = character;
return __result;
}
@@ -20462,20 +19578,10 @@
static const jsonHandler = LspJsonHandler(
PrepareRenameParams.canParse, PrepareRenameParams.fromJson);
- PrepareRenameParams({@required this.textDocument, @required this.position}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ PrepareRenameParams({required this.textDocument, required this.position});
static PrepareRenameParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
return PrepareRenameParams(textDocument: textDocument, position: position);
}
@@ -20487,10 +19593,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
return __result;
}
@@ -20590,14 +19694,7 @@
static const jsonHandler =
LspJsonHandler(ProgressParams.canParse, ProgressParams.fromJson);
- ProgressParams({@required this.token, @required this.value}) {
- if (token == null) {
- throw 'token is required but was not provided';
- }
- if (value == null) {
- throw 'value is required but was not provided';
- }
- }
+ ProgressParams({required this.token, this.value});
static ProgressParams<T> fromJson<T>(Map<String, dynamic> json) {
final token = json['token'] is num
? Either2<num, String>.t1(json['token'])
@@ -20612,12 +19709,12 @@
final Either2<num, String> token;
/// The progress data.
- final T value;
+ final dynamic value;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['token'] = token ?? (throw 'token is required but was not set');
- __result['value'] = value ?? (throw 'value is required but was not set');
+ __result['token'] = token;
+ __result['value'] = value;
return __result;
}
@@ -20640,23 +19737,6 @@
} finally {
reporter.pop();
}
- reporter.push('value');
- try {
- if (!obj.containsKey('value')) {
- reporter.reportError('must not be undefined');
- return false;
- }
- if (obj['value'] == null) {
- reporter.reportError('must not be null');
- return false;
- }
- if (!(true /* T.canParse(obj['value']) */)) {
- reporter.reportError('must be of type T');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type ProgressParams<T>');
@@ -20715,26 +19795,26 @@
/// Client supports a codeDescription property
/// @since 3.16.0
- final bool codeDescriptionSupport;
+ final bool? codeDescriptionSupport;
/// Whether code action supports the `data` property which is preserved
/// between a `textDocument/publishDiagnostics` and `textDocument/codeAction`
/// request.
/// @since 3.16.0
- final bool dataSupport;
+ final bool? dataSupport;
/// Whether the clients accepts diagnostics with related information.
- final bool relatedInformation;
+ final bool? relatedInformation;
/// Client supports the tag property to provide meta data about a diagnostic.
/// Clients supporting tags have to handle unknown tags gracefully.
/// @since 3.15.0
- final PublishDiagnosticsClientCapabilitiesTagSupport tagSupport;
+ final PublishDiagnosticsClientCapabilitiesTagSupport? tagSupport;
/// Whether the client interprets the version property of the
/// `textDocument/publishDiagnostics` notification's parameter.
/// @since 3.15.0
- final bool versionSupport;
+ final bool? versionSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -20742,7 +19822,7 @@
__result['relatedInformation'] = relatedInformation;
}
if (tagSupport != null) {
- __result['tagSupport'] = tagSupport.toJson();
+ __result['tagSupport'] = tagSupport?.toJson();
}
if (versionSupport != null) {
__result['versionSupport'] = versionSupport;
@@ -20850,15 +19930,11 @@
PublishDiagnosticsClientCapabilitiesTagSupport.canParse,
PublishDiagnosticsClientCapabilitiesTagSupport.fromJson);
- PublishDiagnosticsClientCapabilitiesTagSupport({@required this.valueSet}) {
- if (valueSet == null) {
- throw 'valueSet is required but was not provided';
- }
- }
+ PublishDiagnosticsClientCapabilitiesTagSupport({required this.valueSet});
static PublishDiagnosticsClientCapabilitiesTagSupport fromJson(
Map<String, dynamic> json) {
final valueSet = json['valueSet']
- ?.map((item) => item != null ? DiagnosticTag.fromJson(item) : null)
+ ?.map((item) => DiagnosticTag.fromJson(item))
?.cast<DiagnosticTag>()
?.toList();
return PublishDiagnosticsClientCapabilitiesTagSupport(valueSet: valueSet);
@@ -20869,8 +19945,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['valueSet'] = valueSet?.map((item) => item.toJson())?.toList() ??
- (throw 'valueSet is required but was not set');
+ __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
return __result;
}
@@ -20930,19 +20005,12 @@
PublishDiagnosticsParams.canParse, PublishDiagnosticsParams.fromJson);
PublishDiagnosticsParams(
- {@required this.uri, this.version, @required this.diagnostics}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- if (diagnostics == null) {
- throw 'diagnostics is required but was not provided';
- }
- }
+ {required this.uri, this.version, required this.diagnostics});
static PublishDiagnosticsParams fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
final version = json['version'];
final diagnostics = json['diagnostics']
- ?.map((item) => item != null ? Diagnostic.fromJson(item) : null)
+ ?.map((item) => Diagnostic.fromJson(item))
?.cast<Diagnostic>()
?.toList();
return PublishDiagnosticsParams(
@@ -20958,17 +20026,15 @@
/// Optional the version number of the document the diagnostics are published
/// for.
/// @since 3.15.0
- final num version;
+ final num? version;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
+ __result['uri'] = uri;
if (version != null) {
__result['version'] = version;
}
- __result['diagnostics'] =
- diagnostics?.map((item) => item.toJson())?.toList() ??
- (throw 'diagnostics is required but was not set');
+ __result['diagnostics'] = diagnostics.map((item) => item.toJson()).toList();
return __result;
}
@@ -21055,18 +20121,10 @@
class Range implements ToJsonable {
static const jsonHandler = LspJsonHandler(Range.canParse, Range.fromJson);
- Range({@required this.start, @required this.end}) {
- if (start == null) {
- throw 'start is required but was not provided';
- }
- if (end == null) {
- throw 'end is required but was not provided';
- }
- }
+ Range({required this.start, required this.end});
static Range fromJson(Map<String, dynamic> json) {
- final start =
- json['start'] != null ? Position.fromJson(json['start']) : null;
- final end = json['end'] != null ? Position.fromJson(json['end']) : null;
+ final start = Position.fromJson(json['start']);
+ final end = Position.fromJson(json['end']);
return Range(start: start, end: end);
}
@@ -21078,10 +20136,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['start'] =
- start?.toJson() ?? (throw 'start is required but was not set');
- __result['end'] =
- end?.toJson() ?? (throw 'end is required but was not set');
+ __result['start'] = start.toJson();
+ __result['end'] = end.toJson();
return __result;
}
@@ -21152,16 +20208,9 @@
static const jsonHandler = LspJsonHandler(
RangeAndPlaceholder.canParse, RangeAndPlaceholder.fromJson);
- RangeAndPlaceholder({@required this.range, @required this.placeholder}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (placeholder == null) {
- throw 'placeholder is required but was not provided';
- }
- }
+ RangeAndPlaceholder({required this.range, required this.placeholder});
static RangeAndPlaceholder fromJson(Map<String, dynamic> json) {
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final placeholder = json['placeholder'];
return RangeAndPlaceholder(range: range, placeholder: placeholder);
}
@@ -21171,10 +20220,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['placeholder'] =
- placeholder ?? (throw 'placeholder is required but was not set');
+ __result['range'] = range.toJson();
+ __result['placeholder'] = placeholder;
return __result;
}
@@ -21255,7 +20302,7 @@
}
/// Whether references supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -21308,11 +20355,7 @@
static const jsonHandler =
LspJsonHandler(ReferenceContext.canParse, ReferenceContext.fromJson);
- ReferenceContext({@required this.includeDeclaration}) {
- if (includeDeclaration == null) {
- throw 'includeDeclaration is required but was not provided';
- }
- }
+ ReferenceContext({required this.includeDeclaration});
static ReferenceContext fromJson(Map<String, dynamic> json) {
final includeDeclaration = json['includeDeclaration'];
return ReferenceContext(includeDeclaration: includeDeclaration);
@@ -21323,8 +20366,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['includeDeclaration'] = includeDeclaration ??
- (throw 'includeDeclaration is required but was not set');
+ __result['includeDeclaration'] = includeDeclaration;
return __result;
}
@@ -21386,7 +20428,7 @@
return ReferenceOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -21444,43 +20486,28 @@
LspJsonHandler(ReferenceParams.canParse, ReferenceParams.fromJson);
ReferenceParams(
- {@required this.context,
- @required this.textDocument,
- @required this.position,
+ {required this.context,
+ required this.textDocument,
+ required this.position,
this.workDoneToken,
- this.partialResultToken}) {
- if (context == null) {
- throw 'context is required but was not provided';
- }
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ this.partialResultToken});
static ReferenceParams fromJson(Map<String, dynamic> json) {
- final context = json['context'] != null
- ? ReferenceContext.fromJson(json['context'])
- : null;
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final context = ReferenceContext.fromJson(json['context']);
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return ReferenceParams(
context: context,
@@ -21494,7 +20521,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The position inside the text document.
final Position position;
@@ -21503,16 +20530,13 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['context'] =
- context?.toJson() ?? (throw 'context is required but was not set');
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['context'] = context.toJson();
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -21651,8 +20675,8 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
- final bool workDoneProgress;
+ final List<DocumentFilter>? documentSelector;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -21727,15 +20751,7 @@
static const jsonHandler =
LspJsonHandler(Registration.canParse, Registration.fromJson);
- Registration(
- {@required this.id, @required this.method, this.registerOptions}) {
- if (id == null) {
- throw 'id is required but was not provided';
- }
- if (method == null) {
- throw 'method is required but was not provided';
- }
- }
+ Registration({required this.id, required this.method, this.registerOptions});
static Registration fromJson(Map<String, dynamic> json) {
final id = json['id'];
final method = json['method'];
@@ -21756,8 +20772,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['id'] = id ?? (throw 'id is required but was not set');
- __result['method'] = method ?? (throw 'method is required but was not set');
+ __result['id'] = id;
+ __result['method'] = method;
if (registerOptions != null) {
__result['registerOptions'] = registerOptions;
}
@@ -21800,15 +20816,6 @@
} finally {
reporter.pop();
}
- reporter.push('registerOptions');
- try {
- if (obj['registerOptions'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type Registration');
@@ -21844,14 +20851,10 @@
static const jsonHandler =
LspJsonHandler(RegistrationParams.canParse, RegistrationParams.fromJson);
- RegistrationParams({@required this.registrations}) {
- if (registrations == null) {
- throw 'registrations is required but was not provided';
- }
- }
+ RegistrationParams({required this.registrations});
static RegistrationParams fromJson(Map<String, dynamic> json) {
final registrations = json['registrations']
- ?.map((item) => item != null ? Registration.fromJson(item) : null)
+ ?.map((item) => Registration.fromJson(item))
?.cast<Registration>()
?.toList();
return RegistrationParams(registrations: registrations);
@@ -21862,8 +20865,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
__result['registrations'] =
- registrations?.map((item) => item.toJson())?.toList() ??
- (throw 'registrations is required but was not set');
+ registrations.map((item) => item.toJson()).toList();
return __result;
}
@@ -21923,11 +20925,7 @@
RegularExpressionsClientCapabilities.canParse,
RegularExpressionsClientCapabilities.fromJson);
- RegularExpressionsClientCapabilities({@required this.engine, this.version}) {
- if (engine == null) {
- throw 'engine is required but was not provided';
- }
- }
+ RegularExpressionsClientCapabilities({required this.engine, this.version});
static RegularExpressionsClientCapabilities fromJson(
Map<String, dynamic> json) {
final engine = json['engine'];
@@ -21940,11 +20938,11 @@
final String engine;
/// The engine's version.
- final String version;
+ final String? version;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['engine'] = engine ?? (throw 'engine is required but was not set');
+ __result['engine'] = engine;
if (version != null) {
__result['version'] = version;
}
@@ -22034,26 +21032,26 @@
}
/// Whether rename supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// Whether th client honors the change annotations in text edits and resource
/// operations returned via the rename request's workspace edit by for example
/// presenting the workspace edit in the user interface and asking for
/// confirmation.
/// @since 3.16.0
- final bool honorsChangeAnnotations;
+ final bool? honorsChangeAnnotations;
/// Client supports testing for validity of rename operations before
/// execution.
/// @since version 3.12.0
- final bool prepareSupport;
+ final bool? prepareSupport;
/// Client supports the default behavior result (`{ defaultBehavior: boolean
/// }`).
///
/// The value indicates the default behavior used by the client.
/// @since version 3.16.0
- final PrepareSupportDefaultBehavior prepareSupportDefaultBehavior;
+ final PrepareSupportDefaultBehavior? prepareSupportDefaultBehavior;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -22065,7 +21063,7 @@
}
if (prepareSupportDefaultBehavior != null) {
__result['prepareSupportDefaultBehavior'] =
- prepareSupportDefaultBehavior.toJson();
+ prepareSupportDefaultBehavior?.toJson();
}
if (honorsChangeAnnotations != null) {
__result['honorsChangeAnnotations'] = honorsChangeAnnotations;
@@ -22157,19 +21155,13 @@
RenameFile(
{this.kind = 'rename',
- @required this.oldUri,
- @required this.newUri,
+ required this.oldUri,
+ required this.newUri,
this.options,
this.annotationId}) {
if (kind != 'rename') {
throw 'kind may only be the literal \'rename\'';
}
- if (oldUri == null) {
- throw 'oldUri is required but was not provided';
- }
- if (newUri == null) {
- throw 'newUri is required but was not provided';
- }
}
static RenameFile fromJson(Map<String, dynamic> json) {
final kind = json['kind'];
@@ -22189,7 +21181,7 @@
/// An optional annotation identifer describing the operation.
/// @since 3.16.0
- final String annotationId;
+ final String? annotationId;
/// A rename
final String kind;
@@ -22201,15 +21193,15 @@
final String oldUri;
/// Rename options.
- final RenameFileOptions options;
+ final RenameFileOptions? options;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['kind'] = kind ?? (throw 'kind is required but was not set');
- __result['oldUri'] = oldUri ?? (throw 'oldUri is required but was not set');
- __result['newUri'] = newUri ?? (throw 'newUri is required but was not set');
+ __result['kind'] = kind;
+ __result['oldUri'] = oldUri;
+ __result['newUri'] = newUri;
if (options != null) {
- __result['options'] = options.toJson();
+ __result['options'] = options?.toJson();
}
if (annotationId != null) {
__result['annotationId'] = annotationId;
@@ -22338,10 +21330,10 @@
}
/// Ignores if target exists.
- final bool ignoreIfExists;
+ final bool? ignoreIfExists;
/// Overwrite target if existing. Overwrite wins over `ignoreIfExists`
- final bool overwrite;
+ final bool? overwrite;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -22410,14 +21402,10 @@
static const jsonHandler =
LspJsonHandler(RenameFilesParams.canParse, RenameFilesParams.fromJson);
- RenameFilesParams({@required this.files}) {
- if (files == null) {
- throw 'files is required but was not provided';
- }
- }
+ RenameFilesParams({required this.files});
static RenameFilesParams fromJson(Map<String, dynamic> json) {
final files = json['files']
- ?.map((item) => item != null ? FileRename.fromJson(item) : null)
+ ?.map((item) => FileRename.fromJson(item))
?.cast<FileRename>()
?.toList();
return RenameFilesParams(files: files);
@@ -22429,8 +21417,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['files'] = files?.map((item) => item.toJson())?.toList() ??
- (throw 'files is required but was not set');
+ __result['files'] = files.map((item) => item.toJson()).toList();
return __result;
}
@@ -22499,8 +21486,8 @@
}
/// Renames should be checked and tested before being executed.
- final bool prepareProvider;
- final bool workDoneProgress;
+ final bool? prepareProvider;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -22570,33 +21557,20 @@
LspJsonHandler(RenameParams.canParse, RenameParams.fromJson);
RenameParams(
- {@required this.newName,
- @required this.textDocument,
- @required this.position,
- this.workDoneToken}) {
- if (newName == null) {
- throw 'newName is required but was not provided';
- }
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ {required this.newName,
+ required this.textDocument,
+ required this.position,
+ this.workDoneToken});
static RenameParams fromJson(Map<String, dynamic> json) {
final newName = json['newName'];
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return RenameParams(
newName: newName,
@@ -22616,16 +21590,13 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['newName'] =
- newName ?? (throw 'newName is required but was not set');
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['newName'] = newName;
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -22751,11 +21722,11 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// Renames should be checked and tested before being executed.
- final bool prepareProvider;
- final bool workDoneProgress;
+ final bool? prepareProvider;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -22845,28 +21816,17 @@
LspJsonHandler(RequestMessage.canParse, RequestMessage.fromJson);
RequestMessage(
- {@required this.id,
- @required this.method,
+ {required this.id,
+ required this.method,
this.params,
- @required this.jsonrpc}) {
- if (id == null) {
- throw 'id is required but was not provided';
- }
- if (method == null) {
- throw 'method is required but was not provided';
- }
- if (jsonrpc == null) {
- throw 'jsonrpc is required but was not provided';
- }
- }
+ required this.jsonrpc});
static RequestMessage fromJson(Map<String, dynamic> json) {
final id = json['id'] is num
? Either2<num, String>.t1(json['id'])
: (json['id'] is String
? Either2<num, String>.t2(json['id'])
: (throw '''${json['id']} was not one of (num, String)'''));
- final method =
- json['method'] != null ? Method.fromJson(json['method']) : null;
+ final method = Method.fromJson(json['method']);
final params = json['params'];
final jsonrpc = json['jsonrpc'];
return RequestMessage(
@@ -22885,14 +21845,12 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['id'] = id ?? (throw 'id is required but was not set');
- __result['method'] =
- method?.toJson() ?? (throw 'method is required but was not set');
+ __result['id'] = id;
+ __result['method'] = method.toJson();
if (params != null) {
__result['params'] = params;
}
- __result['jsonrpc'] =
- jsonrpc ?? (throw 'jsonrpc is required but was not set');
+ __result['jsonrpc'] = jsonrpc;
return __result;
}
@@ -22932,15 +21890,6 @@
} finally {
reporter.pop();
}
- reporter.push('params');
- try {
- if (obj['params'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
reporter.push('jsonrpc');
try {
if (!obj.containsKey('jsonrpc')) {
@@ -23032,17 +21981,9 @@
static const jsonHandler =
LspJsonHandler(ResponseError.canParse, ResponseError.fromJson);
- ResponseError({@required this.code, @required this.message, this.data}) {
- if (code == null) {
- throw 'code is required but was not provided';
- }
- if (message == null) {
- throw 'message is required but was not provided';
- }
- }
+ ResponseError({required this.code, required this.message, this.data});
static ResponseError fromJson(Map<String, dynamic> json) {
- final code =
- json['code'] != null ? ErrorCodes.fromJson(json['code']) : null;
+ final code = ErrorCodes.fromJson(json['code']);
final message = json['message'];
final data = json['data'];
return ResponseError(code: code, message: message, data: data);
@@ -23053,17 +21994,15 @@
/// A string that contains additional information about the error. Can be
/// omitted.
- final String data;
+ final String? data;
/// A string providing a short description of the error.
final String message;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['code'] =
- code?.toJson() ?? (throw 'code is required but was not set');
- __result['message'] =
- message ?? (throw 'message is required but was not set');
+ __result['code'] = code.toJson();
+ __result['message'] = message;
if (data != null) {
__result['data'] = data;
}
@@ -23150,18 +22089,14 @@
static const jsonHandler =
LspJsonHandler(ResponseMessage.canParse, ResponseMessage.fromJson);
- ResponseMessage({this.id, this.result, this.error, @required this.jsonrpc}) {
- if (jsonrpc == null) {
- throw 'jsonrpc is required but was not provided';
- }
- }
+ ResponseMessage({this.id, this.result, this.error, required this.jsonrpc});
static ResponseMessage fromJson(Map<String, dynamic> json) {
- final id = json['id'] is num
- ? Either2<num, String>.t1(json['id'])
- : (json['id'] is String
- ? Either2<num, String>.t2(json['id'])
- : (json['id'] == null
- ? null
+ final id = json['id'] == null
+ ? null
+ : (json['id'] is num
+ ? Either2<num, String>.t1(json['id'])
+ : (json['id'] is String
+ ? Either2<num, String>.t2(json['id'])
: (throw '''${json['id']} was not one of (num, String)''')));
final result = json['result'];
final error =
@@ -23172,10 +22107,10 @@
}
/// The error object in case a request fails.
- final ResponseError error;
+ final ResponseError? error;
/// The request id.
- final Either2<num, String> id;
+ final Either2<num, String>? id;
final String jsonrpc;
/// The result of a request. This member is REQUIRED on success. This member
@@ -23185,8 +22120,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
__result['id'] = id;
- __result['jsonrpc'] =
- jsonrpc ?? (throw 'jsonrpc is required but was not set');
+ __result['jsonrpc'] = jsonrpc;
if (error != null && result != null) {
throw 'result and error cannot both be set';
} else if (error != null) {
@@ -23212,15 +22146,6 @@
} finally {
reporter.pop();
}
- reporter.push('result');
- try {
- if (obj['result'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
reporter.push('error');
try {
if (obj['error'] != null &&
@@ -23292,7 +22217,7 @@
}
/// The client is supposed to include the content on save.
- final bool includeText;
+ final bool? includeText;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -23343,13 +22268,9 @@
static const jsonHandler =
LspJsonHandler(SelectionRange.canParse, SelectionRange.fromJson);
- SelectionRange({@required this.range, this.parent}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- }
+ SelectionRange({required this.range, this.parent});
static SelectionRange fromJson(Map<String, dynamic> json) {
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final parent =
json['parent'] != null ? SelectionRange.fromJson(json['parent']) : null;
return SelectionRange(range: range, parent: parent);
@@ -23357,17 +22278,16 @@
/// The parent selection range containing this range. Therefore `parent.range`
/// must contain `this.range`.
- final SelectionRange parent;
+ final SelectionRange? parent;
/// The range ([Range]) of this selection range.
final Range range;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
+ __result['range'] = range.toJson();
if (parent != null) {
- __result['parent'] = parent.toJson();
+ __result['parent'] = parent?.toJson();
}
return __result;
}
@@ -23444,7 +22364,7 @@
/// providers. If this is set to `true` the client supports the new
/// `SelectionRangeRegistrationOptions` return value for the corresponding
/// server capability as well.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -23506,7 +22426,7 @@
return SelectionRangeOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -23561,38 +22481,29 @@
SelectionRangeParams.canParse, SelectionRangeParams.fromJson);
SelectionRangeParams(
- {@required this.textDocument,
- @required this.positions,
+ {required this.textDocument,
+ required this.positions,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (positions == null) {
- throw 'positions is required but was not provided';
- }
- }
+ this.partialResultToken});
static SelectionRangeParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
final positions = json['positions']
- ?.map((item) => item != null ? Position.fromJson(item) : null)
+ ?.map((item) => Position.fromJson(item))
?.cast<Position>()
?.toList();
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return SelectionRangeParams(
textDocument: textDocument,
@@ -23603,7 +22514,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The positions inside the text document.
final List<Position> positions;
@@ -23612,14 +22523,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['positions'] = positions?.map((item) => item.toJson())?.toList() ??
- (throw 'positions is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['positions'] = positions.map((item) => item.toJson()).toList();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -23751,12 +22660,12 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
- final bool workDoneProgress;
+ final String? id;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -23924,11 +22833,7 @@
static const jsonHandler =
LspJsonHandler(SemanticTokens.canParse, SemanticTokens.fromJson);
- SemanticTokens({this.resultId, @required this.data}) {
- if (data == null) {
- throw 'data is required but was not provided';
- }
- }
+ SemanticTokens({this.resultId, required this.data});
static SemanticTokens fromJson(Map<String, dynamic> json) {
final resultId = json['resultId'];
final data = json['data']?.map((item) => item)?.cast<num>()?.toList();
@@ -23942,14 +22847,14 @@
/// client will include the result id in the next semantic token request. A
/// server can then instead of computing all semantic tokens again simply send
/// a delta.
- final String resultId;
+ final String? resultId;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (resultId != null) {
__result['resultId'] = resultId;
}
- __result['data'] = data ?? (throw 'data is required but was not set');
+ __result['data'] = data;
return __result;
}
@@ -24018,36 +22923,22 @@
SemanticTokensClientCapabilities(
{this.dynamicRegistration,
- @required this.requests,
- @required this.tokenTypes,
- @required this.tokenModifiers,
- @required this.formats,
+ required this.requests,
+ required this.tokenTypes,
+ required this.tokenModifiers,
+ required this.formats,
this.overlappingTokenSupport,
- this.multilineTokenSupport}) {
- if (requests == null) {
- throw 'requests is required but was not provided';
- }
- if (tokenTypes == null) {
- throw 'tokenTypes is required but was not provided';
- }
- if (tokenModifiers == null) {
- throw 'tokenModifiers is required but was not provided';
- }
- if (formats == null) {
- throw 'formats is required but was not provided';
- }
- }
+ this.multilineTokenSupport});
static SemanticTokensClientCapabilities fromJson(Map<String, dynamic> json) {
final dynamicRegistration = json['dynamicRegistration'];
- final requests = json['requests'] != null
- ? SemanticTokensClientCapabilitiesRequests.fromJson(json['requests'])
- : null;
+ final requests =
+ SemanticTokensClientCapabilitiesRequests.fromJson(json['requests']);
final tokenTypes =
json['tokenTypes']?.map((item) => item)?.cast<String>()?.toList();
final tokenModifiers =
json['tokenModifiers']?.map((item) => item)?.cast<String>()?.toList();
final formats = json['formats']
- ?.map((item) => item != null ? TokenFormat.fromJson(item) : null)
+ ?.map((item) => TokenFormat.fromJson(item))
?.cast<TokenFormat>()
?.toList();
final overlappingTokenSupport = json['overlappingTokenSupport'];
@@ -24066,16 +22957,16 @@
/// `true` the client supports the new `(TextDocumentRegistrationOptions &
/// StaticRegistrationOptions)` return value for the corresponding server
/// capability as well.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// The formats the clients supports.
final List<TokenFormat> formats;
/// Whether the client supports tokens that can span multiple lines.
- final bool multilineTokenSupport;
+ final bool? multilineTokenSupport;
/// Whether the client supports tokens that can overlap each other.
- final bool overlappingTokenSupport;
+ final bool? overlappingTokenSupport;
/// Which requests the client supports and might send to the server depending
/// on the server's capability. Please note that clients might not show
@@ -24098,14 +22989,10 @@
if (dynamicRegistration != null) {
__result['dynamicRegistration'] = dynamicRegistration;
}
- __result['requests'] =
- requests?.toJson() ?? (throw 'requests is required but was not set');
- __result['tokenTypes'] =
- tokenTypes ?? (throw 'tokenTypes is required but was not set');
- __result['tokenModifiers'] =
- tokenModifiers ?? (throw 'tokenModifiers is required but was not set');
- __result['formats'] = formats?.map((item) => item.toJson())?.toList() ??
- (throw 'formats is required but was not set');
+ __result['requests'] = requests.toJson();
+ __result['tokenTypes'] = tokenTypes;
+ __result['tokenModifiers'] = tokenModifiers;
+ __result['formats'] = formats.map((item) => item.toJson()).toList();
if (overlappingTokenSupport != null) {
__result['overlappingTokenSupport'] = overlappingTokenSupport;
}
@@ -24278,7 +23165,7 @@
/// The client will send the `textDocument/semanticTokens/full/delta` request
/// if the server provides a corresponding handler.
- final bool delta;
+ final bool? delta;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -24379,40 +23266,37 @@
SemanticTokensClientCapabilitiesRequests({this.range, this.full});
static SemanticTokensClientCapabilitiesRequests fromJson(
Map<String, dynamic> json) {
- final range = json['range'] is bool
- ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t1(json['range'])
- : (SemanticTokensClientCapabilitiesRange.canParse(
- json['range'], nullLspJsonReporter)
- ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t2(
- json['range'] != null
- ? SemanticTokensClientCapabilitiesRange.fromJson(
- json['range'])
- : null)
- : (json['range'] == null
- ? null
+ final range = json['range'] == null
+ ? null
+ : (json['range'] is bool
+ ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t1(
+ json['range'])
+ : (SemanticTokensClientCapabilitiesRange.canParse(
+ json['range'], nullLspJsonReporter)
+ ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t2(
+ SemanticTokensClientCapabilitiesRange.fromJson(
+ json['range']))
: (throw '''${json['range']} was not one of (bool, SemanticTokensClientCapabilitiesRange)''')));
- final full = json['full'] is bool
- ? Either2<bool, SemanticTokensClientCapabilitiesFull>.t1(json['full'])
- : (SemanticTokensClientCapabilitiesFull.canParse(
- json['full'], nullLspJsonReporter)
- ? Either2<bool, SemanticTokensClientCapabilitiesFull>.t2(
- json['full'] != null
- ? SemanticTokensClientCapabilitiesFull.fromJson(
- json['full'])
- : null)
- : (json['full'] == null
- ? null
+ final full = json['full'] == null
+ ? null
+ : (json['full'] is bool
+ ? Either2<bool, SemanticTokensClientCapabilitiesFull>.t1(
+ json['full'])
+ : (SemanticTokensClientCapabilitiesFull.canParse(
+ json['full'], nullLspJsonReporter)
+ ? Either2<bool, SemanticTokensClientCapabilitiesFull>.t2(
+ SemanticTokensClientCapabilitiesFull.fromJson(json['full']))
: (throw '''${json['full']} was not one of (bool, SemanticTokensClientCapabilitiesFull)''')));
return SemanticTokensClientCapabilitiesRequests(range: range, full: full);
}
/// The client will send the `textDocument/semanticTokens/full` request if the
/// server provides a corresponding handler.
- final Either2<bool, SemanticTokensClientCapabilitiesFull> full;
+ final Either2<bool, SemanticTokensClientCapabilitiesFull>? full;
/// The client will send the `textDocument/semanticTokens/range` request if
/// the server provides a corresponding handler.
- final Either2<bool, SemanticTokensClientCapabilitiesRange> range;
+ final Either2<bool, SemanticTokensClientCapabilitiesRange>? range;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -24486,15 +23370,11 @@
static const jsonHandler = LspJsonHandler(
SemanticTokensDelta.canParse, SemanticTokensDelta.fromJson);
- SemanticTokensDelta({this.resultId, @required this.edits}) {
- if (edits == null) {
- throw 'edits is required but was not provided';
- }
- }
+ SemanticTokensDelta({this.resultId, required this.edits});
static SemanticTokensDelta fromJson(Map<String, dynamic> json) {
final resultId = json['resultId'];
final edits = json['edits']
- ?.map((item) => item != null ? SemanticTokensEdit.fromJson(item) : null)
+ ?.map((item) => SemanticTokensEdit.fromJson(item))
?.cast<SemanticTokensEdit>()
?.toList();
return SemanticTokensDelta(resultId: resultId, edits: edits);
@@ -24502,15 +23382,14 @@
/// The semantic token edits to transform a previous result into a new result.
final List<SemanticTokensEdit> edits;
- final String resultId;
+ final String? resultId;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (resultId != null) {
__result['resultId'] = resultId;
}
- __result['edits'] = edits?.map((item) => item.toJson())?.toList() ??
- (throw 'edits is required but was not set');
+ __result['edits'] = edits.map((item) => item.toJson()).toList();
return __result;
}
@@ -24581,35 +23460,26 @@
SemanticTokensDeltaParams.canParse, SemanticTokensDeltaParams.fromJson);
SemanticTokensDeltaParams(
- {@required this.textDocument,
- @required this.previousResultId,
+ {required this.textDocument,
+ required this.previousResultId,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (previousResultId == null) {
- throw 'previousResultId is required but was not provided';
- }
- }
+ this.partialResultToken});
static SemanticTokensDeltaParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
final previousResultId = json['previousResultId'];
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return SemanticTokensDeltaParams(
textDocument: textDocument,
@@ -24620,7 +23490,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The result id of a previous response. The result Id can either point to a
/// full response or a delta response depending on what was received last.
@@ -24630,14 +23500,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['previousResultId'] = previousResultId ??
- (throw 'previousResultId is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['previousResultId'] = previousResultId;
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -24744,14 +23612,10 @@
SemanticTokensDeltaPartialResult.canParse,
SemanticTokensDeltaPartialResult.fromJson);
- SemanticTokensDeltaPartialResult({@required this.edits}) {
- if (edits == null) {
- throw 'edits is required but was not provided';
- }
- }
+ SemanticTokensDeltaPartialResult({required this.edits});
static SemanticTokensDeltaPartialResult fromJson(Map<String, dynamic> json) {
final edits = json['edits']
- ?.map((item) => item != null ? SemanticTokensEdit.fromJson(item) : null)
+ ?.map((item) => SemanticTokensEdit.fromJson(item))
?.cast<SemanticTokensEdit>()
?.toList();
return SemanticTokensDeltaPartialResult(edits: edits);
@@ -24761,8 +23625,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['edits'] = edits?.map((item) => item.toJson())?.toList() ??
- (throw 'edits is required but was not set');
+ __result['edits'] = edits.map((item) => item.toJson()).toList();
return __result;
}
@@ -24821,14 +23684,7 @@
LspJsonHandler(SemanticTokensEdit.canParse, SemanticTokensEdit.fromJson);
SemanticTokensEdit(
- {@required this.start, @required this.deleteCount, this.data}) {
- if (start == null) {
- throw 'start is required but was not provided';
- }
- if (deleteCount == null) {
- throw 'deleteCount is required but was not provided';
- }
- }
+ {required this.start, required this.deleteCount, this.data});
static SemanticTokensEdit fromJson(Map<String, dynamic> json) {
final start = json['start'];
final deleteCount = json['deleteCount'];
@@ -24838,7 +23694,7 @@
}
/// The elements to insert.
- final List<num> data;
+ final List<num>? data;
/// The count of elements to remove.
final num deleteCount;
@@ -24848,9 +23704,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['start'] = start ?? (throw 'start is required but was not set');
- __result['deleteCount'] =
- deleteCount ?? (throw 'deleteCount is required but was not set');
+ __result['start'] = start;
+ __result['deleteCount'] = deleteCount;
if (data != null) {
__result['data'] = data;
}
@@ -24941,14 +23796,7 @@
SemanticTokensLegend.canParse, SemanticTokensLegend.fromJson);
SemanticTokensLegend(
- {@required this.tokenTypes, @required this.tokenModifiers}) {
- if (tokenTypes == null) {
- throw 'tokenTypes is required but was not provided';
- }
- if (tokenModifiers == null) {
- throw 'tokenModifiers is required but was not provided';
- }
- }
+ {required this.tokenTypes, required this.tokenModifiers});
static SemanticTokensLegend fromJson(Map<String, dynamic> json) {
final tokenTypes =
json['tokenTypes']?.map((item) => item)?.cast<String>()?.toList();
@@ -24966,10 +23814,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['tokenTypes'] =
- tokenTypes ?? (throw 'tokenTypes is required but was not set');
- __result['tokenModifiers'] =
- tokenModifiers ?? (throw 'tokenModifiers is required but was not set');
+ __result['tokenTypes'] = tokenTypes;
+ __result['tokenModifiers'] = tokenModifiers;
return __result;
}
@@ -25048,36 +23894,29 @@
SemanticTokensOptions.canParse, SemanticTokensOptions.fromJson);
SemanticTokensOptions(
- {@required this.legend, this.range, this.full, this.workDoneProgress}) {
- if (legend == null) {
- throw 'legend is required but was not provided';
- }
- }
+ {required this.legend, this.range, this.full, this.workDoneProgress});
static SemanticTokensOptions fromJson(Map<String, dynamic> json) {
if (SemanticTokensRegistrationOptions.canParse(json, nullLspJsonReporter)) {
return SemanticTokensRegistrationOptions.fromJson(json);
}
- final legend = json['legend'] != null
- ? SemanticTokensLegend.fromJson(json['legend'])
- : null;
- final range = json['range'] is bool
- ? Either2<bool, SemanticTokensOptionsRange>.t1(json['range'])
- : (SemanticTokensOptionsRange.canParse(
- json['range'], nullLspJsonReporter)
- ? Either2<bool, SemanticTokensOptionsRange>.t2(json['range'] != null
- ? SemanticTokensOptionsRange.fromJson(json['range'])
- : null)
- : (json['range'] == null
- ? null
+ final legend = SemanticTokensLegend.fromJson(json['legend']);
+ final range = json['range'] == null
+ ? null
+ : (json['range'] is bool
+ ? Either2<bool, SemanticTokensOptionsRange>.t1(json['range'])
+ : (SemanticTokensOptionsRange.canParse(
+ json['range'], nullLspJsonReporter)
+ ? Either2<bool, SemanticTokensOptionsRange>.t2(
+ SemanticTokensOptionsRange.fromJson(json['range']))
: (throw '''${json['range']} was not one of (bool, SemanticTokensOptionsRange)''')));
- final full = json['full'] is bool
- ? Either2<bool, SemanticTokensOptionsFull>.t1(json['full'])
- : (SemanticTokensOptionsFull.canParse(json['full'], nullLspJsonReporter)
- ? Either2<bool, SemanticTokensOptionsFull>.t2(json['full'] != null
- ? SemanticTokensOptionsFull.fromJson(json['full'])
- : null)
- : (json['full'] == null
- ? null
+ final full = json['full'] == null
+ ? null
+ : (json['full'] is bool
+ ? Either2<bool, SemanticTokensOptionsFull>.t1(json['full'])
+ : (SemanticTokensOptionsFull.canParse(
+ json['full'], nullLspJsonReporter)
+ ? Either2<bool, SemanticTokensOptionsFull>.t2(
+ SemanticTokensOptionsFull.fromJson(json['full']))
: (throw '''${json['full']} was not one of (bool, SemanticTokensOptionsFull)''')));
final workDoneProgress = json['workDoneProgress'];
return SemanticTokensOptions(
@@ -25088,20 +23927,19 @@
}
/// Server supports providing semantic tokens for a full document.
- final Either2<bool, SemanticTokensOptionsFull> full;
+ final Either2<bool, SemanticTokensOptionsFull>? full;
/// The legend used by the server
final SemanticTokensLegend legend;
/// Server supports providing semantic tokens for a specific range of a
/// document.
- final Either2<bool, SemanticTokensOptionsRange> range;
- final bool workDoneProgress;
+ final Either2<bool, SemanticTokensOptionsRange>? range;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['legend'] =
- legend?.toJson() ?? (throw 'legend is required but was not set');
+ __result['legend'] = legend.toJson();
if (range != null) {
__result['range'] = range;
}
@@ -25212,7 +24050,7 @@
}
/// The server supports deltas for full documents.
- final bool delta;
+ final bool? delta;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -25307,30 +24145,24 @@
SemanticTokensParams.canParse, SemanticTokensParams.fromJson);
SemanticTokensParams(
- {@required this.textDocument,
+ {required this.textDocument,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- }
+ this.partialResultToken});
static SemanticTokensParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return SemanticTokensParams(
textDocument: textDocument,
@@ -25340,18 +24172,17 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The text document.
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -25439,11 +24270,7 @@
SemanticTokensPartialResult.canParse,
SemanticTokensPartialResult.fromJson);
- SemanticTokensPartialResult({@required this.data}) {
- if (data == null) {
- throw 'data is required but was not provided';
- }
- }
+ SemanticTokensPartialResult({required this.data});
static SemanticTokensPartialResult fromJson(Map<String, dynamic> json) {
final data = json['data']?.map((item) => item)?.cast<num>()?.toList();
return SemanticTokensPartialResult(data: data);
@@ -25453,7 +24280,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['data'] = data ?? (throw 'data is required but was not set');
+ __result['data'] = data;
return __result;
}
@@ -25510,35 +24337,26 @@
SemanticTokensRangeParams.canParse, SemanticTokensRangeParams.fromJson);
SemanticTokensRangeParams(
- {@required this.textDocument,
- @required this.range,
+ {required this.textDocument,
+ required this.range,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (range == null) {
- throw 'range is required but was not provided';
- }
- }
+ this.partialResultToken});
static SemanticTokensRangeParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final range = Range.fromJson(json['range']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return SemanticTokensRangeParams(
textDocument: textDocument,
@@ -25549,7 +24367,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The range the semantic tokens are requested for.
final Range range;
@@ -25558,14 +24376,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['range'] = range.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -25679,41 +24495,34 @@
SemanticTokensRegistrationOptions(
{this.documentSelector,
- @required this.legend,
+ required this.legend,
this.range,
this.full,
this.workDoneProgress,
- this.id}) {
- if (legend == null) {
- throw 'legend is required but was not provided';
- }
- }
+ this.id});
static SemanticTokensRegistrationOptions fromJson(Map<String, dynamic> json) {
final documentSelector = json['documentSelector']
?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
?.cast<DocumentFilter>()
?.toList();
- final legend = json['legend'] != null
- ? SemanticTokensLegend.fromJson(json['legend'])
- : null;
- final range = json['range'] is bool
- ? Either2<bool, SemanticTokensOptionsRange>.t1(json['range'])
- : (SemanticTokensOptionsRange.canParse(
- json['range'], nullLspJsonReporter)
- ? Either2<bool, SemanticTokensOptionsRange>.t2(json['range'] != null
- ? SemanticTokensOptionsRange.fromJson(json['range'])
- : null)
- : (json['range'] == null
- ? null
+ final legend = SemanticTokensLegend.fromJson(json['legend']);
+ final range = json['range'] == null
+ ? null
+ : (json['range'] is bool
+ ? Either2<bool, SemanticTokensOptionsRange>.t1(json['range'])
+ : (SemanticTokensOptionsRange.canParse(
+ json['range'], nullLspJsonReporter)
+ ? Either2<bool, SemanticTokensOptionsRange>.t2(
+ SemanticTokensOptionsRange.fromJson(json['range']))
: (throw '''${json['range']} was not one of (bool, SemanticTokensOptionsRange)''')));
- final full = json['full'] is bool
- ? Either2<bool, SemanticTokensOptionsFull>.t1(json['full'])
- : (SemanticTokensOptionsFull.canParse(json['full'], nullLspJsonReporter)
- ? Either2<bool, SemanticTokensOptionsFull>.t2(json['full'] != null
- ? SemanticTokensOptionsFull.fromJson(json['full'])
- : null)
- : (json['full'] == null
- ? null
+ final full = json['full'] == null
+ ? null
+ : (json['full'] is bool
+ ? Either2<bool, SemanticTokensOptionsFull>.t1(json['full'])
+ : (SemanticTokensOptionsFull.canParse(
+ json['full'], nullLspJsonReporter)
+ ? Either2<bool, SemanticTokensOptionsFull>.t2(
+ SemanticTokensOptionsFull.fromJson(json['full']))
: (throw '''${json['full']} was not one of (bool, SemanticTokensOptionsFull)''')));
final workDoneProgress = json['workDoneProgress'];
final id = json['id'];
@@ -25728,28 +24537,27 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// Server supports providing semantic tokens for a full document.
- final Either2<bool, SemanticTokensOptionsFull> full;
+ final Either2<bool, SemanticTokensOptionsFull>? full;
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
+ final String? id;
/// The legend used by the server
final SemanticTokensLegend legend;
/// Server supports providing semantic tokens for a specific range of a
/// document.
- final Either2<bool, SemanticTokensOptionsRange> range;
- final bool workDoneProgress;
+ final Either2<bool, SemanticTokensOptionsRange>? range;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
__result['documentSelector'] = documentSelector;
- __result['legend'] =
- legend?.toJson() ?? (throw 'legend is required but was not set');
+ __result['legend'] = legend.toJson();
if (range != null) {
__result['range'] = range;
}
@@ -25902,7 +24710,7 @@
/// semantic tokens currently shown. It should be used with absolute care and
/// is useful for situation where a server for example detect a project wide
/// change that requires such a calculation.
- final bool refreshSupport;
+ final bool? refreshSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -25986,149 +24794,126 @@
this.workspace,
this.experimental});
static ServerCapabilities fromJson(Map<String, dynamic> json) {
- final textDocumentSync = TextDocumentSyncOptions.canParse(
- json['textDocumentSync'], nullLspJsonReporter)
- ? Either2<TextDocumentSyncOptions, TextDocumentSyncKind>.t1(
- json['textDocumentSync'] != null
- ? TextDocumentSyncOptions.fromJson(json['textDocumentSync'])
- : null)
- : (TextDocumentSyncKind.canParse(
+ final textDocumentSync = json['textDocumentSync'] == null
+ ? null
+ : (TextDocumentSyncOptions.canParse(
json['textDocumentSync'], nullLspJsonReporter)
- ? Either2<TextDocumentSyncOptions, TextDocumentSyncKind>.t2(
- json['textDocumentSync'] != null
- ? TextDocumentSyncKind.fromJson(json['textDocumentSync'])
- : null)
- : (json['textDocumentSync'] == null
- ? null
+ ? Either2<TextDocumentSyncOptions, TextDocumentSyncKind>.t1(
+ TextDocumentSyncOptions.fromJson(json['textDocumentSync']))
+ : (TextDocumentSyncKind.canParse(
+ json['textDocumentSync'], nullLspJsonReporter)
+ ? Either2<TextDocumentSyncOptions, TextDocumentSyncKind>.t2(
+ TextDocumentSyncKind.fromJson(json['textDocumentSync']))
: (throw '''${json['textDocumentSync']} was not one of (TextDocumentSyncOptions, TextDocumentSyncKind)''')));
final completionProvider = json['completionProvider'] != null
? CompletionOptions.fromJson(json['completionProvider'])
: null;
- final hoverProvider = json['hoverProvider'] is bool
- ? Either2<bool, HoverOptions>.t1(json['hoverProvider'])
- : (HoverOptions.canParse(json['hoverProvider'], nullLspJsonReporter)
- ? Either2<bool, HoverOptions>.t2(json['hoverProvider'] != null
- ? HoverOptions.fromJson(json['hoverProvider'])
- : null)
- : (json['hoverProvider'] == null
- ? null
+ final hoverProvider = json['hoverProvider'] == null
+ ? null
+ : (json['hoverProvider'] is bool
+ ? Either2<bool, HoverOptions>.t1(json['hoverProvider'])
+ : (HoverOptions.canParse(json['hoverProvider'], nullLspJsonReporter)
+ ? Either2<bool, HoverOptions>.t2(
+ HoverOptions.fromJson(json['hoverProvider']))
: (throw '''${json['hoverProvider']} was not one of (bool, HoverOptions)''')));
final signatureHelpProvider = json['signatureHelpProvider'] != null
? SignatureHelpOptions.fromJson(json['signatureHelpProvider'])
: null;
- final declarationProvider = json['declarationProvider'] is bool
- ? Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>.t1(
- json['declarationProvider'])
- : (DeclarationOptions.canParse(
- json['declarationProvider'], nullLspJsonReporter)
- ? Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>.t2(
- json['declarationProvider'] != null
- ? DeclarationOptions.fromJson(json['declarationProvider'])
- : null)
- : (DeclarationRegistrationOptions.canParse(
+ final declarationProvider = json['declarationProvider'] == null
+ ? null
+ : (json['declarationProvider'] is bool
+ ? Either3<bool, DeclarationOptions,
+ DeclarationRegistrationOptions>.t1(json['declarationProvider'])
+ : (DeclarationOptions.canParse(
json['declarationProvider'], nullLspJsonReporter)
- ? Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>.t3(
- json['declarationProvider'] != null
- ? DeclarationRegistrationOptions.fromJson(
- json['declarationProvider'])
- : null)
- : (json['declarationProvider'] == null
- ? null
+ ? Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>.t2(
+ DeclarationOptions.fromJson(json['declarationProvider']))
+ : (DeclarationRegistrationOptions.canParse(
+ json['declarationProvider'], nullLspJsonReporter)
+ ? Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>.t3(
+ DeclarationRegistrationOptions.fromJson(
+ json['declarationProvider']))
: (throw '''${json['declarationProvider']} was not one of (bool, DeclarationOptions, DeclarationRegistrationOptions)'''))));
- final definitionProvider = json['definitionProvider'] is bool
- ? Either2<bool, DefinitionOptions>.t1(json['definitionProvider'])
- : (DefinitionOptions.canParse(
- json['definitionProvider'], nullLspJsonReporter)
- ? Either2<bool, DefinitionOptions>.t2(
- json['definitionProvider'] != null
- ? DefinitionOptions.fromJson(json['definitionProvider'])
- : null)
- : (json['definitionProvider'] == null
- ? null
+ final definitionProvider = json['definitionProvider'] == null
+ ? null
+ : (json['definitionProvider'] is bool
+ ? Either2<bool, DefinitionOptions>.t1(json['definitionProvider'])
+ : (DefinitionOptions.canParse(
+ json['definitionProvider'], nullLspJsonReporter)
+ ? Either2<bool, DefinitionOptions>.t2(
+ DefinitionOptions.fromJson(json['definitionProvider']))
: (throw '''${json['definitionProvider']} was not one of (bool, DefinitionOptions)''')));
- final typeDefinitionProvider = json['typeDefinitionProvider'] is bool
- ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t1(
- json['typeDefinitionProvider'])
- : (TypeDefinitionOptions.canParse(
- json['typeDefinitionProvider'], nullLspJsonReporter)
- ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t2(json['typeDefinitionProvider'] != null
- ? TypeDefinitionOptions.fromJson(json['typeDefinitionProvider'])
- : null)
- : (TypeDefinitionRegistrationOptions.canParse(
+ final typeDefinitionProvider = json['typeDefinitionProvider'] == null
+ ? null
+ : (json['typeDefinitionProvider'] is bool
+ ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t1(
+ json['typeDefinitionProvider'])
+ : (TypeDefinitionOptions.canParse(
json['typeDefinitionProvider'], nullLspJsonReporter)
- ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t3(
- json['typeDefinitionProvider'] != null
- ? TypeDefinitionRegistrationOptions.fromJson(
- json['typeDefinitionProvider'])
- : null)
- : (json['typeDefinitionProvider'] == null
- ? null
+ ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t2(
+ TypeDefinitionOptions.fromJson(
+ json['typeDefinitionProvider']))
+ : (TypeDefinitionRegistrationOptions.canParse(
+ json['typeDefinitionProvider'], nullLspJsonReporter)
+ ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t3(
+ TypeDefinitionRegistrationOptions.fromJson(
+ json['typeDefinitionProvider']))
: (throw '''${json['typeDefinitionProvider']} was not one of (bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions)'''))));
- final implementationProvider = json['implementationProvider'] is bool
- ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t1(
- json['implementationProvider'])
- : (ImplementationOptions.canParse(
- json['implementationProvider'], nullLspJsonReporter)
- ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t2(json['implementationProvider'] != null
- ? ImplementationOptions.fromJson(json['implementationProvider'])
- : null)
- : (ImplementationRegistrationOptions.canParse(
+ final implementationProvider = json['implementationProvider'] == null
+ ? null
+ : (json['implementationProvider'] is bool
+ ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t1(
+ json['implementationProvider'])
+ : (ImplementationOptions.canParse(
json['implementationProvider'], nullLspJsonReporter)
- ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t3(
- json['implementationProvider'] != null
- ? ImplementationRegistrationOptions.fromJson(
- json['implementationProvider'])
- : null)
- : (json['implementationProvider'] == null
- ? null
+ ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t2(
+ ImplementationOptions.fromJson(
+ json['implementationProvider']))
+ : (ImplementationRegistrationOptions.canParse(
+ json['implementationProvider'], nullLspJsonReporter)
+ ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t3(
+ ImplementationRegistrationOptions.fromJson(
+ json['implementationProvider']))
: (throw '''${json['implementationProvider']} was not one of (bool, ImplementationOptions, ImplementationRegistrationOptions)'''))));
- final referencesProvider = json['referencesProvider'] is bool
- ? Either2<bool, ReferenceOptions>.t1(json['referencesProvider'])
- : (ReferenceOptions.canParse(
- json['referencesProvider'], nullLspJsonReporter)
- ? Either2<bool, ReferenceOptions>.t2(
- json['referencesProvider'] != null
- ? ReferenceOptions.fromJson(json['referencesProvider'])
- : null)
- : (json['referencesProvider'] == null
- ? null
+ final referencesProvider = json['referencesProvider'] == null
+ ? null
+ : (json['referencesProvider'] is bool
+ ? Either2<bool, ReferenceOptions>.t1(json['referencesProvider'])
+ : (ReferenceOptions.canParse(
+ json['referencesProvider'], nullLspJsonReporter)
+ ? Either2<bool, ReferenceOptions>.t2(
+ ReferenceOptions.fromJson(json['referencesProvider']))
: (throw '''${json['referencesProvider']} was not one of (bool, ReferenceOptions)''')));
- final documentHighlightProvider = json['documentHighlightProvider'] is bool
- ? Either2<bool, DocumentHighlightOptions>.t1(
- json['documentHighlightProvider'])
- : (DocumentHighlightOptions.canParse(
- json['documentHighlightProvider'], nullLspJsonReporter)
- ? Either2<bool, DocumentHighlightOptions>.t2(
- json['documentHighlightProvider'] != null
- ? DocumentHighlightOptions.fromJson(
- json['documentHighlightProvider'])
- : null)
- : (json['documentHighlightProvider'] == null
- ? null
+ final documentHighlightProvider = json['documentHighlightProvider'] == null
+ ? null
+ : (json['documentHighlightProvider'] is bool
+ ? Either2<bool, DocumentHighlightOptions>.t1(
+ json['documentHighlightProvider'])
+ : (DocumentHighlightOptions.canParse(
+ json['documentHighlightProvider'], nullLspJsonReporter)
+ ? Either2<bool, DocumentHighlightOptions>.t2(
+ DocumentHighlightOptions.fromJson(
+ json['documentHighlightProvider']))
: (throw '''${json['documentHighlightProvider']} was not one of (bool, DocumentHighlightOptions)''')));
- final documentSymbolProvider = json['documentSymbolProvider'] is bool
- ? Either2<bool, DocumentSymbolOptions>.t1(
- json['documentSymbolProvider'])
- : (DocumentSymbolOptions.canParse(
- json['documentSymbolProvider'], nullLspJsonReporter)
- ? Either2<bool, DocumentSymbolOptions>.t2(
- json['documentSymbolProvider'] != null
- ? DocumentSymbolOptions.fromJson(
- json['documentSymbolProvider'])
- : null)
- : (json['documentSymbolProvider'] == null
- ? null
+ final documentSymbolProvider = json['documentSymbolProvider'] == null
+ ? null
+ : (json['documentSymbolProvider'] is bool
+ ? Either2<bool, DocumentSymbolOptions>.t1(
+ json['documentSymbolProvider'])
+ : (DocumentSymbolOptions.canParse(
+ json['documentSymbolProvider'], nullLspJsonReporter)
+ ? Either2<bool, DocumentSymbolOptions>.t2(
+ DocumentSymbolOptions.fromJson(
+ json['documentSymbolProvider']))
: (throw '''${json['documentSymbolProvider']} was not one of (bool, DocumentSymbolOptions)''')));
- final codeActionProvider = json['codeActionProvider'] is bool
- ? Either2<bool, CodeActionOptions>.t1(json['codeActionProvider'])
- : (CodeActionOptions.canParse(
- json['codeActionProvider'], nullLspJsonReporter)
- ? Either2<bool, CodeActionOptions>.t2(
- json['codeActionProvider'] != null
- ? CodeActionOptions.fromJson(json['codeActionProvider'])
- : null)
- : (json['codeActionProvider'] == null
- ? null
+ final codeActionProvider = json['codeActionProvider'] == null
+ ? null
+ : (json['codeActionProvider'] is bool
+ ? Either2<bool, CodeActionOptions>.t1(json['codeActionProvider'])
+ : (CodeActionOptions.canParse(
+ json['codeActionProvider'], nullLspJsonReporter)
+ ? Either2<bool, CodeActionOptions>.t2(
+ CodeActionOptions.fromJson(json['codeActionProvider']))
: (throw '''${json['codeActionProvider']} was not one of (bool, CodeActionOptions)''')));
final codeLensProvider = json['codeLensProvider'] != null
? CodeLensOptions.fromJson(json['codeLensProvider'])
@@ -26136,190 +24921,166 @@
final documentLinkProvider = json['documentLinkProvider'] != null
? DocumentLinkOptions.fromJson(json['documentLinkProvider'])
: null;
- final colorProvider = json['colorProvider'] is bool
- ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t1(
- json['colorProvider'])
- : (DocumentColorOptions.canParse(
- json['colorProvider'], nullLspJsonReporter)
- ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t2(
- json['colorProvider'] != null
- ? DocumentColorOptions.fromJson(json['colorProvider'])
- : null)
- : (DocumentColorRegistrationOptions.canParse(
- json['colorProvider'], nullLspJsonReporter)
- ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t3(
- json['colorProvider'] != null
- ? DocumentColorRegistrationOptions.fromJson(
- json['colorProvider'])
- : null)
- : (json['colorProvider'] == null
- ? null
+ final colorProvider = json['colorProvider'] == null
+ ? null
+ : (json['colorProvider'] is bool
+ ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t1(
+ json['colorProvider'])
+ : (DocumentColorOptions.canParse(json['colorProvider'], nullLspJsonReporter)
+ ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t2(
+ DocumentColorOptions.fromJson(json['colorProvider']))
+ : (DocumentColorRegistrationOptions.canParse(
+ json['colorProvider'], nullLspJsonReporter)
+ ? Either3<bool, DocumentColorOptions,
+ DocumentColorRegistrationOptions>.t3(
+ DocumentColorRegistrationOptions.fromJson(
+ json['colorProvider']))
: (throw '''${json['colorProvider']} was not one of (bool, DocumentColorOptions, DocumentColorRegistrationOptions)'''))));
- final documentFormattingProvider = json['documentFormattingProvider']
- is bool
- ? Either2<bool, DocumentFormattingOptions>.t1(
- json['documentFormattingProvider'])
- : (DocumentFormattingOptions.canParse(
- json['documentFormattingProvider'], nullLspJsonReporter)
- ? Either2<bool, DocumentFormattingOptions>.t2(
- json['documentFormattingProvider'] != null
- ? DocumentFormattingOptions.fromJson(
- json['documentFormattingProvider'])
- : null)
- : (json['documentFormattingProvider'] == null
- ? null
+ final documentFormattingProvider = json['documentFormattingProvider'] ==
+ null
+ ? null
+ : (json['documentFormattingProvider'] is bool
+ ? Either2<bool, DocumentFormattingOptions>.t1(
+ json['documentFormattingProvider'])
+ : (DocumentFormattingOptions.canParse(
+ json['documentFormattingProvider'], nullLspJsonReporter)
+ ? Either2<bool, DocumentFormattingOptions>.t2(
+ DocumentFormattingOptions.fromJson(
+ json['documentFormattingProvider']))
: (throw '''${json['documentFormattingProvider']} was not one of (bool, DocumentFormattingOptions)''')));
final documentRangeFormattingProvider = json[
- 'documentRangeFormattingProvider'] is bool
- ? Either2<bool, DocumentRangeFormattingOptions>.t1(
- json['documentRangeFormattingProvider'])
- : (DocumentRangeFormattingOptions.canParse(
- json['documentRangeFormattingProvider'], nullLspJsonReporter)
- ? Either2<bool, DocumentRangeFormattingOptions>.t2(
- json['documentRangeFormattingProvider'] != null
- ? DocumentRangeFormattingOptions.fromJson(
- json['documentRangeFormattingProvider'])
- : null)
- : (json['documentRangeFormattingProvider'] == null
- ? null
+ 'documentRangeFormattingProvider'] ==
+ null
+ ? null
+ : (json['documentRangeFormattingProvider'] is bool
+ ? Either2<bool, DocumentRangeFormattingOptions>.t1(
+ json['documentRangeFormattingProvider'])
+ : (DocumentRangeFormattingOptions.canParse(
+ json['documentRangeFormattingProvider'],
+ nullLspJsonReporter)
+ ? Either2<bool, DocumentRangeFormattingOptions>.t2(
+ DocumentRangeFormattingOptions.fromJson(
+ json['documentRangeFormattingProvider']))
: (throw '''${json['documentRangeFormattingProvider']} was not one of (bool, DocumentRangeFormattingOptions)''')));
final documentOnTypeFormattingProvider =
json['documentOnTypeFormattingProvider'] != null
? DocumentOnTypeFormattingOptions.fromJson(
json['documentOnTypeFormattingProvider'])
: null;
- final renameProvider = json['renameProvider'] is bool
- ? Either2<bool, RenameOptions>.t1(json['renameProvider'])
- : (RenameOptions.canParse(json['renameProvider'], nullLspJsonReporter)
- ? Either2<bool, RenameOptions>.t2(json['renameProvider'] != null
- ? RenameOptions.fromJson(json['renameProvider'])
- : null)
- : (json['renameProvider'] == null
- ? null
+ final renameProvider = json['renameProvider'] == null
+ ? null
+ : (json['renameProvider'] is bool
+ ? Either2<bool, RenameOptions>.t1(json['renameProvider'])
+ : (RenameOptions.canParse(
+ json['renameProvider'], nullLspJsonReporter)
+ ? Either2<bool, RenameOptions>.t2(
+ RenameOptions.fromJson(json['renameProvider']))
: (throw '''${json['renameProvider']} was not one of (bool, RenameOptions)''')));
- final foldingRangeProvider = json['foldingRangeProvider'] is bool
- ? Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>.t1(
- json['foldingRangeProvider'])
- : (FoldingRangeOptions.canParse(
- json['foldingRangeProvider'], nullLspJsonReporter)
- ? Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>.t2(
- json['foldingRangeProvider'] != null
- ? FoldingRangeOptions.fromJson(json['foldingRangeProvider'])
- : null)
- : (FoldingRangeRegistrationOptions.canParse(
+ final foldingRangeProvider = json['foldingRangeProvider'] == null
+ ? null
+ : (json['foldingRangeProvider'] is bool
+ ? Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>.t1(
+ json['foldingRangeProvider'])
+ : (FoldingRangeOptions.canParse(
json['foldingRangeProvider'], nullLspJsonReporter)
- ? Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>.t3(
- json['foldingRangeProvider'] != null
- ? FoldingRangeRegistrationOptions.fromJson(
- json['foldingRangeProvider'])
- : null)
- : (json['foldingRangeProvider'] == null
- ? null
+ ? Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>.t2(
+ FoldingRangeOptions.fromJson(json['foldingRangeProvider']))
+ : (FoldingRangeRegistrationOptions.canParse(
+ json['foldingRangeProvider'], nullLspJsonReporter)
+ ? Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>.t3(
+ FoldingRangeRegistrationOptions.fromJson(
+ json['foldingRangeProvider']))
: (throw '''${json['foldingRangeProvider']} was not one of (bool, FoldingRangeOptions, FoldingRangeRegistrationOptions)'''))));
final executeCommandProvider = json['executeCommandProvider'] != null
? ExecuteCommandOptions.fromJson(json['executeCommandProvider'])
: null;
- final selectionRangeProvider = json['selectionRangeProvider'] is bool
- ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t1(
- json['selectionRangeProvider'])
- : (SelectionRangeOptions.canParse(
- json['selectionRangeProvider'], nullLspJsonReporter)
- ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t2(json['selectionRangeProvider'] != null
- ? SelectionRangeOptions.fromJson(json['selectionRangeProvider'])
- : null)
- : (SelectionRangeRegistrationOptions.canParse(
+ final selectionRangeProvider = json['selectionRangeProvider'] == null
+ ? null
+ : (json['selectionRangeProvider'] is bool
+ ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t1(
+ json['selectionRangeProvider'])
+ : (SelectionRangeOptions.canParse(
json['selectionRangeProvider'], nullLspJsonReporter)
- ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t3(
- json['selectionRangeProvider'] != null
- ? SelectionRangeRegistrationOptions.fromJson(
- json['selectionRangeProvider'])
- : null)
- : (json['selectionRangeProvider'] == null
- ? null
+ ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t2(
+ SelectionRangeOptions.fromJson(
+ json['selectionRangeProvider']))
+ : (SelectionRangeRegistrationOptions.canParse(
+ json['selectionRangeProvider'], nullLspJsonReporter)
+ ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t3(
+ SelectionRangeRegistrationOptions.fromJson(
+ json['selectionRangeProvider']))
: (throw '''${json['selectionRangeProvider']} was not one of (bool, SelectionRangeOptions, SelectionRangeRegistrationOptions)'''))));
- final linkedEditingRangeProvider = json['linkedEditingRangeProvider']
- is bool
- ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t1(
- json['linkedEditingRangeProvider'])
- : (LinkedEditingRangeOptions.canParse(json['linkedEditingRangeProvider'], nullLspJsonReporter)
- ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t2(
- json['linkedEditingRangeProvider'] != null
- ? LinkedEditingRangeOptions.fromJson(
- json['linkedEditingRangeProvider'])
- : null)
- : (LinkedEditingRangeRegistrationOptions.canParse(json['linkedEditingRangeProvider'], nullLspJsonReporter)
- ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t3(
- json['linkedEditingRangeProvider'] != null
- ? LinkedEditingRangeRegistrationOptions.fromJson(
- json['linkedEditingRangeProvider'])
- : null)
- : (json['linkedEditingRangeProvider'] == null
- ? null
+ final linkedEditingRangeProvider = json['linkedEditingRangeProvider'] == null
+ ? null
+ : (json['linkedEditingRangeProvider'] is bool
+ ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t1(
+ json['linkedEditingRangeProvider'])
+ : (LinkedEditingRangeOptions.canParse(
+ json['linkedEditingRangeProvider'], nullLspJsonReporter)
+ ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t2(
+ LinkedEditingRangeOptions.fromJson(
+ json['linkedEditingRangeProvider']))
+ : (LinkedEditingRangeRegistrationOptions.canParse(
+ json['linkedEditingRangeProvider'], nullLspJsonReporter)
+ ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t3(
+ LinkedEditingRangeRegistrationOptions.fromJson(
+ json['linkedEditingRangeProvider']))
: (throw '''${json['linkedEditingRangeProvider']} was not one of (bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions)'''))));
- final callHierarchyProvider = json['callHierarchyProvider'] is bool
- ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t1(
- json['callHierarchyProvider'])
- : (CallHierarchyOptions.canParse(
- json['callHierarchyProvider'], nullLspJsonReporter)
- ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t2(json['callHierarchyProvider'] != null
- ? CallHierarchyOptions.fromJson(json['callHierarchyProvider'])
- : null)
- : (CallHierarchyRegistrationOptions.canParse(
+ final callHierarchyProvider = json['callHierarchyProvider'] == null
+ ? null
+ : (json['callHierarchyProvider'] is bool
+ ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t1(
+ json['callHierarchyProvider'])
+ : (CallHierarchyOptions.canParse(
json['callHierarchyProvider'], nullLspJsonReporter)
- ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t3(
- json['callHierarchyProvider'] != null
- ? CallHierarchyRegistrationOptions.fromJson(
- json['callHierarchyProvider'])
- : null)
- : (json['callHierarchyProvider'] == null
- ? null
+ ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t2(
+ CallHierarchyOptions.fromJson(
+ json['callHierarchyProvider']))
+ : (CallHierarchyRegistrationOptions.canParse(
+ json['callHierarchyProvider'], nullLspJsonReporter)
+ ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t3(
+ CallHierarchyRegistrationOptions.fromJson(
+ json['callHierarchyProvider']))
: (throw '''${json['callHierarchyProvider']} was not one of (bool, CallHierarchyOptions, CallHierarchyRegistrationOptions)'''))));
- final semanticTokensProvider = SemanticTokensOptions.canParse(
- json['semanticTokensProvider'], nullLspJsonReporter)
- ? Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>.t1(
- json['semanticTokensProvider'] != null
- ? SemanticTokensOptions.fromJson(json['semanticTokensProvider'])
- : null)
- : (SemanticTokensRegistrationOptions.canParse(
+ final semanticTokensProvider = json['semanticTokensProvider'] == null
+ ? null
+ : (SemanticTokensOptions.canParse(
json['semanticTokensProvider'], nullLspJsonReporter)
- ? Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>.t2(
- json['semanticTokensProvider'] != null
- ? SemanticTokensRegistrationOptions.fromJson(
- json['semanticTokensProvider'])
- : null)
- : (json['semanticTokensProvider'] == null
- ? null
+ ? Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>.t1(
+ SemanticTokensOptions.fromJson(json['semanticTokensProvider']))
+ : (SemanticTokensRegistrationOptions.canParse(
+ json['semanticTokensProvider'], nullLspJsonReporter)
+ ? Either2<SemanticTokensOptions,
+ SemanticTokensRegistrationOptions>.t2(
+ SemanticTokensRegistrationOptions.fromJson(
+ json['semanticTokensProvider']))
: (throw '''${json['semanticTokensProvider']} was not one of (SemanticTokensOptions, SemanticTokensRegistrationOptions)''')));
- final monikerProvider = json['monikerProvider'] is bool
- ? Either3<bool, MonikerOptions, MonikerRegistrationOptions>.t1(
- json['monikerProvider'])
- : (MonikerOptions.canParse(json['monikerProvider'], nullLspJsonReporter)
- ? Either3<bool, MonikerOptions, MonikerRegistrationOptions>.t2(
- json['monikerProvider'] != null
- ? MonikerOptions.fromJson(json['monikerProvider'])
- : null)
- : (MonikerRegistrationOptions.canParse(
+ final monikerProvider = json['monikerProvider'] == null
+ ? null
+ : (json['monikerProvider'] is bool
+ ? Either3<bool, MonikerOptions, MonikerRegistrationOptions>.t1(
+ json['monikerProvider'])
+ : (MonikerOptions.canParse(
json['monikerProvider'], nullLspJsonReporter)
- ? Either3<bool, MonikerOptions, MonikerRegistrationOptions>.t3(
- json['monikerProvider'] != null
- ? MonikerRegistrationOptions.fromJson(
- json['monikerProvider'])
- : null)
- : (json['monikerProvider'] == null
- ? null
+ ? Either3<bool, MonikerOptions, MonikerRegistrationOptions>.t2(
+ MonikerOptions.fromJson(json['monikerProvider']))
+ : (MonikerRegistrationOptions.canParse(
+ json['monikerProvider'], nullLspJsonReporter)
+ ? Either3<bool, MonikerOptions,
+ MonikerRegistrationOptions>.t3(
+ MonikerRegistrationOptions.fromJson(
+ json['monikerProvider']))
: (throw '''${json['monikerProvider']} was not one of (bool, MonikerOptions, MonikerRegistrationOptions)'''))));
- final workspaceSymbolProvider = json['workspaceSymbolProvider'] is bool
- ? Either2<bool, WorkspaceSymbolOptions>.t1(
- json['workspaceSymbolProvider'])
- : (WorkspaceSymbolOptions.canParse(
- json['workspaceSymbolProvider'], nullLspJsonReporter)
- ? Either2<bool, WorkspaceSymbolOptions>.t2(
- json['workspaceSymbolProvider'] != null
- ? WorkspaceSymbolOptions.fromJson(
- json['workspaceSymbolProvider'])
- : null)
- : (json['workspaceSymbolProvider'] == null
- ? null
+ final workspaceSymbolProvider = json['workspaceSymbolProvider'] == null
+ ? null
+ : (json['workspaceSymbolProvider'] is bool
+ ? Either2<bool, WorkspaceSymbolOptions>.t1(
+ json['workspaceSymbolProvider'])
+ : (WorkspaceSymbolOptions.canParse(
+ json['workspaceSymbolProvider'], nullLspJsonReporter)
+ ? Either2<bool, WorkspaceSymbolOptions>.t2(
+ WorkspaceSymbolOptions.fromJson(
+ json['workspaceSymbolProvider']))
: (throw '''${json['workspaceSymbolProvider']} was not one of (bool, WorkspaceSymbolOptions)''')));
final workspace = json['workspace'] != null
? ServerCapabilitiesWorkspace.fromJson(json['workspace'])
@@ -26359,118 +25120,119 @@
/// The server provides call hierarchy support.
/// @since 3.16.0
- final Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>
+ final Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>?
callHierarchyProvider;
/// The server provides code actions. The `CodeActionOptions` return type is
/// only valid if the client signals code action literal support via the
/// property `textDocument.codeAction.codeActionLiteralSupport`.
- final Either2<bool, CodeActionOptions> codeActionProvider;
+ final Either2<bool, CodeActionOptions>? codeActionProvider;
/// The server provides code lens.
- final CodeLensOptions codeLensProvider;
+ final CodeLensOptions? codeLensProvider;
/// The server provides color provider support.
/// @since 3.6.0
- final Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>
+ final Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>?
colorProvider;
/// The server provides completion support.
- final CompletionOptions completionProvider;
+ final CompletionOptions? completionProvider;
/// The server provides go to declaration support.
/// @since 3.14.0
- final Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>
+ final Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>?
declarationProvider;
/// The server provides goto definition support.
- final Either2<bool, DefinitionOptions> definitionProvider;
+ final Either2<bool, DefinitionOptions>? definitionProvider;
/// The server provides document formatting.
- final Either2<bool, DocumentFormattingOptions> documentFormattingProvider;
+ final Either2<bool, DocumentFormattingOptions>? documentFormattingProvider;
/// The server provides document highlight support.
- final Either2<bool, DocumentHighlightOptions> documentHighlightProvider;
+ final Either2<bool, DocumentHighlightOptions>? documentHighlightProvider;
/// The server provides document link support.
- final DocumentLinkOptions documentLinkProvider;
+ final DocumentLinkOptions? documentLinkProvider;
/// The server provides document formatting on typing.
- final DocumentOnTypeFormattingOptions documentOnTypeFormattingProvider;
+ final DocumentOnTypeFormattingOptions? documentOnTypeFormattingProvider;
/// The server provides document range formatting.
- final Either2<bool, DocumentRangeFormattingOptions>
+ final Either2<bool, DocumentRangeFormattingOptions>?
documentRangeFormattingProvider;
/// The server provides document symbol support.
- final Either2<bool, DocumentSymbolOptions> documentSymbolProvider;
+ final Either2<bool, DocumentSymbolOptions>? documentSymbolProvider;
/// The server provides execute command support.
- final ExecuteCommandOptions executeCommandProvider;
+ final ExecuteCommandOptions? executeCommandProvider;
/// Experimental server capabilities.
final dynamic experimental;
/// The server provides folding provider support.
/// @since 3.10.0
- final Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>
+ final Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>?
foldingRangeProvider;
/// The server provides hover support.
- final Either2<bool, HoverOptions> hoverProvider;
+ final Either2<bool, HoverOptions>? hoverProvider;
/// The server provides goto implementation support.
/// @since 3.6.0
- final Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>
+ final Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>?
implementationProvider;
/// The server provides linked editing range support.
/// @since 3.16.0
final Either3<bool, LinkedEditingRangeOptions,
- LinkedEditingRangeRegistrationOptions> linkedEditingRangeProvider;
+ LinkedEditingRangeRegistrationOptions>? linkedEditingRangeProvider;
/// Whether server provides moniker support.
/// @since 3.16.0
- final Either3<bool, MonikerOptions, MonikerRegistrationOptions>
+ final Either3<bool, MonikerOptions, MonikerRegistrationOptions>?
monikerProvider;
/// The server provides find references support.
- final Either2<bool, ReferenceOptions> referencesProvider;
+ final Either2<bool, ReferenceOptions>? referencesProvider;
/// The server provides rename support. RenameOptions may only be specified if
/// the client states that it supports `prepareSupport` in its initial
/// `initialize` request.
- final Either2<bool, RenameOptions> renameProvider;
+ final Either2<bool, RenameOptions>? renameProvider;
/// The server provides selection range support.
/// @since 3.15.0
- final Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>
+ final Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>?
selectionRangeProvider;
/// The server provides semantic tokens support.
/// @since 3.16.0
- final Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>
+ final Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>?
semanticTokensProvider;
/// The server provides signature help support.
- final SignatureHelpOptions signatureHelpProvider;
+ final SignatureHelpOptions? signatureHelpProvider;
/// Defines how text documents are synced. Is either a detailed structure
/// defining each notification or for backwards compatibility the
/// TextDocumentSyncKind number. If omitted it defaults to
/// `TextDocumentSyncKind.None`.
- final Either2<TextDocumentSyncOptions, TextDocumentSyncKind> textDocumentSync;
+ final Either2<TextDocumentSyncOptions, TextDocumentSyncKind>?
+ textDocumentSync;
/// The server provides goto type definition support.
/// @since 3.6.0
- final Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>
+ final Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>?
typeDefinitionProvider;
/// Workspace specific server capabilities
- final ServerCapabilitiesWorkspace workspace;
+ final ServerCapabilitiesWorkspace? workspace;
/// The server provides workspace symbol support.
- final Either2<bool, WorkspaceSymbolOptions> workspaceSymbolProvider;
+ final Either2<bool, WorkspaceSymbolOptions>? workspaceSymbolProvider;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -26478,13 +25240,13 @@
__result['textDocumentSync'] = textDocumentSync;
}
if (completionProvider != null) {
- __result['completionProvider'] = completionProvider.toJson();
+ __result['completionProvider'] = completionProvider?.toJson();
}
if (hoverProvider != null) {
__result['hoverProvider'] = hoverProvider;
}
if (signatureHelpProvider != null) {
- __result['signatureHelpProvider'] = signatureHelpProvider.toJson();
+ __result['signatureHelpProvider'] = signatureHelpProvider?.toJson();
}
if (declarationProvider != null) {
__result['declarationProvider'] = declarationProvider;
@@ -26511,10 +25273,10 @@
__result['codeActionProvider'] = codeActionProvider;
}
if (codeLensProvider != null) {
- __result['codeLensProvider'] = codeLensProvider.toJson();
+ __result['codeLensProvider'] = codeLensProvider?.toJson();
}
if (documentLinkProvider != null) {
- __result['documentLinkProvider'] = documentLinkProvider.toJson();
+ __result['documentLinkProvider'] = documentLinkProvider?.toJson();
}
if (colorProvider != null) {
__result['colorProvider'] = colorProvider;
@@ -26528,7 +25290,7 @@
}
if (documentOnTypeFormattingProvider != null) {
__result['documentOnTypeFormattingProvider'] =
- documentOnTypeFormattingProvider.toJson();
+ documentOnTypeFormattingProvider?.toJson();
}
if (renameProvider != null) {
__result['renameProvider'] = renameProvider;
@@ -26537,7 +25299,7 @@
__result['foldingRangeProvider'] = foldingRangeProvider;
}
if (executeCommandProvider != null) {
- __result['executeCommandProvider'] = executeCommandProvider.toJson();
+ __result['executeCommandProvider'] = executeCommandProvider?.toJson();
}
if (selectionRangeProvider != null) {
__result['selectionRangeProvider'] = selectionRangeProvider;
@@ -26558,7 +25320,7 @@
__result['workspaceSymbolProvider'] = workspaceSymbolProvider;
}
if (workspace != null) {
- __result['workspace'] = workspace.toJson();
+ __result['workspace'] = workspace?.toJson();
}
if (experimental != null) {
__result['experimental'] = experimental;
@@ -26932,15 +25694,6 @@
} finally {
reporter.pop();
}
- reporter.push('experimental');
- try {
- if (obj['experimental'] != null && !(true)) {
- reporter.reportError('must be of type dynamic');
- return false;
- }
- } finally {
- reporter.pop();
- }
return true;
} else {
reporter.reportError('must be of type ServerCapabilities');
@@ -27070,42 +25823,42 @@
}
/// The server is interested in receiving didCreateFiles notifications.
- final FileOperationRegistrationOptions didCreate;
+ final FileOperationRegistrationOptions? didCreate;
/// The server is interested in receiving didDeleteFiles file notifications.
- final FileOperationRegistrationOptions didDelete;
+ final FileOperationRegistrationOptions? didDelete;
/// The server is interested in receiving didRenameFiles notifications.
- final FileOperationRegistrationOptions didRename;
+ final FileOperationRegistrationOptions? didRename;
/// The server is interested in receiving willCreateFiles requests.
- final FileOperationRegistrationOptions willCreate;
+ final FileOperationRegistrationOptions? willCreate;
/// The server is interested in receiving willDeleteFiles file requests.
- final FileOperationRegistrationOptions willDelete;
+ final FileOperationRegistrationOptions? willDelete;
/// The server is interested in receiving willRenameFiles requests.
- final FileOperationRegistrationOptions willRename;
+ final FileOperationRegistrationOptions? willRename;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (didCreate != null) {
- __result['didCreate'] = didCreate.toJson();
+ __result['didCreate'] = didCreate?.toJson();
}
if (willCreate != null) {
- __result['willCreate'] = willCreate.toJson();
+ __result['willCreate'] = willCreate?.toJson();
}
if (didRename != null) {
- __result['didRename'] = didRename.toJson();
+ __result['didRename'] = didRename?.toJson();
}
if (willRename != null) {
- __result['willRename'] = willRename.toJson();
+ __result['willRename'] = willRename?.toJson();
}
if (didDelete != null) {
- __result['didDelete'] = didDelete.toJson();
+ __result['didDelete'] = didDelete?.toJson();
}
if (willDelete != null) {
- __result['willDelete'] = willDelete.toJson();
+ __result['willDelete'] = willDelete?.toJson();
}
return __result;
}
@@ -27241,19 +25994,19 @@
/// The server is interested in file notifications/requests.
/// @since 3.16.0
- final ServerCapabilitiesFileOperations fileOperations;
+ final ServerCapabilitiesFileOperations? fileOperations;
/// The server supports workspace folder.
/// @since 3.6.0
- final WorkspaceFoldersServerCapabilities workspaceFolders;
+ final WorkspaceFoldersServerCapabilities? workspaceFolders;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (workspaceFolders != null) {
- __result['workspaceFolders'] = workspaceFolders.toJson();
+ __result['workspaceFolders'] = workspaceFolders?.toJson();
}
if (fileOperations != null) {
- __result['fileOperations'] = fileOperations.toJson();
+ __result['fileOperations'] = fileOperations?.toJson();
}
return __result;
}
@@ -27318,11 +26071,7 @@
static const jsonHandler =
LspJsonHandler(SetTraceParams.canParse, SetTraceParams.fromJson);
- SetTraceParams({@required this.value}) {
- if (value == null) {
- throw 'value is required but was not provided';
- }
- }
+ SetTraceParams({required this.value});
static SetTraceParams fromJson(Map<String, dynamic> json) {
final value = const {'off', 'message', 'verbose'}.contains(json['value'])
? json['value']
@@ -27335,7 +26084,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['value'] = value ?? (throw 'value is required but was not set');
+ __result['value'] = value;
return __result;
}
@@ -27393,11 +26142,7 @@
ShowDocumentClientCapabilities.canParse,
ShowDocumentClientCapabilities.fromJson);
- ShowDocumentClientCapabilities({@required this.support}) {
- if (support == null) {
- throw 'support is required but was not provided';
- }
- }
+ ShowDocumentClientCapabilities({required this.support});
static ShowDocumentClientCapabilities fromJson(Map<String, dynamic> json) {
final support = json['support'];
return ShowDocumentClientCapabilities(support: support);
@@ -27408,8 +26153,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['support'] =
- support ?? (throw 'support is required but was not set');
+ __result['support'] = support;
return __result;
}
@@ -27466,11 +26210,7 @@
LspJsonHandler(ShowDocumentParams.canParse, ShowDocumentParams.fromJson);
ShowDocumentParams(
- {@required this.uri, this.external, this.takeFocus, this.selection}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- }
+ {required this.uri, this.external, this.takeFocus, this.selection});
static ShowDocumentParams fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
final external = json['external'];
@@ -27487,24 +26227,24 @@
/// Indicates to show the resource in an external program. To show for example
/// `https://code.visualstudio.com/` in the default WEB browser set `external`
/// to `true`.
- final bool external;
+ final bool? external;
/// An optional selection range if the document is a text document. Clients
/// might ignore the property if an external program is started or the file is
/// not a text file.
- final Range selection;
+ final Range? selection;
/// An optional property to indicate whether the editor showing the document
/// should take focus or not. Clients might ignore this property if an
/// external program is started.
- final bool takeFocus;
+ final bool? takeFocus;
/// The document uri to show.
final String uri;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
+ __result['uri'] = uri;
if (external != null) {
__result['external'] = external;
}
@@ -27512,7 +26252,7 @@
__result['takeFocus'] = takeFocus;
}
if (selection != null) {
- __result['selection'] = selection.toJson();
+ __result['selection'] = selection?.toJson();
}
return __result;
}
@@ -27604,11 +26344,7 @@
static const jsonHandler =
LspJsonHandler(ShowDocumentResult.canParse, ShowDocumentResult.fromJson);
- ShowDocumentResult({@required this.success}) {
- if (success == null) {
- throw 'success is required but was not provided';
- }
- }
+ ShowDocumentResult({required this.success});
static ShowDocumentResult fromJson(Map<String, dynamic> json) {
final success = json['success'];
return ShowDocumentResult(success: success);
@@ -27619,8 +26355,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['success'] =
- success ?? (throw 'success is required but was not set');
+ __result['success'] = success;
return __result;
}
@@ -27674,17 +26409,9 @@
static const jsonHandler =
LspJsonHandler(ShowMessageParams.canParse, ShowMessageParams.fromJson);
- ShowMessageParams({@required this.type, @required this.message}) {
- if (type == null) {
- throw 'type is required but was not provided';
- }
- if (message == null) {
- throw 'message is required but was not provided';
- }
- }
+ ShowMessageParams({required this.type, required this.message});
static ShowMessageParams fromJson(Map<String, dynamic> json) {
- final type =
- json['type'] != null ? MessageType.fromJson(json['type']) : null;
+ final type = MessageType.fromJson(json['type']);
final message = json['message'];
return ShowMessageParams(type: type, message: message);
}
@@ -27697,10 +26424,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['type'] =
- type?.toJson() ?? (throw 'type is required but was not set');
- __result['message'] =
- message ?? (throw 'message is required but was not set');
+ __result['type'] = type.toJson();
+ __result['message'] = message;
return __result;
}
@@ -27785,12 +26510,13 @@
}
/// Capabilities specific to the `MessageActionItem` type.
- final ShowMessageRequestClientCapabilitiesMessageActionItem messageActionItem;
+ final ShowMessageRequestClientCapabilitiesMessageActionItem?
+ messageActionItem;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (messageActionItem != null) {
- __result['messageActionItem'] = messageActionItem.toJson();
+ __result['messageActionItem'] = messageActionItem?.toJson();
}
return __result;
}
@@ -27854,7 +26580,7 @@
/// Whether the client supports additional attributes which are preserved and
/// sent back to the server in the request's response.
- final bool additionalPropertiesSupport;
+ final bool? additionalPropertiesSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -27911,17 +26637,9 @@
ShowMessageRequestParams.canParse, ShowMessageRequestParams.fromJson);
ShowMessageRequestParams(
- {@required this.type, @required this.message, this.actions}) {
- if (type == null) {
- throw 'type is required but was not provided';
- }
- if (message == null) {
- throw 'message is required but was not provided';
- }
- }
+ {required this.type, required this.message, this.actions});
static ShowMessageRequestParams fromJson(Map<String, dynamic> json) {
- final type =
- json['type'] != null ? MessageType.fromJson(json['type']) : null;
+ final type = MessageType.fromJson(json['type']);
final message = json['message'];
final actions = json['actions']
?.map((item) => item != null ? MessageActionItem.fromJson(item) : null)
@@ -27932,7 +26650,7 @@
}
/// The message action items to present.
- final List<MessageActionItem> actions;
+ final List<MessageActionItem>? actions;
/// The actual message
final String message;
@@ -27942,12 +26660,10 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['type'] =
- type?.toJson() ?? (throw 'type is required but was not set');
- __result['message'] =
- message ?? (throw 'message is required but was not set');
+ __result['type'] = type.toJson();
+ __result['message'] = message;
if (actions != null) {
- __result['actions'] = actions.map((item) => item.toJson()).toList();
+ __result['actions'] = actions?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -28040,15 +26756,10 @@
LspJsonHandler(SignatureHelp.canParse, SignatureHelp.fromJson);
SignatureHelp(
- {@required this.signatures, this.activeSignature, this.activeParameter}) {
- if (signatures == null) {
- throw 'signatures is required but was not provided';
- }
- }
+ {required this.signatures, this.activeSignature, this.activeParameter});
static SignatureHelp fromJson(Map<String, dynamic> json) {
final signatures = json['signatures']
- ?.map(
- (item) => item != null ? SignatureInformation.fromJson(item) : null)
+ ?.map((item) => SignatureInformation.fromJson(item))
?.cast<SignatureInformation>()
?.toList();
final activeSignature = json['activeSignature'];
@@ -28065,7 +26776,7 @@
/// parameters it is ignored. In future version of the protocol this property
/// might become mandatory to better express the active parameter if the
/// active signature does have any.
- final num activeParameter;
+ final num? activeParameter;
/// The active signature. If omitted or the value lies outside the range of
/// `signatures` the value defaults to zero or is ignore if the
@@ -28076,7 +26787,7 @@
///
/// In future version of the protocol this property might become mandatory to
/// better express this.
- final num activeSignature;
+ final num? activeSignature;
/// One or more signatures. If no signatures are available the signature help
/// request should return `null`.
@@ -28084,9 +26795,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['signatures'] =
- signatures?.map((item) => item.toJson())?.toList() ??
- (throw 'signatures is required but was not set');
+ __result['signatures'] = signatures.map((item) => item.toJson()).toList();
if (activeSignature != null) {
__result['activeSignature'] = activeSignature;
}
@@ -28196,14 +26905,14 @@
/// contextSupport will also support the `retriggerCharacters` on
/// `SignatureHelpOptions`.
/// @since 3.15.0
- final bool contextSupport;
+ final bool? contextSupport;
/// Whether signature help supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// The client supports the following `SignatureInformation` specific
/// properties.
- final SignatureHelpClientCapabilitiesSignatureInformation
+ final SignatureHelpClientCapabilitiesSignatureInformation?
signatureInformation;
Map<String, dynamic> toJson() {
@@ -28212,7 +26921,7 @@
__result['dynamicRegistration'] = dynamicRegistration;
}
if (signatureInformation != null) {
- __result['signatureInformation'] = signatureInformation.toJson();
+ __result['signatureInformation'] = signatureInformation?.toJson();
}
if (contextSupport != null) {
__result['contextSupport'] = contextSupport;
@@ -28303,7 +27012,7 @@
/// The client supports processing label offsets instead of a simple label
/// string.
/// @since 3.14.0
- final bool labelOffsetSupport;
+ final bool? labelOffsetSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -28384,24 +27093,24 @@
/// The client supports the `activeParameter` property on
/// `SignatureInformation` literal.
/// @since 3.16.0
- final bool activeParameterSupport;
+ final bool? activeParameterSupport;
/// Client supports the follow content formats for the documentation property.
/// The order describes the preferred format of the client.
- final List<MarkupKind> documentationFormat;
+ final List<MarkupKind>? documentationFormat;
/// Client capabilities specific to parameter information.
- final SignatureHelpClientCapabilitiesParameterInformation
+ final SignatureHelpClientCapabilitiesParameterInformation?
parameterInformation;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (documentationFormat != null) {
__result['documentationFormat'] =
- documentationFormat.map((item) => item.toJson()).toList();
+ documentationFormat?.map((item) => item.toJson()).toList();
}
if (parameterInformation != null) {
- __result['parameterInformation'] = parameterInformation.toJson();
+ __result['parameterInformation'] = parameterInformation?.toJson();
}
if (activeParameterSupport != null) {
__result['activeParameterSupport'] = activeParameterSupport;
@@ -28488,21 +27197,12 @@
SignatureHelpContext.canParse, SignatureHelpContext.fromJson);
SignatureHelpContext(
- {@required this.triggerKind,
+ {required this.triggerKind,
this.triggerCharacter,
- @required this.isRetrigger,
- this.activeSignatureHelp}) {
- if (triggerKind == null) {
- throw 'triggerKind is required but was not provided';
- }
- if (isRetrigger == null) {
- throw 'isRetrigger is required but was not provided';
- }
- }
+ required this.isRetrigger,
+ this.activeSignatureHelp});
static SignatureHelpContext fromJson(Map<String, dynamic> json) {
- final triggerKind = json['triggerKind'] != null
- ? SignatureHelpTriggerKind.fromJson(json['triggerKind'])
- : null;
+ final triggerKind = SignatureHelpTriggerKind.fromJson(json['triggerKind']);
final triggerCharacter = json['triggerCharacter'];
final isRetrigger = json['isRetrigger'];
final activeSignatureHelp = json['activeSignatureHelp'] != null
@@ -28519,7 +27219,7 @@
///
/// The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field
/// updated based on the user navigating through available signatures.
- final SignatureHelp activeSignatureHelp;
+ final SignatureHelp? activeSignatureHelp;
/// `true` if signature help was already showing when it was triggered.
///
@@ -28532,22 +27232,20 @@
///
/// This is undefined when triggerKind !==
/// SignatureHelpTriggerKind.TriggerCharacter
- final String triggerCharacter;
+ final String? triggerCharacter;
/// Action that caused signature help to be triggered.
final SignatureHelpTriggerKind triggerKind;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['triggerKind'] = triggerKind?.toJson() ??
- (throw 'triggerKind is required but was not set');
+ __result['triggerKind'] = triggerKind.toJson();
if (triggerCharacter != null) {
__result['triggerCharacter'] = triggerCharacter;
}
- __result['isRetrigger'] =
- isRetrigger ?? (throw 'isRetrigger is required but was not set');
+ __result['isRetrigger'] = isRetrigger;
if (activeSignatureHelp != null) {
- __result['activeSignatureHelp'] = activeSignatureHelp.toJson();
+ __result['activeSignatureHelp'] = activeSignatureHelp?.toJson();
}
return __result;
}
@@ -28675,11 +27373,11 @@
/// These trigger characters are only active when signature help is already
/// showing. All trigger characters are also counted as re-trigger characters.
/// @since 3.15.0
- final List<String> retriggerCharacters;
+ final List<String>? retriggerCharacters;
/// The characters that trigger signature help automatically.
- final List<String> triggerCharacters;
- final bool workDoneProgress;
+ final List<String>? triggerCharacters;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -28771,31 +27469,21 @@
SignatureHelpParams(
{this.context,
- @required this.textDocument,
- @required this.position,
- this.workDoneToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ required this.textDocument,
+ required this.position,
+ this.workDoneToken});
static SignatureHelpParams fromJson(Map<String, dynamic> json) {
final context = json['context'] != null
? SignatureHelpContext.fromJson(json['context'])
: null;
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return SignatureHelpParams(
context: context,
@@ -28808,7 +27496,7 @@
/// to send this using the client capability
/// `textDocument.signatureHelp.contextSupport === true`
/// @since 3.15.0
- final SignatureHelpContext context;
+ final SignatureHelpContext? context;
/// The position inside the text document.
final Position position;
@@ -28817,17 +27505,15 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (context != null) {
- __result['context'] = context.toJson();
+ __result['context'] = context?.toJson();
}
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -28962,18 +27648,18 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// List of characters that re-trigger signature help.
///
/// These trigger characters are only active when signature help is already
/// showing. All trigger characters are also counted as re-trigger characters.
/// @since 3.15.0
- final List<String> retriggerCharacters;
+ final List<String>? retriggerCharacters;
/// The characters that trigger signature help automatically.
- final List<String> triggerCharacters;
- final bool workDoneProgress;
+ final List<String>? triggerCharacters;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -29119,24 +27805,20 @@
SignatureInformation.canParse, SignatureInformation.fromJson);
SignatureInformation(
- {@required this.label,
+ {required this.label,
this.documentation,
this.parameters,
- this.activeParameter}) {
- if (label == null) {
- throw 'label is required but was not provided';
- }
- }
+ this.activeParameter});
static SignatureInformation fromJson(Map<String, dynamic> json) {
final label = json['label'];
- final documentation = json['documentation'] is String
- ? Either2<String, MarkupContent>.t1(json['documentation'])
- : (MarkupContent.canParse(json['documentation'], nullLspJsonReporter)
- ? Either2<String, MarkupContent>.t2(json['documentation'] != null
- ? MarkupContent.fromJson(json['documentation'])
- : null)
- : (json['documentation'] == null
- ? null
+ final documentation = json['documentation'] == null
+ ? null
+ : (json['documentation'] is String
+ ? Either2<String, MarkupContent>.t1(json['documentation'])
+ : (MarkupContent.canParse(
+ json['documentation'], nullLspJsonReporter)
+ ? Either2<String, MarkupContent>.t2(
+ MarkupContent.fromJson(json['documentation']))
: (throw '''${json['documentation']} was not one of (String, MarkupContent)''')));
final parameters = json['parameters']
?.map(
@@ -29155,26 +27837,27 @@
///
/// If provided, this is used in place of `SignatureHelp.activeParameter`.
/// @since 3.16.0
- final num activeParameter;
+ final num? activeParameter;
/// The human-readable doc-comment of this signature. Will be shown in the UI
/// but can be omitted.
- final Either2<String, MarkupContent> documentation;
+ final Either2<String, MarkupContent>? documentation;
/// The label of this signature. Will be shown in the UI.
final String label;
/// The parameters of this signature.
- final List<ParameterInformation> parameters;
+ final List<ParameterInformation>? parameters;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['label'] = label ?? (throw 'label is required but was not set');
+ __result['label'] = label;
if (documentation != null) {
__result['documentation'] = documentation;
}
if (parameters != null) {
- __result['parameters'] = parameters.map((item) => item.toJson()).toList();
+ __result['parameters'] =
+ parameters?.map((item) => item.toJson()).toList();
}
if (activeParameter != null) {
__result['activeParameter'] = activeParameter;
@@ -29311,7 +27994,7 @@
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
+ final String? id;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -29366,33 +28049,21 @@
LspJsonHandler(SymbolInformation.canParse, SymbolInformation.fromJson);
SymbolInformation(
- {@required this.name,
- @required this.kind,
+ {required this.name,
+ required this.kind,
this.tags,
this.deprecated,
- @required this.location,
- this.containerName}) {
- if (name == null) {
- throw 'name is required but was not provided';
- }
- if (kind == null) {
- throw 'kind is required but was not provided';
- }
- if (location == null) {
- throw 'location is required but was not provided';
- }
- }
+ required this.location,
+ this.containerName});
static SymbolInformation fromJson(Map<String, dynamic> json) {
final name = json['name'];
- final kind =
- json['kind'] != null ? SymbolKind.fromJson(json['kind']) : null;
+ final kind = SymbolKind.fromJson(json['kind']);
final tags = json['tags']
?.map((item) => item != null ? SymbolTag.fromJson(item) : null)
?.cast<SymbolTag>()
?.toList();
final deprecated = json['deprecated'];
- final location =
- json['location'] != null ? Location.fromJson(json['location']) : null;
+ final location = Location.fromJson(json['location']);
final containerName = json['containerName'];
return SymbolInformation(
name: name,
@@ -29407,11 +28078,11 @@
/// user interface purposes (e.g. to render a qualifier in the user interface
/// if necessary). It can't be used to re-infer a hierarchy for the document
/// symbols.
- final String containerName;
+ final String? containerName;
/// Indicates if this symbol is deprecated.
/// @deprecated Use tags instead
- final bool deprecated;
+ final bool? deprecated;
/// The kind of this symbol.
final SymbolKind kind;
@@ -29432,21 +28103,19 @@
/// Tags for this completion item.
/// @since 3.16.0
- final List<SymbolTag> tags;
+ final List<SymbolTag>? tags;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['name'] = name ?? (throw 'name is required but was not set');
- __result['kind'] =
- kind?.toJson() ?? (throw 'kind is required but was not set');
+ __result['name'] = name;
+ __result['kind'] = kind.toJson();
if (tags != null) {
- __result['tags'] = tags.map((item) => item.toJson()).toList();
+ __result['tags'] = tags?.map((item) => item.toJson()).toList();
}
if (deprecated != null) {
__result['deprecated'] = deprecated;
}
- __result['location'] =
- location?.toJson() ?? (throw 'location is required but was not set');
+ __result['location'] = location.toJson();
if (containerName != null) {
__result['containerName'] = containerName;
}
@@ -29657,16 +28326,10 @@
TextDocumentChangeRegistrationOptions.fromJson);
TextDocumentChangeRegistrationOptions(
- {@required this.syncKind, this.documentSelector}) {
- if (syncKind == null) {
- throw 'syncKind is required but was not provided';
- }
- }
+ {required this.syncKind, this.documentSelector});
static TextDocumentChangeRegistrationOptions fromJson(
Map<String, dynamic> json) {
- final syncKind = json['syncKind'] != null
- ? TextDocumentSyncKind.fromJson(json['syncKind'])
- : null;
+ final syncKind = TextDocumentSyncKind.fromJson(json['syncKind']);
final documentSelector = json['documentSelector']
?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
?.cast<DocumentFilter>()
@@ -29677,7 +28340,7 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// How documents are synced to the server. See TextDocumentSyncKind.Full and
/// TextDocumentSyncKind.Incremental.
@@ -29685,8 +28348,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['syncKind'] =
- syncKind?.toJson() ?? (throw 'syncKind is required but was not set');
+ __result['syncKind'] = syncKind.toJson();
__result['documentSelector'] = documentSelector;
return __result;
}
@@ -29906,172 +28568,172 @@
/// Capabilities specific to the various call hierarchy requests.
/// @since 3.16.0
- final CallHierarchyClientCapabilities callHierarchy;
+ final CallHierarchyClientCapabilities? callHierarchy;
/// Capabilities specific to the `textDocument/codeAction` request.
- final CodeActionClientCapabilities codeAction;
+ final CodeActionClientCapabilities? codeAction;
/// Capabilities specific to the `textDocument/codeLens` request.
- final CodeLensClientCapabilities codeLens;
+ final CodeLensClientCapabilities? codeLens;
/// Capabilities specific to the `textDocument/documentColor` and the
/// `textDocument/colorPresentation` request.
/// @since 3.6.0
- final DocumentColorClientCapabilities colorProvider;
+ final DocumentColorClientCapabilities? colorProvider;
/// Capabilities specific to the `textDocument/completion` request.
- final CompletionClientCapabilities completion;
+ final CompletionClientCapabilities? completion;
/// Capabilities specific to the `textDocument/declaration` request.
/// @since 3.14.0
- final DeclarationClientCapabilities declaration;
+ final DeclarationClientCapabilities? declaration;
/// Capabilities specific to the `textDocument/definition` request.
- final DefinitionClientCapabilities definition;
+ final DefinitionClientCapabilities? definition;
/// Capabilities specific to the `textDocument/documentHighlight` request.
- final DocumentHighlightClientCapabilities documentHighlight;
+ final DocumentHighlightClientCapabilities? documentHighlight;
/// Capabilities specific to the `textDocument/documentLink` request.
- final DocumentLinkClientCapabilities documentLink;
+ final DocumentLinkClientCapabilities? documentLink;
/// Capabilities specific to the `textDocument/documentSymbol` request.
- final DocumentSymbolClientCapabilities documentSymbol;
+ final DocumentSymbolClientCapabilities? documentSymbol;
/// Capabilities specific to the `textDocument/foldingRange` request.
/// @since 3.10.0
- final FoldingRangeClientCapabilities foldingRange;
+ final FoldingRangeClientCapabilities? foldingRange;
/// Capabilities specific to the `textDocument/formatting` request.
- final DocumentFormattingClientCapabilities formatting;
+ final DocumentFormattingClientCapabilities? formatting;
/// Capabilities specific to the `textDocument/hover` request.
- final HoverClientCapabilities hover;
+ final HoverClientCapabilities? hover;
/// Capabilities specific to the `textDocument/implementation` request.
/// @since 3.6.0
- final ImplementationClientCapabilities implementation;
+ final ImplementationClientCapabilities? implementation;
/// Capabilities specific to the `textDocument/linkedEditingRange` request.
/// @since 3.16.0
- final LinkedEditingRangeClientCapabilities linkedEditingRange;
+ final LinkedEditingRangeClientCapabilities? linkedEditingRange;
/// Capabilities specific to the `textDocument/moniker` request.
/// @since 3.16.0
- final MonikerClientCapabilities moniker;
+ final MonikerClientCapabilities? moniker;
/// request. Capabilities specific to the `textDocument/onTypeFormatting`
/// request.
- final DocumentOnTypeFormattingClientCapabilities onTypeFormatting;
+ final DocumentOnTypeFormattingClientCapabilities? onTypeFormatting;
/// Capabilities specific to the `textDocument/publishDiagnostics`
/// notification.
- final PublishDiagnosticsClientCapabilities publishDiagnostics;
+ final PublishDiagnosticsClientCapabilities? publishDiagnostics;
/// Capabilities specific to the `textDocument/rangeFormatting` request.
- final DocumentRangeFormattingClientCapabilities rangeFormatting;
+ final DocumentRangeFormattingClientCapabilities? rangeFormatting;
/// Capabilities specific to the `textDocument/references` request.
- final ReferenceClientCapabilities references;
+ final ReferenceClientCapabilities? references;
/// Capabilities specific to the `textDocument/rename` request.
- final RenameClientCapabilities rename;
+ final RenameClientCapabilities? rename;
/// Capabilities specific to the `textDocument/selectionRange` request.
/// @since 3.15.0
- final SelectionRangeClientCapabilities selectionRange;
+ final SelectionRangeClientCapabilities? selectionRange;
/// Capabilities specific to the various semantic token requests.
/// @since 3.16.0
- final SemanticTokensClientCapabilities semanticTokens;
+ final SemanticTokensClientCapabilities? semanticTokens;
/// Capabilities specific to the `textDocument/signatureHelp` request.
- final SignatureHelpClientCapabilities signatureHelp;
- final TextDocumentSyncClientCapabilities synchronization;
+ final SignatureHelpClientCapabilities? signatureHelp;
+ final TextDocumentSyncClientCapabilities? synchronization;
/// Capabilities specific to the `textDocument/typeDefinition` request.
/// @since 3.6.0
- final TypeDefinitionClientCapabilities typeDefinition;
+ final TypeDefinitionClientCapabilities? typeDefinition;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (synchronization != null) {
- __result['synchronization'] = synchronization.toJson();
+ __result['synchronization'] = synchronization?.toJson();
}
if (completion != null) {
- __result['completion'] = completion.toJson();
+ __result['completion'] = completion?.toJson();
}
if (hover != null) {
- __result['hover'] = hover.toJson();
+ __result['hover'] = hover?.toJson();
}
if (signatureHelp != null) {
- __result['signatureHelp'] = signatureHelp.toJson();
+ __result['signatureHelp'] = signatureHelp?.toJson();
}
if (declaration != null) {
- __result['declaration'] = declaration.toJson();
+ __result['declaration'] = declaration?.toJson();
}
if (definition != null) {
- __result['definition'] = definition.toJson();
+ __result['definition'] = definition?.toJson();
}
if (typeDefinition != null) {
- __result['typeDefinition'] = typeDefinition.toJson();
+ __result['typeDefinition'] = typeDefinition?.toJson();
}
if (implementation != null) {
- __result['implementation'] = implementation.toJson();
+ __result['implementation'] = implementation?.toJson();
}
if (references != null) {
- __result['references'] = references.toJson();
+ __result['references'] = references?.toJson();
}
if (documentHighlight != null) {
- __result['documentHighlight'] = documentHighlight.toJson();
+ __result['documentHighlight'] = documentHighlight?.toJson();
}
if (documentSymbol != null) {
- __result['documentSymbol'] = documentSymbol.toJson();
+ __result['documentSymbol'] = documentSymbol?.toJson();
}
if (codeAction != null) {
- __result['codeAction'] = codeAction.toJson();
+ __result['codeAction'] = codeAction?.toJson();
}
if (codeLens != null) {
- __result['codeLens'] = codeLens.toJson();
+ __result['codeLens'] = codeLens?.toJson();
}
if (documentLink != null) {
- __result['documentLink'] = documentLink.toJson();
+ __result['documentLink'] = documentLink?.toJson();
}
if (colorProvider != null) {
- __result['colorProvider'] = colorProvider.toJson();
+ __result['colorProvider'] = colorProvider?.toJson();
}
if (formatting != null) {
- __result['formatting'] = formatting.toJson();
+ __result['formatting'] = formatting?.toJson();
}
if (rangeFormatting != null) {
- __result['rangeFormatting'] = rangeFormatting.toJson();
+ __result['rangeFormatting'] = rangeFormatting?.toJson();
}
if (onTypeFormatting != null) {
- __result['onTypeFormatting'] = onTypeFormatting.toJson();
+ __result['onTypeFormatting'] = onTypeFormatting?.toJson();
}
if (rename != null) {
- __result['rename'] = rename.toJson();
+ __result['rename'] = rename?.toJson();
}
if (publishDiagnostics != null) {
- __result['publishDiagnostics'] = publishDiagnostics.toJson();
+ __result['publishDiagnostics'] = publishDiagnostics?.toJson();
}
if (foldingRange != null) {
- __result['foldingRange'] = foldingRange.toJson();
+ __result['foldingRange'] = foldingRange?.toJson();
}
if (selectionRange != null) {
- __result['selectionRange'] = selectionRange.toJson();
+ __result['selectionRange'] = selectionRange?.toJson();
}
if (linkedEditingRange != null) {
- __result['linkedEditingRange'] = linkedEditingRange.toJson();
+ __result['linkedEditingRange'] = linkedEditingRange?.toJson();
}
if (callHierarchy != null) {
- __result['callHierarchy'] = callHierarchy.toJson();
+ __result['callHierarchy'] = callHierarchy?.toJson();
}
if (semanticTokens != null) {
- __result['semanticTokens'] = semanticTokens.toJson();
+ __result['semanticTokens'] = semanticTokens?.toJson();
}
if (moniker != null) {
- __result['moniker'] = moniker.toJson();
+ __result['moniker'] = moniker?.toJson();
}
return __result;
}
@@ -30461,16 +29123,9 @@
TextDocumentContentChangeEvent1.fromJson);
TextDocumentContentChangeEvent1(
- {@required this.range, this.rangeLength, @required this.text}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (text == null) {
- throw 'text is required but was not provided';
- }
- }
+ {required this.range, this.rangeLength, required this.text});
static TextDocumentContentChangeEvent1 fromJson(Map<String, dynamic> json) {
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final rangeLength = json['rangeLength'];
final text = json['text'];
return TextDocumentContentChangeEvent1(
@@ -30482,19 +29137,18 @@
/// The optional length of the range that got replaced.
/// @deprecated use range instead.
- final num rangeLength;
+ final num? rangeLength;
/// The new text for the provided range.
final String text;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
+ __result['range'] = range.toJson();
if (rangeLength != null) {
__result['rangeLength'] = rangeLength;
}
- __result['text'] = text ?? (throw 'text is required but was not set');
+ __result['text'] = text;
return __result;
}
@@ -30580,11 +29234,7 @@
TextDocumentContentChangeEvent2.canParse,
TextDocumentContentChangeEvent2.fromJson);
- TextDocumentContentChangeEvent2({@required this.text}) {
- if (text == null) {
- throw 'text is required but was not provided';
- }
- }
+ TextDocumentContentChangeEvent2({required this.text});
static TextDocumentContentChangeEvent2 fromJson(Map<String, dynamic> json) {
final text = json['text'];
return TextDocumentContentChangeEvent2(text: text);
@@ -30595,7 +29245,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['text'] = text ?? (throw 'text is required but was not set');
+ __result['text'] = text;
return __result;
}
@@ -30649,28 +29299,20 @@
static const jsonHandler =
LspJsonHandler(TextDocumentEdit.canParse, TextDocumentEdit.fromJson);
- TextDocumentEdit({@required this.textDocument, @required this.edits}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (edits == null) {
- throw 'edits is required but was not provided';
- }
- }
+ TextDocumentEdit({required this.textDocument, required this.edits});
static TextDocumentEdit fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? OptionalVersionedTextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
+ final textDocument =
+ OptionalVersionedTextDocumentIdentifier.fromJson(json['textDocument']);
final edits = json['edits']
?.map((item) => SnippetTextEdit.canParse(item, nullLspJsonReporter)
? Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>.t1(
- item != null ? SnippetTextEdit.fromJson(item) : null)
+ SnippetTextEdit.fromJson(item))
: (AnnotatedTextEdit.canParse(item, nullLspJsonReporter)
? Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>.t2(
- item != null ? AnnotatedTextEdit.fromJson(item) : null)
+ AnnotatedTextEdit.fromJson(item))
: (TextEdit.canParse(item, nullLspJsonReporter)
? Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>.t3(
- item != null ? TextEdit.fromJson(item) : null)
+ TextEdit.fromJson(item))
: (throw '''$item was not one of (SnippetTextEdit, AnnotatedTextEdit, TextEdit)'''))))
?.cast<Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>>()
?.toList();
@@ -30687,9 +29329,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['edits'] = edits ?? (throw 'edits is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['edits'] = edits;
return __result;
}
@@ -30775,11 +29416,7 @@
static const jsonHandler = LspJsonHandler(
TextDocumentIdentifier.canParse, TextDocumentIdentifier.fromJson);
- TextDocumentIdentifier({@required this.uri}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- }
+ TextDocumentIdentifier({required this.uri});
static TextDocumentIdentifier fromJson(Map<String, dynamic> json) {
if (VersionedTextDocumentIdentifier.canParse(json, nullLspJsonReporter)) {
return VersionedTextDocumentIdentifier.fromJson(json);
@@ -30797,7 +29434,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
+ __result['uri'] = uri;
return __result;
}
@@ -30852,23 +29489,10 @@
LspJsonHandler(TextDocumentItem.canParse, TextDocumentItem.fromJson);
TextDocumentItem(
- {@required this.uri,
- @required this.languageId,
- @required this.version,
- @required this.text}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- if (languageId == null) {
- throw 'languageId is required but was not provided';
- }
- if (version == null) {
- throw 'version is required but was not provided';
- }
- if (text == null) {
- throw 'text is required but was not provided';
- }
- }
+ {required this.uri,
+ required this.languageId,
+ required this.version,
+ required this.text});
static TextDocumentItem fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
final languageId = json['languageId'];
@@ -30893,12 +29517,10 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
- __result['languageId'] =
- languageId ?? (throw 'languageId is required but was not set');
- __result['version'] =
- version ?? (throw 'version is required but was not set');
- __result['text'] = text ?? (throw 'text is required but was not set');
+ __result['uri'] = uri;
+ __result['languageId'] = languageId;
+ __result['version'] = version;
+ __result['text'] = text;
return __result;
}
@@ -31010,14 +29632,7 @@
TextDocumentPositionParams.canParse, TextDocumentPositionParams.fromJson);
TextDocumentPositionParams(
- {@required this.textDocument, @required this.position}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ {required this.textDocument, required this.position});
static TextDocumentPositionParams fromJson(Map<String, dynamic> json) {
if (CompletionParams.canParse(json, nullLspJsonReporter)) {
return CompletionParams.fromJson(json);
@@ -31064,11 +29679,8 @@
if (MonikerParams.canParse(json, nullLspJsonReporter)) {
return MonikerParams.fromJson(json);
}
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
return TextDocumentPositionParams(
textDocument: textDocument, position: position);
}
@@ -31081,10 +29693,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
return __result;
}
@@ -31256,7 +29866,7 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -31365,10 +29975,10 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The client is supposed to include the content on save.
- final bool includeText;
+ final bool? includeText;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -31462,18 +30072,18 @@
}
/// The client supports did save notifications.
- final bool didSave;
+ final bool? didSave;
/// Whether text document synchronization supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// The client supports sending will save notifications.
- final bool willSave;
+ final bool? willSave;
/// The client supports sending a will save request and waits for a response
/// providing text edits which will be applied to the document before it is
/// saved.
- final bool willSaveWaitUntil;
+ final bool? willSaveWaitUntil;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -31617,14 +30227,13 @@
: null;
final willSave = json['willSave'];
final willSaveWaitUntil = json['willSaveWaitUntil'];
- final save = json['save'] is bool
- ? Either2<bool, SaveOptions>.t1(json['save'])
- : (SaveOptions.canParse(json['save'], nullLspJsonReporter)
- ? Either2<bool, SaveOptions>.t2(json['save'] != null
- ? SaveOptions.fromJson(json['save'])
- : null)
- : (json['save'] == null
- ? null
+ final save = json['save'] == null
+ ? null
+ : (json['save'] is bool
+ ? Either2<bool, SaveOptions>.t1(json['save'])
+ : (SaveOptions.canParse(json['save'], nullLspJsonReporter)
+ ? Either2<bool, SaveOptions>.t2(
+ SaveOptions.fromJson(json['save']))
: (throw '''${json['save']} was not one of (bool, SaveOptions)''')));
return TextDocumentSyncOptions(
openClose: openClose,
@@ -31638,23 +30247,23 @@
/// TextDocumentSyncKind.None, TextDocumentSyncKind.Full and
/// TextDocumentSyncKind.Incremental. If omitted it defaults to
/// TextDocumentSyncKind.None.
- final TextDocumentSyncKind change;
+ final TextDocumentSyncKind? change;
/// Open and close notifications are sent to the server. If omitted open close
/// notification should not be sent.
- final bool openClose;
+ final bool? openClose;
/// If present save notifications are sent to the server. If omitted the
/// notification should not be sent.
- final Either2<bool, SaveOptions> save;
+ final Either2<bool, SaveOptions>? save;
/// If present will save notifications are sent to the server. If omitted the
/// notification should not be sent.
- final bool willSave;
+ final bool? willSave;
/// If present will save wait until requests are sent to the server. If
/// omitted the request should not be sent.
- final bool willSaveWaitUntil;
+ final bool? willSaveWaitUntil;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -31662,7 +30271,7 @@
__result['openClose'] = openClose;
}
if (change != null) {
- __result['change'] = change.toJson();
+ __result['change'] = change?.toJson();
}
if (willSave != null) {
__result['willSave'] = willSave;
@@ -31767,14 +30376,7 @@
static const jsonHandler =
LspJsonHandler(TextEdit.canParse, TextEdit.fromJson);
- TextEdit({@required this.range, @required this.newText}) {
- if (range == null) {
- throw 'range is required but was not provided';
- }
- if (newText == null) {
- throw 'newText is required but was not provided';
- }
- }
+ TextEdit({required this.range, required this.newText});
static TextEdit fromJson(Map<String, dynamic> json) {
if (AnnotatedTextEdit.canParse(json, nullLspJsonReporter)) {
return AnnotatedTextEdit.fromJson(json);
@@ -31782,7 +30384,7 @@
if (SnippetTextEdit.canParse(json, nullLspJsonReporter)) {
return SnippetTextEdit.fromJson(json);
}
- final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+ final range = Range.fromJson(json['range']);
final newText = json['newText'];
return TextEdit(range: range, newText: newText);
}
@@ -31796,10 +30398,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['range'] =
- range?.toJson() ?? (throw 'range is required but was not set');
- __result['newText'] =
- newText ?? (throw 'newText is required but was not set');
+ __result['range'] = range.toJson();
+ __result['newText'] = newText;
return __result;
}
@@ -31906,11 +30506,11 @@
/// Whether implementation supports dynamic registration. If this is set to
/// `true` the client supports the new `TypeDefinitionRegistrationOptions`
/// return value for the corresponding server capability as well.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// The client supports additional metadata in the form of definition links.
/// @since 3.14.0
- final bool linkSupport;
+ final bool? linkSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -31987,7 +30587,7 @@
return TypeDefinitionOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -32046,36 +30646,26 @@
TypeDefinitionParams.canParse, TypeDefinitionParams.fromJson);
TypeDefinitionParams(
- {@required this.textDocument,
- @required this.position,
+ {required this.textDocument,
+ required this.position,
this.workDoneToken,
- this.partialResultToken}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (position == null) {
- throw 'position is required but was not provided';
- }
- }
+ this.partialResultToken});
static TypeDefinitionParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final position =
- json['position'] != null ? Position.fromJson(json['position']) : null;
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final position = Position.fromJson(json['position']);
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return TypeDefinitionParams(
textDocument: textDocument,
@@ -32086,7 +30676,7 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// The position inside the text document.
final Position position;
@@ -32095,14 +30685,12 @@
final TextDocumentIdentifier textDocument;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['position'] =
- position?.toJson() ?? (throw 'position is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['position'] = position.toJson();
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -32231,12 +30819,12 @@
/// A document selector to identify the scope of the registration. If set to
/// null the document selector provided on the client side will be used.
- final List<DocumentFilter> documentSelector;
+ final List<DocumentFilter>? documentSelector;
/// The id used to register the request. The id can be used to deregister the
/// request again. See also Registration#id.
- final String id;
- final bool workDoneProgress;
+ final String? id;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -32362,14 +30950,7 @@
static const jsonHandler =
LspJsonHandler(Unregistration.canParse, Unregistration.fromJson);
- Unregistration({@required this.id, @required this.method}) {
- if (id == null) {
- throw 'id is required but was not provided';
- }
- if (method == null) {
- throw 'method is required but was not provided';
- }
- }
+ Unregistration({required this.id, required this.method});
static Unregistration fromJson(Map<String, dynamic> json) {
final id = json['id'];
final method = json['method'];
@@ -32385,8 +30966,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['id'] = id ?? (throw 'id is required but was not set');
- __result['method'] = method ?? (throw 'method is required but was not set');
+ __result['id'] = id;
+ __result['method'] = method;
return __result;
}
@@ -32457,14 +31038,10 @@
static const jsonHandler = LspJsonHandler(
UnregistrationParams.canParse, UnregistrationParams.fromJson);
- UnregistrationParams({@required this.unregisterations}) {
- if (unregisterations == null) {
- throw 'unregisterations is required but was not provided';
- }
- }
+ UnregistrationParams({required this.unregisterations});
static UnregistrationParams fromJson(Map<String, dynamic> json) {
final unregisterations = json['unregisterations']
- ?.map((item) => item != null ? Unregistration.fromJson(item) : null)
+ ?.map((item) => Unregistration.fromJson(item))
?.cast<Unregistration>()
?.toList();
return UnregistrationParams(unregisterations: unregisterations);
@@ -32478,8 +31055,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
__result['unregisterations'] =
- unregisterations?.map((item) => item.toJson())?.toList() ??
- (throw 'unregisterations is required but was not set');
+ unregisterations.map((item) => item.toJson()).toList();
return __result;
}
@@ -32539,15 +31115,7 @@
VersionedTextDocumentIdentifier.canParse,
VersionedTextDocumentIdentifier.fromJson);
- VersionedTextDocumentIdentifier(
- {@required this.version, @required this.uri}) {
- if (version == null) {
- throw 'version is required but was not provided';
- }
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- }
+ VersionedTextDocumentIdentifier({required this.version, required this.uri});
static VersionedTextDocumentIdentifier fromJson(Map<String, dynamic> json) {
final version = json['version'];
final uri = json['uri'];
@@ -32565,9 +31133,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['version'] =
- version ?? (throw 'version is required but was not set');
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
+ __result['version'] = version;
+ __result['uri'] = uri;
return __result;
}
@@ -32671,21 +31238,10 @@
WillSaveTextDocumentParams.canParse, WillSaveTextDocumentParams.fromJson);
WillSaveTextDocumentParams(
- {@required this.textDocument, @required this.reason}) {
- if (textDocument == null) {
- throw 'textDocument is required but was not provided';
- }
- if (reason == null) {
- throw 'reason is required but was not provided';
- }
- }
+ {required this.textDocument, required this.reason});
static WillSaveTextDocumentParams fromJson(Map<String, dynamic> json) {
- final textDocument = json['textDocument'] != null
- ? TextDocumentIdentifier.fromJson(json['textDocument'])
- : null;
- final reason = json['reason'] != null
- ? TextDocumentSaveReason.fromJson(json['reason'])
- : null;
+ final textDocument = TextDocumentIdentifier.fromJson(json['textDocument']);
+ final reason = TextDocumentSaveReason.fromJson(json['reason']);
return WillSaveTextDocumentParams(
textDocument: textDocument, reason: reason);
}
@@ -32698,10 +31254,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['textDocument'] = textDocument?.toJson() ??
- (throw 'textDocument is required but was not set');
- __result['reason'] =
- reason?.toJson() ?? (throw 'reason is required but was not set');
+ __result['textDocument'] = textDocument.toJson();
+ __result['reason'] = reason.toJson();
return __result;
}
@@ -32777,16 +31331,13 @@
WorkDoneProgressBegin(
{this.kind = 'begin',
- @required this.title,
+ required this.title,
this.cancellable,
this.message,
this.percentage}) {
if (kind != 'begin') {
throw 'kind may only be the literal \'begin\'';
}
- if (title == null) {
- throw 'title is required but was not provided';
- }
}
static WorkDoneProgressBegin fromJson(Map<String, dynamic> json) {
final kind = json['kind'];
@@ -32805,7 +31356,7 @@
/// Controls if a cancel button should show to allow the user to cancel the
/// long running operation. Clients that don't support cancellation are
/// allowed to ignore the setting.
- final bool cancellable;
+ final bool? cancellable;
final String kind;
/// Optional, more detailed associated progress message. Contains
@@ -32813,7 +31364,7 @@
///
/// Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". If
/// unset, the previous progress message (if any) is still valid.
- final String message;
+ final String? message;
/// Optional progress percentage to display (value 100 is considered 100%). If
/// not provided infinite progress is assumed and clients are allowed to
@@ -32821,7 +31372,7 @@
///
/// The value should be steadily rising. Clients are free to ignore values
/// that are not following this rule. The value range is [0, 100]
- final num percentage;
+ final num? percentage;
/// Mandatory title of the progress operation. Used to briefly inform about
/// the kind of operation being performed.
@@ -32831,8 +31382,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['kind'] = kind ?? (throw 'kind is required but was not set');
- __result['title'] = title ?? (throw 'title is required but was not set');
+ __result['kind'] = kind;
+ __result['title'] = title;
if (cancellable != null) {
__result['cancellable'] = cancellable;
}
@@ -32949,11 +31500,7 @@
WorkDoneProgressCancelParams.canParse,
WorkDoneProgressCancelParams.fromJson);
- WorkDoneProgressCancelParams({@required this.token}) {
- if (token == null) {
- throw 'token is required but was not provided';
- }
- }
+ WorkDoneProgressCancelParams({required this.token});
static WorkDoneProgressCancelParams fromJson(Map<String, dynamic> json) {
final token = json['token'] is num
? Either2<num, String>.t1(json['token'])
@@ -32968,7 +31515,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['token'] = token ?? (throw 'token is required but was not set');
+ __result['token'] = token;
return __result;
}
@@ -33023,11 +31570,7 @@
WorkDoneProgressCreateParams.canParse,
WorkDoneProgressCreateParams.fromJson);
- WorkDoneProgressCreateParams({@required this.token}) {
- if (token == null) {
- throw 'token is required but was not provided';
- }
- }
+ WorkDoneProgressCreateParams({required this.token});
static WorkDoneProgressCreateParams fromJson(Map<String, dynamic> json) {
final token = json['token'] is num
? Either2<num, String>.t1(json['token'])
@@ -33042,7 +31585,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['token'] = token ?? (throw 'token is required but was not set');
+ __result['token'] = token;
return __result;
}
@@ -33111,11 +31654,11 @@
/// Optional, a final message indicating to for example indicate the outcome
/// of the operation.
- final String message;
+ final String? message;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['kind'] = kind ?? (throw 'kind is required but was not set');
+ __result['kind'] = kind;
if (message != null) {
__result['message'] = message;
}
@@ -33263,7 +31806,7 @@
return WorkDoneProgressOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -33411,18 +31954,18 @@
if (MonikerParams.canParse(json, nullLspJsonReporter)) {
return MonikerParams.fromJson(json);
}
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
return WorkDoneProgressParams(workDoneToken: workDoneToken);
}
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -33500,7 +32043,7 @@
///
/// Clients that don't support cancellation or don't support control the
/// button's enablement state are allowed to ignore the setting.
- final bool cancellable;
+ final bool? cancellable;
final String kind;
/// Optional, more detailed associated progress message. Contains
@@ -33508,7 +32051,7 @@
///
/// Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". If
/// unset, the previous progress message (if any) is still valid.
- final String message;
+ final String? message;
/// Optional progress percentage to display (value 100 is considered 100%). If
/// not provided infinite progress is assumed and clients are allowed to
@@ -33516,11 +32059,11 @@
///
/// The value should be steadily rising. Clients are free to ignore values
/// that are not following this rule. The value range is [0, 100]
- final num percentage;
+ final num? percentage;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['kind'] = kind ?? (throw 'kind is required but was not set');
+ __result['kind'] = kind;
if (cancellable != null) {
__result['cancellable'] = cancellable;
}
@@ -33627,24 +32170,25 @@
?.cast<TextEdit>()
?.toList()))
?.cast<String, List<TextEdit>>();
- final documentChanges = (json['documentChanges'] is List && (json['documentChanges'].every((item) => TextDocumentEdit.canParse(item, nullLspJsonReporter))))
- ? Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t1(
- json['documentChanges']
- ?.map((item) =>
- item != null ? TextDocumentEdit.fromJson(item) : null)
+ final documentChanges = json['documentChanges'] == null
+ ? null
+ : ((json['documentChanges'] is List && (json['documentChanges'].every((item) => TextDocumentEdit.canParse(item, nullLspJsonReporter))))
+ ? Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t1(json['documentChanges']
+ ?.map((item) => TextDocumentEdit.fromJson(item))
?.cast<TextDocumentEdit>()
?.toList())
- : ((json['documentChanges'] is List && (json['documentChanges'].every((item) => (TextDocumentEdit.canParse(item, nullLspJsonReporter) || CreateFile.canParse(item, nullLspJsonReporter) || RenameFile.canParse(item, nullLspJsonReporter) || DeleteFile.canParse(item, nullLspJsonReporter)))))
- ? Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t2(json['documentChanges']
- ?.map((item) => TextDocumentEdit.canParse(item, nullLspJsonReporter)
- ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t1(
- item != null ? TextDocumentEdit.fromJson(item) : null)
- : (CreateFile.canParse(item, nullLspJsonReporter)
- ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t2(item != null ? CreateFile.fromJson(item) : null)
- : (RenameFile.canParse(item, nullLspJsonReporter) ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t3(item != null ? RenameFile.fromJson(item) : null) : (DeleteFile.canParse(item, nullLspJsonReporter) ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t4(item != null ? DeleteFile.fromJson(item) : null) : (item == null ? null : (throw '''$item was not one of (TextDocumentEdit, CreateFile, RenameFile, DeleteFile)'''))))))
- ?.cast<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>()
- ?.toList())
- : (json['documentChanges'] == null ? null : (throw '''${json['documentChanges']} was not one of (List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>)''')));
+ : ((json['documentChanges'] is List &&
+ (json['documentChanges'].every((item) => (TextDocumentEdit.canParse(item, nullLspJsonReporter) ||
+ CreateFile.canParse(item, nullLspJsonReporter) ||
+ RenameFile.canParse(item, nullLspJsonReporter) ||
+ DeleteFile.canParse(item, nullLspJsonReporter)))))
+ ? Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t2(json['documentChanges']
+ ?.map((item) => TextDocumentEdit.canParse(item, nullLspJsonReporter)
+ ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t1(TextDocumentEdit.fromJson(item))
+ : (CreateFile.canParse(item, nullLspJsonReporter) ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t2(CreateFile.fromJson(item)) : (RenameFile.canParse(item, nullLspJsonReporter) ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t3(RenameFile.fromJson(item)) : (DeleteFile.canParse(item, nullLspJsonReporter) ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t4(DeleteFile.fromJson(item)) : (throw '''$item was not one of (TextDocumentEdit, CreateFile, RenameFile, DeleteFile)''')))))
+ ?.cast<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>()
+ ?.toList())
+ : (throw '''${json['documentChanges']} was not one of (List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>)''')));
final changeAnnotations = json['changeAnnotations']
?.map((key, value) => MapEntry(
key, value != null ? ChangeAnnotation.fromJson(value) : null))
@@ -33661,10 +32205,10 @@
/// Whether clients honor this property depends on the client capability
/// `workspace.changeAnnotationSupport`.
/// @since 3.16.0
- final Map<String, ChangeAnnotation> changeAnnotations;
+ final Map<String, ChangeAnnotation>? changeAnnotations;
/// Holds changes to existing resources.
- final Map<String, List<TextEdit>> changes;
+ final Map<String, List<TextEdit>>? changes;
/// Depending on the client capability
/// `workspace.workspaceEdit.resourceOperations` document changes are either
@@ -33680,7 +32224,7 @@
/// `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s
/// using the `changes` property are supported.
final Either2<List<TextDocumentEdit>,
- List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>
+ List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>?
documentChanges;
Map<String, dynamic> toJson() {
@@ -33820,27 +32364,27 @@
/// Whether the client in general supports change annotations on text edits,
/// create file, rename file and delete file changes.
/// @since 3.16.0
- final WorkspaceEditClientCapabilitiesChangeAnnotationSupport
+ final WorkspaceEditClientCapabilitiesChangeAnnotationSupport?
changeAnnotationSupport;
/// The client supports versioned document changes in `WorkspaceEdit`s
- final bool documentChanges;
+ final bool? documentChanges;
/// The failure handling strategy of a client if applying the workspace edit
/// fails.
/// @since 3.13.0
- final FailureHandlingKind failureHandling;
+ final FailureHandlingKind? failureHandling;
/// Whether the client normalizes line endings to the client specific setting.
/// If set to `true` the client will normalize line ending characters in a
/// workspace edit to the client specific new line character(s).
/// @since 3.16.0
- final bool normalizesLineEndings;
+ final bool? normalizesLineEndings;
/// The resource operations the client supports. Clients should at least
/// support 'create', 'rename' and 'delete' files and folders.
/// @since 3.13.0
- final List<ResourceOperationKind> resourceOperations;
+ final List<ResourceOperationKind>? resourceOperations;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -33849,16 +32393,16 @@
}
if (resourceOperations != null) {
__result['resourceOperations'] =
- resourceOperations.map((item) => item.toJson()).toList();
+ resourceOperations?.map((item) => item.toJson()).toList();
}
if (failureHandling != null) {
- __result['failureHandling'] = failureHandling.toJson();
+ __result['failureHandling'] = failureHandling?.toJson();
}
if (normalizesLineEndings != null) {
__result['normalizesLineEndings'] = normalizesLineEndings;
}
if (changeAnnotationSupport != null) {
- __result['changeAnnotationSupport'] = changeAnnotationSupport.toJson();
+ __result['changeAnnotationSupport'] = changeAnnotationSupport?.toJson();
}
return __result;
}
@@ -33973,7 +32517,7 @@
/// Whether the client groups edits with equal labels into tree nodes, for
/// instance all edits labelled with "Changes in Strings" would be a tree
/// node.
- final bool groupsOnLabel;
+ final bool? groupsOnLabel;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -34027,14 +32571,7 @@
static const jsonHandler =
LspJsonHandler(WorkspaceFolder.canParse, WorkspaceFolder.fromJson);
- WorkspaceFolder({@required this.uri, @required this.name}) {
- if (uri == null) {
- throw 'uri is required but was not provided';
- }
- if (name == null) {
- throw 'name is required but was not provided';
- }
- }
+ WorkspaceFolder({required this.uri, required this.name});
static WorkspaceFolder fromJson(Map<String, dynamic> json) {
final uri = json['uri'];
final name = json['name'];
@@ -34050,8 +32587,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['uri'] = uri ?? (throw 'uri is required but was not set');
- __result['name'] = name ?? (throw 'name is required but was not set');
+ __result['uri'] = uri;
+ __result['name'] = name;
return __result;
}
@@ -34124,21 +32661,14 @@
WorkspaceFoldersChangeEvent.canParse,
WorkspaceFoldersChangeEvent.fromJson);
- WorkspaceFoldersChangeEvent({@required this.added, @required this.removed}) {
- if (added == null) {
- throw 'added is required but was not provided';
- }
- if (removed == null) {
- throw 'removed is required but was not provided';
- }
- }
+ WorkspaceFoldersChangeEvent({required this.added, required this.removed});
static WorkspaceFoldersChangeEvent fromJson(Map<String, dynamic> json) {
final added = json['added']
- ?.map((item) => item != null ? WorkspaceFolder.fromJson(item) : null)
+ ?.map((item) => WorkspaceFolder.fromJson(item))
?.cast<WorkspaceFolder>()
?.toList();
final removed = json['removed']
- ?.map((item) => item != null ? WorkspaceFolder.fromJson(item) : null)
+ ?.map((item) => WorkspaceFolder.fromJson(item))
?.cast<WorkspaceFolder>()
?.toList();
return WorkspaceFoldersChangeEvent(added: added, removed: removed);
@@ -34152,10 +32682,8 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['added'] = added?.map((item) => item.toJson())?.toList() ??
- (throw 'added is required but was not set');
- __result['removed'] = removed?.map((item) => item.toJson())?.toList() ??
- (throw 'removed is required but was not set');
+ __result['added'] = added.map((item) => item.toJson()).toList();
+ __result['removed'] = removed.map((item) => item.toJson()).toList();
return __result;
}
@@ -34241,12 +32769,12 @@
static WorkspaceFoldersServerCapabilities fromJson(
Map<String, dynamic> json) {
final supported = json['supported'];
- final changeNotifications = json['changeNotifications'] is String
- ? Either2<String, bool>.t1(json['changeNotifications'])
- : (json['changeNotifications'] is bool
- ? Either2<String, bool>.t2(json['changeNotifications'])
- : (json['changeNotifications'] == null
- ? null
+ final changeNotifications = json['changeNotifications'] == null
+ ? null
+ : (json['changeNotifications'] is String
+ ? Either2<String, bool>.t1(json['changeNotifications'])
+ : (json['changeNotifications'] is bool
+ ? Either2<String, bool>.t2(json['changeNotifications'])
: (throw '''${json['changeNotifications']} was not one of (String, bool)''')));
return WorkspaceFoldersServerCapabilities(
supported: supported, changeNotifications: changeNotifications);
@@ -34258,10 +32786,10 @@
/// notification is registered on the client side. The ID can be used to
/// unregister for these events using the `client/unregisterCapability`
/// request.
- final Either2<String, bool> changeNotifications;
+ final Either2<String, bool>? changeNotifications;
/// The server has support for workspace folders
- final bool supported;
+ final bool? supported;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -34351,16 +32879,16 @@
}
/// Symbol request supports dynamic registration.
- final bool dynamicRegistration;
+ final bool? dynamicRegistration;
/// Specific capabilities for the `SymbolKind` in the `workspace/symbol`
/// request.
- final WorkspaceSymbolClientCapabilitiesSymbolKind symbolKind;
+ final WorkspaceSymbolClientCapabilitiesSymbolKind? symbolKind;
/// The client supports tags on `SymbolInformation`. Clients supporting tags
/// have to handle unknown tags gracefully.
/// @since 3.16.0
- final WorkspaceSymbolClientCapabilitiesTagSupport tagSupport;
+ final WorkspaceSymbolClientCapabilitiesTagSupport? tagSupport;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -34368,10 +32896,10 @@
__result['dynamicRegistration'] = dynamicRegistration;
}
if (symbolKind != null) {
- __result['symbolKind'] = symbolKind.toJson();
+ __result['symbolKind'] = symbolKind?.toJson();
}
if (tagSupport != null) {
- __result['tagSupport'] = tagSupport.toJson();
+ __result['tagSupport'] = tagSupport?.toJson();
}
return __result;
}
@@ -34465,12 +32993,12 @@
///
/// If this property is not present the client only supports the symbol kinds
/// from `File` to `Array` as defined in the initial version of the protocol.
- final List<SymbolKind> valueSet;
+ final List<SymbolKind>? valueSet;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
if (valueSet != null) {
- __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
+ __result['valueSet'] = valueSet?.map((item) => item.toJson()).toList();
}
return __result;
}
@@ -34524,15 +33052,11 @@
WorkspaceSymbolClientCapabilitiesTagSupport.canParse,
WorkspaceSymbolClientCapabilitiesTagSupport.fromJson);
- WorkspaceSymbolClientCapabilitiesTagSupport({@required this.valueSet}) {
- if (valueSet == null) {
- throw 'valueSet is required but was not provided';
- }
- }
+ WorkspaceSymbolClientCapabilitiesTagSupport({required this.valueSet});
static WorkspaceSymbolClientCapabilitiesTagSupport fromJson(
Map<String, dynamic> json) {
final valueSet = json['valueSet']
- ?.map((item) => item != null ? SymbolTag.fromJson(item) : null)
+ ?.map((item) => SymbolTag.fromJson(item))
?.cast<SymbolTag>()
?.toList();
return WorkspaceSymbolClientCapabilitiesTagSupport(valueSet: valueSet);
@@ -34543,8 +33067,7 @@
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['valueSet'] = valueSet?.map((item) => item.toJson())?.toList() ??
- (throw 'valueSet is required but was not set');
+ __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
return __result;
}
@@ -34613,7 +33136,7 @@
return WorkspaceSymbolOptions(workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
@@ -34669,26 +33192,22 @@
WorkspaceSymbolParams.canParse, WorkspaceSymbolParams.fromJson);
WorkspaceSymbolParams(
- {@required this.query, this.workDoneToken, this.partialResultToken}) {
- if (query == null) {
- throw 'query is required but was not provided';
- }
- }
+ {required this.query, this.workDoneToken, this.partialResultToken});
static WorkspaceSymbolParams fromJson(Map<String, dynamic> json) {
final query = json['query'];
- final workDoneToken = json['workDoneToken'] is num
- ? Either2<num, String>.t1(json['workDoneToken'])
- : (json['workDoneToken'] is String
- ? Either2<num, String>.t2(json['workDoneToken'])
- : (json['workDoneToken'] == null
- ? null
+ final workDoneToken = json['workDoneToken'] == null
+ ? null
+ : (json['workDoneToken'] is num
+ ? Either2<num, String>.t1(json['workDoneToken'])
+ : (json['workDoneToken'] is String
+ ? Either2<num, String>.t2(json['workDoneToken'])
: (throw '''${json['workDoneToken']} was not one of (num, String)''')));
- final partialResultToken = json['partialResultToken'] is num
- ? Either2<num, String>.t1(json['partialResultToken'])
- : (json['partialResultToken'] is String
- ? Either2<num, String>.t2(json['partialResultToken'])
- : (json['partialResultToken'] == null
- ? null
+ final partialResultToken = json['partialResultToken'] == null
+ ? null
+ : (json['partialResultToken'] is num
+ ? Either2<num, String>.t1(json['partialResultToken'])
+ : (json['partialResultToken'] is String
+ ? Either2<num, String>.t2(json['partialResultToken'])
: (throw '''${json['partialResultToken']} was not one of (num, String)''')));
return WorkspaceSymbolParams(
query: query,
@@ -34698,18 +33217,18 @@
/// An optional token that a server can use to report partial results (e.g.
/// streaming) to the client.
- final Either2<num, String> partialResultToken;
+ final Either2<num, String>? partialResultToken;
/// A query string to filter symbols by. Clients may send an empty string here
/// to request all symbols.
final String query;
/// An optional token that a server can use to report work done progress.
- final Either2<num, String> workDoneToken;
+ final Either2<num, String>? workDoneToken;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
- __result['query'] = query ?? (throw 'query is required but was not set');
+ __result['query'] = query;
if (workDoneToken != null) {
__result['workDoneToken'] = workDoneToken;
}
@@ -34806,7 +33325,7 @@
workDoneProgress: workDoneProgress);
}
- final bool workDoneProgress;
+ final bool? workDoneProgress;
Map<String, dynamic> toJson() {
var __result = <String, dynamic>{};
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
index e1f4838..9ee8f63 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
import 'dart:async';
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
@@ -15,10 +13,10 @@
const NullJsonHandler = LspJsonHandler<Null>(_alwaysTrue, _alwaysNull);
-ErrorOr<R> cancelled<R>([R t]) =>
+ErrorOr<R> cancelled<R>() =>
error(ErrorCodes.RequestCancelled, 'Request was cancelled', null);
-ErrorOr<R> error<R>(ErrorCodes code, String message, [String data]) =>
+ErrorOr<R> error<R>(ErrorCodes code, String message, [String? data]) =>
ErrorOr<R>.error(ResponseError(code: code, message: message, data: data));
ErrorOr<R> failure<R>(ErrorOr<dynamic> error) => ErrorOr<R>.error(error.error);
@@ -54,7 +52,7 @@
return JenkinsSmiHash.finish(hash);
}
-Object specToJson(Object obj) {
+Object? specToJson(Object? obj) {
if (obj is ToJsonable) {
return obj.toJson();
} else {
@@ -62,7 +60,7 @@
}
}
-ErrorOr<R> success<R>([R t]) => ErrorOr<R>.success(t);
+ErrorOr<R> success<R>(R t) => ErrorOr<R>.success(t);
Null _alwaysNull(_, [__]) => null;
@@ -70,13 +68,13 @@
class Either2<T1, T2> {
final int _which;
- final T1 _t1;
- final T2 _t2;
+ final T1? _t1;
+ final T2? _t2;
- Either2.t1(this._t1)
+ Either2.t1(T1 this._t1)
: _t2 = null,
_which = 1;
- Either2.t2(this._t2)
+ Either2.t2(T2 this._t2)
: _t1 = null,
_which = 2;
@@ -88,10 +86,10 @@
o is Either2<T1, T2> && lspEquals(o._t1, _t1) && lspEquals(o._t2, _t2);
T map<T>(T Function(T1) f1, T Function(T2) f2) {
- return _which == 1 ? f1(_t1) : f2(_t2);
+ return _which == 1 ? f1(_t1 as T1) : f2(_t2 as T2);
}
- Object toJson() => map(specToJson, specToJson);
+ Object? toJson() => map(specToJson, specToJson);
@override
String toString() => map((t) => t.toString(), (t) => t.toString());
@@ -102,9 +100,9 @@
class Either3<T1, T2, T3> {
final int _which;
- final T1 _t1;
- final T2 _t2;
- final T3 _t3;
+ final T1? _t1;
+ final T2? _t2;
+ final T3? _t3;
Either3.t1(this._t1)
: _t2 = null,
@@ -132,17 +130,17 @@
T map<T>(T Function(T1) f1, T Function(T2) f2, T Function(T3) f3) {
switch (_which) {
case 1:
- return f1(_t1);
+ return f1(_t1 as T1);
case 2:
- return f2(_t2);
+ return f2(_t2 as T2);
case 3:
- return f3(_t3);
+ return f3(_t3 as T3);
default:
throw 'Invalid state.';
}
}
- Object toJson() => map(specToJson, specToJson, specToJson);
+ Object? toJson() => map(specToJson, specToJson, specToJson);
@override
String toString() => map(
@@ -157,10 +155,10 @@
class Either4<T1, T2, T3, T4> {
final int _which;
- final T1 _t1;
- final T2 _t2;
- final T3 _t3;
- final T4 _t4;
+ final T1? _t1;
+ final T2? _t2;
+ final T3? _t3;
+ final T4? _t4;
Either4.t1(this._t1)
: _t2 = null,
@@ -198,19 +196,19 @@
T Function(T4) f4) {
switch (_which) {
case 1:
- return f1(_t1);
+ return f1(_t1 as T1);
case 2:
- return f2(_t2);
+ return f2(_t2 as T2);
case 3:
- return f3(_t3);
+ return f3(_t3 as T3);
case 4:
- return f4(_t4);
+ return f4(_t4 as T4);
default:
throw 'Invalid state.';
}
}
- Object toJson() => map(specToJson, specToJson, specToJson, specToJson);
+ Object? toJson() => map(specToJson, specToJson, specToJson, specToJson);
@override
String toString() => map(
@@ -227,12 +225,12 @@
class ErrorOr<T> extends Either2<ResponseError, T> {
ErrorOr.error(ResponseError error) : super.t1(error);
- ErrorOr.success([T result]) : super.t2(result);
+ ErrorOr.success(T result) : super.t2(result);
/// Returns the error or throws if object is not an error. Check [isError]
/// before accessing [error].
ResponseError get error {
- return _which == 1 ? _t1 : (throw 'Value is not an error');
+ return _which == 1 ? _t1 as ResponseError : (throw 'Value is not an error');
}
/// Returns true if this object is an error, false if it is a result. Prefer
@@ -244,7 +242,7 @@
/// before accessing [result]. It is valid for this to return null is the
/// object does not represent an error but the resulting value was null.
T get result {
- return _which == 2 ? _t2 : (throw 'Value is not a result');
+ return _which == 2 ? _t2 as T : (throw 'Value is not a result');
}
/// If this object is a result, maps [result] through [f], otherwise returns
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index b44ab93..7b6cb5f 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
import 'dart:async';
import 'dart:collection';
import 'dart:core';
@@ -31,7 +29,6 @@
import 'package:analyzer/src/workspace/bazel_watcher.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
-import 'package:meta/meta.dart';
import 'package:path/path.dart' as path;
import 'package:watcher/watcher.dart';
import 'package:yaml/yaml.dart';
@@ -49,18 +46,6 @@
/// Class that maintains a mapping from included/excluded paths to a set of
/// folders that should correspond to analysis contexts.
abstract class ContextManager {
- // TODO(brianwilkerson) Support:
- // setting the default analysis options
- // setting the default content cache
- // setting the default SDK
- // telling server when a context has been added or removed
- // (see onContextsChanged)
- // telling server when a context needs to be re-analyzed
- // notifying the client when results should be flushed
- // using analyzeFileFunctions to determine which files to analyze
- //
- // TODO(brianwilkerson) Move this class to a public library.
-
/// Get the callback interface used to create, destroy, and update contexts.
ContextManagerCallbacks get callbacks;
@@ -81,7 +66,7 @@
/// Return the existing analysis context that should be used to analyze the
/// given [path], or `null` if the [path] is not analyzed in any of the
/// created analysis contexts.
- DriverBasedAnalysisContext getContextFor(String path);
+ DriverBasedAnalysisContext? getContextFor(String path);
/// Return the [AnalysisDriver] for the "innermost" context whose associated
/// folder is or contains the given path. ("innermost" refers to the nesting
@@ -90,7 +75,7 @@
/// the context for /foo/bar.)
///
/// If no driver contains the given path, `null` is returned.
- AnalysisDriver getDriverFor(String path);
+ AnalysisDriver? getDriverFor(String path);
/// Return `true` if the file or directory with the given [path] will be
/// analyzed in one of the analysis contexts.
@@ -159,8 +144,9 @@
/// The scheduler used to create analysis contexts, and report status.
final AnalysisDriverScheduler _scheduler;
- /// The current set of analysis contexts.
- AnalysisContextCollectionImpl _collection;
+ /// The current set of analysis contexts, or `null` if the context roots have
+ /// not yet been set.
+ AnalysisContextCollectionImpl? _collection;
/// The context used to work with file system paths.
path.Context pathContext;
@@ -179,7 +165,7 @@
final InstrumentationService _instrumentationService;
@override
- ContextManagerCallbacks callbacks;
+ ContextManagerCallbacks callbacks = NoopContextManagerCallbacks();
@override
final Map<Folder, AnalysisDriver> driverMap =
@@ -199,12 +185,12 @@
/// to files generated by Bazel.
///
/// Might be `null` if watching Bazel files is not enabled.
- BazelFileWatcherService bazelWatcherService;
+ BazelFileWatcherService? bazelWatcherService;
/// The subscription to changes in the files watched by [bazelWatcherService].
///
/// Might be `null` if watching Bazel files is not enabled.
- StreamSubscription<List<WatchEvent>> bazelWatcherSubscription;
+ StreamSubscription<List<WatchEvent>>? bazelWatcherSubscription;
/// For each [Folder] store which files are being watched. This allows us to
/// clean up when we destroy a context.
@@ -212,17 +198,17 @@
ContextManagerImpl(this.resourceProvider, this.sdkManager, this._byteStore,
this._performanceLog, this._scheduler, this._instrumentationService,
- {@required enableBazelWatcher}) {
- pathContext = resourceProvider.pathContext;
+ {required enableBazelWatcher})
+ : pathContext = resourceProvider.pathContext {
if (enableBazelWatcher) {
bazelWatcherService = BazelFileWatcherService(_instrumentationService);
- bazelWatcherSubscription = bazelWatcherService.events
+ bazelWatcherSubscription = bazelWatcherService!.events
.listen((events) => _handleBazelWatchEvents(events));
}
}
@override
- DriverBasedAnalysisContext getContextFor(String path) {
+ DriverBasedAnalysisContext? getContextFor(String path) {
try {
return _collection?.contextFor(path);
} on StateError {
@@ -231,7 +217,7 @@
}
@override
- AnalysisDriver getDriverFor(String path) {
+ AnalysisDriver? getDriverFor(String path) {
return getContextFor(path)?.driver;
}
@@ -368,7 +354,6 @@
pubspecAst.accept(entry.value);
}
if (listener.errors.isNotEmpty) {
- convertedErrors ??= <protocol.AnalysisError>[];
convertedErrors.addAll(converter.convertAnalysisErrors(
listener.errors,
lineInfo: lineInfo,
@@ -411,7 +396,7 @@
void _createAnalysisContexts() {
_destroyAnalysisContexts();
- _collection = AnalysisContextCollectionImpl(
+ var collection = _collection = AnalysisContextCollectionImpl(
includedPaths: includedPaths,
excludedPaths: excludedPaths,
byteStore: _byteStore,
@@ -423,7 +408,7 @@
sdkPath: sdkManager.defaultSdkDirectory,
);
- for (var analysisContext in _collection.contexts) {
+ for (var analysisContext in collection.contexts) {
var driver = analysisContext.driver;
callbacks.listenAnalysisDriver(driver);
@@ -473,15 +458,16 @@
var watched = bazelWatchedPathsPerFolder.remove(rootFolder);
if (watched != null) {
for (var path in watched.paths) {
- bazelWatcherService.stopWatching(watched.workspace, path);
+ bazelWatcherService!.stopWatching(watched.workspace, path);
}
}
driverMap.remove(rootFolder);
}
void _destroyAnalysisContexts() {
- if (_collection != null) {
- for (var analysisContext in _collection.contexts) {
+ var collection = _collection;
+ if (collection != null) {
+ for (var analysisContext in collection.contexts) {
_destroyAnalysisContext(analysisContext);
}
callbacks.afterContextsDestroyed();
@@ -550,8 +536,9 @@
return;
}
- if (file_paths.isDart(pathContext, path)) {
- for (var analysisContext in _collection.contexts) {
+ var collection = _collection;
+ if (collection != null && file_paths.isDart(pathContext, path)) {
+ for (var analysisContext in collection.contexts) {
switch (type) {
case ChangeType.ADD:
if (analysisContext.contextRoot.isAnalyzed(path)) {
@@ -620,7 +607,7 @@
/// Does nothing if the [driver] is not in a Bazel workspace.
void _watchBazelFilesIfNeeded(Folder folder, AnalysisDriver analysisDriver) {
if (!experimentalEnableBazelWatching) return;
- var workspace = analysisDriver.analysisContext.contextRoot.workspace;
+ var workspace = analysisDriver.analysisContext?.contextRoot.workspace;
if (workspace is BazelWorkspace &&
!bazelSearchSubscriptions.containsKey(folder)) {
var searchSubscription = workspace.bazelCandidateFiles.listen(
@@ -631,6 +618,29 @@
}
}
+class NoopContextManagerCallbacks implements ContextManagerCallbacks {
+ @override
+ void afterContextsCreated() {}
+
+ @override
+ void afterContextsDestroyed() {}
+
+ @override
+ void afterWatchEvent(WatchEvent event) {}
+
+ @override
+ void applyFileRemoved(String file) {}
+
+ @override
+ void broadcastWatchEvent(WatchEvent event) {}
+
+ @override
+ void listenAnalysisDriver(AnalysisDriver driver) {}
+
+ @override
+ void recordAnalysisErrors(String path, List<protocol.AnalysisError> errors) {}
+}
+
class _BazelWatchedFiles {
final String workspace;
final paths = <String>{};
diff --git a/pkg/analysis_server/lib/src/lsp/client_capabilities.dart b/pkg/analysis_server/lib/src/lsp/client_capabilities.dart
index 2a2039a..2d7bc42 100644
--- a/pkg/analysis_server/lib/src/lsp/client_capabilities.dart
+++ b/pkg/analysis_server/lib/src/lsp/client_capabilities.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
/// Wraps the client (editor) capabilities to improve performance.
@@ -73,9 +71,9 @@
final Set<CodeActionKind> codeActionKinds;
final Set<CompletionItemTag> completionItemTags;
final Set<DiagnosticTag> diagnosticTags;
- final Set<MarkupKind> completionDocumentationFormats;
- final Set<MarkupKind> signatureHelpDocumentationFormats;
- final Set<MarkupKind> hoverContentFormats;
+ final Set<MarkupKind>? completionDocumentationFormats;
+ final Set<MarkupKind>? signatureHelpDocumentationFormats;
+ final Set<MarkupKind>? hoverContentFormats;
final Set<SymbolKind> documentSymbolKinds;
final Set<SymbolKind> workspaceSymbolKinds;
final Set<CompletionItemKind> completionItemKinds;
@@ -83,9 +81,9 @@
final bool experimentalSnippetTextEdit;
LspClientCapabilities(this.raw)
- : applyEdit = raw?.workspace?.applyEdit ?? false,
- codeActionKinds = _listToSet(raw?.textDocument?.codeAction
- ?.codeActionLiteralSupport?.codeActionKind?.valueSet),
+ : applyEdit = raw.workspace?.applyEdit ?? false,
+ codeActionKinds = _listToSet(raw.textDocument?.codeAction
+ ?.codeActionLiteralSupport?.codeActionKind.valueSet),
completionDeprecatedFlag =
raw.textDocument?.completion?.completionItem?.deprecatedSupport ??
false,
@@ -93,74 +91,76 @@
completionInsertTextModes = _listToSet(raw.textDocument?.completion
?.completionItem?.insertTextModeSupport?.valueSet),
completionItemKinds = _listToSet(
- raw?.textDocument?.completion?.completionItemKind?.valueSet,
+ raw.textDocument?.completion?.completionItemKind?.valueSet,
defaults: defaultSupportedCompletionKinds),
completionSnippets =
raw.textDocument?.completion?.completionItem?.snippetSupport ??
false,
- configuration = raw?.workspace?.configuration ?? false,
+ configuration = raw.workspace?.configuration ?? false,
createResourceOperations = raw
- ?.workspace?.workspaceEdit?.resourceOperations
+ .workspace?.workspaceEdit?.resourceOperations
?.contains(ResourceOperationKind.Create) ??
false,
definitionLocationLink =
- raw?.textDocument?.definition?.linkSupport ?? false,
- completionItemTags = _listToSet(raw
- ?.textDocument?.completion?.completionItem?.tagSupport?.valueSet),
+ raw.textDocument?.definition?.linkSupport ?? false,
+ completionItemTags = _listToSet(
+ raw.textDocument?.completion?.completionItem?.tagSupport?.valueSet),
diagnosticTags = _listToSet(
- raw?.textDocument?.publishDiagnostics?.tagSupport?.valueSet),
+ raw.textDocument?.publishDiagnostics?.tagSupport?.valueSet),
documentChanges =
- raw?.workspace?.workspaceEdit?.documentChanges ?? false,
+ raw.workspace?.workspaceEdit?.documentChanges ?? false,
documentSymbolKinds = _listToSet(
- raw?.textDocument?.documentSymbol?.symbolKind?.valueSet,
+ raw.textDocument?.documentSymbol?.symbolKind?.valueSet,
defaults: defaultSupportedSymbolKinds),
- hierarchicalSymbols = raw?.textDocument?.documentSymbol
+ hierarchicalSymbols = raw.textDocument?.documentSymbol
?.hierarchicalDocumentSymbolSupport ??
false,
hoverContentFormats = _hoverContentFormats(raw),
- insertReplaceCompletionRanges = raw?.textDocument?.completion
+ insertReplaceCompletionRanges = raw.textDocument?.completion
?.completionItem?.insertReplaceSupport ??
false,
literalCodeActions =
- raw?.textDocument?.codeAction?.codeActionLiteralSupport != null,
+ raw.textDocument?.codeAction?.codeActionLiteralSupport != null,
renameValidation = raw.textDocument?.rename?.prepareSupport ?? false,
signatureHelpDocumentationFormats = _sigHelpDocumentationFormats(raw),
workDoneProgress = raw.window?.workDoneProgress ?? false,
workspaceSymbolKinds = _listToSet(
- raw?.workspace?.symbol?.symbolKind?.valueSet,
+ raw.workspace?.symbol?.symbolKind?.valueSet,
defaults: defaultSupportedSymbolKinds),
experimentalSnippetTextEdit =
raw.experimental is Map<String, dynamic> &&
raw.experimental['snippetTextEdit'] == true;
- static Set<MarkupKind> _completionDocumentationFormats(
+ static Set<MarkupKind>? _completionDocumentationFormats(
ClientCapabilities raw) {
// For formats, null is valid (which means only raw strings are supported,
- // not [MarkupContent]), so use null as default.
- return _listToSet(
- raw?.textDocument?.completion?.completionItem?.documentationFormat,
- defaults: null);
+ // not [MarkupContent]).
+ return _listToNullableSet(
+ raw.textDocument?.completion?.completionItem?.documentationFormat);
}
- static Set<MarkupKind> _hoverContentFormats(ClientCapabilities raw) {
+ static Set<MarkupKind>? _hoverContentFormats(ClientCapabilities raw) {
// For formats, null is valid (which means only raw strings are supported,
// not [MarkupContent]), so use null as default.
- return _listToSet(raw?.textDocument?.hover?.contentFormat, defaults: null);
+ return _listToNullableSet(raw.textDocument?.hover?.contentFormat);
+ }
+
+ /// Converts a list to a `Set`, returning null if the list is null.
+ static Set<T>? _listToNullableSet<T>(List<T>? items) {
+ return items != null ? {...items} : null;
}
/// Converts a list to a `Set`, returning [defaults] if the list is null.
///
/// If [defaults] is not supplied, will return an empty set.
- static Set<T> _listToSet<T>(List<T> items, {Set<T> defaults = const {}}) {
+ static Set<T> _listToSet<T>(List<T>? items, {Set<T> defaults = const {}}) {
return items != null ? {...items} : defaults;
}
- static Set<MarkupKind> _sigHelpDocumentationFormats(ClientCapabilities raw) {
+ static Set<MarkupKind>? _sigHelpDocumentationFormats(ClientCapabilities raw) {
// For formats, null is valid (which means only raw strings are supported,
// not [MarkupContent]), so use null as default.
- return _listToSet(
- raw?.textDocument?.signatureHelp?.signatureInformation
- ?.documentationFormat,
- defaults: null);
+ return _listToNullableSet(raw.textDocument?.signatureHelp
+ ?.signatureInformation?.documentationFormat);
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/constants.dart b/pkg/analysis_server/lib/src/lsp/constants.dart
index d04c276..952a5c5 100644
--- a/pkg/analysis_server/lib/src/lsp/constants.dart
+++ b/pkg/analysis_server/lib/src/lsp/constants.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
import 'package:analysis_server/lsp_protocol/protocol_special.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
index 998a39e..459a0f3 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
@@ -53,7 +53,7 @@
// LSP requests return errors).
server.instrumentationService.logInfo(
'Unable to $commandName because the file contains parse errors');
- return success();
+ return success(null);
}
final organizer = ImportOrganizer(code, unit, result.errors);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
index 0b3a4ef..5494e3e 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
@@ -36,7 +36,7 @@
// If there are no edits to apply, just complete the command without going
// back to the client.
if (edits.isEmpty) {
- return success();
+ return success(null);
}
final workspaceEdit = toWorkspaceEdit(
@@ -70,7 +70,7 @@
final editResponseResult =
ApplyWorkspaceEditResponse.fromJson(editResponse.result);
if (editResponseResult.applied) {
- return success();
+ return success(null);
} else {
return error(
ServerErrorCodes.ClientFailedToApplyEdit,
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart
index cd62bcc..ed8824fc 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart
@@ -21,6 +21,6 @@
@override
Future<ErrorOr<void>> handle(void _, CancellationToken token) async {
server.reanalyze();
- return success();
+ return success(null);
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_cancel_request.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_cancel_request.dart
index 1bdc3db..46c0e60 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_cancel_request.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_cancel_request.dart
@@ -36,6 +36,6 @@
// cancellation that we processed after already starting to send the response
// and cleared the token.
_tokens[params.id.toString()]?.cancel();
- return success();
+ return success(null);
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
index cf360d1..9b7df1e 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
@@ -29,7 +29,7 @@
DidChangeWorkspaceFoldersParams params, CancellationToken token) {
// Don't do anything if our analysis roots are not based on open workspaces.
if (!updateAnalysisRoots) {
- return success();
+ return success(null);
}
final added = params?.event?.added
@@ -42,6 +42,6 @@
server.updateWorkspaceFolders(added, removed);
- return success();
+ return success(null);
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
index bb33c81..89a4776 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
@@ -36,6 +36,6 @@
Future(() {
exit(clientDidCallShutdown ? 0 : 1);
});
- return success();
+ return success(null);
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
index cc07266..2c3b193 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
@@ -31,7 +31,7 @@
final result = server.getParsedUnit(path);
if (result.state != ResultState.VALID || result.errors.isNotEmpty) {
- return success();
+ return success(null);
}
return generateEditsForFormatting(
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
index bc83804..934cd2a 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
@@ -31,7 +31,7 @@
final result = server.getParsedUnit(path);
if (result.state != ResultState.VALID || result.errors.isNotEmpty) {
- return success();
+ return success(null);
}
return generateEditsForFormatting(
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
index eefcd07..e2cf8e1 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
@@ -31,7 +31,7 @@
final result = server.getParsedUnit(path);
if (result.state != ResultState.VALID || result.errors.isNotEmpty) {
- return success();
+ return success(null);
}
return generateEditsForFormatting(
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
index 98922d8..114216b 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
@@ -36,6 +36,6 @@
server.updateWorkspaceFolders(openWorkspacePaths, const []);
}
- return success();
+ return success(null);
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
index 31f5872..bfd1405 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
@@ -67,7 +67,7 @@
element = (element as PropertyAccessorElement).variable;
}
if (element == null) {
- return success();
+ return success(null);
}
final computer = ElementReferencesComputer(server.searchEngine);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
index 9746f3a..a94c410 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
@@ -27,6 +27,6 @@
// We can clean up and shut down here, but we cannot terminate the server
// because that must be done after the exit notification.
- return success();
+ return success(null);
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
index 5d97030..3dd708c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
@@ -52,11 +52,11 @@
unit.result.unit,
offset);
if (!computer.offsetIsValid) {
- return success(); // No error, just no valid hover.
+ return success(null); // No error, just no valid hover.
}
final signature = computer.compute();
if (signature == null) {
- return success(); // No error, just no valid hover.
+ return success(null); // No error, just no valid hover.
}
// Skip results if this was an auto-trigger but not from the start of the
@@ -66,7 +66,7 @@
if (autoTriggered &&
computer.argumentList != null &&
offset != computer.argumentList.offset + 1) {
- return success();
+ return success(null);
}
final formats =
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
index d1194ee..27041af 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
@@ -131,7 +131,7 @@
if (message is! RequestMessage) {
server.instrumentationService
.logInfo('Ignoring ${message.method} message while initializing');
- return success();
+ return success(null);
}
return error(
ErrorCodes.ServerNotInitialized,
@@ -151,7 +151,7 @@
if (message is! RequestMessage) {
server.instrumentationService
.logInfo('Ignoring ${message.method} message while shutting down');
- return success();
+ return success(null);
}
return error(ErrorCodes.InvalidRequest,
'Unable to handle ${message.method} after shutdown request');
@@ -171,7 +171,7 @@
if (message is! RequestMessage) {
server.instrumentationService
.logInfo('Ignoring ${message.method} message while uninitialized');
- return success();
+ return success(null);
}
return error(ErrorCodes.ServerNotInitialized,
'Unable to handle ${message.method} before client has sent initialize request');
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
index c6addff..a03eb33 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
@@ -23,13 +23,13 @@
DidChangeTextDocumentParams.jsonHandler;
@override
- ErrorOr<void> handle(
+ ErrorOr<Null> handle(
DidChangeTextDocumentParams params, CancellationToken token) {
final path = pathOfDoc(params.textDocument);
return path.mapResult((path) => _changeFile(path, params));
}
- ErrorOr<void> _changeFile(String path, DidChangeTextDocumentParams params) {
+ ErrorOr<Null> _changeFile(String path, DidChangeTextDocumentParams params) {
String oldContents;
if (server.resourceProvider.hasOverlay(path)) {
oldContents = server.resourceProvider.getFile(path).readAsStringSync();
@@ -49,7 +49,7 @@
return newContents.mapResult((result) {
server.documentVersions[path] = params.textDocument;
server.onOverlayUpdated(path, result.last, newContent: result.first);
- return success();
+ return success(null);
});
}
}
@@ -66,7 +66,7 @@
DidCloseTextDocumentParams.jsonHandler;
@override
- ErrorOr<void> handle(
+ ErrorOr<Null> handle(
DidCloseTextDocumentParams params, CancellationToken token) {
final path = pathOfDoc(params.textDocument);
return path.mapResult((path) {
@@ -74,7 +74,7 @@
server.documentVersions.remove(path);
server.onOverlayDestroyed(path);
- return success();
+ return success(null);
});
}
}
@@ -91,7 +91,7 @@
DidOpenTextDocumentParams.jsonHandler;
@override
- ErrorOr<void> handle(
+ ErrorOr<Null> handle(
DidOpenTextDocumentParams params, CancellationToken token) {
final doc = params.textDocument;
final path = pathOfDocItem(doc);
@@ -110,7 +110,7 @@
server.addPriorityFile(path);
- return success();
+ return success(null);
});
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_configuration.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_configuration.dart
index 3be46d8..067641c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_configuration.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_configuration.dart
@@ -30,6 +30,6 @@
// whenever we are told they may have changed.
await server.fetchClientConfigurationAndPerformDynamicRegistration();
- return success();
+ return success(null);
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
index 3f5def6..4a26e3c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
@@ -202,7 +202,7 @@
// Otherwise respond with failure. Optional Requests must still be responded
// to so they don't leave open requests on the client.
return _isOptionalNotification(message)
- ? success()
+ ? success(null)
: error(ErrorCodes.MethodNotFound, 'Unknown method ${message.method}');
}
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 076172d..c987a3f 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -805,23 +805,12 @@
analysisServer.declarationsTracker
?.addContext(analysisDriver.analysisContext);
- final supportedDiagnosticTags =
- analysisServer.clientCapabilities.diagnosticTags;
analysisDriver.results.listen((result) {
var path = result.path;
filesToFlush.add(path);
if (analysisServer.isAnalyzed(path)) {
- final serverErrors = protocol.mapEngineErrors(
- result,
- result.errors.where(_shouldSendDiagnostic).toList(),
- (result, error, [severity]) => toDiagnostic(
- result,
- error,
- supportedTags: supportedDiagnosticTags,
- errorSeverity: severity,
- ));
-
- analysisServer.publishDiagnostics(result.path, serverErrors);
+ final serverErrors = protocol.doAnalysisError_listFromEngine(result);
+ recordAnalysisErrors(result.path, serverErrors);
}
if (result.unit != null) {
if (analysisServer.shouldSendClosingLabelsFor(path)) {
@@ -854,12 +843,13 @@
@override
void recordAnalysisErrors(String path, List<protocol.AnalysisError> errors) {
+ final errorsToSend = errors.where(_shouldSendError).toList();
filesToFlush.add(path);
analysisServer.notificationManager
- .recordAnalysisErrors(NotificationManager.serverId, path, errors);
+ .recordAnalysisErrors(NotificationManager.serverId, path, errorsToSend);
}
- bool _shouldSendDiagnostic(AnalysisError error) =>
- error.errorCode.type != ErrorType.TODO ||
+ bool _shouldSendError(protocol.AnalysisError error) =>
+ error.code != ErrorType.TODO.name.toLowerCase() ||
analysisServer.clientConfiguration.showTodos;
}
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index 388fbdc..3f0b00c 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -24,7 +24,6 @@
import 'package:analysis_server/src/search/workspace_symbols.dart' as server
show DeclarationKind;
import 'package:analyzer/dart/analysis/results.dart' as server;
-import 'package:analyzer/diagnostic/diagnostic.dart' as analyzer;
import 'package:analyzer/error/error.dart' as server;
import 'package:analyzer/source/line_info.dart' as server;
import 'package:analyzer/source/source_range.dart' as server;
@@ -35,20 +34,22 @@
import 'package:analyzer_plugin/utilities/pair.dart';
import 'package:meta/meta.dart';
-const diagnosticTagsForErrorCode = <server.ErrorCode, List<lsp.DiagnosticTag>>{
- HintCode.DEAD_CODE: [lsp.DiagnosticTag.Unnecessary],
- HintCode.DEPRECATED_MEMBER_USE: [lsp.DiagnosticTag.Deprecated],
- HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE: [
- lsp.DiagnosticTag.Deprecated
- ],
- HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE: [
- lsp.DiagnosticTag.Deprecated
- ],
- HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE: [lsp.DiagnosticTag.Deprecated],
-};
-
const languageSourceName = 'dart';
+final diagnosticTagsForErrorCode = <String, List<lsp.DiagnosticTag>>{
+ _errorCode(HintCode.DEAD_CODE): [lsp.DiagnosticTag.Unnecessary],
+ _errorCode(HintCode.DEPRECATED_MEMBER_USE): [lsp.DiagnosticTag.Deprecated],
+ _errorCode(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE): [
+ lsp.DiagnosticTag.Deprecated
+ ],
+ _errorCode(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE): [
+ lsp.DiagnosticTag.Deprecated
+ ],
+ _errorCode(HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE): [
+ lsp.DiagnosticTag.Deprecated
+ ],
+};
+
lsp.Either2<String, lsp.MarkupContent> asStringOrMarkupContent(
Set<lsp.MarkupKind> preferredFormats, String content) {
if (content == null) {
@@ -625,12 +626,12 @@
}
List<lsp.DiagnosticTag> getDiagnosticTags(
- Set<lsp.DiagnosticTag> supportedTags, server.AnalysisError error) {
+ Set<lsp.DiagnosticTag> supportedTags, plugin.AnalysisError error) {
if (supportedTags == null) {
return null;
}
- final tags = diagnosticTagsForErrorCode[error.errorCode]
+ final tags = diagnosticTagsForErrorCode[error.code]
?.where(supportedTags.contains)
?.toList();
@@ -717,8 +718,9 @@
lsp.Diagnostic pluginToDiagnostic(
server.LineInfo Function(String) getLineInfo,
- plugin.AnalysisError error,
-) {
+ plugin.AnalysisError error, {
+ @required Set<lsp.DiagnosticTag> supportedTags,
+}) {
List<lsp.DiagnosticRelatedInformation> relatedInformation;
if (error.contextMessages != null && error.contextMessages.isNotEmpty) {
relatedInformation = error.contextMessages
@@ -739,6 +741,7 @@
code: error.code,
source: languageSourceName,
message: message,
+ tags: getDiagnosticTags(supportedTags, error),
relatedInformation: relatedInformation,
);
}
@@ -996,67 +999,10 @@
server.AnalysisError error, {
@required Set<lsp.DiagnosticTag> supportedTags,
server.ErrorSeverity errorSeverity,
-}) {
- var errorCode = error.errorCode;
-
- // Default to the error's severity if none is specified.
- errorSeverity ??= errorCode.errorSeverity;
-
- List<lsp.DiagnosticRelatedInformation> relatedInformation;
- if (error.contextMessages.isNotEmpty) {
- relatedInformation = error.contextMessages
- .map((message) => toDiagnosticRelatedInformation(result, message))
- .toList();
- }
-
- var message = error.message;
- if (error.correctionMessage != null) {
- message = '$message\n${error.correctionMessage}';
- }
-
- return lsp.Diagnostic(
- range: toRange(result.lineInfo, error.offset, error.length),
- severity: toDiagnosticSeverity(errorSeverity),
- code: errorCode.name.toLowerCase(),
- source: languageSourceName,
- message: message,
- tags: getDiagnosticTags(supportedTags, error),
- relatedInformation: relatedInformation,
- );
-}
-
-lsp.DiagnosticRelatedInformation toDiagnosticRelatedInformation(
- server.ResolvedUnitResult result, analyzer.DiagnosticMessage message) {
- var file = message.filePath;
- var lineInfo = result.session.getFile(file).lineInfo;
- return lsp.DiagnosticRelatedInformation(
- location: lsp.Location(
- uri: Uri.file(file).toString(),
- range: toRange(
- lineInfo,
- message.offset,
- message.length,
- ),
- ),
- message: message.message);
-}
-
-lsp.DiagnosticSeverity toDiagnosticSeverity(server.ErrorSeverity severity) {
- switch (severity) {
- case server.ErrorSeverity.ERROR:
- return lsp.DiagnosticSeverity.Error;
- case server.ErrorSeverity.WARNING:
- return lsp.DiagnosticSeverity.Warning;
- case server.ErrorSeverity.INFO:
- return lsp.DiagnosticSeverity.Information;
- // Note: LSP also supports "Hint", but they won't render in things like the
- // VS Code errors list as they're apparently intended to communicate
- // non-visible diagnostics back (for example, if you wanted to grey out
- // unreachable code without producing an item in the error list).
- default:
- throw 'Unknown AnalysisErrorSeverity: $severity';
- }
-}
+}) =>
+ pluginToDiagnostic((_) => result.lineInfo,
+ server.newAnalysisError_fromEngine(result, error),
+ supportedTags: supportedTags);
lsp.Element toElement(server.LineInfo lineInfo, server.Element element) =>
lsp.Element(
@@ -1481,3 +1427,5 @@
return Pair(insertText, insertTextFormat);
}
+
+String _errorCode(server.ErrorCode code) => code.name.toLowerCase();
diff --git a/pkg/analysis_server/lib/src/lsp/notification_manager.dart b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
index e6506bd..0866a25 100644
--- a/pkg/analysis_server/lib/src/lsp/notification_manager.dart
+++ b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
@@ -30,7 +30,11 @@
void sendAnalysisErrors(
String filePath, List<protocol.AnalysisError> errors) {
final diagnostics = errors
- .map((error) => pluginToDiagnostic(server.getLineInfo, error))
+ .map((error) => pluginToDiagnostic(
+ server.getLineInfo,
+ error,
+ supportedTags: server.clientCapabilities.diagnosticTags,
+ ))
.toList();
final params = PublishDiagnosticsParams(
diff --git a/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart b/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart
index a3de7dd..f2e88e1 100644
--- a/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart
+++ b/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
import 'dart:collection';
import 'dart:math' as math;
@@ -34,12 +32,10 @@
.where((region) => highlightRegionTokenTypes.containsKey(region.type));
for (final region in translatedRegions) {
- final tokenType = highlightRegionTokenTypes[region.type];
-
tokens.add(SemanticTokenInfo(
region.offset,
region.length,
- tokenType,
+ highlightRegionTokenTypes[region.type]!,
highlightRegionTokenModifiers[region.type],
));
}
@@ -73,7 +69,7 @@
relativeColumn,
token.length,
semanticTokenLegend.indexForType(token.type),
- semanticTokenLegend.bitmaskForModifiers(token.modifiers) ?? 0
+ semanticTokenLegend.bitmaskForModifiers(token.modifiers)
]);
lastLine = tokenLine;
@@ -126,17 +122,15 @@
var pos = firstToken.offset;
for (final current in sortedTokens.skip(1)) {
- if (stack.last != null) {
- final last = stack.last;
- final newPos = current.offset;
- if (newPos - pos > 0) {
- // The previous region ends at either its original end or
- // the position of this next region, whichever is shorter.
- final end = math.min(last.offset + last.length, newPos);
- final length = end - pos;
- yield SemanticTokenInfo(pos, length, last.type, last.modifiers);
- pos = newPos;
- }
+ final last = stack.last;
+ final newPos = current.offset;
+ if (newPos - pos > 0) {
+ // The previous region ends at either its original end or
+ // the position of this next region, whichever is shorter.
+ final end = math.min(last.offset + last.length, newPos);
+ final length = end - pos;
+ yield SemanticTokenInfo(pos, length, last.type, last.modifiers);
+ pos = newPos;
}
stack.addLast(current);
@@ -159,7 +153,7 @@
final int offset;
final int length;
final SemanticTokenTypes type;
- final Set<SemanticTokenModifiers> modifiers;
+ final Set<SemanticTokenModifiers>? modifiers;
SemanticTokenInfo(this.offset, this.length, this.type, this.modifiers);
diff --git a/pkg/analysis_server/lib/src/lsp/semantic_tokens/legend.dart b/pkg/analysis_server/lib/src/lsp/semantic_tokens/legend.dart
index 2b7c3e4..5106306 100644
--- a/pkg/analysis_server/lib/src/lsp/semantic_tokens/legend.dart
+++ b/pkg/analysis_server/lib/src/lsp/semantic_tokens/legend.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
import 'dart:math' as math;
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
@@ -17,17 +15,17 @@
/// [SemanticTokenModifiers].
class SemanticTokenLegendLookup {
/// An LSP [SemanticTokensLegend] describing all supported tokens and modifiers.
- SemanticTokensLegend lspLegend;
+ late SemanticTokensLegend lspLegend;
/// All [SemanticTokenModifiers] the server may generate. The order of these
/// items is important as the indexes will be used in communication between
/// server and client.
- List<SemanticTokenModifiers> _usedTokenModifiers;
+ late List<SemanticTokenModifiers> _usedTokenModifiers;
/// All [SemanticTokenTypes] the server may generate. The order of these
/// items is important as the indexes will be used in communication betewen
/// server and client.
- List<SemanticTokenTypes> _usedTokenTypes;
+ late List<SemanticTokenTypes> _usedTokenTypes;
SemanticTokenLegendLookup() {
// Build lists of all tokens and modifiers that exist in our mappings or that
@@ -51,13 +49,14 @@
);
}
- int bitmaskForModifiers(Set<SemanticTokenModifiers> modifiers) {
+ int bitmaskForModifiers(Set<SemanticTokenModifiers>? modifiers) {
// Modifiers use a bit mask where each bit represents the index of a modifier.
// 001001 would indicate the 1st and 4th modifiers are applied.
return modifiers
?.map(_usedTokenModifiers.indexOf)
- ?.map((index) => math.pow(2, index))
- ?.reduce((a, b) => a + b) ??
+ .map((index) => math.pow(2, index))
+ .reduce((a, b) => a + b)
+ .toInt() ??
0;
}
diff --git a/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart b/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart
index 34c7909..66e4b26 100644
--- a/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
import 'package:analysis_server/src/lsp/constants.dart';
import 'package:analysis_server/src/lsp/semantic_tokens/legend.dart';
@@ -154,7 +152,7 @@
// for faster lookups.
for (final regionType in highlightRegionTokenTypes.keys) {
_tokenTypeIndexForHighlightRegion[regionType] = semanticTokenLegend
- .indexForType(highlightRegionTokenTypes[regionType]);
+ .indexForType(highlightRegionTokenTypes[regionType]!);
}
for (final regionType in highlightRegionTokenTypes.keys) {
@@ -166,10 +164,10 @@
/// Gets the [SemanticTokenModifiers] bitmask for a [HighlightRegionType]. Returns
/// null if the region type has not been mapped.
int bitmaskForModifier(HighlightRegionType type) =>
- _tokenModifierBitmaskForHighlightRegion[type];
+ _tokenModifierBitmaskForHighlightRegion[type]!;
/// Gets the [SemanticTokenTypes] index for a [HighlightRegionType]. Returns
/// null if the region type has not been mapped.
int indexForToken(HighlightRegionType type) =>
- _tokenTypeIndexForHighlightRegion[type];
+ _tokenTypeIndexForHighlightRegion[type]!;
}
diff --git a/pkg/analysis_server/lib/src/lsp/source_edits.dart b/pkg/analysis_server/lib/src/lsp/source_edits.dart
index a1004f1..f4975617 100644
--- a/pkg/analysis_server/lib/src/lsp/source_edits.dart
+++ b/pkg/analysis_server/lib/src/lsp/source_edits.dart
@@ -99,12 +99,12 @@
// use seeing edits on every save with invalid code (if LSP gains the
// ability to pass a context to know if the format was manually invoked
// we may wish to change this to return an error for that case).
- return success();
+ return success(null);
}
final formattedSource = formattedResult.text;
if (formattedSource == unformattedSource) {
- return success();
+ return success(null);
}
return _generateMinimalEdits(result, formattedSource, range: range);
diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart
index a380a07..0d066fe 100644
--- a/pkg/analysis_server/test/lsp/diagnostic_test.dart
+++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart
@@ -266,6 +266,44 @@
await checkPluginErrorsForFile(mainFilePath);
}
+ Future<void> test_fromPlugins_dartFile_combined() async {
+ // Check that if code has both a plugin and a server error, that when the
+ // plugin produces an error, it comes through _with_ the server-produced
+ // error.
+ // https://github.com/dart-lang/sdk/issues/45678
+ //
+ final serverErrorMessage =
+ "A value of type 'int' can't be assigned to a variable of type 'String'";
+ final pluginErrorMessage = 'Test error from plugin';
+
+ newFile(mainFilePath, content: 'String a = 1;');
+ final initialDiagnosticsFuture = waitForDiagnostics(mainFileUri);
+ await initialize();
+ final initialDiagnostics = await initialDiagnosticsFuture;
+ expect(initialDiagnostics, hasLength(1));
+ expect(initialDiagnostics.first.message, contains(serverErrorMessage));
+
+ final pluginTriggeredDiagnosticFuture = waitForDiagnostics(mainFileUri);
+ final pluginError = plugin.AnalysisError(
+ plugin.AnalysisErrorSeverity.ERROR,
+ plugin.AnalysisErrorType.STATIC_TYPE_WARNING,
+ plugin.Location(mainFilePath, 0, 1, 0, 0, 0, 1),
+ pluginErrorMessage,
+ 'ERR1',
+ );
+ final pluginResult =
+ plugin.AnalysisErrorsParams(mainFilePath, [pluginError]);
+ configureTestPlugin(notification: pluginResult.toNotification());
+
+ final pluginTriggeredDiagnostics = await pluginTriggeredDiagnosticFuture;
+ expect(
+ pluginTriggeredDiagnostics.map((error) => error.message),
+ containsAll([
+ pluginErrorMessage,
+ contains(serverErrorMessage),
+ ]));
+ }
+
Future<void> test_fromPlugins_nonDartFile() async {
await checkPluginErrorsForFile(join(projectFolderPath, 'lib', 'foo.sql'));
}
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 63bfa14..68c29f7 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -203,6 +203,9 @@
// Any fields that are optional but present, must still type check.
final fields = _getAllFields(interface);
for (var field in fields) {
+ if (isAnyType(field.type)) {
+ continue;
+ }
buffer
..writeIndentedln("reporter.push('${field.name}');")
..writeIndentedln('try {')
@@ -277,16 +280,14 @@
final isLiteral = field.type is LiteralType;
final isRequired =
!isLiteral && !field.allowsNull && !field.allowsUndefined;
- final annotation = isRequired ? '@required' : '';
+ final requiredKeyword = isRequired ? 'required' : '';
final valueCode =
isLiteral ? ' = ${(field.type as LiteralType).literal}' : '';
- return '$annotation this.${field.name}$valueCode';
+ return '$requiredKeyword this.${field.name}$valueCode';
}).join(', '))
..write('})');
- final fieldsWithValidation = allFields
- .where(
- (f) => (!f.allowsNull && !f.allowsUndefined) || f.type is LiteralType)
- .toList();
+ final fieldsWithValidation =
+ allFields.where((f) => f.type is LiteralType).toList();
if (fieldsWithValidation.isNotEmpty) {
buffer
..writeIndentedln(' {')
@@ -301,14 +302,6 @@
"throw '${field.name} may only be the literal ${type.literal.replaceAll("'", "\\'")}';")
..outdent()
..writeIndentedln('}');
- } else if (!field.allowsNull && !field.allowsUndefined) {
- buffer
- ..writeIndentedln('if (${field.name} == null) {')
- ..indent()
- ..writeIndentedln(
- "throw '${field.name} is required but was not provided';")
- ..outdent()
- ..writeIndentedln('}');
}
}
buffer
@@ -458,9 +451,12 @@
void _writeField(IndentableStringBuffer buffer, Field field) {
_writeDocCommentsAndAnnotations(buffer, field);
+ final needsNullable =
+ (field.allowsNull || field.allowsUndefined) && !isAnyType(field.type);
buffer
..writeIndented('final ')
..write(field.type.dartTypeWithTypeArgs)
+ ..write(needsNullable ? '?' : '')
..writeln(' ${field.name};');
}
@@ -473,8 +469,13 @@
buffer.write('$valueCode');
} else if (_isSpecType(type)) {
// Our own types have fromJson() constructors we can call.
- buffer.write(
- '$valueCode != null ? ${type.dartType}.fromJson${type.typeArgsString}($valueCode) : null');
+ if (allowsNull) {
+ buffer.write('$valueCode != null ? ');
+ }
+ buffer.write('${type.dartType}.fromJson${type.typeArgsString}($valueCode)');
+ if (allowsNull) {
+ buffer.write(': null');
+ }
} else if (type is ArrayType) {
// Lists need to be map()'d so we can recursively call writeFromJsonCode
// as they may need fromJson on each element.
@@ -523,12 +524,19 @@
// x is y ? new Either.tx(x) : (...)
var hasIncompleteCondition = false;
var unclosedParens = 0;
+
+ if (allowsNull) {
+ buffer.write('$valueCode == null ? null : (');
+ hasIncompleteCondition = true;
+ unclosedParens++;
+ }
+
for (var i = 0; i < union.types.length; i++) {
final type = union.types[i];
- final isDynamic = type.dartType == 'dynamic';
+ final isAny = isAnyType(type);
// Dynamic matches all type checks, so only emit it if required.
- if (!isDynamic) {
+ if (!isAny) {
_writeTypeCheckCondition(
buffer, null, valueCode, type, 'nullLspJsonReporter');
buffer.write(' ? ');
@@ -537,13 +545,13 @@
// The code to construct a value with this "side" of the union.
buffer.write('${union.dartTypeWithTypeArgs}.t${i + 1}(');
_writeFromJsonCode(buffer, type, valueCode,
- allowsNull: allowsNull,
+ allowsNull: false, // null is already handled above this loop
requiresBracesInInterpolation:
requiresBracesInInterpolation); // Call recursively!
buffer.write(')');
// If we output the type condition at the top, prepare for the next condition.
- if (!isDynamic) {
+ if (!isAny) {
buffer.write(' : (');
hasIncompleteCondition = true;
unclosedParens++;
@@ -554,10 +562,6 @@
// Fill the final parens with a throw because if we fell through all of the
// cases then the value we had didn't match any of the types in the union.
if (hasIncompleteCondition) {
- if (allowsNull) {
- buffer.write('$valueCode == null ? null : (');
- unclosedParens++;
- }
var interpolation =
requiresBracesInInterpolation ? '\${$valueCode}' : '\$$valueCode';
buffer.write(
@@ -676,13 +680,10 @@
..writeIndentedln('if (${field.name} != null) {')
..indent();
}
- // Suppress the ? operator if we've output a null check already.
- final nullOp = shouldBeOmittedIfNoValue ? '' : '?';
+ // Use the correct null operator depending on whether the value could be null.
+ final nullOp = field.allowsNull || field.allowsUndefined ? '?' : '';
buffer.writeIndented('''$mapName['${field.name}'] = ''');
_writeToJsonCode(buffer, field.type, field.name, nullOp);
- if (!field.allowsUndefined && !field.allowsNull) {
- buffer.write(''' ?? (throw '${field.name} is required but was not set')''');
- }
buffer.writeln(';');
if (shouldBeOmittedIfNoValue) {
buffer
@@ -712,7 +713,7 @@
} else if (type is ArrayType && _isSpecType(type.elementType)) {
buffer.write('$valueCode$nullOp.map((item) => ');
_writeToJsonCode(buffer, type.elementType, 'item', '');
- buffer.write(')$nullOp.toList()');
+ buffer.write(').toList()');
} else {
buffer.write(valueCode);
}
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index 24084c8..e6bd416 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
import 'dart:io';
import 'package:analysis_server/src/utilities/strings.dart';
@@ -93,7 +91,7 @@
licenseResp.body,
specResp.body
];
- return File(localSpecPath).writeAsString(text.join('\n\n---\n\n'));
+ await File(localSpecPath).writeAsString(text.join('\n\n---\n\n'));
}
Namespace extractMethodsEnum(String spec) {
@@ -136,7 +134,8 @@
final parsed = parseString(typeAlias);
// Extract the InlineInterface that was created.
- InlineInterface interface = parsed.firstWhere((t) => t is InlineInterface);
+ final interface =
+ parsed.firstWhere((t) => t is InlineInterface) as InlineInterface;
// Create a new name based on the fields.
var newName = interface.members.map((m) => capitalize(m.name)).join('And');
@@ -146,7 +145,7 @@
return _resultsInlineTypesPattern
.allMatches(spec)
- .map((m) => m.group(1).trim())
+ .map((m) => m.group(1)!.trim())
.toList()
.map(toInterface)
.toList();
@@ -157,8 +156,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
// This file has been automatically generated. Please do not edit it manually.
// To regenerate the file, use the script
// "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
@@ -174,14 +171,13 @@
import 'package:analysis_server/src/lsp/json_parsing.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart';
import 'package:analyzer/src/generated/utilities_general.dart';
-import 'package:meta/meta.dart';
const jsonEncoder = JsonEncoder.withIndent(' ');
''';
List<AstNode> getCustomClasses() {
- Interface interface(String name, List<Member> fields, {String baseType}) {
+ Interface interface(String name, List<Member> fields, {String? baseType}) {
return Interface(
null,
Token.identifier(name),
@@ -191,8 +187,13 @@
);
}
- Field field(String name,
- {String type, array = false, canBeNull = false, canBeUndefined = false}) {
+ Field field(
+ String name, {
+ required String type,
+ array = false,
+ canBeNull = false,
+ canBeUndefined = false,
+ }) {
var fieldType =
array ? ArrayType(Type.identifier(type)) : Type.identifier(type);
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript.dart b/pkg/analysis_server/tool/lsp_spec/typescript.dart
index 268b1f8..5ebb88d 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript.dart
@@ -118,6 +118,9 @@
'ParameterInformation': {
'label': 'String',
},
+ 'ProgressParams': {
+ 'value': 'object',
+ },
'ServerCapabilities': {
'changeNotifications': 'bool',
},
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index ef61719..0134b77 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -848,7 +848,6 @@
StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
StaticWarningCode.UNNECESSARY_NON_NULL_ASSERTION,
- StrongModeCode.TOP_LEVEL_FUNCTION_LITERAL_BLOCK,
StrongModeCode.TOP_LEVEL_IDENTIFIER_NO_TYPE,
StrongModeCode.TOP_LEVEL_INSTANCE_GETTER,
TodoCode.TODO,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 8f17b48..35f7890 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -621,22 +621,25 @@
/// Throw [ArgumentError] if the [uri] corresponds to a part.
Future<LibraryElement> getLibraryByUri(String uri) async {
var uriObj = Uri.parse(uri);
- var file = _fsState.getFileForUri(uriObj);
+ var fileOr = _fsState.getFileForUri(uriObj);
+ return fileOr.map(
+ (file) async {
+ if (file == null) {
+ throw ArgumentError('$uri cannot be resolved to a file.');
+ }
- if (file == null) {
- throw ArgumentError('$uri cannot be resolved to a file.');
- }
+ if (file.isPart) {
+ throw ArgumentError('$uri is not a library.');
+ }
- if (file.isExternalLibrary) {
- return _createLibraryContext(file).getLibraryElement(file);
- }
-
- if (file.isPart) {
- throw ArgumentError('$uri is not a library.');
- }
-
- UnitElementResult unitResult = await getUnitElement(file.path!);
- return unitResult.element.library;
+ var unitResult = await getUnitElement(file.path!);
+ return unitResult.element.library;
+ },
+ (externalLibrary) async {
+ var libraryContext = _createLibraryContext(null);
+ return libraryContext.getLibraryElement(externalLibrary.uri);
+ },
+ );
}
/// Return a [ParsedLibraryResult] for the library with the given [path].
@@ -673,22 +676,21 @@
/// Throw [ArgumentError] if the given [uri] is not the defining compilation
/// unit for a library (that is, is a part of a library).
ParsedLibraryResult getParsedLibraryByUri(Uri uri) {
- var file = _fsState.getFileForUri(uri);
-
- if (file == null) {
- throw ArgumentError('URI cannot be resolved: $uri');
- }
-
- if (file.isExternalLibrary) {
- return ParsedLibraryResultImpl.external(currentSession, file.uri);
- }
-
- if (file.isPart) {
- throw ArgumentError('Is a part: $uri');
- }
-
- // The file is a local file, we can get the result.
- return getParsedLibrary(file.path!);
+ var fileOr = _fsState.getFileForUri(uri);
+ return fileOr.map(
+ (file) {
+ if (file == null) {
+ throw ArgumentError('URI cannot be resolved: $uri');
+ }
+ if (file.isPart) {
+ throw ArgumentError('Is a part: $uri');
+ }
+ return getParsedLibrary(file.path!);
+ },
+ (externalLibrary) {
+ return ParsedLibraryResultImpl.external(currentSession, uri);
+ },
+ );
}
/// Return a [Future] that completes with a [ResolvedLibraryResult] for the
@@ -748,24 +750,21 @@
/// [changeFile]), prior to the next time the analysis state transitions
/// to "idle".
Future<ResolvedLibraryResult> getResolvedLibraryByUri(Uri uri) {
- var file = _fsState.getFileForUri(uri);
-
- if (file == null) {
- throw ArgumentError('URI cannot be resolved: $uri');
- }
-
- if (file.isExternalLibrary) {
- return Future.value(
- ResolvedLibraryResultImpl.external(currentSession, file.uri),
- );
- }
-
- if (file.isPart) {
- throw ArgumentError('Is a part: $uri');
- }
-
- // The file is a local file, we can get the result.
- return getResolvedLibrary(file.path!);
+ var fileOr = _fsState.getFileForUri(uri);
+ return fileOr.map(
+ (file) {
+ if (file == null) {
+ throw ArgumentError('URI cannot be resolved: $uri');
+ }
+ if (file.isPart) {
+ throw ArgumentError('Is a part: $uri');
+ }
+ return getResolvedLibrary(file.path!);
+ },
+ (externalLibrary) async {
+ return ResolvedLibraryResultImpl.external(currentSession, uri);
+ },
+ );
}
ApiSignature getResolvedUnitKeyByPath(String path) {
@@ -891,8 +890,11 @@
/// without a package name. In these cases we cannot prove that the file is
/// not a part, so it must be a library.
bool isLibraryByUri(Uri uri) {
- var file = _fsState.getFileForUri(uri);
- return file == null || !file.isPart;
+ var fileOr = _fsState.getFileForUri(uri);
+ return fileOr.map(
+ (file) => file == null || !file.isPart,
+ (uri) => false,
+ );
}
/// Return a [Future] that completes with a [ParsedUnitResult] for the file
@@ -1288,15 +1290,11 @@
try {
_testView.numOfAnalyzedLibraries++;
- var dartCoreUri = Uri.parse('dart:core');
- var dartCoreFile = _fsState.getFileForUri(dartCoreUri);
- if (dartCoreFile == null || !dartCoreFile.exists) {
+ if (!_hasLibraryByUri('dart:core')) {
return _newMissingDartLibraryResult(file, 'dart:core');
}
- var dartAsyncUri = Uri.parse('dart:async');
- var dartAsyncFile = _fsState.getFileForUri(dartAsyncUri);
- if (dartAsyncFile == null || !dartAsyncFile.exists) {
+ if (!_hasLibraryByUri('dart:async')) {
return _newMissingDartLibraryResult(file, 'dart:async');
}
@@ -1515,30 +1513,33 @@
}
/// Return the context in which the [library] should be analyzed.
- LibraryContext _createLibraryContext(FileState library) {
- if (_libraryContext != null) {
- if (_libraryContext!.pack()) {
- clearLibraryContext();
+ LibraryContext _createLibraryContext(FileState? library) {
+ {
+ var libraryContext = _libraryContext;
+ if (libraryContext != null) {
+ if (libraryContext.pack()) {
+ clearLibraryContext();
+ }
}
}
- if (_libraryContext == null) {
- _libraryContext = LibraryContext(
- testView: _testView.libraryContext,
- session: currentSession,
- logger: _logger,
- byteStore: _byteStore,
- analysisOptions: _analysisOptions,
- declaredVariables: declaredVariables,
- sourceFactory: _sourceFactory,
- externalSummaries: _externalSummaries,
- targetLibrary: library,
- );
- } else {
- _libraryContext!.load2(library);
+ var libraryContext = _libraryContext;
+ libraryContext ??= _libraryContext = LibraryContext(
+ testView: _testView.libraryContext,
+ session: currentSession,
+ logger: _logger,
+ byteStore: _byteStore,
+ analysisOptions: _analysisOptions,
+ declaredVariables: declaredVariables,
+ sourceFactory: _sourceFactory,
+ externalSummaries: _externalSummaries,
+ );
+
+ if (library != null) {
+ libraryContext.load2(library);
}
- return _libraryContext!;
+ return libraryContext;
}
/// Create a new analysis session, so invalidating the current one.
@@ -1649,6 +1650,15 @@
return signature.toHex();
}
+ bool _hasLibraryByUri(String uriStr) {
+ var uri = Uri.parse(uriStr);
+ var fileOr = _fsState.getFileForUri(uri);
+ return fileOr.map(
+ (file) => file != null && file.exists,
+ (_) => true,
+ );
+ }
+
/// We detected that one of the required `dart` libraries is missing.
/// Return the empty analysis result with the error.
AnalysisResult _newMissingDartLibraryResult(
@@ -2034,12 +2044,6 @@
Map<String, ResolvedUnitResult> get priorityResults {
return driver._priorityResults;
}
-
- SummaryDataStore getSummaryStore(String libraryPath) {
- FileState library = driver.fsState.getFileForPath(libraryPath);
- LibraryContext libraryContext = driver._createLibraryContext(library);
- return libraryContext.store;
- }
}
/// The result of analyzing of a single file.
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index fcf5423..fbb35e3 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -35,6 +35,7 @@
import 'package:analyzer/src/summary/idl.dart';
import 'package:analyzer/src/summary/package_bundle_reader.dart';
import 'package:analyzer/src/summary2/bundle_writer.dart';
+import 'package:analyzer/src/util/either.dart';
import 'package:analyzer/src/workspace/workspace.dart';
import 'package:collection/collection.dart';
import 'package:convert/convert.dart';
@@ -48,6 +49,13 @@
int fileObjectId = 0;
var timerFileStateRefresh = Stopwatch();
+/// A library from [SummaryDataStore].
+class ExternalLibrary {
+ final Uri uri;
+
+ ExternalLibrary(this.uri);
+}
+
/// [FileContentOverlay] is used to temporary override content of files.
class FileContentOverlay {
final _map = <String, String>{};
@@ -97,12 +105,6 @@
/// It might be `null` if the file is outside of the workspace.
final WorkspacePackage? workspacePackage;
- /// Return `true` if this file is a stub created for a file in the provided
- /// external summary store. The values of most properties are not the same
- /// as they would be if the file were actually read from the file system.
- /// The value of the property [uri] is correct.
- final bool isInExternalSummaries;
-
/// The [FeatureSet] for all files in the analysis context.
///
/// Usually it is the feature set of the latest language version, plus
@@ -158,19 +160,7 @@
this.workspacePackage,
this._contextFeatureSet,
this.packageLanguageVersion,
- ) : isInExternalSummaries = false;
-
- FileState._external(this._fsState, this.uri)
- : isInExternalSummaries = true,
- path = null,
- source = null,
- workspacePackage = null,
- _exists = true,
- _contextFeatureSet = null,
- packageLanguageVersion = null {
- _apiSignature = Uint8List(16);
- _libraryCycle = LibraryCycle.external();
- }
+ );
/// The unlinked API signature of the file.
List<int> get apiSignature => _apiSignature!;
@@ -221,8 +211,12 @@
_exportedFiles = <FileState?>[];
for (var directive in _unlinked2!.exports) {
var uri = _selectRelativeUri(directive);
- var file = _fileForRelativeUri(uri);
- _exportedFiles!.add(file);
+ _fileForRelativeUri(uri).map(
+ (file) {
+ _exportedFiles!.add(file);
+ },
+ (_) {},
+ );
}
}
return _exportedFiles!;
@@ -237,8 +231,12 @@
_importedFiles = <FileState?>[];
for (var directive in _unlinked2!.imports) {
var uri = _selectRelativeUri(directive);
- var file = _fileForRelativeUri(uri);
- _importedFiles!.add(file);
+ _fileForRelativeUri(uri).map(
+ (file) {
+ _importedFiles!.add(file);
+ },
+ (_) {},
+ );
}
}
return _importedFiles!;
@@ -310,13 +308,17 @@
if (_partedFiles == null) {
_partedFiles = <FileState?>[];
for (var uri in _unlinked2!.parts) {
- var file = _fileForRelativeUri(uri);
- _partedFiles!.add(file);
- if (file != null) {
- _fsState._partToLibraries
- .putIfAbsent(file, () => <FileState>[])
- .add(this);
- }
+ _fileForRelativeUri(uri).map(
+ (file) {
+ _partedFiles!.add(file);
+ if (file != null) {
+ _fsState._partToLibraries
+ .putIfAbsent(file, () => <FileState>[])
+ .add(this);
+ }
+ },
+ (_) {},
+ );
}
}
return _partedFiles!;
@@ -547,16 +549,18 @@
/// Return the [FileState] for the given [relativeUri], or `null` if the
/// URI cannot be parsed, cannot correspond any file, etc.
- FileState? _fileForRelativeUri(String relativeUri) {
+ Either2<FileState?, ExternalLibrary> _fileForRelativeUri(
+ String relativeUri,
+ ) {
if (relativeUri.isEmpty) {
- return null;
+ return Either2.t1(null);
}
Uri absoluteUri;
try {
absoluteUri = resolveRelativeUri(uri, Uri.parse(relativeUri));
} on FormatException {
- return null;
+ return Either2.t1(null);
}
return _fsState.getFileForUri(absoluteUri);
@@ -894,30 +898,34 @@
return file;
}
- /// Return the [FileState] for the given absolute [uri]. May return the
- /// "unresolved" file if the [uri] is invalid, e.g. a `package:` URI without
- /// a package name. The returned file has the last known state since if was
- /// last refreshed.
- FileState? getFileForUri(Uri uri) {
+ /// The given [uri] must be absolute.
+ ///
+ /// If [uri] corresponds to a library from the summary store, return a
+ /// [ExternalLibrary].
+ ///
+ /// Otherwise the [uri] is resolved to a file, and the corresponding
+ /// [FileState] is returned. Might be `null` if the [uri] cannot be resolved
+ /// to a file, for example because it is invalid (e.g. a `package:` URI
+ /// without a package name), or we don't know this package. The returned
+ /// file has the last known state since if was last refreshed.
+ Either2<FileState?, ExternalLibrary> getFileForUri(Uri uri) {
+ // If the external store has this URI, create a stub file for it.
+ // We are given all required unlinked and linked summaries for it.
+ if (externalSummaries != null) {
+ String uriStr = uri.toString();
+ if (externalSummaries!.hasLinkedLibrary(uriStr)) {
+ return Either2.t2(ExternalLibrary(uri));
+ }
+ }
+
FileState? file = _uriToFile[uri];
if (file == null) {
- // If the external store has this URI, create a stub file for it.
- // We are given all required unlinked and linked summaries for it.
- if (externalSummaries != null) {
- String uriStr = uri.toString();
- if (externalSummaries!.hasLinkedLibrary(uriStr)) {
- file = FileState._external(this, uri);
- _uriToFile[uri] = file;
- return file;
- }
- }
-
Source? uriSource = _sourceFactory.resolveUri(null, uri.toString());
// If the URI cannot be resolved, for example because the factory
// does not understand the scheme, return the unresolved file instance.
if (uriSource == null) {
- return null;
+ return Either2.t1(null);
}
String path = uriSource.fullName;
@@ -933,7 +941,7 @@
_addFileWithPath(path, file);
file.refresh(allowCached: true);
}
- return file;
+ return Either2.t1(file);
}
/// Return the list of all [FileState]s corresponding to the given [path]. The
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
index d6caee6..f973d53 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
@@ -185,11 +185,6 @@
return _logger.run('Verify API signature of $path', () {
_logger.writeln('Work in ${_fsState.contextName}');
- var file = _fsState.getFileForPath(path);
- if (file.isInExternalSummaries) {
- return file;
- }
-
bool anyApiChanged = false;
List<FileState> files = _fsState.getFilesForPath(path);
for (FileState file in files) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 137eec9..1b7434b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -45,6 +45,7 @@
import 'package:analyzer/src/lint/linter.dart';
import 'package:analyzer/src/lint/linter_visitor.dart';
import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
import 'package:analyzer/src/task/strong/checker.dart';
import 'package:pub_semver/pub_semver.dart';
@@ -507,6 +508,9 @@
}
bool _isExistingSource(Source source) {
+ if (source is InSummarySource) {
+ return true;
+ }
for (var file in _library.directReferencedFiles) {
if (file.uri == source.uri) {
return file.exists;
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index d13ec6e..94a44cf 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -63,7 +63,6 @@
required DeclaredVariables declaredVariables,
required SourceFactory sourceFactory,
required this.externalSummaries,
- required FileState targetLibrary,
}) : logger = logger,
byteStore = byteStore,
analysisSession = session {
@@ -72,7 +71,6 @@
analysisContext = AnalysisContextImpl(synchronousSession, sourceFactory);
_createElementFactory();
- load2(targetLibrary);
}
/// Computes a [CompilationUnitElement] for the given library/unit pair.
@@ -86,8 +84,9 @@
}
/// Get the [LibraryElement] for the given library.
- LibraryElement getLibraryElement(FileState library) {
- return elementFactory.libraryOfUri2(library.uriStr);
+ LibraryElement getLibraryElement(Uri uri) {
+ _createElementFactoryTypeProvider();
+ return elementFactory.libraryOfUri2('$uri');
}
/// Return `true` if the given [uri] is known to be a library.
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index bf643c4..9900a5e 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -14200,13 +14200,6 @@
/* TODO(leafp) Delete most of these.
*/
- static const StrongModeCode TOP_LEVEL_FUNCTION_LITERAL_BLOCK = StrongModeCode(
- ErrorType.HINT,
- 'TOP_LEVEL_FUNCTION_LITERAL_BLOCK',
- "The type of the function literal can't be inferred because the "
- "literal has a block as its body.",
- correction: "Try adding an explicit type to the variable.");
-
static const StrongModeCode TOP_LEVEL_IDENTIFIER_NO_TYPE = StrongModeCode(
ErrorType.HINT,
'TOP_LEVEL_IDENTIFIER_NO_TYPE',
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index ee2b7f3..bd2547c 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -1064,17 +1064,6 @@
}
@override
- visitFunctionExpression(FunctionExpression node) {
- var body = node.body;
- if (body is ExpressionFunctionBody) {
- body.expression.accept(this);
- } else {
- _codeChecker._recordMessage(
- node, StrongModeCode.TOP_LEVEL_FUNCTION_LITERAL_BLOCK, []);
- }
- }
-
- @override
visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
if (node.typeArguments != null) {
return;
diff --git a/pkg/analyzer/lib/src/util/either.dart b/pkg/analyzer/lib/src/util/either.dart
index 9ff9bc4..6835936 100644
--- a/pkg/analyzer/lib/src/util/either.dart
+++ b/pkg/analyzer/lib/src/util/either.dart
@@ -3,23 +3,23 @@
// BSD-style license that can be found in the LICENSE file.
/// A container that is either [T1] or [T2].
-class Either2<T1 extends Object, T2 extends Object> {
- final T1? _t1;
- final T2? _t2;
+class Either2<T1, T2> {
+ final int _which;
+ final Object? _value;
Either2.t1(T1 t1)
- : _t1 = t1,
- _t2 = null;
+ : _which = 1,
+ _value = t1;
Either2.t2(T2 t2)
- : _t1 = null,
- _t2 = t2;
+ : _which = 2,
+ _value = t2;
T map<T>(T Function(T1) f1, T Function(T2) f2) {
- if (_t1 != null) {
- return f1(_t1!);
+ if (_which == 1) {
+ return f1(_value as T1);
} else {
- return f2(_t2!);
+ return f2(_value as T2);
}
}
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 024c895..6e417e6 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -21,6 +21,7 @@
import 'package:analyzer/src/source/package_map_resolver.dart';
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/util/either.dart';
import 'package:analyzer/src/workspace/basic.dart';
import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart';
@@ -346,8 +347,14 @@
test_getFileForUri_invalidUri() {
var uri = Uri.parse('package:x');
- var file = fileSystemState.getFileForUri(uri);
- expect(file, isNull);
+ fileSystemState.getFileForUri(uri).map(
+ (file) {
+ expect(file, isNull);
+ },
+ (_) {
+ fail('Expected null.');
+ },
+ );
}
test_getFileForUri_packageVsFileUri() {
@@ -356,8 +363,8 @@
var fileUri = toUri(path);
// The files with `package:` and `file:` URIs are different.
- FileState filePackageUri = fileSystemState.getFileForUri(packageUri)!;
- FileState fileFileUri = fileSystemState.getFileForUri(fileUri)!;
+ var filePackageUri = fileSystemState.getFileForUri(packageUri).asFileState;
+ var fileFileUri = fileSystemState.getFileForUri(fileUri).asFileState;
expect(filePackageUri, isNot(same(fileFileUri)));
expect(filePackageUri.path, path);
@@ -739,3 +746,12 @@
throw StateError('Unexpected invocation of ${invocation.memberName}');
}
}
+
+extension on Either2<FileState?, ExternalLibrary> {
+ FileState get asFileState {
+ return map(
+ (file) => file!,
+ (_) => fail('Expected a file'),
+ );
+ }
+}
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index 212b95b..25b90f1 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -122,11 +122,13 @@
}
test_initializer_functionLiteral_blockBody() async {
- await assertErrorsInCode('''
+ await assertNoErrorsInCode('''
var t = (int p) {};
-''', [
- error(StrongModeCode.TOP_LEVEL_FUNCTION_LITERAL_BLOCK, 8, 10),
- ]);
+''');
+ assertType(
+ findElement.topVar('t').type,
+ 'Null Function(int)',
+ );
}
test_initializer_functionLiteral_expressionBody() async {
@@ -134,12 +136,20 @@
var a = 0;
var t = (int p) => (a = 1);
''');
+ assertType(
+ findElement.topVar('t').type,
+ 'int Function(int)',
+ );
}
test_initializer_functionLiteral_parameters_withoutType() async {
await assertNoErrorsInCode('''
var t = (int a, b,int c, d) => 0;
''');
+ assertType(
+ findElement.topVar('t').type,
+ 'int Function(int, dynamic, int, dynamic)',
+ );
}
test_initializer_hasTypeAnnotation() async {
diff --git a/pkg/analyzer/test/src/util/either_test.dart b/pkg/analyzer/test/src/util/either_test.dart
index 52f4799..bd6c634 100644
--- a/pkg/analyzer/test/src/util/either_test.dart
+++ b/pkg/analyzer/test/src/util/either_test.dart
@@ -23,4 +23,14 @@
var either = Either2<int, String>.t2('hello');
expect(either.map((_) => throw 'unexpected', (x) => x.length), 5);
}
+
+ void test_toString_t1() {
+ var either = Either2<int, String>.t1(42);
+ expect(either.toString(), '42');
+ }
+
+ void test_toString_t2() {
+ var either = Either2<int, String>.t2('hello');
+ expect(either.toString(), 'hello');
+ }
}
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index fcc224f..eed8576 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -18,6 +18,8 @@
import '../js/js.dart' as js;
import '../js_backend/backend.dart';
import '../js_backend/namer.dart';
+import '../js_backend/deferred_holder_expression.dart'
+ show DeferredHolderExpression;
import '../js_backend/string_reference.dart' show StringReference;
import '../js_backend/type_reference.dart' show TypeReference;
import '../js_emitter/code_emitter_task.dart' show Emitter;
@@ -592,26 +594,6 @@
}
for (ModularExpression expression in modularExpressions) {
switch (expression.kind) {
- case ModularExpressionKind.globalObjectForLibrary:
- expression.value = namer
- .readGlobalObjectForLibrary(expression.data)
- .withSourceInformation(expression.sourceInformation);
- break;
- case ModularExpressionKind.globalObjectForClass:
- expression.value = namer
- .readGlobalObjectForClass(expression.data)
- .withSourceInformation(expression.sourceInformation);
- break;
- case ModularExpressionKind.globalObjectForType:
- expression.value = namer
- .readGlobalObjectForType(expression.data)
- .withSourceInformation(expression.sourceInformation);
- break;
- case ModularExpressionKind.globalObjectForMember:
- expression.value = namer
- .readGlobalObjectForMember(expression.data)
- .withSourceInformation(expression.sourceInformation);
- break;
case ModularExpressionKind.constant:
expression.value = emitter
.constantReference(expression.data)
@@ -830,10 +812,6 @@
}
enum ModularExpressionKind {
- globalObjectForLibrary,
- globalObjectForClass,
- globalObjectForType,
- globalObjectForMember,
constant,
embeddedGlobalAccess,
}
@@ -853,18 +831,6 @@
ModularExpressionKind kind = source.readEnum(ModularExpressionKind.values);
Object data;
switch (kind) {
- case ModularExpressionKind.globalObjectForLibrary:
- data = source.readLibrary();
- break;
- case ModularExpressionKind.globalObjectForClass:
- data = source.readClass();
- break;
- case ModularExpressionKind.globalObjectForType:
- data = source.readClass();
- break;
- case ModularExpressionKind.globalObjectForMember:
- data = source.readMember();
- break;
case ModularExpressionKind.constant:
data = source.readConstant();
break;
@@ -880,18 +846,6 @@
sink.begin(tag);
sink.writeEnum(kind);
switch (kind) {
- case ModularExpressionKind.globalObjectForLibrary:
- sink.writeLibrary(data);
- break;
- case ModularExpressionKind.globalObjectForClass:
- sink.writeClass(data);
- break;
- case ModularExpressionKind.globalObjectForType:
- sink.writeClass(data);
- break;
- case ModularExpressionKind.globalObjectForMember:
- sink.writeMember(data);
- break;
case ModularExpressionKind.constant:
sink.writeConstant(data);
break;
@@ -1009,6 +963,7 @@
program,
stringReference,
typeReference,
+ deferredHolderExpression,
}
/// Tags used for debugging serialization/deserialization boundary mismatches.
@@ -1073,6 +1028,7 @@
static const String program = 'js-program';
static const String stringReference = 'js-stringReference';
static const String typeReference = 'js-typeReference';
+ static const String deferredHolderExpression = 'js-deferredHolderExpression';
}
/// Visitor that serializes a [js.Node] into a [DataSink].
@@ -1321,6 +1277,12 @@
node.writeToDataSink(sink);
sink.end(JsNodeTags.stringReference);
_writeInfo(node);
+ } else if (node is DeferredHolderExpression) {
+ sink.writeEnum(JsNodeKind.deferredHolderExpression);
+ sink.begin(JsNodeTags.deferredHolderExpression);
+ node.writeToDataSink(sink);
+ sink.end(JsNodeTags.deferredHolderExpression);
+ _writeInfo(node);
} else {
throw new UnsupportedError(
'Unexpected deferred expression: ${node.runtimeType}.');
@@ -2119,6 +2081,11 @@
node = TypeReference.readFromDataSource(source);
source.end(JsNodeTags.typeReference);
break;
+ case JsNodeKind.deferredHolderExpression:
+ source.begin(JsNodeTags.deferredHolderExpression);
+ node = DeferredHolderExpression.readFromDataSource(source);
+ source.end(JsNodeTags.deferredHolderExpression);
+ break;
}
SourceInformation sourceInformation =
source.readCached<SourceInformation>(() {
diff --git a/pkg/compiler/lib/src/js/size_estimator.dart b/pkg/compiler/lib/src/js/size_estimator.dart
index 257fa70..e8ec19f 100644
--- a/pkg/compiler/lib/src/js/size_estimator.dart
+++ b/pkg/compiler/lib/src/js/size_estimator.dart
@@ -8,6 +8,7 @@
import 'package:js_ast/src/characters.dart' as charCodes;
import 'package:js_ast/src/precedence.dart';
+import '../js_backend/deferred_holder_expression.dart';
import '../js_backend/string_reference.dart';
import '../js_backend/type_reference.dart';
import '../js_emitter/metadata_collector.dart';
@@ -63,6 +64,9 @@
// Worst case we have to inline the string so size of string + 2 bytes for
// quotes.
return "'${node.constant.toDartString()}'";
+ } else if (node is DeferredHolderExpression) {
+ // 1 byte holder + dot + nameSizeEstimate
+ return '#.$nameSizeEstimate';
} else {
throw UnsupportedError('$node type is not supported');
}
diff --git a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
new file mode 100644
index 0000000..602ff08
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
@@ -0,0 +1,220 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:js_ast/src/precedence.dart' as js show PRIMARY;
+
+import '../elements/entities.dart';
+import '../js/js.dart' as js;
+import '../serialization/serialization.dart';
+import '../util/util.dart';
+
+import 'namer.dart';
+
+// TODO(joshualitt): Figure out how to subsume more of the modular naming
+// framework into this approach. For example, we are still creating ModularNames
+// for the entity referenced in the DeferredHolderExpression.
+enum DeferredHolderExpressionKind {
+ globalObjectForLibrary,
+ globalObjectForClass,
+ globalObjectForType,
+ globalObjectForMember,
+}
+
+class DeferredHolderExpression extends js.DeferredExpression
+ implements js.AstContainer {
+ static const String tag = 'deferred-holder-expression';
+
+ final DeferredHolderExpressionKind kind;
+ final Entity entity;
+ js.Expression _value;
+
+ @override
+ final js.JavaScriptNodeSourceInformation sourceInformation;
+
+ DeferredHolderExpression(this.kind, this.entity) : sourceInformation = null;
+ DeferredHolderExpression._(
+ this.kind, this.entity, this._value, this.sourceInformation);
+
+ factory DeferredHolderExpression.readFromDataSource(DataSource source) {
+ source.begin(tag);
+ var kind = source.readEnum(DeferredHolderExpressionKind.values);
+ Entity entity;
+ switch (kind) {
+ case DeferredHolderExpressionKind.globalObjectForLibrary:
+ entity = source.readLibrary();
+ break;
+ case DeferredHolderExpressionKind.globalObjectForClass:
+ entity = source.readClass();
+ break;
+ case DeferredHolderExpressionKind.globalObjectForType:
+ entity = source.readClass();
+ break;
+ case DeferredHolderExpressionKind.globalObjectForMember:
+ entity = source.readMember();
+ break;
+ }
+ source.end(tag);
+ return DeferredHolderExpression(kind, entity);
+ }
+
+ void writeToDataSink(DataSink sink) {
+ sink.begin(tag);
+ sink.writeEnum(kind);
+ switch (kind) {
+ case DeferredHolderExpressionKind.globalObjectForLibrary:
+ sink.writeLibrary(entity);
+ break;
+ case DeferredHolderExpressionKind.globalObjectForClass:
+ sink.writeClass(entity);
+ break;
+ case DeferredHolderExpressionKind.globalObjectForType:
+ sink.writeClass(entity);
+ break;
+ case DeferredHolderExpressionKind.globalObjectForMember:
+ sink.writeMember(entity);
+ break;
+ }
+ sink.end(tag);
+ }
+
+ set value(js.Expression value) {
+ assert(!isFinalized && value != null);
+ _value = value;
+ }
+
+ @override
+ js.Expression get value {
+ assert(isFinalized, '$this is unassigned');
+ return _value;
+ }
+
+ @override
+ bool get isFinalized => _value != null;
+
+ @override
+ DeferredHolderExpression withSourceInformation(
+ js.JavaScriptNodeSourceInformation newSourceInformation) {
+ if (newSourceInformation == sourceInformation) return this;
+ if (newSourceInformation == null) return this;
+ return DeferredHolderExpression._(
+ kind, entity, _value, newSourceInformation);
+ }
+
+ @override
+ int get precedenceLevel => _value?.precedenceLevel ?? js.PRIMARY;
+
+ @override
+ int get hashCode {
+ return Hashing.objectsHash(kind, entity);
+ }
+
+ @override
+ bool operator ==(Object other) {
+ if (identical(this, other)) return true;
+ return other is DeferredHolderExpression &&
+ kind == other.kind &&
+ entity == other.entity;
+ }
+
+ @override
+ String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.write('DeferredHolderExpression(kind=$kind,entity=$entity,');
+ sb.write('value=$_value)');
+ return sb.toString();
+ }
+
+ @override
+ Iterable<js.Node> get containedNodes => isFinalized ? [_value] : const [];
+}
+
+abstract class DeferredHolderExpressionFinalizer {
+ /// Collects DeferredHolderExpressions from the JavaScript
+ /// AST [code];
+ void addCode(js.Node code);
+
+ /// Performs analysis on all collected DeferredHolderExpression nodes
+ /// finalizes the values to expressions to access the holders.
+ void finalize();
+}
+
+class DeferredHolderExpressionFinalizerImpl
+ implements DeferredHolderExpressionFinalizer {
+ _DeferredHolderExpressionCollectorVisitor _visitor;
+ final List<DeferredHolderExpression> holderReferences = [];
+ final Namer _namer;
+
+ DeferredHolderExpressionFinalizerImpl(this._namer) {
+ _visitor = _DeferredHolderExpressionCollectorVisitor(this);
+ }
+
+ @override
+ void addCode(js.Node code) {
+ code.accept(_visitor);
+ }
+
+ @override
+ void finalize() {
+ for (var reference in holderReferences) {
+ if (reference.isFinalized) continue;
+ switch (reference.kind) {
+ case DeferredHolderExpressionKind.globalObjectForLibrary:
+ reference.value = _namer
+ .readGlobalObjectForLibrary(reference.entity)
+ .withSourceInformation(reference.sourceInformation);
+ break;
+ case DeferredHolderExpressionKind.globalObjectForClass:
+ reference.value = _namer
+ .readGlobalObjectForClass(reference.entity)
+ .withSourceInformation(reference.sourceInformation);
+ break;
+ case DeferredHolderExpressionKind.globalObjectForType:
+ reference.value = _namer
+ .readGlobalObjectForType(reference.entity)
+ .withSourceInformation(reference.sourceInformation);
+ break;
+ case DeferredHolderExpressionKind.globalObjectForMember:
+ reference.value = _namer
+ .readGlobalObjectForMember(reference.entity)
+ .withSourceInformation(reference.sourceInformation);
+ break;
+ }
+ }
+ }
+
+ void _registerDeferredHolderExpression(DeferredHolderExpression node) {
+ holderReferences.add(node);
+ }
+}
+
+/// Scans a JavaScript AST to collect all the DeferredHolderExpression nodes.
+///
+/// The state is kept in the finalizer so that this scan could be extended to
+/// look for other deferred expressions in one pass.
+class _DeferredHolderExpressionCollectorVisitor extends js.BaseVisitor<void> {
+ final DeferredHolderExpressionFinalizerImpl _finalizer;
+
+ _DeferredHolderExpressionCollectorVisitor(this._finalizer);
+
+ @override
+ void visitNode(js.Node node) {
+ assert(node is! DeferredHolderExpression);
+ if (node is js.AstContainer) {
+ for (js.Node element in node.containedNodes) {
+ element.accept(this);
+ }
+ } else {
+ super.visitNode(node);
+ }
+ }
+
+ @override
+ void visitDeferredExpression(js.DeferredExpression node) {
+ if (node is DeferredHolderExpression) {
+ _finalizer._registerDeferredHolderExpression(node);
+ } else {
+ visitNode(node);
+ }
+ }
+}
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 559c51e..4b1e667 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -31,6 +31,7 @@
import '../universe/selector.dart' show Selector, SelectorKind;
import '../util/util.dart';
import '../world.dart' show JClosedWorld;
+import 'deferred_holder_expression.dart';
import 'native_data.dart';
part 'field_naming_mixin.dart';
@@ -2622,34 +2623,26 @@
@override
jsAst.Expression readGlobalObjectForLibrary(LibraryEntity library) {
- jsAst.Expression expression = new ModularExpression(
- ModularExpressionKind.globalObjectForLibrary, library);
- _registry.registerModularExpression(expression);
- return expression;
+ return DeferredHolderExpression(
+ DeferredHolderExpressionKind.globalObjectForLibrary, library);
}
@override
jsAst.Expression readGlobalObjectForClass(ClassEntity element) {
- jsAst.Expression expression = new ModularExpression(
- ModularExpressionKind.globalObjectForClass, element);
- _registry.registerModularExpression(expression);
- return expression;
+ return DeferredHolderExpression(
+ DeferredHolderExpressionKind.globalObjectForClass, element);
}
@override
jsAst.Expression readGlobalObjectForType(Entity element) {
- jsAst.Expression expression = new ModularExpression(
- ModularExpressionKind.globalObjectForType, element);
- _registry.registerModularExpression(expression);
- return expression;
+ return DeferredHolderExpression(
+ DeferredHolderExpressionKind.globalObjectForType, element);
}
@override
jsAst.Expression readGlobalObjectForMember(MemberEntity element) {
- jsAst.Expression expression = new ModularExpression(
- ModularExpressionKind.globalObjectForMember, element);
- _registry.registerModularExpression(expression);
- return expression;
+ return DeferredHolderExpression(
+ DeferredHolderExpressionKind.globalObjectForMember, element);
}
@override
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index ac5714b..c99d393 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -834,7 +834,7 @@
mainCode
]);
}
- finalizeStringAndTypeReferences(mainCode);
+ finalizeCode(mainCode);
return mainCode;
}
@@ -920,11 +920,11 @@
if (_options.experimentStartupFunctions) {
code = js.Parentheses(code);
}
- finalizeStringAndTypeReferences(code);
+ finalizeCode(code);
return code;
}
- void finalizeStringAndTypeReferences(js.Node code) {
+ void finalizeCode(js.Node code) {
StringReferenceFinalizer stringFinalizer =
StringReferenceFinalizerImpl(_options.enableMinification);
stringFinalizer.addCode(code);
@@ -933,6 +933,12 @@
_emitter, _commonElements, _recipeEncoder, _options.enableMinification);
finalizer.addCode(code);
finalizer.finalize();
+
+ // DeferredHolders need to be finalized last.
+ DeferredHolderExpressionFinalizer holderFinalizer =
+ DeferredHolderExpressionFinalizerImpl(_namer);
+ holderFinalizer.addCode(code);
+ holderFinalizer.finalize();
}
/// Emits all holders, except for the static-state holder.
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 2b23a2c..9a84f01 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -61,6 +61,10 @@
import '../../js_backend/runtime_types_new.dart'
show RecipeEncoder, RecipeEncoderImpl, Ruleset, RulesetEncoder;
import '../../js_backend/runtime_types_resolution.dart' show RuntimeTypesNeed;
+import '../../js_backend/deferred_holder_expression.dart'
+ show
+ DeferredHolderExpressionFinalizer,
+ DeferredHolderExpressionFinalizerImpl;
import '../../js_backend/type_reference.dart'
show
TypeReferenceFinalizer,
diff --git a/pkg/compiler/test/deferred_loading/data/lazy_types/main.dart b/pkg/compiler/test/deferred_loading/data/lazy_types/main.dart
index a5d40ab..fb34862 100644
--- a/pkg/compiler/test/deferred_loading/data/lazy_types/main.dart
+++ b/pkg/compiler/test/deferred_loading/data/lazy_types/main.dart
@@ -23,17 +23,17 @@
/*two-frag.library:
a_pre_fragments=[
- p1: {units: [1{libB}, 6{libA}], usedBy: [p2], needs: []},
- p2: {units: [5{libB, libC}, 4{libA, libC}, 2{libC}], usedBy: [p3], needs: [p1]},
- p3: {units: [3{libA, libB, libC}], usedBy: [], needs: [p2]}],
+ p1: {units: [6{libA}], usedBy: [p3], needs: []},
+ p2: {units: [1{libB}], usedBy: [p3], needs: []},
+ p3: {units: [3{libA, libB, libC}, 5{libB, libC}, 4{libA, libC}, 2{libC}], usedBy: [], needs: [p2, p1]}],
b_finalized_fragments=[
- f1: [1{libB}, 6{libA}],
- f2: [2{libC}],
- f3: [3{libA, libB, libC}]],
+ f1: [6{libA}],
+ f2: [1{libB}],
+ f3: [3{libA, libB, libC}, 2{libC}]],
c_steps=[
libA=(f3, f1),
- libB=(f3, f1),
- libC=(f3, f2)]
+ libB=(f3, f2),
+ libC=(f3)]
*/
/*three-frag.library:
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 495ae0c..795419a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -52,6 +52,7 @@
messageNonAgnosticConstant,
messageNotAConstantExpression,
noLength,
+ templateConstEvalBadState,
templateConstEvalCaseImplementsEqual,
templateConstEvalDeferredLibrary,
templateConstEvalDuplicateElement,
@@ -1006,8 +1007,16 @@
errorReporter.reportInvalidExpression(invalid);
return new UnevaluatedConstant(invalid);
} else if (result is _AbortDueToThrowConstant) {
- final Message message = templateConstEvalUnhandledException
- .withArguments(result.throwValue, isNonNullableByDefault);
+ final Object value = result.throwValue;
+ Message message;
+ if (value is Constant) {
+ message = templateConstEvalUnhandledException.withArguments(
+ value, isNonNullableByDefault);
+ } else if (value is StateError) {
+ message = templateConstEvalBadState.withArguments(value.message);
+ }
+ assert(message != null);
+
final Uri uri = getFileUri(result.node);
final int fileOffset = getFileOffset(uri, result.node);
final LocatedMessage locatedMessageActualError =
@@ -2478,6 +2487,42 @@
new PropertyGet(extract(receiver), node.name, node.interfaceTarget));
} else if (receiver is NullConstant) {
return createErrorConstant(node, messageConstEvalNullValue);
+ } else if (receiver is ListConstant && enableConstFunctions) {
+ switch (node.name.text) {
+ case 'first':
+ if (receiver.entries.isEmpty) {
+ return new _AbortDueToThrowConstant(
+ node, new StateError('No element'));
+ }
+ return receiver.entries.first;
+ case 'hashCode':
+ return new IntConstant(receiver.entries.hashCode);
+ case 'isEmpty':
+ return new BoolConstant(receiver.entries.isEmpty);
+ case 'isNotEmpty':
+ return new BoolConstant(receiver.entries.isNotEmpty);
+ // TODO(kallentu): case 'iterator'
+ case 'last':
+ if (receiver.entries.isEmpty) {
+ return new _AbortDueToThrowConstant(
+ node, new StateError('No element'));
+ }
+ return receiver.entries.last;
+ case 'length':
+ return new IntConstant(receiver.entries.length);
+ // TODO(kallentu): case 'reversed'
+ case 'runtimeType':
+ return new TypeLiteralConstant(receiver.typeArgument);
+ case 'single':
+ if (receiver.entries.isEmpty) {
+ return new _AbortDueToThrowConstant(
+ node, new StateError('No element'));
+ } else if (receiver.entries.length > 1) {
+ return new _AbortDueToThrowConstant(
+ node, new StateError('Too many elements'));
+ }
+ return receiver.entries.single;
+ }
}
return createErrorConstant(
node,
@@ -3582,17 +3627,33 @@
if (tryStatus is AbortStatus) {
final Constant error = tryStatus.error;
if (error is _AbortDueToThrowConstant) {
- final Constant throwConstant = error.throwValue;
+ final Object throwValue = error.throwValue;
final DartType defaultType =
exprEvaluator.typeEnvironment.coreTypes.objectNonNullableRawType;
+
+ DartType throwType;
+ if (throwValue is Constant) {
+ throwType = throwValue.getType(exprEvaluator._staticTypeContext);
+ } else if (throwValue is StateError) {
+ final Class stateErrorClass = exprEvaluator
+ .coreTypes.coreLibrary.classes
+ .firstWhere((Class klass) => klass.name == 'StateError');
+ throwType =
+ new InterfaceType(stateErrorClass, Nullability.nonNullable);
+ }
+ assert(throwType != null);
+
for (Catch catchClause in node.catches) {
- if (exprEvaluator.isSubtype(throwConstant, catchClause.guard,
- SubtypeCheckMode.withNullabilities) ||
+ if (exprEvaluator.typeEnvironment.isSubtypeOf(throwType,
+ catchClause.guard, SubtypeCheckMode.withNullabilities) ||
catchClause.guard == defaultType) {
return exprEvaluator.withNewEnvironment(() {
if (catchClause.exception != null) {
- exprEvaluator.env
- .addVariableValue(catchClause.exception, throwConstant);
+ // TODO(kallentu): Store non-constant exceptions.
+ if (throwValue is Constant) {
+ exprEvaluator.env
+ .addVariableValue(catchClause.exception, throwValue);
+ }
}
// TODO(kallentu): Store appropriate stack trace in environment.
return catchClause.body.accept(this);
@@ -3993,8 +4054,8 @@
}
class _AbortDueToThrowConstant extends AbortConstant {
- final Throw node;
- final Constant throwValue;
+ final TreeNode node;
+ final Object throwValue;
_AbortDueToThrowConstant(this.node, this.throwValue);
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 35e9097..99253fc 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -92,6 +92,8 @@
ConstConstructorLateFinalFieldWarning/example: Fail
ConstConstructorNonFinalField/example: Fail
ConstConstructorRedirectionToNonConst/analyzerCode: Fail # The analyzer doesn't report this error.
+ConstEvalBadState/analyzerCode: Fail
+ConstEvalBadState/example: Fail
ConstEvalCaseImplementsEqual/analyzerCode: Fail
ConstEvalCaseImplementsEqual/example: Fail
ConstEvalCircularity/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 540ad5d..6b392cf 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -106,6 +106,9 @@
ConstEvalStartingPoint:
template: "Constant evaluation error:"
+ConstEvalBadState:
+ template: "Bad state: '#stringOKEmpty'"
+
ConstEvalContext:
template: "While analyzing:"
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list.dart b/pkg/front_end/testcases/const_functions/const_functions_list.dart
new file mode 100644
index 0000000..4d16542
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list.dart
@@ -0,0 +1,108 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests lists with const functions.
+
+import "package:expect/expect.dart";
+
+const firstVar = firstFn();
+int firstFn() {
+ const List<int> x = [1, 2];
+ return x.first;
+}
+
+const firstCatchVar = firstCatchFn();
+int firstCatchFn() {
+ try {
+ const List<int> x = [];
+ var v = x.first;
+ } on StateError {
+ return 0;
+ }
+ return 1;
+}
+
+const isEmptyVar = isEmptyFn();
+bool isEmptyFn() {
+ const List<int> x = [1, 2];
+ return x.isEmpty;
+}
+
+const isNotEmptyVar = isNotEmptyFn();
+bool isNotEmptyFn() {
+ const List<int> x = [1, 2];
+ return x.isNotEmpty;
+}
+
+const lastVar = lastFn();
+int lastFn() {
+ const List<int> x = [1, 2];
+ return x.last;
+}
+
+const lastCatchVar = lastCatchFn();
+int lastCatchFn() {
+ try {
+ const List<int> x = [];
+ var v = x.last;
+ } on StateError {
+ return 0;
+ }
+ return 1;
+}
+
+const lengthVar = lengthFn();
+int lengthFn() {
+ const List<int> x = [1, 2];
+ return x.length;
+}
+
+const singleVar = singleFn();
+int singleFn() {
+ const List<int> x = [1];
+ return x.single;
+}
+
+const singleCatchVar = singleCatchFn();
+int singleCatchFn() {
+ try {
+ const List<int> x = [];
+ var v = x.single;
+ } on StateError {
+ return 0;
+ }
+ return 1;
+}
+
+const singleCatchVar2 = singleCatchFn2();
+int singleCatchFn2() {
+ try {
+ const List<int> x = [1, 2];
+ var v = x.single;
+ } on StateError {
+ return 0;
+ }
+ return 1;
+}
+
+const typeExample = int;
+const typeVar = typeFn();
+Type typeFn() {
+ const List<int> x = [1, 2];
+ return x.runtimeType;
+}
+
+void main() {
+ Expect.equals(firstVar, 1);
+ Expect.equals(firstCatchVar, 0);
+ Expect.equals(isEmptyVar, false);
+ Expect.equals(isNotEmptyVar, true);
+ Expect.equals(lastVar, 2);
+ Expect.equals(lastCatchVar, 0);
+ Expect.equals(lengthVar, 2);
+ Expect.equals(singleVar, 1);
+ Expect.equals(singleCatchVar, 0);
+ Expect.equals(singleCatchVar2, 0);
+ Expect.equals(typeVar, int);
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_list.dart.strong.expect
new file mode 100644
index 0000000..b978859
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list.dart.strong.expect
@@ -0,0 +1,101 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstVar = #C1;
+static const field core::int firstCatchVar = #C2;
+static const field core::bool isEmptyVar = #C3;
+static const field core::bool isNotEmptyVar = #C4;
+static const field core::int lastVar = #C5;
+static const field core::int lastCatchVar = #C2;
+static const field core::int lengthVar = #C5;
+static const field core::int singleVar = #C1;
+static const field core::int singleCatchVar = #C2;
+static const field core::int singleCatchVar2 = #C2;
+static const field core::Type typeExample = #C6;
+static const field core::Type typeVar = #C6;
+static method firstFn() → core::int {
+ return (#C7).{core::Iterable::first};
+}
+static method firstCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::first};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method isEmptyFn() → core::bool {
+ return (#C7).{core::Iterable::isEmpty};
+}
+static method isNotEmptyFn() → core::bool {
+ return (#C7).{core::Iterable::isNotEmpty};
+}
+static method lastFn() → core::int {
+ return (#C7).{core::Iterable::last};
+}
+static method lastCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::last};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method lengthFn() → core::int {
+ return (#C7).{core::List::length};
+}
+static method singleFn() → core::int {
+ return (#C9).{core::Iterable::single};
+}
+static method singleCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::single};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method singleCatchFn2() → core::int {
+ try {
+ core::int v = (#C7).{core::Iterable::single};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method typeFn() → core::Type {
+ return (#C7).{core::Object::runtimeType};
+}
+static method main() → void {
+ exp::Expect::equals(#C1, 1);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C3, false);
+ exp::Expect::equals(#C4, true);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C1, 1);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C6, #C6);
+}
+
+constants {
+ #C1 = 1
+ #C2 = 0
+ #C3 = false
+ #C4 = true
+ #C5 = 2
+ #C6 = TypeLiteralConstant(core::int)
+ #C7 = <core::int>[#C1, #C5]
+ #C8 = <core::int>[]
+ #C9 = <core::int>[#C1]
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_list.dart.strong.transformed.expect
new file mode 100644
index 0000000..b978859
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list.dart.strong.transformed.expect
@@ -0,0 +1,101 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstVar = #C1;
+static const field core::int firstCatchVar = #C2;
+static const field core::bool isEmptyVar = #C3;
+static const field core::bool isNotEmptyVar = #C4;
+static const field core::int lastVar = #C5;
+static const field core::int lastCatchVar = #C2;
+static const field core::int lengthVar = #C5;
+static const field core::int singleVar = #C1;
+static const field core::int singleCatchVar = #C2;
+static const field core::int singleCatchVar2 = #C2;
+static const field core::Type typeExample = #C6;
+static const field core::Type typeVar = #C6;
+static method firstFn() → core::int {
+ return (#C7).{core::Iterable::first};
+}
+static method firstCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::first};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method isEmptyFn() → core::bool {
+ return (#C7).{core::Iterable::isEmpty};
+}
+static method isNotEmptyFn() → core::bool {
+ return (#C7).{core::Iterable::isNotEmpty};
+}
+static method lastFn() → core::int {
+ return (#C7).{core::Iterable::last};
+}
+static method lastCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::last};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method lengthFn() → core::int {
+ return (#C7).{core::List::length};
+}
+static method singleFn() → core::int {
+ return (#C9).{core::Iterable::single};
+}
+static method singleCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::single};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method singleCatchFn2() → core::int {
+ try {
+ core::int v = (#C7).{core::Iterable::single};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method typeFn() → core::Type {
+ return (#C7).{core::Object::runtimeType};
+}
+static method main() → void {
+ exp::Expect::equals(#C1, 1);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C3, false);
+ exp::Expect::equals(#C4, true);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C1, 1);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C6, #C6);
+}
+
+constants {
+ #C1 = 1
+ #C2 = 0
+ #C3 = false
+ #C4 = true
+ #C5 = 2
+ #C6 = TypeLiteralConstant(core::int)
+ #C7 = <core::int>[#C1, #C5]
+ #C8 = <core::int>[]
+ #C9 = <core::int>[#C1]
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_list.dart.textual_outline.expect
new file mode 100644
index 0000000..91be3d9
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list.dart.textual_outline.expect
@@ -0,0 +1,26 @@
+import "package:expect/expect.dart";
+
+const firstVar = firstFn();
+int firstFn() {}
+const firstCatchVar = firstCatchFn();
+int firstCatchFn() {}
+const isEmptyVar = isEmptyFn();
+bool isEmptyFn() {}
+const isNotEmptyVar = isNotEmptyFn();
+bool isNotEmptyFn() {}
+const lastVar = lastFn();
+int lastFn() {}
+const lastCatchVar = lastCatchFn();
+int lastCatchFn() {}
+const lengthVar = lengthFn();
+int lengthFn() {}
+const singleVar = singleFn();
+int singleFn() {}
+const singleCatchVar = singleCatchFn();
+int singleCatchFn() {}
+const singleCatchVar2 = singleCatchFn2();
+int singleCatchFn2() {}
+const typeExample = int;
+const typeVar = typeFn();
+Type typeFn() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/const_functions/const_functions_list.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a297feb
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list.dart.textual_outline_modelled.expect
@@ -0,0 +1,26 @@
+import "package:expect/expect.dart";
+
+Type typeFn() {}
+bool isEmptyFn() {}
+bool isNotEmptyFn() {}
+const firstCatchVar = firstCatchFn();
+const firstVar = firstFn();
+const isEmptyVar = isEmptyFn();
+const isNotEmptyVar = isNotEmptyFn();
+const lastCatchVar = lastCatchFn();
+const lastVar = lastFn();
+const lengthVar = lengthFn();
+const singleCatchVar = singleCatchFn();
+const singleCatchVar2 = singleCatchFn2();
+const singleVar = singleFn();
+const typeExample = int;
+const typeVar = typeFn();
+int firstCatchFn() {}
+int firstFn() {}
+int lastCatchFn() {}
+int lastFn() {}
+int lengthFn() {}
+int singleCatchFn() {}
+int singleCatchFn2() {}
+int singleFn() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.expect
new file mode 100644
index 0000000..e5b0a71
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.expect
@@ -0,0 +1,101 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstVar = #C1;
+static const field core::int firstCatchVar = #C2;
+static const field core::bool isEmptyVar = #C3;
+static const field core::bool isNotEmptyVar = #C4;
+static const field core::int lastVar = #C5;
+static const field core::int lastCatchVar = #C2;
+static const field core::int lengthVar = #C5;
+static const field core::int singleVar = #C1;
+static const field core::int singleCatchVar = #C2;
+static const field core::int singleCatchVar2 = #C2;
+static const field core::Type typeExample = #C6;
+static const field core::Type typeVar = #C6;
+static method firstFn() → core::int {
+ return (#C7).{core::Iterable::first};
+}
+static method firstCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::first};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method isEmptyFn() → core::bool {
+ return (#C7).{core::Iterable::isEmpty};
+}
+static method isNotEmptyFn() → core::bool {
+ return (#C7).{core::Iterable::isNotEmpty};
+}
+static method lastFn() → core::int {
+ return (#C7).{core::Iterable::last};
+}
+static method lastCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::last};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method lengthFn() → core::int {
+ return (#C7).{core::List::length};
+}
+static method singleFn() → core::int {
+ return (#C9).{core::Iterable::single};
+}
+static method singleCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::single};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method singleCatchFn2() → core::int {
+ try {
+ core::int v = (#C7).{core::Iterable::single};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method typeFn() → core::Type {
+ return (#C7).{core::Object::runtimeType};
+}
+static method main() → void {
+ exp::Expect::equals(#C1, 1);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C3, false);
+ exp::Expect::equals(#C4, true);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C1, 1);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C6, #C6);
+}
+
+constants {
+ #C1 = 1
+ #C2 = 0
+ #C3 = false
+ #C4 = true
+ #C5 = 2
+ #C6 = TypeLiteralConstant(core::int*)
+ #C7 = <core::int*>[#C1, #C5]
+ #C8 = <core::int*>[]
+ #C9 = <core::int*>[#C1]
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.outline.expect
new file mode 100644
index 0000000..dcd0734
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.outline.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstVar = self::firstFn();
+static const field core::int firstCatchVar = self::firstCatchFn();
+static const field core::bool isEmptyVar = self::isEmptyFn();
+static const field core::bool isNotEmptyVar = self::isNotEmptyFn();
+static const field core::int lastVar = self::lastFn();
+static const field core::int lastCatchVar = self::lastCatchFn();
+static const field core::int lengthVar = self::lengthFn();
+static const field core::int singleVar = self::singleFn();
+static const field core::int singleCatchVar = self::singleCatchFn();
+static const field core::int singleCatchVar2 = self::singleCatchFn2();
+static const field core::Type typeExample = core::int;
+static const field core::Type typeVar = self::typeFn();
+static method firstFn() → core::int
+ ;
+static method firstCatchFn() → core::int
+ ;
+static method isEmptyFn() → core::bool
+ ;
+static method isNotEmptyFn() → core::bool
+ ;
+static method lastFn() → core::int
+ ;
+static method lastCatchFn() → core::int
+ ;
+static method lengthFn() → core::int
+ ;
+static method singleFn() → core::int
+ ;
+static method singleCatchFn() → core::int
+ ;
+static method singleCatchFn2() → core::int
+ ;
+static method typeFn() → core::Type
+ ;
+static method main() → void
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///const_functions_list.dart:89:21 -> TypeLiteralConstant(int*)
+Extra constant evaluation: evaluated: 12, effectively constant: 1
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.transformed.expect
new file mode 100644
index 0000000..e5b0a71
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.transformed.expect
@@ -0,0 +1,101 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstVar = #C1;
+static const field core::int firstCatchVar = #C2;
+static const field core::bool isEmptyVar = #C3;
+static const field core::bool isNotEmptyVar = #C4;
+static const field core::int lastVar = #C5;
+static const field core::int lastCatchVar = #C2;
+static const field core::int lengthVar = #C5;
+static const field core::int singleVar = #C1;
+static const field core::int singleCatchVar = #C2;
+static const field core::int singleCatchVar2 = #C2;
+static const field core::Type typeExample = #C6;
+static const field core::Type typeVar = #C6;
+static method firstFn() → core::int {
+ return (#C7).{core::Iterable::first};
+}
+static method firstCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::first};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method isEmptyFn() → core::bool {
+ return (#C7).{core::Iterable::isEmpty};
+}
+static method isNotEmptyFn() → core::bool {
+ return (#C7).{core::Iterable::isNotEmpty};
+}
+static method lastFn() → core::int {
+ return (#C7).{core::Iterable::last};
+}
+static method lastCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::last};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method lengthFn() → core::int {
+ return (#C7).{core::List::length};
+}
+static method singleFn() → core::int {
+ return (#C9).{core::Iterable::single};
+}
+static method singleCatchFn() → core::int {
+ try {
+ core::int v = (#C8).{core::Iterable::single};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method singleCatchFn2() → core::int {
+ try {
+ core::int v = (#C7).{core::Iterable::single};
+ }
+ on core::StateError catch(no-exception-var) {
+ return 0;
+ }
+ return 1;
+}
+static method typeFn() → core::Type {
+ return (#C7).{core::Object::runtimeType};
+}
+static method main() → void {
+ exp::Expect::equals(#C1, 1);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C3, false);
+ exp::Expect::equals(#C4, true);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C1, 1);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C2, 0);
+ exp::Expect::equals(#C6, #C6);
+}
+
+constants {
+ #C1 = 1
+ #C2 = 0
+ #C3 = false
+ #C4 = true
+ #C5 = 2
+ #C6 = TypeLiteralConstant(core::int*)
+ #C7 = <core::int*>[#C1, #C5]
+ #C8 = <core::int*>[]
+ #C9 = <core::int*>[#C1]
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list_error.dart b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart
new file mode 100644
index 0000000..b2e29ac
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests erroneous list usage with const functions.
+
+import "package:expect/expect.dart";
+
+const firstException = firstExceptionFn();
+int firstExceptionFn() {
+ const List<int> x = [];
+ return x.first;
+}
+
+const lastException = lastExceptionFn();
+int lastExceptionFn() {
+ const List<int> x = [];
+ return x.last;
+}
+
+const singleException = singleExceptionFn();
+int singleExceptionFn() {
+ const List<int> x = [];
+ return x.single;
+}
+
+const singleExceptionMulti = singleExceptionMultiFn();
+int singleExceptionMultiFn() {
+ const List<int> x = [1, 2];
+ return x.single;
+}
+
+const invalidProperty = invalidPropertyFn();
+int invalidPropertyFn() {
+ const List<int> x = [1, 2];
+ return x.invalidProperty;
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.strong.expect
new file mode 100644
index 0000000..4024724
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.strong.expect
@@ -0,0 +1,79 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+// - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+// return x.invalidProperty;
+// ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:9:24: Error: Constant evaluation error:
+// const firstException = firstExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:12:12: Context: Bad state: 'No element'
+// return x.first;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:15:23: Error: Constant evaluation error:
+// const lastException = lastExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:18:12: Context: Bad state: 'No element'
+// return x.last;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:21:25: Error: Constant evaluation error:
+// const singleException = singleExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:24:12: Context: Bad state: 'No element'
+// return x.single;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:27:30: Error: Constant evaluation error:
+// const singleExceptionMulti = singleExceptionMultiFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:30:12: Context: Bad state: 'Too many elements'
+// return x.single;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstException = invalid-expression "Bad state: 'No element'";
+static const field core::int lastException = invalid-expression "Bad state: 'No element'";
+static const field core::int singleException = invalid-expression "Bad state: 'No element'";
+static const field core::int singleExceptionMulti = invalid-expression "Bad state: 'Too many elements'";
+static const field core::int invalidProperty = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+ return x.invalidProperty;
+ ^^^^^^^^^^^^^^^";
+static method firstExceptionFn() → core::int {
+ return (#C1).{core::Iterable::first};
+}
+static method lastExceptionFn() → core::int {
+ return (#C1).{core::Iterable::last};
+}
+static method singleExceptionFn() → core::int {
+ return (#C1).{core::Iterable::single};
+}
+static method singleExceptionMultiFn() → core::int {
+ return (#C4).{core::Iterable::single};
+}
+static method invalidPropertyFn() → core::int {
+ return invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+ return x.invalidProperty;
+ ^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method main() → void {}
+
+constants {
+ #C1 = <core::int>[]
+ #C2 = 1
+ #C3 = 2
+ #C4 = <core::int>[#C2, #C3]
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..6cf44d0
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.strong.transformed.expect
@@ -0,0 +1,79 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+// - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+// return x.invalidProperty;
+// ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:9:24: Error: Constant evaluation error:
+// const firstException = firstExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:12:12: Context: Bad state: 'No element'
+// return x.first;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:15:23: Error: Constant evaluation error:
+// const lastException = lastExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:18:12: Context: Bad state: 'No element'
+// return x.last;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:21:25: Error: Constant evaluation error:
+// const singleException = singleExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:24:12: Context: Bad state: 'No element'
+// return x.single;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:27:30: Error: Constant evaluation error:
+// const singleExceptionMulti = singleExceptionMultiFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:30:12: Context: Bad state: 'Too many elements'
+// return x.single;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstException = invalid-expression "Bad state: 'No element'";
+static const field core::int lastException = invalid-expression "Bad state: 'No element'";
+static const field core::int singleException = invalid-expression "Bad state: 'No element'";
+static const field core::int singleExceptionMulti = invalid-expression "Bad state: 'Too many elements'";
+static const field core::int invalidProperty = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+ return x.invalidProperty;
+ ^^^^^^^^^^^^^^^";
+static method firstExceptionFn() → core::int {
+ return (#C1).{core::Iterable::first};
+}
+static method lastExceptionFn() → core::int {
+ return (#C1).{core::Iterable::last};
+}
+static method singleExceptionFn() → core::int {
+ return (#C1).{core::Iterable::single};
+}
+static method singleExceptionMultiFn() → core::int {
+ return (#C4).{core::Iterable::single};
+}
+static method invalidPropertyFn() → core::int {
+ return invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+ return x.invalidProperty;
+ ^^^^^^^^^^^^^^^";
+}
+static method main() → void {}
+
+constants {
+ #C1 = <core::int>[]
+ #C2 = 1
+ #C3 = 2
+ #C4 = <core::int>[#C2, #C3]
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.textual_outline.expect
new file mode 100644
index 0000000..4697c853
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+import "package:expect/expect.dart";
+
+const firstException = firstExceptionFn();
+int firstExceptionFn() {}
+const lastException = lastExceptionFn();
+int lastExceptionFn() {}
+const singleException = singleExceptionFn();
+int singleExceptionFn() {}
+const singleExceptionMulti = singleExceptionMultiFn();
+int singleExceptionMultiFn() {}
+const invalidProperty = invalidPropertyFn();
+int invalidPropertyFn() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c41226a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+import "package:expect/expect.dart";
+
+const firstException = firstExceptionFn();
+const invalidProperty = invalidPropertyFn();
+const lastException = lastExceptionFn();
+const singleException = singleExceptionFn();
+const singleExceptionMulti = singleExceptionMultiFn();
+int firstExceptionFn() {}
+int invalidPropertyFn() {}
+int lastExceptionFn() {}
+int singleExceptionFn() {}
+int singleExceptionMultiFn() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.expect
new file mode 100644
index 0000000..fea30ee
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.expect
@@ -0,0 +1,79 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+// - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+// return x.invalidProperty;
+// ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:9:24: Error: Constant evaluation error:
+// const firstException = firstExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:12:12: Context: Bad state: 'No element'
+// return x.first;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:15:23: Error: Constant evaluation error:
+// const lastException = lastExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:18:12: Context: Bad state: 'No element'
+// return x.last;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:21:25: Error: Constant evaluation error:
+// const singleException = singleExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:24:12: Context: Bad state: 'No element'
+// return x.single;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:27:30: Error: Constant evaluation error:
+// const singleExceptionMulti = singleExceptionMultiFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:30:12: Context: Bad state: 'Too many elements'
+// return x.single;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstException = invalid-expression "Bad state: 'No element'";
+static const field core::int lastException = invalid-expression "Bad state: 'No element'";
+static const field core::int singleException = invalid-expression "Bad state: 'No element'";
+static const field core::int singleExceptionMulti = invalid-expression "Bad state: 'Too many elements'";
+static const field core::int invalidProperty = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+ return x.invalidProperty;
+ ^^^^^^^^^^^^^^^";
+static method firstExceptionFn() → core::int {
+ return (#C1).{core::Iterable::first};
+}
+static method lastExceptionFn() → core::int {
+ return (#C1).{core::Iterable::last};
+}
+static method singleExceptionFn() → core::int {
+ return (#C1).{core::Iterable::single};
+}
+static method singleExceptionMultiFn() → core::int {
+ return (#C4).{core::Iterable::single};
+}
+static method invalidPropertyFn() → core::int {
+ return invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+ return x.invalidProperty;
+ ^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method main() → void {}
+
+constants {
+ #C1 = <core::int*>[]
+ #C2 = 1
+ #C3 = 2
+ #C4 = <core::int*>[#C2, #C3]
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.outline.expect
new file mode 100644
index 0000000..49a82fb
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.outline.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstException = self::firstExceptionFn();
+static const field core::int lastException = self::lastExceptionFn();
+static const field core::int singleException = self::singleExceptionFn();
+static const field core::int singleExceptionMulti = self::singleExceptionMultiFn();
+static const field core::int invalidProperty = self::invalidPropertyFn();
+static method firstExceptionFn() → core::int
+ ;
+static method lastExceptionFn() → core::int
+ ;
+static method singleExceptionFn() → core::int
+ ;
+static method singleExceptionMultiFn() → core::int
+ ;
+static method invalidPropertyFn() → core::int
+ ;
+static method main() → void
+ ;
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..95805b6
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.transformed.expect
@@ -0,0 +1,79 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+// - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+// return x.invalidProperty;
+// ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:9:24: Error: Constant evaluation error:
+// const firstException = firstExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:12:12: Context: Bad state: 'No element'
+// return x.first;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:15:23: Error: Constant evaluation error:
+// const lastException = lastExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:18:12: Context: Bad state: 'No element'
+// return x.last;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:21:25: Error: Constant evaluation error:
+// const singleException = singleExceptionFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:24:12: Context: Bad state: 'No element'
+// return x.single;
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:27:30: Error: Constant evaluation error:
+// const singleExceptionMulti = singleExceptionMultiFn();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:30:12: Context: Bad state: 'Too many elements'
+// return x.single;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstException = invalid-expression "Bad state: 'No element'";
+static const field core::int lastException = invalid-expression "Bad state: 'No element'";
+static const field core::int singleException = invalid-expression "Bad state: 'No element'";
+static const field core::int singleExceptionMulti = invalid-expression "Bad state: 'Too many elements'";
+static const field core::int invalidProperty = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+ return x.invalidProperty;
+ ^^^^^^^^^^^^^^^";
+static method firstExceptionFn() → core::int {
+ return (#C1).{core::Iterable::first};
+}
+static method lastExceptionFn() → core::int {
+ return (#C1).{core::Iterable::last};
+}
+static method singleExceptionFn() → core::int {
+ return (#C1).{core::Iterable::single};
+}
+static method singleExceptionMultiFn() → core::int {
+ return (#C4).{core::Iterable::single};
+}
+static method invalidPropertyFn() → core::int {
+ return invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+ return x.invalidProperty;
+ ^^^^^^^^^^^^^^^";
+}
+static method main() → void {}
+
+constants {
+ #C1 = <core::int*>[]
+ #C2 = 1
+ #C3 = 2
+ #C4 = <core::int*>[#C2, #C3]
+}
diff --git a/runtime/observatory/lib/src/elements/class_instances.dart b/runtime/observatory/lib/src/elements/class_instances.dart
index abf90cc..8d12e21 100644
--- a/runtime/observatory/lib/src/elements/class_instances.dart
+++ b/runtime/observatory/lib/src/elements/class_instances.dart
@@ -6,6 +6,7 @@
import 'dart:async';
import 'package:observatory/models.dart' as M;
import 'package:observatory/src/elements/class_ref.dart';
+import 'package:observatory/src/elements/helpers/any_ref.dart';
import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/inbound_references.dart';
@@ -25,6 +26,12 @@
late M.ReachableSizeRepository _reachableSizes;
late M.StronglyReachableInstancesRepository _stronglyReachableInstances;
late M.ObjectRepository _objects;
+ M.Guarded<M.InstanceRef>? _allInstances = null;
+ bool _loadingAllInstances = false;
+ M.Guarded<M.InstanceRef>? _allSubclassInstances = null;
+ bool _loadingAllSubclassInstances = false;
+ M.Guarded<M.InstanceRef>? _allImplementorInstances = null;
+ bool _loadingAllImplementorInstances = false;
M.Guarded<M.Instance>? _retainedSize = null;
bool _loadingRetainedBytes = false;
M.Guarded<M.Instance>? _reachableSize = null;
@@ -108,6 +115,41 @@
],
new DivElement()
..classes = ['memberItem']
+ ..children = <Element>[
+ new DivElement()
+ ..classes = ['memberName']
+ ..text = 'all direct instances'
+ ..title = 'All instances whose class is exactly this class',
+ new DivElement()
+ ..classes = ['memberValue']
+ ..children = _createAllInstances()
+ ],
+ new DivElement()
+ ..classes = ['memberItem']
+ ..children = <Element>[
+ new DivElement()
+ ..classes = ['memberName']
+ ..text = 'all instances of subclasses'
+ ..title =
+ 'All instances whose class is a subclass of this class',
+ new DivElement()
+ ..classes = ['memberValue']
+ ..children = _createAllSubclassInstances()
+ ],
+ new DivElement()
+ ..classes = ['memberItem']
+ ..children = <Element>[
+ new DivElement()
+ ..classes = ['memberName']
+ ..text = 'all instances of implementors'
+ ..title =
+ 'All instances whose class implements the implicit interface of this class',
+ new DivElement()
+ ..classes = ['memberValue']
+ ..children = _createAllImplementorInstances()
+ ],
+ new DivElement()
+ ..classes = ['memberItem']
..title = 'Space reachable from this object, '
'excluding class references'
..children = <Element>[
@@ -134,6 +176,96 @@
];
}
+ List<Element> _createAllInstances() {
+ final content = <Element>[];
+ if (_allInstances != null) {
+ if (_allInstances!.isSentinel) {
+ content.add(new SentinelValueElement(_allInstances!.asSentinel!,
+ queue: _r.queue)
+ .element);
+ } else {
+ content.add(anyRef(_isolate, _allInstances!.asValue!, _objects));
+ }
+ } else {
+ content.add(new SpanElement()..text = '...');
+ }
+ final button = new ButtonElement()
+ ..classes = ['reachable_size']
+ ..disabled = _loadingAllInstances
+ ..text = '↺';
+ button.onClick.listen((_) async {
+ button.disabled = true;
+ _loadingAllInstances = true;
+ _allInstances =
+ await _stronglyReachableInstances.getAsArray(_isolate, _cls);
+ _loadingAllInstances = false;
+ _r.dirty();
+ });
+ content.add(button);
+ return content;
+ }
+
+ List<Element> _createAllSubclassInstances() {
+ final content = <Element>[];
+ if (_allSubclassInstances != null) {
+ if (_allSubclassInstances!.isSentinel) {
+ content.add(new SentinelValueElement(_allSubclassInstances!.asSentinel!,
+ queue: _r.queue)
+ .element);
+ } else {
+ content
+ .add(anyRef(_isolate, _allSubclassInstances!.asValue!, _objects));
+ }
+ } else {
+ content.add(new SpanElement()..text = '...');
+ }
+ final button = new ButtonElement()
+ ..classes = ['reachable_size']
+ ..disabled = _loadingAllSubclassInstances
+ ..text = '↺';
+ button.onClick.listen((_) async {
+ button.disabled = true;
+ _loadingAllSubclassInstances = true;
+ _allSubclassInstances = await _stronglyReachableInstances
+ .getAsArray(_isolate, _cls, includeSubclasses: true);
+ _loadingAllSubclassInstances = false;
+ _r.dirty();
+ });
+ content.add(button);
+ return content;
+ }
+
+ List<Element> _createAllImplementorInstances() {
+ final content = <Element>[];
+ if (_allImplementorInstances != null) {
+ if (_allImplementorInstances!.isSentinel) {
+ content.add(new SentinelValueElement(
+ _allImplementorInstances!.asSentinel!,
+ queue: _r.queue)
+ .element);
+ } else {
+ content.add(
+ anyRef(_isolate, _allImplementorInstances!.asValue!, _objects));
+ }
+ } else {
+ content.add(new SpanElement()..text = '...');
+ }
+ final button = new ButtonElement()
+ ..classes = ['reachable_size']
+ ..disabled = _loadingAllImplementorInstances
+ ..text = '↺';
+ button.onClick.listen((_) async {
+ button.disabled = true;
+ _loadingAllImplementorInstances = true;
+ _allImplementorInstances = await _stronglyReachableInstances
+ .getAsArray(_isolate, _cls, includeImplementors: true);
+ _loadingAllImplementorInstances = false;
+ _r.dirty();
+ });
+ content.add(button);
+ return content;
+ }
+
List<Element> _createReachableSizeValue() {
final content = <Element>[];
if (_reachableSize != null) {
@@ -157,6 +289,7 @@
button.disabled = true;
_loadingReachableBytes = true;
_reachableSize = await _reachableSizes.get(_isolate, _cls.id!);
+ _loadingReachableBytes = false;
_r.dirty();
});
content.add(button);
@@ -186,6 +319,7 @@
button.disabled = true;
_loadingRetainedBytes = true;
_retainedSize = await _retainedSizes.get(_isolate, _cls.id!);
+ _loadingRetainedBytes = false;
_r.dirty();
});
content.add(button);
diff --git a/runtime/observatory/lib/src/elements/vm_view.dart b/runtime/observatory/lib/src/elements/vm_view.dart
index 2b82602..4bcec55 100644
--- a/runtime/observatory/lib/src/elements/vm_view.dart
+++ b/runtime/observatory/lib/src/elements/vm_view.dart
@@ -174,14 +174,28 @@
..children = <Element>[
new DivElement()
..classes = ['memberName']
- ..text = 'malloc memory',
+ ..text = 'malloc used memory',
new DivElement()
..classes = ['memberValue']
- ..text = _vm.heapAllocatedMemoryUsage != null
- ? Utils.formatSize(_vm.heapAllocatedMemoryUsage)
+ ..text = _vm.mallocUsed != null
+ ? Utils.formatSize(_vm.mallocUsed)
: 'unavailable'
- ..title = _vm.heapAllocatedMemoryUsage != null
- ? '${_vm.heapAllocatedMemoryUsage} bytes'
+ ..title =
+ _vm.mallocUsed != null ? '${_vm.mallocUsed} bytes' : null
+ ],
+ new DivElement()
+ ..classes = ['memberItem']
+ ..children = <Element>[
+ new DivElement()
+ ..classes = ['memberName']
+ ..text = 'malloc capacity memory',
+ new DivElement()
+ ..classes = ['memberValue']
+ ..text = _vm.mallocCapacity != null
+ ? Utils.formatSize(_vm.mallocCapacity)
+ : 'unavailable'
+ ..title = _vm.mallocCapacity != null
+ ? '${_vm.mallocCapacity} bytes'
: null
],
new DivElement()
@@ -189,12 +203,10 @@
..children = <Element>[
new DivElement()
..classes = ['memberName']
- ..text = 'malloc allocation count',
+ ..text = 'malloc implementation',
new DivElement()
..classes = ['memberValue']
- ..text = _vm.heapAllocationCount != null
- ? '${_vm.heapAllocationCount}'
- : 'unavailable'
+ ..text = _vm.mallocImplementation
],
new DivElement()
..classes = ['memberItem']
diff --git a/runtime/observatory/lib/src/models/objects/vm.dart b/runtime/observatory/lib/src/models/objects/vm.dart
index 10deac8..523f2a2 100644
--- a/runtime/observatory/lib/src/models/objects/vm.dart
+++ b/runtime/observatory/lib/src/models/objects/vm.dart
@@ -35,10 +35,9 @@
int get pid;
/// The current amount of native heap allocated memory within the VM.
- int get heapAllocatedMemoryUsage;
-
- /// The current number of allocations on the native heap within the VM.
- int get heapAllocationCount;
+ int get mallocUsed;
+ int get mallocCapacity;
+ String get mallocImplementation;
int get currentMemory;
int get maxRSS;
diff --git a/runtime/observatory/lib/src/models/repositories/strongly_reachable_instances.dart b/runtime/observatory/lib/src/models/repositories/strongly_reachable_instances.dart
index c0449f8..195948a 100644
--- a/runtime/observatory/lib/src/models/repositories/strongly_reachable_instances.dart
+++ b/runtime/observatory/lib/src/models/repositories/strongly_reachable_instances.dart
@@ -6,4 +6,6 @@
abstract class StronglyReachableInstancesRepository {
Future<InstanceSet> get(IsolateRef isolate, ClassRef cls, {int limit: 100});
+ Future<Guarded<InstanceRef>> getAsArray(IsolateRef isolate, ClassRef cls,
+ {bool includeSubclasses: false, includeImplementors: false});
}
diff --git a/runtime/observatory/lib/src/repositories/strongly_reachable_instances.dart b/runtime/observatory/lib/src/repositories/strongly_reachable_instances.dart
index a015928..f4ed736 100644
--- a/runtime/observatory/lib/src/repositories/strongly_reachable_instances.dart
+++ b/runtime/observatory/lib/src/repositories/strongly_reachable_instances.dart
@@ -15,4 +15,18 @@
assert(limit != null);
return (await isolate.getInstances(cls, limit)) as S.InstanceSet;
}
+
+ Future<M.Guarded<M.InstanceRef>> getAsArray(M.IsolateRef i, M.ClassRef c,
+ {bool includeSubclasses: false, includeImplementors: false}) async {
+ S.Isolate isolate = i as S.Isolate;
+ S.Class cls = c as S.Class;
+ assert(isolate != null);
+ assert(cls != null);
+ final response = await isolate.invokeRpc('_getInstancesAsArray', {
+ 'objectId': cls.id,
+ 'includeSubclasses': includeSubclasses,
+ 'includeImplementors': includeImplementors
+ });
+ return new S.Guarded<S.Instance>(response);
+ }
}
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index e32c00f..4db752a 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -680,8 +680,9 @@
bool typeChecksEnabled = false;
int nativeZoneMemoryUsage = 0;
int pid = 0;
- int heapAllocatedMemoryUsage = 0;
- int heapAllocationCount = 0;
+ int mallocUsed = 0;
+ int mallocCapacity = 0;
+ String mallocImplementation = 'unknown';
int currentMemory = 0;
int maxRSS = 0;
int currentRSS = 0;
@@ -1041,8 +1042,9 @@
nativeZoneMemoryUsage = map['_nativeZoneMemoryUsage'];
}
pid = map['pid'];
- heapAllocatedMemoryUsage = map['_heapAllocatedMemoryUsage'];
- heapAllocationCount = map['_heapAllocationCount'];
+ mallocUsed = map['_mallocUsed'];
+ mallocCapacity = map['_mallocCapacity'];
+ mallocImplementation = map['_mallocImplementation'];
embedder = map['_embedder'];
currentMemory = map['_currentMemory'];
maxRSS = map['_maxRSS'];
diff --git a/runtime/observatory/tests/service/get_instances_as_array_rpc_test.dart b/runtime/observatory/tests/service/get_instances_as_array_rpc_test.dart
new file mode 100644
index 0000000..1981ec9c
--- /dev/null
+++ b/runtime/observatory/tests/service/get_instances_as_array_rpc_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:observatory/service_io.dart";
+import "package:test/test.dart";
+
+import "test_helper.dart";
+
+@pragma("vm:entry-point")
+class Class {}
+
+@pragma("vm:entry-point")
+class Subclass extends Class {}
+
+@pragma("vm:entry-point")
+class Implementor implements Class {}
+
+@pragma("vm:entry-point")
+var aClass;
+@pragma("vm:entry-point")
+var aSubclass;
+@pragma("vm:entry-point")
+var anImplementor;
+
+@pragma("vm:entry-point")
+allocate() {
+ aClass = new Class();
+ aSubclass = new Subclass();
+ anImplementor = new Implementor();
+}
+
+var tests = <IsolateTest>[
+ (Isolate isolate) async {
+ invoke(String selector) async {
+ Map params = {
+ "targetId": isolate.rootLibrary.id,
+ "selector": selector,
+ "argumentIds": <String>[],
+ };
+ return await isolate.invokeRpcNoUpgrade("invoke", params);
+ }
+
+ Future<int> instanceCount(String className,
+ {bool includeSubclasses: false,
+ bool includeImplementors: false}) async {
+ Map params = {
+ "objectId": isolate.rootLibrary.classes
+ .singleWhere((cls) => cls.name == className)
+ .id,
+ "includeSubclasses": includeSubclasses,
+ "includeImplementors": includeImplementors,
+ };
+ var result =
+ await isolate.invokeRpcNoUpgrade("_getInstancesAsArray", params);
+ expect(result["type"], equals("@Instance"));
+ expect(result["kind"], equals("List"));
+ return result["length"] as int;
+ }
+
+ await isolate.rootLibrary.load();
+
+ expect(await instanceCount("Class"), equals(0));
+ expect(await instanceCount("Class", includeSubclasses: true), equals(0));
+ expect(await instanceCount("Class", includeImplementors: true), equals(0));
+
+ await invoke("allocate");
+
+ expect(await instanceCount("Class"), equals(1));
+ expect(await instanceCount("Class", includeSubclasses: true), equals(2));
+ expect(await instanceCount("Class", includeImplementors: true), equals(3));
+ },
+];
+
+main(args) async => runIsolateTests(args, tests);
diff --git a/runtime/observatory_2/lib/src/elements/class_instances.dart b/runtime/observatory_2/lib/src/elements/class_instances.dart
index bc3e101..7197780 100644
--- a/runtime/observatory_2/lib/src/elements/class_instances.dart
+++ b/runtime/observatory_2/lib/src/elements/class_instances.dart
@@ -6,6 +6,7 @@
import 'dart:async';
import 'package:observatory_2/models.dart' as M;
import 'package:observatory_2/src/elements/class_ref.dart';
+import 'package:observatory_2/src/elements/helpers/any_ref.dart';
import 'package:observatory_2/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory_2/src/elements/helpers/custom_element.dart';
import 'package:observatory_2/src/elements/inbound_references.dart';
@@ -25,6 +26,12 @@
M.ReachableSizeRepository _reachableSizes;
M.StronglyReachableInstancesRepository _stronglyReachableInstances;
M.ObjectRepository _objects;
+ M.Guarded<M.InstanceRef> _allInstances = null;
+ bool _loadingAllInstances = false;
+ M.Guarded<M.InstanceRef> _allSubclassInstances = null;
+ bool _loadingAllSubclassInstances = false;
+ M.Guarded<M.InstanceRef> _allImplementorInstances = null;
+ bool _loadingAllImplementorInstances = false;
M.Guarded<M.Instance> _retainedSize = null;
bool _loadingRetainedBytes = false;
M.Guarded<M.Instance> _reachableSize = null;
@@ -108,6 +115,41 @@
],
new DivElement()
..classes = ['memberItem']
+ ..children = <Element>[
+ new DivElement()
+ ..classes = ['memberName']
+ ..text = 'all direct instances'
+ ..title = 'All instances whose class is exactly this class',
+ new DivElement()
+ ..classes = ['memberValue']
+ ..children = _createAllInstances()
+ ],
+ new DivElement()
+ ..classes = ['memberItem']
+ ..children = <Element>[
+ new DivElement()
+ ..classes = ['memberName']
+ ..text = 'all instances of subclasses'
+ ..title =
+ 'All instances whose class is a subclass of this class',
+ new DivElement()
+ ..classes = ['memberValue']
+ ..children = _createAllSubclassInstances()
+ ],
+ new DivElement()
+ ..classes = ['memberItem']
+ ..children = <Element>[
+ new DivElement()
+ ..classes = ['memberName']
+ ..text = 'all instances of implementors'
+ ..title =
+ 'All instances whose class implements the implicit interface of this class',
+ new DivElement()
+ ..classes = ['memberValue']
+ ..children = _createAllImplementorInstances()
+ ],
+ new DivElement()
+ ..classes = ['memberItem']
..title = 'Space reachable from this object, '
'excluding class references'
..children = <Element>[
@@ -134,6 +176,95 @@
];
}
+ List<Element> _createAllInstances() {
+ final content = <Element>[];
+ if (_allInstances != null) {
+ if (_allInstances.isSentinel) {
+ content.add(
+ new SentinelValueElement(_allInstances.asSentinel, queue: _r.queue)
+ .element);
+ } else {
+ content.add(anyRef(_isolate, _allInstances.asValue, _objects));
+ }
+ } else {
+ content.add(new SpanElement()..text = '...');
+ }
+ final button = new ButtonElement()
+ ..classes = ['reachable_size']
+ ..disabled = _loadingAllInstances
+ ..text = '↺';
+ button.onClick.listen((_) async {
+ button.disabled = true;
+ _loadingAllInstances = true;
+ _allInstances =
+ await _stronglyReachableInstances.getAsArray(_isolate, _cls);
+ _loadingAllInstances = false;
+ _r.dirty();
+ });
+ content.add(button);
+ return content;
+ }
+
+ List<Element> _createAllSubclassInstances() {
+ final content = <Element>[];
+ if (_allSubclassInstances != null) {
+ if (_allSubclassInstances.isSentinel) {
+ content.add(new SentinelValueElement(_allSubclassInstances.asSentinel,
+ queue: _r.queue)
+ .element);
+ } else {
+ content.add(anyRef(_isolate, _allSubclassInstances.asValue, _objects));
+ }
+ } else {
+ content.add(new SpanElement()..text = '...');
+ }
+ final button = new ButtonElement()
+ ..classes = ['reachable_size']
+ ..disabled = _loadingAllSubclassInstances
+ ..text = '↺';
+ button.onClick.listen((_) async {
+ button.disabled = true;
+ _loadingAllSubclassInstances = true;
+ _allSubclassInstances = await _stronglyReachableInstances
+ .getAsArray(_isolate, _cls, includeSubclasses: true);
+ _loadingAllSubclassInstances = false;
+ _r.dirty();
+ });
+ content.add(button);
+ return content;
+ }
+
+ List<Element> _createAllImplementorInstances() {
+ final content = <Element>[];
+ if (_allImplementorInstances != null) {
+ if (_allImplementorInstances.isSentinel) {
+ content.add(new SentinelValueElement(
+ _allImplementorInstances.asSentinel,
+ queue: _r.queue)
+ .element);
+ } else {
+ content
+ .add(anyRef(_isolate, _allImplementorInstances.asValue, _objects));
+ }
+ } else {
+ content.add(new SpanElement()..text = '...');
+ }
+ final button = new ButtonElement()
+ ..classes = ['reachable_size']
+ ..disabled = _loadingAllImplementorInstances
+ ..text = '↺';
+ button.onClick.listen((_) async {
+ button.disabled = true;
+ _loadingAllImplementorInstances = true;
+ _allImplementorInstances = await _stronglyReachableInstances
+ .getAsArray(_isolate, _cls, includeImplementors: true);
+ _loadingAllImplementorInstances = false;
+ _r.dirty();
+ });
+ content.add(button);
+ return content;
+ }
+
List<Element> _createReachableSizeValue() {
final content = <Element>[];
if (_reachableSize != null) {
diff --git a/runtime/observatory_2/lib/src/elements/vm_view.dart b/runtime/observatory_2/lib/src/elements/vm_view.dart
index 014cd50..b7b6d65 100644
--- a/runtime/observatory_2/lib/src/elements/vm_view.dart
+++ b/runtime/observatory_2/lib/src/elements/vm_view.dart
@@ -174,14 +174,28 @@
..children = <Element>[
new DivElement()
..classes = ['memberName']
- ..text = 'malloc memory',
+ ..text = 'malloc used memory',
new DivElement()
..classes = ['memberValue']
- ..text = _vm.heapAllocatedMemoryUsage != null
- ? Utils.formatSize(_vm.heapAllocatedMemoryUsage)
+ ..text = _vm.mallocUsed != null
+ ? Utils.formatSize(_vm.mallocUsed)
: 'unavailable'
- ..title = _vm.heapAllocatedMemoryUsage != null
- ? '${_vm.heapAllocatedMemoryUsage} bytes'
+ ..title =
+ _vm.mallocUsed != null ? '${_vm.mallocUsed} bytes' : null
+ ],
+ new DivElement()
+ ..classes = ['memberItem']
+ ..children = <Element>[
+ new DivElement()
+ ..classes = ['memberName']
+ ..text = 'malloc capacity memory',
+ new DivElement()
+ ..classes = ['memberValue']
+ ..text = _vm.mallocCapacity != null
+ ? Utils.formatSize(_vm.mallocCapacity)
+ : 'unavailable'
+ ..title = _vm.mallocCapacity != null
+ ? '${_vm.mallocCapacity} bytes'
: null
],
new DivElement()
@@ -189,12 +203,10 @@
..children = <Element>[
new DivElement()
..classes = ['memberName']
- ..text = 'malloc allocation count',
+ ..text = 'malloc implementation',
new DivElement()
..classes = ['memberValue']
- ..text = _vm.heapAllocationCount != null
- ? '${_vm.heapAllocationCount}'
- : 'unavailable'
+ ..text = _vm.mallocImplementation
],
new DivElement()
..classes = ['memberItem']
diff --git a/runtime/observatory_2/lib/src/models/objects/vm.dart b/runtime/observatory_2/lib/src/models/objects/vm.dart
index b69d744..2cfdd75 100644
--- a/runtime/observatory_2/lib/src/models/objects/vm.dart
+++ b/runtime/observatory_2/lib/src/models/objects/vm.dart
@@ -35,10 +35,9 @@
int get pid;
/// The current amount of native heap allocated memory within the VM.
- int get heapAllocatedMemoryUsage;
-
- /// The current number of allocations on the native heap within the VM.
- int get heapAllocationCount;
+ int get mallocUsed;
+ int get mallocCapacity;
+ String get mallocImplementation;
int get currentMemory;
int get maxRSS;
diff --git a/runtime/observatory_2/lib/src/models/repositories/strongly_reachable_instances.dart b/runtime/observatory_2/lib/src/models/repositories/strongly_reachable_instances.dart
index c0449f8..195948a 100644
--- a/runtime/observatory_2/lib/src/models/repositories/strongly_reachable_instances.dart
+++ b/runtime/observatory_2/lib/src/models/repositories/strongly_reachable_instances.dart
@@ -6,4 +6,6 @@
abstract class StronglyReachableInstancesRepository {
Future<InstanceSet> get(IsolateRef isolate, ClassRef cls, {int limit: 100});
+ Future<Guarded<InstanceRef>> getAsArray(IsolateRef isolate, ClassRef cls,
+ {bool includeSubclasses: false, includeImplementors: false});
}
diff --git a/runtime/observatory_2/lib/src/repositories/strongly_reachable_instances.dart b/runtime/observatory_2/lib/src/repositories/strongly_reachable_instances.dart
index a015928..8083ea7 100644
--- a/runtime/observatory_2/lib/src/repositories/strongly_reachable_instances.dart
+++ b/runtime/observatory_2/lib/src/repositories/strongly_reachable_instances.dart
@@ -15,4 +15,18 @@
assert(limit != null);
return (await isolate.getInstances(cls, limit)) as S.InstanceSet;
}
+
+ Future<M.Guarded<M.InstanceRef>> getAsArray(M.IsolateRef i, M.ClassRef c,
+ {bool includeSubclasses: false, includeImplementors: false}) async {
+ S.Isolate isolate = i as S.Isolate;
+ S.Class cls = c as S.Class;
+ assert(isolate != null);
+ assert(cls != null);
+ final response = await isolate.invokeRpc('_getInstancesAsArray', {
+ 'objectId': cls.id,
+ 'includeSubclasses': includeSubclasses == true,
+ 'includeImplementors': includeImplementors == true,
+ });
+ return new S.Guarded<S.Instance>(response);
+ }
}
diff --git a/runtime/observatory_2/lib/src/service/object.dart b/runtime/observatory_2/lib/src/service/object.dart
index 743ab24..e2acf8a 100644
--- a/runtime/observatory_2/lib/src/service/object.dart
+++ b/runtime/observatory_2/lib/src/service/object.dart
@@ -681,8 +681,9 @@
bool typeChecksEnabled = false;
int nativeZoneMemoryUsage = 0;
int pid = 0;
- int heapAllocatedMemoryUsage = 0;
- int heapAllocationCount = 0;
+ int mallocUsed = 0;
+ int mallocCapacity = 0;
+ String mallocImplementation = 'unknown';
int currentMemory;
int maxRSS;
int currentRSS;
@@ -1044,8 +1045,9 @@
nativeZoneMemoryUsage = map['_nativeZoneMemoryUsage'];
}
pid = map['pid'];
- heapAllocatedMemoryUsage = map['_heapAllocatedMemoryUsage'];
- heapAllocationCount = map['_heapAllocationCount'];
+ mallocUsed = map['_mallocUsed'];
+ mallocCapacity = map['_mallocCapacity'];
+ mallocImplementation = map['_mallocImplementation'];
embedder = map['_embedder'];
currentMemory = map['_currentMemory'];
maxRSS = map['_maxRSS'];
diff --git a/runtime/observatory_2/tests/service_2/get_instances_as_array_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_instances_as_array_rpc_test.dart
new file mode 100644
index 0000000..f87d897
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/get_instances_as_array_rpc_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:observatory_2/service_io.dart";
+import "package:test/test.dart";
+
+import "test_helper.dart";
+
+class Class {}
+
+class Subclass extends Class {}
+
+class Implementor implements Class {}
+
+@pragma("vm:entry-point")
+var aClass;
+@pragma("vm:entry-point")
+var aSubclass;
+@pragma("vm:entry-point")
+var anImplementor;
+
+@pragma("vm:entry-point")
+allocate() {
+ aClass = new Class();
+ aSubclass = new Subclass();
+ anImplementor = new Implementor();
+}
+
+var tests = <IsolateTest>[
+ (Isolate isolate) async {
+ invoke(String selector) async {
+ Map params = {
+ "targetId": isolate.rootLibrary.id,
+ "selector": selector,
+ "argumentIds": <String>[],
+ };
+ return await isolate.invokeRpcNoUpgrade("invoke", params);
+ }
+
+ Future<int> instanceCount(String className,
+ {bool includeSubclasses: false,
+ bool includeImplementors: false}) async {
+ Map params = {
+ "objectId": isolate.rootLibrary.classes
+ .singleWhere((cls) => cls.name == className)
+ .id,
+ "includeSubclasses": includeSubclasses,
+ "includeImplementors": includeImplementors,
+ };
+ var result =
+ await isolate.invokeRpcNoUpgrade("_getInstancesAsArray", params);
+ expect(result["type"], equals("@Instance"));
+ expect(result["kind"], equals("List"));
+ return result["length"] as int;
+ }
+
+ await isolate.rootLibrary.load();
+
+ expect(await instanceCount("Class"), equals(0));
+ expect(await instanceCount("Class", includeSubclasses: true), equals(0));
+ expect(await instanceCount("Class", includeImplementors: true), equals(0));
+
+ await invoke("allocate");
+
+ expect(await instanceCount("Class"), equals(1));
+ expect(await instanceCount("Class", includeSubclasses: true), equals(2));
+ expect(await instanceCount("Class", includeImplementors: true), equals(3));
+ },
+];
+
+main(args) async => runIsolateTests(args, tests);
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index 9d5ad54..5ef0df1 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -125,6 +125,20 @@
trace_allocation_table_.load()[cid] = trace ? 1 : 0;
}
bool TraceAllocationFor(intptr_t cid);
+ void SetCollectInstancesFor(intptr_t cid, bool trace) {
+ ASSERT(cid > 0);
+ ASSERT(cid < top_);
+ if (trace) {
+ trace_allocation_table_.load()[cid] |= 2;
+ } else {
+ trace_allocation_table_.load()[cid] &= ~2;
+ }
+ }
+ bool CollectInstancesFor(intptr_t cid) {
+ ASSERT(cid > 0);
+ ASSERT(cid < top_);
+ return (trace_allocation_table_.load()[cid] & 2) != 0;
+ }
#endif // !defined(PRODUCT)
void CopyBeforeHotReload(intptr_t** copy, intptr_t* copy_num_cids) {
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index e638bf2..0ad8406 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -2407,10 +2407,6 @@
while (it.HasNext()) {
cls = it.GetNextClass();
- // The subclasses/implementors array is only needed for CHA.
- cls.ClearDirectSubclasses();
- cls.ClearDirectImplementors();
-
bool retain = false;
members = cls.fields();
if (members.Length() > 0) {
@@ -2563,6 +2559,12 @@
void Precompiler::DropClasses() {
Class& cls = Class::Handle(Z);
Array& constants = Array::Handle(Z);
+ GrowableObjectArray& implementors = GrowableObjectArray::Handle(Z);
+ GrowableObjectArray& retained_implementors = GrowableObjectArray::Handle(Z);
+ Class& implementor = Class::Handle(Z);
+ GrowableObjectArray& subclasses = GrowableObjectArray::Handle(Z);
+ GrowableObjectArray& retained_subclasses = GrowableObjectArray::Handle(Z);
+ Class& subclass = Class::Handle(Z);
// We are about to remove classes from the class table. For this to be safe,
// there must be no instances of these classes on the heap, not even
@@ -2572,6 +2574,7 @@
IG->heap()->CollectAllGarbage();
IG->heap()->WaitForSweeperTasks(T);
+ SafepointWriteRwLocker ml(T, IG->program_lock());
ClassTable* class_table = IG->class_table();
intptr_t num_cids = class_table->NumCids();
@@ -2590,6 +2593,30 @@
cls = class_table->At(cid);
ASSERT(!cls.IsNull());
+ implementors = cls.direct_implementors();
+ if (!implementors.IsNull()) {
+ retained_implementors = GrowableObjectArray::New();
+ for (intptr_t i = 0; i < implementors.Length(); i++) {
+ implementor ^= implementors.At(i);
+ if (classes_to_retain_.HasKey(&implementor)) {
+ retained_implementors.Add(implementor);
+ }
+ }
+ cls.set_direct_implementors(retained_implementors);
+ }
+
+ subclasses = cls.direct_subclasses();
+ if (!subclasses.IsNull()) {
+ retained_subclasses = GrowableObjectArray::New();
+ for (intptr_t i = 0; i < subclasses.Length(); i++) {
+ subclass ^= subclasses.At(i);
+ if (classes_to_retain_.HasKey(&subclass)) {
+ retained_subclasses.Add(subclass);
+ }
+ }
+ cls.set_direct_subclasses(retained_subclasses);
+ }
+
if (cls.IsTopLevel()) {
// Top-level classes are referenced directly from their library. They
// will only be removed as a consequence of an entire library being
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 1ba1c36..868e0e2 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -1190,13 +1190,11 @@
}
void ConstantPropagator::VisitBoxInt64(BoxInt64Instr* instr) {
- // TODO(kmillikin): Handle box operation.
- SetValue(instr, non_constant_);
+ VisitBox(instr);
}
void ConstantPropagator::VisitUnboxInt64(UnboxInt64Instr* instr) {
- // TODO(kmillikin): Handle unbox operation.
- SetValue(instr, non_constant_);
+ VisitUnbox(instr);
}
void ConstantPropagator::VisitUnaryIntegerOp(UnaryIntegerOpInstr* unary_op) {
@@ -1408,38 +1406,46 @@
}
void ConstantPropagator::VisitUnbox(UnboxInstr* instr) {
- // TODO(kmillikin): Handle conversion.
- SetValue(instr, non_constant_);
+ const Object& value = instr->value()->definition()->constant_value();
+ if (IsUnknown(value)) {
+ return;
+ }
+
+ SetValue(instr, value);
}
void ConstantPropagator::VisitBox(BoxInstr* instr) {
- // TODO(kmillikin): Handle conversion.
- SetValue(instr, non_constant_);
+ const Object& value = instr->value()->definition()->constant_value();
+ if (IsUnknown(value)) {
+ return;
+ }
+
+ if (instr->value()->definition()->representation() ==
+ instr->from_representation()) {
+ SetValue(instr, value);
+ } else {
+ SetValue(instr, non_constant_);
+ }
}
void ConstantPropagator::VisitBoxUint8(BoxUint8Instr* instr) {
- // TODO(kmillikin): Handle box operation.
- SetValue(instr, non_constant_);
+ VisitBox(instr);
}
void ConstantPropagator::VisitBoxUint32(BoxUint32Instr* instr) {
- // TODO(kmillikin): Handle box operation.
- SetValue(instr, non_constant_);
+ VisitBox(instr);
}
void ConstantPropagator::VisitUnboxUint32(UnboxUint32Instr* instr) {
- // TODO(kmillikin): Handle unbox operation.
- SetValue(instr, non_constant_);
+ VisitUnbox(instr);
}
void ConstantPropagator::VisitBoxInt32(BoxInt32Instr* instr) {
- // TODO(kmillikin): Handle box operation.
- SetValue(instr, non_constant_);
+ VisitBox(instr);
}
void ConstantPropagator::VisitUnboxInt32(UnboxInt32Instr* instr) {
- // TODO(kmillikin): Handle unbox operation.
- SetValue(instr, non_constant_);
+ VisitUnbox(instr);
}
void ConstantPropagator::VisitIntConverter(IntConverterInstr* instr) {
diff --git a/runtime/vm/compiler/backend/constant_propagator_test.cc b/runtime/vm/compiler/backend/constant_propagator_test.cc
index 5265ea0..de14881 100644
--- a/runtime/vm/compiler/backend/constant_propagator_test.cc
+++ b/runtime/vm/compiler/backend/constant_propagator_test.cc
@@ -5,6 +5,7 @@
#include "vm/compiler/backend/constant_propagator.h"
#include "vm/compiler/backend/block_builder.h"
+#include "vm/compiler/backend/il_printer.h"
#include "vm/compiler/backend/il_test_helper.h"
#include "vm/compiler/backend/type_propagator.h"
#include "vm/unit_test.h"
@@ -80,7 +81,9 @@
// To disable copying we mark graph to disable LICM.
H.flow_graph()->disallow_licm();
+ FlowGraphPrinter::PrintGraph("Before ConstantPropagator", H.flow_graph());
ConstantPropagator::Optimize(H.flow_graph());
+ FlowGraphPrinter::PrintGraph("After ConstantPropagator", H.flow_graph());
auto& blocks = H.flow_graph()->reverse_postorder();
EXPECT_EQ(2, blocks.length());
@@ -188,20 +191,27 @@
}
H.FinishGraph();
+ FlowGraphPrinter::PrintGraph("Before Optimization", H.flow_graph());
FlowGraphTypePropagator::Propagate(H.flow_graph());
+ FlowGraphPrinter::PrintGraph("After Propagate", H.flow_graph());
// Force phi unboxing independent of heuristics.
v1->set_representation(op->representation());
H.flow_graph()->SelectRepresentations();
+ FlowGraphPrinter::PrintGraph("After SelectRepresentations", H.flow_graph());
H.flow_graph()->Canonicalize();
- EXPECT_PROPERTY(ret->value()->definition(),
- it.IsBoxInteger() && it.RequiredInputRepresentation(0) ==
- op->representation());
+ FlowGraphPrinter::PrintGraph("After Canonicalize", H.flow_graph());
+ if (!expected.should_fold) {
+ EXPECT_PROPERTY(ret->value()->definition(),
+ it.IsBoxInteger() && it.RequiredInputRepresentation(0) ==
+ op->representation());
+ }
ConstantPropagator::Optimize(H.flow_graph());
+ FlowGraphPrinter::PrintGraph("After ConstantPropagator", H.flow_graph());
// If |should_fold| then check that resulting graph is
//
- // Return(Box(Unbox(Constant(result))))
+ // Return(Constant(result))
//
// otherwise check that the graph is
//
@@ -209,21 +219,16 @@
//
{
auto ret_val = ret->value()->definition();
- EXPECT_PROPERTY(
- ret_val, it.IsBoxInteger() &&
- it.RequiredInputRepresentation(0) == op->representation());
- auto boxed_value = ret_val->AsBoxInteger()->value()->definition();
if (expected.should_fold) {
- EXPECT_PROPERTY(
- boxed_value,
- it.IsUnboxInteger() && it.representation() == op->representation());
- auto unboxed_value = boxed_value->AsUnboxInteger()->value()->definition();
- EXPECT_PROPERTY(unboxed_value,
- it.IsConstant() && it.AsConstant()->value().IsInteger());
- EXPECT_EQ(
- expected.result,
- Integer::Cast(unboxed_value->AsConstant()->value()).AsInt64Value());
+ EXPECT_PROPERTY(ret_val,
+ it.IsConstant() && it.representation() == kTagged);
+ EXPECT_EQ(expected.result,
+ Integer::Cast(ret_val->AsConstant()->value()).AsInt64Value());
} else {
+ EXPECT_PROPERTY(ret_val,
+ it.IsBoxInteger() && it.RequiredInputRepresentation(0) ==
+ op->representation());
+ auto boxed_value = ret_val->AsBoxInteger()->value()->definition();
EXPECT_PROPERTY(boxed_value, &it == op);
}
}
diff --git a/runtime/vm/compiler/backend/flow_graph_checker.cc b/runtime/vm/compiler/backend/flow_graph_checker.cc
index 162fdd3..140ee55 100644
--- a/runtime/vm/compiler/backend/flow_graph_checker.cc
+++ b/runtime/vm/compiler/backend/flow_graph_checker.cc
@@ -19,6 +19,21 @@
250,
"Definition count threshold for extensive instruction checks");
+#define ASSERT1(cond, ctxt1) \
+ do { \
+ if (!(cond)) \
+ dart::Assert(__FILE__, __LINE__) \
+ .Fail("expected: %s (%s=%s)", #cond, #ctxt1, (ctxt1)->ToCString()); \
+ } while (false)
+
+#define ASSERT2(cond, ctxt1, ctxt2) \
+ do { \
+ if (!(cond)) \
+ dart::Assert(__FILE__, __LINE__) \
+ .Fail("expected: %s (%s=%s, %s=%s)", #cond, #ctxt1, \
+ (ctxt1)->ToCString(), #ctxt2, (ctxt2)->ToCString()); \
+ } while (false)
+
// Returns true for the "optimized out" and "null" constant.
// Such constants reside outside the IR in the sense that
// succ/pred/block links are not maintained.
@@ -121,15 +136,16 @@
// Some calls (e.g. closure calls) have more inputs than actual arguments.
// Those extra inputs will be consumed from the stack before the call.
const intptr_t after_args_input_count = call->env()->LazyDeoptPruneCount();
- ASSERT((arg_count + after_args_input_count) <= env_count);
+ ASSERT1((arg_count + after_args_input_count) <= env_count, call);
const intptr_t env_base = env_count - arg_count - after_args_input_count;
for (intptr_t i = 0; i < arg_count; i++) {
if (call->HasPushArguments()) {
- ASSERT(call->ArgumentAt(i) == env->ValueAt(env_base + i)
- ->definition()
- ->AsPushArgument()
- ->value()
- ->definition());
+ ASSERT1(call->ArgumentAt(i) == env->ValueAt(env_base + i)
+ ->definition()
+ ->AsPushArgument()
+ ->value()
+ ->definition(),
+ call);
} else {
// Redefintion instructions and boxing/unboxing are inserted
// without updating environment uses (FlowGraph::RenameDominatedUses,
@@ -142,10 +158,11 @@
env->ValueAt(env_base + i)
->definition()
->OriginalDefinitionIgnoreBoxingAndConstraints();
- ASSERT((arg_def == env_def) ||
- (arg_def->IsConstant() && env_def->IsConstant() &&
- arg_def->AsConstant()->value().ptr() ==
- env_def->AsConstant()->value().ptr()));
+ ASSERT2((arg_def == env_def) ||
+ (arg_def->IsConstant() && env_def->IsConstant() &&
+ arg_def->AsConstant()->value().ptr() ==
+ env_def->AsConstant()->value().ptr()),
+ arg_def, env_def);
}
}
}
@@ -172,26 +189,26 @@
for (BlockIterator it = flow_graph_->reverse_postorder_iterator(); !it.Done();
it.Advance()) {
BlockEntryInstr* block = it.Current();
- ASSERT(block->block_id() <= max_block_id);
+ ASSERT1(block->block_id() <= max_block_id, block);
// Make sure ordering is consistent.
- ASSERT(block->preorder_number() <= block_count);
- ASSERT(block->postorder_number() <= block_count);
- ASSERT(preorder[block->preorder_number()] == block);
- ASSERT(postorder[block->postorder_number()] == block);
+ ASSERT1(block->preorder_number() <= block_count, block);
+ ASSERT1(block->postorder_number() <= block_count, block);
+ ASSERT1(preorder[block->preorder_number()] == block, block);
+ ASSERT1(postorder[block->postorder_number()] == block, block);
// Make sure predecessors and successors agree.
Instruction* last = block->last_instruction();
for (intptr_t i = 0, n = last->SuccessorCount(); i < n; ++i) {
- ASSERT(IsPred(block, last->SuccessorAt(i)));
+ ASSERT1(IsPred(block, last->SuccessorAt(i)), block);
}
for (intptr_t i = 0, n = block->PredecessorCount(); i < n; ++i) {
- ASSERT(IsSucc(block, block->PredecessorAt(i)));
+ ASSERT1(IsSucc(block, block->PredecessorAt(i)), block);
}
// Make sure dominance relations agree.
for (intptr_t i = 0, n = block->dominated_blocks().length(); i < n; ++i) {
- ASSERT(block->dominated_blocks()[i]->dominator() == block);
+ ASSERT1(block->dominated_blocks()[i]->dominator() == block, block);
}
if (block->dominator() != nullptr) {
- ASSERT(IsDirectlyDominated(block, block->dominator()));
+ ASSERT1(IsDirectlyDominated(block, block->dominator()), block);
}
// Visit all instructions in this block.
VisitInstructions(block);
@@ -211,15 +228,16 @@
if (auto entry = block->AsBlockEntryWithInitialDefs()) {
for (auto def : *entry->initial_definitions()) {
ASSERT(def != nullptr);
- ASSERT(def->IsConstant() || def->IsParameter() ||
- def->IsSpecialParameter());
+ ASSERT1(
+ def->IsConstant() || def->IsParameter() || def->IsSpecialParameter(),
+ def);
// Special constants reside outside the IR.
if (IsSpecialConstant(def)) continue;
// Make sure block lookup agrees.
- ASSERT(def->GetBlock() == entry);
+ ASSERT1(def->GetBlock() == entry, def);
// Initial definitions are partially linked into graph.
- ASSERT(def->next() == nullptr);
- ASSERT(def->previous() == entry);
+ ASSERT1(def->next() == nullptr, def);
+ ASSERT1(def->previous() == entry, def);
// Visit the initial definition as instruction.
VisitInstruction(def);
}
@@ -229,30 +247,30 @@
for (PhiIterator it(entry); !it.Done(); it.Advance()) {
PhiInstr* phi = it.Current();
// Make sure block lookup agrees.
- ASSERT(phi->GetBlock() == entry);
+ ASSERT1(phi->GetBlock() == entry, phi);
// Phis are never linked into graph.
- ASSERT(phi->next() == nullptr);
- ASSERT(phi->previous() == nullptr);
+ ASSERT1(phi->next() == nullptr, phi);
+ ASSERT1(phi->previous() == nullptr, phi);
// Visit the phi as instruction.
VisitInstruction(phi);
}
}
// Visit regular instructions.
Instruction* last = block->last_instruction();
- ASSERT((last == block) == block->IsGraphEntry());
+ ASSERT1((last == block) == block->IsGraphEntry(), block);
Instruction* prev = block;
ASSERT(prev->previous() == nullptr);
for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
Instruction* instruction = it.Current();
// Make sure block lookup agrees (scan in scan).
- ASSERT(instruction->GetBlock() == block);
+ ASSERT1(instruction->GetBlock() == block, instruction);
// Make sure linked list agrees.
- ASSERT(prev->next() == instruction);
- ASSERT(instruction->previous() == prev);
+ ASSERT1(prev->next() == instruction, instruction);
+ ASSERT1(instruction->previous() == prev, instruction);
prev = instruction;
// Make sure control flow makes sense.
- ASSERT(IsControlFlow(instruction) == (instruction == last));
- ASSERT(!instruction->IsPhi());
+ ASSERT1(IsControlFlow(instruction) == (instruction == last), instruction);
+ ASSERT1(!instruction->IsPhi(), instruction);
// Visit the instruction.
VisitInstruction(instruction);
}
@@ -262,19 +280,20 @@
if (flow_graph_->loop_hierarchy_ != nullptr) {
for (LoopInfo* loop = block->loop_info(); loop != nullptr;
loop = loop->outer()) {
- ASSERT(loop->Contains(block));
+ ASSERT1(loop->Contains(block), block);
}
}
}
void FlowGraphChecker::VisitInstruction(Instruction* instruction) {
- ASSERT(!instruction->IsBlockEntry());
+ ASSERT1(!instruction->IsBlockEntry(), instruction);
#if !defined(DART_PRECOMPILER)
// In JIT mode, any instruction which may throw must have a deopt-id, except
// tail-call because it replaces the stack frame.
- ASSERT(!instruction->MayThrow() || instruction->IsTailCall() ||
- instruction->deopt_id() != DeoptId::kNone);
+ ASSERT1(!instruction->MayThrow() || instruction->IsTailCall() ||
+ instruction->deopt_id() != DeoptId::kNone,
+ instruction);
#endif // !defined(DART_PRECOMPILER)
// If checking token positions and the flow graph has an inlining ID,
@@ -283,7 +302,7 @@
if (FLAG_check_token_positions && flow_graph_->inlining_id() >= 0) {
const TokenPosition& pos = instruction->token_pos();
if (pos.IsReal() || pos.IsSynthetic()) {
- ASSERT(instruction->has_inlining_id());
+ ASSERT1(instruction->has_inlining_id(), instruction);
const intptr_t inlining_id = instruction->inlining_id();
const auto& function = *inline_id_to_function_[inlining_id];
if (function.end_token_pos().IsReal() &&
@@ -336,9 +355,9 @@
// Used definitions must have an SSA name, and the SSA name must
// be less than the current_ssa_temp_index.
if (def->HasSSATemp()) {
- ASSERT(def->ssa_temp_index() < flow_graph_->current_ssa_temp_index());
+ ASSERT1(def->ssa_temp_index() < flow_graph_->current_ssa_temp_index(), def);
} else {
- ASSERT(def->input_use_list() == nullptr);
+ ASSERT1(def->input_use_list() == nullptr, def);
}
// Check all regular uses.
Value* prev = nullptr;
@@ -360,36 +379,38 @@
Value* use,
intptr_t index,
bool is_env) {
- ASSERT(use->instruction() == instruction);
- ASSERT(use->use_index() == index);
+ ASSERT2(use->instruction() == instruction, use, instruction);
+ ASSERT1(use->use_index() == index, use);
// Get definition.
Definition* def = use->definition();
ASSERT(def != nullptr);
- ASSERT(def != instruction || def->IsPhi() || def->IsMaterializeObject());
+ ASSERT1(def != instruction || def->IsPhi() || def->IsMaterializeObject(),
+ def);
// Make sure each input is properly defined in the graph by something
// that dominates the input (note that the proper dominance relation
// on the input values of Phis is checked by the Phi visitor below).
if (def->IsPhi()) {
- ASSERT(def->GetBlock()->IsJoinEntry());
+ ASSERT1(def->GetBlock()->IsJoinEntry(), def);
// Phis are never linked into graph.
- ASSERT(def->next() == nullptr);
- ASSERT(def->previous() == nullptr);
+ ASSERT1(def->next() == nullptr, def);
+ ASSERT1(def->previous() == nullptr, def);
} else if (def->IsConstant() || def->IsParameter() ||
def->IsSpecialParameter()) {
// Special constants reside outside the IR.
if (IsSpecialConstant(def)) return;
// Initial definitions are partially linked into graph, but some
// constants are fully linked into graph (so no next() assert).
- ASSERT(def->previous() != nullptr);
+ ASSERT1(def->previous() != nullptr, def);
} else {
// Others are fully linked into graph.
- ASSERT(def->next() != nullptr);
- ASSERT(def->previous() != nullptr);
+ ASSERT1(def->next() != nullptr, def);
+ ASSERT1(def->previous() != nullptr, def);
}
if (def->HasSSATemp()) {
- ASSERT(DefDominatesUse(def, instruction));
- ASSERT(IsInUseList(is_env ? def->env_use_list() : def->input_use_list(),
- instruction));
+ ASSERT2(DefDominatesUse(def, instruction), def, instruction);
+ ASSERT2(IsInUseList(is_env ? def->env_use_list() : def->input_use_list(),
+ instruction),
+ def, instruction);
}
}
@@ -397,41 +418,45 @@
Value* use,
Value* prev,
bool is_env) {
- ASSERT(use->definition() == def);
- ASSERT(use->previous_use() == prev);
+ ASSERT2(use->definition() == def, use, def);
+ ASSERT1(use->previous_use() == prev, use);
// Get using instruction.
Instruction* instruction = use->instruction();
ASSERT(instruction != nullptr);
- ASSERT(def != instruction || def->IsPhi() || def->IsMaterializeObject());
+ ASSERT1(def != instruction || def->IsPhi() || def->IsMaterializeObject(),
+ def);
if (is_env) {
- ASSERT(instruction->env()->ValueAtUseIndex(use->use_index()) == use);
+ ASSERT2(instruction->env()->ValueAtUseIndex(use->use_index()) == use,
+ instruction, use);
} else {
- ASSERT(instruction->InputAt(use->use_index()) == use);
+ ASSERT2(instruction->InputAt(use->use_index()) == use, instruction, use);
}
// Make sure the reaching type, if any, has an owner consistent with this use.
if (auto const type = use->reaching_type()) {
- ASSERT(type->owner() == nullptr || type->owner() == def);
+ ASSERT1(type->owner() == nullptr || type->owner() == def, use);
}
// Make sure each use appears in the graph and is properly dominated
// by the definition (note that the proper dominance relation on the
// input values of Phis is checked by the Phi visitor below).
if (instruction->IsPhi()) {
- ASSERT(instruction->AsPhi()->is_alive());
- ASSERT(instruction->GetBlock()->IsJoinEntry());
+ ASSERT1(instruction->AsPhi()->is_alive(), instruction);
+ ASSERT1(instruction->GetBlock()->IsJoinEntry(), instruction);
// Phis are never linked into graph.
- ASSERT(instruction->next() == nullptr);
- ASSERT(instruction->previous() == nullptr);
+ ASSERT1(instruction->next() == nullptr, instruction);
+ ASSERT1(instruction->previous() == nullptr, instruction);
} else if (instruction->IsBlockEntry()) {
// BlockEntry instructions have environments attached to them but
// have no reliable way to verify if they are still in the graph.
- ASSERT(is_env);
- ASSERT(instruction->next() != nullptr);
- ASSERT(DefDominatesUse(def, instruction));
+ ASSERT1(is_env, instruction);
+ ASSERT1(instruction->next() != nullptr, instruction);
+ ASSERT2(DefDominatesUse(def, instruction), def, instruction);
} else {
// Others are fully linked into graph.
- ASSERT(IsControlFlow(instruction) || instruction->next() != nullptr);
- ASSERT(instruction->previous() != nullptr);
- ASSERT(!def->HasSSATemp() || DefDominatesUse(def, instruction));
+ ASSERT1(IsControlFlow(instruction) || instruction->next() != nullptr,
+ instruction);
+ ASSERT1(instruction->previous() != nullptr, instruction);
+ ASSERT2(!def->HasSSATemp() || DefDominatesUse(def, instruction), def,
+ instruction);
}
}
@@ -454,29 +479,29 @@
void FlowGraphChecker::VisitPhi(PhiInstr* phi) {
// Make sure the definition of each input value of a Phi dominates
// the corresponding incoming edge, as defined by order.
- ASSERT(phi->InputCount() == current_block_->PredecessorCount());
+ ASSERT1(phi->InputCount() == current_block_->PredecessorCount(), phi);
for (intptr_t i = 0, n = phi->InputCount(); i < n; ++i) {
Definition* def = phi->InputAt(i)->definition();
- ASSERT(def->HasSSATemp()); // phis have SSA defs
+ ASSERT1(def->HasSSATemp(), def); // phis have SSA defs
BlockEntryInstr* edge = current_block_->PredecessorAt(i);
- ASSERT(DefDominatesUse(def, edge->last_instruction()));
+ ASSERT1(DefDominatesUse(def, edge->last_instruction()), def);
}
}
void FlowGraphChecker::VisitGoto(GotoInstr* jmp) {
- ASSERT(jmp->SuccessorCount() == 1);
+ ASSERT1(jmp->SuccessorCount() == 1, jmp);
}
void FlowGraphChecker::VisitIndirectGoto(IndirectGotoInstr* jmp) {
- ASSERT(jmp->SuccessorCount() >= 1);
+ ASSERT1(jmp->SuccessorCount() >= 1, jmp);
}
void FlowGraphChecker::VisitBranch(BranchInstr* branch) {
- ASSERT(branch->SuccessorCount() == 2);
+ ASSERT1(branch->SuccessorCount() == 2, branch);
}
void FlowGraphChecker::VisitRedefinition(RedefinitionInstr* def) {
- ASSERT(def->value()->definition() != def);
+ ASSERT1(def->value()->definition() != def, def);
}
void FlowGraphChecker::VisitClosureCall(ClosureCallInstr* call) {
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 74532bb..777e394 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -658,11 +658,11 @@
return FinalizeHash(result, kBitsPerInt32 - 1);
}
-bool Instruction::Equals(Instruction* other) const {
- if (tag() != other->tag()) return false;
- if (InputCount() != other->InputCount()) return false;
+bool Instruction::Equals(const Instruction& other) const {
+ if (tag() != other.tag()) return false;
+ if (InputCount() != other.InputCount()) return false;
for (intptr_t i = 0; i < InputCount(); ++i) {
- if (!InputAt(i)->Equals(other->InputAt(i))) return false;
+ if (!InputAt(i)->Equals(*other.InputAt(i))) return false;
}
return AttributesEqual(other);
}
@@ -672,8 +672,8 @@
UNREACHABLE();
}
-bool Value::Equals(Value* other) const {
- return definition() == other->definition();
+bool Value::Equals(const Value& other) const {
+ return definition() == other.definition();
}
static int OrderById(CidRange* const* a, CidRange* const* b) {
@@ -897,8 +897,8 @@
cids[0].cid_start != kSmiCid);
}
-bool CheckClassInstr::AttributesEqual(Instruction* other) const {
- CheckClassInstr* other_check = other->AsCheckClass();
+bool CheckClassInstr::AttributesEqual(const Instruction& other) const {
+ auto const other_check = other.AsCheckClass();
ASSERT(other_check != NULL);
return cids().Equals(other_check->cids());
}
@@ -1057,16 +1057,16 @@
return this;
}
-bool GuardFieldClassInstr::AttributesEqual(Instruction* other) const {
- return field().ptr() == other->AsGuardFieldClass()->field().ptr();
+bool GuardFieldClassInstr::AttributesEqual(const Instruction& other) const {
+ return field().ptr() == other.AsGuardFieldClass()->field().ptr();
}
-bool GuardFieldLengthInstr::AttributesEqual(Instruction* other) const {
- return field().ptr() == other->AsGuardFieldLength()->field().ptr();
+bool GuardFieldLengthInstr::AttributesEqual(const Instruction& other) const {
+ return field().ptr() == other.AsGuardFieldLength()->field().ptr();
}
-bool GuardFieldTypeInstr::AttributesEqual(Instruction* other) const {
- return field().ptr() == other->AsGuardFieldType()->field().ptr();
+bool GuardFieldTypeInstr::AttributesEqual(const Instruction& other) const {
+ return field().ptr() == other.AsGuardFieldType()->field().ptr();
}
Instruction* AssertSubtypeInstr::Canonicalize(FlowGraph* flow_graph) {
@@ -1102,37 +1102,37 @@
return this;
}
-bool StrictCompareInstr::AttributesEqual(Instruction* other) const {
- StrictCompareInstr* other_op = other->AsStrictCompare();
+bool StrictCompareInstr::AttributesEqual(const Instruction& other) const {
+ auto const other_op = other.AsStrictCompare();
ASSERT(other_op != NULL);
return ComparisonInstr::AttributesEqual(other) &&
(needs_number_check() == other_op->needs_number_check());
}
-bool MathMinMaxInstr::AttributesEqual(Instruction* other) const {
- MathMinMaxInstr* other_op = other->AsMathMinMax();
+bool MathMinMaxInstr::AttributesEqual(const Instruction& other) const {
+ auto const other_op = other.AsMathMinMax();
ASSERT(other_op != NULL);
return (op_kind() == other_op->op_kind()) &&
(result_cid() == other_op->result_cid());
}
-bool BinaryIntegerOpInstr::AttributesEqual(Instruction* other) const {
- ASSERT(other->tag() == tag());
- BinaryIntegerOpInstr* other_op = other->AsBinaryIntegerOp();
+bool BinaryIntegerOpInstr::AttributesEqual(const Instruction& other) const {
+ ASSERT(other.tag() == tag());
+ auto const other_op = other.AsBinaryIntegerOp();
return (op_kind() == other_op->op_kind()) &&
(can_overflow() == other_op->can_overflow()) &&
(is_truncating() == other_op->is_truncating());
}
-bool LoadFieldInstr::AttributesEqual(Instruction* other) const {
- LoadFieldInstr* other_load = other->AsLoadField();
+bool LoadFieldInstr::AttributesEqual(const Instruction& other) const {
+ auto const other_load = other.AsLoadField();
ASSERT(other_load != NULL);
return &this->slot_ == &other_load->slot_;
}
-bool LoadStaticFieldInstr::AttributesEqual(Instruction* other) const {
+bool LoadStaticFieldInstr::AttributesEqual(const Instruction& other) const {
ASSERT(AllowsCSE());
- return field().ptr() == other->AsLoadStaticField()->field().ptr();
+ return field().ptr() == other.AsLoadStaticField()->field().ptr();
}
bool LoadStaticFieldInstr::IsFieldInitialized(Instance* field_value) const {
@@ -1218,8 +1218,8 @@
#endif
}
-bool ConstantInstr::AttributesEqual(Instruction* other) const {
- ConstantInstr* other_constant = other->AsConstant();
+bool ConstantInstr::AttributesEqual(const Instruction& other) const {
+ auto const other_constant = other.AsConstant();
ASSERT(other_constant != NULL);
return (value().ptr() == other_constant->value().ptr() &&
representation() == other_constant->representation());
@@ -3778,8 +3778,8 @@
return (!value()->Type()->is_nullable()) ? value()->definition() : this;
}
-bool CheckNullInstr::AttributesEqual(Instruction* other) const {
- CheckNullInstr* other_check = other->AsCheckNull();
+bool CheckNullInstr::AttributesEqual(const Instruction& other) const {
+ auto const other_check = other.AsCheckNull();
ASSERT(other_check != nullptr);
return function_name().Equals(other_check->function_name()) &&
exception_type() == other_check->exception_type();
@@ -5798,8 +5798,8 @@
deopt_id());
}
-bool TestCidsInstr::AttributesEqual(Instruction* other) const {
- TestCidsInstr* other_instr = other->AsTestCids();
+bool TestCidsInstr::AttributesEqual(const Instruction& other) const {
+ auto const other_instr = other.AsTestCids();
if (!ComparisonInstr::AttributesEqual(other)) {
return false;
}
@@ -5851,8 +5851,9 @@
bool look_for_redefinition = false;
for (intptr_t i = 1; i < InputCount(); ++i) {
Definition* def = InputAt(i)->definition();
- if (def != first) {
- if (def->OriginalDefinition() != first_origin) return nullptr;
+ if ((def != first) && (def != this)) {
+ Definition* origin = def->OriginalDefinition();
+ if ((origin != first_origin) && (origin != this)) return nullptr;
look_for_redefinition = true;
}
}
@@ -5865,7 +5866,7 @@
bool found = false;
do {
Definition* def = value->definition();
- if (def == redef) {
+ if ((def == redef) || (def == this)) {
found = true;
break;
}
@@ -5973,7 +5974,8 @@
if (create_array == nullptr) {
// Do not try to fold interpolate if array is an OSR argument.
ASSERT(flow_graph->IsCompiledForOsr());
- ASSERT(value()->definition()->IsPhi());
+ ASSERT(value()->definition()->IsPhi() ||
+ value()->definition()->IsParameter());
return this;
}
// Check if the string interpolation has only constant inputs.
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index c4ff302..3ffd151 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -171,7 +171,7 @@
// in the same chain of redefinitions.
bool NeedsWriteBarrier();
- bool Equals(Value* other) const;
+ bool Equals(const Value& other) const;
// Returns true if this |Value| can evaluate to the given |value| during
// execution.
@@ -1083,12 +1083,12 @@
// 1. They have the same tag.
// 2. All input operands are Equals.
// 3. They satisfy AttributesEqual.
- bool Equals(Instruction* other) const;
+ bool Equals(const Instruction& other) const;
// Compare attributes of a instructions (except input operands and tag).
// All instructions that participate in CSE have to override this function.
// This function can assume that the argument has the same type as this.
- virtual bool AttributesEqual(Instruction* other) const {
+ virtual bool AttributesEqual(const Instruction& other) const {
UNREACHABLE();
return false;
}
@@ -2692,8 +2692,8 @@
virtual bool ComputeCanDeoptimize() const { return false; }
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
- return other->AsStoreIndexedUnsafe()->offset() == offset();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsStoreIndexedUnsafe()->offset() == offset();
}
Value* index() const { return inputs_[kIndexPos]; }
@@ -2741,8 +2741,8 @@
virtual bool ComputeCanDeoptimize() const { return false; }
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
- return other->AsLoadIndexedUnsafe()->offset() == offset();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsLoadIndexedUnsafe()->offset() == offset();
}
virtual Representation representation() const { return representation_; }
@@ -2801,7 +2801,7 @@
virtual bool ComputeCanDeoptimize() const { return false; }
virtual bool HasUnknownSideEffects() const { return true; }
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
Value* src() const { return inputs_[kSrcPos]; }
Value* dest() const { return inputs_[kDestPos]; }
@@ -2872,8 +2872,8 @@
// Two tailcalls can be canonicalized into one instruction if both have the
// same destination.
virtual bool AllowsCSE() const { return true; }
- virtual bool AttributesEqual(Instruction* other) const {
- return &other->AsTailCall()->code() == &code();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return &other.AsTailCall()->code() == &code();
}
// Since no code after this instruction will be executed, there will be no
@@ -2967,8 +2967,8 @@
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
- auto other_return = other->AsReturn();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_return = other.AsReturn();
return token_pos() == other_return->token_pos() &&
yield_index() == other_return->yield_index();
}
@@ -3268,13 +3268,12 @@
virtual bool CanBecomeDeoptimizationTarget() const { return true; }
virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
- virtual bool AttributesEqual(Instruction* other) const {
- ComparisonInstr* other_comparison = other->AsComparison();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_comparison = other.AsComparison();
return kind() == other_comparison->kind() &&
(operation_cid() == other_comparison->operation_cid());
}
-
DEFINE_INSTRUCTION_TYPE_CHECK(Comparison)
protected:
@@ -3433,7 +3432,7 @@
virtual bool ComputeCanDeoptimize() const { return true; }
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
DECLARE_INSTRUCTION(Deoptimize)
@@ -3512,7 +3511,7 @@
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
+ virtual bool AttributesEqual(const Instruction& other) const {
UNREACHABLE();
return false;
}
@@ -3556,7 +3555,7 @@
virtual void InferRange(RangeAnalysis* analysis, Range* range);
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
virtual TokenPosition token_pos() const { return token_pos_; }
@@ -3647,7 +3646,7 @@
virtual Instruction* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
PRINT_OPERANDS_TO_SUPPORT
@@ -3739,7 +3738,7 @@
virtual Definition* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
virtual Value* RedefinedValue() const;
@@ -3778,7 +3777,7 @@
virtual Definition* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
virtual Value* RedefinedValue() const;
@@ -3829,8 +3828,8 @@
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
- return kind() == other->AsSpecialParameter()->kind();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return kind() == other.AsSpecialParameter()->kind();
}
SpecialParameterKind kind() const { return kind_; }
@@ -4409,7 +4408,7 @@
bool needs_number_check() const { return needs_number_check_; }
void set_needs_number_check(bool value) { needs_number_check_ = value; }
- bool AttributesEqual(Instruction* other) const;
+ bool AttributesEqual(const Instruction& other) const;
PRINT_OPERANDS_TO_SUPPORT;
@@ -4496,7 +4495,7 @@
return kTagged;
}
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
@@ -4550,10 +4549,10 @@
return speculative_mode_;
}
- virtual bool AttributesEqual(Instruction* other) const {
+ virtual bool AttributesEqual(const Instruction& other) const {
return ComparisonInstr::AttributesEqual(other) &&
- (null_aware_ == other->AsEqualityCompare()->null_aware_) &&
- (speculative_mode_ == other->AsEqualityCompare()->speculative_mode_);
+ (null_aware_ == other.AsEqualityCompare()->null_aware_) &&
+ (speculative_mode_ == other.AsEqualityCompare()->speculative_mode_);
}
virtual Definition* Canonicalize(FlowGraph* flow_graph);
@@ -4602,9 +4601,9 @@
return speculative_mode_;
}
- virtual bool AttributesEqual(Instruction* other) const {
+ virtual bool AttributesEqual(const Instruction& other) const {
return ComparisonInstr::AttributesEqual(other) &&
- (speculative_mode_ == other->AsRelationalOp()->speculative_mode_);
+ (speculative_mode_ == other.AsRelationalOp()->speculative_mode_);
}
PRINT_OPERANDS_TO_SUPPORT
@@ -4673,10 +4672,10 @@
}
virtual bool CanCallDart() const { return comparison()->CanCallDart(); }
- virtual bool AttributesEqual(Instruction* other) const {
- IfThenElseInstr* other_if_then_else = other->AsIfThenElse();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_if_then_else = other.AsIfThenElse();
return (comparison()->tag() == other_if_then_else->comparison()->tag()) &&
- comparison()->AttributesEqual(other_if_then_else->comparison()) &&
+ comparison()->AttributesEqual(*other_if_then_else->comparison()) &&
(if_true_ == other_if_then_else->if_true_) &&
(if_false_ == other_if_then_else->if_false_);
}
@@ -5461,7 +5460,7 @@
virtual Instruction* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
private:
DISALLOW_COPY_AND_ASSIGN(GuardFieldClassInstr);
@@ -5478,7 +5477,7 @@
virtual Instruction* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
private:
DISALLOW_COPY_AND_ASSIGN(GuardFieldLengthInstr);
@@ -5501,7 +5500,7 @@
virtual Instruction* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
private:
DISALLOW_COPY_AND_ASSIGN(GuardFieldTypeInstr);
@@ -5551,7 +5550,7 @@
virtual Definition* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
virtual TokenPosition token_pos() const { return token_pos_; }
@@ -5776,7 +5775,7 @@
virtual bool ComputeCanDeoptimize() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
private:
DISALLOW_COPY_AND_ASSIGN(OneByteStringFromCharCodeInstr);
@@ -5796,8 +5795,8 @@
virtual bool ComputeCanDeoptimize() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
- return other->AsStringToCharCode()->cid_ == cid_;
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsStringToCharCode()->cid_ == cid_;
}
private:
@@ -5901,8 +5900,8 @@
return kNotSpeculative;
}
- virtual bool AttributesEqual(Instruction* other) const {
- return scan_flags_field_.Equals(&other->AsUtf8Scan()->scan_flags_field_);
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return scan_flags_field_.Equals(other.AsUtf8Scan()->scan_flags_field_);
}
bool IsScanFlagsUnboxed() const;
@@ -6430,8 +6429,8 @@
virtual bool ComputeCanDeoptimize() const { return false; }
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
- return other->AsLoadUntagged()->offset_ == offset_;
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsLoadUntagged()->offset_ == offset_;
}
PRINT_OPERANDS_TO_SUPPORT
@@ -6476,8 +6475,8 @@
virtual bool ComputeCanDeoptimize() const { return false; }
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
- return other->AsStoreUntagged()->offset_ == offset_;
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsStoreUntagged()->offset_ == offset_;
}
intptr_t offset_from_tagged() const {
@@ -6511,8 +6510,8 @@
virtual bool ComputeCanDeoptimize() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
- auto other_load = other->AsLoadClassId();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_load = other.AsLoadClassId();
return other_load->representation_ == representation_ &&
other_load->input_can_be_smi_ == input_can_be_smi_;
}
@@ -6628,7 +6627,7 @@
virtual bool AllowsCSE() const { return slot_.is_immutable(); }
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
PRINT_OPERANDS_TO_SUPPORT
@@ -6871,7 +6870,7 @@
virtual Instruction* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
@@ -6916,8 +6915,8 @@
return from_representation();
}
- virtual bool AttributesEqual(Instruction* other) const {
- return other->AsBox()->from_representation() == from_representation();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsBox()->from_representation() == from_representation();
}
Definition* Canonicalize(FlowGraph* flow_graph);
@@ -7061,8 +7060,8 @@
DECLARE_INSTRUCTION(Unbox)
virtual CompileType ComputeType() const;
- virtual bool AttributesEqual(Instruction* other) const {
- UnboxInstr* other_unbox = other->AsUnbox();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_unbox = other.AsUnbox();
return (representation() == other_unbox->representation()) &&
(speculative_mode_ == other_unbox->speculative_mode_);
}
@@ -7120,8 +7119,8 @@
virtual CompileType ComputeType() const;
- virtual bool AttributesEqual(Instruction* other) const {
- UnboxIntegerInstr* other_unbox = other->AsUnboxInteger();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_unbox = other.AsUnboxInteger();
return UnboxInstr::AttributesEqual(other) &&
(other_unbox->is_truncating_ == is_truncating_);
}
@@ -7272,8 +7271,8 @@
DECLARE_INSTRUCTION(MathUnary)
virtual CompileType ComputeType() const;
- virtual bool AttributesEqual(Instruction* other) const {
- return kind() == other->AsMathUnary()->kind();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return kind() == other.AsMathUnary()->kind();
}
Definition* Canonicalize(FlowGraph* flow_graph);
@@ -7331,8 +7330,8 @@
DECLARE_INSTRUCTION(CaseInsensitiveCompare)
virtual CompileType ComputeType() const;
- virtual bool AttributesEqual(Instruction* other) const {
- return other->AsCaseInsensitiveCompare()->cid_ == cid_;
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsCaseInsensitiveCompare()->cid_ == cid_;
}
private:
@@ -7391,7 +7390,7 @@
DECLARE_INSTRUCTION(MathMinMax)
virtual CompileType ComputeType() const;
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
private:
const MethodRecognizer::Kind op_kind_;
@@ -7449,8 +7448,8 @@
virtual Definition* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const {
- const BinaryDoubleOpInstr* other_bin_op = other->AsBinaryDoubleOp();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_bin_op = other.AsBinaryDoubleOp();
return (op_kind() == other_bin_op->op_kind()) &&
(speculative_mode_ == other_bin_op->speculative_mode_);
}
@@ -7492,8 +7491,8 @@
virtual Definition* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const {
- return op_kind_ == other->AsDoubleTestOp()->op_kind() &&
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return op_kind_ == other.AsDoubleTestOp()->op_kind() &&
ComparisonInstr::AttributesEqual(other);
}
@@ -7522,8 +7521,8 @@
Value* value() const { return inputs_[0]; }
Token::Kind op_kind() const { return op_kind_; }
- virtual bool AttributesEqual(Instruction* other) const {
- return other->AsUnaryIntegerOp()->op_kind() == op_kind();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsUnaryIntegerOp()->op_kind() == op_kind();
}
virtual intptr_t DeoptimizationTarget() const {
@@ -7608,8 +7607,8 @@
return kUnboxedInt64;
}
- virtual bool AttributesEqual(Instruction* other) const {
- UnaryInt64OpInstr* unary_op_other = other->AsUnaryInt64Op();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const unary_op_other = other.AsUnaryInt64Op();
return UnaryIntegerOpInstr::AttributesEqual(other) &&
(speculative_mode_ == unary_op_other->speculative_mode_);
}
@@ -7680,7 +7679,7 @@
virtual Definition* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
@@ -7862,9 +7861,9 @@
return speculative_mode_;
}
- virtual bool AttributesEqual(Instruction* other) const {
+ virtual bool AttributesEqual(const Instruction& other) const {
return BinaryIntegerOpInstr::AttributesEqual(other) &&
- (speculative_mode_ == other->AsBinaryInt64Op()->speculative_mode_);
+ (speculative_mode_ == other.AsBinaryInt64Op()->speculative_mode_);
}
virtual CompileType ComputeType() const;
@@ -8080,8 +8079,8 @@
return speculative_mode_;
}
- virtual bool AttributesEqual(Instruction* other) const {
- return speculative_mode_ == other->AsUnaryDoubleOp()->speculative_mode_;
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return speculative_mode_ == other.AsUnaryDoubleOp()->speculative_mode_;
}
PRINT_OPERANDS_TO_SUPPORT
@@ -8167,7 +8166,7 @@
virtual bool ComputeCanDeoptimize() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
private:
const TokenPosition token_pos_;
@@ -8193,7 +8192,7 @@
virtual bool ComputeCanDeoptimize() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
private:
DISALLOW_COPY_AND_ASSIGN(Int32ToDoubleInstr);
@@ -8232,8 +8231,8 @@
return speculative_mode_;
}
- virtual bool AttributesEqual(Instruction* other) const {
- return speculative_mode_ == other->AsInt64ToDouble()->speculative_mode_;
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return speculative_mode_ == other.AsInt64ToDouble()->speculative_mode_;
}
private:
@@ -8293,7 +8292,7 @@
virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
private:
DISALLOW_COPY_AND_ASSIGN(DoubleToSmiInstr);
@@ -8326,8 +8325,8 @@
virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
- virtual bool AttributesEqual(Instruction* other) const {
- return other->AsDoubleToDouble()->recognized_kind() == recognized_kind();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsDoubleToDouble()->recognized_kind() == recognized_kind();
}
private:
@@ -8372,7 +8371,7 @@
virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
virtual Definition* Canonicalize(FlowGraph* flow_graph);
@@ -8406,7 +8405,7 @@
virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
virtual Definition* Canonicalize(FlowGraph* flow_graph);
@@ -8448,8 +8447,8 @@
virtual Value* InputAt(intptr_t i) const { return (*inputs_)[i]; }
- virtual bool AttributesEqual(Instruction* other) const {
- InvokeMathCFunctionInstr* other_invoke = other->AsInvokeMathCFunction();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_invoke = other.AsInvokeMathCFunction();
return other_invoke->recognized_kind() == recognized_kind();
}
@@ -8506,8 +8505,8 @@
return definition_rep_;
}
- virtual bool AttributesEqual(Instruction* other) const {
- ExtractNthOutputInstr* other_extract = other->AsExtractNthOutput();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_extract = other.AsExtractNthOutput();
return (other_extract->representation() == representation()) &&
(other_extract->index() == index());
}
@@ -8542,7 +8541,7 @@
DECLARE_INSTRUCTION(TruncDivMod)
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
PRINT_OPERANDS_TO_SUPPORT
@@ -8593,7 +8592,7 @@
virtual bool AllowsCSE() const { return true; }
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
bool licm_hoisted() const { return licm_hoisted_; }
void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
@@ -8644,7 +8643,7 @@
virtual Instruction* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
bool licm_hoisted() const { return licm_hoisted_; }
void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
@@ -8703,7 +8702,7 @@
virtual Definition* Canonicalize(FlowGraph* flow_graph);
- virtual bool AttributesEqual(Instruction* other) const;
+ virtual bool AttributesEqual(const Instruction& other) const;
static void AddMetadataForRuntimeCall(CheckNullInstr* check_null,
FlowGraphCompiler* compiler);
@@ -8740,7 +8739,7 @@
virtual bool AllowsCSE() const { return true; }
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
PRINT_OPERANDS_TO_SUPPORT
@@ -8808,7 +8807,7 @@
static bool IsFixedLengthArrayType(intptr_t class_id);
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
@@ -8835,7 +8834,7 @@
GenericCheckBoundInstr(Value* length, Value* index, intptr_t deopt_id)
: CheckBoundBase(length, index, deopt_id) {}
- virtual bool AttributesEqual(Instruction* other) const { return true; }
+ virtual bool AttributesEqual(const Instruction& other) const { return true; }
DECLARE_INSTRUCTION(GenericCheckBound)
@@ -8897,9 +8896,9 @@
virtual bool AllowsCSE() const { return true; }
virtual bool HasUnknownSideEffects() const { return false; }
- virtual bool AttributesEqual(Instruction* other) const {
- return other->Cast<CheckConditionInstr>()->comparison()->AttributesEqual(
- comparison());
+ virtual bool AttributesEqual(const Instruction& other) const {
+ return other.AsCheckCondition()->comparison()->AttributesEqual(
+ *comparison());
}
virtual intptr_t InputCount() const { return comparison()->InputCount(); }
@@ -8960,9 +8959,9 @@
return from();
}
- virtual bool AttributesEqual(Instruction* other) const {
- ASSERT(other->IsIntConverter());
- auto converter = other->AsIntConverter();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ ASSERT(other.IsIntConverter());
+ auto const converter = other.AsIntConverter();
return (converter->from() == from()) && (converter->to() == to()) &&
(converter->is_truncating() == is_truncating());
}
@@ -9019,9 +9018,9 @@
return from();
}
- virtual bool AttributesEqual(Instruction* other) const {
- ASSERT(other->IsBitCast());
- BitCastInstr* converter = other->AsBitCast();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ ASSERT(other.IsBitCast());
+ auto const converter = other.AsBitCast();
return converter->from() == from() && converter->to() == to();
}
@@ -9232,8 +9231,8 @@
virtual bool HasUnknownSideEffects() const { return false; }
virtual bool AllowsCSE() const { return true; }
- virtual bool AttributesEqual(Instruction* other) const {
- SimdOpInstr* other_op = other->AsSimdOp();
+ virtual bool AttributesEqual(const Instruction& other) const {
+ auto const other_op = other.AsSimdOp();
return kind() == other_op->kind() &&
(!HasMask() || mask() == other_op->mask());
}
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index 5773401..b9907ec 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -349,6 +349,13 @@
value()->PrintTo(f);
}
+const char* Value::ToCString() const {
+ char buffer[1024];
+ BufferFormatter f(buffer, sizeof(buffer));
+ PrintTo(&f);
+ return Thread::Current()->zone()->MakeCopyOfString(buffer);
+}
+
void Value::PrintTo(BaseTextBuffer* f) const {
PrintUse(f, *definition());
@@ -370,6 +377,10 @@
buffer[pos] = '\0';
f->Printf("#%s\\n...", buffer);
}
+
+ if (representation() != kNoRepresentation && representation() != kTagged) {
+ f->Printf(" %s", RepresentationToCString(representation()));
+ }
}
void ConstraintInstr::PrintOperandsTo(BaseTextBuffer* f) const {
diff --git a/runtime/vm/compiler/backend/il_test.cc b/runtime/vm/compiler/backend/il_test.cc
index e02bec5..3a0286c 100644
--- a/runtime/vm/compiler/backend/il_test.cc
+++ b/runtime/vm/compiler/backend/il_test.cc
@@ -35,17 +35,17 @@
Definition* def2 = new PhiInstr(join, 0);
Value* use1a = new Value(def1);
Value* use1b = new Value(def1);
- EXPECT(use1a->Equals(use1b));
+ EXPECT(use1a->Equals(*use1b));
Value* use2 = new Value(def2);
- EXPECT(!use2->Equals(use1a));
+ EXPECT(!use2->Equals(*use1a));
ConstantInstr* c1 = new ConstantInstr(Bool::True());
ConstantInstr* c2 = new ConstantInstr(Bool::True());
- EXPECT(c1->Equals(c2));
+ EXPECT(c1->Equals(*c2));
ConstantInstr* c3 = new ConstantInstr(Object::ZoneHandle());
ConstantInstr* c4 = new ConstantInstr(Object::ZoneHandle());
- EXPECT(c3->Equals(c4));
- EXPECT(!c3->Equals(c1));
+ EXPECT(c3->Equals(*c4));
+ EXPECT(!c3->Equals(*c1));
}
ISOLATE_UNIT_TEST_CASE(IRTest_EliminateWriteBarrier) {
@@ -261,4 +261,56 @@
kUnboxedInt64, kUnboxedUint32));
}
+ISOLATE_UNIT_TEST_CASE(IL_PhiCanonicalization) {
+ using compiler::BlockBuilder;
+
+ CompilerState S(thread, /*is_aot=*/false, /*is_optimizing=*/true);
+
+ FlowGraphBuilderHelper H;
+
+ auto normal_entry = H.flow_graph()->graph_entry()->normal_entry();
+ auto b2 = H.JoinEntry();
+ auto b3 = H.TargetEntry();
+ auto b4 = H.TargetEntry();
+
+ Definition* v0;
+ ReturnInstr* ret;
+ PhiInstr* phi;
+
+ {
+ BlockBuilder builder(H.flow_graph(), normal_entry);
+ v0 = builder.AddParameter(0, 0, /*with_frame=*/true, kTagged);
+ builder.AddInstruction(new GotoInstr(b2, S.GetNextDeoptId()));
+ }
+
+ {
+ BlockBuilder builder(H.flow_graph(), b2);
+ phi = new PhiInstr(b2, 2);
+ phi->SetInputAt(0, new Value(v0));
+ phi->SetInputAt(1, new Value(phi));
+ builder.AddPhi(phi);
+ builder.AddBranch(new StrictCompareInstr(
+ InstructionSource(), Token::kEQ_STRICT,
+ new Value(H.IntConstant(1)), new Value(phi),
+ /*needs_number_check=*/false, S.GetNextDeoptId()),
+ b3, b4);
+ }
+
+ {
+ BlockBuilder builder(H.flow_graph(), b3);
+ builder.AddInstruction(new GotoInstr(b2, S.GetNextDeoptId()));
+ }
+
+ {
+ BlockBuilder builder(H.flow_graph(), b4);
+ ret = builder.AddReturn(new Value(phi));
+ }
+
+ H.FinishGraph();
+
+ H.flow_graph()->Canonicalize();
+
+ EXPECT(ret->value()->definition() == v0);
+}
+
} // namespace dart
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 51aa420..f38dc9b2 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -316,7 +316,7 @@
static bool AreEqualDefinitions(Definition* a, Definition* b) {
a = UnwrapConstraint(a);
b = UnwrapConstraint(b);
- return (a == b) || (a->AllowsCSE() && b->AllowsCSE() && a->Equals(b));
+ return (a == b) || (a->AllowsCSE() && b->AllowsCSE() && a->Equals(*b));
}
static bool DependOnSameSymbol(const RangeBoundary& a, const RangeBoundary& b) {
@@ -2714,7 +2714,7 @@
RangeBoundary::FromConstant(value));
} else {
// Only Smi and Mint supported.
- UNREACHABLE();
+ FATAL1("Unexpected constant: %s\n", value_.ToCString());
}
}
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index 6edc0f3..99176ee 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -434,8 +434,8 @@
kBitsPerInt32 - 1);
}
- bool Equals(const Place* other) const {
- return (flags_ == other->flags_) && (instance_ == other->instance_) &&
+ bool Equals(const Place& other) const {
+ return (flags_ == other.flags_) && (instance_ == other.instance_) &&
SameField(other);
}
@@ -455,10 +455,10 @@
Place(uword flags, Definition* instance, intptr_t selector)
: flags_(flags), instance_(instance), raw_selector_(selector), id_(0) {}
- bool SameField(const Place* other) const {
+ bool SameField(const Place& other) const {
return (kind() == kStaticField)
- ? (static_field().Original() == other->static_field().Original())
- : (raw_selector_ == other->raw_selector_);
+ ? (static_field().Original() == other.static_field().Original())
+ : (raw_selector_ == other.raw_selector_);
}
uword FieldHash() const {
@@ -1027,7 +1027,7 @@
bool is_load = false, is_store;
Place load_place(instr, &is_load, &is_store);
- if (is_load && load_place.Equals(place)) {
+ if (is_load && load_place.Equals(*place)) {
return true;
}
}
@@ -2554,7 +2554,7 @@
bool CanBeCongruent(Definition* a, Definition* b) {
return (a->tag() == b->tag()) &&
((a->IsPhi() && (a->GetBlock() == b->GetBlock())) ||
- (a->AllowsCSE() && a->AttributesEqual(b)));
+ (a->AllowsCSE() && a->AttributesEqual(*b)));
}
// Given two definitions check if they are congruent under assumption that
diff --git a/runtime/vm/compiler/backend/redundancy_elimination_test.cc b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
index c76394e..2556df7 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination_test.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
@@ -695,7 +695,6 @@
EXPECT(entry != nullptr);
AllocateTypedDataInstr* alloc_typed_data = nullptr;
- UnboxedConstantInstr* double_one = nullptr;
StoreIndexedInstr* first_store = nullptr;
StoreIndexedInstr* second_store = nullptr;
LoadIndexedInstr* final_load = nullptr;
@@ -705,7 +704,6 @@
RELEASE_ASSERT(cursor.TryMatch(
{
{kMatchAndMoveAllocateTypedData, &alloc_typed_data},
- {kMatchAndMoveUnboxedConstant, &double_one},
{kMatchAndMoveStoreIndexed, &first_store},
{kMatchAndMoveStoreIndexed, &second_store},
{kMatchAndMoveLoadIndexed, &final_load},
@@ -716,7 +714,6 @@
EXPECT(first_store->array()->definition() == alloc_typed_data);
EXPECT(second_store->array()->definition() == alloc_typed_data);
- EXPECT(boxed_result->value()->definition() != double_one);
EXPECT(boxed_result->value()->definition() == final_load);
}
@@ -818,7 +815,6 @@
EXPECT(entry != nullptr);
AllocateTypedDataInstr* alloc_typed_data = nullptr;
- UnboxedConstantInstr* double_one = nullptr;
StoreIndexedInstr* first_store = nullptr;
StoreIndexedInstr* second_store = nullptr;
LoadIndexedInstr* final_load = nullptr;
@@ -832,7 +828,6 @@
kMatchAndMoveBranchTrue,
kMatchAndMoveBranchFalse,
kMatchAndMoveBranchFalse,
- {kMatchAndMoveUnboxedConstant, &double_one},
{kMatchAndMoveStoreIndexed, &first_store},
kMatchAndMoveBranchFalse,
{kMatchAndMoveStoreIndexed, &second_store},
@@ -844,7 +839,6 @@
EXPECT(first_store->array()->definition() == alloc_typed_data);
EXPECT(second_store->array()->definition() == alloc_typed_data);
- EXPECT(boxed_result->value()->definition() != double_one);
EXPECT(boxed_result->value()->definition() == final_load);
}
@@ -1156,57 +1150,47 @@
/* Flow graph to match:
4: CheckStackOverflow:8(stack=0, loop=0)
- 6: v590 <- UnboxedConstant(#1.0) T{_Double}
- 7: ParallelMove DS-8 <- xmm0
- 8: v592 <- UnboxedConstant(#2.0) T{_Double}
- 9: ParallelMove rax <- S+2, DS-7 <- xmm1
- 10: CheckClass:14(v2 Cids[1: _Double@0150898 etc. cid 54])
+ 6: v590 <- UnboxedConstant(#1.0 double) T{_Double}
+ 8: v592 <- UnboxedConstant(#2.0 double) T{_Double}
+ 9: ParallelMove r0 <- S+2
+ 10: CheckClass:14(v2 Cids[1: _Double@0150898 etc. cid 52])
12: v526 <- Unbox:14(v2 T{_Double}) T{_Double}
- 14: ParallelMove xmm3 <- xmm0
14: v352 <- BinaryDoubleOp:22(+, v590, v526) T{_Double}
- 15: ParallelMove DS-6 <- xmm3
- 16: ParallelMove xmm4 <- xmm1
+ 15: ParallelMove DS-9 <- q3
16: v363 <- BinaryDoubleOp:34(+, v592, v526) T{_Double}
- 17: ParallelMove DS-5 <- xmm4
- 18: ParallelMove xmm2 <- xmm3
+ 17: ParallelMove DS-7 <- q0
18: v21 <- BinaryDoubleOp:28(+, v352, v363) T{_Double}
- 19: ParallelMove rbx <- C, r10 <- C, DS-4 <- xmm2
+ 19: ParallelMove r1 <- C, r2 <- C, DS-5 <- q1
20: v24 <- CreateArray:30(v0, v23) T{_List}
- 21: ParallelMove rcx <- rax
- 22: ParallelMove S-3 <- rcx
+ 21: ParallelMove r2 <- r0
+ 22: ParallelMove S-3 <- r2
22: StoreIndexed(v24, v6, v26, NoStoreBarrier)
24: StoreIndexed(v24, v7, v7, NoStoreBarrier)
26: StoreIndexed(v24, v3, v29, NoStoreBarrier)
28: StoreIndexed(v24, v30, v8, NoStoreBarrier)
30: StoreIndexed(v24, v33, v34, NoStoreBarrier)
- 31: ParallelMove xmm0 <- DS-8
- 32: v582 <- Box(v590) T{_Double}
- 33: ParallelMove rdx <- rcx, rax <- rax
- 34: StoreIndexed(v24, v35, v582)
- 36: StoreIndexed(v24, v38, v29, NoStoreBarrier)
- 37: ParallelMove xmm0 <- DS-7
- 38: v584 <- Box(v592) T{_Double}
- 39: ParallelMove rdx <- rcx, rax <- rax
- 40: StoreIndexed(v24, v39, v584)
- 42: StoreIndexed(v24, v42, v43, NoStoreBarrier)
- 43: ParallelMove xmm0 <- DS-6
- 44: v586 <- Box(v352) T{_Double}
- 45: ParallelMove rdx <- rcx, rax <- rax
- 46: StoreIndexed(v24, v44, v586)
- 48: StoreIndexed(v24, v47, v29, NoStoreBarrier)
- 49: ParallelMove xmm0 <- DS-5
- 50: v588 <- Box(v363) T{_Double}
- 51: ParallelMove rdx <- rcx, rax <- rax
- 52: StoreIndexed(v24, v48, v588)
- 54: StoreIndexed(v24, v51, v52, NoStoreBarrier)
- 55: ParallelMove xmm0 <- DS-4
- 56: v580 <- Box(v21) T{_Double}
- 57: ParallelMove rdx <- rcx, rax <- rax
- 58: StoreIndexed(v24, v53, v580)
- 59: ParallelMove rax <- rcx
- 60: v54 <- StringInterpolate:44(v24) T{String}
- 61: ParallelMove rax <- rax
- 62: Return:48(v54)
+ 32: StoreIndexed(v24, v35, v9, NoStoreBarrier)
+ 34: StoreIndexed(v24, v38, v29, NoStoreBarrier)
+ 36: StoreIndexed(v24, v39, v10, NoStoreBarrier)
+ 38: StoreIndexed(v24, v42, v43, NoStoreBarrier)
+ 39: ParallelMove q0 <- DS-9
+ 40: v586 <- Box(v352) T{_Double}
+ 41: ParallelMove r1 <- r2, r0 <- r0
+ 42: StoreIndexed(v24, v44, v586)
+ 44: StoreIndexed(v24, v47, v29, NoStoreBarrier)
+ 45: ParallelMove q0 <- DS-7
+ 46: v588 <- Box(v363) T{_Double}
+ 47: ParallelMove r1 <- r2, r0 <- r0
+ 48: StoreIndexed(v24, v48, v588)
+ 50: StoreIndexed(v24, v51, v52, NoStoreBarrier)
+ 51: ParallelMove q0 <- DS-5
+ 52: v580 <- Box(v21) T{_Double}
+ 53: ParallelMove r1 <- r2, r0 <- r0
+ 54: StoreIndexed(v24, v53, v580)
+ 55: ParallelMove r0 <- r2
+ 56: v54 <- StringInterpolate:44(v24) T{String}
+ 57: ParallelMove r0 <- r0
+ 58: Return:48(v54)
*/
CreateArrayInstr* create_array = nullptr;
@@ -1230,10 +1214,8 @@
kMatchAndMoveStoreIndexed,
kMatchAndMoveStoreIndexed,
kMatchAndMoveStoreIndexed,
- kMatchAndMoveBox,
kMatchAndMoveStoreIndexed,
kMatchAndMoveStoreIndexed,
- kMatchAndMoveBox,
kMatchAndMoveStoreIndexed,
kMatchAndMoveStoreIndexed,
kMatchAndMoveBox,
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index d0c4d9e..eaf30b0 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -380,8 +380,8 @@
}
}
-bool Slot::Equals(const Slot* other) const {
- if (kind_ != other->kind_) {
+bool Slot::Equals(const Slot& other) const {
+ if (kind_ != other.kind_ || offset_in_bytes_ != other.offset_in_bytes_) {
return false;
}
@@ -389,18 +389,15 @@
case Kind::kTypeArguments:
case Kind::kTypeArgumentsIndex:
case Kind::kArrayElement:
- return (offset_in_bytes_ == other->offset_in_bytes_);
+ return true;
case Kind::kCapturedVariable:
- return (offset_in_bytes_ == other->offset_in_bytes_) &&
- (flags_ == other->flags_) &&
- (DataAs<const String>()->ptr() ==
- other->DataAs<const String>()->ptr());
+ return (flags_ == other.flags_) && (DataAs<const String>()->ptr() ==
+ other.DataAs<const String>()->ptr());
case Kind::kDartField:
- return (offset_in_bytes_ == other->offset_in_bytes_) &&
- other->DataAs<const Field>()->Original() ==
- DataAs<const Field>()->Original();
+ return other.DataAs<const Field>()->Original() ==
+ DataAs<const Field>()->Original();
default:
UNREACHABLE();
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index c2078b7..8dec3c8 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -264,7 +264,7 @@
return *DataAs<const Field>();
}
- bool Equals(const Slot* other) const;
+ bool Equals(const Slot& other) const;
uword Hash() const;
bool IsIdentical(const Slot& other) const { return this == &other; }
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index 77a3389..2d6f6a0 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -466,7 +466,7 @@
static inline uword Hash(Key key) { return key->Hash(); }
- static inline bool IsKeyEqual(Pair kv, Key key) { return kv->Equals(key); }
+ static inline bool IsKeyEqual(Pair kv, Key key) { return kv->Equals(*key); }
};
template <typename T>
diff --git a/runtime/vm/hash_map_test.cc b/runtime/vm/hash_map_test.cc
index 6d02c08..8b5b1ba 100644
--- a/runtime/vm/hash_map_test.cc
+++ b/runtime/vm/hash_map_test.cc
@@ -12,7 +12,7 @@
public:
explicit TestValue(intptr_t x) : x_(x) {}
uword Hash() const { return x_ & 1; }
- bool Equals(TestValue* other) { return x_ == other->x_; }
+ bool Equals(const TestValue& other) { return x_ == other.x_; }
private:
intptr_t x_;
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index a5bd97f..f5cc809 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -2560,20 +2560,20 @@
// Clear the direct subclasses for all classes.
Class& cls = Class::Handle();
- GrowableObjectArray& subclasses = GrowableObjectArray::Handle();
+ const GrowableObjectArray& null_list = GrowableObjectArray::Handle();
for (intptr_t i = 1; i < num_cids; i++) {
if (class_table->HasValidClassAt(i)) {
cls = class_table->At(i);
if (!cls.is_declaration_loaded()) {
continue; // Can't have any subclasses or implementors yet.
}
- subclasses = cls.direct_subclasses();
- if (!subclasses.IsNull()) {
- cls.ClearDirectSubclasses();
+ // Testing for null to prevent attempting to write to read-only classes
+ // in the VM isolate.
+ if (cls.direct_subclasses() != GrowableObjectArray::null()) {
+ cls.set_direct_subclasses(null_list);
}
- subclasses = cls.direct_implementors();
- if (!subclasses.IsNull()) {
- cls.ClearDirectImplementors();
+ if (cls.direct_implementors() != GrowableObjectArray::null()) {
+ cls.set_direct_implementors(null_list);
}
}
}
diff --git a/runtime/vm/malloc_hooks.h b/runtime/vm/malloc_hooks.h
index 42b9186..2dfbb83 100644
--- a/runtime/vm/malloc_hooks.h
+++ b/runtime/vm/malloc_hooks.h
@@ -30,7 +30,9 @@
static void set_stack_trace_collection_enabled(bool enabled);
static void ResetStats();
static bool Active();
- static void PrintToJSONObject(JSONObject* jsobj);
+ static bool GetStats(intptr_t* used,
+ intptr_t* capacity,
+ const char** implementation);
static Sample* GetSample(const void* ptr);
static intptr_t allocation_count();
diff --git a/runtime/vm/malloc_hooks_tcmalloc.cc b/runtime/vm/malloc_hooks_tcmalloc.cc
index 787a429..443285e 100644
--- a/runtime/vm/malloc_hooks_tcmalloc.cc
+++ b/runtime/vm/malloc_hooks_tcmalloc.cc
@@ -10,6 +10,8 @@
#include "gperftools/malloc_hook.h"
+#include <malloc.h>
+
#include "platform/assert.h"
#include "vm/hash_map.h"
#include "vm/json_stream.h"
@@ -336,29 +338,14 @@
return MallocHooksState::Active();
}
-void MallocHooks::PrintToJSONObject(JSONObject* jsobj) {
- if (!FLAG_profiler_native_memory) {
- return;
- }
- intptr_t allocated_memory = 0;
- intptr_t allocation_count = 0;
- bool add_usage = false;
- // AddProperty may call malloc which would result in an attempt
- // to acquire the lock recursively so we extract the values first
- // and then add the JSON properties.
- {
- MallocLocker ml(MallocHooksState::malloc_hook_mutex(),
- MallocHooksState::malloc_hook_mutex_owner());
- if (MallocHooksState::Active()) {
- allocated_memory = MallocHooksState::heap_allocated_memory_in_bytes();
- allocation_count = MallocHooksState::allocation_count();
- add_usage = true;
- }
- }
- if (add_usage) {
- jsobj->AddProperty("_heapAllocatedMemoryUsage", allocated_memory);
- jsobj->AddProperty("_heapAllocationCount", allocation_count);
- }
+bool MallocHooks::GetStats(intptr_t* used,
+ intptr_t* capacity,
+ const char** implementation) {
+ struct mallinfo info = mallinfo();
+ *used = info.uordblks;
+ *capacity = *used + info.fordblks;
+ *implementation = "tcmalloc";
+ return true;
}
intptr_t MallocHooks::allocation_count() {
diff --git a/runtime/vm/malloc_hooks_unsupported.cc b/runtime/vm/malloc_hooks_unsupported.cc
index b08d138..bf986dc 100644
--- a/runtime/vm/malloc_hooks_unsupported.cc
+++ b/runtime/vm/malloc_hooks_unsupported.cc
@@ -8,6 +8,24 @@
#include "vm/malloc_hooks.h"
+#include "vm/json_stream.h"
+
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
+#include <malloc.h>
+#elif defined(HOST_OS_MACOS)
+#include <malloc/malloc.h>
+#endif
+
+#if !defined(HOST_OS_WINDOWS) && !defined(TARGET_OS_IOS)
+extern "C" {
+__attribute__((weak)) uintptr_t __sanitizer_get_current_allocated_bytes();
+__attribute__((weak)) uintptr_t __sanitizer_get_heap_size();
+__attribute__((weak)) int __sanitizer_install_malloc_and_free_hooks(
+ void (*malloc_hook)(const void*, uintptr_t),
+ void (*free_hook)(const void*));
+}
+#endif
+
namespace dart {
void MallocHooks::Init() {
@@ -38,8 +56,37 @@
return false;
}
-void MallocHooks::PrintToJSONObject(JSONObject* jsobj) {
- // Do nothing.
+bool MallocHooks::GetStats(intptr_t* used,
+ intptr_t* capacity,
+ const char** implementation) {
+#if !defined(PRODUCT)
+#if !defined(HOST_OS_WINDOWS) && !defined(TARGET_OS_IOS)
+ if (__sanitizer_get_current_allocated_bytes != nullptr &&
+ __sanitizer_get_heap_size != nullptr) {
+ *used = __sanitizer_get_current_allocated_bytes();
+ *capacity = __sanitizer_get_heap_size();
+ *implementation = "scudo";
+ return true;
+ }
+#endif
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
+ struct mallinfo info = mallinfo();
+ *used = info.uordblks;
+ *capacity = *used + info.fordblks;
+ *implementation = "unknown";
+ return true;
+#elif defined(HOST_OS_MACOS)
+ struct mstats stats = mstats();
+ *used = stats.bytes_used;
+ *capacity = stats.bytes_total;
+ *implementation = "macos";
+ return true;
+#else
+ return false;
+#endif
+#else
+ return false;
+#endif
}
Sample* MallocHooks::GetSample(const void* ptr) {
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 2272cf7..08b8d07 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -5088,9 +5088,10 @@
direct_implementors.Add(implementor, Heap::kOld);
}
-void Class::ClearDirectImplementors() const {
+void Class::set_direct_implementors(
+ const GrowableObjectArray& implementors) const {
ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
- untag()->set_direct_implementors(GrowableObjectArray::null());
+ untag()->set_direct_implementors(implementors.ptr());
}
void Class::AddDirectSubclass(const Class& subclass) const {
@@ -5114,9 +5115,9 @@
direct_subclasses.Add(subclass, Heap::kOld);
}
-void Class::ClearDirectSubclasses() const {
+void Class::set_direct_subclasses(const GrowableObjectArray& subclasses) const {
ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
- untag()->set_direct_subclasses(GrowableObjectArray::null());
+ untag()->set_direct_subclasses(subclasses.ptr());
}
ArrayPtr Class::constants() const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index e5c69e7..9eb6bed 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1201,8 +1201,11 @@
IsolateGroup::Current()->program_lock()->IsCurrentThreadReader());
return untag()->direct_implementors();
}
+ GrowableObjectArrayPtr direct_implementors_unsafe() const {
+ return untag()->direct_implementors();
+ }
+ void set_direct_implementors(const GrowableObjectArray& implementors) const;
void AddDirectImplementor(const Class& subclass, bool is_mixin) const;
- void ClearDirectImplementors() const;
// Returns the list of classes having this class as direct superclass.
GrowableObjectArrayPtr direct_subclasses() const {
@@ -1213,8 +1216,8 @@
GrowableObjectArrayPtr direct_subclasses_unsafe() const {
return untag()->direct_subclasses();
}
+ void set_direct_subclasses(const GrowableObjectArray& subclasses) const;
void AddDirectSubclass(const Class& subclass) const;
- void ClearDirectSubclasses() const;
// Check if this class represents the class of null.
bool IsNullClass() const { return id() == kNullCid; }
@@ -5741,6 +5744,7 @@
raw->untag()->flags_and_size_);
}
+ // Methods to allow use with PointerKeyValueTrait to create sets of CSMs.
bool Equals(const CompressedStackMaps& other) const {
// All of the table flags and payload size must match.
if (untag()->flags_and_size_ != other.untag()->flags_and_size_) {
@@ -5749,9 +5753,6 @@
NoSafepointScope no_safepoint;
return memcmp(untag(), other.untag(), InstanceSize(payload_size())) == 0;
}
-
- // Methods to allow use with PointerKeyValueTrait to create sets of CSMs.
- bool Equals(const CompressedStackMaps* other) const { return Equals(*other); }
uword Hash() const;
static intptr_t HeaderSize() { return sizeof(UntaggedCompressedStackMaps); }
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 2e4bb01..c5a7965 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -485,16 +485,16 @@
return hash_;
}
- bool Equals(const StackMapEntry* other) const {
- if (spill_slot_bit_count_ != other->spill_slot_bit_count_ ||
- non_spill_slot_bit_count_ != other->non_spill_slot_bit_count_) {
+ bool Equals(const StackMapEntry& other) const {
+ if (spill_slot_bit_count_ != other.spill_slot_bit_count_ ||
+ non_spill_slot_bit_count_ != other.non_spill_slot_bit_count_) {
return false;
}
// Since we ensure that bits in the payload that are not part of the
// actual stackmap data are cleared, we can just compare payloads by byte
// instead of calling IsObject for each bit.
NoSafepointScope scope;
- return memcmp(PayloadData(), other->PayloadData(), PayloadLength()) == 0;
+ return memcmp(PayloadData(), other.PayloadData(), PayloadLength()) == 0;
}
// Encodes this StackMapEntry to the given array of bytes and returns the
@@ -556,7 +556,7 @@
static Key KeyOf(Pair kv) { return kv.key; }
static Value ValueOf(Pair kv) { return kv.value; }
static uword Hash(Key key) { return key->Hash(); }
- static bool IsKeyEqual(Pair kv, Key key) { return key->Equals(kv.key); }
+ static bool IsKeyEqual(Pair kv, Key key) { return key->Equals(*kv.key); }
};
typedef DirectChainedHashMap<StackMapEntryKeyIntValueTrait> StackMapEntryIntMap;
@@ -938,6 +938,68 @@
WalkProgram(zone, isolate_group, &deduper);
}
}
+
+void ProgramVisitor::PruneSubclasses(Zone* zone, IsolateGroup* isolate_group) {
+ class PruneSubclassesVisitor : public ClassVisitor {
+ public:
+ explicit PruneSubclassesVisitor(Zone* zone)
+ : ClassVisitor(),
+ old_implementors_(GrowableObjectArray::Handle(zone)),
+ new_implementors_(GrowableObjectArray::Handle(zone)),
+ implementor_(Class::Handle(zone)),
+ old_subclasses_(GrowableObjectArray::Handle(zone)),
+ new_subclasses_(GrowableObjectArray::Handle(zone)),
+ subclass_(Class::Handle(zone)),
+ null_list_(GrowableObjectArray::Handle(zone)) {}
+
+ void VisitClass(const Class& klass) {
+ old_implementors_ = klass.direct_implementors_unsafe();
+ if (!old_implementors_.IsNull()) {
+ new_implementors_ = GrowableObjectArray::New();
+ for (intptr_t i = 0; i < old_implementors_.Length(); i++) {
+ implementor_ ^= old_implementors_.At(i);
+ if (implementor_.id() != kIllegalCid) {
+ new_implementors_.Add(implementor_);
+ }
+ }
+ if (new_implementors_.Length() == 0) {
+ klass.set_direct_implementors(null_list_);
+ } else {
+ klass.set_direct_implementors(new_implementors_);
+ }
+ }
+
+ old_subclasses_ = klass.direct_subclasses_unsafe();
+ if (!old_subclasses_.IsNull()) {
+ new_subclasses_ = GrowableObjectArray::New();
+ for (intptr_t i = 0; i < old_subclasses_.Length(); i++) {
+ subclass_ ^= old_subclasses_.At(i);
+ if (subclass_.id() != kIllegalCid) {
+ new_subclasses_.Add(subclass_);
+ }
+ }
+ if (new_subclasses_.Length() == 0) {
+ klass.set_direct_subclasses(null_list_);
+ } else {
+ klass.set_direct_subclasses(new_subclasses_);
+ }
+ }
+ }
+
+ private:
+ GrowableObjectArray& old_implementors_;
+ GrowableObjectArray& new_implementors_;
+ Class& implementor_;
+ GrowableObjectArray& old_subclasses_;
+ GrowableObjectArray& new_subclasses_;
+ Class& subclass_;
+ GrowableObjectArray& null_list_;
+ };
+
+ PruneSubclassesVisitor visitor(zone);
+ SafepointWriteRwLocker ml(Thread::Current(), isolate_group->program_lock());
+ WalkProgram(zone, isolate_group, &visitor);
+}
#endif // defined(DART_PRECOMPILER)
class CodeSourceMapKeyValueTrait {
@@ -1304,6 +1366,7 @@
#if defined(DART_PRECOMPILER)
DedupCatchEntryMovesMaps(zone, isolate_group);
DedupUnlinkedCalls(zone, isolate_group);
+ PruneSubclasses(zone, isolate_group);
#endif
DedupCodeSourceMaps(zone, isolate_group);
DedupLists(zone, isolate_group);
diff --git a/runtime/vm/program_visitor.h b/runtime/vm/program_visitor.h
index 06aa481..b310625 100644
--- a/runtime/vm/program_visitor.h
+++ b/runtime/vm/program_visitor.h
@@ -114,6 +114,7 @@
#if defined(DART_PRECOMPILER)
static void DedupCatchEntryMovesMaps(Zone* zone, IsolateGroup* isolate_group);
static void DedupUnlinkedCalls(Zone* zone, IsolateGroup* isolate_group);
+ static void PruneSubclasses(Zone* zone, IsolateGroup* isolate_group);
#endif
static void DedupCodeSourceMaps(Zone* zone, IsolateGroup* isolate_group);
static void DedupLists(Zone* zone, IsolateGroup* isolate_group);
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 4163c3e..7753a7a 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -934,7 +934,9 @@
CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) {
switch (kind) {
case Snapshot::kFullAOT:
+#if defined(PRODUCT)
return reinterpret_cast<CompressedObjectPtr*>(&allocation_stub_);
+#endif
case Snapshot::kFull:
case Snapshot::kFullCore:
return reinterpret_cast<CompressedObjectPtr*>(&direct_subclasses_);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 8e91315..73cd2e5 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -3109,23 +3109,72 @@
return true;
}
+static void MarkClasses(const Class& root,
+ bool include_subclasses,
+ bool include_implementors) {
+ Thread* thread = Thread::Current();
+ HANDLESCOPE(thread);
+ SharedClassTable* table = thread->isolate()->group()->shared_class_table();
+ GrowableArray<const Class*> worklist;
+ table->SetCollectInstancesFor(root.id(), true);
+ worklist.Add(&root);
+ GrowableObjectArray& subclasses = GrowableObjectArray::Handle();
+ GrowableObjectArray& implementors = GrowableObjectArray::Handle();
+ while (!worklist.is_empty()) {
+ const Class& cls = *worklist.RemoveLast();
+ // All subclasses are implementors, but they are not included in
+ // `direct_implementors`.
+ if (include_subclasses || include_implementors) {
+ subclasses = cls.direct_subclasses_unsafe();
+ if (!subclasses.IsNull()) {
+ for (intptr_t j = 0; j < subclasses.Length(); j++) {
+ Class& subclass = Class::Handle();
+ subclass ^= subclasses.At(j);
+ if (!table->CollectInstancesFor(subclass.id())) {
+ table->SetCollectInstancesFor(subclass.id(), true);
+ worklist.Add(&subclass);
+ }
+ }
+ }
+ }
+ if (include_implementors) {
+ implementors = cls.direct_implementors_unsafe();
+ if (!implementors.IsNull()) {
+ for (intptr_t j = 0; j < implementors.Length(); j++) {
+ Class& implementor = Class::Handle();
+ implementor ^= implementors.At(j);
+ if (!table->CollectInstancesFor(implementor.id())) {
+ table->SetCollectInstancesFor(implementor.id(), true);
+ worklist.Add(&implementor);
+ }
+ }
+ }
+ }
+ }
+}
+
+static void UnmarkClasses() {
+ SharedClassTable* table = IsolateGroup::Current()->shared_class_table();
+ for (intptr_t i = 1; i < table->NumCids(); i++) {
+ table->SetCollectInstancesFor(i, false);
+ }
+}
+
class GetInstancesVisitor : public ObjectGraph::Visitor {
public:
- GetInstancesVisitor(const Class& cls,
- ZoneGrowableHandlePtrArray<Object>* storage,
+ GetInstancesVisitor(ZoneGrowableHandlePtrArray<Object>* storage,
intptr_t limit)
- : cls_(cls), storage_(storage), limit_(limit), count_(0) {}
+ : table_(IsolateGroup::Current()->shared_class_table()),
+ storage_(storage),
+ limit_(limit),
+ count_(0) {}
virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
ObjectPtr raw_obj = it->Get();
if (raw_obj->IsPseudoObject()) {
return kProceed;
}
- Thread* thread = Thread::Current();
- REUSABLE_OBJECT_HANDLESCOPE(thread);
- Object& obj = thread->ObjectHandle();
- obj = raw_obj;
- if (obj.GetClassId() == cls_.id()) {
+ if (table_->CollectInstancesFor(raw_obj->GetClassId())) {
if (count_ < limit_) {
storage_->Add(Object::Handle(raw_obj));
}
@@ -3137,7 +3186,7 @@
intptr_t count() const { return count_; }
private:
- const Class& cls_;
+ SharedClassTable* const table_;
ZoneGrowableHandlePtrArray<Object>* storage_;
const intptr_t limit_;
intptr_t count_;
@@ -3177,11 +3226,13 @@
HANDLESCOPE(thread);
ZoneGrowableHandlePtrArray<Object> storage(thread->zone(), limit);
- GetInstancesVisitor visitor(cls, &storage, limit);
+ GetInstancesVisitor visitor(&storage, limit);
{
ObjectGraph graph(thread);
HeapIterationScope iteration_scope(Thread::Current(), true);
+ MarkClasses(cls, false, false);
graph.IterateObjects(&visitor);
+ UnmarkClasses();
}
intptr_t count = visitor.count();
JSONObject jsobj(js);
@@ -3196,6 +3247,55 @@
return true;
}
+static const MethodParameter* get_instances_as_array_params[] = {
+ RUNNABLE_ISOLATE_PARAMETER,
+ NULL,
+};
+
+static bool GetInstancesAsArray(Thread* thread, JSONStream* js) {
+ const char* object_id = js->LookupParam("objectId");
+ if (object_id == NULL) {
+ PrintMissingParamError(js, "objectId");
+ return true;
+ }
+
+ bool include_subclasses =
+ BoolParameter::Parse(js->LookupParam("includeSubclasses"), false);
+ bool include_implementors =
+ BoolParameter::Parse(js->LookupParam("includeImplementors"), false);
+
+ const Object& obj = Object::Handle(LookupHeapObject(thread, object_id, NULL));
+ if (obj.ptr() == Object::sentinel().ptr() || !obj.IsClass()) {
+ PrintInvalidParamError(js, "objectId");
+ return true;
+ }
+ const Class& cls = Class::Cast(obj);
+
+ // Ensure the array and handles created below are promptly destroyed.
+ Array& instances = Array::Handle();
+ {
+ StackZone zone(thread);
+ HANDLESCOPE(thread);
+
+ ZoneGrowableHandlePtrArray<Object> storage(thread->zone(), 1024);
+ GetInstancesVisitor visitor(&storage, kSmiMax);
+ {
+ ObjectGraph graph(thread);
+ HeapIterationScope iteration_scope(Thread::Current(), true);
+ MarkClasses(cls, include_subclasses, include_implementors);
+ graph.IterateObjects(&visitor);
+ UnmarkClasses();
+ }
+ intptr_t count = visitor.count();
+ instances = Array::New(count);
+ for (intptr_t i = 0; i < count; i++) {
+ instances.SetAt(i, storage.At(i));
+ }
+ }
+ instances.PrintJSON(js, /* as_ref */ true);
+ return true;
+}
+
static const MethodParameter* get_ports_params[] = {
RUNNABLE_ISOLATE_PARAMETER,
NULL,
@@ -4229,94 +4329,122 @@
rss.AddProperty64("size", Service::CurrentRSS());
JSONArray rss_children(&rss, "children");
- JSONObject vm(&rss_children);
intptr_t vm_size = 0;
{
- JSONArray vm_children(&vm, "children");
+ JSONObject vm(&rss_children);
+ {
+ JSONArray vm_children(&vm, "children");
+
+ {
+ JSONObject profiler(&vm_children);
+ profiler.AddProperty("name", "Profiler");
+ profiler.AddProperty("description",
+ "Samples from the Dart VM's profiler");
+ intptr_t size = Profiler::Size();
+ vm_size += size;
+ profiler.AddProperty64("size", size);
+ JSONArray(&profiler, "children");
+ }
+
+ {
+ JSONObject timeline(&vm_children);
+ timeline.AddProperty("name", "Timeline");
+ timeline.AddProperty(
+ "description",
+ "Timeline events from dart:developer and Dart_TimelineEvent");
+ intptr_t size = Timeline::recorder()->Size();
+ vm_size += size;
+ timeline.AddProperty64("size", size);
+ JSONArray(&timeline, "children");
+ }
+
+ {
+ JSONObject zone(&vm_children);
+ zone.AddProperty("name", "Zone");
+ zone.AddProperty("description", "Arena allocation in the Dart VM");
+ intptr_t size = Zone::Size();
+ vm_size += size;
+ zone.AddProperty64("size", size);
+ JSONArray(&zone, "children");
+ }
+
+ {
+ JSONObject semi(&vm_children);
+ semi.AddProperty("name", "SemiSpace Cache");
+ semi.AddProperty("description", "Cached heap regions");
+ intptr_t size = SemiSpace::CachedSize();
+ vm_size += size;
+ semi.AddProperty64("size", size);
+ JSONArray(&semi, "children");
+ }
+
+ IsolateGroup::ForEach([&vm_children,
+ &vm_size](IsolateGroup* isolate_group) {
+ // Note: new_space()->CapacityInWords() includes memory that hasn't been
+ // allocated from the OS yet.
+ int64_t capacity =
+ (isolate_group->heap()->new_space()->UsedInWords() +
+ isolate_group->heap()->old_space()->CapacityInWords()) *
+ kWordSize;
+ int64_t used = isolate_group->heap()->TotalUsedInWords() * kWordSize;
+ int64_t free = capacity - used;
+
+ JSONObject group(&vm_children);
+ group.AddPropertyF("name", "IsolateGroup %s",
+ isolate_group->source()->name);
+ group.AddProperty("description", "Dart heap capacity");
+ vm_size += capacity;
+ group.AddProperty64("size", capacity);
+ JSONArray group_children(&group, "children");
+
+ {
+ JSONObject jsused(&group_children);
+ jsused.AddProperty("name", "Used");
+ jsused.AddProperty("description", "");
+ jsused.AddProperty64("size", used);
+ JSONArray(&jsused, "children");
+ }
+
+ {
+ JSONObject jsfree(&group_children);
+ jsfree.AddProperty("name", "Free");
+ jsfree.AddProperty("description", "");
+ jsfree.AddProperty64("size", free);
+ JSONArray(&jsfree, "children");
+ }
+ });
+ } // vm_children
+
+ vm.AddProperty("name", "Dart VM");
+ vm.AddProperty("description", "");
+ vm.AddProperty64("size", vm_size);
+ }
+
+ intptr_t used, capacity;
+ const char* implementation;
+ if (MallocHooks::GetStats(&used, &capacity, &implementation)) {
+ JSONObject malloc(&rss_children);
+ malloc.AddPropertyF("name", "Malloc (%s)", implementation);
+ malloc.AddProperty("description", "");
+ malloc.AddProperty64("size", capacity);
+ JSONArray malloc_children(&malloc, "children");
{
- JSONObject profiler(&vm_children);
- profiler.AddProperty("name", "Profiler");
- profiler.AddProperty("description",
- "Samples from the Dart VM's profiler");
- intptr_t size = Profiler::Size();
- vm_size += size;
- profiler.AddProperty64("size", size);
- JSONArray(&profiler, "children");
+ JSONObject malloc_used(&malloc_children);
+ malloc_used.AddProperty("name", "Used");
+ malloc_used.AddProperty("description", "");
+ malloc_used.AddProperty64("size", used);
+ JSONArray(&malloc_used, "children");
}
{
- JSONObject timeline(&vm_children);
- timeline.AddProperty("name", "Timeline");
- timeline.AddProperty(
- "description",
- "Timeline events from dart:developer and Dart_TimelineEvent");
- intptr_t size = Timeline::recorder()->Size();
- vm_size += size;
- timeline.AddProperty64("size", size);
- JSONArray(&timeline, "children");
+ JSONObject malloc_free(&malloc_children);
+ malloc_free.AddProperty("name", "Free");
+ malloc_free.AddProperty("description", "");
+ malloc_free.AddProperty64("size", capacity - used);
+ JSONArray(&malloc_free, "children");
}
-
- {
- JSONObject zone(&vm_children);
- zone.AddProperty("name", "Zone");
- zone.AddProperty("description", "Arena allocation in the Dart VM");
- intptr_t size = Zone::Size();
- vm_size += size;
- zone.AddProperty64("size", size);
- JSONArray(&zone, "children");
- }
-
- {
- JSONObject semi(&vm_children);
- semi.AddProperty("name", "SemiSpace Cache");
- semi.AddProperty("description", "Cached heap regions");
- intptr_t size = SemiSpace::CachedSize();
- vm_size += size;
- semi.AddProperty64("size", size);
- JSONArray(&semi, "children");
- }
-
- IsolateGroup::ForEach(
- [&vm_children, &vm_size](IsolateGroup* isolate_group) {
- // Note: new_space()->CapacityInWords() includes memory that hasn't
- // been allocated from the OS yet.
- int64_t capacity =
- (isolate_group->heap()->new_space()->UsedInWords() +
- isolate_group->heap()->old_space()->CapacityInWords()) *
- kWordSize;
- int64_t used = isolate_group->heap()->TotalUsedInWords() * kWordSize;
- int64_t free = capacity - used;
-
- JSONObject group(&vm_children);
- group.AddPropertyF("name", "IsolateGroup %s",
- isolate_group->source()->name);
- group.AddProperty("description", "Dart heap capacity");
- vm_size += capacity;
- group.AddProperty64("size", capacity);
- JSONArray group_children(&group, "children");
-
- {
- JSONObject jsused(&group_children);
- jsused.AddProperty("name", "Used");
- jsused.AddProperty("description", "");
- jsused.AddProperty64("size", used);
- JSONArray(&jsused, "children");
- }
-
- {
- JSONObject jsfree(&group_children);
- jsfree.AddProperty("name", "Free");
- jsfree.AddProperty("description", "");
- jsfree.AddProperty64("size", free);
- JSONArray(&jsfree, "children");
- }
- });
- } // vm_children
-
- vm.AddProperty("name", "Dart VM");
- vm.AddProperty("description", "");
- vm.AddProperty64("size", vm_size);
+ }
return vm_size;
}
@@ -4748,7 +4876,15 @@
jsobj.AddProperty64("pid", OS::ProcessId());
jsobj.AddPropertyTimeMillis(
"startTime", OS::GetCurrentTimeMillis() - Dart::UptimeMillis());
- MallocHooks::PrintToJSONObject(&jsobj);
+ {
+ intptr_t used, capacity;
+ const char* implementation;
+ if (MallocHooks::GetStats(&used, &capacity, &implementation)) {
+ jsobj.AddProperty("_mallocUsed", used);
+ jsobj.AddProperty("_mallocCapacity", capacity);
+ jsobj.AddProperty("_mallocImplementation", implementation);
+ }
+ }
PrintJSONForEmbedderInformation(&jsobj);
// Construct the isolate and isolate_groups list.
{
@@ -5176,6 +5312,8 @@
get_inbound_references_params },
{ "getInstances", GetInstances,
get_instances_params },
+ { "_getInstancesAsArray", GetInstancesAsArray,
+ get_instances_as_array_params },
{ "getPorts", GetPorts,
get_ports_params },
{ "getIsolate", GetIsolate,
diff --git a/tests/language/const_functions/const_functions_list_error_test.dart b/tests/language/const_functions/const_functions_list_error_test.dart
new file mode 100644
index 0000000..64a05e7
--- /dev/null
+++ b/tests/language/const_functions/const_functions_list_error_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests erroneous list usage with const functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const firstException = firstExceptionFn();
+// ^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [cfe] Constant evaluation error:
+int firstExceptionFn() {
+ const List<int> x = [];
+ return x.first;
+}
+
+const lastException = lastExceptionFn();
+// ^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [cfe] Constant evaluation error:
+int lastExceptionFn() {
+ const List<int> x = [];
+ return x.last;
+}
+
+const singleException = singleExceptionFn();
+// ^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [cfe] Constant evaluation error:
+int singleExceptionFn() {
+ const List<int> x = [];
+ return x.single;
+}
+
+const singleExceptionMulti = singleExceptionMultiFn();
+// ^^^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [cfe] Constant evaluation error:
+int singleExceptionMultiFn() {
+ const List<int> x = [1, 2];
+ return x.single;
+}
+
+const invalidProperty = invalidPropertyFn();
+// ^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+int invalidPropertyFn() {
+ const List<int> x = [1, 2];
+ return x.invalidProperty;
+ // ^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
+ // [cfe] The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+}
diff --git a/tests/language/const_functions/const_functions_list_test.dart b/tests/language/const_functions/const_functions_list_test.dart
new file mode 100644
index 0000000..0810d57
--- /dev/null
+++ b/tests/language/const_functions/const_functions_list_test.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests lists with const functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const firstVar = firstFn();
+// ^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+int firstFn() {
+ const List<int> x = [1, 2];
+ return x.first;
+}
+
+const firstCatchVar = firstCatchFn();
+// ^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+int firstCatchFn() {
+ try {
+ const List<int> x = [];
+ var v = x.first;
+ } on StateError {
+ return 0;
+ }
+ return 1;
+}
+
+const hashCodeVar = hashCodeFn();
+// ^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+int hashCodeFn() {
+ const List<int> x = [1, 2];
+ return x.hashCode;
+}
+
+const isEmptyVar = isEmptyFn();
+// ^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+bool isEmptyFn() {
+ const List<int> x = [1, 2];
+ return x.isEmpty;
+}
+
+const isNotEmptyVar = isNotEmptyFn();
+// ^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+bool isNotEmptyFn() {
+ const List<int> x = [1, 2];
+ return x.isNotEmpty;
+}
+
+const lastVar = lastFn();
+// ^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+int lastFn() {
+ const List<int> x = [1, 2];
+ return x.last;
+}
+
+const lastCatchVar = lastCatchFn();
+// ^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+int lastCatchFn() {
+ try {
+ const List<int> x = [];
+ var v = x.last;
+ } on StateError {
+ return 0;
+ }
+ return 1;
+}
+
+const lengthVar = lengthFn();
+// ^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+int lengthFn() {
+ const List<int> x = [1, 2];
+ return x.length;
+}
+
+const singleVar = singleFn();
+// ^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+int singleFn() {
+ const List<int> x = [1];
+ return x.single;
+}
+
+const singleCatchVar = singleCatchFn();
+// ^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+int singleCatchFn() {
+ try {
+ const List<int> x = [];
+ var v = x.single;
+ } on StateError {
+ return 0;
+ }
+ return 1;
+}
+
+const singleCatchVar2 = singleCatchFn2();
+// ^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+int singleCatchFn2() {
+ try {
+ const List<int> x = [1, 2];
+ var v = x.single;
+ } on StateError {
+ return 0;
+ }
+ return 1;
+}
+
+const typeExample = int;
+const typeVar = typeFn();
+// ^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [web] Constant evaluation error:
+Type typeFn() {
+ const List<int> x = [1, 2];
+ return x.runtimeType;
+}
+
+void main() {
+ Expect.equals(firstVar, 1);
+ Expect.equals(firstCatchVar, 0);
+ Expect.type<int>(hashCodeVar);
+ Expect.equals(isEmptyVar, false);
+ Expect.equals(isNotEmptyVar, true);
+ Expect.equals(lastVar, 2);
+ Expect.equals(lastCatchVar, 0);
+ Expect.equals(lengthVar, 2);
+ Expect.equals(singleVar, 1);
+ Expect.equals(singleCatchVar, 0);
+ Expect.equals(singleCatchVar2, 0);
+ Expect.equals(typeVar, int);
+}
diff --git a/tests/language/vm/regress_45674_test.dart b/tests/language/vm/regress_45674_test.dart
new file mode 100644
index 0000000..9ae6128
--- /dev/null
+++ b/tests/language/vm/regress_45674_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Reduced from
+
+// The Dart Project Fuzz Tester (1.89).
+// Program generated as:
+// dart dartfuzz.dart --seed 3586617624 --no-fp --no-ffi --flat
+
+import 'dart:typed_data';
+
+Int32x4List var14 = Int32x4List(5);
+Map<bool, int> var58 = {false: -5, true: -16, false: 22};
+
+bool foo3_Extension1() {
+ try {
+ print(var14[((Int32x4.wyxw as int) >> var58[true]!)]);
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+main() {
+ var r;
+ try {
+ r = foo3_Extension1();
+ } catch (e) {
+ Expect.fail("Exception should have been caught sooner");
+ }
+ Expect.equals(false, r);
+}
diff --git a/tests/language_2/vm/regress_45674_test.dart b/tests/language_2/vm/regress_45674_test.dart
new file mode 100644
index 0000000..bbfc20a
--- /dev/null
+++ b/tests/language_2/vm/regress_45674_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Reduced from
+
+// The Dart Project Fuzz Tester (1.89).
+// Program generated as:
+// dart dartfuzz.dart --seed 3586617624 --no-fp --no-ffi --flat
+
+import 'dart:typed_data';
+
+Int32x4List var14 = Int32x4List(5);
+Map<bool, int> var58 = {false: -5, true: -16, false: 22};
+
+bool foo3_Extension1() {
+ try {
+ print(var14[((Int32x4.wyxw as int) >> var58[true])]);
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+main() {
+ var r;
+ try {
+ r = foo3_Extension1();
+ } catch (e) {
+ Expect.fail("Exception should have been caught sooner");
+ }
+ Expect.equals(false, r);
+}
diff --git a/tools/VERSION b/tools/VERSION
index e26d75d..ce86f3f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 4
+PRERELEASE 5
PRERELEASE_PATCH 0
\ No newline at end of file