Version 2.8.0-dev.17.0
Merge commit 'e3af7e724f51ca12636ed0c716cbb3daab9213d5' into dev
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 8c08a77..ebfd144 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -201,6 +201,12 @@
"languageVersion": "2.3"
},
{
+ "name": "dds",
+ "rootUri": "../pkg/dds",
+ "packageUri": "lib/",
+ "languageVersion": "2.3"
+ },
+ {
"name": "dev_compiler",
"rootUri": "../pkg/dev_compiler",
"packageUri": "lib/",
@@ -568,6 +574,12 @@
"languageVersion": "1.22"
},
{
+ "name": "shelf_proxy",
+ "rootUri": "../third_party/pkg/shelf_proxy",
+ "packageUri": "lib/",
+ "languageVersion": "2.3"
+ },
+ {
"name": "shelf_static",
"rootUri": "../third_party/pkg/shelf_static",
"packageUri": "lib/",
@@ -607,7 +619,7 @@
"name": "source_span",
"rootUri": "../third_party/pkg/source_span",
"packageUri": "lib/",
- "languageVersion": "1.8"
+ "languageVersion": "2.6"
},
{
"name": "sourcemap_testing",
@@ -724,18 +736,6 @@
"languageVersion": "2.0"
},
{
- "name": "unittest",
- "rootUri": "../third_party/pkg/unittest",
- "packageUri": "lib/",
- "languageVersion": "2.0"
- },
- {
- "name": "unittest-orig",
- "rootUri": "../third_party/pkg/unittest-orig",
- "packageUri": "lib/",
- "languageVersion": "1.0"
- },
- {
"name": "usage",
"rootUri": "../third_party/pkg/usage",
"packageUri": "lib/",
@@ -784,4 +784,4 @@
"languageVersion": "2.0"
}
]
-}
\ No newline at end of file
+}
diff --git a/.packages b/.packages
index a5ab646..bb207f5 100644
--- a/.packages
+++ b/.packages
@@ -36,6 +36,7 @@
dartdev:pkg/dartdev/lib
dartdoc:third_party/pkg/dartdoc/lib
dartfix:pkg/dartfix/lib
+dds:pkg/dds/lib
dev_compiler:pkg/dev_compiler/lib
diagnostic:pkg/diagnostic/lib
expect:pkg/expect/lib
@@ -85,6 +86,7 @@
sdk_library_metadata:sdk/lib/_internal/sdk_library_metadata/lib
shelf:third_party/pkg/shelf/lib
shelf_packages_handler:third_party/pkg/shelf_packages_handler/lib
+shelf_proxy:third_party/pkg/shelf_proxy/lib
shelf_static:third_party/pkg/shelf_static/lib
shelf_web_socket:third_party/pkg/shelf_web_socket/lib
smith:pkg/smith/lib
@@ -109,7 +111,6 @@
testing:pkg/testing/lib
tflite_native:third_party/pkg/tflite_native/lib
typed_data:third_party/pkg/typed_data/lib
-unittest:third_party/pkg/unittest/lib
usage:third_party/pkg/usage/lib
vm:pkg/vm/lib
vm_service:pkg/vm_service/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bfced46..6e4afcd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,13 +6,28 @@
### Core libraries
+#### `dart:async`
+
+* Make stack traces non-null. Where methods like `completer.completeError`
+ allows omitting a stack trace, the platform will now insert a default
+ stack trace rather than propagate a `null` value.
+ Error handling functions need no longer be prepared for `null` stack traces.
+
#### `dart:core`
+* Adds `StackTrace.empty` constant which is the stack trace used as default
+ stack trace when no better alternative is available.
+
* The class `TypeError` no longer extends `AssertionError`.
This also means that it no longer inherits the spurious `message` getter
which was added to `AssertionError` when the second operand to `assert`
was allowed. The value of that getter on a `TypeError` was the same
string as returned by `toString`, so it is still available.
+* `ArgumentError.checkNotNull` and the `RangeError` static methods
+ `checkValueInInterval`, `checkValidIndex` and `checkNotNegative`
+ all return their first argument on success.
+ This makes these functions more convenient to use in-line in,
+ for example, `=>` function bodies or constructor initialization lists.
#### `dart:developer`
@@ -74,6 +89,54 @@
now contains Unix epoch timestamps instead of `null` for the `accessed`,
`changed`, and `modified` getters.
+* **Breaking change** [#40709](https://github.com/dart-lang/sdk/issues/40709):
+ The `HeaderValue` class now parses more strictly in two invalid edge cases.
+ This is the class used to parse the semicolon delimited parameters used in the
+ `Accept`, `Authorization`, `Content-Type`, and other such HTTP headers.
+
+ The empty parameter value without double quotes (which is not allowed by the
+ standards) is now parsed as the empty string rather than `null`. E.g.
+ `HeaderValue.parse("v;a=").parameters` now gives `{"a": ""}` rather than
+ `{"a": null}`.
+
+ Invalid inputs with unbalanced double quotes are now rejected. E.g.
+ `HeaderValue.parse('v;a="b').parameters` will now throw a `HttpException`
+ instead of giving `{"a": "b"}`.
+
+* The `HeaderValue.toString()` method now supports parameters with `null` values
+ by omitting the value. `HeaderValue("v", {"a": null, "b": "c"}).toString()`
+ now gives `v; a; b=c`. This behavior can be used to implement some features in
+ the `Accept` and `Sec-WebSocket-Extensions` headers.
+
+ Likewise the empty value and values using characters outside of
+ [RFC 7230 tokens](https://tools.ietf.org/html/rfc7230#section-3.2.6) are now
+ correctly implemented by double quoting such values with escape sequences.
+ E.g:
+
+ ```dart
+ HeaderValue("v",
+ {"a": "A", "b": "(B)", "c": "", "d": "ø", "e": "\\\""}).toString()
+ ```
+
+ now gives `v;a=A;b="(B)";c="";d="ø";e="\\\""`.
+
+* [Unix domain sockets](https://en.wikipedia.org/wiki/Unix_domain_socket) are
+ now supported on Linux, Android and MacOS, which can be used by passing a
+ `InternetAddress` of `InternetAddressType.Unix` into `connect`, `startConnect`
+ and `bind` methods. `port` argument in those methods will be ignored. Getter
+ of `port` will always return 0 for Unix domain sockets.
+
+* Class `InternetAddressType` gains one more option `Unix`, which represents a
+ Unix domain address.
+
+* Class `InternetAddress`:
+ * `InternetAddress` constructor gains an optional `type` parameter. To create
+ a Unix domain address, `type` is set to `InternetAddressType.Unix` and
+ `address` is a file path.
+ * `InternetAddress` gains a new constructor `fromRawAddress` that takes an
+ address in byte format for Internet addresses or raw file path for Unix
+ domain addresses.
+
#### `dart:mirrors`
* Added `MirrorSystem.neverType`.
@@ -166,6 +229,9 @@
#### Pub
+* Added `pub outdated` command which lists outdated package dependencies, and
+ gives advice on how to upgrade.
+
* `pub get` and `pub upgrade` now fetches version information about hosted
dependencies in parallel, improving the time package resolution performance.
@@ -178,13 +244,19 @@
* Importing packages not in `pubspec.yaml` now causes `pub publish` to reject
the package.
+* `pub publish` no longer requires the presence of a `homepage` field, if the
+ `repository` field is provided.
+
+* `pub publish` will now warn if non-pre-release packages depends on pre-release
+ packages or pre-release Dart SDKs.
+
* Relative paths in `pubspec.lock` are now using `/` also on Windows to make
the file sharable between machines.
* Fixed language version in [`.dart_tool/package_config.json`](https://github.com/dart-lang/language/blob/master/accepted/future-releases/language-versioning/package-config-file-v2.md)
for packages without an explicit sdk constraint.
- Now writes an empty language-version while efore the language version of the
+ Now writes an empty language-version while before the language version of the
current sdk would be used.
* `%LOCALAPPDATA%` is now preferred over `%APPDATA%` when creating a pub cache
@@ -243,9 +315,14 @@
[17207]: https://github.com/dart-lang/sdk/issues/17207
-## 2.7.2 - 2020-03-16
+## 2.7.2 - 2020-03-23
-This is a patch release that improves compatibility with ARMv8 processors
+This is a patch release that addresses a vulnerability dart:html
+[NodeValidator](https://api.dart.dev/stable/dart-html/NodeValidator-class.html)
+related to DOM clobbering of `previousSibling`. Thanks to **Vincenzo di Cicco**
+for finding and reporting this issue.
+
+This release also improves compatibility with ARMv8 processors
(issue [40001][]) and dart:io stability (issue [40589][]).
[40001]: https://github.com/dart-lang/sdk/issues/40001
diff --git a/DEPS b/DEPS
index 353c1c2..9a6d8c6 100644
--- a/DEPS
+++ b/DEPS
@@ -99,7 +99,7 @@
"http_throttle_tag" : "1.0.2",
"icu_rev" : "c56c671998902fcc4fc9ace88c83daa99f980793",
"idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
- "intl_tag": "0.15.7",
+ "intl_tag": "0.16.1",
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
"json_rpc_2_tag": "2.0.9",
"linter_tag": "0.1.113",
@@ -119,7 +119,7 @@
"ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
"pool_tag": "1.3.6",
"protobuf_rev": "3746c8fd3f2b0147623a8e3db89c3ff4330de760",
- "pub_rev": "429a06039d185149f387a65e3503b0693ce6d24e",
+ "pub_rev": "11afdac99fe67373829f37acc75b625011d360ad",
"pub_semver_tag": "v1.4.4",
"quiver-dart_tag": "2.0.0+1",
"resource_rev": "f8e37558a1c4f54550aa463b88a6a831e3e33cd6",
@@ -127,12 +127,13 @@
"rust_revision": "60960a260f7b5c695fd0717311d72ce62dd4eb43",
"shelf_static_rev": "v0.2.8",
"shelf_packages_handler_tag": "2.0.0",
+ "shelf_proxy_tag": "0.1.0+7",
"shelf_tag": "0.7.3+3",
"shelf_web_socket_tag": "0.2.2+3",
"source_map_stack_trace_tag": "2.0.0",
"source_maps-0.9.4_rev": "38524",
"source_maps_tag": "8af7cc1a1c3a193c1fba5993ce22a546a319c40e",
- "source_span_tag": "1.5.5",
+ "source_span_tag": "1.7.0",
"stack_trace_tag": "1.9.3",
"stagehand_tag": "v3.3.7",
"stream_channel_tag": "2.0.0",
@@ -144,11 +145,10 @@
"test_tag": "test_core-v0.3.2",
"tflite_native_rev": "3c777c40608a2a9f1427bfe0028ab48e7116b4c1",
"typed_data_tag": "1.1.6",
- "unittest_rev": "2b8375bc98bb9dc81c539c91aaea6adce12e1072",
"usage_tag": "3.4.0",
"watcher_rev": "0.9.7+14",
"web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
- "web_socket_channel_tag": "1.0.9",
+ "web_socket_channel_tag": "1.0.15",
"WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
"yaml_tag": "2.2.0",
"zlib_rev": "c44fb7248079cc3d5563b14b3f758aee60d6b415",
@@ -365,6 +365,8 @@
Var("dart_root") + "/third_party/pkg/shelf_packages_handler":
Var("dart_git") + "shelf_packages_handler.git"
+ "@" + Var("shelf_packages_handler_tag"),
+ Var("dart_root") + "/third_party/pkg/shelf_proxy":
+ Var("dart_git") + "shelf_proxy.git" + "@" + Var("shelf_proxy_tag"),
Var("dart_root") + "/third_party/pkg/shelf_static":
Var("dart_git") + "shelf_static.git" + "@" + Var("shelf_static_rev"),
Var("dart_root") + "/third_party/pkg/shelf_web_socket":
@@ -402,12 +404,6 @@
"@" + Var("test_reflective_loader_tag"),
Var("dart_root") + "/third_party/pkg/typed_data":
Var("dart_git") + "typed_data.git" + "@" + Var("typed_data_tag"),
- # Unittest is an early version, 0.11.x, of the package "test"
- # Do not use it in any new tests. Fetched from chromium_git to avoid
- # race condition in cache with pkg/test.
- Var("dart_root") + "/third_party/pkg/unittest":
- Var("chromium_git") + "/external/github.com/dart-lang/test.git" +
- "@" + Var("unittest_rev"),
Var("dart_root") + "/third_party/pkg/usage":
Var("dart_git") + "usage.git" + "@" + Var("usage_tag"),
Var("dart_root") + "/third_party/pkg/watcher":
diff --git a/README.md b/README.md
index a88db95..27cbb2b 100644
--- a/README.md
+++ b/README.md
@@ -61,6 +61,6 @@
[tools]: https://www.dartlang.org/tools/
[codelab]: https://dart.dev/codelabs
[dartbug]: http://dartbug.com
-[contrib]: https://github.com/dart-lang/sdk/wiki/Contributing
+[contrib]: https://github.com/dart-lang/sdk/blob/master/CONTRIBUTING.md
[pubsite]: https://pub.dev
[patent_grant]: https://github.com/dart-lang/sdk/blob/master/PATENT_GRANT
diff --git a/WATCHLISTS b/WATCHLISTS
index e88ada2..3e5b2ab 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -68,9 +68,8 @@
'WATCHLISTS': {
'build': [ 'keertip@google.com' ],
- 'dart2js': [ 'johnniwinther@google.com', 'sigmund@google.com',
- 'sra@google.com', 'fishythefish@google.com',
- 'joshualitt@google.com' ],
+ 'dart2js': [ 'sigmund@google.com', 'sra@google.com',
+ 'fishythefish@google.com', 'joshualitt@google.com' ],
'front_end': [ 'dart-fe-team+reviews@google.com' ],
'kernel': [ 'jensj@google.com', 'alexmarkov@google.com' ],
'messages_review': [ 'dart-uxr+reviews@google.com' ],
diff --git a/benchmarks/ListCopy/dart/ListCopy.dart b/benchmarks/ListCopy/dart/ListCopy.dart
index e058928..cd16fc0 100644
--- a/benchmarks/ListCopy/dart/ListCopy.dart
+++ b/benchmarks/ListCopy/dart/ListCopy.dart
@@ -56,7 +56,8 @@
while (totalLength < elements) {
var variants = makeVariants();
inputs.addAll(variants);
- totalLength += variants.fold(0, (sum, iterable) => sum + iterable.length);
+ totalLength +=
+ variants.fold<int>(0, (sum, iterable) => sum + iterable.length);
}
// Sanity checks.
@@ -90,7 +91,7 @@
// All the 'copy' methods use [input] and [output] rather than a parameter and
// return value to avoid any possibility of type check in the call sequence.
-Iterable<num> input;
+Iterable<num> input = const [];
var output;
List<Benchmark> makeBenchmarks(int length) => [
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni
index e0a3abc..e93ede0 100644
--- a/build/config/mac/mac_sdk.gni
+++ b/build/config/mac/mac_sdk.gni
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/toolchain/goma.gni")
+
declare_args() {
# Minimum supported version of the Mac SDK.
mac_sdk_min = "10.8"
@@ -10,6 +12,8 @@
# the end. If empty, the path to the lowest version greater than or equal to
# mac_sdk_min is used.
mac_sdk_path = ""
+
+ mac_enable_relative_sdk_path = mac_use_goma_rbe
}
find_sdk_args = [
@@ -17,6 +21,15 @@
mac_sdk_min,
]
+if (mac_use_goma_rbe) {
+ find_sdk_args += [
+ "--create_symlink_at",
+
+ # $root_build_dir starts with "//", which is removed by rebase_path().
+ rebase_path("$root_build_dir/sdk/xcode_links", "//"),
+ ]
+}
+
# The tool will print the SDK path on the first line, and the version on the
# second line.
find_sdk_lines =
diff --git a/build/mac/find_sdk.py b/build/mac/find_sdk.py
index 3e7bbc1..a53ba28 100755
--- a/build/mac/find_sdk.py
+++ b/build/mac/find_sdk.py
@@ -17,6 +17,41 @@
from optparse import OptionParser
+# sdk/build/xcode_links
+ROOT_SRC_DIR = os.path.join(
+ os.path.dirname(
+ os.path.dirname(os.path.dirname(os.path.realpath(__file__)))))
+
+
+def CreateSymlinkForSDKAt(src, dst):
+ """
+ Create symlink to Xcode directory at target location, which can be absolute or
+ relative to `ROOT_SRC_DIR`.
+ """
+
+ # If `dst` is relative, it is assumed to be relative to src root.
+ if not os.path.isabs(dst):
+ dst = os.path.join(ROOT_SRC_DIR, dst)
+
+ if not os.path.isdir(dst):
+ os.makedirs(dst)
+
+ dst = os.path.join(dst, os.path.basename(src))
+
+ # Update the symlink if exists.
+ if os.path.islink(dst):
+ current_src = os.readlink(dst)
+ if current_src == src:
+ return dst
+
+ os.unlink(dst)
+ sys.stderr.write('existing symlink %s points %s; want %s. Removed.' %
+ (dst, current_src, src))
+
+ os.symlink(src, dst)
+ return dst
+
+
def parse_version(version_str):
"""'10.6' => [10, 6]"""
return map(int, re.findall(r'(\d+)', version_str))
@@ -43,6 +78,13 @@
dest="print_sdk_path",
default=False,
help="Additionaly print the path the SDK (appears first).")
+ parser.add_option(
+ "--create_symlink_at",
+ action="store",
+ dest="create_symlink_at",
+ help=
+ "Create symlink to SDK at given location and return symlink path as SDK "
+ "info instead of the original location.")
(options, args) = parser.parse_args()
min_sdk_version = args[0]
@@ -91,9 +133,13 @@
return min_sdk_version
if options.print_sdk_path:
- print subprocess.check_output(
+ sdk_path = subprocess.check_output(
['xcodebuild', '-version', '-sdk', 'macosx' + best_sdk,
'Path']).strip()
+ if options.create_symlink_at:
+ print CreateSymlinkForSDKAt(sdk_path, options.create_symlink_at)
+ else:
+ print sdk_path
return best_sdk
diff --git a/build/toolchain/goma.gni b/build/toolchain/goma.gni
index c0f4cf2..d2bfcf9 100644
--- a/build/toolchain/goma.gni
+++ b/build/toolchain/goma.gni
@@ -19,4 +19,8 @@
# Absolute directory containing the Goma source code.
goma_dir = getenv("HOME") + "/goma"
}
+
+ # Sets relative symlink path to Xcode SDK path.
+ # Based on http://crrev.com/c/1946174.
+ mac_use_goma_rbe = false
}
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index 48ef702..2c1839f 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -222,6 +222,9 @@
ld = cxx
strip = "strip"
is_clang = true
+ if (mac_enable_relative_sdk_path) {
+ mac_sdk_path = rebase_path(mac_sdk_path, root_build_dir)
+ }
sysroot_flags = "-isysroot $mac_sdk_path -mmacosx-version-min=$mac_sdk_min"
}
@@ -236,5 +239,8 @@
ld = cxx
strip = "strip"
is_clang = true
+ if (mac_enable_relative_sdk_path) {
+ mac_sdk_path = rebase_path(mac_sdk_path, root_build_dir)
+ }
sysroot_flags = "-isysroot $mac_sdk_path -mmacosx-version-min=$mac_sdk_min"
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
index 0b7cc1c..743f67d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
@@ -123,6 +123,7 @@
Map<String, dynamic> get arguments => messageObject.arguments;
+ @override
int compareTo(LocatedMessage other) {
int result = "${uri}".compareTo("${other.uri}");
if (result != 0) return result;
@@ -136,6 +137,28 @@
return new FormattedMessage(
this, formatted, line, column, severity, relatedInformation);
}
+
+ @override
+ int get hashCode =>
+ 13 * uri.hashCode +
+ 17 * charOffset.hashCode +
+ 19 * length.hashCode +
+ 23 * messageObject.hashCode;
+
+ @override
+ bool operator ==(Object other) {
+ if (identical(this, other)) return true;
+ return other is LocatedMessage &&
+ uri == other.uri &&
+ charOffset == other.charOffset &&
+ length == other.length &&
+ messageObject == other.messageObject;
+ }
+
+ @override
+ String toString() =>
+ 'LocatedMessage(uri=$uri,charOffset=$charOffset,length=$length,'
+ 'messageObject=$messageObject)';
}
class FormattedMessage implements DiagnosticMessage {
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 6d316e6..b4145ba 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -103,6 +103,15 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAmbiguousExtensionCause = messageAmbiguousExtensionCause;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAmbiguousExtensionCause = const MessageCode(
+ "AmbiguousExtensionCause",
+ severity: Severity.context,
+ message: r"""This is one of the extension members.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeAnnotationOnFunctionTypeTypeVariable =
messageAnnotationOnFunctionTypeTypeVariable;
@@ -952,17 +961,6 @@
message: r"""Constructor is marked 'const' so fields can't be late.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeConstConstructorLateFinalFieldWarning =
- messageConstConstructorLateFinalFieldWarning;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageConstConstructorLateFinalFieldWarning =
- const MessageCode("ConstConstructorLateFinalFieldWarning",
- severity: Severity.warning,
- message:
- r"""Constructor is marked 'const' and some fields are late.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeConstConstructorNonFinalField =
messageConstConstructorNonFinalField;
@@ -1685,6 +1683,16 @@
message: r"""This is the inherited member.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeDeclaredMemberConflictsWithInheritedMembersCause =
+ messageDeclaredMemberConflictsWithInheritedMembersCause;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageDeclaredMemberConflictsWithInheritedMembersCause =
+ const MessageCode("DeclaredMemberConflictsWithInheritedMembersCause",
+ severity: Severity.context,
+ message: r"""This is one of the inherited members.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeDefaultListConstructorError =
messageDefaultListConstructorError;
@@ -1695,17 +1703,6 @@
tip: r"""Try using List.filled instead.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeDefaultListConstructorWarning =
- messageDefaultListConstructorWarning;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageDefaultListConstructorWarning = const MessageCode(
- "DefaultListConstructorWarning",
- severity: Severity.warning,
- message: r"""Using the default List constructor.""",
- tip: r"""Try using List.filled instead.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)>
templateDefaultValueInRedirectingFactoryConstructor =
const Template<Message Function(String name)>(
@@ -2959,6 +2956,15 @@
r"""This can't be used as metadata; metadata should be a reference to a compile-time constant variable, or a call to a constant constructor.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeExtendFunction = messageExtendFunction;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageExtendFunction = const MessageCode("ExtendFunction",
+ severity: Severity.ignored,
+ message: r"""Extending 'Function' is deprecated.""",
+ tip: r"""Try removing 'Function' from the 'extends' clause.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)> templateExtendingEnum =
const Template<Message Function(String name)>(
messageTemplate:
@@ -3972,6 +3978,16 @@
message: r"""Functions marked 'sync*' can't have return type 'void'.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeImplementFunction = messageImplementFunction;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageImplementFunction = const MessageCode(
+ "ImplementFunction",
+ severity: Severity.ignored,
+ message: r"""Implementing 'Function' is deprecated.""",
+ tip: r"""Try removing 'Function' from the 'implements' clause.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeImplementsBeforeExtends = messageImplementsBeforeExtends;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5857,6 +5873,15 @@
message: r"""Mixins can't declare constructors.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeMixinFunction = messageMixinFunction;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageMixinFunction = const MessageCode("MixinFunction",
+ severity: Severity.ignored,
+ message: r"""Mixing in 'Function' is deprecated.""",
+ tip: r"""Try removing 'Function' from the 'with' clause.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String string,
@@ -6170,6 +6195,58 @@
message: r"""Can't spread a value with static type Null.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+ templateNonNullableLateDefinitelyAssignedError =
+ const Template<Message Function(String name)>(
+ messageTemplate:
+ r"""Non-nullable late final variable '#name' definitely assigned.""",
+ withArguments: _withArgumentsNonNullableLateDefinitelyAssignedError);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+ codeNonNullableLateDefinitelyAssignedError =
+ const Code<Message Function(String name)>(
+ "NonNullableLateDefinitelyAssignedError",
+ templateNonNullableLateDefinitelyAssignedError,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonNullableLateDefinitelyAssignedError(String name) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ return new Message(codeNonNullableLateDefinitelyAssignedError,
+ message:
+ """Non-nullable late final variable '${name}' definitely assigned.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+ templateNonNullableLateDefinitelyUnassignedError =
+ const Template<Message Function(String name)>(
+ messageTemplate:
+ r"""Non-nullable late variable '#name' without initializer is definitely unassigned.""",
+ withArguments: _withArgumentsNonNullableLateDefinitelyUnassignedError);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+ codeNonNullableLateDefinitelyUnassignedError =
+ const Code<Message Function(String name)>(
+ "NonNullableLateDefinitelyUnassignedError",
+ templateNonNullableLateDefinitelyUnassignedError,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonNullableLateDefinitelyUnassignedError(String name) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ return new Message(codeNonNullableLateDefinitelyUnassignedError,
+ message:
+ """Non-nullable late variable '${name}' without initializer is definitely unassigned.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String
@@ -6197,30 +6274,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
- templateNonNullableNotAssignedWarning =
- const Template<Message Function(String name)>(
- messageTemplate:
- r"""Non-nullable variable '#name' is used before it's assigned.""",
- withArguments: _withArgumentsNonNullableNotAssignedWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNonNullableNotAssignedWarning =
- const Code<Message Function(String name)>(
- "NonNullableNotAssignedWarning", templateNonNullableNotAssignedWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNonNullableNotAssignedWarning(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeNonNullableNotAssignedWarning,
- message:
- """Non-nullable variable '${name}' is used before it's assigned.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeNonNullableOptOut = messageNonNullableOptOut;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6451,27 +6504,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateNullableInterfaceWarning =
- const Template<Message Function(String name)>(
- messageTemplate: r"""Implementing '#name' marked with '?'.""",
- withArguments: _withArgumentsNullableInterfaceWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNullableInterfaceWarning =
- const Code<Message Function(String name)>(
- "NullableInterfaceWarning", templateNullableInterfaceWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableInterfaceWarning(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeNullableInterfaceWarning,
- message: """Implementing '${name}' marked with '?'.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)> templateNullableMixinError =
const Template<Message Function(String name)>(
messageTemplate:
@@ -6495,27 +6527,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateNullableMixinWarning =
- const Template<Message Function(String name)>(
- messageTemplate: r"""Mixing in '#name' marked with '?'.""",
- withArguments: _withArgumentsNullableMixinWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNullableMixinWarning =
- const Code<Message Function(String name)>(
- "NullableMixinWarning", templateNullableMixinWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableMixinWarning(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeNullableMixinWarning,
- message: """Mixing in '${name}' marked with '?'.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)> templateNullableSuperclassError =
const Template<Message Function(String name)>(
messageTemplate:
@@ -6539,28 +6550,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
- templateNullableSuperclassWarning =
- const Template<Message Function(String name)>(
- messageTemplate: r"""Extending '#name' marked with '?'.""",
- withArguments: _withArgumentsNullableSuperclassWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNullableSuperclassWarning =
- const Code<Message Function(String name)>(
- "NullableSuperclassWarning", templateNullableSuperclassWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableSuperclassWarning(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeNullableSuperclassWarning,
- message: """Extending '${name}' marked with '?'.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)> templateNullableTearoffError =
const Template<Message Function(String name)>(
messageTemplate:
@@ -6585,29 +6574,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateNullableTearoffWarning =
- const Template<Message Function(String name)>(
- messageTemplate:
- r"""Tearing off method '#name' from a potentially null value.""",
- withArguments: _withArgumentsNullableTearoffWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNullableTearoffWarning =
- const Code<Message Function(String name)>(
- "NullableTearoffWarning", templateNullableTearoffWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableTearoffWarning(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeNullableTearoffWarning,
- message:
- """Tearing off method '${name}' from a potentially null value.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeObjectExtends = messageObjectExtends;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6877,6 +6843,37 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, String name2, String name3)>
+ templateOverrideMismatchRequiredNamedParameter =
+ const Template<Message Function(String name, String name2, String name3)>(
+ messageTemplate:
+ r"""The required named parameter '#name' in method '#name2' is not required in overridden method '#name3'.""",
+ withArguments: _withArgumentsOverrideMismatchRequiredNamedParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2, String name3)>
+ codeOverrideMismatchRequiredNamedParameter =
+ const Code<Message Function(String name, String name2, String name3)>(
+ "OverrideMismatchRequiredNamedParameter",
+ templateOverrideMismatchRequiredNamedParameter,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsOverrideMismatchRequiredNamedParameter(
+ String name, String name2, String name3) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ if (name2.isEmpty) throw 'No name provided';
+ name2 = demangleMixinApplicationName(name2);
+ if (name3.isEmpty) throw 'No name provided';
+ name3 = demangleMixinApplicationName(name3);
+ return new Message(codeOverrideMismatchRequiredNamedParameter,
+ message:
+ """The required named parameter '${name}' in method '${name2}' is not required in overridden method '${name3}'.""",
+ arguments: {'name': name, 'name2': name2, 'name3': name3});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String name,
@@ -7407,34 +7404,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
- templateRequiredNamedParameterHasDefaultValueWarning =
- const Template<Message Function(String name)>(
- messageTemplate:
- r"""Named parameter '#name' is required and has a default value.""",
- withArguments:
- _withArgumentsRequiredNamedParameterHasDefaultValueWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)>
- codeRequiredNamedParameterHasDefaultValueWarning =
- const Code<Message Function(String name)>(
- "RequiredNamedParameterHasDefaultValueWarning",
- templateRequiredNamedParameterHasDefaultValueWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsRequiredNamedParameterHasDefaultValueWarning(
- String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeRequiredNamedParameterHasDefaultValueWarning,
- message:
- """Named parameter '${name}' is required and has a default value.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeRequiredParameterWithDefault =
messageRequiredParameterWithDefault;
@@ -8412,6 +8381,14 @@
message: r"""Can't create typedef from non-type.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeTypedefNullableType = messageTypedefNullableType;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageTypedefNullableType = const MessageCode(
+ "TypedefNullableType",
+ message: r"""Can't create typedef from nullable type.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeUnexpectedDollarInString = messageUnexpectedDollarInString;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8652,31 +8629,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
- templateValueForRequiredParameterNotProvidedWarning =
- const Template<Message Function(String name)>(
- messageTemplate: r"""Missing required named parameter '#name'.""",
- withArguments:
- _withArgumentsValueForRequiredParameterNotProvidedWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)>
- codeValueForRequiredParameterNotProvidedWarning =
- const Code<Message Function(String name)>(
- "ValueForRequiredParameterNotProvidedWarning",
- templateValueForRequiredParameterNotProvidedWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsValueForRequiredParameterNotProvidedWarning(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeValueForRequiredParameterNotProvidedWarning,
- message: """Missing required named parameter '${name}'.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeVarAsTypeName = messageVarAsTypeName;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/switch.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/switch.dart
index 9a817a5..3ff0405 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/switch.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/switch.dart
@@ -37,7 +37,7 @@
/*stmt: unreachable*/ 1;
}
-/*analyzer.member: enum_no_default:doesNotComplete*/
+/*member: enum_no_default:doesNotComplete*/
void enum_no_default(MyEnum e) {
switch (e) {
case MyEnum.a:
@@ -45,5 +45,5 @@
case MyEnum.b:
return;
}
- /*analyzer.stmt: unreachable*/ 1;
+ /*stmt: unreachable*/ 1;
}
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart
index e44c4a7..a76e128 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart
@@ -35,9 +35,7 @@
}
}
-void outerIsType_assignedOutside(Object x) {
- void Function() g;
-
+void outerIsType_assignedOutside(Object x, void Function() g) {
if (x is String) {
/*String*/ x;
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
index 61e7e36..ae5b1dbf 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
@@ -30,8 +30,7 @@
*/
class LegacyClass3b<T> extends Class3<T> implements GenericInterface<T> {}
-/*cfe.class: LegacyClass4a:Class4a,GenericInterface<num*>,LegacyClass4a,Object*/
-/*cfe:builder|analyzer.class: LegacyClass4a:Class4a,GenericInterface<num>,LegacyClass4a,Object*/
+/*class: LegacyClass4a:Class4a,GenericInterface<num*>,LegacyClass4a,Object*/
class LegacyClass4a extends Class4a {}
/*class: LegacyClass4b:GenericInterface<num*>,LegacyClass4b,Object*/
@@ -40,12 +39,10 @@
/*class: LegacyClass4c:Class4a,GenericInterface<num*>,LegacyClass4c,Object*/
class LegacyClass4c extends Class4a implements GenericInterface<num> {}
-/*cfe|cfe:builder.class: LegacyClass4d:Class4a,Class4b,GenericInterface<num*>,LegacyClass4d,Object*/
-/*analyzer.class: LegacyClass4d:Class4a,Class4b,GenericInterface<num>,LegacyClass4d,Object*/
+/*class: LegacyClass4d:Class4a,Class4b,GenericInterface<num*>,LegacyClass4d,Object*/
class LegacyClass4d implements Class4a, Class4b {}
-/*cfe|cfe:builder.class: LegacyClass5:Class5,GenericInterface<dynamic>,LegacyClass5,Object*/
-/*analyzer.class: LegacyClass5:Class5,GenericInterface<Object*>,LegacyClass5,Object*/
+/*class: LegacyClass5:Class5,GenericInterface<dynamic>,LegacyClass5,Object*/
/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/
class
/*cfe|cfe:builder.error: AmbiguousSupertypes*/
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/function.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/function.dart
new file mode 100644
index 0000000..eef3371
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/function.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/*library: nnbd=true*/
+
+/*class: A:A,Object*/
+class A implements Function {}
+
+/*class: B:B,Object*/
+class B extends Function {}
+
+/*cfe|cfe:builder.class: C:C,Object,_C&Object&Function*/
+/*analyzer.class: C:C,Object*/
+class C extends Object with Function {}
+
+// CFE hides that this is a mixin declaration since its mixed in type has been
+// removed.
+/*cfe|cfe:builder.class: _C&Object&Function:Object,_C&Object&Function*/
+
+/*cfe|cfe:builder.class: D:D,Object*/
+class D = Object with Function;
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/main.dart
index 11d144e..55ab8f7 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/main.dart
@@ -17,3 +17,31 @@
/*cfe|cfe:builder.member: SubClass2.method:int? Function(int)*/
/*analyzer.member: SubClass2.method:int* Function(int*)**/
}
+
+/*class: GenericSubClass1a:GenericClass1,GenericInterface<int?>,GenericLegacyClass1a,GenericSubClass1a,Object*/
+/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/ abstract class GenericSubClass1a
+ extends GenericLegacyClass1a implements GenericInterface<int?> {
+ /*cfe|cfe:builder.member: GenericSubClass1a.method:int? Function(int?)*/
+ /*analyzer.member: GenericSubClass1a.method:int* Function(int*)**/
+}
+
+/*class: GenericSubClass1b:GenericClass1,GenericInterface<int?>,GenericLegacyClass1b,GenericSubClass1b,Object*/
+/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/ abstract class GenericSubClass1b
+ extends GenericLegacyClass1b implements GenericInterface<int?> {
+ /*cfe|cfe:builder.member: GenericSubClass1b.method:int? Function(int?)*/
+ /*analyzer.member: GenericSubClass1b.method:int* Function(int*)**/
+}
+
+/*class: GenericSubClass2a:GenericClass2,GenericInterface<int>,GenericLegacyClass2a,GenericSubClass2a,Object*/
+/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/ abstract class GenericSubClass2a
+ extends GenericLegacyClass2a implements GenericInterface<int> {
+ /*cfe|cfe:builder.member: GenericSubClass2a.method:int Function(int)*/
+ /*analyzer.member: GenericSubClass2a.method:int* Function(int*)**/
+}
+
+/*class: GenericSubClass2b:GenericClass2,GenericInterface<int>,GenericLegacyClass2b,GenericSubClass2b,Object*/
+/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/ abstract class GenericSubClass2b
+ extends GenericLegacyClass2b implements GenericInterface<int> {
+ /*cfe|cfe:builder.member: GenericSubClass2b.method:int Function(int)*/
+ /*analyzer.member: GenericSubClass2b.method:int* Function(int*)**/
+}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_in.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_in.dart
index 2e4244b..086a993 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_in.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_in.dart
@@ -15,3 +15,19 @@
/*member: Interface.method:int? Function(int)*/
int? method(int i) => i;
}
+
+/*class: GenericInterface:GenericInterface<T>,Object*/
+abstract class GenericInterface<T> {
+ /*member: GenericInterface.method:T Function(T)*/
+ T method(T t);
+}
+
+/*class: GenericClass1:GenericClass1,GenericInterface<int>,Object*/
+abstract class GenericClass1 implements GenericInterface<int> {
+ /*member: GenericClass1.method:int Function(int)*/
+}
+
+/*class: GenericClass2:GenericClass2,GenericInterface<int?>,Object*/
+abstract class GenericClass2 implements GenericInterface<int?> {
+ /*member: GenericClass2.method:int? Function(int?)*/
+}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_out.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_out.dart
index c3e2b41..aa5fccf 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_out.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_out.dart
@@ -17,3 +17,29 @@
abstract class LegacyClass2 extends Class {
/*member: LegacyClass2.method:int* Function(int*)**/
}
+
+/*class: GenericLegacyClass1a:GenericClass1,GenericInterface<int*>,GenericLegacyClass1a,Object*/
+abstract class GenericLegacyClass1a extends GenericClass1 {
+ /*cfe|cfe:builder.member: GenericLegacyClass1a.method:int* Function(int*)*/
+ /*analyzer.member: GenericLegacyClass1a.method:int* Function(int*)**/
+}
+
+/*class: GenericLegacyClass1b:GenericClass1,GenericInterface<int*>,GenericLegacyClass1b,Object*/
+abstract class GenericLegacyClass1b extends GenericClass1
+ implements GenericInterface<int> {
+ /*cfe|cfe:builder.member: GenericLegacyClass1b.method:int* Function(int*)*/
+ /*analyzer.member: GenericLegacyClass1b.method:int* Function(int*)**/
+}
+
+/*class: GenericLegacyClass2a:GenericClass2,GenericInterface<int*>,GenericLegacyClass2a,Object*/
+abstract class GenericLegacyClass2a extends GenericClass2 {
+ /*cfe|cfe:builder.member: GenericLegacyClass2a.method:int* Function(int*)*/
+ /*analyzer.member: GenericLegacyClass2a.method:int* Function(int*)**/
+}
+
+/*class: GenericLegacyClass2b:GenericClass2,GenericInterface<int*>,GenericLegacyClass2b,Object*/
+abstract class GenericLegacyClass2b extends GenericClass2
+ implements GenericInterface<int> {
+ /*cfe|cfe:builder.member: GenericLegacyClass2b.method:int* Function(int*)*/
+ /*analyzer.member: GenericLegacyClass2b.method:int* Function(int*)**/
+}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart
index a388a8d..9ef0a47 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart
@@ -19,8 +19,7 @@
/*class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
class B1 extends A_Object implements A_dynamic {}
-/*cfe|cfe:builder.class: B2:A<void>,A_Object,A_void,B2,Object*/
-/*analyzer.class: B2:A<Object?>,A_Object,A_void,B2,Object*/
+/*class: B2:A<void>,A_Object,A_void,B2,Object*/
class B2 extends A_Object implements A_void {}
main() {}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart
index 4206e56..4a6f1ad 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart
@@ -12,12 +12,10 @@
/*class: A_void:A<void>,A_void,Object*/
class A_void implements A<void> {}
-/*cfe|cfe:builder.class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
-/*analyzer.class: B1:A<Object*>,A_Object,A_dynamic,B1,Object*/
+/*class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
class B1 extends A_Object implements A_dynamic {}
-/*cfe|cfe:builder.class: B2:A<void>,A_Object,A_void,B2,Object*/
-/*analyzer.class: B2:A<Object*>,A_Object,A_void,B2,Object*/
+/*class: B2:A<void>,A_Object,A_void,B2,Object*/
class B2 extends A_Object implements A_void {}
main() {}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40524/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40524/main.dart
index 2428a5f..83ad4bb 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40524/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40524/main.dart
@@ -11,8 +11,7 @@
/*member: B.getType:Type* Function()**/
}
-/*cfe|cfe:builder.class: C:A<int?>,B,C,Object,out_int*/
-/*analyzer.class: C:A<int*>,B,C,Object,out_int*/
+/*class: C:A<int?>,B,C,Object,out_int*/
class C extends out_int implements B {
/*member: C.getType:Type* Function()**/
}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40541.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40541.dart
index 16456a7..4ff5000 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40541.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40541.dart
@@ -26,8 +26,7 @@
/*member: D1.test:void Function()*/
}
-/*cfe|cfe:builder.class: D2:A<Object?>,B,C,D2,Object*/
-/*analyzer.class: D2:A<dynamic>,B,C,D2,Object*/
+/*class: D2:A<Object?>,B,C,D2,Object*/
class D2 extends C implements B {
/*member: D2.test:void Function()*/
}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40553/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40553/main.dart
index 46bd14d..7917c9b 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40553/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40553/main.dart
@@ -14,8 +14,12 @@
/*member: D.getType:Type* Function()**/
}
+/// TODO: Solve CFE / analyzer disagreement.
+/// It looks to me that CFE type of `A` is incorrect.
+/// As described in https://github.com/dart-lang/sdk/issues/40553,
+/// NNBD_TOP_MERGE(FutureOr<int?>, FutureOr*<int*>) = FutureOr<int?>
/*cfe|cfe:builder.class: E:A<FutureOr<int?>?>,B,C,E,Object*/
-/*analyzer.class: E:A<FutureOr<int*>*>,B,C,E,Object*/
+/*analyzer.class: E:A<FutureOr<int?>>,B,C,E,Object*/
class E extends B implements C {
/*member: E.getType:Type* Function()**/
}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/main.dart
index 0fef8c6..8ae0381 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/main.dart
@@ -39,22 +39,12 @@
/*member: Interface.method5b:int Function({int a, int b})*/
int method5b({int a: 0, int b: 0});
- /*member: Interface.method5c:int Function({required int a, required int b})*/
- int method5c(
- {required int /*analyzer.error: CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER*/ a:
- 0,
- required int /*analyzer.error: CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER*/ b:
- 0});
-
/*member: Interface.method6a:int? Function(int?, {int? b})*/
int? method6a(int? a, {int? b});
/*member: Interface.method6b:int? Function({int? a, int? b})*/
int? method6b({int? a, int? b});
- /*member: Interface.method6c:int? Function({required int? a, required int? b})*/
- int? method6c({required int? a, required int? b});
-
/*member: Interface.getter1:int*/
int get getter1;
@@ -134,10 +124,8 @@
/*member: Class1.method4c:int* Function([int*, int*])**/
/*member: Class1.method5a:int* Function(int*, {int* b})**/
/*member: Class1.method5b:int* Function({int* a, int* b})**/
- /*member: Class1.method5c:int* Function({int* a, int* b})**/
/*member: Class1.method6a:int* Function(int*, {int* b})**/
/*member: Class1.method6b:int* Function({int* a, int* b})**/
- /*member: Class1.method6c:int* Function({int* a, int* b})**/
/*member: Class1.getter1:int**/
/*member: Class1.getter2:int**/
/*member: Class1.setter1=:int**/
@@ -190,22 +178,12 @@
/*cfe|cfe:builder.member: Class2a.method5b:int Function({int a, int b})*/
/*analyzer.member: Class2a.method5b:int* Function({int* a, int* b})**/
- // TODO(johnniwinther): Should `method5c` be an error? It mixes required
- // and optional named parameters.
- /*cfe|cfe:builder.member: Class2a.method5c:int Function({int a, int b})*/
- /*analyzer.member: Class2a.method5c:int* Function({int* a, int* b})**/
-
/*cfe|cfe:builder.member: Class2a.method6a:int? Function(int?, {int? b})*/
/*analyzer.member: Class2a.method6a:int* Function(int*, {int* b})**/
/*cfe|cfe:builder.member: Class2a.method6b:int? Function({int? a, int? b})*/
/*analyzer.member: Class2a.method6b:int* Function({int* a, int* b})**/
- // TODO(johnniwinther): Should `method6c` be an error? It mixes required
- // and optional named parameters.
- /*cfe|cfe:builder.member: Class2a.method6c:int? Function({int? a, int? b})*/
- /*analyzer.member: Class2a.method6c:int* Function({int* a, int* b})**/
-
/*cfe|cfe:builder.member: Class2a.getter1:int*/
/*analyzer.member: Class2a.getter1:int**/
/*cfe|cfe:builder.member: Class2a.getter2:int?*/
@@ -299,26 +277,12 @@
/*member: Class2b.method5b:int Function({int a, int b})*/
int method5b({int a: 0, int b: 0}) => 0;
- /*member: Class2b.method5c:int Function({required int a, required int b})*/
- int /*analyzer.error: CompileTimeErrorCode.INVALID_OVERRIDE*/
- method5c(
- {required int /*analyzer.error: CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER*/ a:
- 0,
- required int /*analyzer.error: CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER*/ b:
- 0}) =>
- 0;
-
/*member: Class2b.method6a:int? Function(int?, {int? b})*/
int? method6a(int? a, {int? b}) => 0;
/*member: Class2b.method6b:int? Function({int? a, int? b})*/
int? method6b({int? a, int? b}) => 0;
- /*member: Class2b.method6c:int? Function({required int? a, required int? b})*/
- int? /*analyzer.error: CompileTimeErrorCode.INVALID_OVERRIDE*/ method6c(
- {required int? a, required int? b}) =>
- 0;
-
/*member: Class2b.getter1:int*/
int get getter1 => 0;
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/opt_out.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/opt_out.dart
index 97e1926..ea49b9879 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/opt_out.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/opt_out.dart
@@ -39,18 +39,12 @@
/*member: LegacyClass.method5b:int* Function({int* a, int* b})**/
int method5b({int a, int b}) => 0;
- /*member: LegacyClass.method5c:int* Function({int* a, int* b})**/
- int method5c({int a, int b}) => 0;
-
/*member: LegacyClass.method6a:int* Function(int*, {int* b})**/
int method6a(int a, {int b}) => 0;
/*member: LegacyClass.method6b:int* Function({int* a, int* b})**/
int method6b({int a, int b}) => 0;
- /*member: LegacyClass.method6c:int* Function({int* a, int* b})**/
- int method6c({int a, int b}) => 0;
-
/*member: LegacyClass.getter1:int**/
int get getter1 => 0;
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/norm_supertypes.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/norm_supertypes.dart
index fc0acb4..37dcca4 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/norm_supertypes.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/norm_supertypes.dart
@@ -12,6 +12,10 @@
/*class: Foo:A<FutureOr<T?>>,Foo<T, S>,Object*/
class Foo<T extends S, S extends Never> implements A<FutureOr<T?>> {}
+/// TODO: Solve CFE / analyzer disagreement.
+/// It looks to me that is should be `A<FutureOr<Never?>>`, because this is
+/// what is written in the code. We don't do normalization because there is
+/// only one implementation of `A` in `Bar`.
/*cfe|cfe:builder.class: Bar:A<FutureOr<Never>>,Bar,Object*/
/*analyzer.class: Bar:A<FutureOr<Never?>>,Bar,Object*/
class Bar implements A<FutureOr<Never?>> {}
@@ -19,12 +23,10 @@
/*class: Baz:A<Future<Null>?>,Baz,Object*/
class Baz implements A<Future<Null>?> {}
-/*cfe|cfe:builder.class: Hest:A<Future<Null>?>,Bar,Foo<Never, Never>,Hest,Object*/
-/*analyzer.class: Hest:A<FutureOr<Never?>>,Bar,Foo<Never, Never>,Hest,Object*/
+/*class: Hest:A<Future<Null>?>,Bar,Foo<Never, Never>,Hest,Object*/
class Hest extends Foo implements Bar {}
-/*cfe|cfe:builder.class: Fisk:A<Future<Null>?>,Bar,Baz,Fisk,Object*/
-/*analyzer.class: Fisk:A<FutureOr<Never?>>,Bar,Baz,Fisk,Object*/
+/*class: Fisk:A<Future<Null>?>,Bar,Baz,Fisk,Object*/
class Fisk extends Bar implements Baz {}
/*class: Naebdyr:A<Future<Null>?>,Baz,Foo<Never, Never>,Naebdyr,Object*/
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/async.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/async.dart
index 9dbd3d0..77a5afa 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/async.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/async.dart
@@ -6,10 +6,8 @@
/*library: nnbd=false*/
-/*cfe|cfe:builder.class: Future:Future<T*>,Object*/
-/*analyzer.class: Future:Future<T>,Object*/
+/*class: Future:Future<T*>,Object*/
class Future<T> {}
-/*cfe|cfe:builder.class: FutureOr:FutureOr<T*>,Object*/
-/*analyzer.class: FutureOr:FutureOr<T>,Object*/
+/*class: FutureOr:FutureOr<T*>,Object*/
class FutureOr<T> {}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart
index 7601e98..2712fa3 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart
@@ -46,27 +46,22 @@
/*class: String:Object,String*/
class String {}
-/*cfe|cfe:builder.class: Iterable:Iterable<E*>,Object*/
-/*analyzer.class: Iterable:Iterable<E>,Object*/
+/*class: Iterable:Iterable<E*>,Object*/
abstract class Iterable<E> {}
-/*cfe|cfe:builder.class: List:EfficientLengthIterable<E*>,Iterable<E*>,List<E*>,Object*/
-/*analyzer.class: List:Iterable<E>,List<E>,Object*/
+/*class: List:EfficientLengthIterable<E*>,Iterable<E*>,List<E*>,Object*/
abstract class List<E> implements EfficientLengthIterable<E> {
/*cfe|cfe:builder.member: List.==:bool* Function(Object*)**/
bool operator ==(Object other);
}
-/*cfe|cfe:builder.class: Set:Iterable<E*>,Object,Set<E*>*/
-/*analyzer.class: Set:Iterable<E>,Object,Set<E>*/
+/*class: Set:Iterable<E*>,Object,Set<E*>*/
class Set<E> implements Iterable<E> {}
-/*cfe|cfe:builder.class: Map:Map<K*, V*>,Object*/
-/*analyzer.class: Map:Map<K, V>,Object*/
+/*class: Map:Map<K*, V*>,Object*/
class Map<K, V> {}
-/*cfe|cfe:builder.class: Stream:Object,Stream<E*>*/
-/*analyzer.class: Stream:Object,Stream<E>*/
+/*class: Stream:Object,Stream<E*>*/
class Stream<E> {}
/*class: Function:Function,Object*/
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md b/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md
deleted file mode 100644
index be03e90..0000000
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Null Safety Migration Tooling
-
-Note: the null safety migration tooling and workflow is in an early state;
-this doc will be updated as the steps and workflow are simplified.
-
-## Building the NNBD sdk
-
-In order to run the tool currently you have to be able to build your own copy
-of the Dart SDK.
-
-To do this, run:
-
-```
-./tools/build.py -mrelease --nnbd create_sdk
-```
-
-The NNBD sdk now lives under the ReleaseX64NNBD sub-directory of your build
-directory, e.g.
-
-```
-xcodebuild/ReleaseX64NNBD/dart-sdk/
-```
-
-## Migrating a package
-
-- build a NNBD version of the SDK (see above)
-- select a package to work on
-- in that package, edit the `analysis_options.yaml` to enable the NNBD
- experiment from the POV of the analyzer:
-```yaml
-analyzer:
- enable-experiment:
- - non-nullable
-```
-- run `pub get` for the package (and, verify that the
- `.dart_tool/package_config.json` file was created)
-
-Then, run the migration tool from the top-level of the package directory:
-
-```
-<sdk-repo>/xcodebuild/ReleaseX64NNBD/dart migrate .
-```
-
-The migration tool will run, print the proposed changes to the console, and
-display a url for the preview tool. Open that url from a browser to see a rich
-preview of the proposed null safety changes.
-
-## Using the tool
-
-TODO:
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
index bf2926f2..f006600 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
@@ -48,20 +48,13 @@
/// The [NullabilityMigration] instance for this migration.
final NullabilityMigration migration;
- /// A flag indicating whether types that were not changed (because they should
- /// be non-nullable) should be explained.
- final bool explainNonNullableTypes;
-
/// A map from the path of a compilation unit to the information about that
/// unit.
final Map<String, UnitInfo> unitMap = {};
/// Initialize a newly created builder.
InfoBuilder(this.provider, this.includedPath, this.info, this.listener,
- this.adapter, this.migration,
- // TODO(srawlins): Re-enable once
- // https://github.com/dart-lang/sdk/issues/40253 is fixed.
- {this.explainNonNullableTypes = false});
+ this.adapter, this.migration);
/// The analysis server used to get information about libraries.
AnalysisServer get server => listener.server;
@@ -478,7 +471,7 @@
// There's no need for hints around code that is being removed.
break;
case NullabilityFixKind.makeTypeNullable:
- case NullabilityFixKind.noModification:
+ case NullabilityFixKind.typeNotMadeNullable:
edits.add(
EditDetail('Force type to be non-nullable.', offset, 0, '/*!*/'));
edits.add(EditDetail('Force type to be nullable.', offset, 0, '/*?*/'));
@@ -523,6 +516,11 @@
}
assert(identical(step.node, node));
while (step != null) {
+ if (step.node == info.never) {
+ // Assert that we are only ever trimming off the last step.
+ assert(step.principalCause == null);
+ break;
+ }
entries.add(_nodeToTraceEntry(step.node));
if (step.codeReference != null) {
entries.add(_stepToTraceEntry(step));
@@ -543,6 +541,12 @@
assert(identical(step.targetNode, node));
while (step != null) {
entries.add(_nodeToTraceEntry(step.targetNode));
+ if (step.targetNode.upstreamEdges.isNotEmpty &&
+ step.targetNode.upstreamEdges.first.sourceNode == info.always) {
+ // Assert that we are only ever trimming off the last step.
+ assert(step.principalCause == null);
+ break;
+ }
if (step.codeReference != null) {
entries.add(_stepToTraceEntry(step));
}
@@ -558,6 +562,8 @@
if (reason is NullabilityNodeInfo) {
if (reason.isNullable) {
_computeTraceNullableInfo(reason, traces);
+ } else {
+ _computeTraceNonNullableInfo(reason, traces);
}
} else if (reason is EdgeInfo) {
assert(reason.sourceNode.isNullable);
@@ -571,36 +577,6 @@
return traces;
}
- /// Compute details about [edgeInfos] which are upstream triggered.
- List<RegionDetail> _computeUpstreamTriggeredDetails(
- Iterable<EdgeInfo> edgeInfos) {
- List<RegionDetail> details = [];
- for (var edge in edgeInfos) {
- EdgeOriginInfo origin = info.edgeOrigin[edge];
- if (origin == null) {
- // TODO(srawlins): I think this shouldn't happen? But it does on the
- // collection and path packages.
- assert(false, 'edge with no origin $edge');
- continue;
- }
- NavigationTarget target =
- _proximateTargetForNode(origin.source.fullName, origin.node);
- if (origin.kind == EdgeOriginKind.expressionChecks) {
- details.add(RegionDetail(
- 'This value is unconditionally used in a non-nullable context',
- target));
- } else if (origin.kind == EdgeOriginKind.nonNullAssertion) {
- details
- .add(RegionDetail('This value is asserted to be non-null', target));
- } else if (origin.kind == EdgeOriginKind.nullabilityComment) {
- details.add(RegionDetail(
- 'This type is annotated with a non-nullability comment ("/*!*/")',
- target));
- }
- }
- return details;
- }
-
/// Describe why an edge may have gotten a '!'.
String _describeNonNullEdge(EdgeOriginInfo edge) {
// TODO(mfairhurst/paulberry): Do NOT use astNode/parent to create this
@@ -618,37 +594,6 @@
return 'This value must be null-checked before use here.';
}
- /// Explain the type annotations that were not changed because they were
- /// determined to be non-nullable.
- void _explainNonNullableTypes(SourceInformation sourceInfo,
- List<RegionInfo> regions, OffsetMapper mapper, LineInfo lineInfo) {
- Iterable<MapEntry<TypeAnnotation, NullabilityNodeInfo>> nonNullableTypes =
- sourceInfo.explicitTypeNullability.entries
- .where((entry) => !entry.value.isNullable);
- for (MapEntry<TypeAnnotation, NullabilityNodeInfo> nonNullableType
- in nonNullableTypes) {
- Iterable<EdgeInfo> upstreamTriggeredEdgeInfos = info.edgeOrigin.keys
- .where((e) =>
- e.sourceNode == nonNullableType.value &&
- e.isUpstreamTriggered &&
- !e.destinationNode.isNullable);
- if (upstreamTriggeredEdgeInfos.isNotEmpty) {
- List<RegionDetail> details =
- _computeUpstreamTriggeredDetails(upstreamTriggeredEdgeInfos);
- if (details.isNotEmpty) {
- TypeAnnotation node = nonNullableType.key;
- regions.add(RegionInfo(
- RegionType.unchanged,
- mapper.map(node.offset),
- node.length,
- lineInfo.getLocation(node.offset).lineNumber,
- 'This type is not changed; it is determined to be non-nullable',
- details));
- }
- }
- }
- }
-
/// Return the migration information for the unit associated with the
/// [result].
UnitInfo _explainUnit(SourceInformation sourceInfo, ResolvedUnitResult result,
@@ -703,9 +648,15 @@
lineNumber, explanation, details,
edits: edits, traces: traces));
} else {
- regions.add(RegionInfo(RegionType.add, offset, replacement.length,
- lineNumber, explanation, details,
- edits: edits, traces: traces));
+ if (edit.isInformative) {
+ regions.add(RegionInfo(RegionType.informative, offset,
+ replacement.length, lineNumber, explanation, const [],
+ edits: edits, traces: traces));
+ } else {
+ regions.add(RegionInfo(RegionType.add, offset, replacement.length,
+ lineNumber, explanation, details,
+ edits: edits, traces: traces));
+ }
}
}
offset += replacement.length;
@@ -718,11 +669,6 @@
List<SourceEdit> edits = insertions.toSourceEdits();
edits.sort((first, second) => first.offset.compareTo(second.offset));
OffsetMapper mapper = OffsetMapper.forEdits(edits);
-
- if (explainNonNullableTypes) {
- _explainNonNullableTypes(
- sourceInfo, regions, mapper, result.unit.lineInfo);
- }
regions.sort((first, second) => first.offset.compareTo(second.offset));
unitInfo.offsetMapper = mapper;
unitInfo.content = content;
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
index a80ef58..7bd0a6d 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
@@ -181,9 +181,9 @@
/// This is a region of code that was removed in migration.
remove,
- /// This is a region of code that was unchanged in migration; likely a type
- /// that was declared non-nullable in migration.
- unchanged,
+ /// This is a region of code that wasn't changed by migration, but is being
+ /// shown to give the user more information about the migration.
+ informative,
}
/// Information about a single entry in a nullability trace.
@@ -240,13 +240,14 @@
UnitInfo(this.path);
/// Returns the [regions] that represent a fixed (changed) region of code.
- List<RegionInfo> get fixRegions => List.of(
- regions.where((region) => region.regionType != RegionType.unchanged));
+ List<RegionInfo> get fixRegions => regions
+ .where((region) => region.regionType != RegionType.informative)
+ .toList();
- /// Returns the [regions] that represent an unchanged type which was
- /// determined to be non-null.
- List<RegionInfo> get nonNullableTypeRegions => List.of(
- regions.where((region) => region.regionType == RegionType.unchanged));
+ /// Returns the [regions] that are informative.
+ List<RegionInfo> get informativeRegions => regions
+ .where((region) => region.regionType == RegionType.informative)
+ .toList();
/// Returns the [RegionInfo] at offset [offset].
// TODO(srawlins): This is O(n), used each time the user clicks on a region.
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
index 9dbed6e..6fa41e4 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
@@ -53,7 +53,7 @@
</div><!-- /panels -->
<footer>
<a target="_blank"
- href="https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md">Null
+ href="https://github.com/dart-lang/sdk/blob/master/pkg/nnbd_migration/README.md">Null
safety migration help</a>
<span class="wide"> </span>
<div>Based on {{ sdkVersion }}</div>
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
index 0c63e02..27c3340 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
@@ -280,13 +280,9 @@
color: #001100;
}
-.region.unchanged-region {
- background-color: rgba(0, 0, 0, 0.3);
- border-bottom: solid 2px #ccc;
- /* Invisible text; use underlying highlighting. */
- color: rgba(0, 0, 0, 0);
- /* Reduce line height to make room for border. */
- line-height: 1;
+.region.informative-region {
+ background-color: #888888;
+ color: #000000;
}
.target {
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
index 3a39789..1a941df 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
@@ -270,7 +270,7 @@
''';
String _index_html;
-// index_html md5 is '5ea053889e3c34ee57db31a5a3d2d8b9'
+// index_html md5 is '54a9928481db293c8e6d1869622d95a2'
String _index_html_base64 = '''
PGh0bWw+CjxoZWFkPgogICAgPHRpdGxlPk51bGwgU2FmZXR5IFByZXZpZXc8L3RpdGxlPgogICAgPHNj
cmlwdCBzcmM9Int7IGhpZ2hsaWdodEpzUGF0aCB9fSI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0Pnt7IGRh
@@ -309,14 +309,14 @@
ZWwtY29udGVudCAtLT4KICAgICAgICA8L2Rpdj48IS0tIC9lZGl0LXBhbmVsIC0tPgogICAgPC9kaXY+
PCEtLSAvaW5mby1wYW5lbCAtLT4KPC9kaXY+PCEtLSAvcGFuZWxzIC0tPgo8Zm9vdGVyPgogICAgPGEg
dGFyZ2V0PSJfYmxhbmsiCiAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nk
-ay9ibG9iL21hc3Rlci9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvZWRpdC9ubmJkX21pZ3JhdGlv
-bi9SRUFETUUubWQiPk51bGwKICAgICAgICBzYWZldHkgbWlncmF0aW9uIGhlbHA8L2E+CiAgICA8c3Bh
-biBjbGFzcz0id2lkZSI+IDwvc3Bhbj4KICAgIDxkaXY+QmFzZWQgb24ge3sgc2RrVmVyc2lvbiB9fTwv
-ZGl2Pgo8L2Zvb3Rlcj4KPC9ib2R5Pgo8L2h0bWw+Cg==
+ay9ibG9iL21hc3Rlci9wa2cvbm5iZF9taWdyYXRpb24vUkVBRE1FLm1kIj5OdWxsCiAgICAgICAgc2Fm
+ZXR5IG1pZ3JhdGlvbiBoZWxwPC9hPgogICAgPHNwYW4gY2xhc3M9IndpZGUiPiA8L3NwYW4+CiAgICA8
+ZGl2PkJhc2VkIG9uIHt7IHNka1ZlcnNpb24gfX08L2Rpdj4KPC9mb290ZXI+CjwvYm9keT4KPC9odG1s
+Pgo=
''';
String _migration_css;
-// migration_css md5 is '2bfe65627f29ccb0a43fa1b79569a571'
+// migration_css md5 is '2b325a70e847b11533218ca621f9763f'
String _migration_css_base64 = '''
LyogQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUg
dGhlIEFVVEhPUlMgZmlsZSAgKi8KLyogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVz
@@ -388,56 +388,53 @@
bG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICB6LWluZGV4
OiAyMDA7Cn0KCi5yZWdpb24uYWRkZWQtcmVnaW9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NmZmNj
OwogIGNvbG9yOiAjMDAzMzAwOwp9CgoucmVnaW9uLnJlbW92ZWQtcmVnaW9uIHsKICBiYWNrZ3JvdW5k
-LWNvbG9yOiAjZmY2NjY2OwogIGNvbG9yOiAjMDAxMTAwOwp9CgoucmVnaW9uLnVuY2hhbmdlZC1yZWdp
-b24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsKICBib3JkZXItYm90dG9t
-OiBzb2xpZCAycHggI2NjYzsKICAvKiBJbnZpc2libGUgdGV4dDsgdXNlIHVuZGVybHlpbmcgaGlnaGxp
-Z2h0aW5nLiAqLwogIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogIC8qIFJlZHVjZSBsaW5lIGhlaWdo
-dCB0byBtYWtlIHJvb20gZm9yIGJvcmRlci4gKi8KICBsaW5lLWhlaWdodDogMTsKfQoKLnRhcmdldCB7
-CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0
-eTogdmlzaWJsZTsKICBmb250LXdlaWdodDogNjAwOwp9CgouaW5mby1wYW5lbCB7CiAgZmxleDogMSAy
-MDBweDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1k
-aXJlY3Rpb246IGNvbHVtbjsKfQoKLmluZm8tcGFuZWwgLmVkaXQtcGFuZWwgewogIGJhY2tncm91bmQt
-Y29sb3I6ICMyODJiMmU7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250
-ZW50IHsKICBwYWRkaW5nOiA3cHg7Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50PiA6Zmlyc3Qt
-Y2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KCi5pbmZvLXBhbmVsIC5ub3dyYXAgewogIHdoaXRlLXNw
-YWNlOiBub3dyYXA7Cn0KCi5pbmZvLXBhbmVsIHVsLAouaW5mby1wYW5lbCBvbCB7CiAgcGFkZGluZy1s
-ZWZ0OiAyMHB4Owp9CgouaW5mby1wYW5lbCBsaSB7CiAgbWFyZ2luOiAwIDAgNXB4IDA7Cn0KCi5pbmZv
-LXBhbmVsIGEgewogIGNvbG9yOiAjMzNjY2ZmOwp9CgouaW5mby1wYW5lbCAuZWRpdC1saXN0IHsKICBi
-YWNrZ3JvdW5kLWNvbG9yOiAjMjgyYjJlOwogIG92ZXJmbG93OiBhdXRvOwp9CgouZWRpdC1wYW5lbCB7
-CiAgbWFyZ2luLXRvcDogNnB4OwogIGZsZXg6IDEgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgewogIGZsZXg6
-IDIgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgLmVkaXQgewogIG1hcmdpbjogM3B4IDA7Cn0KCi5lZGl0LWxp
-c3QgLmVkaXQtbGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgoucmVydW5uaW5nLXBhbmUgewogIGRp
-c3BsYXk6IG5vbmU7Cn0KCmJvZHkucmVydW5uaW5nIC5yZXJ1bm5pbmctcGFuZSB7CiAgZGlzcGxheTog
-YmxvY2s7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMHB4OwogIGJvdHRvbTogMHB4OwogIGxlZnQ6
-IDBweDsKICByaWdodDogMHB4OwogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDBBQTsgLyogdHJhbnNs
-dWNlbnQgYmxhY2sgKi8KICB6LWluZGV4OiA0MDA7Cn0KCi5yZXJ1bm5pbmctcGFuZSBoMSB7CiAgcG9z
-aXRpb246IGFic29sdXRlOwogIHRvcDogNTAlOwogIGxlZnQ6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5z
-bGF0ZSgtNTAlLCAtNTAlKTsKfQoKcC50cmFjZSAudHlwZS1kZXNjcmlwdGlvbiB7CiAgLyogRnJvbSBI
-TEpTJ3MgLmhsanMta2V5d29yZCwgLmhsanMtc2VsZWN0b3ItdGFnLCAuaGxqcy1kZWxldGlvbiAqLwog
-IGNvbG9yOiAjY2M3ODMyOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cn0KCnVsLnRyYWNlIHsKICBm
-b250LXNpemU6IDEzcHg7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogIHBhZGRpbmctbGVmdDogMHB4
-Owp9Cgp1bC50cmFjZSBsaSB7CiAgY29sb3I6IHdoaXRlOwogIG1hcmdpbi1sZWZ0OiAxNHB4OwogIHRl
-eHQtaW5kZW50OiAtMTRweDsKfQoKdWwudHJhY2UgbGkgLmZ1bmN0aW9uIHsKICAvKiBGcm9tIEhMSlMn
-cyAuaGxqcy1zZWN0aW9uLCAuaGxqcy10aXRsZSwgLmhsanMtdHlwZSAqLwogIGNvbG9yOiAjZmZjNjZk
-OwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmVsZXZhdGlv
-bi16NCB7CiAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksCiAg
-ICAgIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAwcHggMXB4IDEwcHgg
-MHB4IHJnYmEoMCwgMCwgMCwgLjEyKTsKfQoKYSB7CiAgY29sb3I6ICNjY2M7CiAgZmlsbDogI2NjYzsK
-ICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCmE6aG92ZXIgewogIGNvbG9yOiAjZmZmOwogIGZpbGw6
-ICNmZmY7Cn0KCmJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzMzY2NmZjsKICBib3JkZXI6IDJw
-eCBzb2xpZCAjMzdhZWRjOwogIGJvcmRlci1yYWRpdXM6IDNweDsKICBwYWRkaW5nOiA2cHggMTBweDsK
-ICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogIzI4MjgyODsKfQoKYnV0dG9uOmhvdmVyIHsKICBi
-YWNrZ3JvdW5kLWNvbG9yOiAjODBkZmZmOwogIGJvcmRlcjogMnB4IHNvbGlkICM1MmI4ZTA7CiAgY3Vy
-c29yOiBwb2ludGVyOwp9CgpidXR0b25bZGlzYWJsZWRdIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2Fh
-OGI4OwogIGNvbG9yOiAjNTA3MTc3OwogIGJvcmRlcjogMnB4IHNvbGlkICM1MDcxNzc7CiAgY3Vyc29y
-OiBub3QtYWxsb3dlZDsKfQoKLnBsYWNlaG9sZGVyIHsKICBjb2xvcjogIzc3NzsKICB0ZXh0LWFsaWdu
-OiBjZW50ZXI7CiAgbWFyZ2luLXRvcDogM2VtICFpbXBvcnRhbnQ7Cn0KCi8qKgogKiBITEpTIE92ZXJy
-aWRlcwogKi8KLmhsanMgewogIC8qKgogICAqIFRoaXMgYWxsb3dzIHRoZSBwZXItbGluZSBoaWdobGln
-aHRzIHRvIHNob3cuCiAgICovCiAgYmFja2dyb3VuZDogbm9uZTsKfQo=
+LWNvbG9yOiAjZmY2NjY2OwogIGNvbG9yOiAjMDAxMTAwOwp9CgoucmVnaW9uLmluZm9ybWF0aXZlLXJl
+Z2lvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzg4ODg4ODsKICBjb2xvcjogIzAwMDAwMDsKfQoKLnRh
+cmdldCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlz
+aWJpbGl0eTogdmlzaWJsZTsKICBmb250LXdlaWdodDogNjAwOwp9CgouaW5mby1wYW5lbCB7CiAgZmxl
+eDogMSAyMDBweDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAg
+ZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmluZm8tcGFuZWwgLmVkaXQtcGFuZWwgewogIGJhY2tn
+cm91bmQtY29sb3I6ICMyODJiMmU7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5pbmZvLXBhbmVsIC5wYW5l
+bC1jb250ZW50IHsKICBwYWRkaW5nOiA3cHg7Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50PiA6
+Zmlyc3QtY2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KCi5pbmZvLXBhbmVsIC5ub3dyYXAgewogIHdo
+aXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5pbmZvLXBhbmVsIHVsLAouaW5mby1wYW5lbCBvbCB7CiAgcGFk
+ZGluZy1sZWZ0OiAyMHB4Owp9CgouaW5mby1wYW5lbCBsaSB7CiAgbWFyZ2luOiAwIDAgNXB4IDA7Cn0K
+Ci5pbmZvLXBhbmVsIGEgewogIGNvbG9yOiAjMzNjY2ZmOwp9CgouaW5mby1wYW5lbCAuZWRpdC1saXN0
+IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyYjJlOwogIG92ZXJmbG93OiBhdXRvOwp9CgouZWRpdC1w
+YW5lbCB7CiAgbWFyZ2luLXRvcDogNnB4OwogIGZsZXg6IDEgMTAwcHg7Cn0KCi5lZGl0LWxpc3Qgewog
+IGZsZXg6IDIgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgLmVkaXQgewogIG1hcmdpbjogM3B4IDA7Cn0KCi5l
+ZGl0LWxpc3QgLmVkaXQtbGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgoucmVydW5uaW5nLXBhbmUg
+ewogIGRpc3BsYXk6IG5vbmU7Cn0KCmJvZHkucmVydW5uaW5nIC5yZXJ1bm5pbmctcGFuZSB7CiAgZGlz
+cGxheTogYmxvY2s7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMHB4OwogIGJvdHRvbTogMHB4Owog
+IGxlZnQ6IDBweDsKICByaWdodDogMHB4OwogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDBBQTsgLyog
+dHJhbnNsdWNlbnQgYmxhY2sgKi8KICB6LWluZGV4OiA0MDA7Cn0KCi5yZXJ1bm5pbmctcGFuZSBoMSB7
+CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogNTAlOwogIGxlZnQ6IDUwJTsKICB0cmFuc2Zvcm06
+IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKfQoKcC50cmFjZSAudHlwZS1kZXNjcmlwdGlvbiB7CiAgLyog
+RnJvbSBITEpTJ3MgLmhsanMta2V5d29yZCwgLmhsanMtc2VsZWN0b3ItdGFnLCAuaGxqcy1kZWxldGlv
+biAqLwogIGNvbG9yOiAjY2M3ODMyOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cn0KCnVsLnRyYWNl
+IHsKICBmb250LXNpemU6IDEzcHg7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogIHBhZGRpbmctbGVm
+dDogMHB4Owp9Cgp1bC50cmFjZSBsaSB7CiAgY29sb3I6IHdoaXRlOwogIG1hcmdpbi1sZWZ0OiAxNHB4
+OwogIHRleHQtaW5kZW50OiAtMTRweDsKfQoKdWwudHJhY2UgbGkgLmZ1bmN0aW9uIHsKICAvKiBGcm9t
+IEhMSlMncyAuaGxqcy1zZWN0aW9uLCAuaGxqcy10aXRsZSwgLmhsanMtdHlwZSAqLwogIGNvbG9yOiAj
+ZmZjNjZkOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmVs
+ZXZhdGlvbi16NCB7CiAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAu
+MiksCiAgICAgIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAwcHggMXB4
+IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgLjEyKTsKfQoKYSB7CiAgY29sb3I6ICNjY2M7CiAgZmlsbDog
+I2NjYzsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCmE6aG92ZXIgewogIGNvbG9yOiAjZmZmOwog
+IGZpbGw6ICNmZmY7Cn0KCmJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzMzY2NmZjsKICBib3Jk
+ZXI6IDJweCBzb2xpZCAjMzdhZWRjOwogIGJvcmRlci1yYWRpdXM6IDNweDsKICBwYWRkaW5nOiA2cHgg
+MTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogIzI4MjgyODsKfQoKYnV0dG9uOmhvdmVy
+IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjODBkZmZmOwogIGJvcmRlcjogMnB4IHNvbGlkICM1MmI4ZTA7
+CiAgY3Vyc29yOiBwb2ludGVyOwp9CgpidXR0b25bZGlzYWJsZWRdIHsKICBiYWNrZ3JvdW5kLWNvbG9y
+OiAjN2FhOGI4OwogIGNvbG9yOiAjNTA3MTc3OwogIGJvcmRlcjogMnB4IHNvbGlkICM1MDcxNzc7CiAg
+Y3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLnBsYWNlaG9sZGVyIHsKICBjb2xvcjogIzc3NzsKICB0ZXh0
+LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2luLXRvcDogM2VtICFpbXBvcnRhbnQ7Cn0KCi8qKgogKiBITEpT
+IE92ZXJyaWRlcwogKi8KLmhsanMgewogIC8qKgogICAqIFRoaXMgYWxsb3dzIHRoZSBwZXItbGluZSBo
+aWdobGlnaHRzIHRvIHNob3cuCiAgICovCiAgYmFja2dyb3VuZDogbm9uZTsKfQo=
''';
String _migration_js;
-// migration_dart md5 is 'fed856f862bffea0f76b893ef77223dc'
+// migration_dart md5 is '6520368a5d56a6a3d8049dbc6ac1b17f'
String _migration_js_base64 = '''
KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgdD1P
YmplY3Qua2V5cyhhKQpmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9dFtzXQpiW3JdPWFb
@@ -536,3415 +533,3414 @@
ZiB0IT0ic3RyaW5nIil0aHJvdyBILmIoSC50TChhKSkKcmV0dXJuIHR9LAplUTpmdW5jdGlvbihhKXt2
YXIgdD1hLiRpZGVudGl0eUhhc2gKaWYodD09bnVsbCl7dD1NYXRoLnJhbmRvbSgpKjB4M2ZmZmZmZmZ8
MAphLiRpZGVudGl0eUhhc2g9dH1yZXR1cm4gdH0sCkhwOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEs
-cCxvCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILnZoKEgudEwoYSkpCnQ9L15ccypbKy1dPygoMHhbYS1m
-MC05XSspfChcZCspfChbYS16MC05XSspKVxzKiQvaS5leGVjKGEpCmlmKHQ9PW51bGwpcmV0dXJuCmlm
-KDM+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsMykKcz1ILnkodFszXSkKaWYoYj09bnVsbCl7aWYocyE9
-bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwxMCkKaWYodFsyXSE9bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwx
-NikKcmV0dXJufWlmKGI8Mnx8Yj4zNil0aHJvdyBILmIoUC5URShiLDIsMzYsInJhZGl4IixudWxsKSkK
-aWYoYj09PTEwJiZzIT1udWxsKXJldHVybiBwYXJzZUludChhLDEwKQppZihiPDEwfHxzPT1udWxsKXty
-PWI8PTEwPzQ3K2I6ODYrYgpxPXRbMV0KZm9yKHA9cS5sZW5ndGgsbz0wO288cDsrK28paWYoKEMueEIu
-VyhxLG8pfDMyKT5yKXJldHVybn1yZXR1cm4gcGFyc2VJbnQoYSxiKX0sCk06ZnVuY3Rpb24oYSl7dmFy
-IHQ9SC5INShhKQpyZXR1cm4gdH0sCkg1OmZ1bmN0aW9uKGEpe3ZhciB0LHMscgppZihhIGluc3RhbmNl
-b2YgUC5rKXJldHVybiBILmRtKEgueksoYSksbnVsbCkKaWYoSi5pYShhKT09PUMuT2t8fHUuYWsuYyhh
-KSl7dD1DLk80KGEpCmlmKEguZih0KSlyZXR1cm4gdApzPWEuY29uc3RydWN0b3IKaWYodHlwZW9mIHM9
-PSJmdW5jdGlvbiIpe3I9cy5uYW1lCmlmKHR5cGVvZiByPT0ic3RyaW5nIiYmSC5mKHIpKXJldHVybiBy
-fX1yZXR1cm4gSC5kbShILnpLKGEpLG51bGwpfSwKZjpmdW5jdGlvbihhKXt2YXIgdD1hIT09Ik9iamVj
-dCImJmEhPT0iIgpyZXR1cm4gdH0sCk0wOmZ1bmN0aW9uKCl7aWYoISFzZWxmLmxvY2F0aW9uKXJldHVy
-biBzZWxmLmxvY2F0aW9uLmhyZWYKcmV0dXJufSwKVks6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD1h
-Lmxlbmd0aAppZihwPD01MDApcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhKQpm
-b3IodD0iIixzPTA7czxwO3M9cil7cj1zKzUwMApxPXI8cD9yOnAKdCs9U3RyaW5nLmZyb21DaGFyQ29k
-ZS5hcHBseShudWxsLGEuc2xpY2UocyxxKSl9cmV0dXJuIHR9LApQTDpmdW5jdGlvbihhKXt2YXIgdCxz
-LHIscT1ILlZNKFtdLHUudCkKZm9yKHQ9YS5sZW5ndGgscz0wO3M8YS5sZW5ndGg7YS5sZW5ndGg9PT10
-fHwoMCxILmxrKShhKSwrK3Mpe3I9YVtzXQppZighSC5vayhyKSl0aHJvdyBILmIoSC50TChyKSkKaWYo
-cjw9NjU1MzUpQy5ObS5pKHEscikKZWxzZSBpZihyPD0xMTE0MTExKXtDLk5tLmkocSw1NTI5NisoQy5q
-bi53RyhyLTY1NTM2LDEwKSYxMDIzKSkKQy5ObS5pKHEsNTYzMjArKHImMTAyMykpfWVsc2UgdGhyb3cg
-SC5iKEgudEwocikpfXJldHVybiBILlZLKHEpfSwKZVQ6ZnVuY3Rpb24oYSl7dmFyIHQscyxyCmZvcih0
-PWEubGVuZ3RoLHM9MDtzPHQ7KytzKXtyPWFbc10KaWYoIUgub2socikpdGhyb3cgSC5iKEgudEwocikp
-CmlmKHI8MCl0aHJvdyBILmIoSC50TChyKSkKaWYocj42NTUzNSlyZXR1cm4gSC5QTChhKX1yZXR1cm4g
-SC5WSyhhKX0sCmZ3OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQppZihjPD01MDAmJmI9PT0wJiZj
-PT09YS5sZW5ndGgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhKQpmb3IodD1i
-LHM9IiI7dDxjO3Q9cil7cj10KzUwMApxPXI8Yz9yOmMKcys9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBs
-eShudWxsLGEuc3ViYXJyYXkodCxxKSl9cmV0dXJuIHN9LApMdzpmdW5jdGlvbihhKXt2YXIgdAppZigw
-PD1hKXtpZihhPD02NTUzNSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKQppZihhPD0xMTE0MTEx
-KXt0PWEtNjU1MzYKcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKDU1Mjk2fEMuam4ud0codCwxMCkp
-Pj4+MCw1NjMyMHx0JjEwMjMpfX10aHJvdyBILmIoUC5URShhLDAsMTExNDExMSxudWxsLG51bGwpKX0s
-Cm8yOmZ1bmN0aW9uKGEpe2lmKGEuZGF0ZT09PXZvaWQgMClhLmRhdGU9bmV3IERhdGUoYS5hKQpyZXR1
-cm4gYS5kYXRlfSwKdEo6ZnVuY3Rpb24oYSl7dmFyIHQ9SC5vMihhKS5nZXRGdWxsWWVhcigpKzAKcmV0
-dXJuIHR9LApOUzpmdW5jdGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldE1vbnRoKCkrMQpyZXR1cm4gdH0s
-CmpBOmZ1bmN0aW9uKGEpe3ZhciB0PUgubzIoYSkuZ2V0RGF0ZSgpKzAKcmV0dXJuIHR9LApLTDpmdW5j
-dGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldEhvdXJzKCkrMApyZXR1cm4gdH0sCmNoOmZ1bmN0aW9uKGEp
-e3ZhciB0PUgubzIoYSkuZ2V0TWludXRlcygpKzAKcmV0dXJuIHR9LApKZDpmdW5jdGlvbihhKXt2YXIg
-dD1ILm8yKGEpLmdldFNlY29uZHMoKSswCnJldHVybiB0fSwKbzE6ZnVuY3Rpb24oYSl7dmFyIHQ9SC5v
-MihhKS5nZXRNaWxsaXNlY29uZHMoKSswCnJldHVybiB0fSwKem86ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
-LHMscj17fQpyLmE9MAp0PVtdCnM9W10Kci5hPWIubGVuZ3RoCkMuTm0uRlYodCxiKQpyLmI9IiIKaWYo
-YyE9bnVsbCYmYy5hIT09MCljLksoMCxuZXcgSC5DaihyLHMsdCkpCiIiK3IuYQpyZXR1cm4gSi5KeShh
-LG5ldyBILkxJKEMuVGUsMCx0LHMsMCkpfSwKRWs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxCmlm
-KGIgaW5zdGFuY2VvZiBBcnJheSl0PWM9PW51bGx8fGMuYT09PTAKZWxzZSB0PSExCmlmKHQpe3M9Ygpy
-PXMubGVuZ3RoCmlmKHI9PT0wKXtpZighIWEuJDApcmV0dXJuIGEuJDAoKX1lbHNlIGlmKHI9PT0xKXtp
-ZighIWEuJDEpcmV0dXJuIGEuJDEoc1swXSl9ZWxzZSBpZihyPT09Mil7aWYoISFhLiQyKXJldHVybiBh
-LiQyKHNbMF0sc1sxXSl9ZWxzZSBpZihyPT09Myl7aWYoISFhLiQzKXJldHVybiBhLiQzKHNbMF0sc1sx
-XSxzWzJdKX1lbHNlIGlmKHI9PT00KXtpZighIWEuJDQpcmV0dXJuIGEuJDQoc1swXSxzWzFdLHNbMl0s
-c1szXSl9ZWxzZSBpZihyPT09NSlpZighIWEuJDUpcmV0dXJuIGEuJDUoc1swXSxzWzFdLHNbMl0sc1sz
-XSxzWzRdKQpxPWFbIiIrIiQiK3JdCmlmKHEhPW51bGwpcmV0dXJuIHEuYXBwbHkoYSxzKX1yZXR1cm4g
-SC5FdyhhLGIsYyl9LApFdzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGs9YiBp
-bnN0YW5jZW9mIEFycmF5P2I6UC5DSChiLCEwLHUueiksaj1rLmxlbmd0aCxpPWEuJFIKaWYoajxpKXJl
-dHVybiBILnpvKGEsayxjKQp0PWEuJEQKcz10PT1udWxsCnI9IXM/dCgpOm51bGwKcT1KLmlhKGEpCnA9
-cS4kQwppZih0eXBlb2YgcD09InN0cmluZyIpcD1xW3BdCmlmKHMpe2lmKGMhPW51bGwmJmMuYSE9PTAp
-cmV0dXJuIEguem8oYSxrLGMpCmlmKGo9PT1pKXJldHVybiBwLmFwcGx5KGEsaykKcmV0dXJuIEguem8o
-YSxrLGMpfWlmKHIgaW5zdGFuY2VvZiBBcnJheSl7aWYoYyE9bnVsbCYmYy5hIT09MClyZXR1cm4gSC56
-byhhLGssYykKaWYoaj5pK3IubGVuZ3RoKXJldHVybiBILnpvKGEsayxudWxsKQpDLk5tLkZWKGssci5z
-bGljZShqLWkpKQpyZXR1cm4gcC5hcHBseShhLGspfWVsc2V7aWYoaj5pKXJldHVybiBILnpvKGEsayxj
-KQpvPU9iamVjdC5rZXlzKHIpCmlmKGM9PW51bGwpZm9yKHM9by5sZW5ndGgsbj0wO248by5sZW5ndGg7
-by5sZW5ndGg9PT1zfHwoMCxILmxrKShvKSwrK24pQy5ObS5pKGsscltILnkob1tuXSldKQplbHNle2Zv
-cihzPW8ubGVuZ3RoLG09MCxuPTA7bjxvLmxlbmd0aDtvLmxlbmd0aD09PXN8fCgwLEgubGspKG8pLCsr
-bil7bD1ILnkob1tuXSkKaWYoYy54NChsKSl7KyttCkMuTm0uaShrLGMucSgwLGwpKX1lbHNlIEMuTm0u
-aShrLHJbbF0pfWlmKG0hPT1jLmEpcmV0dXJuIEguem8oYSxrLGMpfXJldHVybiBwLmFwcGx5KGEsayl9
-fSwKcFk6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKEgudEwoYSkpfSwKT0g6ZnVuY3Rpb24oYSxiKXtpZihh
-PT1udWxsKUouSG0oYSkKdGhyb3cgSC5iKEguSFkoYSxiKSl9LApIWTpmdW5jdGlvbihhLGIpe3ZhciB0
-LHMscj0iaW5kZXgiCmlmKCFILm9rKGIpKXJldHVybiBuZXcgUC51KCEwLGIscixudWxsKQp0PUguU2Mo
-Si5IbShhKSkKaWYoIShiPDApKXtpZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiBILnBZKHQpCnM9
-Yj49dH1lbHNlIHM9ITAKaWYocylyZXR1cm4gUC5DZihiLGEscixudWxsLHQpCnJldHVybiBQLngoYixy
-KX0sCmF1OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD0iSW52YWxpZCB2YWx1ZSIKaWYoYT5jKXJldHVybiBu
-ZXcgUC5iSigwLGMsITAsYSwic3RhcnQiLHQpCmlmKGIhPW51bGwpe2lmKCFILm9rKGIpKXJldHVybiBu
-ZXcgUC51KCEwLGIsImVuZCIsbnVsbCkKaWYoYjxhfHxiPmMpcmV0dXJuIG5ldyBQLmJKKGEsYywhMCxi
-LCJlbmQiLHQpfXJldHVybiBuZXcgUC51KCEwLGIsImVuZCIsbnVsbCl9LAp0TDpmdW5jdGlvbihhKXty
-ZXR1cm4gbmV3IFAudSghMCxhLG51bGwsbnVsbCl9LApiOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKGE9PW51
-bGwpYT1uZXcgUC5uKCkKdD1uZXcgRXJyb3IoKQp0LmRhcnRFeGNlcHRpb249YQppZigiZGVmaW5lUHJv
-cGVydHkiIGluIE9iamVjdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIm1lc3NhZ2UiLHtnZXQ6SC5o
-fSkKdC5uYW1lPSIifWVsc2UgdC50b1N0cmluZz1ILmgKcmV0dXJuIHR9LApoOmZ1bmN0aW9uKCl7cmV0
-dXJuIEouaih0aGlzLmRhcnRFeGNlcHRpb24pfSwKdmg6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKGEpfSwK
-bGs6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKFAuYTQoYSkpfSwKY006ZnVuY3Rpb24oYSl7dmFyIHQscyxy
-LHEscCxvCmE9SC5lQShhLnJlcGxhY2UoU3RyaW5nKHt9KSwnJHJlY2VpdmVyJCcpKQp0PWEubWF0Y2go
-L1xcXCRbYS16QS1aXStcXFwkL2cpCmlmKHQ9PW51bGwpdD1ILlZNKFtdLHUucykKcz10LmluZGV4T2Yo
-IlxcJGFyZ3VtZW50c1xcJCIpCnI9dC5pbmRleE9mKCJcXCRhcmd1bWVudHNFeHByXFwkIikKcT10Lmlu
-ZGV4T2YoIlxcJGV4cHJcXCQiKQpwPXQuaW5kZXhPZigiXFwkbWV0aG9kXFwkIikKbz10LmluZGV4T2Yo
-IlxcJHJlY2VpdmVyXFwkIikKcmV0dXJuIG5ldyBILlpyKGEucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxc
-XFwkYXJndW1lbnRzXFxcXFxcJCcsJ2cnKSwnKCg/Onh8W154XSkqKScpLnJlcGxhY2UobmV3IFJlZ0V4
-cCgnXFxcXFxcJGFyZ3VtZW50c0V4cHJcXFxcXFwkJywnZycpLCcoKD86eHxbXnhdKSopJykucmVwbGFj
-ZShuZXcgUmVnRXhwKCdcXFxcXFwkZXhwclxcXFxcXCQnLCdnJyksJygoPzp4fFteeF0pKiknKS5yZXBs
-YWNlKG5ldyBSZWdFeHAoJ1xcXFxcXCRtZXRob2RcXFxcXFwkJywnZycpLCcoKD86eHxbXnhdKSopJyku
-cmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcXFwkcmVjZWl2ZXJcXFxcXFwkJywnZycpLCcoKD86eHxbXnhd
-KSopJykscyxyLHEscCxvKX0sClM3OmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigkZXhwciQpe3Zh
-ciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1bWVudHMkJwp0cnl7JGV4cHIkLiRtZXRob2QkKCRhcmd1bWVu
-dHNFeHByJCl9Y2F0Y2godCl7cmV0dXJuIHQubWVzc2FnZX19KGEpfSwKTWo6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGZ1bmN0aW9uKCRleHByJCl7dHJ5eyRleHByJC4kbWV0aG9kJH1jYXRjaCh0KXtyZXR1cm4gdC5t
-ZXNzYWdlfX0oYSl9LApJajpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5XMChhLGI9PW51bGw/bnVs
-bDpiLm1ldGhvZCl9LApUMzpmdW5jdGlvbihhLGIpe3ZhciB0PWI9PW51bGwscz10P251bGw6Yi5tZXRo
-b2QKcmV0dXJuIG5ldyBILmF6KGEscyx0P251bGw6Yi5yZWNlaXZlcil9LApSdTpmdW5jdGlvbihhKXt2
-YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGY9bnVsbCxlPW5ldyBILkFtKGEpCmlmKGE9PW51
-bGwpcmV0dXJuCmlmKGEgaW5zdGFuY2VvZiBILmJxKXJldHVybiBlLiQxKGEuYSkKaWYodHlwZW9mIGEh
-PT0ib2JqZWN0IilyZXR1cm4gYQppZigiZGFydEV4Y2VwdGlvbiIgaW4gYSlyZXR1cm4gZS4kMShhLmRh
-cnRFeGNlcHRpb24pCmVsc2UgaWYoISgibWVzc2FnZSIgaW4gYSkpcmV0dXJuIGEKdD1hLm1lc3NhZ2UK
-aWYoIm51bWJlciIgaW4gYSYmdHlwZW9mIGEubnVtYmVyPT0ibnVtYmVyIil7cz1hLm51bWJlcgpyPXMm
-NjU1MzUKaWYoKEMuam4ud0cocywxNikmODE5MSk9PT0xMClzd2l0Y2gocil7Y2FzZSA0Mzg6cmV0dXJu
-IGUuJDEoSC5UMyhILmQodCkrIiAoRXJyb3IgIityKyIpIixmKSkKY2FzZSA0NDU6Y2FzZSA1MDA3OnJl
-dHVybiBlLiQxKEguSWooSC5kKHQpKyIgKEVycm9yICIrcisiKSIsZikpfX1pZihhIGluc3RhbmNlb2Yg
-VHlwZUVycm9yKXtxPSQuU24oKQpwPSQubHEoKQpvPSQuTjkoKQpuPSQuaUkoKQptPSQuS2YoKQpsPSQu
-WmgoKQprPSQuY1AoKQokLmMzKCkKaj0kLkhLKCkKaT0kLnIxKCkKaD1xLnFTKHQpCmlmKGghPW51bGwp
-cmV0dXJuIGUuJDEoSC5UMyhILnkodCksaCkpCmVsc2V7aD1wLnFTKHQpCmlmKGghPW51bGwpe2gubWV0
-aG9kPSJjYWxsIgpyZXR1cm4gZS4kMShILlQzKEgueSh0KSxoKSl9ZWxzZXtoPW8ucVModCkKaWYoaD09
-bnVsbCl7aD1uLnFTKHQpCmlmKGg9PW51bGwpe2g9bS5xUyh0KQppZihoPT1udWxsKXtoPWwucVModCkK
-aWYoaD09bnVsbCl7aD1rLnFTKHQpCmlmKGg9PW51bGwpe2g9bi5xUyh0KQppZihoPT1udWxsKXtoPWou
-cVModCkKaWYoaD09bnVsbCl7aD1pLnFTKHQpCmc9aCE9bnVsbH1lbHNlIGc9ITB9ZWxzZSBnPSEwfWVs
-c2UgZz0hMH1lbHNlIGc9ITB9ZWxzZSBnPSEwfWVsc2UgZz0hMH1lbHNlIGc9ITAKaWYoZylyZXR1cm4g
-ZS4kMShILklqKEgueSh0KSxoKSl9fXJldHVybiBlLiQxKG5ldyBILnZWKHR5cGVvZiB0PT0ic3RyaW5n
-Ij90OiIiKSl9aWYoYSBpbnN0YW5jZW9mIFJhbmdlRXJyb3Ipe2lmKHR5cGVvZiB0PT0ic3RyaW5nIiYm
-dC5pbmRleE9mKCJjYWxsIHN0YWNrIikhPT0tMSlyZXR1cm4gbmV3IFAuS1koKQp0PWZ1bmN0aW9uKGIp
-e3RyeXtyZXR1cm4gU3RyaW5nKGIpfWNhdGNoKGQpe31yZXR1cm4gbnVsbH0oYSkKcmV0dXJuIGUuJDEo
-bmV3IFAudSghMSxmLGYsdHlwZW9mIHQ9PSJzdHJpbmciP3QucmVwbGFjZSgvXlJhbmdlRXJyb3I6XHMq
-LywiIik6dCkpfWlmKHR5cGVvZiBJbnRlcm5hbEVycm9yPT0iZnVuY3Rpb24iJiZhIGluc3RhbmNlb2Yg
-SW50ZXJuYWxFcnJvcilpZih0eXBlb2YgdD09InN0cmluZyImJnQ9PT0idG9vIG11Y2ggcmVjdXJzaW9u
-IilyZXR1cm4gbmV3IFAuS1koKQpyZXR1cm4gYX0sCnRzOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKGEgaW5z
-dGFuY2VvZiBILmJxKXJldHVybiBhLmIKaWYoYT09bnVsbClyZXR1cm4gbmV3IEguWE8oYSkKdD1hLiRj
-YWNoZWRUcmFjZQppZih0IT1udWxsKXJldHVybiB0CnJldHVybiBhLiRjYWNoZWRUcmFjZT1uZXcgSC5Y
-TyhhKX0sCkI3OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHE9YS5sZW5ndGgKZm9yKHQ9MDt0PHE7dD1y
-KXtzPXQrMQpyPXMrMQpiLlkoMCxhW3RdLGFbc10pfXJldHVybiBifSwKZnQ6ZnVuY3Rpb24oYSxiLGMs
-ZCxlLGYpe3UuWi5iKGEpCnN3aXRjaChILlNjKGIpKXtjYXNlIDA6cmV0dXJuIGEuJDAoKQpjYXNlIDE6
-cmV0dXJuIGEuJDEoYykKY2FzZSAyOnJldHVybiBhLiQyKGMsZCkKY2FzZSAzOnJldHVybiBhLiQzKGMs
-ZCxlKQpjYXNlIDQ6cmV0dXJuIGEuJDQoYyxkLGUsZil9dGhyb3cgSC5iKG5ldyBQLkNEKCJVbnN1cHBv
-cnRlZCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB3cmFwcGVkIGNsb3N1cmUiKSl9LAp0UjpmdW5jdGlv
-bihhLGIpe3ZhciB0CmlmKGE9PW51bGwpcmV0dXJuCnQ9YS4kaWRlbnRpdHkKaWYoISF0KXJldHVybiB0
-CnQ9ZnVuY3Rpb24oYyxkLGUpe3JldHVybiBmdW5jdGlvbihmLGcsaCxpKXtyZXR1cm4gZShjLGQsZixn
-LGgsaSl9fShhLGIsSC5mdCkKYS4kaWRlbnRpdHk9dApyZXR1cm4gdH0sCmlBOmZ1bmN0aW9uKGEsYixj
-LGQsZSxmLGcpe3ZhciB0LHMscixxLHAsbyxuLG0sbD1udWxsLGs9YlswXSxqPWsuJGNhbGxOYW1lLGk9
-ZT9PYmplY3QuY3JlYXRlKG5ldyBILnp4KCkuY29uc3RydWN0b3IucHJvdG90eXBlKTpPYmplY3QuY3Jl
-YXRlKG5ldyBILnJUKGwsbCxsLGwpLmNvbnN0cnVjdG9yLnByb3RvdHlwZSkKaS4kaW5pdGlhbGl6ZT1p
-LmNvbnN0cnVjdG9yCmlmKGUpdD1mdW5jdGlvbiBzdGF0aWNfdGVhcl9vZmYoKXt0aGlzLiRpbml0aWFs
-aXplKCl9CmVsc2V7cz0kLnlqCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuaCgpCiQueWo9
-cysxCnM9bmV3IEZ1bmN0aW9uKCJhLGIsYyxkIitzLCJ0aGlzLiRpbml0aWFsaXplKGEsYixjLGQiK3Mr
-IikiKQp0PXN9aS5jb25zdHJ1Y3Rvcj10CnQucHJvdG90eXBlPWkKaWYoIWUpe3I9SC5ieChhLGssZikK
-ci4kcmVmbGVjdGlvbkluZm89ZH1lbHNle2kuJHN0YXRpY19uYW1lPWcKcj1rfXE9SC5pbShkLGUsZikK
-aS4kUz1xCmlbal09cgpmb3IocD1yLG89MTtvPGIubGVuZ3RoOysrbyl7bj1iW29dCm09bi4kY2FsbE5h
-bWUKaWYobSE9bnVsbCl7bj1lP246SC5ieChhLG4sZikKaVttXT1ufWlmKG89PT1jKXtuLiRyZWZsZWN0
-aW9uSW5mbz1kCnA9bn19aS4kQz1wCmkuJFI9ay4kUgppLiREPWsuJEQKcmV0dXJuIHR9LAppbTpmdW5j
-dGlvbihhLGIsYyl7dmFyIHQKaWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBmdW5jdGlvbihkLGUp
-e3JldHVybiBmdW5jdGlvbigpe3JldHVybiBkKGUpfX0oSC5CcCxhKQppZih0eXBlb2YgYT09InN0cmlu
-ZyIpe2lmKGIpdGhyb3cgSC5iKCJDYW5ub3QgY29tcHV0ZSBzaWduYXR1cmUgZm9yIHN0YXRpYyB0ZWFy
-b2ZmLiIpCnQ9Yz9ILlBXOkguVG4KcmV0dXJuIGZ1bmN0aW9uKGQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7
-cmV0dXJuIGUodGhpcyxkKX19KGEsdCl9dGhyb3cgSC5iKCJFcnJvciBpbiBmdW5jdGlvblR5cGUgb2Yg
-dGVhcm9mZiIpfSwKdnE6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQ9SC5EVgpzd2l0Y2goYj8tMTphKXtj
-YXNlIDA6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcylb
-ZV0oKX19KGMsdCkKY2FzZSAxOnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihnKXty
-ZXR1cm4gZih0aGlzKVtlXShnKX19KGMsdCkKY2FzZSAyOnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVy
-biBmdW5jdGlvbihnLGgpe3JldHVybiBmKHRoaXMpW2VdKGcsaCl9fShjLHQpCmNhc2UgMzpyZXR1cm4g
-ZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGkpe3JldHVybiBmKHRoaXMpW2VdKGcsaCxp
-KX19KGMsdCkKY2FzZSA0OnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihnLGgsaSxq
-KXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSxqKX19KGMsdCkKY2FzZSA1OnJldHVybiBmdW5jdGlvbihl
-LGYpe3JldHVybiBmdW5jdGlvbihnLGgsaSxqLGspe3JldHVybiBmKHRoaXMpW2VdKGcsaCxpLGosayl9
-fShjLHQpCmRlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJu
-IGUuYXBwbHkoZih0aGlzKSxhcmd1bWVudHMpfX0oZCx0KX19LApieDpmdW5jdGlvbihhLGIsYyl7dmFy
-IHQscyxyLHEscCxvLG4KaWYoYylyZXR1cm4gSC5IZihhLGIpCnQ9Yi4kc3R1Yk5hbWUKcz1iLmxlbmd0
-aApyPWFbdF0KcT1iPT1udWxsP3I9PW51bGw6Yj09PXIKcD0hcXx8cz49MjcKaWYocClyZXR1cm4gSC52
-cShzLCFxLHQsYikKaWYocz09PTApe3E9JC55agppZih0eXBlb2YgcSE9PSJudW1iZXIiKXJldHVybiBx
-LmgoKQokLnlqPXErMQpvPSJzZWxmIitxCnE9InJldHVybiBmdW5jdGlvbigpe3ZhciAiK28rIiA9IHRo
-aXMuIgpwPSQubUoKcmV0dXJuIG5ldyBGdW5jdGlvbihxK0guZChwPT1udWxsPyQubUo9SC5FMigic2Vs
-ZiIpOnApKyI7cmV0dXJuICIrbysiLiIrSC5kKHQpKyIoKTt9IikoKX1uPSJhYmNkZWZnaGlqa2xtbm9w
-cXJzdHV2d3h5eiIuc3BsaXQoIiIpLnNwbGljZSgwLHMpLmpvaW4oIiwiKQpxPSQueWoKaWYodHlwZW9m
-IHEhPT0ibnVtYmVyIilyZXR1cm4gcS5oKCkKJC55aj1xKzEKbis9cQpxPSJyZXR1cm4gZnVuY3Rpb24o
-IituKyIpe3JldHVybiB0aGlzLiIKcD0kLm1KCnJldHVybiBuZXcgRnVuY3Rpb24ocStILmQocD09bnVs
-bD8kLm1KPUguRTIoInNlbGYiKTpwKSsiLiIrSC5kKHQpKyIoIituKyIpO30iKSgpfSwKWjQ6ZnVuY3Rp
-b24oYSxiLGMsZCl7dmFyIHQ9SC5EVixzPUgueVMKc3dpdGNoKGI/LTE6YSl7Y2FzZSAwOnRocm93IEgu
-YihILkVmKCJJbnRlcmNlcHRlZCBmdW5jdGlvbiB3aXRoIG5vIGFyZ3VtZW50cy4iKSkKY2FzZSAxOnJl
-dHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcylbZV0oZyh0
-aGlzKSl9fShjLHQscykKY2FzZSAyOnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9u
-KGgpe3JldHVybiBmKHRoaXMpW2VdKGcodGhpcyksaCl9fShjLHQscykKY2FzZSAzOnJldHVybiBmdW5j
-dGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxo
-LGkpfX0oYyx0LHMpCmNhc2UgNDpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbiho
-LGksail7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksail9fShjLHQscykKY2FzZSA1OnJldHVy
-biBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSxqLGspe3JldHVybiBmKHRoaXMpW2Vd
-KGcodGhpcyksaCxpLGosayl9fShjLHQscykKY2FzZSA2OnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0
-dXJuIGZ1bmN0aW9uKGgsaSxqLGssbCl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksaixrLGwp
-fX0oYyx0LHMpCmRlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsZixnLGgpe3JldHVybiBmdW5jdGlvbigp
-e2g9W2codGhpcyldCkFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGgsYXJndW1lbnRzKQpyZXR1cm4g
-ZS5hcHBseShmKHRoaXMpLGgpfX0oZCx0LHMpfX0sCkhmOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEs
-cCxvLG4sbT0kLm1KCmlmKG09PW51bGwpbT0kLm1KPUguRTIoInNlbGYiKQp0PSQuUDQKaWYodD09bnVs
-bCl0PSQuUDQ9SC5FMigicmVjZWl2ZXIiKQpzPWIuJHN0dWJOYW1lCnI9Yi5sZW5ndGgKcT1hW3NdCnA9
-Yj09bnVsbD9xPT1udWxsOmI9PT1xCm89IXB8fHI+PTI4CmlmKG8pcmV0dXJuIEguWjQociwhcCxzLGIp
-CmlmKHI9PT0xKXttPSJyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4iK0guZChtKSsiLiIrSC5k
-KHMpKyIodGhpcy4iK0guZCh0KSsiKTsiCnQ9JC55agppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVy
-biB0LmgoKQokLnlqPXQrMQpyZXR1cm4gbmV3IEZ1bmN0aW9uKG0rdCsifSIpKCl9bj0iYWJjZGVmZ2hp
-amtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zcGxpY2UoMCxyLTEpLmpvaW4oIiwiKQptPSJyZXR1
-cm4gZnVuY3Rpb24oIituKyIpe3JldHVybiB0aGlzLiIrSC5kKG0pKyIuIitILmQocykrIih0aGlzLiIr
-SC5kKHQpKyIsICIrbisiKTsiCnQ9JC55agppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0Lmgo
-KQokLnlqPXQrMQpyZXR1cm4gbmV3IEZ1bmN0aW9uKG0rdCsifSIpKCl9LApLcTpmdW5jdGlvbihhLGIs
-YyxkLGUsZixnKXtyZXR1cm4gSC5pQShhLGIsYyxkLCEhZSwhIWYsZyl9LApUbjpmdW5jdGlvbihhLGIp
-e3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLEgueksoYS5hKSxiKX0sClBXOmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIEguY0Uodi50eXBlVW5pdmVyc2UsSC56SyhhLmMpLGIpfSwKRFY6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEuYX0sCnlTOmZ1bmN0aW9uKGEpe3JldHVybiBhLmN9LApFMjpmdW5jdGlvbihhKXt2YXIgdCxz
-LHIscT1uZXcgSC5yVCgic2VsZiIsInRhcmdldCIsInJlY2VpdmVyIiwibmFtZSIpLHA9Si5FcChPYmpl
-Y3QuZ2V0T3duUHJvcGVydHlOYW1lcyhxKSkKZm9yKHQ9cC5sZW5ndGgscz0wO3M8dDsrK3Mpe3I9cFtz
-XQppZihxW3JdPT09YSlyZXR1cm4gcn19LApvVDpmdW5jdGlvbihhKXtpZihhPT1udWxsKUguZk8oImJv
-b2xlYW4gZXhwcmVzc2lvbiBtdXN0IG5vdCBiZSBudWxsIikKcmV0dXJuIGF9LApmTzpmdW5jdGlvbihh
-KXt0aHJvdyBILmIobmV3IEgua1koYSkpfSwKYWc6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKG5ldyBQLmMo
-YSkpfSwKRWY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILkVxKGEpfSwKWWc6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHYuZ2V0SXNvbGF0ZVRhZyhhKX0sClZNOmZ1bmN0aW9uKGEsYil7YS4kdGk9YgpyZXR1cm4gYX0s
-Cm9YOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuCnJldHVybiBhLiR0aX0sCklNOmZ1bmN0aW9u
-KGEsYixjKXtyZXR1cm4gSC5ZOShhWyIkYSIrSC5kKGMpXSxILm9YKGIpKX0sClk5OmZ1bmN0aW9uKGEs
-Yil7aWYoYT09bnVsbClyZXR1cm4gYgphPWEuYXBwbHkobnVsbCxiKQppZihhPT1udWxsKXJldHVybgpp
-ZihBcnJheS5pc0FycmF5KGEpKXJldHVybiBhCmlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBh
-LmFwcGx5KG51bGwsYikKcmV0dXJuIGJ9LApJRzpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuYXBwbHko
-YixILlk5KEouaWEoYilbIiRhIitILmQoYyldLEgub1goYikpKX0sCml3OmZ1bmN0aW9uKGEsYixjKXtP
-YmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTpjLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6
-dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pfSwKdzM6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD1ILnko
-JC5ORi4kMShhKSksbz0kLm53W3BdCmlmKG8hPW51bGwpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHYu
-ZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOm8sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVl
-LGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIG8uaX10PSQudnZbcF0KaWYodCE9bnVsbClyZXR1cm4g
-dApzPXYuaW50ZXJjZXB0b3JzQnlUYWdbcF0KaWYocz09bnVsbCl7cD1ILnkoJC5UWC4kMihhLHApKQpp
-ZihwIT1udWxsKXtvPSQubndbcF0KaWYobyE9bnVsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdi5k
-aXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUs
-Y29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gby5pfXQ9JC52dltwXQppZih0IT1udWxsKXJldHVybiB0
-CnM9di5pbnRlcmNlcHRvcnNCeVRhZ1twXX19aWYocz09bnVsbClyZXR1cm4KdD1zLnByb3RvdHlwZQpy
-PXBbMF0KaWYocj09PSIhIil7bz1ILlZhKHQpCiQubndbcF09bwpPYmplY3QuZGVmaW5lUHJvcGVydHko
-YSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpvLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6
-dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBvLml9aWYocj09PSJ+Iil7JC52dltwXT10CnJl
-dHVybiB0fWlmKHI9PT0iLSIpe3E9SC5WYSh0KQpPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0Lmdl
-dFByb3RvdHlwZU9mKGEpLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOnEsZW51bWVyYWJsZTpm
-YWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIHEuaX1pZihyPT09Iisi
-KXJldHVybiBILkxjKGEsdCkKaWYocj09PSIqIil0aHJvdyBILmIoUC5TWShwKSkKaWYodi5sZWFmVGFn
-c1twXT09PXRydWUpe3E9SC5WYSh0KQpPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LmdldFByb3Rv
-dHlwZU9mKGEpLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOnEsZW51bWVyYWJsZTpmYWxzZSx3
-cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIHEuaX1lbHNlIHJldHVybiBILkxj
-KGEsdCl9LApMYzpmdW5jdGlvbihhLGIpe3ZhciB0PU9iamVjdC5nZXRQcm90b3R5cGVPZihhKQpPYmpl
-Y3QuZGVmaW5lUHJvcGVydHkodCx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpKLlF1KGIsdCxu
-dWxsLG51bGwpLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0p
-CnJldHVybiBifSwKVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUXUoYSwhMSxudWxsLCEhYS4kaVhqKX0s
-ClZGOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1iLnByb3RvdHlwZQppZih2LmxlYWZUYWdzW2FdPT09dHJ1
-ZSlyZXR1cm4gSC5WYSh0KQplbHNlIHJldHVybiBKLlF1KHQsYyxudWxsLG51bGwpfSwKWEQ6ZnVuY3Rp
-b24oKXtpZighMD09PSQuQnYpcmV0dXJuCiQuQnY9ITAKSC5aMSgpfSwKWjE6ZnVuY3Rpb24oKXt2YXIg
-dCxzLHIscSxwLG8sbixtCiQubnc9T2JqZWN0LmNyZWF0ZShudWxsKQokLnZ2PU9iamVjdC5jcmVhdGUo
-bnVsbCkKSC5rTygpCnQ9di5pbnRlcmNlcHRvcnNCeVRhZwpzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5h
-bWVzKHQpCmlmKHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiKXt3aW5kb3cKcj1mdW5jdGlvbigpe30K
-Zm9yKHE9MDtxPHMubGVuZ3RoOysrcSl7cD1zW3FdCm89JC54Ny4kMShwKQppZihvIT1udWxsKXtuPUgu
-VkYocCx0W3BdLG8pCmlmKG4hPW51bGwpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLHYuZGlzcGF0Y2hQ
-cm9wZXJ0eU5hbWUse3ZhbHVlOm4sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3Vy
-YWJsZTp0cnVlfSkKci5wcm90b3R5cGU9b319fX1mb3IocT0wO3E8cy5sZW5ndGg7KytxKXtwPXNbcV0K
-aWYoL15bQS1aYS16X10vLnRlc3QocCkpe209dFtwXQp0WyIhIitwXT1tCnRbIn4iK3BdPW0KdFsiLSIr
-cF09bQp0WyIrIitwXT1tCnRbIioiK3BdPW19fX0sCmtPOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscCxv
-LG49Qy5ZcSgpCm49SC51ZChDLktVLEgudWQoQy5mUSxILnVkKEMuaTcsSC51ZChDLmk3LEgudWQoQy54
-aSxILnVkKEMuZGssSC51ZChDLndiKEMuTzQpLG4pKSkpKSkpCmlmKHR5cGVvZiBkYXJ0TmF0aXZlRGlz
-cGF0Y2hIb29rc1RyYW5zZm9ybWVyIT0idW5kZWZpbmVkIil7dD1kYXJ0TmF0aXZlRGlzcGF0Y2hIb29r
-c1RyYW5zZm9ybWVyCmlmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXQ9W3RdCmlmKHQuY29uc3RydWN0b3I9
-PUFycmF5KWZvcihzPTA7czx0Lmxlbmd0aDsrK3Mpe3I9dFtzXQppZih0eXBlb2Ygcj09ImZ1bmN0aW9u
-IiluPXIobil8fG59fXE9bi5nZXRUYWcKcD1uLmdldFVua25vd25UYWcKbz1uLnByb3RvdHlwZUZvclRh
-ZwokLk5GPW5ldyBILmRDKHEpCiQuVFg9bmV3IEgud04ocCkKJC54Nz1uZXcgSC5WWChvKX0sCnVkOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIGEoYil8fGJ9LAp2NDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIHQ9
-Yj8ibSI6IiIscz1jPyIiOiJpIixyPWQ/InUiOiIiLHE9ZT8icyI6IiIscD1mPyJnIjoiIixvPWZ1bmN0
-aW9uKGcsaCl7dHJ5e3JldHVybiBuZXcgUmVnRXhwKGcsaCl9Y2F0Y2gobil7cmV0dXJuIG59fShhLHQr
-cytyK3ErcCkKaWYobyBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gbwp0aHJvdyBILmIoUC5ycigiSWxs
-ZWdhbCBSZWdFeHAgcGF0dGVybiAoIitTdHJpbmcobykrIikiLGEsbnVsbCkpfSwKbTI6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciB0CmlmKHR5cGVvZiBiPT0ic3RyaW5nIilyZXR1cm4gYS5pbmRleE9mKGIsYyk+PTAK
-ZWxzZSBpZihiIGluc3RhbmNlb2YgSC5WUil7dD1DLnhCLkcoYSxjKQpyZXR1cm4gYi5iLnRlc3QodCl9
-ZWxzZXt0PUouRkwoYixDLnhCLkcoYSxjKSkKcmV0dXJuIXQuZ2wwKHQpfX0sCkE0OmZ1bmN0aW9uKGEp
-e2lmKGEuaW5kZXhPZigiJCIsMCk+PTApcmV0dXJuIGEucmVwbGFjZSgvXCQvZywiJCQkJCIpCnJldHVy
-biBhfSwKZUE6ZnVuY3Rpb24oYSl7aWYoL1tbXF17fSgpKis/LlxcXiR8XS8udGVzdChhKSlyZXR1cm4g
-YS5yZXBsYWNlKC9bW1xde30oKSorPy5cXF4kfF0vZywiXFwkJiIpCnJldHVybiBhfSwKeXM6ZnVuY3Rp
-b24oYSxiLGMpe3ZhciB0PUgubk0oYSxiLGMpCnJldHVybiB0fSwKbk06ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0LHMscixxCmlmKGI9PT0iIil7aWYoYT09PSIiKXJldHVybiBjCnQ9YS5sZW5ndGgKZm9yKHM9Yyxy
-PTA7cjx0OysrcilzPXMrYVtyXStjCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfXE9YS5pbmRl
-eE9mKGIsMCkKaWYocTwwKXJldHVybiBhCmlmKGEubGVuZ3RoPDUwMHx8Yy5pbmRleE9mKCIkIiwwKT49
-MClyZXR1cm4gYS5zcGxpdChiKS5qb2luKGMpCnJldHVybiBhLnJlcGxhY2UobmV3IFJlZ0V4cChILmVB
-KGIpLCdnJyksSC5BNChjKSl9LApQRDpmdW5jdGlvbiBQRChhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9
-LApXVTpmdW5jdGlvbiBXVSgpe30sCkxQOmZ1bmN0aW9uIExQKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5h
-PWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCkxJOmZ1bmN0aW9uIExJKGEsYixjLGQsZSl7dmFyIF89dGhp
-cwpfLmE9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLmY9ZX0sCkNqOmZ1bmN0aW9uIENqKGEsYixjKXt0aGlz
-LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClpyOmZ1bmN0aW9uIFpyKGEsYixjLGQsZSxmKXt2YXIgXz10
-aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKVzA6ZnVuY3Rpb24gVzAoYSxi
-KXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmF6OmZ1bmN0aW9uIGF6KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLmM9Y30sCnZWOmZ1bmN0aW9uIHZWKGEpe3RoaXMuYT1hfSwKYnE6ZnVuY3Rpb24gYnEoYSxi
-KXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFtOmZ1bmN0aW9uIEFtKGEpe3RoaXMuYT1hfSwKWE86ZnVuY3Rp
-b24gWE8oYSl7dGhpcy5hPWEKdGhpcy5iPW51bGx9LApUcDpmdW5jdGlvbiBUcCgpe30sCmxjOmZ1bmN0
-aW9uIGxjKCl7fSwKeng6ZnVuY3Rpb24gengoKXt9LApyVDpmdW5jdGlvbiByVChhLGIsYyxkKXt2YXIg
-Xz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKRXE6ZnVuY3Rpb24gRXEoYSl7dGhpcy5hPWF9
-LAprWTpmdW5jdGlvbiBrWShhKXt0aGlzLmE9YX0sCk41OmZ1bmN0aW9uIE41KGEpe3ZhciBfPXRoaXMK
-Xy5hPTAKXy5mPV8uZT1fLmQ9Xy5jPV8uYj1udWxsCl8ucj0wCl8uJHRpPWF9LApkYjpmdW5jdGlvbiBk
-YihhLGIpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5kPV8uYz1udWxsfSwKaTU6ZnVuY3Rpb24gaTUo
-YSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKTjY6ZnVuY3Rpb24gTjYoYSxiLGMpe3ZhciBfPXRoaXMK
-Xy5hPWEKXy5iPWIKXy5kPV8uYz1udWxsCl8uJHRpPWN9LApkQzpmdW5jdGlvbiBkQyhhKXt0aGlzLmE9
-YX0sCndOOmZ1bmN0aW9uIHdOKGEpe3RoaXMuYT1hfSwKVlg6ZnVuY3Rpb24gVlgoYSl7dGhpcy5hPWF9
-LApWUjpmdW5jdGlvbiBWUihhLGIpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5kPV8uYz1udWxsfSwK
-RUs6ZnVuY3Rpb24gRUsoYSl7dGhpcy5iPWF9LApLVzpmdW5jdGlvbiBLVyhhLGIsYyl7dGhpcy5hPWEK
-dGhpcy5iPWIKdGhpcy5jPWN9LApQYjpmdW5jdGlvbiBQYihhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpf
-LmI9YgpfLmM9YwpfLmQ9bnVsbH0sCnRROmZ1bmN0aW9uIHRRKGEsYil7dGhpcy5hPWEKdGhpcy5jPWJ9
-LAp1bjpmdW5jdGlvbiB1bihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApTZDpmdW5j
-dGlvbiBTZChhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9bnVsbH0sClhGOmZ1
-bmN0aW9uKGEpe3JldHVybiBhfSwKRFE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBJbnQ4QXJyYXkoYSl9
-LApvZDpmdW5jdGlvbihhLGIsYyl7aWYoYT4+PjAhPT1hfHxhPj1jKXRocm93IEguYihILkhZKGIsYSkp
-fSwKck06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKCEoYT4+PjAhPT1hKSl0PWI+Pj4wIT09Ynx8YT5i
-fHxiPmMKZWxzZSB0PSEwCmlmKHQpdGhyb3cgSC5iKEguYXUoYSxiLGMpKQpyZXR1cm4gYn0sCkVUOmZ1
-bmN0aW9uIEVUKCl7fSwKYjA6ZnVuY3Rpb24gYjAoKXt9LApEZzpmdW5jdGlvbiBEZygpe30sClBnOmZ1
-bmN0aW9uIFBnKCl7fSwKeGo6ZnVuY3Rpb24geGooKXt9LApkRTpmdW5jdGlvbiBkRSgpe30sClpBOmZ1
-bmN0aW9uIFpBKCl7fSwKd2Y6ZnVuY3Rpb24gd2YoKXt9LApQcTpmdW5jdGlvbiBQcSgpe30sCmVFOmZ1
-bmN0aW9uIGVFKCl7fSwKVjY6ZnVuY3Rpb24gVjYoKXt9LApSRzpmdW5jdGlvbiBSRygpe30sClZQOmZ1
-bmN0aW9uIFZQKCl7fSwKV0I6ZnVuY3Rpb24gV0IoKXt9LApaRzpmdW5jdGlvbiBaRygpe30sCnhaOmZ1
-bmN0aW9uKGEsYil7dmFyIHQ9Yi5kCnJldHVybiB0PT1udWxsP2IuZD1ILkooYSwiYjgiLFtiLlFdKTp0
-fSwKUTE6ZnVuY3Rpb24oYSl7dmFyIHQ9YS56CmlmKHQ9PT02fHx0PT09N3x8dD09PTgpcmV0dXJuIEgu
-UTEoYS5RKQpyZXR1cm4gdD09PTExfHx0PT09MTJ9LAptRDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kYn0s
-Ck4wOmZ1bmN0aW9uKGEpe3JldHVybiBILkUodi50eXBlVW5pdmVyc2UsYSl9LApKUzpmdW5jdGlvbihh
-KXt2YXIgdD1hLiRTCmlmKHQhPW51bGwpe2lmKHR5cGVvZiB0PT0ibnVtYmVyIilyZXR1cm4gSC5CcCh0
-KQpyZXR1cm4gYS4kUygpfXJldHVybn0sClVlOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoSC5RMShiKSlp
-ZihhIGluc3RhbmNlb2YgSC5UcCl7dD1ILkpTKGEpCmlmKHQhPW51bGwpcmV0dXJuIHR9cmV0dXJuIEgu
-eksoYSl9LAp6SzpmdW5jdGlvbihhKXt2YXIgdAppZihhIGluc3RhbmNlb2YgUC5rKXt0PWEuJHRpCnJl
-dHVybiB0IT1udWxsP3Q6SC5WVShhKX1pZihBcnJheS5pc0FycmF5KGEpKXJldHVybiBILnQ2KGEpCnJl
-dHVybiBILlZVKEouaWEoYSkpfSwKdDY6ZnVuY3Rpb24oYSl7dmFyIHQ9YS4kdGkscz11Lm0KaWYodD09
-bnVsbClyZXR1cm4gcwppZih0LmNvbnN0cnVjdG9yIT09cy5jb25zdHJ1Y3RvcilyZXR1cm4gcwpyZXR1
-cm4gdH0sCkxoOmZ1bmN0aW9uKGEpe3ZhciB0PWEuJHRpCnJldHVybiB0IT1udWxsP3Q6SC5WVShhKX0s
-ClZVOmZ1bmN0aW9uKGEpe3ZhciB0PWEuY29uc3RydWN0b3Iscz10LiRjY2FjaGUKaWYocyE9bnVsbCly
-ZXR1cm4gcwpyZXR1cm4gSC5yOShhLHQpfSwKcjk6ZnVuY3Rpb24oYSxiKXt2YXIgdD1hIGluc3RhbmNl
-b2YgSC5UcD9hLl9fcHJvdG9fXy5fX3Byb3RvX18uY29uc3RydWN0b3I6YixzPUguYWkodi50eXBlVW5p
-dmVyc2UsdC5uYW1lKQpiLiRjY2FjaGU9cwpyZXR1cm4gc30sCkJwOmZ1bmN0aW9uKGEpe3ZhciB0LHM9
-YSxyPXYudHlwZXMscT1yW3NdCmlmKHR5cGVvZiBxPT0ic3RyaW5nIil7dD1ILkUodi50eXBlVW5pdmVy
-c2UscSkKcltzXT10CnJldHVybiB0fXJldHVybiBxfSwKSko6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlz
-LHI9cy56LHE9SC5ZTwppZihILmNjKHMsITApKXtxPUguSXcKcy5iPXMuYT1ILmhufWVsc2UgaWYocj09
-PTkpe3Q9cy5kYgppZigiS04iPT09dClxPUgub2sKZWxzZSBpZigiQ1AiPT09dClxPUguS0gKZWxzZSBp
-ZigiRksiPT09dClxPUguS0gKZWxzZSBpZigicVUiPT09dClxPUguTU0KZWxzZSBpZigiYTIiPT09dClx
-PUgubAplbHNle3I9cy5RCmlmKHMuY2guZXZlcnkoSC5yTikpe3MueD0iJGkiK3IKcT1ILnQ0fX19cy5j
-PXEKcmV0dXJuIHMuYyhhKX0sCllPOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMKcmV0dXJuIEguV2Uodi50
-eXBlVW5pdmVyc2UsSC5VZShhLHQpLG51bGwsdCxudWxsLCEwKX0sCnQ0OmZ1bmN0aW9uKGEpe3ZhciB0
-PXRoaXMueAppZihhIGluc3RhbmNlb2YgUC5rKXJldHVybiEhYVt0XQpyZXR1cm4hIUouaWEoYSlbdF19
-LApPejpmdW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxsKXJldHVybiBhCnQ9dGhpcwppZih0LmMoYSkp
-cmV0dXJuIGEKdGhyb3cgSC5iKEguUTUoSC5XSyhhLEguVWUoYSx0KSxILmRtKHQsbnVsbCkpKSl9LApB
-djpmdW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxsKXJldHVybiBhCnQ9dGhpcwppZih0LmMoYSkpcmV0
-dXJuIGEKdGhyb3cgSC5iKEguWmMoSC5XSyhhLEguVWUoYSx0KSxILmRtKHQsbnVsbCkpKSl9LApEaDpm
-dW5jdGlvbihhLGIsYyxkKXt2YXIgdD1udWxsCmlmKEguV2Uodi50eXBlVW5pdmVyc2UsYSx0LGIsdCwh
-MCkpcmV0dXJuIGEKdGhyb3cgSC5iKEguWmMoIlRoZSB0eXBlIGFyZ3VtZW50ICciK0guZChILmRtKGEs
-dCkpKyInIGlzIG5vdCBhIHN1YnR5cGUgb2YgdGhlIHR5cGUgdmFyaWFibGUgYm91bmQgJyIrSC5kKEgu
-ZG0oYix0KSkrIicgb2YgdHlwZSB2YXJpYWJsZSAnIitjKyInIGluICciK0guZChkKSsiJy4iKSl9LApX
-SzpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9UC5wKGEpLHM9SC5kbShiPT1udWxsP0gueksoYSk6YixudWxs
-KQpyZXR1cm4gdCsiOiB0eXBlICciK0guZChzKSsiJyBpcyBub3QgYSBzdWJ0eXBlIG9mIHR5cGUgJyIr
-SC5kKGMpKyInIn0sClE1OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5oeigiQ2FzdEVycm9yOiAiK2Ep
-fSwKUHY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEguaHooIkNhc3RFcnJvcjogIitILldLKGEsbnVs
-bCxiKSl9LApaYzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguaU0oIlR5cGVFcnJvcjogIithKX0sCnE6
-ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEguaU0oIlR5cGVFcnJvcjogIitILldLKGEsbnVsbCxiKSl9
-LApJdzpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCmhuOmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKbDpmdW5j
-dGlvbihhKXtyZXR1cm4hMD09PWF8fCExPT09YX0sCkU5OmZ1bmN0aW9uKGEpe2lmKCEwPT09YXx8ITE9
-PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiYm9vbCIpKX0s
-CnhkOmZ1bmN0aW9uKGEpe2lmKCEwPT09YXx8ITE9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJu
-IGEKdGhyb3cgSC5iKEgucShhLCJib29sIikpfSwKZGo6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJu
-dW1iZXIiKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiZG91Ymxl
-IikpfSwKSWc6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9PW51
-bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJkb3VibGUiKSl9LApvazpmdW5jdGlvbihhKXtyZXR1
-cm4gdHlwZW9mIGE9PSJudW1iZXIiJiZNYXRoLmZsb29yKGEpPT09YX0sClNIOmZ1bmN0aW9uKGEpe2lm
-KHR5cGVvZiBhPT0ibnVtYmVyIiYmTWF0aC5mbG9vcihhKT09PWEpcmV0dXJuIGEKaWYoYT09bnVsbCly
-ZXR1cm4gYQp0aHJvdyBILmIoSC5QdihhLCJpbnQiKSl9LApTYzpmdW5jdGlvbihhKXtpZih0eXBlb2Yg
-YT09Im51bWJlciImJk1hdGguZmxvb3IoYSk9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEK
-dGhyb3cgSC5iKEgucShhLCJpbnQiKSl9LApLSDpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJu
-dW1iZXIifSwKdVU6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9
-PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwibnVtIikpfSwKRE46ZnVuY3Rpb24oYSl7aWYo
+cCxvLG49bnVsbAppZih0eXBlb2YgYSE9InN0cmluZyIpSC52aChILnRMKGEpKQp0PS9eXHMqWystXT8o
+KDB4W2EtZjAtOV0rKXwoXGQrKXwoW2EtejAtOV0rKSlccyokL2kuZXhlYyhhKQppZih0PT1udWxsKXJl
+dHVybiBuCmlmKDM+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsMykKcz1ILnkodFszXSkKaWYoYj09bnVs
+bCl7aWYocyE9bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwxMCkKaWYodFsyXSE9bnVsbClyZXR1cm4gcGFy
+c2VJbnQoYSwxNikKcmV0dXJuIG59aWYoYjwyfHxiPjM2KXRocm93IEguYihQLlRFKGIsMiwzNiwicmFk
+aXgiLG4pKQppZihiPT09MTAmJnMhPW51bGwpcmV0dXJuIHBhcnNlSW50KGEsMTApCmlmKGI8MTB8fHM9
+PW51bGwpe3I9Yjw9MTA/NDcrYjo4NitiCnE9dFsxXQpmb3IocD1xLmxlbmd0aCxvPTA7bzxwOysrbylp
+ZigoQy54Qi5XKHEsbyl8MzIpPnIpcmV0dXJuIG59cmV0dXJuIHBhcnNlSW50KGEsYil9LApNOmZ1bmN0
+aW9uKGEpe3ZhciB0PUguSDUoYSkKcmV0dXJuIHR9LApINTpmdW5jdGlvbihhKXt2YXIgdCxzLHIKaWYo
+YSBpbnN0YW5jZW9mIFAuaylyZXR1cm4gSC5kbShILnpLKGEpLG51bGwpCmlmKEouaWEoYSk9PT1DLk9r
+fHx1LmFrLmMoYSkpe3Q9Qy5PNChhKQppZihILmYodCkpcmV0dXJuIHQKcz1hLmNvbnN0cnVjdG9yCmlm
+KHR5cGVvZiBzPT0iZnVuY3Rpb24iKXtyPXMubmFtZQppZih0eXBlb2Ygcj09InN0cmluZyImJkguZihy
+KSlyZXR1cm4gcn19cmV0dXJuIEguZG0oSC56SyhhKSxudWxsKX0sCmY6ZnVuY3Rpb24oYSl7dmFyIHQ9
+YSE9PSJPYmplY3QiJiZhIT09IiIKcmV0dXJuIHR9LApNMDpmdW5jdGlvbigpe2lmKCEhc2VsZi5sb2Nh
+dGlvbilyZXR1cm4gc2VsZi5sb2NhdGlvbi5ocmVmCnJldHVybiBudWxsfSwKVks6ZnVuY3Rpb24oYSl7
+dmFyIHQscyxyLHEscD1hLmxlbmd0aAppZihwPD01MDApcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUu
+YXBwbHkobnVsbCxhKQpmb3IodD0iIixzPTA7czxwO3M9cil7cj1zKzUwMApxPXI8cD9yOnAKdCs9U3Ry
+aW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEuc2xpY2UocyxxKSl9cmV0dXJuIHR9LApQTDpmdW5j
+dGlvbihhKXt2YXIgdCxzLHIscT1ILlZNKFtdLHUudCkKZm9yKHQ9YS5sZW5ndGgscz0wO3M8YS5sZW5n
+dGg7YS5sZW5ndGg9PT10fHwoMCxILmxrKShhKSwrK3Mpe3I9YVtzXQppZighSC5vayhyKSl0aHJvdyBI
+LmIoSC50TChyKSkKaWYocjw9NjU1MzUpQy5ObS5pKHEscikKZWxzZSBpZihyPD0xMTE0MTExKXtDLk5t
+LmkocSw1NTI5NisoQy5qbi53RyhyLTY1NTM2LDEwKSYxMDIzKSkKQy5ObS5pKHEsNTYzMjArKHImMTAy
+MykpfWVsc2UgdGhyb3cgSC5iKEgudEwocikpfXJldHVybiBILlZLKHEpfSwKZVQ6ZnVuY3Rpb24oYSl7
+dmFyIHQscyxyCmZvcih0PWEubGVuZ3RoLHM9MDtzPHQ7KytzKXtyPWFbc10KaWYoIUgub2socikpdGhy
+b3cgSC5iKEgudEwocikpCmlmKHI8MCl0aHJvdyBILmIoSC50TChyKSkKaWYocj42NTUzNSlyZXR1cm4g
+SC5QTChhKX1yZXR1cm4gSC5WSyhhKX0sCmZ3OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQppZihj
+PD01MDAmJmI9PT0wJiZjPT09YS5sZW5ndGgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHko
+bnVsbCxhKQpmb3IodD1iLHM9IiI7dDxjO3Q9cil7cj10KzUwMApxPXI8Yz9yOmMKcys9U3RyaW5nLmZy
+b21DaGFyQ29kZS5hcHBseShudWxsLGEuc3ViYXJyYXkodCxxKSl9cmV0dXJuIHN9LApMdzpmdW5jdGlv
+bihhKXt2YXIgdAppZigwPD1hKXtpZihhPD02NTUzNSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShh
+KQppZihhPD0xMTE0MTExKXt0PWEtNjU1MzYKcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKDU1Mjk2
+fEMuam4ud0codCwxMCkpPj4+MCw1NjMyMHx0JjEwMjMpfX10aHJvdyBILmIoUC5URShhLDAsMTExNDEx
+MSxudWxsLG51bGwpKX0sCm8yOmZ1bmN0aW9uKGEpe2lmKGEuZGF0ZT09PXZvaWQgMClhLmRhdGU9bmV3
+IERhdGUoYS5hKQpyZXR1cm4gYS5kYXRlfSwKdEo6ZnVuY3Rpb24oYSl7dmFyIHQ9SC5vMihhKS5nZXRG
+dWxsWWVhcigpKzAKcmV0dXJuIHR9LApOUzpmdW5jdGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldE1vbnRo
+KCkrMQpyZXR1cm4gdH0sCmpBOmZ1bmN0aW9uKGEpe3ZhciB0PUgubzIoYSkuZ2V0RGF0ZSgpKzAKcmV0
+dXJuIHR9LApLTDpmdW5jdGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldEhvdXJzKCkrMApyZXR1cm4gdH0s
+CmNoOmZ1bmN0aW9uKGEpe3ZhciB0PUgubzIoYSkuZ2V0TWludXRlcygpKzAKcmV0dXJuIHR9LApKZDpm
+dW5jdGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldFNlY29uZHMoKSswCnJldHVybiB0fSwKbzE6ZnVuY3Rp
+b24oYSl7dmFyIHQ9SC5vMihhKS5nZXRNaWxsaXNlY29uZHMoKSswCnJldHVybiB0fSwKem86ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0LHMscj17fQpyLmE9MAp0PVtdCnM9W10Kci5hPWIubGVuZ3RoCkMuTm0uRlYo
+dCxiKQpyLmI9IiIKaWYoYyE9bnVsbCYmYy5hIT09MCljLksoMCxuZXcgSC5DaihyLHMsdCkpCiIiK3Iu
+YQpyZXR1cm4gSi5KeShhLG5ldyBILkxJKEMuVGUsMCx0LHMsMCkpfSwKRWs6ZnVuY3Rpb24oYSxiLGMp
+e3ZhciB0LHMscixxCmlmKGIgaW5zdGFuY2VvZiBBcnJheSl0PWM9PW51bGx8fGMuYT09PTAKZWxzZSB0
+PSExCmlmKHQpe3M9YgpyPXMubGVuZ3RoCmlmKHI9PT0wKXtpZighIWEuJDApcmV0dXJuIGEuJDAoKX1l
+bHNlIGlmKHI9PT0xKXtpZighIWEuJDEpcmV0dXJuIGEuJDEoc1swXSl9ZWxzZSBpZihyPT09Mil7aWYo
+ISFhLiQyKXJldHVybiBhLiQyKHNbMF0sc1sxXSl9ZWxzZSBpZihyPT09Myl7aWYoISFhLiQzKXJldHVy
+biBhLiQzKHNbMF0sc1sxXSxzWzJdKX1lbHNlIGlmKHI9PT00KXtpZighIWEuJDQpcmV0dXJuIGEuJDQo
+c1swXSxzWzFdLHNbMl0sc1szXSl9ZWxzZSBpZihyPT09NSlpZighIWEuJDUpcmV0dXJuIGEuJDUoc1sw
+XSxzWzFdLHNbMl0sc1szXSxzWzRdKQpxPWFbIiIrIiQiK3JdCmlmKHEhPW51bGwpcmV0dXJuIHEuYXBw
+bHkoYSxzKX1yZXR1cm4gSC5FdyhhLGIsYyl9LApFdzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEs
+cCxvLG4sbSxsLGs9YiBpbnN0YW5jZW9mIEFycmF5P2I6UC5DSChiLCEwLHUueiksaj1rLmxlbmd0aCxp
+PWEuJFIKaWYoajxpKXJldHVybiBILnpvKGEsayxjKQp0PWEuJEQKcz10PT1udWxsCnI9IXM/dCgpOm51
+bGwKcT1KLmlhKGEpCnA9cS4kQwppZih0eXBlb2YgcD09InN0cmluZyIpcD1xW3BdCmlmKHMpe2lmKGMh
+PW51bGwmJmMuYSE9PTApcmV0dXJuIEguem8oYSxrLGMpCmlmKGo9PT1pKXJldHVybiBwLmFwcGx5KGEs
+aykKcmV0dXJuIEguem8oYSxrLGMpfWlmKHIgaW5zdGFuY2VvZiBBcnJheSl7aWYoYyE9bnVsbCYmYy5h
+IT09MClyZXR1cm4gSC56byhhLGssYykKaWYoaj5pK3IubGVuZ3RoKXJldHVybiBILnpvKGEsayxudWxs
+KQpDLk5tLkZWKGssci5zbGljZShqLWkpKQpyZXR1cm4gcC5hcHBseShhLGspfWVsc2V7aWYoaj5pKXJl
+dHVybiBILnpvKGEsayxjKQpvPU9iamVjdC5rZXlzKHIpCmlmKGM9PW51bGwpZm9yKHM9by5sZW5ndGgs
+bj0wO248by5sZW5ndGg7by5sZW5ndGg9PT1zfHwoMCxILmxrKShvKSwrK24pQy5ObS5pKGsscltILnko
+b1tuXSldKQplbHNle2ZvcihzPW8ubGVuZ3RoLG09MCxuPTA7bjxvLmxlbmd0aDtvLmxlbmd0aD09PXN8
+fCgwLEgubGspKG8pLCsrbil7bD1ILnkob1tuXSkKaWYoYy54NChsKSl7KyttCkMuTm0uaShrLGMucSgw
+LGwpKX1lbHNlIEMuTm0uaShrLHJbbF0pfWlmKG0hPT1jLmEpcmV0dXJuIEguem8oYSxrLGMpfXJldHVy
+biBwLmFwcGx5KGEsayl9fSwKcFk6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKEgudEwoYSkpfSwKT0g6ZnVu
+Y3Rpb24oYSxiKXtpZihhPT1udWxsKUouSG0oYSkKdGhyb3cgSC5iKEguSFkoYSxiKSl9LApIWTpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscj0iaW5kZXgiCmlmKCFILm9rKGIpKXJldHVybiBuZXcgUC51KCEwLGIs
+cixudWxsKQp0PUguU2MoSi5IbShhKSkKaWYoIShiPDApKXtpZih0eXBlb2YgdCE9PSJudW1iZXIiKXJl
+dHVybiBILnBZKHQpCnM9Yj49dH1lbHNlIHM9ITAKaWYocylyZXR1cm4gUC5DZihiLGEscixudWxsLHQp
+CnJldHVybiBQLngoYixyKX0sCmF1OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD0iSW52YWxpZCB2YWx1ZSIK
+aWYoYT5jKXJldHVybiBuZXcgUC5iSigwLGMsITAsYSwic3RhcnQiLHQpCmlmKGIhPW51bGwpe2lmKCFI
+Lm9rKGIpKXJldHVybiBuZXcgUC51KCEwLGIsImVuZCIsbnVsbCkKaWYoYjxhfHxiPmMpcmV0dXJuIG5l
+dyBQLmJKKGEsYywhMCxiLCJlbmQiLHQpfXJldHVybiBuZXcgUC51KCEwLGIsImVuZCIsbnVsbCl9LAp0
+TDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAudSghMCxhLG51bGwsbnVsbCl9LApiOmZ1bmN0aW9uKGEp
+e3ZhciB0CmlmKGE9PW51bGwpYT1uZXcgUC5uKCkKdD1uZXcgRXJyb3IoKQp0LmRhcnRFeGNlcHRpb249
+YQppZigiZGVmaW5lUHJvcGVydHkiIGluIE9iamVjdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIm1l
+c3NhZ2UiLHtnZXQ6SC5ofSkKdC5uYW1lPSIifWVsc2UgdC50b1N0cmluZz1ILmgKcmV0dXJuIHR9LApo
+OmZ1bmN0aW9uKCl7cmV0dXJuIEouaih0aGlzLmRhcnRFeGNlcHRpb24pfSwKdmg6ZnVuY3Rpb24oYSl7
+dGhyb3cgSC5iKGEpfSwKbGs6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKFAuYTQoYSkpfSwKY006ZnVuY3Rp
+b24oYSl7dmFyIHQscyxyLHEscCxvCmE9SC5lQShhLnJlcGxhY2UoU3RyaW5nKHt9KSwnJHJlY2VpdmVy
+JCcpKQp0PWEubWF0Y2goL1xcXCRbYS16QS1aXStcXFwkL2cpCmlmKHQ9PW51bGwpdD1ILlZNKFtdLHUu
+cykKcz10LmluZGV4T2YoIlxcJGFyZ3VtZW50c1xcJCIpCnI9dC5pbmRleE9mKCJcXCRhcmd1bWVudHNF
+eHByXFwkIikKcT10LmluZGV4T2YoIlxcJGV4cHJcXCQiKQpwPXQuaW5kZXhPZigiXFwkbWV0aG9kXFwk
+IikKbz10LmluZGV4T2YoIlxcJHJlY2VpdmVyXFwkIikKcmV0dXJuIG5ldyBILmY5KGEucmVwbGFjZShu
+ZXcgUmVnRXhwKCdcXFxcXFwkYXJndW1lbnRzXFxcXFxcJCcsJ2cnKSwnKCg/Onh8W154XSkqKScpLnJl
+cGxhY2UobmV3IFJlZ0V4cCgnXFxcXFxcJGFyZ3VtZW50c0V4cHJcXFxcXFwkJywnZycpLCcoKD86eHxb
+XnhdKSopJykucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcXFwkZXhwclxcXFxcXCQnLCdnJyksJygoPzp4
+fFteeF0pKiknKS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXCRtZXRob2RcXFxcXFwkJywnZycpLCco
+KD86eHxbXnhdKSopJykucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcXFwkcmVjZWl2ZXJcXFxcXFwkJywn
+ZycpLCcoKD86eHxbXnhdKSopJykscyxyLHEscCxvKX0sClM3OmZ1bmN0aW9uKGEpe3JldHVybiBmdW5j
+dGlvbigkZXhwciQpe3ZhciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1bWVudHMkJwp0cnl7JGV4cHIkLiRt
+ZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0Y2godCl7cmV0dXJuIHQubWVzc2FnZX19KGEpfSwKTWo6
+ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCRleHByJCl7dHJ5eyRleHByJC4kbWV0aG9kJH1jYXRj
+aCh0KXtyZXR1cm4gdC5tZXNzYWdlfX0oYSl9LApJajpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5X
+MChhLGI9PW51bGw/bnVsbDpiLm1ldGhvZCl9LApUMzpmdW5jdGlvbihhLGIpe3ZhciB0PWI9PW51bGws
+cz10P251bGw6Yi5tZXRob2QKcmV0dXJuIG5ldyBILmF6KGEscyx0P251bGw6Yi5yZWNlaXZlcil9LApS
+dTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGY9bnVsbCxlPW5ldyBI
+LkFtKGEpCmlmKGE9PW51bGwpcmV0dXJuIGYKaWYoYSBpbnN0YW5jZW9mIEguYnEpcmV0dXJuIGUuJDEo
+YS5hKQppZih0eXBlb2YgYSE9PSJvYmplY3QiKXJldHVybiBhCmlmKCJkYXJ0RXhjZXB0aW9uIiBpbiBh
+KXJldHVybiBlLiQxKGEuZGFydEV4Y2VwdGlvbikKZWxzZSBpZighKCJtZXNzYWdlIiBpbiBhKSlyZXR1
+cm4gYQp0PWEubWVzc2FnZQppZigibnVtYmVyIiBpbiBhJiZ0eXBlb2YgYS5udW1iZXI9PSJudW1iZXIi
+KXtzPWEubnVtYmVyCnI9cyY2NTUzNQppZigoQy5qbi53RyhzLDE2KSY4MTkxKT09PTEwKXN3aXRjaChy
+KXtjYXNlIDQzODpyZXR1cm4gZS4kMShILlQzKEguZCh0KSsiIChFcnJvciAiK3IrIikiLGYpKQpjYXNl
+IDQ0NTpjYXNlIDUwMDc6cmV0dXJuIGUuJDEoSC5JaihILmQodCkrIiAoRXJyb3IgIityKyIpIixmKSl9
+fWlmKGEgaW5zdGFuY2VvZiBUeXBlRXJyb3Ipe3E9JC5TbigpCnA9JC5scSgpCm89JC5OOSgpCm49JC5p
+SSgpCm09JC5LZigpCmw9JC5aaCgpCms9JC5yTigpCiQuYzMoKQpqPSQuSEsoKQppPSQucjEoKQpoPXEu
+cVModCkKaWYoaCE9bnVsbClyZXR1cm4gZS4kMShILlQzKEgueSh0KSxoKSkKZWxzZXtoPXAucVModCkK
+aWYoaCE9bnVsbCl7aC5tZXRob2Q9ImNhbGwiCnJldHVybiBlLiQxKEguVDMoSC55KHQpLGgpKX1lbHNl
+e2g9by5xUyh0KQppZihoPT1udWxsKXtoPW4ucVModCkKaWYoaD09bnVsbCl7aD1tLnFTKHQpCmlmKGg9
+PW51bGwpe2g9bC5xUyh0KQppZihoPT1udWxsKXtoPWsucVModCkKaWYoaD09bnVsbCl7aD1uLnFTKHQp
+CmlmKGg9PW51bGwpe2g9ai5xUyh0KQppZihoPT1udWxsKXtoPWkucVModCkKZz1oIT1udWxsfWVsc2Ug
+Zz0hMH1lbHNlIGc9ITB9ZWxzZSBnPSEwfWVsc2UgZz0hMH1lbHNlIGc9ITB9ZWxzZSBnPSEwfWVsc2Ug
+Zz0hMAppZihnKXJldHVybiBlLiQxKEguSWooSC55KHQpLGgpKX19cmV0dXJuIGUuJDEobmV3IEgudlYo
+dHlwZW9mIHQ9PSJzdHJpbmciP3Q6IiIpKX1pZihhIGluc3RhbmNlb2YgUmFuZ2VFcnJvcil7aWYodHlw
+ZW9mIHQ9PSJzdHJpbmciJiZ0LmluZGV4T2YoImNhbGwgc3RhY2siKSE9PS0xKXJldHVybiBuZXcgUC5L
+WSgpCnQ9ZnVuY3Rpb24oYil7dHJ5e3JldHVybiBTdHJpbmcoYil9Y2F0Y2goZCl7fXJldHVybiBudWxs
+fShhKQpyZXR1cm4gZS4kMShuZXcgUC51KCExLGYsZix0eXBlb2YgdD09InN0cmluZyI/dC5yZXBsYWNl
+KC9eUmFuZ2VFcnJvcjpccyovLCIiKTp0KSl9aWYodHlwZW9mIEludGVybmFsRXJyb3I9PSJmdW5jdGlv
+biImJmEgaW5zdGFuY2VvZiBJbnRlcm5hbEVycm9yKWlmKHR5cGVvZiB0PT0ic3RyaW5nIiYmdD09PSJ0
+b28gbXVjaCByZWN1cnNpb24iKXJldHVybiBuZXcgUC5LWSgpCnJldHVybiBhfSwKdHM6ZnVuY3Rpb24o
+YSl7dmFyIHQKaWYoYSBpbnN0YW5jZW9mIEguYnEpcmV0dXJuIGEuYgppZihhPT1udWxsKXJldHVybiBu
+ZXcgSC5YTyhhKQp0PWEuJGNhY2hlZFRyYWNlCmlmKHQhPW51bGwpcmV0dXJuIHQKcmV0dXJuIGEuJGNh
+Y2hlZFRyYWNlPW5ldyBILlhPKGEpfSwKQjc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscT1hLmxlbmd0
+aApmb3IodD0wO3Q8cTt0PXIpe3M9dCsxCnI9cysxCmIuWSgwLGFbdF0sYVtzXSl9cmV0dXJuIGJ9LApm
+dDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dS5aLmIoYSkKc3dpdGNoKEguU2MoYikpe2Nhc2UgMDpyZXR1
+cm4gYS4kMCgpCmNhc2UgMTpyZXR1cm4gYS4kMShjKQpjYXNlIDI6cmV0dXJuIGEuJDIoYyxkKQpjYXNl
+IDM6cmV0dXJuIGEuJDMoYyxkLGUpCmNhc2UgNDpyZXR1cm4gYS4kNChjLGQsZSxmKX10aHJvdyBILmIo
+bmV3IFAuQ0QoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHdyYXBwZWQgY2xvc3Vy
+ZSIpKX0sCnRSOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYT09bnVsbClyZXR1cm4gbnVsbAp0PWEuJGlk
+ZW50aXR5CmlmKCEhdClyZXR1cm4gdAp0PWZ1bmN0aW9uKGMsZCxlKXtyZXR1cm4gZnVuY3Rpb24oZixn
+LGgsaSl7cmV0dXJuIGUoYyxkLGYsZyxoLGkpfX0oYSxiLEguZnQpCmEuJGlkZW50aXR5PXQKcmV0dXJu
+IHR9LAppQTpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9bnVsbCxr
+PWJbMF0saj1rLiRjYWxsTmFtZSxpPWU/T2JqZWN0LmNyZWF0ZShuZXcgSC56eCgpLmNvbnN0cnVjdG9y
+LnByb3RvdHlwZSk6T2JqZWN0LmNyZWF0ZShuZXcgSC5yVChsLGwsbCxsKS5jb25zdHJ1Y3Rvci5wcm90
+b3R5cGUpCmkuJGluaXRpYWxpemU9aS5jb25zdHJ1Y3RvcgppZihlKXQ9ZnVuY3Rpb24gc3RhdGljX3Rl
+YXJfb2ZmKCl7dGhpcy4kaW5pdGlhbGl6ZSgpfQplbHNle3M9JC55agppZih0eXBlb2YgcyE9PSJudW1i
+ZXIiKXJldHVybiBzLmgoKQokLnlqPXMrMQpzPW5ldyBGdW5jdGlvbigiYSxiLGMsZCIrcywidGhpcy4k
+aW5pdGlhbGl6ZShhLGIsYyxkIitzKyIpIikKdD1zfWkuY29uc3RydWN0b3I9dAp0LnByb3RvdHlwZT1p
+CmlmKCFlKXtyPUguYngoYSxrLGYpCnIuJHJlZmxlY3Rpb25JbmZvPWR9ZWxzZXtpLiRzdGF0aWNfbmFt
+ZT1nCnI9a31xPUguaW0oZCxlLGYpCmkuJFM9cQppW2pdPXIKZm9yKHA9cixvPTE7bzxiLmxlbmd0aDsr
+K28pe249YltvXQptPW4uJGNhbGxOYW1lCmlmKG0hPW51bGwpe249ZT9uOkguYngoYSxuLGYpCmlbbV09
+bn1pZihvPT09Yyl7bi4kcmVmbGVjdGlvbkluZm89ZApwPW59fWkuJEM9cAppLiRSPWsuJFIKaS4kRD1r
+LiRECnJldHVybiB0fSwKaW06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKHR5cGVvZiBhPT0ibnVtYmVy
+IilyZXR1cm4gZnVuY3Rpb24oZCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZChlKX19KEguQnAs
+YSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXtpZihiKXRocm93IEguYigiQ2Fubm90IGNvbXB1dGUgc2ln
+bmF0dXJlIGZvciBzdGF0aWMgdGVhcm9mZi4iKQp0PWM/SC5QVzpILlRuCnJldHVybiBmdW5jdGlvbihk
+LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKHRoaXMsZCl9fShhLHQpfXRocm93IEguYigiRXJy
+b3IgaW4gZnVuY3Rpb25UeXBlIG9mIHRlYXJvZmYiKX0sCnZxOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0
+PUguRFYKc3dpdGNoKGI/LTE6YSl7Y2FzZSAwOnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5j
+dGlvbigpe3JldHVybiBmKHRoaXMpW2VdKCl9fShjLHQpCmNhc2UgMTpyZXR1cm4gZnVuY3Rpb24oZSxm
+KXtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIGYodGhpcylbZV0oZyl9fShjLHQpCmNhc2UgMjpyZXR1
+cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoKXtyZXR1cm4gZih0aGlzKVtlXShnLGgp
+fX0oYyx0KQpjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpKXty
+ZXR1cm4gZih0aGlzKVtlXShnLGgsaSl9fShjLHQpCmNhc2UgNDpyZXR1cm4gZnVuY3Rpb24oZSxmKXty
+ZXR1cm4gZnVuY3Rpb24oZyxoLGksail7cmV0dXJuIGYodGhpcylbZV0oZyxoLGksail9fShjLHQpCmNh
+c2UgNTpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGksaixrKXtyZXR1cm4g
+Zih0aGlzKVtlXShnLGgsaSxqLGspfX0oYyx0KQpkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLGYpe3Jl
+dHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KGYodGhpcyksYXJndW1lbnRzKX19KGQsdCl9fSwK
+Yng6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuCmlmKGMpcmV0dXJuIEguSGYoYSxiKQp0
+PWIuJHN0dWJOYW1lCnM9Yi5sZW5ndGgKcj1hW3RdCnE9Yj09bnVsbD9yPT1udWxsOmI9PT1yCnA9IXF8
+fHM+PTI3CmlmKHApcmV0dXJuIEgudnEocywhcSx0LGIpCmlmKHM9PT0wKXtxPSQueWoKaWYodHlwZW9m
+IHEhPT0ibnVtYmVyIilyZXR1cm4gcS5oKCkKJC55aj1xKzEKbz0ic2VsZiIrcQpxPSJyZXR1cm4gZnVu
+Y3Rpb24oKXt2YXIgIitvKyIgPSB0aGlzLiIKcD0kLm1KCnJldHVybiBuZXcgRnVuY3Rpb24ocStILmQo
+cD09bnVsbD8kLm1KPUguRTIoInNlbGYiKTpwKSsiO3JldHVybiAiK28rIi4iK0guZCh0KSsiKCk7fSIp
+KCl9bj0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zcGxpY2UoMCxzKS5qb2lu
+KCIsIikKcT0kLnlqCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJuIHEuaCgpCiQueWo9cSsxCm4r
+PXEKcT0icmV0dXJuIGZ1bmN0aW9uKCIrbisiKXtyZXR1cm4gdGhpcy4iCnA9JC5tSgpyZXR1cm4gbmV3
+IEZ1bmN0aW9uKHErSC5kKHA9PW51bGw/JC5tSj1ILkUyKCJzZWxmIik6cCkrIi4iK0guZCh0KSsiKCIr
+bisiKTt9IikoKX0sClo0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0PUguRFYscz1ILnlTCnN3aXRjaChi
+Py0xOmEpe2Nhc2UgMDp0aHJvdyBILmIoSC5FZigiSW50ZXJjZXB0ZWQgZnVuY3Rpb24gd2l0aCBubyBh
+cmd1bWVudHMuIikpCmNhc2UgMTpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbigp
+e3JldHVybiBmKHRoaXMpW2VdKGcodGhpcykpfX0oYyx0LHMpCmNhc2UgMjpyZXR1cm4gZnVuY3Rpb24o
+ZSxmLGcpe3JldHVybiBmdW5jdGlvbihoKXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpLGgpfX0oYyx0
+LHMpCmNhc2UgMzpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihoLGkpe3JldHVy
+biBmKHRoaXMpW2VdKGcodGhpcyksaCxpKX19KGMsdCxzKQpjYXNlIDQ6cmV0dXJuIGZ1bmN0aW9uKGUs
+ZixnKXtyZXR1cm4gZnVuY3Rpb24oaCxpLGope3JldHVybiBmKHRoaXMpW2VdKGcodGhpcyksaCxpLGop
+fX0oYyx0LHMpCmNhc2UgNTpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihoLGks
+aixrKXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpLGgsaSxqLGspfX0oYyx0LHMpCmNhc2UgNjpyZXR1
+cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihoLGksaixrLGwpe3JldHVybiBmKHRoaXMp
+W2VdKGcodGhpcyksaCxpLGosayxsKX19KGMsdCxzKQpkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLGYs
+ZyxoKXtyZXR1cm4gZnVuY3Rpb24oKXtoPVtnKHRoaXMpXQpBcnJheS5wcm90b3R5cGUucHVzaC5hcHBs
+eShoLGFyZ3VtZW50cykKcmV0dXJuIGUuYXBwbHkoZih0aGlzKSxoKX19KGQsdCxzKX19LApIZjpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG09JC5tSgppZihtPT1udWxsKW09JC5tSj1ILkUyKCJz
+ZWxmIikKdD0kLlA0CmlmKHQ9PW51bGwpdD0kLlA0PUguRTIoInJlY2VpdmVyIikKcz1iLiRzdHViTmFt
+ZQpyPWIubGVuZ3RoCnE9YVtzXQpwPWI9PW51bGw/cT09bnVsbDpiPT09cQpvPSFwfHxyPj0yOAppZihv
+KXJldHVybiBILlo0KHIsIXAscyxiKQppZihyPT09MSl7bT0icmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJu
+IHRoaXMuIitILmQobSkrIi4iK0guZChzKSsiKHRoaXMuIitILmQodCkrIik7Igp0PSQueWoKaWYodHlw
+ZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5oKCkKJC55aj10KzEKcmV0dXJuIG5ldyBGdW5jdGlvbiht
+K3QrIn0iKSgpfW49ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zcGxpdCgiIikuc3BsaWNlKDAs
+ci0xKS5qb2luKCIsIikKbT0icmV0dXJuIGZ1bmN0aW9uKCIrbisiKXtyZXR1cm4gdGhpcy4iK0guZCht
+KSsiLiIrSC5kKHMpKyIodGhpcy4iK0guZCh0KSsiLCAiK24rIik7Igp0PSQueWoKaWYodHlwZW9mIHQh
+PT0ibnVtYmVyIilyZXR1cm4gdC5oKCkKJC55aj10KzEKcmV0dXJuIG5ldyBGdW5jdGlvbihtK3QrIn0i
+KSgpfSwKS3E6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7cmV0dXJuIEguaUEoYSxiLGMsZCwhIWUsISFm
+LGcpfSwKVG46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSxILnpLKGEuYSks
+Yil9LApQVzpmdW5jdGlvbihhLGIpe3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLEgueksoYS5jKSxi
+KX0sCkRWOmZ1bmN0aW9uKGEpe3JldHVybiBhLmF9LAp5UzpmdW5jdGlvbihhKXtyZXR1cm4gYS5jfSwK
+RTI6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9bmV3IEguclQoInNlbGYiLCJ0YXJnZXQiLCJyZWNlaXZl
+ciIsIm5hbWUiKSxwPUouRXAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocSkpCmZvcih0PXAubGVu
+Z3RoLHM9MDtzPHQ7KytzKXtyPXBbc10KaWYocVtyXT09PWEpcmV0dXJuIHJ9fSwKb1Q6ZnVuY3Rpb24o
+YSl7aWYoYT09bnVsbClILmZPKCJib29sZWFuIGV4cHJlc3Npb24gbXVzdCBub3QgYmUgbnVsbCIpCnJl
+dHVybiBhfSwKZk86ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKG5ldyBILmtZKGEpKX0sCmFnOmZ1bmN0aW9u
+KGEpe3Rocm93IEguYihuZXcgUC5jKGEpKX0sCkVmOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5FcShh
+KX0sCllnOmZ1bmN0aW9uKGEpe3JldHVybiB2LmdldElzb2xhdGVUYWcoYSl9LApWTTpmdW5jdGlvbihh
+LGIpe2EuJHRpPWIKcmV0dXJuIGF9LApvWDpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBudWxs
+CnJldHVybiBhLiR0aX0sCklNOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSC5ZOShhWyIkYSIrSC5kKGMp
+XSxILm9YKGIpKX0sClk5OmZ1bmN0aW9uKGEsYil7aWYoYT09bnVsbClyZXR1cm4gYgphPWEuYXBwbHko
+bnVsbCxiKQppZihhPT1udWxsKXJldHVybiBudWxsCmlmKEFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIGEK
+aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIGEuYXBwbHkobnVsbCxiKQpyZXR1cm4gYn0sCklH
+OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5hcHBseShiLEguWTkoSi5pYShiKVsiJGEiK0guZChjKV0s
+SC5vWChiKSkpfSwKaXc6ZnVuY3Rpb24oYSxiLGMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3Zh
+bHVlOmMsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSl9LAp3
+MzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwPUgueSgkLk5GLiQxKGEpKSxvPSQubndbcF0KaWYobyE9
+bnVsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6
+byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4g
+by5pfXQ9JC52dltwXQppZih0IT1udWxsKXJldHVybiB0CnM9di5pbnRlcmNlcHRvcnNCeVRhZ1twXQpp
+ZihzPT1udWxsKXtwPUgueSgkLlRYLiQyKGEscCkpCmlmKHAhPW51bGwpe289JC5ud1twXQppZihvIT1u
+dWxsKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpv
+LGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBv
+Lml9dD0kLnZ2W3BdCmlmKHQhPW51bGwpcmV0dXJuIHQKcz12LmludGVyY2VwdG9yc0J5VGFnW3BdfX1p
+ZihzPT1udWxsKXJldHVybiBudWxsCnQ9cy5wcm90b3R5cGUKcj1wWzBdCmlmKHI9PT0iISIpe289SC5W
+YSh0KQokLm53W3BdPW8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdi5kaXNwYXRjaFByb3BlcnR5TmFt
+ZSx7dmFsdWU6byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9
+KQpyZXR1cm4gby5pfWlmKHI9PT0ifiIpeyQudnZbcF09dApyZXR1cm4gdH1pZihyPT09Ii0iKXtxPUgu
+VmEodCkKT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSx2LmRpc3Bh
+dGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpxLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25m
+aWd1cmFibGU6dHJ1ZX0pCnJldHVybiBxLml9aWYocj09PSIrIilyZXR1cm4gSC5MYyhhLHQpCmlmKHI9
+PT0iKiIpdGhyb3cgSC5iKFAuU1kocCkpCmlmKHYubGVhZlRhZ3NbcF09PT10cnVlKXtxPUguVmEodCkK
+T2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSx2LmRpc3BhdGNoUHJv
+cGVydHlOYW1lLHt2YWx1ZTpxLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFi
+bGU6dHJ1ZX0pCnJldHVybiBxLml9ZWxzZSByZXR1cm4gSC5MYyhhLHQpfSwKTGM6ZnVuY3Rpb24oYSxi
+KXt2YXIgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkKT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsdi5k
+aXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6Si5RdShiLHQsbnVsbCxudWxsKSxlbnVtZXJhYmxlOmZh
+bHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gYn0sClZhOmZ1bmN0aW9u
+KGEpe3JldHVybiBKLlF1KGEsITEsbnVsbCwhIWEuJGlYail9LApWRjpmdW5jdGlvbihhLGIsYyl7dmFy
+IHQ9Yi5wcm90b3R5cGUKaWYodi5sZWFmVGFnc1thXT09PXRydWUpcmV0dXJuIEguVmEodCkKZWxzZSBy
+ZXR1cm4gSi5RdSh0LGMsbnVsbCxudWxsKX0sClhEOmZ1bmN0aW9uKCl7aWYoITA9PT0kLkJ2KXJldHVy
+bgokLkJ2PSEwCkguWjEoKX0sCloxOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscCxvLG4sbQokLm53PU9i
+amVjdC5jcmVhdGUobnVsbCkKJC52dj1PYmplY3QuY3JlYXRlKG51bGwpCkgua08oKQp0PXYuaW50ZXJj
+ZXB0b3JzQnlUYWcKcz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KQppZih0eXBlb2Ygd2luZG93
+IT0idW5kZWZpbmVkIil7d2luZG93CnI9ZnVuY3Rpb24oKXt9CmZvcihxPTA7cTxzLmxlbmd0aDsrK3Ep
+e3A9c1txXQpvPSQueDcuJDEocCkKaWYobyE9bnVsbCl7bj1ILlZGKHAsdFtwXSxvKQppZihuIT1udWxs
+KXtPYmplY3QuZGVmaW5lUHJvcGVydHkobyx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpuLGVu
+dW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnIucHJvdG90eXBl
+PW99fX19Zm9yKHE9MDtxPHMubGVuZ3RoOysrcSl7cD1zW3FdCmlmKC9eW0EtWmEtel9dLy50ZXN0KHAp
+KXttPXRbcF0KdFsiISIrcF09bQp0WyJ+IitwXT1tCnRbIi0iK3BdPW0KdFsiKyIrcF09bQp0WyIqIitw
+XT1tfX19LAprTzpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbyxuPUMuWXEoKQpuPUgudWQoQy5LVSxI
+LnVkKEMuZlEsSC51ZChDLmk3LEgudWQoQy5pNyxILnVkKEMueGksSC51ZChDLmRrLEgudWQoQy53YihD
+Lk80KSxuKSkpKSkpKQppZih0eXBlb2YgZGFydE5hdGl2ZURpc3BhdGNoSG9va3NUcmFuc2Zvcm1lciE9
+InVuZGVmaW5lZCIpe3Q9ZGFydE5hdGl2ZURpc3BhdGNoSG9va3NUcmFuc2Zvcm1lcgppZih0eXBlb2Yg
+dD09ImZ1bmN0aW9uIil0PVt0XQppZih0LmNvbnN0cnVjdG9yPT1BcnJheSlmb3Iocz0wO3M8dC5sZW5n
+dGg7KytzKXtyPXRbc10KaWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpbj1yKG4pfHxufX1xPW4uZ2V0VGFn
+CnA9bi5nZXRVbmtub3duVGFnCm89bi5wcm90b3R5cGVGb3JUYWcKJC5ORj1uZXcgSC5kQyhxKQokLlRY
+PW5ldyBILndOKHApCiQueDc9bmV3IEguVlgobyl9LAp1ZDpmdW5jdGlvbihhLGIpe3JldHVybiBhKGIp
+fHxifSwKdjQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciB0PWI/Im0iOiIiLHM9Yz8iIjoiaSIscj1k
+PyJ1IjoiIixxPWU/InMiOiIiLHA9Zj8iZyI6IiIsbz1mdW5jdGlvbihnLGgpe3RyeXtyZXR1cm4gbmV3
+IFJlZ0V4cChnLGgpfWNhdGNoKG4pe3JldHVybiBufX0oYSx0K3MrcitxK3ApCmlmKG8gaW5zdGFuY2Vv
+ZiBSZWdFeHApcmV0dXJuIG8KdGhyb3cgSC5iKFAucnIoIklsbGVnYWwgUmVnRXhwIHBhdHRlcm4gKCIr
+U3RyaW5nKG8pKyIpIixhLG51bGwpKX0sCm0yOmZ1bmN0aW9uKGEsYixjKXt2YXIgdAppZih0eXBlb2Yg
+Yj09InN0cmluZyIpcmV0dXJuIGEuaW5kZXhPZihiLGMpPj0wCmVsc2UgaWYoYiBpbnN0YW5jZW9mIEgu
+VlIpe3Q9Qy54Qi5HKGEsYykKcmV0dXJuIGIuYi50ZXN0KHQpfWVsc2V7dD1KLkZMKGIsQy54Qi5HKGEs
+YykpCnJldHVybiF0LmdsMCh0KX19LApBNDpmdW5jdGlvbihhKXtpZihhLmluZGV4T2YoIiQiLDApPj0w
+KXJldHVybiBhLnJlcGxhY2UoL1wkL2csIiQkJCQiKQpyZXR1cm4gYX0sCmVBOmZ1bmN0aW9uKGEpe2lm
+KC9bW1xde30oKSorPy5cXF4kfF0vLnRlc3QoYSkpcmV0dXJuIGEucmVwbGFjZSgvW1tcXXt9KCkqKz8u
+XFxeJHxdL2csIlxcJCYiKQpyZXR1cm4gYX0sCnlzOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILm5NKGEs
+YixjKQpyZXR1cm4gdH0sCm5NOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQppZihiPT09IiIpe2lm
+KGE9PT0iIilyZXR1cm4gYwp0PWEubGVuZ3RoCmZvcihzPWMscj0wO3I8dDsrK3Ipcz1zK2Fbcl0rYwpy
+ZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c31xPWEuaW5kZXhPZihiLDApCmlmKHE8MClyZXR1cm4g
+YQppZihhLmxlbmd0aDw1MDB8fGMuaW5kZXhPZigiJCIsMCk+PTApcmV0dXJuIGEuc3BsaXQoYikuam9p
+bihjKQpyZXR1cm4gYS5yZXBsYWNlKG5ldyBSZWdFeHAoSC5lQShiKSwnZycpLEguQTQoYykpfSwKUEQ6
+ZnVuY3Rpb24gUEQoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKV1U6ZnVuY3Rpb24gV1UoKXt9LApM
+UDpmdW5jdGlvbiBMUChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9
+LApMSTpmdW5jdGlvbiBMSShhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5hPWEKXy5jPWIKXy5kPWMKXy5l
+PWQKXy5mPWV9LApDajpmdW5jdGlvbiBDaihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9
+LApmOTpmdW5jdGlvbiBmOShhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
+LmQ9ZApfLmU9ZQpfLmY9Zn0sClcwOmZ1bmN0aW9uIFcwKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAph
+ejpmdW5jdGlvbiBheihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAp2VjpmdW5jdGlv
+biB2VihhKXt0aGlzLmE9YX0sCmJxOmZ1bmN0aW9uIGJxKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApB
+bTpmdW5jdGlvbiBBbShhKXt0aGlzLmE9YX0sClhPOmZ1bmN0aW9uIFhPKGEpe3RoaXMuYT1hCnRoaXMu
+Yj1udWxsfSwKVHA6ZnVuY3Rpb24gVHAoKXt9LApsYzpmdW5jdGlvbiBsYygpe30sCnp4OmZ1bmN0aW9u
+IHp4KCl7fSwKclQ6ZnVuY3Rpb24gclQoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9
+YwpfLmQ9ZH0sCkVxOmZ1bmN0aW9uIEVxKGEpe3RoaXMuYT1hfSwKa1k6ZnVuY3Rpb24ga1koYSl7dGhp
+cy5hPWF9LApONTpmdW5jdGlvbiBONShhKXt2YXIgXz10aGlzCl8uYT0wCl8uZj1fLmU9Xy5kPV8uYz1f
+LmI9bnVsbApfLnI9MApfLiR0aT1hfSwKZGI6ZnVuY3Rpb24gZGIoYSxiKXt2YXIgXz10aGlzCl8uYT1h
+Cl8uYj1iCl8uZD1fLmM9bnVsbH0sCmk1OmZ1bmN0aW9uIGk1KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9
+Yn0sCk42OmZ1bmN0aW9uIE42KGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVs
+bApfLiR0aT1jfSwKZEM6ZnVuY3Rpb24gZEMoYSl7dGhpcy5hPWF9LAp3TjpmdW5jdGlvbiB3TihhKXt0
+aGlzLmE9YX0sClZYOmZ1bmN0aW9uIFZYKGEpe3RoaXMuYT1hfSwKVlI6ZnVuY3Rpb24gVlIoYSxiKXt2
+YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbH0sCkVLOmZ1bmN0aW9uIEVLKGEpe3RoaXMu
+Yj1hfSwKS1c6ZnVuY3Rpb24gS1coYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKUGI6
+ZnVuY3Rpb24gUGIoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPW51bGx9LAp0
+UTpmdW5jdGlvbiB0UShhLGIpe3RoaXMuYT1hCnRoaXMuYz1ifSwKdW46ZnVuY3Rpb24gdW4oYSxiLGMp
+e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKU2Q6ZnVuY3Rpb24gU2QoYSxiLGMpe3ZhciBfPXRo
+aXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPW51bGx9LApYRjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sCkRR
+OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSW50OEFycmF5KGEpfSwKb2Q6ZnVuY3Rpb24oYSxiLGMpe2lm
+KGE+Pj4wIT09YXx8YT49Yyl0aHJvdyBILmIoSC5IWShiLGEpKX0sCnJNOmZ1bmN0aW9uKGEsYixjKXt2
+YXIgdAppZighKGE+Pj4wIT09YSkpdD1iPj4+MCE9PWJ8fGE+Ynx8Yj5jCmVsc2UgdD0hMAppZih0KXRo
+cm93IEguYihILmF1KGEsYixjKSkKcmV0dXJuIGJ9LApFVDpmdW5jdGlvbiBFVCgpe30sCmIwOmZ1bmN0
+aW9uIGIwKCl7fSwKRGc6ZnVuY3Rpb24gRGcoKXt9LApQZzpmdW5jdGlvbiBQZygpe30sCnhqOmZ1bmN0
+aW9uIHhqKCl7fSwKZEU6ZnVuY3Rpb24gZEUoKXt9LApaQTpmdW5jdGlvbiBaQSgpe30sCndmOmZ1bmN0
+aW9uIHdmKCl7fSwKUHE6ZnVuY3Rpb24gUHEoKXt9LAplRTpmdW5jdGlvbiBlRSgpe30sClY2OmZ1bmN0
+aW9uIFY2KCl7fSwKUkc6ZnVuY3Rpb24gUkcoKXt9LApWUDpmdW5jdGlvbiBWUCgpe30sCldCOmZ1bmN0
+aW9uIFdCKCl7fSwKWkc6ZnVuY3Rpb24gWkcoKXt9LAp4WjpmdW5jdGlvbihhLGIpe3ZhciB0PWIuZApy
+ZXR1cm4gdD09bnVsbD9iLmQ9SC5KKGEsImI4IixbYi5RXSk6dH0sClExOmZ1bmN0aW9uKGEpe3ZhciB0
+PWEuegppZih0PT09Nnx8dD09PTd8fHQ9PT04KXJldHVybiBILlExKGEuUSkKcmV0dXJuIHQ9PT0xMXx8
+dD09PTEyfSwKbUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGJ9LApOMDpmdW5jdGlvbihhKXtyZXR1cm4g
+SC5FKHYudHlwZVVuaXZlcnNlLGEpfSwKSlM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS4kUwppZih0IT1udWxs
+KXtpZih0eXBlb2YgdD09Im51bWJlciIpcmV0dXJuIEguQnAodCkKcmV0dXJuIGEuJFMoKX1yZXR1cm4g
+bnVsbH0sClVlOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoSC5RMShiKSlpZihhIGluc3RhbmNlb2YgSC5U
+cCl7dD1ILkpTKGEpCmlmKHQhPW51bGwpcmV0dXJuIHR9cmV0dXJuIEgueksoYSl9LAp6SzpmdW5jdGlv
+bihhKXt2YXIgdAppZihhIGluc3RhbmNlb2YgUC5rKXt0PWEuJHRpCnJldHVybiB0IT1udWxsP3Q6SC5W
+VShhKX1pZihBcnJheS5pc0FycmF5KGEpKXJldHVybiBILnQ2KGEpCnJldHVybiBILlZVKEouaWEoYSkp
+fSwKdDY6ZnVuY3Rpb24oYSl7dmFyIHQ9YS4kdGkscz11Lm0KaWYodD09bnVsbClyZXR1cm4gcwppZih0
+LmNvbnN0cnVjdG9yIT09cy5jb25zdHJ1Y3RvcilyZXR1cm4gcwpyZXR1cm4gdH0sCkxoOmZ1bmN0aW9u
+KGEpe3ZhciB0PWEuJHRpCnJldHVybiB0IT1udWxsP3Q6SC5WVShhKX0sClZVOmZ1bmN0aW9uKGEpe3Zh
+ciB0PWEuY29uc3RydWN0b3Iscz10LiRjY2FjaGUKaWYocyE9bnVsbClyZXR1cm4gcwpyZXR1cm4gSC5y
+OShhLHQpfSwKcjk6ZnVuY3Rpb24oYSxiKXt2YXIgdD1hIGluc3RhbmNlb2YgSC5UcD9hLl9fcHJvdG9f
+Xy5fX3Byb3RvX18uY29uc3RydWN0b3I6YixzPUguYWkodi50eXBlVW5pdmVyc2UsdC5uYW1lKQpiLiRj
+Y2FjaGU9cwpyZXR1cm4gc30sCkJwOmZ1bmN0aW9uKGEpe3ZhciB0LHM9YSxyPXYudHlwZXMscT1yW3Nd
+CmlmKHR5cGVvZiBxPT0ic3RyaW5nIil7dD1ILkUodi50eXBlVW5pdmVyc2UscSkKcltzXT10CnJldHVy
+biB0fXJldHVybiBxfSwKSko6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLHI9cy56LHE9SC5ZTwppZihI
+LmNjKHMpKXtxPUguSXcKcy5iPXMuYT1ILmhufWVsc2UgaWYocj09PTkpe3Q9cy5kYgppZigiS04iPT09
+dClxPUgub2sKZWxzZSBpZigiQ1AiPT09dClxPUguS0gKZWxzZSBpZigiRksiPT09dClxPUguS0gKZWxz
+ZSBpZigicVUiPT09dClxPUguTU0KZWxzZSBpZigiYTIiPT09dClxPUgubAplbHNle3I9cy5RCmlmKHMu
+Y2guZXZlcnkoSC5jYykpe3MueD0iJGkiK3IKcT1ILnQ0fX19cy5jPXEKcmV0dXJuIHMuYyhhKX0sCllP
+OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMKcmV0dXJuIEguV2Uodi50eXBlVW5pdmVyc2UsSC5VZShhLHQp
+LG51bGwsdCxudWxsKX0sCnQ0OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMueAppZihhIGluc3RhbmNlb2Yg
+UC5rKXJldHVybiEhYVt0XQpyZXR1cm4hIUouaWEoYSlbdF19LApPejpmdW5jdGlvbihhKXt2YXIgdApp
+ZihhPT1udWxsKXJldHVybiBhCnQ9dGhpcwppZih0LmMoYSkpcmV0dXJuIGEKdGhyb3cgSC5iKEguUTUo
+SC5XSyhhLEguVWUoYSx0KSxILmRtKHQsbnVsbCkpKSl9LApBdjpmdW5jdGlvbihhKXt2YXIgdAppZihh
+PT1udWxsKXJldHVybiBhCnQ9dGhpcwppZih0LmMoYSkpcmV0dXJuIGEKdGhyb3cgSC5iKEguWmMoSC5X
+SyhhLEguVWUoYSx0KSxILmRtKHQsbnVsbCkpKSl9LApEaDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdD1u
+dWxsCmlmKEguV2Uodi50eXBlVW5pdmVyc2UsYSx0LGIsdCkpcmV0dXJuIGEKdGhyb3cgSC5iKEguWmMo
+IlRoZSB0eXBlIGFyZ3VtZW50ICciK0guZChILmRtKGEsdCkpKyInIGlzIG5vdCBhIHN1YnR5cGUgb2Yg
+dGhlIHR5cGUgdmFyaWFibGUgYm91bmQgJyIrSC5kKEguZG0oYix0KSkrIicgb2YgdHlwZSB2YXJpYWJs
+ZSAnIitjKyInIGluICciK0guZChkKSsiJy4iKSl9LApXSzpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9UC5w
+KGEpLHM9SC5kbShiPT1udWxsP0gueksoYSk6YixudWxsKQpyZXR1cm4gdCsiOiB0eXBlICciK0guZChz
+KSsiJyBpcyBub3QgYSBzdWJ0eXBlIG9mIHR5cGUgJyIrSC5kKGMpKyInIn0sClE1OmZ1bmN0aW9uKGEp
+e3JldHVybiBuZXcgSC5oeigiQ2FzdEVycm9yOiAiK2EpfSwKUHY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+bmV3IEguaHooIkNhc3RFcnJvcjogIitILldLKGEsbnVsbCxiKSl9LApaYzpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IEguaU0oIlR5cGVFcnJvcjogIithKX0sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgu
+aU0oIlR5cGVFcnJvcjogIitILldLKGEsbnVsbCxiKSl9LApJdzpmdW5jdGlvbihhKXtyZXR1cm4hMH0s
+CmhuOmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKbDpmdW5jdGlvbihhKXtyZXR1cm4hMD09PWF8fCExPT09
+YX0sCkU5OmZ1bmN0aW9uKGEpe2lmKCEwPT09YXx8ITE9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0
+dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiYm9vbCIpKX0sCnhkOmZ1bmN0aW9uKGEpe2lmKCEwPT09YXx8
+ITE9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJib29sIikp
+fSwKZGo6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9PW51bGwp
+cmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiZG91YmxlIikpfSwKSWc6ZnVuY3Rpb24oYSl7aWYodHlw
+ZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShh
+LCJkb3VibGUiKSl9LApvazpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJudW1iZXIiJiZNYXRo
+LmZsb29yKGEpPT09YX0sClNIOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIiYmTWF0aC5m
+bG9vcihhKT09PWEpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5QdihhLCJp
+bnQiKSl9LApTYzpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciImJk1hdGguZmxvb3IoYSk9
+PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJpbnQiKSl9LApL
+SDpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJudW1iZXIifSwKdVU6ZnVuY3Rpb24oYSl7aWYo
dHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgu
-cShhLCJudW0iKSl9LApNTTpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJzdHJpbmcifSwKYzA6
-ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJu
-IGEKdGhyb3cgSC5iKEguUHYoYSwiU3RyaW5nIikpfSwKeTpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09
-InN0cmluZyIpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIlN0cmlu
-ZyIpKX0sCmlvOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCmZvcih0PSIiLHM9IiIscj0wO3I8YS5sZW5n
-dGg7KytyLHM9IiwgIil0Kz1DLnhCLmgocyxILmRtKGFbcl0sYikpCnJldHVybiB0fSwKYkk6ZnVuY3Rp
-b24oYTAsYTEsYTIpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGE9Iiwg
-IgppZihhMiE9bnVsbCl7dD1hMi5sZW5ndGgKaWYoYTE9PW51bGwpe2ExPUguVk0oW10sdS5zKQpzPW51
-bGx9ZWxzZSBzPWExLmxlbmd0aApyPWExLmxlbmd0aApmb3IocT10O3E+MDstLXEpQy5ObS5pKGExLCJU
-IisocitxKSkKZm9yKHA9IjwiLG89IiIscT0wO3E8dDsrK3Esbz1hKXtwKz1vCm49YTEubGVuZ3RoCm09
-bi0xLXEKaWYobTwwKXJldHVybiBILk9IKGExLG0pCnA9Qy54Qi5oKHAsYTFbbV0pCmw9YTJbcV0KaWYo
-IUguY2MobCwhMCkpcCs9Qy54Qi5oKCIgZXh0ZW5kcyAiLEguZG0obCxhMSkpfXArPSI+In1lbHNle3A9
-IiIKcz1udWxsfW49YTAuUQprPWEwLmNoCmo9ay5hCmk9ai5sZW5ndGgKaD1rLmIKZz1oLmxlbmd0aApm
-PWsuYwplPWYubGVuZ3RoCmQ9SC5kbShuLGExKQpmb3IoYz0iIixiPSIiLHE9MDtxPGk7KytxLGI9YSlj
-Kz1DLnhCLmgoYixILmRtKGpbcV0sYTEpKQppZihnPjApe2MrPWIrIlsiCmZvcihiPSIiLHE9MDtxPGc7
-KytxLGI9YSljKz1DLnhCLmgoYixILmRtKGhbcV0sYTEpKQpjKz0iXSJ9aWYoZT4wKXtjKz1iKyJ7Igpm
-b3IoYj0iIixxPTA7cTxlO3ErPTIsYj1hKWMrPUMueEIuaChiLEguZG0oZltxKzFdLGExKSkrIiAiK2Zb
-cV0KYys9In0ifWlmKHMhPW51bGwpYTEubGVuZ3RoPXMKcmV0dXJuIHArIigiK2MrIikgPT4gIitILmQo
-ZCl9LApkbTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9YS56CmlmKHA9PT01KXJldHVybiJlcmFz
-ZWQiCmlmKHA9PT0yKXJldHVybiJkeW5hbWljIgppZihwPT09MylyZXR1cm4idm9pZCIKaWYocD09PTEp
-cmV0dXJuIk5ldmVyIgppZihwPT09NClyZXR1cm4iYW55IgppZihwPT09NilyZXR1cm4gSC5kKEguZG0o
-YS5RLGIpKSsiKiIKaWYocD09PTcpcmV0dXJuIEguZChILmRtKGEuUSxiKSkrIj8iCmlmKHA9PT04KXJl
-dHVybiJGdXR1cmVPcjwiK0guZChILmRtKGEuUSxiKSkrIj4iCmlmKHA9PT05KXt0PUgubzMoYS5RKQpz
-PWEuY2gKcmV0dXJuIHMubGVuZ3RoIT09MD90KygiPCIrSC5pbyhzLGIpKyI+Iik6dH1pZihwPT09MTEp
-cmV0dXJuIEguYkkoYSxiLG51bGwpCmlmKHA9PT0xMilyZXR1cm4gSC5iSShhLlEsYixhLmNoKQppZihw
-PT09MTMpe3I9YS5RCnE9Yi5sZW5ndGgKcj1xLTEtcgppZihyPDB8fHI+PXEpcmV0dXJuIEguT0goYixy
-KQpyZXR1cm4gYltyXX1yZXR1cm4iPyJ9LApvMzpmdW5jdGlvbihhKXt2YXIgdCxzPUguSmcoYSkKaWYo
-cyE9bnVsbClyZXR1cm4gcwp0PSJtaW5pZmllZDoiK2EKcmV0dXJuIHR9LApRbzpmdW5jdGlvbihhLGIp
-e3ZhciB0PWEudFJbYl0KZm9yKDt0eXBlb2YgdD09InN0cmluZyI7KXQ9YS50Ult0XQpyZXR1cm4gdH0s
-CmFpOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPWEuZVQsbj1vW2JdCmlmKG49PW51bGwpcmV0
-dXJuIEguRShhLGIpCmVsc2UgaWYodHlwZW9mIG49PSJudW1iZXIiKXt0PW4Kcz1ILm0oYSw1LCIjIikK
-cj1bXQpmb3IocT0wO3E8dDsrK3Epci5wdXNoKHMpCnA9SC5KKGEsYixyKQpvW2JdPXAKcmV0dXJuIHB9
-ZWxzZSByZXR1cm4gbn0sCnhiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguSXgoYS50UixiKX0sCkZGOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIEguSXgoYS5lVCxiKX0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPWEu
-ZUMscj1zLmdldChiKQppZihyIT1udWxsKXJldHVybiByCnQ9SC56KGEsbnVsbCxiKQpzLnNldChiLHQp
-CnJldHVybiB0fSwKY0U6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj1iLmN4CmlmKHI9PW51bGwpcj1i
-LmN4PW5ldyBNYXAoKQp0PXIuZ2V0KGMpCmlmKHQhPW51bGwpcmV0dXJuIHQKcz1ILnooYSxiLGMpCnIu
-c2V0KGMscykKcmV0dXJuIHN9LAp2NTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9Yi5jeQppZihx
-PT1udWxsKXE9Yi5jeT1uZXcgTWFwKCkKdD1jLmRiCnM9cS5nZXQodCkKaWYocyE9bnVsbClyZXR1cm4g
-cwpyPUguYShhLGIsYy56PT09MTA/Yy5jaDpbY10pCnEuc2V0KHQscikKcmV0dXJuIHJ9LAp6OmZ1bmN0
-aW9uKGEsYixjKXt2YXIgdD1ILmkoSC5vKGEsYixjKSkKcmV0dXJuIHR9LApXRzpmdW5jdGlvbihhLGIp
-e3ZhciB0PWIuZGIKYS5lQy5zZXQodCxiKQpiLmE9SC5PegpiLmI9SC5BdgpiLmM9SC5KSgpyZXR1cm4g
-Yn0sCm06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHM9YS5lQy5nZXQoYykKaWYocyE9bnVsbClyZXR1cm4g
-cwp0PW5ldyBILkpjKG51bGwsbnVsbCxudWxsKQp0Lno9Ygp0LmRiPWMKcmV0dXJuIEguV0coYSx0KX0s
-CnY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscz1hLmVDLmdldChkKQppZihzIT1udWxsKXJldHVybiBz
-CnQ9bmV3IEguSmMobnVsbCxudWxsLG51bGwpCnQuej1iCnQuUT1jCnQuZGI9ZApyZXR1cm4gSC5XRyhh
-LHQpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9IiIrYisiXiIscj1hLmVDLmdldChzKQppZihyIT1u
-dWxsKXJldHVybiByCnQ9bmV3IEguSmMobnVsbCxudWxsLG51bGwpCnQuej0xMwp0LlE9Ygp0LmRiPXMK
-cmV0dXJuIEguV0coYSx0KX0sClV4OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPWEubGVuZ3RoCmZvcih0
-PSIiLHM9IiIscj0wO3I8cTsrK3Iscz0iLCIpdCs9cythW3JdLmRiCnJldHVybiB0fSwKUzQ6ZnVuY3Rp
-b24oYSl7dmFyIHQscyxyLHEscCxvPWEubGVuZ3RoCmZvcih0PSIiLHM9IiIscj0wO3I8bztyKz0yLHM9
-IiwiKXtxPWFbcl0KcD1hW3IrMV0uZGIKdCs9cytxKyI6IitwfXJldHVybiB0fSwKSjpmdW5jdGlvbihh
-LGIsYyl7dmFyIHQscyxyPWIKaWYoYy5sZW5ndGghPT0wKXIrPSI8IitILlV4KGMpKyI+Igp0PWEuZUMu
-Z2V0KHIpCmlmKHQhPW51bGwpcmV0dXJuIHQKcz1uZXcgSC5KYyhudWxsLG51bGwsbnVsbCkKcy56PTkK
-cy5RPWIKcy5jaD1jCmlmKGMubGVuZ3RoPjApcy5kPWNbMF0Kcy5kYj1yCnJldHVybiBILldHKGEscyl9
-LAphOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwCmlmKGIuej09PTEwKXt0PWIuUQpzPWIuY2gu
-Y29uY2F0KGMpfWVsc2V7cz1jCnQ9Yn1yPXQuZGIrIjsiKygiPCIrSC5VeChzKSsiPiIpCnE9YS5lQy5n
-ZXQocikKaWYocSE9bnVsbClyZXR1cm4gcQpwPW5ldyBILkpjKG51bGwsbnVsbCxudWxsKQpwLno9MTAK
-cC5RPXQKcC5jaD1zCnAuZGI9cgpyZXR1cm4gSC5XRyhhLHApfSwKQzpmdW5jdGlvbihhLGIsYyl7dmFy
-IHQscyxyLHE9Yi5kYixwPWMuYSxvPXAubGVuZ3RoLG49Yy5iLG09bi5sZW5ndGgsbD1jLmMsaz1sLmxl
-bmd0aCxqPSIoIitILlV4KHApCmlmKG0+MClqKz0obz4wPyIsIjoiIikrIlsiK0guVXgobikrIl0iCmlm
-KGs+MClqKz0obz4wPyIsIjoiIikrInsiK0guUzQobCkrIn0iCnQ9cSsoaisiKSIpCnM9YS5lQy5nZXQo
-dCkKaWYocyE9bnVsbClyZXR1cm4gcwpyPW5ldyBILkpjKG51bGwsbnVsbCxudWxsKQpyLno9MTEKci5R
-PWIKci5jaD1jCnIuZGI9dApyZXR1cm4gSC5XRyhhLHIpfSwKRDpmdW5jdGlvbihhLGIsYyl7dmFyIHQs
-cz1iLmRiKyI8IitILlV4KGMpKyI+IixyPWEuZUMuZ2V0KHMpCmlmKHIhPW51bGwpcmV0dXJuIHIKdD1u
-ZXcgSC5KYyhudWxsLG51bGwsbnVsbCkKdC56PTEyCnQuUT1iCnQuY2g9Ywp0LmRiPXMKcmV0dXJuIEgu
-V0coYSx0KX0sCm86ZnVuY3Rpb24oYSxiLGMpe3JldHVybnt1OmEsZTpiLHI6YyxzOltdLHA6MH19LApp
-OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGc9YS5yLGY9YS5zCmZvcih0
-PWcubGVuZ3RoLHM9MDtzPHQ7KXtyPWcuY2hhckNvZGVBdChzKQppZihyPj00OCYmcjw9NTcpcz1ILkEo
-cysxLHIsZyxmKQplbHNlIGlmKCgoKHJ8MzIpPj4+MCktOTcmNjU1MzUpPDI2fHxyPT09OTV8fHI9PT0z
-NilzPUgudChhLHMsZyxmLCExKQplbHNlIGlmKHI9PT00NilzPUgudChhLHMsZyxmLCEwKQplbHNleysr
-cwpzd2l0Y2gocil7Y2FzZSA0NDpicmVhawpjYXNlIDU4OmJyZWFrCmNhc2UgNTk6Zi5wdXNoKEguSyhh
-LnUsYS5lLGYucG9wKCkpKQpicmVhawpjYXNlIDk0OmYucHVzaChILkgoYS51LGYucG9wKCkpKQpicmVh
-awpjYXNlIDM1OmYucHVzaChILm0oYS51LDUsIiMiKSkKYnJlYWsKY2FzZSA2NDpmLnB1c2goSC5tKGEu
-dSwyLCJAIikpCmJyZWFrCmNhc2UgMTI2OmYucHVzaChILm0oYS51LDMsIn4iKSkKYnJlYWsKY2FzZSA2
-MDpmLnB1c2goYS5wKQphLnA9Zi5sZW5ndGgKYnJlYWsKY2FzZSA2MjpxPWEudQpwPWYuc3BsaWNlKGEu
-cCkKSC5yKGEudSxhLmUscCkKYS5wPWYucG9wKCkKbz1mLnBvcCgpCmlmKHR5cGVvZiBvPT0ic3RyaW5n
-IilmLnB1c2goSC5KKHEsbyxwKSkKZWxzZXtuPUguSyhxLGEuZSxvKQpzd2l0Y2gobi56KXtjYXNlIDEx
-OmYucHVzaChILkQocSxuLHApKQpicmVhawpkZWZhdWx0OmYucHVzaChILmEocSxuLHApKQpicmVha319
-YnJlYWsKY2FzZSAzODpILkkoYSxmKQpicmVhawpjYXNlIDQyOm09YS51Cmw9SC5LKG0sYS5lLGYucG9w
-KCkpCmYucHVzaChILnYobSw2LGwsbC5kYisiKiIpKQpicmVhawpjYXNlIDYzOm09YS51Cmw9SC5LKG0s
-YS5lLGYucG9wKCkpCmYucHVzaChILnYobSw3LGwsbC5kYisiPyIpKQpicmVhawpjYXNlIDQ3Om09YS51
-Cmw9SC5LKG0sYS5lLGYucG9wKCkpCmYucHVzaChILnYobSw4LGwsbC5kYisiLyIpKQpicmVhawpjYXNl
-IDQwOmYucHVzaChhLnApCmEucD1mLmxlbmd0aApicmVhawpjYXNlIDQxOnE9YS51Cms9bmV3IEguRygp
-Cmo9cS5zRUEKaT1xLnNFQQpvPWYucG9wKCkKaWYodHlwZW9mIG89PSJudW1iZXIiKXN3aXRjaChvKXtj
-YXNlLTE6aj1mLnBvcCgpCmJyZWFrCmNhc2UtMjppPWYucG9wKCkKYnJlYWsKZGVmYXVsdDpmLnB1c2go
-bykKYnJlYWt9ZWxzZSBmLnB1c2gobykKcD1mLnNwbGljZShhLnApCkgucihhLnUsYS5lLHApCmEucD1m
-LnBvcCgpCmsuYT1wCmsuYj1qCmsuYz1pCmYucHVzaChILkMocSxILksocSxhLmUsZi5wb3AoKSksaykp
-CmJyZWFrCmNhc2UgOTE6Zi5wdXNoKGEucCkKYS5wPWYubGVuZ3RoCmJyZWFrCmNhc2UgOTM6cD1mLnNw
-bGljZShhLnApCkgucihhLnUsYS5lLHApCmEucD1mLnBvcCgpCmYucHVzaChwKQpmLnB1c2goLTEpCmJy
-ZWFrCmNhc2UgMTIzOmYucHVzaChhLnApCmEucD1mLmxlbmd0aApicmVhawpjYXNlIDEyNTpwPWYuc3Bs
-aWNlKGEucCkKSC5CKGEudSxhLmUscCkKYS5wPWYucG9wKCkKZi5wdXNoKHApCmYucHVzaCgtMikKYnJl
-YWsKZGVmYXVsdDp0aHJvdyJCYWQgY2hhcmFjdGVyICIrcn19fWg9Zi5wb3AoKQpyZXR1cm4gSC5LKGEu
-dSxhLmUsaCl9LApBOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscj1iLTQ4CmZvcih0PWMubGVuZ3Ro
-O2E8dDsrK2Epe3M9Yy5jaGFyQ29kZUF0KGEpCmlmKCEocz49NDgmJnM8PTU3KSlicmVhawpyPXIqMTAr
-KHMtNDgpfWQucHVzaChyKQpyZXR1cm4gYX0sCnQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIs
-cSxwLG8sbj1iKzEKZm9yKHQ9Yy5sZW5ndGg7bjx0Oysrbil7cz1jLmNoYXJDb2RlQXQobikKaWYocz09
-PTQ2KXtpZihlKWJyZWFrCmU9ITB9ZWxzZXtpZighKCgoKHN8MzIpPj4+MCktOTcmNjU1MzUpPDI2fHxz
-PT09OTV8fHM9PT0zNikpcj1zPj00OCYmczw9NTcKZWxzZSByPSEwCmlmKCFyKWJyZWFrfX1xPWMuc3Vi
-c3RyaW5nKGIsbikKaWYoZSl7dD1hLnUKcD1hLmUKaWYocC56PT09MTApcD1wLlEKbz1ILlFvKHQscC5R
-KVtxXQppZihvPT1udWxsKUgudmgoJ05vICInK3ErJyIgaW4gIicrSC5tRChwKSsnIicpCmQucHVzaChI
-LmNFKHQscCxvKSl9ZWxzZSBkLnB1c2gocSkKcmV0dXJuIG59LApJOmZ1bmN0aW9uKGEsYil7dmFyIHQ9
-Yi5wb3AoKQppZigwPT09dCl7Yi5wdXNoKEgubShhLnUsMSwiMCYiKSkKcmV0dXJufWlmKDE9PT10KXti
-LnB1c2goSC5tKGEudSw0LCIxJiIpKQpyZXR1cm59dGhyb3cgSC5iKFAuaFYoIlVuZXhwZWN0ZWQgZXh0
-ZW5kZWQgb3BlcmF0aW9uICIrSC5kKHQpKSl9LApLOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYz09
-InN0cmluZyIpcmV0dXJuIEguSihhLGMsYS5zRUEpCmVsc2UgaWYodHlwZW9mIGM9PSJudW1iZXIiKXJl
-dHVybiBILlRWKGEsYixjKQplbHNlIHJldHVybiBjfSwKcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1j
-Lmxlbmd0aApmb3IodD0wO3Q8czsrK3QpY1t0XT1ILksoYSxiLGNbdF0pfSwKQjpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHQscz1jLmxlbmd0aApmb3IodD0xO3Q8czt0Kz0yKWNbdF09SC5LKGEsYixjW3RdKX0sClRW
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHI9Yi56CmlmKHI9PT0xMCl7aWYoYz09PTApcmV0dXJuIGIu
-UQp0PWIuY2gKcz10Lmxlbmd0aAppZihjPD1zKXJldHVybiB0W2MtMV0KYy09cwpiPWIuUQpyPWIuen1l
-bHNlIGlmKGM9PT0wKXJldHVybiBiCmlmKHIhPT05KXRocm93IEguYihQLmhWKCJJbmRleGVkIGJhc2Ug
-bXVzdCBiZSBhbiBpbnRlcmZhY2UgdHlwZSIpKQp0PWIuY2gKaWYoYzw9dC5sZW5ndGgpcmV0dXJuIHRb
-Yy0xXQp0aHJvdyBILmIoUC5oVigiQmFkIGluZGV4ICIrYysiIGZvciAiK2IudygwKSkpfSwKV2U6ZnVu
-Y3Rpb24oYSxiLGMsZCxlLGYpe3ZhciB0LHMscixxLHAsbwppZihiPT09ZClyZXR1cm4hMAppZihILmNj
-KGQsITApKXJldHVybiEwCnQ9Yi56CmlmKHQ9PT00KXJldHVybiEwCmlmKEguY2MoYiwhMCkpcmV0dXJu
-ITEKaWYoYj09PXUuUClyZXR1cm4hMApzPXQ9PT0xMwppZihzKWlmKEguV2UoYSxjW2IuUV0sYyxkLGUs
-ITApKXJldHVybiEwCnI9ZC56CmlmKHQ9PT02KXJldHVybiBILldlKGEsYi5RLGMsZCxlLCEwKQppZihy
-PT09Nil7cT1kLlEKcmV0dXJuIEguV2UoYSxiLGMscSxlLCEwKX1pZih0PT09OCl7aWYoIUguV2UoYSxi
-LlEsYyxkLGUsITApKXJldHVybiExCnJldHVybiBILldlKGEsSC54WihhLGIpLGMsZCxlLCEwKX1pZih0
-PT09Nyl7cT1ILldlKGEsYi5RLGMsZCxlLCEwKQpyZXR1cm4gcX1pZihyPT09OCl7aWYoSC5XZShhLGIs
-YyxkLlEsZSwhMCkpcmV0dXJuITAKcmV0dXJuIEguV2UoYSxiLGMsSC54WihhLGQpLGUsITApfWlmKHI9
-PT03KXtxPUguV2UoYSxiLGMsZC5RLGUsITApCnJldHVybiBxfWlmKHMpcmV0dXJuITEKcT10IT09MTEK
-aWYoKCFxfHx0PT09MTIpJiZkPT09dS5aKXJldHVybiEwCmlmKHI9PT0xMil7aWYoYj09PXUuZylyZXR1
-cm4hMAppZih0IT09MTIpcmV0dXJuITEKcD1iLmNoCm89ZC5jaAppZighSC56dShwLG8sITApKXJldHVy
-biExCmM9Yz09bnVsbD9wOnAuY29uY2F0KGMpCmU9ZT09bnVsbD9vOm8uY29uY2F0KGUpCnJldHVybiBI
-LmJPKGEsYi5RLGMsZC5RLGUsITApfWlmKHI9PT0xMSl7aWYoYj09PXUuZylyZXR1cm4hMAppZihxKXJl
-dHVybiExCnJldHVybiBILmJPKGEsYixjLGQsZSwhMCl9aWYodD09PTkpe2lmKHIhPT05KXJldHVybiEx
-CnJldHVybiBILnBHKGEsYixjLGQsZSwhMCl9cmV0dXJuITF9LApiTzpmdW5jdGlvbihhMCxhMSxhMixh
-MyxhNCxhNSl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYQppZighSC5X
-ZShhMCxhMS5RLGEyLGEzLlEsYTQsITApKXJldHVybiExCnQ9YTEuY2gKcz1hMy5jaApyPXQuYQpxPXMu
-YQpwPXIubGVuZ3RoCm89cS5sZW5ndGgKaWYocD5vKXJldHVybiExCm49by1wCm09dC5iCmw9cy5iCms9
-bS5sZW5ndGgKaj1sLmxlbmd0aAppZihwK2s8bytqKXJldHVybiExCmZvcihpPTA7aTxwOysraSl7aD1y
-W2ldCmlmKCFILldlKGEwLHFbaV0sYTQsaCxhMiwhMCkpcmV0dXJuITF9Zm9yKGk9MDtpPG47KytpKXto
-PW1baV0KaWYoIUguV2UoYTAscVtwK2ldLGE0LGgsYTIsITApKXJldHVybiExfWZvcihpPTA7aTxqOysr
-aSl7aD1tW24raV0KaWYoIUguV2UoYTAsbFtpXSxhNCxoLGEyLCEwKSlyZXR1cm4hMX1nPXQuYwpmPXMu
-YwplPWcubGVuZ3RoCmQ9Zi5sZW5ndGgKZm9yKGk9MCxjPTA7YzxkO2MrPTIpe2I9ZltjXQpkb3tpZihp
-Pj1lKXJldHVybiExCmE9Z1tpXQppKz0yfXdoaWxlKGE8YikKaWYoYjxhKXJldHVybiExCmg9Z1tpLTFd
-CmlmKCFILldlKGEwLGZbYysxXSxhNCxoLGEyLCEwKSlyZXR1cm4hMX1yZXR1cm4hMH0sCnBHOmZ1bmN0
-aW9uKGEsYixjLGQsZSxmKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9Yi5RLGs9ZC5RCmlmKGw9PT1rKXt0
-PWIuY2gKcz1kLmNoCnI9dC5sZW5ndGgKZm9yKHE9MDtxPHI7KytxKXtwPXRbcV0Kbz1zW3FdCmlmKCFI
-LldlKGEscCxjLG8sZSwhMCkpcmV0dXJuITF9cmV0dXJuITB9bj1ILlFvKGEsbCkKaWYobj09bnVsbCly
-ZXR1cm4hMQptPW5ba10KaWYobT09bnVsbClyZXR1cm4hMQpyPW0ubGVuZ3RoCnM9ZC5jaApmb3IocT0w
-O3E8cjsrK3EpaWYoIUguV2UoYSxILmNFKGEsYixtW3FdKSxjLHNbcV0sZSwhMCkpcmV0dXJuITEKcmV0
-dXJuITB9LApyYTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyCmlmKGE9PT1iKXJldHVybiEwCmlmKEgu
-Y2MoYSwhMCkpcmV0dXJuIEguY2MoYiwhMCkKdD1hLnoKaWYodCE9PWIueilyZXR1cm4hMQpzd2l0Y2go
-dCl7Y2FzZSA2OmNhc2UgNzpjYXNlIDg6cmV0dXJuIEgucmEoYS5RLGIuUSwhMCkKY2FzZSA5OmlmKGEu
-USE9PWIuUSlyZXR1cm4hMQpyZXR1cm4gSC56dShhLmNoLGIuY2gsITApCmNhc2UgMTA6cmV0dXJuIEgu
-cmEoYS5RLGIuUSwhMCkmJkguenUoYS5jaCxiLmNoLCEwKQpjYXNlIDExOmlmKEgucmEoYS5RLGIuUSwh
-MCkpe3M9YS5jaApyPWIuY2gKcz1ILnp1KHMuYSxyLmEsITApJiZILnp1KHMuYixyLmIsITApJiZILlhz
-KHMuYyxyLmMsITApfWVsc2Ugcz0hMQpyZXR1cm4gcwpjYXNlIDEyOnJldHVybiBILnJhKGEuUSxiLlEs
-ITApJiZILnp1KGEuY2gsYi5jaCwhMCkKZGVmYXVsdDpyZXR1cm4hMX19LAp6dTpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHQscz1hLmxlbmd0aAppZihzIT09Yi5sZW5ndGgpcmV0dXJuITEKZm9yKHQ9MDt0PHM7Kyt0
-KWlmKCFILnJhKGFbdF0sYlt0XSwhMCkpcmV0dXJuITEKcmV0dXJuITB9LApYczpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHQscyxyPWEubGVuZ3RoCmlmKHIhPT1iLmxlbmd0aClyZXR1cm4hMQpmb3IodD0wO3Q8cjt0
-Kz0yKXtpZihhW3RdIT09Ylt0XSlyZXR1cm4hMQpzPXQrMQppZighSC5yYShhW3NdLGJbc10sITApKXJl
-dHVybiExfXJldHVybiEwfSwKck46ZnVuY3Rpb24oYSl7cmV0dXJuIEguY2MoYSwhMCl9LApjYzpmdW5j
-dGlvbihhLGIpe3ZhciB0LHMKaWYoYT09PXUuSylyZXR1cm4hMAp0PWEuegppZih0IT09MilpZih0IT09
-MylpZih0IT09NClpZih0IT09NSlzPXQ9PT04JiZILmNjKGEuUSwhMCkKZWxzZSBzPSEwCmVsc2Ugcz0h
-MAplbHNlIHM9ITAKZWxzZSBzPSEwCnJldHVybiBzfSwKSXg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9
-T2JqZWN0LmtleXMoYikscT1yLmxlbmd0aApmb3IodD0wO3Q8cTsrK3Qpe3M9clt0XQphW3NdPWJbc119
-fSwKSmM6ZnVuY3Rpb24gSmMoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy55PV8u
-eD1fLmQ9bnVsbApfLno9MApfLmRiPV8uY3k9Xy5jeD1fLmNoPV8uUT1udWxsfSwKRzpmdW5jdGlvbiBH
-KCl7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbH0sCnU5OmZ1bmN0aW9uIHU5KCl7fSwKaHo6ZnVuY3Rp
-b24gaHooYSl7dGhpcy5hPWF9LAppTTpmdW5jdGlvbiBpTShhKXt0aGlzLmE9YX0sClI5OmZ1bmN0aW9u
-KGEpe3JldHVybiB1LmQuYyhhKXx8dS5CLmMoYSl8fHUuZHouYyhhKXx8dS5JLmMoYSl8fHUuQS5jKGEp
-fHx1Lmc0LmMoYSl8fHUuZzIuYyhhKX0sCkpnOmZ1bmN0aW9uKGEpe3JldHVybiB2Lm1hbmdsZWRHbG9i
-YWxOYW1lc1thXX19LEo9ewpRdTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm57aTphLHA6YixlOmMseDpk
-fX0sCmtzOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHA9YVt2LmRpc3BhdGNoUHJvcGVydHlOYW1lXQpp
-ZihwPT1udWxsKWlmKCQuQnY9PW51bGwpe0guWEQoKQpwPWFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV19
-aWYocCE9bnVsbCl7dD1wLnAKaWYoITE9PT10KXJldHVybiBwLmkKaWYoITA9PT10KXJldHVybiBhCnM9
-T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHQ9PT1zKXJldHVybiBwLmkKaWYocC5lPT09cyl0aHJv
-dyBILmIoUC5TWSgiUmV0dXJuIGludGVyY2VwdG9yIGZvciAiK0guZCh0KGEscCkpKSl9cj1hLmNvbnN0
-cnVjdG9yCnE9cj09bnVsbD9udWxsOnJbJC5VTigpXQppZihxIT1udWxsKXJldHVybiBxCnE9SC53Myhh
-KQppZihxIT1udWxsKXJldHVybiBxCmlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBDLkRHCnQ9
-T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHQ9PW51bGwpcmV0dXJuIEMuWlEKaWYodD09PU9iamVj
-dC5wcm90b3R5cGUpcmV0dXJuIEMuWlEKaWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe09iamVjdC5kZWZp
-bmVQcm9wZXJ0eShyLCQuVU4oKSx7dmFsdWU6Qy52QixlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRy
-dWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gQy52Qn1yZXR1cm4gQy52Qn0sClFpOmZ1bmN0aW9u
-KGEsYil7aWYoYTwwfHxhPjQyOTQ5NjcyOTUpdGhyb3cgSC5iKFAuVEUoYSwwLDQyOTQ5NjcyOTUsImxl
-bmd0aCIsbnVsbCkpCnJldHVybiBKLnB5KG5ldyBBcnJheShhKSxiKX0sCnB5OmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIEouRXAoSC5WTShhLGIuQygiamQ8MD4iKSkpfSwKRXA6ZnVuY3Rpb24oYSl7YS5maXhlZCRs
-ZW5ndGg9QXJyYXkKcmV0dXJuIGF9LAp6QzpmdW5jdGlvbihhKXthLmZpeGVkJGxlbmd0aD1BcnJheQph
-LmltbXV0YWJsZSRsaXN0PUFycmF5CnJldHVybiBhfSwKR2E6ZnVuY3Rpb24oYSl7aWYoYTwyNTYpc3dp
-dGNoKGEpe2Nhc2UgOTpjYXNlIDEwOmNhc2UgMTE6Y2FzZSAxMjpjYXNlIDEzOmNhc2UgMzI6Y2FzZSAx
-MzM6Y2FzZSAxNjA6cmV0dXJuITAKZGVmYXVsdDpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSA1NzYwOmNh
-c2UgODE5MjpjYXNlIDgxOTM6Y2FzZSA4MTk0OmNhc2UgODE5NTpjYXNlIDgxOTY6Y2FzZSA4MTk3OmNh
-c2UgODE5ODpjYXNlIDgxOTk6Y2FzZSA4MjAwOmNhc2UgODIwMTpjYXNlIDgyMDI6Y2FzZSA4MjMyOmNh
-c2UgODIzMzpjYXNlIDgyMzk6Y2FzZSA4Mjg3OmNhc2UgMTIyODg6Y2FzZSA2NTI3OTpyZXR1cm4hMApk
-ZWZhdWx0OnJldHVybiExfX0sCm1tOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpmb3IodD1hLmxlbmd0aDti
-PHQ7KXtzPUMueEIuVyhhLGIpCmlmKHMhPT0zMiYmcyE9PTEzJiYhSi5HYShzKSlicmVhazsrK2J9cmV0
-dXJuIGJ9LApjMTpmdW5jdGlvbihhLGIpe3ZhciB0LHMKZm9yKDtiPjA7Yj10KXt0PWItMQpzPUMueEIu
-bShhLHQpCmlmKHMhPT0zMiYmcyE9PTEzJiYhSi5HYShzKSlicmVha31yZXR1cm4gYn0sClJFOmZ1bmN0
-aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2Yg
-YT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9m
-IFAuaylyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sClRKOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0i
-bnVtYmVyIilyZXR1cm4gSi5xSS5wcm90b3R5cGUKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBK
-LkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJl
-dHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVu
-Y3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5rKXJl
-dHVybiBhCnJldHVybiBKLmtzKGEpfSwKVTY6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmci
-KXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9
-PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVv
-ZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNl
-b2YgUC5rKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKaWE6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9
-PSJudW1iZXIiKXtpZihNYXRoLmZsb29yKGEpPT1hKXJldHVybiBKLnVyLnByb3RvdHlwZQpyZXR1cm4g
-Si5WQS5wcm90b3R5cGV9aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQpp
-ZihhPT1udWxsKXJldHVybiBKLllFLnByb3RvdHlwZQppZih0eXBlb2YgYT09ImJvb2xlYW4iKXJldHVy
-biBKLnlFLnByb3RvdHlwZQppZihhLmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5
-cGUKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5j
-NS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuaylyZXR1cm4gYQpyZXR1cm4gSi5r
-cyhhKX0sCnJZOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90
-b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gYQppZighKGEgaW5zdGFuY2VvZiBQLmspKXJldHVybiBKLmtk
-LnByb3RvdHlwZQpyZXR1cm4gYX0sCncxOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYo
-YS5jb25zdHJ1Y3Rvcj09QXJyYXkpcmV0dXJuIEouamQucHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2Jq
-ZWN0Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBh
-fWlmKGEgaW5zdGFuY2VvZiBQLmspcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LApBTTpmdW5jdGlvbihh
-LGIpe3JldHVybiBKLncxKGEpLkUoYSxiKX0sCkNNOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLlJF
-KGEpLmR1KGEsYixjLGQpfSwKRkw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5kZChhLGIpfSwK
-R3I6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ21XKGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJu
-IEouVTYoYSkuZ0EoYSl9LApJVDpmdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5na3ooYSl9LApKeTpm
-dW5jdGlvbihhLGIpe3JldHVybiBKLmlhKGEpLmU3KGEsYil9LApLVjpmdW5jdGlvbihhLGIpe3JldHVy
-biBKLnJZKGEpLkcoYSxiKX0sCkx0OmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLndnKGEpfSwKTTE6
-ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLncxKGEpLkUyKGEsYixjKX0sClF6OmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIEouclkoYSkuVyhhLGIpfSwKUk06ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiBi
-PT1udWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYiE9bnVsbCYmYT09PWIKcmV0dXJuIEou
-aWEoYSkuRE4oYSxiKX0sClQwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnJZKGEpLmJTKGEpfSwKYTY6ZnVu
-Y3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5tKGEsYil9LApiVDpmdW5jdGlvbihhKXtyZXR1cm4gSi5S
-RShhKS5ENChhKX0sCmJiOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2Yg
-Yj09Im51bWJlciIpcmV0dXJuIGErYgpyZXR1cm4gSi5USihhKS5oKGEsYil9LApjSDpmdW5jdGlvbihh
-KXtyZXR1cm4gSi5yWShhKS5oYyhhKX0sCmRSOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdEKGEp
-fSwKZFo6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouUkUoYSkuT24oYSxiLGMsZCl9LApkaDpmdW5j
-dGlvbihhKXtyZXR1cm4gSi5SRShhKS50bihhKX0sCmhmOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlhKGEp
-LmdpTyhhKX0sCmlnOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdRZyhhKX0sCmo6ZnVuY3Rpb24o
-YSl7cmV0dXJuIEouaWEoYSkudyhhKX0sCmw1OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2hm
-KGEsYil9LApsZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuTmooYSxiLGMpfSwKcTA6ZnVu
-Y3Rpb24oYSxiLGMpe3JldHVybiBKLnJZKGEpLlFpKGEsYixjKX0sCnFGOmZ1bmN0aW9uKGEpe3JldHVy
-biBKLlJFKGEpLmdWbChhKX0sCnRIOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5SRShhKS5wayhhLGIs
-Yyl9LAp3MjpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiPT09Im51bWJlciIpaWYoYS5jb25zdHJ1Y3Rv
-cj09QXJyYXl8fHR5cGVvZiBhPT0ic3RyaW5nInx8SC53VihhLGFbdi5kaXNwYXRjaFByb3BlcnR5TmFt
-ZV0pKWlmKGI+Pj4wPT09YiYmYjxhLmxlbmd0aClyZXR1cm4gYVtiXQpyZXR1cm4gSi5VNihhKS5xKGEs
-Yil9LAp5UTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5yWShhKS5pNyhhLGIsYyxkKX0sCnpsOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSkudGcoYSxiKX0sCnZCOmZ1bmN0aW9uIHZCKCl7fSwKeUU6
-ZnVuY3Rpb24geUUoKXt9LApZRTpmdW5jdGlvbiBZRSgpe30sCk1GOmZ1bmN0aW9uIE1GKCl7fSwKaUM6
-ZnVuY3Rpb24gaUMoKXt9LAprZDpmdW5jdGlvbiBrZCgpe30sCmM1OmZ1bmN0aW9uIGM1KCl7fSwKamQ6
-ZnVuY3Rpb24gamQoYSl7dGhpcy4kdGk9YX0sClBvOmZ1bmN0aW9uIFBvKGEpe3RoaXMuJHRpPWF9LApt
-MTpmdW5jdGlvbiBtMShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9MApfLmQ9bnVsbApf
-LiR0aT1jfSwKcUk6ZnVuY3Rpb24gcUkoKXt9LAp1cjpmdW5jdGlvbiB1cigpe30sClZBOmZ1bmN0aW9u
-IFZBKCl7fSwKRHI6ZnVuY3Rpb24gRHIoKXt9fSxQPXsKT2o6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9e30K
-aWYoc2VsZi5zY2hlZHVsZUltbWVkaWF0ZSE9bnVsbClyZXR1cm4gUC5FWCgpCmlmKHNlbGYuTXV0YXRp
-b25PYnNlcnZlciE9bnVsbCYmc2VsZi5kb2N1bWVudCE9bnVsbCl7dD1zZWxmLmRvY3VtZW50LmNyZWF0
-ZUVsZW1lbnQoImRpdiIpCnM9c2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikKci5hPW51
-bGwKbmV3IHNlbGYuTXV0YXRpb25PYnNlcnZlcihILnRSKG5ldyBQLnRoKHIpLDEpKS5vYnNlcnZlKHQs
-e2NoaWxkTGlzdDp0cnVlfSkKcmV0dXJuIG5ldyBQLmhhKHIsdCxzKX1lbHNlIGlmKHNlbGYuc2V0SW1t
-ZWRpYXRlIT1udWxsKXJldHVybiBQLnl0KCkKcmV0dXJuIFAucVcoKX0sClpWOmZ1bmN0aW9uKGEpe3Nl
-bGYuc2NoZWR1bGVJbW1lZGlhdGUoSC50UihuZXcgUC5Wcyh1Lk0uYihhKSksMCkpfSwKb0E6ZnVuY3Rp
-b24oYSl7c2VsZi5zZXRJbW1lZGlhdGUoSC50UihuZXcgUC5GdCh1Lk0uYihhKSksMCkpfSwKQno6ZnVu
-Y3Rpb24oYSl7dS5NLmIoYSkKUC5RTigwLGEpfSwKUU46ZnVuY3Rpb24oYSxiKXt2YXIgdD1uZXcgUC5X
-MygpCnQuQ1koYSxiKQpyZXR1cm4gdH0sCkZYOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5paChuZXcg
-UC52cygkLlgzLGEuQygidnM8MD4iKSksYS5DKCJpaDwwPiIpKX0sCkRJOmZ1bmN0aW9uKGEsYil7YS4k
-MigwLG51bGwpCmIuYj0hMApyZXR1cm4gYi5hfSwKalE6ZnVuY3Rpb24oYSxiKXtQLkplKGEsYil9LAp5
-QzpmdW5jdGlvbihhLGIpe2IuYU0oMCxhKX0sCmYzOmZ1bmN0aW9uKGEsYil7Yi53MChILlJ1KGEpLEgu
-dHMoYSkpfSwKSmU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9bmV3IFAuV00oYikscT1uZXcgUC5TWChi
-KQppZihhIGluc3RhbmNlb2YgUC52cylhLlFkKHIscSx1LnopCmVsc2V7dD11LnoKaWYodS5jLmMoYSkp
-YS5TcShyLHEsdCkKZWxzZXtzPW5ldyBQLnZzKCQuWDMsdS5fKQpzLmE9NApzLmM9YQpzLlFkKHIsbnVs
-bCx0KX19fSwKbHo6ZnVuY3Rpb24oYSl7dmFyIHQ9ZnVuY3Rpb24oYixjKXtyZXR1cm4gZnVuY3Rpb24o
-ZCxlKXt3aGlsZSh0cnVlKXRyeXtiKGQsZSkKYnJlYWt9Y2F0Y2gocyl7ZT1zCmQ9Y319fShhLDEpCnJl
-dHVybiAkLlgzLkxqKG5ldyBQLkdzKHQpLHUuUCx1LmVnLHUueil9LAprMzpmdW5jdGlvbihhLGIpe3Zh
-ciB0LHMscgpiLmE9MQp0cnl7YS5TcShuZXcgUC5wVihiKSxuZXcgUC5VNyhiKSx1LlApfWNhdGNoKHIp
-e3Q9SC5SdShyKQpzPUgudHMocikKUC5yYihuZXcgUC52cihiLHQscykpfX0sCkE5OmZ1bmN0aW9uKGEs
-Yil7dmFyIHQscyxyCmZvcih0PXUuXztzPWEuYSxzPT09MjspYT10LmIoYS5jKQppZihzPj00KXtyPWIu
-YWgoKQpiLmE9YS5hCmIuYz1hLmMKUC5IWihiLHIpfWVsc2V7cj11LnguYihiLmMpCmIuYT0yCmIuYz1h
-CmEualEocil9fSwKSFo6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxn
-LGYsZT1udWxsLGQ9e30sYz1kLmE9YQpmb3IodD11Lm4scz11Lngscj11LmM7ITA7KXtxPXt9CnA9Yy5h
-PT09OAppZihiPT1udWxsKXtpZihwKXtvPXQuYihjLmMpClAuTDIoZSxlLGMuYixvLmEsby5iKX1yZXR1
-cm59Zm9yKDtuPWIuYSxuIT1udWxsO2I9bil7Yi5hPW51bGwKUC5IWihkLmEsYil9Yz1kLmEKbT1jLmMK
-cS5hPXAKcS5iPW0KbD0hcAppZihsKXtrPWIuYwprPShrJjEpIT09MHx8KGsmMTUpPT09OH1lbHNlIGs9
-ITAKaWYoayl7az1iLmIKaj1rLmIKaWYocCl7aT1jLmI9PT1qCmk9IShpfHxpKX1lbHNlIGk9ITEKaWYo
-aSl7dC5iKG0pClAuTDIoZSxlLGMuYixtLmEsbS5iKQpyZXR1cm59aD0kLlgzCmlmKGghPT1qKSQuWDM9
-agplbHNlIGg9ZQpjPWIuYwppZigoYyYxNSk9PT04KW5ldyBQLlJUKGQscSxiLHApLiQwKCkKZWxzZSBp
-ZihsKXtpZigoYyYxKSE9PTApbmV3IFAucnEocSxiLG0pLiQwKCl9ZWxzZSBpZigoYyYyKSE9PTApbmV3
-IFAuUlcoZCxxLGIpLiQwKCkKaWYoaCE9bnVsbCkkLlgzPWgKYz1xLmIKaWYoci5jKGMpKXtpZihjLmE+
-PTQpe2c9cy5iKGsuYykKay5jPW51bGwKYj1rLk44KGcpCmsuYT1jLmEKay5jPWMuYwpkLmE9Ywpjb250
-aW51ZX1lbHNlIFAuQTkoYyxrKQpyZXR1cm59fWY9Yi5iCmc9cy5iKGYuYykKZi5jPW51bGwKYj1mLk44
-KGcpCmM9cS5hCmw9cS5iCmlmKCFjKXtmLiR0aS5kLmIobCkKZi5hPTQKZi5jPWx9ZWxzZXt0LmIobCkK
-Zi5hPTgKZi5jPWx9ZC5hPWYKYz1mfX0sClZIOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYodS5XLmMoYSkp
-cmV0dXJuIGIuTGooYSx1LnosdS5LLHUubCkKdD11LnkKaWYodC5jKGEpKXJldHVybiB0LmIoYSkKdGhy
-b3cgSC5iKFAuTDMoYSwib25FcnJvciIsIkVycm9yIGhhbmRsZXIgbXVzdCBhY2NlcHQgb25lIE9iamVj
-dCBvciBvbmUgT2JqZWN0IGFuZCBhIFN0YWNrVHJhY2UgYXMgYXJndW1lbnRzLCBhbmQgcmV0dXJuIGEg
-YSB2YWxpZCByZXN1bHQiKSl9LApwdTpmdW5jdGlvbigpe3ZhciB0LHMKZm9yKDt0PSQuUzYsdCE9bnVs
-bDspeyQubWc9bnVsbApzPXQuYgokLlM2PXMKaWYocz09bnVsbCkkLms4PW51bGwKdC5hLiQwKCl9fSwK
-ZU46ZnVuY3Rpb24oKXskLlVEPSEwCnRyeXtQLnB1KCl9ZmluYWxseXskLm1nPW51bGwKJC5VRD0hMQpp
-ZigkLlM2IT1udWxsKSQudXQoKS4kMShQLlVJKCkpfX0sCmVXOmZ1bmN0aW9uKGEpe3ZhciB0PW5ldyBQ
-Lk9NKGEpCmlmKCQuUzY9PW51bGwpeyQuUzY9JC5rOD10CmlmKCEkLlVEKSQudXQoKS4kMShQLlVJKCkp
-fWVsc2UgJC5rOD0kLms4LmI9dH0sCnJSOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj0kLlM2CmlmKHI9PW51
-bGwpe1AuZVcoYSkKJC5tZz0kLms4CnJldHVybn10PW5ldyBQLk9NKGEpCnM9JC5tZwppZihzPT1udWxs
-KXt0LmI9cgokLlM2PSQubWc9dH1lbHNle3QuYj1zLmIKJC5tZz1zLmI9dAppZih0LmI9PW51bGwpJC5r
-OD10fX0sCnJiOmZ1bmN0aW9uKGEpe3ZhciB0PW51bGwscz0kLlgzCmlmKEMuTlU9PT1zKXtQLlRrKHQs
-dCxDLk5VLGEpCnJldHVybn1QLlRrKHQsdCxzLHUuTS5iKHMuR1koYSkpKX0sClF3OmZ1bmN0aW9uKGEs
-Yil7aWYoYT09bnVsbClILnZoKFAuRWUoInN0cmVhbSIpKQpyZXR1cm4gbmV3IFAueEkoYi5DKCJ4STww
-PiIpKX0sCkwyOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQ9e30KdC5hPWQKUC5yUihuZXcgUC5wSyh0
-LGUpKX0sClQ4OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBk
-LiQwKCkKJC5YMz1jCnQ9cwp0cnl7cz1kLiQwKCkKcmV0dXJuIHN9ZmluYWxseXskLlgzPXR9fSwKeXY6
-ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQxKGUp
-CiQuWDM9Ywp0PXMKdHJ5e3M9ZC4kMShlKQpyZXR1cm4gc31maW5hbGx5eyQuWDM9dH19LApReDpmdW5j
-dGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQyKGUs
-ZikKJC5YMz1jCnQ9cwp0cnl7cz1kLiQyKGUsZikKcmV0dXJuIHN9ZmluYWxseXskLlgzPXR9fSwKVGs6
-ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQKdS5NLmIoZCkKdD1DLk5VIT09YwppZih0KWQ9ISghdHx8ITEp
-P2MuR1koZCk6Yy5SVChkLHUuSCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwK
-aGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rp
-b24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0aW9u
-IFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9u
-IGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0
-aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhp
-cy5hPWF9LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhp
-cy4kdGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9
-YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlz
-Cl8uYT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApkYTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1h
-CnRoaXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0
-aW9uIHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24gVTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlv
-biB2cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApySDpmdW5jdGlvbiBySChhLGIp
-e3RoaXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24gS0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-ClpMOmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0
-aW9uIFJUKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApqWjpmdW5j
-dGlvbiBqWihhKXt0aGlzLmE9YX0sCnJxOmZ1bmN0aW9uIHJxKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLmM9Y30sClJXOmZ1bmN0aW9uIFJXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
-Y30sCk9NOmZ1bmN0aW9uIE9NKGEpe3RoaXMuYT1hCnRoaXMuYj1udWxsfSwKcWg6ZnVuY3Rpb24gcWgo
-KXt9LApCNTpmdW5jdGlvbiBCNShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKUEk6ZnVuY3Rpb24gUEko
-YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk1POmZ1bmN0aW9uIE1PKCl7fSwKa1Q6ZnVuY3Rpb24ga1Qo
-KXt9LAp4STpmdW5jdGlvbiB4SShhKXt0aGlzLiR0aT1hfSwKQ3c6ZnVuY3Rpb24gQ3coYSxiKXt0aGlz
-LmE9YQp0aGlzLmI9Yn0sCm0wOmZ1bmN0aW9uIG0wKCl7fSwKcEs6ZnVuY3Rpb24gcEsoYSxiKXt0aGlz
-LmE9YQp0aGlzLmI9Yn0sCkppOmZ1bmN0aW9uIEppKCl7fSwKaGo6ZnVuY3Rpb24gaGooYSxiLGMpe3Ro
-aXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnA6ZnVuY3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlz
-LmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVG
-OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuQygiRm88MSwyPiIpLmIoSC5C
-NyhhLG5ldyBILk41KGIuQygiQDwwPiIpLktxKGMpLkMoIk41PDEsMj4iKSkpKX0sCkZsOmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIG5ldyBILk41KGEuQygiQDwwPiIpLktxKGIpLkMoIk41PDEsMj4iKSl9LApMczpm
-dW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJiNjwwPiIpKX0sClQyOmZ1bmN0aW9uKCl7dmFy
-IHQ9T2JqZWN0LmNyZWF0ZShudWxsKQp0WyI8bm9uLWlkZW50aWZpZXIta2V5PiJdPXQKZGVsZXRlIHRb
-Ijxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHR9LApyajpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9
-bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKdC5jPWEuZQpyZXR1cm4gdH0sCkVQOmZ1bmN0aW9uKGEs
-YixjKXt2YXIgdCxzCmlmKFAuaEIoYSkpe2lmKGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpy
-ZXR1cm4gYisiLi4uIitjfXQ9SC5WTShbXSx1LnMpCkMuTm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEsdCl9
-ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXM9
-UC52ZyhiLHUuUi5iKHQpLCIsICIpK2MKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LApXRTpm
-dW5jdGlvbihhLGIsYyl7dmFyIHQscwppZihQLmhCKGEpKXJldHVybiBiKyIuLi4iK2MKdD1uZXcgUC5S
-bihiKQpDLk5tLmkoJC54ZyxhKQp0cnl7cz10CnMuYT1QLnZnKHMuYSxhLCIsICIpfWZpbmFsbHl7aWYo
-MD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54ZywtMSkKJC54Zy5wb3AoKX10LmErPWMKcz10LmEK
-cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LApoQjpmdW5jdGlvbihhKXt2YXIgdCxzCmZvcih0
-PSQueGcubGVuZ3RoLHM9MDtzPHQ7KytzKWlmKGE9PT0kLnhnW3NdKXJldHVybiEwCnJldHVybiExfSwK
-VnI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtPWEuZ2t6KGEpLGw9MCxrPTAKd2hpbGUo
-ITApe2lmKCEobDw4MHx8azwzKSlicmVhawppZighbS5GKCkpcmV0dXJuCnQ9SC5kKG0uZ2woKSkKQy5O
-bS5pKGIsdCkKbCs9dC5sZW5ndGgrMjsrK2t9aWYoIW0uRigpKXtpZihrPD01KXJldHVybgppZigwPj1i
-Lmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpzPWIucG9wKCkKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEgu
-T0goYiwtMSkKcj1iLnBvcCgpfWVsc2V7cT1tLmdsKCk7KytrCmlmKCFtLkYoKSl7aWYoazw9NCl7Qy5O
-bS5pKGIsSC5kKHEpKQpyZXR1cm59cz1ILmQocSkKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwt
-MSkKcj1iLnBvcCgpCmwrPXMubGVuZ3RoKzJ9ZWxzZXtwPW0uZ2woKTsrK2sKZm9yKDttLkYoKTtxPXAs
-cD1vKXtvPW0uZ2woKTsrK2sKaWYoaz4xMDApe3doaWxlKCEwKXtpZighKGw+NzUmJms+MykpYnJlYWsK
-aWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKbC09Yi5wb3AoKS5sZW5ndGgrMjstLWt9Qy5O
-bS5pKGIsIi4uLiIpCnJldHVybn19cj1ILmQocSkKcz1ILmQocCkKbCs9cy5sZW5ndGgrci5sZW5ndGgr
-NH19aWYoaz5iLmxlbmd0aCsyKXtsKz01Cm49Ii4uLiJ9ZWxzZSBuPW51bGwKd2hpbGUoITApe2lmKCEo
-bD44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKbC09
-Yi5wb3AoKS5sZW5ndGgrMgppZihuPT1udWxsKXtsKz01Cm49Ii4uLiJ9fWlmKG4hPW51bGwpQy5ObS5p
-KGIsbikKQy5ObS5pKGIscikKQy5ObS5pKGIscyl9LAp0TTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj1Q
-LkxzKGIpCmZvcih0PWEubGVuZ3RoLHM9MDtzPGEubGVuZ3RoO2EubGVuZ3RoPT09dHx8KDAsSC5sayko
-YSksKytzKXIuaSgwLGIuYihhW3NdKSkKcmV0dXJuIHJ9LApuTzpmdW5jdGlvbihhKXt2YXIgdCxzPXt9
-CmlmKFAuaEIoYSkpcmV0dXJuInsuLi59Igp0PW5ldyBQLlJuKCIiKQp0cnl7Qy5ObS5pKCQueGcsYSkK
-dC5hKz0ieyIKcy5hPSEwCmEuSygwLG5ldyBQLkdBKHMsdCkpCnQuYSs9In0ifWZpbmFsbHl7aWYoMD49
-JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54ZywtMSkKJC54Zy5wb3AoKX1zPXQuYQpyZXR1cm4gcy5j
-aGFyQ29kZUF0KDApPT0wP3M6c30sCmI2OmZ1bmN0aW9uIGI2KGEpe3ZhciBfPXRoaXMKXy5hPTAKXy5m
-PV8uZT1fLmQ9Xy5jPV8uYj1udWxsCl8ucj0wCl8uJHRpPWF9LApibjpmdW5jdGlvbiBibihhKXt0aGlz
-LmE9YQp0aGlzLmM9dGhpcy5iPW51bGx9LApsbTpmdW5jdGlvbiBsbShhLGIsYyl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGwKXy4kdGk9Y30sCm1XOmZ1bmN0aW9uIG1XKCl7fSwKTFU6ZnVu
-Y3Rpb24gTFUoKXt9LApsRDpmdW5jdGlvbiBsRCgpe30sCmlsOmZ1bmN0aW9uIGlsKCl7fSwKR0E6ZnVu
-Y3Rpb24gR0EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCllrOmZ1bmN0aW9uIFlrKCl7fSwKS1A6ZnVu
-Y3Rpb24gS1AoKXt9LApQbjpmdW5jdGlvbiBQbigpe30sCkdqOmZ1bmN0aW9uIEdqKGEsYil7dGhpcy5h
-PWEKdGhpcy4kdGk9Yn0sCmxmOmZ1bmN0aW9uIGxmKCl7fSwKVmo6ZnVuY3Rpb24gVmooKXt9LApYdjpm
-dW5jdGlvbiBYdigpe30sCm5ZOmZ1bmN0aW9uIG5ZKCl7fSwKV1k6ZnVuY3Rpb24gV1koKXt9LApSVTpm
-dW5jdGlvbiBSVSgpe30sCkJTOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEKaWYodHlwZW9mIGEhPSJz
-dHJpbmciKXRocm93IEguYihILnRMKGEpKQp0PW51bGwKdHJ5e3Q9SlNPTi5wYXJzZShhKX1jYXRjaChy
-KXtzPUguUnUocikKcT1QLnJyKFN0cmluZyhzKSxudWxsLG51bGwpCnRocm93IEguYihxKX1xPVAuUWUo
-dCkKcmV0dXJuIHF9LApRZTpmdW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxsKXJldHVybgppZih0eXBl
-b2YgYSE9Im9iamVjdCIpcmV0dXJuIGEKaWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpIT09QXJyYXku
-cHJvdG90eXBlKXJldHVybiBuZXcgUC51dyhhLE9iamVjdC5jcmVhdGUobnVsbCkpCmZvcih0PTA7dDxh
-Lmxlbmd0aDsrK3QpYVt0XT1QLlFlKGFbdF0pCnJldHVybiBhfSwKa3k6ZnVuY3Rpb24oYSxiLGMsZCl7
-aWYoYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIFAuUlAoITEsYixjLGQpCnJldHVybn0sClJQ
-OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscj0kLnJmKCkKaWYocj09bnVsbClyZXR1cm4KdD0wPT09
-YwppZih0JiYhMClyZXR1cm4gUC5PUShyLGIpCnM9Yi5sZW5ndGgKZD1QLmpCKGMsZCxzKQppZih0JiZk
-PT09cylyZXR1cm4gUC5PUShyLGIpCnJldHVybiBQLk9RKHIsYi5zdWJhcnJheShjLGQpKX0sCk9ROmZ1
-bmN0aW9uKGEsYil7aWYoUC5CZShiKSlyZXR1cm4KcmV0dXJuIFAuSmgoYSxiKX0sCkpoOmZ1bmN0aW9u
-KGEsYil7dmFyIHQscwp0cnl7dD1hLmRlY29kZShiKQpyZXR1cm4gdH1jYXRjaChzKXtILlJ1KHMpfXJl
-dHVybn0sCkJlOmZ1bmN0aW9uKGEpe3ZhciB0LHM9YS5sZW5ndGgtMgpmb3IodD0wO3Q8czsrK3QpaWYo
-YVt0XT09PTIzNylpZigoYVt0KzFdJjIyNCk9PT0xNjApcmV0dXJuITAKcmV0dXJuITF9LApXSTpmdW5j
-dGlvbigpe3ZhciB0LHMKdHJ5e3Q9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2ZhdGFsOnRydWV9KQpy
-ZXR1cm4gdH1jYXRjaChzKXtILlJ1KHMpfXJldHVybn0sCndHOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxz
-LHIKZm9yKHQ9Si5VNihhKSxzPWI7czxjOysrcyl7cj10LnEoYSxzKQppZih0eXBlb2YgciE9PSJudW1i
-ZXIiKXJldHVybiByLnpNKCkKaWYoKHImMTI3KSE9PXIpcmV0dXJuIHMtYn1yZXR1cm4gYy1ifSwKeE06
-ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKEMuam4uelkoZiw0KSE9PTApdGhyb3cgSC5iKFAucnIoIklu
-dmFsaWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBvZiBmb3Vy
-LCBpcyAiK2YsYSxjKSkKaWYoZCtlIT09Zil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFk
-ZGluZywgJz0nIG5vdCBhdCB0aGUgZW5kIixhLGIpKQppZihlPjIpdGhyb3cgSC5iKFAucnIoIkludmFs
-aWQgYmFzZTY0IHBhZGRpbmcsIG1vcmUgdGhhbiB0d28gJz0nIGNoYXJhY3RlcnMiLGEsYikpfSwKdXc6
-ZnVuY3Rpb24gdXcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9bnVsbH0sCmk4OmZ1bmN0aW9u
-IGk4KGEpe3RoaXMuYT1hfSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpmdW5jdGlvbiBVOCgpe30sClVr
-OmZ1bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpmdW5jdGlvbiBaaSgpe30sCmJ5
-OmZ1bmN0aW9uIGJ5KCl7fSwKTXg6ZnVuY3Rpb24gTXgoYSl7dGhpcy5hPWF9LAp1NTpmdW5jdGlvbiB1
-NSgpe30sCkUzOmZ1bmN0aW9uIEUzKCl7fSwKUnc6ZnVuY3Rpb24gUncoYSl7dGhpcy5iPTAKdGhpcy5j
-PWF9LApHWTpmdW5jdGlvbiBHWShhKXt0aGlzLmE9YX0sCmJ6OmZ1bmN0aW9uIGJ6KGEsYil7dmFyIF89
-dGhpcwpfLmE9YQpfLmI9YgpfLmM9ITAKXy5mPV8uZT1fLmQ9MH0sClFBOmZ1bmN0aW9uKGEsYixjKXt2
-YXIgdD1ILkhwKGEsYykKaWYodCE9bnVsbClyZXR1cm4gdAppZihiIT1udWxsKXJldHVybiBiLiQxKGEp
-CnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApGOmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2Vv
-ZiBILlRwKXJldHVybiBhLncoMCkKcmV0dXJuIkluc3RhbmNlIG9mICciK0guZChILk0oYSkpKyInIn0s
-Ck84OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPUouUWkoYSxjKQppZihhIT09MCYmITApZm9yKHQ9MDt0
-PHMubGVuZ3RoOysrdClDLk5tLlkocyx0LGIpCnJldHVybiBzfSwKQ0g6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0LHM9SC5WTShbXSxjLkMoImpkPDA+IikpCmZvcih0PUouSVQoYSk7dC5GKCk7KUMuTm0uaShzLGMu
-Yih0LmdsKCkpKQppZihiKXJldHVybiBzCnJldHVybiBjLkMoInpNPDA+IikuYihKLkVwKHMpKX0sCkFG
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuQygiek08MD4iKS5iKEouekMoUC5DSChhLCExLGIpKSl9LApI
-TTpmdW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoQXJyYXkuaXNBcnJheShhKSl7dS50LmIoYSkKdD1hLmxl
-bmd0aApjPVAuakIoYixjLHQpCnJldHVybiBILmVUKGI+MHx8Yzx0P0MuTm0uRDYoYSxiLGMpOmEpfWlm
-KHUuYm0uYyhhKSlyZXR1cm4gSC5mdyhhLGIsUC5qQihiLGMsYS5sZW5ndGgpKQpyZXR1cm4gUC5idyhh
-LGIsYyl9LApPbzpmdW5jdGlvbihhKXtyZXR1cm4gSC5MdyhhKX0sCmJ3OmZ1bmN0aW9uKGEsYixjKXt2
-YXIgdCxzLHIscSxwPW51bGwKaWYoYjwwKXRocm93IEguYihQLlRFKGIsMCxKLkhtKGEpLHAscCkpCnQ9
-Yz09bnVsbAppZighdCYmYzxiKXRocm93IEguYihQLlRFKGMsYixKLkhtKGEpLHAscCkpCnM9Si5JVChh
-KQpmb3Iocj0wO3I8YjsrK3IpaWYoIXMuRigpKXRocm93IEguYihQLlRFKGIsMCxyLHAscCkpCnE9W10K
-aWYodClmb3IoO3MuRigpOylxLnB1c2gocy5nbCgpKQplbHNlIGZvcihyPWI7cjxjOysrcil7aWYoIXMu
-RigpKXRocm93IEguYihQLlRFKGMsYixyLHAscCkpCnEucHVzaChzLmdsKCkpfXJldHVybiBILmVUKHEp
-fSwKbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlZSKGEsSC52NChhLCExLCEwLCExLCExLCExKSl9
-LAp2ZzpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9Si5JVChiKQppZighdC5GKCkpcmV0dXJuIGEKaWYoYy5s
-ZW5ndGg9PT0wKXtkbyBhKz1ILmQodC5nbCgpKQp3aGlsZSh0LkYoKSl9ZWxzZXthKz1ILmQodC5nbCgp
-KQpmb3IoO3QuRigpOylhPWErYytILmQodC5nbCgpKX1yZXR1cm4gYX0sCmxyOmZ1bmN0aW9uKGEsYixj
-LGQpe3JldHVybiBuZXcgUC5tcChhLGIsYyxkKX0sCnVvOmZ1bmN0aW9uKCl7dmFyIHQ9SC5NMCgpCmlm
-KHQhPW51bGwpcmV0dXJuIFAuaEsodCkKdGhyb3cgSC5iKFAuTDQoIidVcmkuYmFzZScgaXMgbm90IHN1
-cHBvcnRlZCIpKX0sCmVQOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxLHAsbyxuPSIwMTIzNDU2
-Nzg5QUJDREVGIgppZihjPT09Qy54TSl7dD0kLno0KCkuYgppZih0eXBlb2YgYiE9InN0cmluZyIpSC52
-aChILnRMKGIpKQp0PXQudGVzdChiKX1lbHNlIHQ9ITEKaWYodClyZXR1cm4gYgpILkxoKGMpLkMoIlVr
-LlMiKS5iKGIpCnM9Yy5nWkUoKS5XSihiKQpmb3IodD1zLmxlbmd0aCxyPTAscT0iIjtyPHQ7KytyKXtw
-PXNbcl0KaWYocDwxMjgpe289cD4+PjQKaWYobz49OClyZXR1cm4gSC5PSChhLG8pCm89KGFbb10mMTw8
-KHAmMTUpKSE9PTB9ZWxzZSBvPSExCmlmKG8pcSs9SC5MdyhwKQplbHNlIHE9ZCYmcD09PTMyP3ErIisi
-OnErIiUiK25bcD4+PjQmMTVdK25bcCYxNV19cmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9xOnF9LApH
-cTpmdW5jdGlvbihhKXt2YXIgdD1NYXRoLmFicyhhKSxzPWE8MD8iLSI6IiIKaWYodD49MTAwMClyZXR1
-cm4iIithCmlmKHQ+PTEwMClyZXR1cm4gcysiMCIrdAppZih0Pj0xMClyZXR1cm4gcysiMDAiK3QKcmV0
-dXJuIHMrIjAwMCIrdH0sClZ4OmZ1bmN0aW9uKGEpe2lmKGE+PTEwMClyZXR1cm4iIithCmlmKGE+PTEw
-KXJldHVybiIwIithCnJldHVybiIwMCIrYX0sCmgwOmZ1bmN0aW9uKGEpe2lmKGE+PTEwKXJldHVybiIi
-K2EKcmV0dXJuIjAiK2F9LApwOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyInx8SC5sKGEp
-fHxudWxsPT1hKXJldHVybiBKLmooYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09OLnN0
-cmluZ2lmeShhKQpyZXR1cm4gUC5GKGEpfSwKaFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkM2KGEp
-fSwKeFk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnUoITEsbnVsbCxudWxsLGEpfSwKTDM6ZnVuY3Rp
-b24oYSxiLGMpe3JldHVybiBuZXcgUC51KCEwLGEsYixjKX0sCkVlOmZ1bmN0aW9uKGEpe3JldHVybiBu
-ZXcgUC51KCExLG51bGwsYSwiTXVzdCBub3QgYmUgbnVsbCIpfSwKeDpmdW5jdGlvbihhLGIpe3JldHVy
-biBuZXcgUC5iSihudWxsLG51bGwsITAsYSxiLCJWYWx1ZSBub3QgaW4gcmFuZ2UiKX0sClRFOmZ1bmN0
-aW9uKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBQLmJKKGIsYywhMCxhLGQsIkludmFsaWQgdmFsdWUiKX0s
-CndBOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGE8Ynx8YT5jKXRocm93IEguYihQLlRFKGEsYixjLGQsbnVs
-bCkpfSwKakI6ZnVuY3Rpb24oYSxiLGMpe2lmKDA+YXx8YT5jKXRocm93IEguYihQLlRFKGEsMCxjLCJz
-dGFydCIsbnVsbCkpCmlmKGIhPW51bGwpe2lmKGE+Ynx8Yj5jKXRocm93IEguYihQLlRFKGIsYSxjLCJl
-bmQiLG51bGwpKQpyZXR1cm4gYn1yZXR1cm4gY30sCmsxOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEh
-PT0ibnVtYmVyIilyZXR1cm4gYS5KKCkKaWYoYTwwKXRocm93IEguYihQLlRFKGEsMCxudWxsLGIsbnVs
-bCkpfSwKQ2Y6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1ILlNjKGU9PW51bGw/Si5IbShiKTplKQpy
-ZXR1cm4gbmV3IFAuZVkodCwhMCxhLGMsIkluZGV4IG91dCBvZiByYW5nZSIpfSwKTDQ6ZnVuY3Rpb24o
-YSl7cmV0dXJuIG5ldyBQLnViKGEpfSwKU1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmRzKGEpfSwK
-UFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmxqKGEpfSwKYTQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
-dyBQLlVWKGEpfSwKcnI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgUC5hRShhLGIsYyl9LApkSDpm
-dW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzPUguVk0oW10sZC5DKCJqZDwwPiIpKQpDLk5tLnNBKHMsYSkK
-Zm9yKHQ9MDt0PGE7Kyt0KUMuTm0uWShzLHQsYi4kMSh0KSkKcmV0dXJuIHN9LApoSzpmdW5jdGlvbihh
-KXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsLGQ9YS5sZW5ndGgKaWYoZD49
-NSl7dD0oKEouUXooYSw0KV41OCkqM3xDLnhCLlcoYSwwKV4xMDB8Qy54Qi5XKGEsMSleOTd8Qy54Qi5X
-KGEsMileMTE2fEMueEIuVyhhLDMpXjk3KT4+PjAKaWYodD09PTApcmV0dXJuIFAuS0QoZDxkP0MueEIu
-TmooYSwwLGQpOmEsNSxlKS5nbFIoKQplbHNlIGlmKHQ9PT0zMilyZXR1cm4gUC5LRChDLnhCLk5qKGEs
-NSxkKSwwLGUpLmdsUigpfXM9bmV3IEFycmF5KDgpCnMuZml4ZWQkbGVuZ3RoPUFycmF5CnI9SC5WTShz
-LHUudCkKQy5ObS5ZKHIsMCwwKQpDLk5tLlkociwxLC0xKQpDLk5tLlkociwyLC0xKQpDLk5tLlkociw3
-LC0xKQpDLk5tLlkociwzLDApCkMuTm0uWShyLDQsMCkKQy5ObS5ZKHIsNSxkKQpDLk5tLlkociw2LGQp
-CmlmKFAuVUIoYSwwLGQsMCxyKT49MTQpQy5ObS5ZKHIsNyxkKQpxPXJbMV0KaWYodHlwZW9mIHEhPT0i
-bnVtYmVyIilyZXR1cm4gcS50QigpCmlmKHE+PTApaWYoUC5VQihhLDAscSwyMCxyKT09PTIwKXJbN109
-cQpzPXJbMl0KaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5oKCkKcD1zKzEKbz1yWzNdCm49
-cls0XQptPXJbNV0KbD1yWzZdCmlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIGwuSigpCmlmKHR5
-cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFkobSkKaWYobDxtKW09bAppZih0eXBlb2YgbiE9PSJu
-dW1iZXIiKXJldHVybiBuLkooKQppZihuPHApbj1tCmVsc2UgaWYobjw9cSluPXErMQppZih0eXBlb2Yg
-byE9PSJudW1iZXIiKXJldHVybiBvLkooKQppZihvPHApbz1uCnM9cls3XQppZih0eXBlb2YgcyE9PSJu
-dW1iZXIiKXJldHVybiBzLkooKQprPXM8MAppZihrKWlmKHA+cSszKXtqPWUKaz0hMX1lbHNle3M9bz4w
-CmlmKHMmJm8rMT09PW4pe2o9ZQprPSExfWVsc2V7aWYoIShtPGQmJm09PT1uKzImJkoucTAoYSwiLi4i
-LG4pKSlpPW0+bisyJiZKLnEwKGEsIi8uLiIsbS0zKQplbHNlIGk9ITAKaWYoaSl7aj1lCms9ITF9ZWxz
-ZXtpZihxPT09NClpZihKLnEwKGEsImZpbGUiLDApKXtpZihwPD0wKXtpZighQy54Qi5RaShhLCIvIixu
-KSl7aD0iZmlsZTovLy8iCnQ9M31lbHNle2g9ImZpbGU6Ly8iCnQ9Mn1hPWgrQy54Qi5OaihhLG4sZCkK
-cS09MApzPXQtMAptKz1zCmwrPXMKZD1hLmxlbmd0aApwPTcKbz03Cm49N31lbHNlIGlmKG49PT1tKXtn
-PW0rMTsrK2wKYT1DLnhCLmk3KGEsbixtLCIvIik7KytkCm09Z31qPSJmaWxlIn1lbHNlIGlmKEMueEIu
-UWkoYSwiaHR0cCIsMCkpe2lmKHMmJm8rMz09PW4mJkMueEIuUWkoYSwiODAiLG8rMSkpe2Y9bi0zCm0t
-PTMKbC09MwphPUMueEIuaTcoYSxvLG4sIiIpCmQtPTMKbj1mfWo9Imh0dHAifWVsc2Ugaj1lCmVsc2Ug
-aWYocT09PTUmJkoucTAoYSwiaHR0cHMiLDApKXtpZihzJiZvKzQ9PT1uJiZKLnEwKGEsIjQ0MyIsbysx
-KSl7Zj1uLTQKbS09NApsLT00CmE9Si55UShhLG8sbiwiIikKZC09MwpuPWZ9aj0iaHR0cHMifWVsc2Ug
-aj1lCms9ITB9fX1lbHNlIGo9ZQppZihrKXtzPWEubGVuZ3RoCmlmKGQ8cyl7YT1KLmxkKGEsMCxkKQpx
-LT0wCnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1yZXR1cm4gbmV3IFAuVWYoYSxxLHAsbyxuLG0sbCxq
-KX1yZXR1cm4gUC5qdihhLDAsZCxxLHAsbyxuLG0sbCxqKX0sCk10OmZ1bmN0aW9uKGEpe0gueShhKQpy
-ZXR1cm4gUC5rdShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWDpmdW5jdGlvbihhKXt2YXIgdD11Lk4K
-cmV0dXJuIEMuTm0uTjAoSC5WTShhLnNwbGl0KCImIiksdS5zKSxQLkZsKHQsdCksbmV3IFAubjEoQy54
-TSksdS5mKX0sCkhoOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwsbD0iSVB2
-NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIsaz0iZWFjaCBwYXJ0IG11c3Qg
-YmUgaW4gdGhlIHJhbmdlIDAuLjI1NSIsaj1uZXcgUC5jUyhhKSxpPW5ldyBVaW50OEFycmF5KDQpCmZv
-cih0PWkubGVuZ3RoLHM9YixyPXMscT0wO3M8YzsrK3Mpe3A9Qy54Qi5tKGEscykKaWYocCE9PTQ2KXtp
-ZigocF40OCk+OSlqLiQyKCJpbnZhbGlkIGNoYXJhY3RlciIscyl9ZWxzZXtpZihxPT09MylqLiQyKGws
-cykKbz1QLlFBKEMueEIuTmooYSxyLHMpLG0sbSkKaWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4g
-by5vcygpCmlmKG8+MjU1KWouJDIoayxyKQpuPXErMQppZihxPj10KXJldHVybiBILk9IKGkscSkKaVtx
-XT1vCnI9cysxCnE9bn19aWYocSE9PTMpai4kMihsLGMpCm89UC5RQShDLnhCLk5qKGEscixjKSxtLG0p
-CmlmKHR5cGVvZiBvIT09Im51bWJlciIpcmV0dXJuIG8ub3MoKQppZihvPjI1NSlqLiQyKGsscikKaWYo
-cT49dClyZXR1cm4gSC5PSChpLHEpCmlbcV09bwpyZXR1cm4gaX0sCmVnOmZ1bmN0aW9uKGEsYixhMCl7
-dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD1uZXcgUC5WQyhhKSxjPW5ldyBQLnRw
-KGQsYSkKaWYoYS5sZW5ndGg8MilkLiQxKCJhZGRyZXNzIGlzIHRvbyBzaG9ydCIpCnQ9SC5WTShbXSx1
-LnQpCmZvcihzPWIscj1zLHE9ITEscD0hMTtzPGEwOysrcyl7bz1DLnhCLm0oYSxzKQppZihvPT09NTgp
-e2lmKHM9PT1iKXsrK3MKaWYoQy54Qi5tKGEscykhPT01OClkLiQyKCJpbnZhbGlkIHN0YXJ0IGNvbG9u
-LiIscykKcj1zfWlmKHM9PT1yKXtpZihxKWQuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6OmAgaXMgYWxs
-b3dlZCIscykKQy5ObS5pKHQsLTEpCnE9ITB9ZWxzZSBDLk5tLmkodCxjLiQyKHIscykpCnI9cysxfWVs
-c2UgaWYobz09PTQ2KXA9ITB9aWYodC5sZW5ndGg9PT0wKWQuJDEoInRvbyBmZXcgcGFydHMiKQpuPXI9
-PT1hMAptPUMuTm0uZ3JaKHQpCmlmKG4mJm0hPT0tMSlkLiQyKCJleHBlY3RlZCBhIHBhcnQgYWZ0ZXIg
-bGFzdCBgOmAiLGEwKQppZighbilpZighcClDLk5tLmkodCxjLiQyKHIsYTApKQplbHNle2w9UC5IaChh
-LHIsYTApCkMuTm0uaSh0LChsWzBdPDw4fGxbMV0pPj4+MCkKQy5ObS5pKHQsKGxbMl08PDh8bFszXSk+
-Pj4wKX1pZihxKXtpZih0Lmxlbmd0aD43KWQuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJkIG11
-c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYodC5sZW5ndGghPT04KWQuJDEoImFuIGFk
-ZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMiKQprPW5l
-dyBVaW50OEFycmF5KDE2KQpmb3IobT10Lmxlbmd0aCxqPWsubGVuZ3RoLGk9OS1tLHM9MCxoPTA7czxt
-Oysrcyl7Zz10W3NdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsrK2Ype2lmKGg8MHx8aD49ailyZXR1cm4g
-SC5PSChrLGgpCmtbaF09MAplPWgrMQppZihlPj1qKXJldHVybiBILk9IKGssZSkKa1tlXT0wCmgrPTJ9
-ZWxzZXtlPUMuam4ud0coZyw4KQppZihoPDB8fGg+PWopcmV0dXJuIEguT0goayxoKQprW2hdPWUKZT1o
-KzEKaWYoZT49ailyZXR1cm4gSC5PSChrLGUpCmtbZV09ZyYyNTUKaCs9Mn19cmV0dXJuIGt9LApqdjpm
-dW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxqKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwKaWYoaj09
-bnVsbClpZihkPmIpaj1QLlBpKGEsYixkKQplbHNle2lmKGQ9PT1iKVAuUjMoYSxiLCJJbnZhbGlkIGVt
-cHR5IHNjaGVtZSIpCmo9IiJ9aWYoZT5iKXt0PWQrMwpzPXQ8ZT9QLnpSKGEsdCxlLTEpOiIiCnI9UC5P
-ZShhLGUsZiwhMSkKaWYodHlwZW9mIGYhPT0ibnVtYmVyIilyZXR1cm4gZi5oKCkKcT1mKzEKaWYodHlw
-ZW9mIGchPT0ibnVtYmVyIilyZXR1cm4gSC5wWShnKQpwPXE8Zz9QLndCKFAuUUEoSi5sZChhLHEsZyks
-bmV3IFAuZTEoYSxmKSxtKSxqKTptfWVsc2V7cD1tCnI9cApzPSIifW89UC5rYShhLGcsaCxtLGosciE9
-bnVsbCkKaWYodHlwZW9mIGghPT0ibnVtYmVyIilyZXR1cm4gaC5KKCkKbj1oPGk/UC5sZShhLGgrMSxp
-LG0pOm0KcmV0dXJuIG5ldyBQLkRuKGoscyxyLHAsbyxuLGk8Yz9QLnRHKGEsaSsxLGMpOm0pfSwKd0s6
-ZnVuY3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAKaWYoYT09PSJodHRwcyIpcmV0dXJuIDQ0
-MwpyZXR1cm4gMH0sClIzOmZ1bmN0aW9uKGEsYixjKXt0aHJvdyBILmIoUC5ycihjLGEsYikpfSwKa0U6
-ZnVuY3Rpb24oYSxiKXtDLk5tLksoYSxuZXcgUC5OWSghMSkpfSwKSE46ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0LHMscgpmb3IodD1ILnFDKGEsYyxudWxsLEgudDYoYSkuZCksdD1uZXcgSC5hNyh0LHQuZ0EodCks
-dC4kdGkuQygiYTc8YUwuRT4iKSk7dC5GKCk7KXtzPXQuZApyPVAubnUoJ1siKi86PD4/XFxcXHxdJykK
-cy50b1N0cmluZwppZihILm0yKHMsciwwKSl7dD1QLkw0KCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRo
-OiAiK3MpCnRocm93IEguYih0KX19fSwKcmc6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZighKDY1PD1hJiZh
-PD05MCkpdD05Nzw9YSYmYTw9MTIyCmVsc2UgdD0hMAppZih0KXJldHVybgp0PVAuTDQoIklsbGVnYWwg
-ZHJpdmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHQpfSwKd0I6ZnVuY3Rpb24oYSxiKXtpZihh
-IT1udWxsJiZhPT09UC53SyhiKSlyZXR1cm4KcmV0dXJuIGF9LApPZTpmdW5jdGlvbihhLGIsYyxkKXt2
-YXIgdCxzLHIscSxwLG8KaWYoYT09bnVsbClyZXR1cm4KaWYoYj09PWMpcmV0dXJuIiIKaWYoQy54Qi5t
-KGEsYik9PT05MSl7aWYodHlwZW9mIGMhPT0ibnVtYmVyIilyZXR1cm4gYy5ITigpCnQ9Yy0xCmlmKEMu
-eEIubShhLHQpIT09OTMpUC5SMyhhLGIsIk1pc3NpbmcgZW5kIGBdYCB0byBtYXRjaCBgW2AgaW4gaG9z
-dCIpCnM9YisxCnI9UC50byhhLHMsdCkKaWYodHlwZW9mIHIhPT0ibnVtYmVyIilyZXR1cm4gci5KKCkK
-aWYocjx0KXtxPXIrMQpwPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixxKT9yKzM6cSx0LCIlMjUiKX1lbHNl
-IHA9IiIKUC5lZyhhLHMscikKcmV0dXJuIEMueEIuTmooYSxiLHIpLnRvTG93ZXJDYXNlKCkrcCsiXSJ9
-aWYodHlwZW9mIGMhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShjKQpvPWIKZm9yKDtvPGM7KytvKWlmKEMu
-eEIubShhLG8pPT09NTgpe3I9Qy54Qi5YVShhLCIlIixiKQppZighKHI+PWImJnI8Yykpcj1jCmlmKHI8
-Yyl7cT1yKzEKcD1QLk9BKGEsQy54Qi5RaShhLCIyNSIscSk/ciszOnEsYywiJTI1Iil9ZWxzZSBwPSIi
-ClAuZWcoYSxiLHIpCnJldHVybiJbIitDLnhCLk5qKGEsYixyKStwKyJdIn1yZXR1cm4gUC5PTChhLGIs
-Yyl9LAp0bzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1DLnhCLlhVKGEsIiUiLGIpCmlmKHM+PWIpe2lm
-KHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIEgucFkoYykKdD1zPGN9ZWxzZSB0PSExCnJldHVybiB0
-P3M6Y30sCk9BOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrPWQhPT0iIj9u
-ZXcgUC5SbihkKTpudWxsCmlmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIEgucFkoYykKdD1iCnM9
-dApyPSEwCmZvcig7dDxjOyl7cT1DLnhCLm0oYSx0KQppZihxPT09Mzcpe3A9UC5ydihhLHQsITApCm89
-cD09bnVsbAppZihvJiZyKXt0Kz0zCmNvbnRpbnVlfWlmKGs9PW51bGwpaz1uZXcgUC5SbigiIikKbj1r
-LmErPUMueEIuTmooYSxzLHQpCmlmKG8pcD1DLnhCLk5qKGEsdCx0KzMpCmVsc2UgaWYocD09PSIlIilQ
-LlIzKGEsdCwiWm9uZUlEIHNob3VsZCBub3QgY29udGFpbiAlIGFueW1vcmUiKQprLmE9bitwCnQrPTMK
-cz10CnI9ITB9ZWxzZXtpZihxPDEyNyl7bz1xPj4+NAppZihvPj04KXJldHVybiBILk9IKEMuRjMsbykK
-bz0oQy5GM1tvXSYxPDwocSYxNSkpIT09MH1lbHNlIG89ITEKaWYobyl7aWYociYmNjU8PXEmJjkwPj1x
-KXtpZihrPT1udWxsKWs9bmV3IFAuUm4oIiIpCmlmKHM8dCl7ay5hKz1DLnhCLk5qKGEscyx0KQpzPXR9
-cj0hMX0rK3R9ZWxzZXtpZigocSY2NDUxMik9PT01NTI5NiYmdCsxPGMpe209Qy54Qi5tKGEsdCsxKQpp
-ZigobSY2NDUxMik9PT01NjMyMCl7cT02NTUzNnwocSYxMDIzKTw8MTB8bSYxMDIzCmw9Mn1lbHNlIGw9
-MX1lbHNlIGw9MQppZihrPT1udWxsKWs9bmV3IFAuUm4oIiIpCmsuYSs9Qy54Qi5OaihhLHMsdCkKay5h
-Kz1QLkhIKHEpCnQrPWwKcz10fX19aWYoaz09bnVsbClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYoczxj
-KWsuYSs9Qy54Qi5OaihhLHMsYykKbz1rLmEKcmV0dXJuIG8uY2hhckNvZGVBdCgwKT09MD9vOm99LApP
-TDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssagppZih0eXBlb2YgYyE9PSJu
-dW1iZXIiKXJldHVybiBILnBZKGMpCnQ9YgpzPXQKcj1udWxsCnE9ITAKZm9yKDt0PGM7KXtwPUMueEIu
-bShhLHQpCmlmKHA9PT0zNyl7bz1QLnJ2KGEsdCwhMCkKbj1vPT1udWxsCmlmKG4mJnEpe3QrPTMKY29u
-dGludWV9aWYocj09bnVsbClyPW5ldyBQLlJuKCIiKQptPUMueEIuTmooYSxzLHQpCmw9ci5hKz0hcT9t
-LnRvTG93ZXJDYXNlKCk6bQppZihuKXtvPUMueEIuTmooYSx0LHQrMykKaz0zfWVsc2UgaWYobz09PSIl
-Iil7bz0iJTI1IgprPTF9ZWxzZSBrPTMKci5hPWwrbwp0Kz1rCnM9dApxPSEwfWVsc2V7aWYocDwxMjcp
-e249cD4+PjQKaWYobj49OClyZXR1cm4gSC5PSChDLmVhLG4pCm49KEMuZWFbbl0mMTw8KHAmMTUpKSE9
-PTB9ZWxzZSBuPSExCmlmKG4pe2lmKHEmJjY1PD1wJiY5MD49cCl7aWYocj09bnVsbClyPW5ldyBQLlJu
-KCIiKQppZihzPHQpe3IuYSs9Qy54Qi5OaihhLHMsdCkKcz10fXE9ITF9Kyt0fWVsc2V7aWYocDw9OTMp
-e249cD4+PjQKaWYobj49OClyZXR1cm4gSC5PSChDLmFrLG4pCm49KEMuYWtbbl0mMTw8KHAmMTUpKSE9
-PTB9ZWxzZSBuPSExCmlmKG4pUC5SMyhhLHQsIkludmFsaWQgY2hhcmFjdGVyIikKZWxzZXtpZigocCY2
-NDUxMik9PT01NTI5NiYmdCsxPGMpe2o9Qy54Qi5tKGEsdCsxKQppZigoaiY2NDUxMik9PT01NjMyMCl7
-cD02NTUzNnwocCYxMDIzKTw8MTB8aiYxMDIzCms9Mn1lbHNlIGs9MX1lbHNlIGs9MQppZihyPT1udWxs
-KXI9bmV3IFAuUm4oIiIpCm09Qy54Qi5OaihhLHMsdCkKci5hKz0hcT9tLnRvTG93ZXJDYXNlKCk6bQpy
-LmErPVAuSEgocCkKdCs9awpzPXR9fX19aWYocj09bnVsbClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYo
-czxjKXttPUMueEIuTmooYSxzLGMpCnIuYSs9IXE/bS50b0xvd2VyQ2FzZSgpOm19bj1yLmEKcmV0dXJu
-IG4uY2hhckNvZGVBdCgwKT09MD9uOm59LApQaTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEKaWYo
-Yj09PWMpcmV0dXJuIiIKaWYoIVAuRXQoSi5yWShhKS5XKGEsYikpKVAuUjMoYSxiLCJTY2hlbWUgbm90
-IHN0YXJ0aW5nIHdpdGggYWxwaGFiZXRpYyBjaGFyYWN0ZXIiKQpmb3IodD1iLHM9ITE7dDxjOysrdCl7
-cj1DLnhCLlcoYSx0KQppZihyPDEyOCl7cT1yPj4+NAppZihxPj04KXJldHVybiBILk9IKEMubUsscSkK
-cT0oQy5tS1txXSYxPDwociYxNSkpIT09MH1lbHNlIHE9ITEKaWYoIXEpUC5SMyhhLHQsIklsbGVnYWwg
-c2NoZW1lIGNoYXJhY3RlciIpCmlmKDY1PD1yJiZyPD05MClzPSEwfWE9Qy54Qi5OaihhLGIsYykKcmV0
-dXJuIFAuWWEocz9hLnRvTG93ZXJDYXNlKCk6YSl9LApZYTpmdW5jdGlvbihhKXtpZihhPT09Imh0dHAi
-KXJldHVybiJodHRwIgppZihhPT09ImZpbGUiKXJldHVybiJmaWxlIgppZihhPT09Imh0dHBzIilyZXR1
-cm4iaHR0cHMiCmlmKGE9PT0icGFja2FnZSIpcmV0dXJuInBhY2thZ2UiCnJldHVybiBhfSwKelI6ZnVu
-Y3Rpb24oYSxiLGMpe2lmKGE9PW51bGwpcmV0dXJuIiIKcmV0dXJuIFAudU8oYSxiLGMsQy50bywhMSl9
-LAprYTpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIHQscz1lPT09ImZpbGUiLHI9c3x8ZixxPWE9PW51
-bGwKaWYocSYmITApcmV0dXJuIHM/Ii8iOiIiCnQ9IXE/UC51TyhhLGIsYyxDLldkLCEwKTpDLmpOLkUy
-KGQsbmV3IFAuUlooKSx1Lk4pLkgoMCwiLyIpCmlmKHQubGVuZ3RoPT09MCl7aWYocylyZXR1cm4iLyJ9
-ZWxzZSBpZihyJiYhQy54Qi5uKHQsIi8iKSl0PSIvIit0CnJldHVybiBQLkpyKHQsZSxmKX0sCkpyOmZ1
-bmN0aW9uKGEsYixjKXt2YXIgdD1iLmxlbmd0aD09PTAKaWYodCYmIWMmJiFDLnhCLm4oYSwiLyIpKXJl
-dHVybiBQLndGKGEsIXR8fGMpCnJldHVybiBQLnhlKGEpfSwKbGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
-IHQscz17fQppZihhIT1udWxsKXtpZihkIT1udWxsKXRocm93IEguYihQLnhZKCJCb3RoIHF1ZXJ5IGFu
-ZCBxdWVyeVBhcmFtZXRlcnMgc3BlY2lmaWVkIikpCnJldHVybiBQLnVPKGEsYixjLEMuVkMsITApfWlm
-KGQ9PW51bGwpcmV0dXJuCnQ9bmV3IFAuUm4oIiIpCnMuYT0iIgpkLksoMCxuZXcgUC55NShuZXcgUC5N
-RShzLHQpKSkKcz10LmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAp0RzpmdW5jdGlvbihh
-LGIsYyl7aWYoYT09bnVsbClyZXR1cm4KcmV0dXJuIFAudU8oYSxiLGMsQy5WQywhMCl9LApydjpmdW5j
-dGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvPWIrMgppZihvPj1hLmxlbmd0aClyZXR1cm4iJSIKdD1D
-LnhCLm0oYSxiKzEpCnM9Qy54Qi5tKGEsbykKcj1ILm9vKHQpCnE9SC5vbyhzKQppZihyPDB8fHE8MCly
-ZXR1cm4iJSIKcD1yKjE2K3EKaWYocDwxMjcpe289Qy5qbi53RyhwLDQpCmlmKG8+PTgpcmV0dXJuIEgu
-T0goQy5GMyxvKQpvPShDLkYzW29dJjE8PChwJjE1KSkhPT0wfWVsc2Ugbz0hMQppZihvKXJldHVybiBI
-Lkx3KGMmJjY1PD1wJiY5MD49cD8ocHwzMik+Pj4wOnApCmlmKHQ+PTk3fHxzPj05NylyZXR1cm4gQy54
-Qi5OaihhLGIsYiszKS50b1VwcGVyQ2FzZSgpCnJldHVybn0sCkhIOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
-cixxLHAsbyxuPSIwMTIzNDU2Nzg5QUJDREVGIgppZihhPDEyOCl7dD1uZXcgQXJyYXkoMykKdC5maXhl
-ZCRsZW5ndGg9QXJyYXkKcz1ILlZNKHQsdS50KQpDLk5tLlkocywwLDM3KQpDLk5tLlkocywxLEMueEIu
-VyhuLGE+Pj40KSkKQy5ObS5ZKHMsMixDLnhCLlcobixhJjE1KSl9ZWxzZXtpZihhPjIwNDcpaWYoYT42
-NTUzNSl7cj0yNDAKcT00fWVsc2V7cj0yMjQKcT0zfWVsc2V7cj0xOTIKcT0yfXQ9bmV3IEFycmF5KDMq
-cSkKdC5maXhlZCRsZW5ndGg9QXJyYXkKcz1ILlZNKHQsdS50KQpmb3IocD0wOy0tcSxxPj0wO3I9MTI4
-KXtvPUMuam4uYmYoYSw2KnEpJjYzfHIKQy5ObS5ZKHMscCwzNykKQy5ObS5ZKHMscCsxLEMueEIuVyhu
-LG8+Pj40KSkKQy5ObS5ZKHMscCsyLEMueEIuVyhuLG8mMTUpKQpwKz0zfX1yZXR1cm4gUC5ITShzLDAs
-bnVsbCl9LAp1TzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0PVAuVWwoYSxiLGMsZCxlKQpyZXR1cm4g
-dD09bnVsbD9DLnhCLk5qKGEsYixjKTp0fSwKVWw6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIs
-cSxwLG89IWUsbj1iLG09bixsPW51bGwKd2hpbGUoITApe2lmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0
-dXJuIG4uSigpCmlmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIEgucFkoYykKaWYoIShuPGMpKWJy
-ZWFrCmMkMDp7dD1DLnhCLm0oYSxuKQppZih0PDEyNyl7cz10Pj4+NAppZihzPj04KXJldHVybiBILk9I
-KGQscykKcz0oZFtzXSYxPDwodCYxNSkpIT09MH1lbHNlIHM9ITEKaWYocykrK24KZWxzZXtpZih0PT09
-Mzcpe3I9UC5ydihhLG4sITEpCmlmKHI9PW51bGwpe24rPTMKYnJlYWsgYyQwfWlmKCIlIj09PXIpe3I9
-IiUyNSIKcT0xfWVsc2UgcT0zfWVsc2V7aWYobylpZih0PD05Myl7cz10Pj4+NAppZihzPj04KXJldHVy
-biBILk9IKEMuYWsscykKcz0oQy5ha1tzXSYxPDwodCYxNSkpIT09MH1lbHNlIHM9ITEKZWxzZSBzPSEx
-CmlmKHMpe1AuUjMoYSxuLCJJbnZhbGlkIGNoYXJhY3RlciIpCnI9bnVsbApxPW51bGx9ZWxzZXtpZigo
-dCY2NDUxMik9PT01NTI5Nil7cz1uKzEKaWYoczxjKXtwPUMueEIubShhLHMpCmlmKChwJjY0NTEyKT09
-PTU2MzIwKXt0PTY1NTM2fCh0JjEwMjMpPDwxMHxwJjEwMjMKcT0yfWVsc2UgcT0xfWVsc2UgcT0xfWVs
-c2UgcT0xCnI9UC5ISCh0KX19aWYobD09bnVsbClsPW5ldyBQLlJuKCIiKQpsLmErPUMueEIuTmooYSxt
-LG4pCmwuYSs9SC5kKHIpCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJuIEgucFkocSkKbis9cQpt
-PW59fX1pZihsPT1udWxsKXJldHVybgppZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBtLkooKQpp
-ZihtPGMpbC5hKz1DLnhCLk5qKGEsbSxjKQpvPWwuYQpyZXR1cm4gby5jaGFyQ29kZUF0KDApPT0wP286
-b30sCnlCOmZ1bmN0aW9uKGEpe2lmKEMueEIubihhLCIuIikpcmV0dXJuITAKcmV0dXJuIEMueEIuT1ko
-YSwiLy4iKSE9PS0xfSwKeGU6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4KaWYoIVAueUIoYSkp
-cmV0dXJuIGEKdD1ILlZNKFtdLHUucykKZm9yKHM9YS5zcGxpdCgiLyIpLHI9cy5sZW5ndGgscT0hMSxw
-PTA7cDxyOysrcCl7bz1zW3BdCmlmKEouUk0obywiLi4iKSl7bj10Lmxlbmd0aAppZihuIT09MCl7aWYo
-MD49bilyZXR1cm4gSC5PSCh0LC0xKQp0LnBvcCgpCmlmKHQubGVuZ3RoPT09MClDLk5tLmkodCwiIil9
-cT0hMH1lbHNlIGlmKCIuIj09PW8pcT0hMAplbHNle0MuTm0uaSh0LG8pCnE9ITF9fWlmKHEpQy5ObS5p
-KHQsIiIpCnJldHVybiBDLk5tLkgodCwiLyIpfSwKd0Y6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxw
-LG8KaWYoIVAueUIoYSkpcmV0dXJuIWI/UC5DMShhKTphCnQ9SC5WTShbXSx1LnMpCmZvcihzPWEuc3Bs
-aXQoIi8iKSxyPXMubGVuZ3RoLHE9ITEscD0wO3A8cjsrK3Ape289c1twXQppZigiLi4iPT09bylpZih0
-Lmxlbmd0aCE9PTAmJkMuTm0uZ3JaKHQpIT09Ii4uIil7aWYoMD49dC5sZW5ndGgpcmV0dXJuIEguT0go
-dCwtMSkKdC5wb3AoKQpxPSEwfWVsc2V7Qy5ObS5pKHQsIi4uIikKcT0hMX1lbHNlIGlmKCIuIj09PW8p
-cT0hMAplbHNle0MuTm0uaSh0LG8pCnE9ITF9fXM9dC5sZW5ndGgKaWYocyE9PTApaWYocz09PTEpe2lm
-KDA+PXMpcmV0dXJuIEguT0godCwwKQpzPXRbMF0ubGVuZ3RoPT09MH1lbHNlIHM9ITEKZWxzZSBzPSEw
-CmlmKHMpcmV0dXJuIi4vIgppZihxfHxDLk5tLmdyWih0KT09PSIuLiIpQy5ObS5pKHQsIiIpCmlmKCFi
-KXtpZigwPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LDApCkMuTm0uWSh0LDAsUC5DMSh0WzBdKSl9cmV0
-dXJuIEMuTm0uSCh0LCIvIil9LApDMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLmxlbmd0aAppZihx
-Pj0yJiZQLkV0KEouUXooYSwwKSkpZm9yKHQ9MTt0PHE7Kyt0KXtzPUMueEIuVyhhLHQpCmlmKHM9PT01
-OClyZXR1cm4gQy54Qi5OaihhLDAsdCkrIiUzQSIrQy54Qi5HKGEsdCsxKQppZihzPD0xMjcpe3I9cz4+
-PjQKaWYocj49OClyZXR1cm4gSC5PSChDLm1LLHIpCnI9KEMubUtbcl0mMTw8KHMmMTUpKT09PTB9ZWxz
-ZSByPSEwCmlmKHIpYnJlYWt9cmV0dXJuIGF9LAptbjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLmdG
-aigpLHA9cS5sZW5ndGgKaWYocD4wJiZKLkhtKHFbMF0pPT09MiYmSi5hNihxWzBdLDEpPT09NTgpe2lm
-KDA+PXApcmV0dXJuIEguT0gocSwwKQpQLnJnKEouYTYocVswXSwwKSwhMSkKUC5ITihxLCExLDEpCnQ9
-ITB9ZWxzZXtQLkhOKHEsITEsMCkKdD0hMX1zPWEuZ3RUKCkmJiF0PyJcXCI6IiIKaWYoYS5nY2ooKSl7
-cj1hLmdKZihhKQppZihyLmxlbmd0aCE9PTApcz1zKyJcXCIrcisiXFwifXM9UC52ZyhzLHEsIlxcIikK
-cD10JiZwPT09MT9zKyJcXCI6cwpyZXR1cm4gcC5jaGFyQ29kZUF0KDApPT0wP3A6cH0sCkloOmZ1bmN0
-aW9uKGEsYil7dmFyIHQscyxyCmZvcih0PTAscz0wO3M8MjsrK3Mpe3I9Qy54Qi5XKGEsYitzKQppZig0
-ODw9ciYmcjw9NTcpdD10KjE2K3ItNDgKZWxzZXtyfD0zMgppZig5Nzw9ciYmcjw9MTAyKXQ9dCoxNity
-LTg3CmVsc2UgdGhyb3cgSC5iKFAueFkoIkludmFsaWQgVVJMIGVuY29kaW5nIikpfX1yZXR1cm4gdH0s
-Cmt1OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyLHEscD1KLnJZKGEpLG89Ygp3aGlsZSghMCl7
-aWYoIShvPGMpKXt0PSEwCmJyZWFrfXM9cC5XKGEsbykKaWYoczw9MTI3KWlmKHMhPT0zNylyPWUmJnM9
-PT00MwplbHNlIHI9ITAKZWxzZSByPSEwCmlmKHIpe3Q9ITEKYnJlYWt9KytvfWlmKHQpe2lmKEMueE0h
-PT1kKXI9ITEKZWxzZSByPSEwCmlmKHIpcmV0dXJuIHAuTmooYSxiLGMpCmVsc2UgcT1uZXcgSC5xaihw
-Lk5qKGEsYixjKSl9ZWxzZXtxPUguVk0oW10sdS50KQpmb3Iobz1iO288YzsrK28pe3M9cC5XKGEsbykK
-aWYocz4xMjcpdGhyb3cgSC5iKFAueFkoIklsbGVnYWwgcGVyY2VudCBlbmNvZGluZyBpbiBVUkkiKSkK
-aWYocz09PTM3KXtpZihvKzM+YS5sZW5ndGgpdGhyb3cgSC5iKFAueFkoIlRydW5jYXRlZCBVUkkiKSkK
-Qy5ObS5pKHEsUC5JaChhLG8rMSkpCm8rPTJ9ZWxzZSBpZihlJiZzPT09NDMpQy5ObS5pKHEsMzIpCmVs
-c2UgQy5ObS5pKHEscyl9fXUuTC5iKHEpCnJldHVybiBuZXcgUC5HWSghMSkuV0oocSl9LApFdDpmdW5j
-dGlvbihhKXt2YXIgdD1hfDMyCnJldHVybiA5Nzw9dCYmdDw9MTIyfSwKS0Q6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciB0LHMscixxLHAsbyxuLG0sbD0iSW52YWxpZCBNSU1FIHR5cGUiLGs9SC5WTShbYi0xXSx1LnQp
-CmZvcih0PWEubGVuZ3RoLHM9YixyPS0xLHE9bnVsbDtzPHQ7KytzKXtxPUMueEIuVyhhLHMpCmlmKHE9
-PT00NHx8cT09PTU5KWJyZWFrCmlmKHE9PT00Nyl7aWYocjwwKXtyPXMKY29udGludWV9dGhyb3cgSC5i
-KFAucnIobCxhLHMpKX19aWYocjwwJiZzPmIpdGhyb3cgSC5iKFAucnIobCxhLHMpKQpmb3IoO3EhPT00
-NDspe0MuTm0uaShrLHMpOysrcwpmb3IocD0tMTtzPHQ7KytzKXtxPUMueEIuVyhhLHMpCmlmKHE9PT02
-MSl7aWYocDwwKXA9c31lbHNlIGlmKHE9PT01OXx8cT09PTQ0KWJyZWFrfWlmKHA+PTApQy5ObS5pKGss
-cCkKZWxzZXtvPUMuTm0uZ3JaKGspCmlmKHEhPT00NHx8cyE9PW8rN3x8IUMueEIuUWkoYSwiYmFzZTY0
-IixvKzEpKXRocm93IEguYihQLnJyKCJFeHBlY3RpbmcgJz0nIixhLHMpKQpicmVha319Qy5ObS5pKGss
-cykKbj1zKzEKaWYoKGsubGVuZ3RoJjEpPT09MSlhPUMuaDkueXIoYSxuLHQpCmVsc2V7bT1QLlVsKGEs
-bix0LEMuVkMsITApCmlmKG0hPW51bGwpYT1DLnhCLmk3KGEsbix0LG0pfXJldHVybiBuZXcgUC5QRShh
-LGssYyl9LAp1eDpmdW5jdGlvbigpe3ZhciB0PSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RV
-VldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0uX34hJCYnKCkqKyw7PSIscz0iLiIscj0iOiIs
-cT0iLyIscD0iPyIsbz0iIyIsbj11LmdjLG09UC5kSCgyMixuZXcgUC5xMygpLCEwLG4pLGw9bmV3IFAu
-eUkobSksaz1uZXcgUC5jNigpLGo9bmV3IFAucWQoKSxpPW4uYihsLiQyKDAsMjI1KSkKay4kMyhpLHQs
-MSkKay4kMyhpLHMsMTQpCmsuJDMoaSxyLDM0KQprLiQzKGkscSwzKQprLiQzKGkscCwxNzIpCmsuJDMo
-aSxvLDIwNSkKaT1uLmIobC4kMigxNCwyMjUpKQprLiQzKGksdCwxKQprLiQzKGkscywxNSkKay4kMyhp
-LHIsMzQpCmsuJDMoaSxxLDIzNCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIo
-MTUsMjI1KSkKay4kMyhpLHQsMSkKay4kMyhpLCIlIiwyMjUpCmsuJDMoaSxyLDM0KQprLiQzKGkscSw5
-KQprLiQzKGkscCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1uLmIobC4kMigxLDIyNSkpCmsuJDMoaSx0LDEp
-CmsuJDMoaSxyLDM0KQprLiQzKGkscSwxMCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5i
-KGwuJDIoMiwyMzUpKQprLiQzKGksdCwxMzkpCmsuJDMoaSxxLDEzMSkKay4kMyhpLHMsMTQ2KQprLiQz
-KGkscCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1uLmIobC4kMigzLDIzNSkpCmsuJDMoaSx0LDExKQprLiQz
-KGkscSw2OCkKay4kMyhpLHMsMTgpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQy
-KDQsMjI5KSkKay4kMyhpLHQsNSkKai4kMyhpLCJBWiIsMjI5KQprLiQzKGksciwxMDIpCmsuJDMoaSwi
-QCIsNjgpCmsuJDMoaSwiWyIsMjMyKQprLiQzKGkscSwxMzgpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8s
-MjA1KQppPW4uYihsLiQyKDUsMjI5KSkKay4kMyhpLHQsNSkKai4kMyhpLCJBWiIsMjI5KQprLiQzKGks
-ciwxMDIpCmsuJDMoaSwiQCIsNjgpCmsuJDMoaSxxLDEzOCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywy
-MDUpCmk9bi5iKGwuJDIoNiwyMzEpKQpqLiQzKGksIjE5Iiw3KQprLiQzKGksIkAiLDY4KQprLiQzKGks
-cSwxMzgpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDcsMjMxKSkKai4kMyhp
-LCIwOSIsNykKay4kMyhpLCJAIiw2OCkKay4kMyhpLHEsMTM4KQprLiQzKGkscCwxNzIpCmsuJDMoaSxv
-LDIwNSkKay4kMyhuLmIobC4kMig4LDgpKSwiXSIsNSkKaT1uLmIobC4kMig5LDIzNSkpCmsuJDMoaSx0
-LDExKQprLiQzKGkscywxNikKay4kMyhpLHEsMjM0KQprLiQzKGkscCwxNzIpCmsuJDMoaSxvLDIwNSkK
-aT1uLmIobC4kMigxNiwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTcpCmsuJDMoaSxxLDIzNCkK
-ay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTcsMjM1KSkKay4kMyhpLHQsMTEp
-CmsuJDMoaSxxLDkpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDEwLDIzNSkp
-CmsuJDMoaSx0LDExKQprLiQzKGkscywxOCkKay4kMyhpLHEsMjM0KQprLiQzKGkscCwxNzIpCmsuJDMo
-aSxvLDIwNSkKaT1uLmIobC4kMigxOCwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTkpCmsuJDMo
-aSxxLDIzNCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTksMjM1KSkKay4k
-MyhpLHQsMTEpCmsuJDMoaSxxLDIzNCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwu
-JDIoMTEsMjM1KSkKay4kMyhpLHQsMTEpCmsuJDMoaSxxLDEwKQprLiQzKGkscCwxNzIpCmsuJDMoaSxv
-LDIwNSkKaT1uLmIobC4kMigxMiwyMzYpKQprLiQzKGksdCwxMikKay4kMyhpLHAsMTIpCmsuJDMoaSxv
-LDIwNSkKaT1uLmIobC4kMigxMywyMzcpKQprLiQzKGksdCwxMykKay4kMyhpLHAsMTMpCmouJDMobi5i
-KGwuJDIoMjAsMjQ1KSksImF6IiwyMSkKbD1uLmIobC4kMigyMSwyNDUpKQpqLiQzKGwsImF6IiwyMSkK
-ai4kMyhsLCIwOSIsMjEpCmsuJDMobCwiKy0uIiwyMSkKcmV0dXJuIG19LApVQjpmdW5jdGlvbihhLGIs
-YyxkLGUpe3ZhciB0LHMscixxLHAsbz0kLnZaKCkKZm9yKHQ9Si5yWShhKSxzPWI7czxjOysrcyl7aWYo
-ZDwwfHxkPj1vLmxlbmd0aClyZXR1cm4gSC5PSChvLGQpCnI9b1tkXQpxPXQuVyhhLHMpXjk2CmlmKHE+
-OTUpcT0zMQppZihxPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpkPXAmMzEKQy5ObS5Z
-KGUscD4+PjUscyl9cmV0dXJuIGR9LApXRjpmdW5jdGlvbiBXRihhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKYTI6ZnVuY3Rpb24gYTIoKXt9LAppUDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKQ1A6ZnVuY3Rpb24gQ1AoKXt9LApYUzpmdW5jdGlvbiBYUygpe30sCkM2OmZ1bmN0aW9uIEM2KGEp
-e3RoaXMuYT1hfSwKbjpmdW5jdGlvbiBuKCl7fSwKdTpmdW5jdGlvbiB1KGEsYixjLGQpe3ZhciBfPXRo
-aXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApiSjpmdW5jdGlvbiBiSihhLGIsYyxkLGUsZil7dmFy
-IF89dGhpcwpfLmU9YQpfLmY9YgpfLmE9YwpfLmI9ZApfLmM9ZQpfLmQ9Zn0sCmVZOmZ1bmN0aW9uIGVZ
-KGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmY9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCm1wOmZ1
-bmN0aW9uIG1wKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAp1Yjpm
-dW5jdGlvbiB1YihhKXt0aGlzLmE9YX0sCmRzOmZ1bmN0aW9uIGRzKGEpe3RoaXMuYT1hfSwKbGo6ZnVu
-Y3Rpb24gbGooYSl7dGhpcy5hPWF9LApVVjpmdW5jdGlvbiBVVihhKXt0aGlzLmE9YX0sCms1OmZ1bmN0
-aW9uIGs1KCl7fSwKS1k6ZnVuY3Rpb24gS1koKXt9LApjOmZ1bmN0aW9uIGMoYSl7dGhpcy5hPWF9LApD
-RDpmdW5jdGlvbiBDRChhKXt0aGlzLmE9YX0sCmFFOmZ1bmN0aW9uIGFFKGEsYixjKXt0aGlzLmE9YQp0
-aGlzLmI9Ygp0aGlzLmM9Y30sCkVIOmZ1bmN0aW9uIEVIKCl7fSwKS046ZnVuY3Rpb24gS04oKXt9LApj
-WDpmdW5jdGlvbiBjWCgpe30sCkFuOmZ1bmN0aW9uIEFuKCl7fSwKek06ZnVuY3Rpb24gek0oKXt9LApa
-MDpmdW5jdGlvbiBaMCgpe30sCmM4OmZ1bmN0aW9uIGM4KCl7fSwKRks6ZnVuY3Rpb24gRksoKXt9LApr
-OmZ1bmN0aW9uIGsoKXt9LApPZDpmdW5jdGlvbiBPZCgpe30sCmliOmZ1bmN0aW9uIGliKCl7fSwKeHU6
-ZnVuY3Rpb24geHUoKXt9LApHejpmdW5jdGlvbiBHeigpe30sCnFVOmZ1bmN0aW9uIHFVKCl7fSwKUm46
-ZnVuY3Rpb24gUm4oYSl7dGhpcy5hPWF9LApHRDpmdW5jdGlvbiBHRCgpe30sCm4xOmZ1bmN0aW9uIG4x
-KGEpe3RoaXMuYT1hfSwKY1M6ZnVuY3Rpb24gY1MoYSl7dGhpcy5hPWF9LApWQzpmdW5jdGlvbiBWQyhh
-KXt0aGlzLmE9YX0sCnRwOmZ1bmN0aW9uIHRwKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApEbjpmdW5j
-dGlvbiBEbihhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8u
-ZT1lCl8uZj1mCl8ucj1nCl8uUT1fLno9Xy55PV8ueD1udWxsfSwKZTE6ZnVuY3Rpb24gZTEoYSxiKXt0
-aGlzLmE9YQp0aGlzLmI9Yn0sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMuYT1hfSwKUlo6ZnVuY3Rpb24g
-UlooKXt9LApNRTpmdW5jdGlvbiBNRShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKeTU6ZnVuY3Rpb24g
-eTUoYSl7dGhpcy5hPWF9LApQRTpmdW5jdGlvbiBQRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
-cy5jPWN9LApxMzpmdW5jdGlvbiBxMygpe30sCnlJOmZ1bmN0aW9uIHlJKGEpe3RoaXMuYT1hfSwKYzY6
-ZnVuY3Rpb24gYzYoKXt9LApxZDpmdW5jdGlvbiBxZCgpe30sClVmOmZ1bmN0aW9uIFVmKGEsYixjLGQs
-ZSxmLGcsaCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9
-ZwpfLng9aApfLnk9bnVsbH0sCnFlOmZ1bmN0aW9uIHFlKGEsYixjLGQsZSxmLGcpe3ZhciBfPXRoaXMK
-Xy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy5RPV8uej1fLnk9Xy54PW51
-bGx9LAppSjpmdW5jdGlvbiBpSigpe30sCmxSOmZ1bmN0aW9uIGxSKGEsYil7dGhpcy5hPWEKdGhpcy5i
-PWJ9LApqZzpmdW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQmY6ZnVuY3Rpb24gQmYo
-YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFzOmZ1bmN0aW9uIEFzKCl7fSwKR0U6ZnVuY3Rpb24gR0Uo
-YSl7dGhpcy5hPWF9LApONzpmdW5jdGlvbiBONyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdVE6ZnVu
-Y3Rpb24gdVEoKXt9LApoRjpmdW5jdGlvbiBoRigpe30sClI0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0
-LHMscgpILnhkKGIpCnUuai5iKGQpCmlmKEgub1QoYikpe3Q9W2NdCkMuTm0uRlYodCxkKQpkPXR9cz11
-LnoKcj1QLkNIKEouTTEoZCxQLncwKCkscyksITAscykKdS5aLmIoYSkKcmV0dXJuIFAud1koSC5Fayhh
-LHIsbnVsbCkpfSwKRG06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CnRyeXtpZihPYmplY3QuaXNFeHRlbnNp
-YmxlKGEpJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpe09iamVjdC5k
-ZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOmN9KQpyZXR1cm4hMH19Y2F0Y2godCl7SC5SdSh0KX1yZXR1
-cm4hMX0sCk9tOmZ1bmN0aW9uKGEsYil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5j
-YWxsKGEsYikpcmV0dXJuIGFbYl0KcmV0dXJufSwKd1k6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbHx8dHlw
-ZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fEgubChhKSlyZXR1cm4gYQppZihhIGlu
-c3RhbmNlb2YgUC5FNClyZXR1cm4gYS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodS53LmMoYSkpcmV0
-dXJuIGEKaWYoYSBpbnN0YW5jZW9mIFAuaVApcmV0dXJuIEgubzIoYSkKaWYodS5aLmMoYSkpcmV0dXJu
-IFAuaEUoYSwiJGRhcnRfanNGdW5jdGlvbiIsbmV3IFAuUEMoKSkKcmV0dXJuIFAuaEUoYSwiXyRkYXJ0
-X2pzT2JqZWN0IixuZXcgUC5ZbSgkLmtJKCkpKX0sCmhFOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1QLk9t
-KGEsYikKaWYodD09bnVsbCl7dD1jLiQxKGEpClAuRG0oYSxiLHQpfXJldHVybiB0fSwKTDc6ZnVuY3Rp
-b24oYSl7dmFyIHQscwppZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVvZiBhPT0ibnVt
-YmVyInx8dHlwZW9mIGE9PSJib29sZWFuIilyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmpl
-Y3QmJkguUjkoYSkpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZ1LncuYyhhKSly
-ZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBEYXRlKXt0PUguU2MoYS5nZXRUaW1lKCkpCmlmKE1h
-dGguYWJzKHQpPD04NjRlMTMpcz0hMQplbHNlIHM9ITAKaWYocylILnZoKFAueFkoIkRhdGVUaW1lIGlz
-IG91dHNpZGUgdmFsaWQgcmFuZ2U6ICIrdCkpCnJldHVybiBuZXcgUC5pUCh0LCExKX1lbHNlIGlmKGEu
-Y29uc3RydWN0b3I9PT0kLmtJKCkpcmV0dXJuIGEubwplbHNlIHJldHVybiBQLk5EKGEpfSwKTkQ6ZnVu
-Y3Rpb24oYSl7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIFAuaVEoYSwkLncoKSxuZXcgUC5O
-eigpKQppZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAubnAoKSkK
-cmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAuVXQoKSl9LAppUTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9
-UC5PbShhLGIpCmlmKHQ9PW51bGx8fCEoYSBpbnN0YW5jZW9mIE9iamVjdCkpe3Q9Yy4kMShhKQpQLkRt
-KGEsYix0KX1yZXR1cm4gdH0sClBDOmZ1bmN0aW9uIFBDKCl7fSwKWW06ZnVuY3Rpb24gWW0oYSl7dGhp
-cy5hPWF9LApOejpmdW5jdGlvbiBOeigpe30sCm5wOmZ1bmN0aW9uIG5wKCl7fSwKVXQ6ZnVuY3Rpb24g
-VXQoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlzLmE9YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3RoaXMu
-YT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKY286ZnVuY3Rpb24g
-Y28oKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktlOmZ1bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwKZDU6
-ZnVuY3Rpb24gZDUoKXt9LApuNjpmdW5jdGlvbiBuNigpe319LFc9ewpVOTpmdW5jdGlvbihhLGIsYyl7
-dmFyIHQ9ZG9jdW1lbnQuYm9keSxzPSh0JiZDLlJZKS5yNih0LGEsYixjKQpzLnRvU3RyaW5nCnQ9dS5h
-Ywp0PW5ldyBILlU1KG5ldyBXLmU3KHMpLHQuQygiYTIobEQuRSkiKS5iKG5ldyBXLkN2KCkpLHQuQygi
-VTU8bEQuRT4iKSkKcmV0dXJuIHUuaC5iKHQuZ3I4KHQpKX0sCnJTOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
-cj0iZWxlbWVudCB0YWcgdW5hdmFpbGFibGUiCnRyeXt0PUouUkUoYSkKaWYodHlwZW9mIHQuZ25zKGEp
-PT0ic3RyaW5nIilyPXQuZ25zKGEpfWNhdGNoKHMpe0guUnUocyl9cmV0dXJuIHJ9LApxRDpmdW5jdGlv
-bihhLGIsYyl7dmFyIHQscyxyLHE9bmV3IFAudnMoJC5YMyx1LmFvKSxwPW5ldyBQLlpmKHEsdS5iaiks
-bz1uZXcgWE1MSHR0cFJlcXVlc3QoKQpDLkR0LmVvKG8sYj09bnVsbD8iR0VUIjpiLGEsITApCmMuSygw
-LG5ldyBXLmJVKG8pKQp0PXUuYW4Kcz10LmIobmV3IFcuaEgobyxwKSkKdS5NLmIobnVsbCkKcj11LnAK
-Vy5KRShvLCJsb2FkIixzLCExLHIpClcuSkUobywiZXJyb3IiLHQuYihwLmdZSigpKSwhMSxyKQpvLnNl
-bmQoKQpyZXR1cm4gcX0sCkMwOmZ1bmN0aW9uKGEsYil7YT01MzY4NzA5MTEmYStiCmE9NTM2ODcwOTEx
-JmErKCg1MjQyODcmYSk8PDEwKQpyZXR1cm4gYV5hPj4+Nn0sCnJFOmZ1bmN0aW9uKGEsYixjLGQpe3Zh
-ciB0PVcuQzAoVy5DMChXLkMwKFcuQzAoMCxhKSxiKSxjKSxkKSxzPTUzNjg3MDkxMSZ0KygoNjcxMDg4
-NjMmdCk8PDMpCnNePXM+Pj4xMQpyZXR1cm4gNTM2ODcwOTExJnMrKCgxNjM4MyZzKTw8MTUpfSwKVE46
-ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9YS5jbGFzc0xpc3QKZm9yKHQ9Yi5sZW5ndGgscz0wO3M8Yi5s
-ZW5ndGg7Yi5sZW5ndGg9PT10fHwoMCxILmxrKShiKSwrK3Mpci5hZGQoYltzXSl9LApKRTpmdW5jdGlv
-bihhLGIsYyxkLGUpe3ZhciB0PVcuYUYobmV3IFcudk4oYyksdS5CKQppZih0IT1udWxsJiYhMClKLmRa
-KGEsYix0LCExKQpyZXR1cm4gbmV3IFcueEMoYSxiLHQsITEsZS5DKCJ4QzwwPiIpKX0sClR3OmZ1bmN0
-aW9uKGEpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxzPW5ldyBXLm1rKHQsd2luZG93
-LmxvY2F0aW9uKQpzPW5ldyBXLkpRKHMpCnMuQ1koYSkKcmV0dXJuIHN9LAp5VzpmdW5jdGlvbihhLGIs
-YyxkKXt1LmguYihhKQpILnkoYikKSC55KGMpCnUuTy5iKGQpCnJldHVybiEwfSwKUVc6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHQscyxyCnUuaC5iKGEpCkgueShiKQpILnkoYykKdD11Lk8uYihkKS5hCnM9dC5h
-CnMuaHJlZj1jCnI9cy5ob3N0bmFtZQp0PXQuYgppZighKHI9PXQuaG9zdG5hbWUmJnMucG9ydD09dC5w
-b3J0JiZzLnByb3RvY29sPT10LnByb3RvY29sKSlpZihyPT09IiIpaWYocy5wb3J0PT09IiIpe3Q9cy5w
-cm90b2NvbAp0PXQ9PT0iOiJ8fHQ9PT0iIn1lbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMApyZXR1
-cm4gdH0sCkJsOmZ1bmN0aW9uKCl7dmFyIHQ9dS5OLHM9UC50TShDLlF4LHQpLHI9dS5kRy5iKG5ldyBX
-LklBKCkpLHE9SC5WTShbIlRFTVBMQVRFIl0sdS5zKQp0PW5ldyBXLmN0KHMsUC5Mcyh0KSxQLkxzKHQp
-LFAuTHModCksbnVsbCkKdC5DWShudWxsLG5ldyBILkE4KEMuUXgscix1LmR2KSxxLG51bGwpCnJldHVy
-biB0fSwKdVY6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4KcmV0dXJuIFcuUDEoYSl9LApxYzpm
-dW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxsKXJldHVybgppZigicG9zdE1lc3NhZ2UiIGluIGEpe3Q9
-Vy5QMShhKQpyZXR1cm4gdH1lbHNlIHJldHVybiB1LmFTLmIoYSl9LApQMTpmdW5jdGlvbihhKXtpZihh
-PT09d2luZG93KXJldHVybiB1LmNpLmIoYSkKZWxzZSByZXR1cm4gbmV3IFcuZFcoYSl9LAp6WDpmdW5j
-dGlvbihhKXtpZihhPT09d2luZG93LmxvY2F0aW9uKXJldHVybiBhCmVsc2UgcmV0dXJuIG5ldyBXLkZi
-KCl9LAphRjpmdW5jdGlvbihhLGIpe3ZhciB0PSQuWDMKaWYodD09PUMuTlUpcmV0dXJuIGEKcmV0dXJu
-IHQuUHkoYSxiKX0sCnFFOmZ1bmN0aW9uIHFFKCl7fSwKR2g6ZnVuY3Rpb24gR2goKXt9LApmWTpmdW5j
-dGlvbiBmWSgpe30sCm5COmZ1bmN0aW9uIG5CKCl7fSwKQXo6ZnVuY3Rpb24gQXooKXt9LApRUDpmdW5j
-dGlvbiBRUCgpe30sCm54OmZ1bmN0aW9uIG54KCl7fSwKb0o6ZnVuY3Rpb24gb0ooKXt9LAppZDpmdW5j
-dGlvbiBpZCgpe30sClFGOmZ1bmN0aW9uIFFGKCl7fSwKTmg6ZnVuY3Rpb24gTmgoKXt9LApJQjpmdW5j
-dGlvbiBJQigpe30sCm43OmZ1bmN0aW9uIG43KCl7fSwKd3o6ZnVuY3Rpb24gd3ooYSxiKXt0aGlzLmE9
-YQp0aGlzLiR0aT1ifSwKY3Y6ZnVuY3Rpb24gY3YoKXt9LApDdjpmdW5jdGlvbiBDdigpe30sCmVhOmZ1
-bmN0aW9uIGVhKCl7fSwKRDA6ZnVuY3Rpb24gRDAoKXt9LApUNTpmdW5jdGlvbiBUNSgpe30sCmg0OmZ1
-bmN0aW9uIGg0KCl7fSwKYnI6ZnVuY3Rpb24gYnIoKXt9LApWYjpmdW5jdGlvbiBWYigpe30sCk83OmZ1
-bmN0aW9uIE83KCl7fSwKYlU6ZnVuY3Rpb24gYlUoYSl7dGhpcy5hPWF9LApoSDpmdW5jdGlvbiBoSChh
-LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKd2E6ZnVuY3Rpb24gd2EoKXt9LApTZzpmdW5jdGlvbiBTZygp
-e30sCnU4OmZ1bmN0aW9uIHU4KCl7fSwKQWo6ZnVuY3Rpb24gQWooKXt9LAplNzpmdW5jdGlvbiBlNyhh
-KXt0aGlzLmE9YX0sCnVIOmZ1bmN0aW9uIHVIKCl7fSwKQkg6ZnVuY3Rpb24gQkgoKXt9LApTTjpmdW5j
-dGlvbiBTTigpe30sCmV3OmZ1bmN0aW9uIGV3KCl7fSwKbHA6ZnVuY3Rpb24gbHAoKXt9LApUYjpmdW5j
-dGlvbiBUYigpe30sCkl2OmZ1bmN0aW9uIEl2KCl7fSwKQlQ6ZnVuY3Rpb24gQlQoKXt9LAp5WTpmdW5j
-dGlvbiB5WSgpe30sCnc2OmZ1bmN0aW9uIHc2KCl7fSwKSzU6ZnVuY3Rpb24gSzUoKXt9LApDbTpmdW5j
-dGlvbiBDbSgpe30sCkNROmZ1bmN0aW9uIENRKCl7fSwKdzQ6ZnVuY3Rpb24gdzQoKXt9LApyaDpmdW5j
-dGlvbiByaCgpe30sCkQ5OmZ1bmN0aW9uIEQ5KCl7fSwKaTc6ZnVuY3Rpb24gaTcoYSl7dGhpcy5hPWF9
-LApTeTpmdW5jdGlvbiBTeShhKXt0aGlzLmE9YX0sCktTOmZ1bmN0aW9uIEtTKGEsYil7dGhpcy5hPWEK
-dGhpcy5iPWJ9LApBMzpmdW5jdGlvbiBBMyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSTQ6ZnVuY3Rp
-b24gSTQoYSl7dGhpcy5hPWF9LApGazpmdW5jdGlvbiBGayhhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9
-LApSTzpmdW5jdGlvbiBSTyhhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRp
-PWR9LApDcTpmdW5jdGlvbiBDcShhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8u
-JHRpPWR9LAp4QzpmdW5jdGlvbiB4QyhhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5iPWEKXy5jPWIKXy5k
-PWMKXy5lPWQKXy4kdGk9ZX0sCnZOOmZ1bmN0aW9uIHZOKGEpe3RoaXMuYT1hfSwKSlE6ZnVuY3Rpb24g
-SlEoYSl7dGhpcy5hPWF9LApHbTpmdW5jdGlvbiBHbSgpe30sCnZEOmZ1bmN0aW9uIHZEKGEpe3RoaXMu
-YT1hfSwKVXY6ZnVuY3Rpb24gVXYoYSl7dGhpcy5hPWF9LApFZzpmdW5jdGlvbiBFZyhhLGIsYyl7dGhp
-cy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAptNjpmdW5jdGlvbiBtNigpe30sCkVvOmZ1bmN0aW9uIEVv
-KCl7fSwKV2s6ZnVuY3Rpb24gV2soKXt9LApjdDpmdW5jdGlvbiBjdChhLGIsYyxkLGUpe3ZhciBfPXRo
-aXMKXy5lPWEKXy5hPWIKXy5iPWMKXy5jPWQKXy5kPWV9LApJQTpmdW5jdGlvbiBJQSgpe30sCk93OmZ1
-bmN0aW9uIE93KCl7fSwKVzk6ZnVuY3Rpb24gVzkoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIK
-Xy5jPS0xCl8uZD1udWxsCl8uJHRpPWN9LApkVzpmdW5jdGlvbiBkVyhhKXt0aGlzLmE9YX0sCkZiOmZ1
-bmN0aW9uIEZiKCl7fSwKa0Y6ZnVuY3Rpb24ga0YoKXt9LAptazpmdW5jdGlvbiBtayhhLGIpe3RoaXMu
-YT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24gS28oYSl7dGhpcy5hPWF9LApmbTpmdW5jdGlvbiBmbShh
-KXt0aGlzLmE9YX0sCkxlOmZ1bmN0aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9LApyQjpmdW5j
-dGlvbiByQigpe30sClhXOmZ1bmN0aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9fSxVPXsKeXU6
-ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG49SC5WTShbXSx1LmJQKQpmb3IodD1KLlU2KGEpLHM9
-Si5JVCh1LlIuYih0LnEoYSwiZGV0YWlscyIpKSk7cy5GKCk7KXtyPXMuZ2woKQpxPUouVTYocikKcD1I
-LnkocS5xKHIsImRlc2NyaXB0aW9uIikpCnE9cS5xKHIsImxpbmsiKQppZihxPT1udWxsKXE9bnVsbApl
-bHNle289Si5VNihxKQpxPW5ldyBVLk1sKEgueShvLnEocSwiaHJlZiIpKSxILlNjKG8ucShxLCJsaW5l
-IikpLEgueShvLnEocSwicGF0aCIpKSl9Qy5ObS5pKG4sbmV3IFUudUYocCxxKSl9cmV0dXJuIG5ldyBV
-LmQyKG4sVS5qZih0LnEoYSwiZWRpdHMiKSksSC55KHQucShhLCJleHBsYW5hdGlvbiIpKSxILlNjKHQu
-cShhLCJsaW5lIikpLEgueSh0LnEoYSwicGF0aCIpKSxVLk5kKHQucShhLCJ0cmFjZXMiKSkpfSwKamY6
-ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEKaWYoYT09bnVsbCl0PW51bGwKZWxzZXt0PUguVk0oW10sdS5m
-QSkKZm9yKHM9Si5JVCh1LlIuYihhKSk7cy5GKCk7KXtyPXMuZ2woKQpxPUouVTYocikKQy5ObS5pKHQs
-bmV3IFUuU2UoSC55KHEucShyLCJkZXNjcmlwdGlvbiIpKSxILnkocS5xKHIsImhyZWYiKSkpKX19cmV0
-dXJuIHR9LApOZDpmdW5jdGlvbihhKXt2YXIgdCxzCmlmKGE9PW51bGwpdD1udWxsCmVsc2V7dD1ILlZN
-KFtdLHUuaGgpCmZvcihzPUouSVQodS5SLmIoYSkpO3MuRigpOylDLk5tLmkodCxVLk5mKHMuZ2woKSkp
-fXJldHVybiB0fSwKTmY6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvPSJkZXNjcmlwdGlvbiIsbj1K
-LlU2KGEpLG09SC55KG4ucShhLG8pKSxsPUguVk0oW10sdS5hSikKZm9yKG49Si5JVCh1LlIuYihuLnEo
-YSwiZW50cmllcyIpKSk7bi5GKCk7KXt0PW4uZ2woKQpzPUouVTYodCkKcj1ILnkocy5xKHQsbykpCnE9
-SC55KHMucSh0LCJmdW5jdGlvbiIpKQpzPXMucSh0LCJsaW5rIikKaWYocz09bnVsbClzPW51bGwKZWxz
-ZXtwPUouVTYocykKcz1uZXcgVS5NbChILnkocC5xKHMsImhyZWYiKSksSC5TYyhwLnEocywibGluZSIp
-KSxILnkocC5xKHMsInBhdGgiKSkpfUMuTm0uaShsLG5ldyBVLndiKHIscSxzKSl9cmV0dXJuIG5ldyBV
-LnlEKG0sbCl9LApkMjpmdW5jdGlvbiBkMihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9
-YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9Zn0sClNlOmZ1bmN0aW9uIFNlKGEsYil7dGhpcy5hPWEKdGhp
-cy5iPWJ9LAp1RjpmdW5jdGlvbiB1RihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTWw6ZnVuY3Rpb24g
-TWwoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKeUQ6ZnVuY3Rpb24geUQoYSxiKXt0
-aGlzLmE9YQp0aGlzLmI9Yn0sCndiOmZ1bmN0aW9uIHdiKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0
-aGlzLmM9Y319LEI9ewpZZjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1ILnkoYS5xKDAsInJlZ2lvbnMi
-KSkscD1ILnkoYS5xKDAsIm5hdmlnYXRpb25Db250ZW50IikpLG89SC55KGEucSgwLCJzb3VyY2VDb2Rl
-IikpLG49SC5WTShbXSx1LnUpCmZvcih0PUouSVQodS5SLmIoYS5xKDAsImVkaXRzIikpKTt0LkYoKTsp
-e3M9dC5nbCgpCnI9Si5VNihzKQpDLk5tLmkobixuZXcgQi5qOChILlNjKHIucShzLCJsaW5lIikpLEgu
-eShyLnEocywiZXhwbGFuYXRpb24iKSksSC5TYyhyLnEocywib2Zmc2V0IikpKSl9cmV0dXJuIG5ldyBC
-LnFwKHEscCxvLG4pfSwKajg6ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMu
-Yz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
-LmQ9ZH0sCkx1OmZ1bmN0aW9uIEx1KCl7fSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHQKaWYoIShhPj02NSYm
-YTw9OTApKXQ9YT49OTcmJmE8PTEyMgplbHNlIHQ9ITAKcmV0dXJuIHR9LApZdTpmdW5jdGlvbihhLGIp
-e3ZhciB0PWEubGVuZ3RoLHM9YisyCmlmKHQ8cylyZXR1cm4hMQppZighQi5PUyhDLnhCLm0oYSxiKSkp
-cmV0dXJuITEKaWYoQy54Qi5tKGEsYisxKSE9PTU4KXJldHVybiExCmlmKHQ9PT1zKXJldHVybiEwCnJl
-dHVybiBDLnhCLm0oYSxzKT09PTQ3fX0sVD17R1Y6ZnVuY3Rpb24gR1YoKXt9fSxMPXsKSXE6ZnVuY3Rp
-b24oKXtDLkJaLkIoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLG5ldyBMLmUoKSkKQy5vbC5CKHdp
-bmRvdywicG9wc3RhdGUiLG5ldyBMLkwoKSl9LAprejpmdW5jdGlvbihhKXt2YXIgdCxzPXUuaC5hKGEu
-cGFyZW50Tm9kZSkucXVlcnlTZWxlY3RvcigiOnNjb3BlID4gdWwiKSxyPXMuc3R5bGUscT0iIitDLkNE
-LnpRKHMub2Zmc2V0SGVpZ2h0KSoyKyJweCIKci5tYXhIZWlnaHQ9cQpyPUoucUYoYSkKcT1yLiR0aQp0
-PXEuQygifigxKSIpLmIobmV3IEwuV3gocyxhKSkKdS5NLmIobnVsbCkKVy5KRShyLmEsci5iLHQsITEs
-cS5kKX0sCnlYOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbz0icXVlcnlTZWxlY3RvckFsbCIsbj1k
-b2N1bWVudC5xdWVyeVNlbGVjdG9yKGEpLG09dS5oCm4udG9TdHJpbmcKSC5EaChtLG0sIlQiLG8pCnQ9
-dS5TCnM9bmV3IFcud3oobi5xdWVyeVNlbGVjdG9yQWxsKCIubmF2LWxpbmsiKSx0KQpzLksocyxuZXcg
-TC5BTygpKQpILkRoKG0sbSwiVCIsbykKcj1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZWdp
-b24iKSx0KQppZihyLmdBKHIpIT09MCl7cT1uLnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0i
-KQpxLnRvU3RyaW5nCnIuSyhyLG5ldyBMLkhvKHEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3ko
-bmV3IFcuaTcocSkpLk8oInBhdGgiKSkpKX1ILkRoKG0sbSwiVCIsbykKcD1uZXcgVy53eihuLnF1ZXJ5
-U2VsZWN0b3JBbGwoIi5wb3N0LWxpbmsiKSx0KQpwLksocCxuZXcgTC5JQygpKX0sCnR5OmZ1bmN0aW9u
-KGEpe3ZhciB0PXUuTgpyZXR1cm4gVy5xRChhLCJQT1NUIixQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBw
-bGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHQsdCkpLlc3KG5ldyBMLkwxKCksdS5yKX0sCmFL
-OmZ1bmN0aW9uKGEpe3ZhciB0PVAuaEsoYSkuZ2hZKCkucSgwLCJsaW5lIikKcmV0dXJuIHQ9PW51bGw/
-bnVsbDpILkhwKHQsbnVsbCl9LApHNjpmdW5jdGlvbihhKXt2YXIgdD1QLmhLKGEpLmdoWSgpLnEoMCwi
-b2Zmc2V0IikKcmV0dXJuIHQ9PW51bGw/bnVsbDpILkhwKHQsbnVsbCl9LAp0MjpmdW5jdGlvbihhLGIp
-e3ZhciB0LHMscixxLHAsbyxuPXt9CnUuVi5iKGEpCnQ9bi5hPXUuaC5iKFcucWMoYS5jdXJyZW50VGFy
-Z2V0KSkuZ2V0QXR0cmlidXRlKCJocmVmIikKaWYoSi56bCh0LCI/Iikpe3M9Qy54Qi5Oaih0LDAsQy54
-Qi5PWSh0LCI/IikpCm4uYT1zCnI9c31lbHNlIHI9dAppZihiIT1udWxsKXtxPSQublUoKQpyPW4uYT1x
-Lm81KEQubnIocS50TShiKSxyKSl9cD1MLkc2KHQpCm89TC5hSyh0KQppZihwIT1udWxsKUwuYWYocixw
-LG8sbmV3IEwublQobixwLG8pKQplbHNlIEwuYWYocixudWxsLG51bGwsbmV3IEwuQloobikpCmEucHJl
-dmVudERlZmF1bHQoKX0sCnVtOmZ1bmN0aW9uKGEpe3JldHVybiBMLlFTKHUuVi5iKGEpKX0sClFTOmZ1
-bmN0aW9uKGEpe3ZhciB0PTAscz1QLkZYKHUueikscj0xLHEscD1bXSxvLG4sbSxsLGssagp2YXIgJGFz
-eW5jJHVtPVAubHooZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cT1jCnQ9cn13aGlsZSh0cnVlKXN3aXRj
-aCh0KXtjYXNlIDA6az11LmguYShXLnFjKGEuY3VycmVudFRhcmdldCkpLmdldEF0dHJpYnV0ZSgiaHJl
-ZiIpCmEucHJldmVudERlZmF1bHQoKQptPWRvY3VtZW50Cm0uYm9keS5jbGFzc0xpc3QuYWRkKCJyZXJ1
-bm5pbmciKQpyPTMKdD02CnJldHVybiBQLmpRKEwudHkoayksJGFzeW5jJHVtKQpjYXNlIDY6dS5GLmEo
-Si5HcihXLnVWKG0uZGVmYXVsdFZpZXcpKSkucmVsb2FkKCkKcC5wdXNoKDUpCnQ9NApicmVhawpjYXNl
-IDM6cj0yCmo9cQpvPUguUnUoaikKbj1ILnRzKGopCkwucUooImhhbmRsZVBvc3RMaW5rQ2xpY2s6ICIr
-SC5kKG8pLG4pCndpbmRvdy5hbGVydCgiQ291bGQgbm90IGxvYWQgIitILmQoaykrIiAoIitILmQobykr
-IikuIikKcC5wdXNoKDUpCnQ9NApicmVhawpjYXNlIDI6cD1bMV0KY2FzZSA0OnI9MQptLmJvZHkuY2xh
-c3NMaXN0LnJlbW92ZSgicmVydW5uaW5nIikKdD1wLnBvcCgpCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55
-QyhudWxsLHMpCmNhc2UgMTpyZXR1cm4gUC5mMyhxLHMpfX0pCnJldHVybiBQLkRJKCRhc3luYyR1bSxz
-KX0sCnZVOmZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQscz11LmgKSC5EaChzLHMsIlQiLCJxdWVyeVNl
-bGVjdG9yQWxsIikKdD1uZXcgVy53eih0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb2RlIiksdS5TKQp0Lkso
-dCxuZXcgTC5HSCgpKX0sCmhYOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dS5OClcucUQoSC5kKGEpKyI/cmVn
-aW9uPXJlZ2lvbiZvZmZzZXQ9IitILmQoYiksbnVsbCxQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBwbGlj
-YXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHQsdCkpLlc3KG5ldyBMLkRUKCksdS5QKS5PQShuZXcg
-TC5lSChhKSl9LApHNzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzCmlmKCFKLnJZKGEpLlRjKGEsIi5k
-YXJ0Iikpe0wuQkUoYSxuZXcgQi5xcCgiIiwiIiwiIixDLnhEKSkKTC5CWChhLG51bGwpCmlmKGQhPW51
-bGwpZC4kMCgpCnJldHVybn10PUMueEIudGcoYSwiPyIpP2ErIiZpbmxpbmU9dHJ1ZSI6YSsiP2lubGlu
-ZT10cnVlIgpzPXUuTgpXLnFEKHQsbnVsbCxQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24v
-anNvbjsgY2hhcnNldD1VVEYtOCJdLHMscykpLlc3KG5ldyBMLnpEKGEsYixjLGQpLHUuUCkuT0EobmV3
-IEwuT0UoYSkpfSwKR2U6ZnVuY3Rpb24oKXt2YXIgdD0iL19wcmV2aWV3L25hdmlnYXRpb25UcmVlLmpz
-b24iLHM9dS5OClcucUQodCxudWxsLFAuRUYoWyJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9qc29u
-OyBjaGFyc2V0PVVURi04Il0scyxzKSkuVzcobmV3IEwuVFcoKSx1LlApLk9BKG5ldyBMLnhyKHQpKX0s
-CnFKOmZ1bmN0aW9uKGEsYil7dmFyIHQKd2luZG93CmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVk
-Iil3aW5kb3cuY29uc29sZS5lcnJvcihhKQp3aW5kb3cKdD1ILmQoYikKaWYodHlwZW9mIGNvbnNvbGUh
-PSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKHQpfSwKcU86ZnVuY3Rpb24oYSl7dmFyIHQ9
-YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPXQuYm90dG9tLHI9d2luZG93LmlubmVySGVpZ2h0Cmlm
-KHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJuIEgucFkocikKaWYocz5yKUouZGgoYSkKZWxzZSBpZih0
-LnRvcDwwKUouZGgoYSl9LApmRzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgppZihhIT1udWxsKXt0PWRv
-Y3VtZW50CnM9dC5nZXRFbGVtZW50QnlJZCgibyIrSC5kKGEpKQpyPXQucXVlcnlTZWxlY3RvcigiLmxp
-bmUtIitILmQoYikpCmlmKHMhPW51bGwpe0wucU8ocykKSi5kUihzKS5pKDAsInRhcmdldCIpfWVsc2Ug
-aWYociE9bnVsbClMLnFPKHIucGFyZW50RWxlbWVudCkKaWYociE9bnVsbClKLmRSKHUuaC5hKHIucGFy
-ZW50Tm9kZSkpLmkoMCwiaGlnaGxpZ2h0Iil9ZWxzZSBMLnFPKGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
-KCJ1bml0LW5hbWUiKSl9LAphZjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHI9TC5HNih3aW5kb3cu
-bG9jYXRpb24uaHJlZikscT1MLmFLKHdpbmRvdy5sb2NhdGlvbi5ocmVmKQppZihyIT1udWxsKXt0PWRv
-Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitILmQocikpCmlmKHQhPW51bGwpSi5kUih0KS5SKDAsInRh
-cmdldCIpfWlmKHEhPW51bGwpe3M9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILmQocSkp
-CmlmKHMhPW51bGwpSi5kUihzLnBhcmVudEVsZW1lbnQpLlIoMCwiaGlnaGxpZ2h0Iil9aWYoYT09d2lu
-ZG93LmxvY2F0aW9uLnBhdGhuYW1lKXtMLmZHKGIsYykKZC4kMCgpfWVsc2UgTC5HNyhhLGIsYyxkKX0s
-Ckx4OmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYT09PTEpdD1iCmVsc2UgdD1iKyJzIgpyZXR1cm4gdH0s
-ClQxOmZ1bmN0aW9uKGIwKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixh
-LGEwLGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4PWRvY3VtZW50LGE5PWE4LnF1ZXJ5U2VsZWN0b3IoIi5l
-ZGl0LXBhbmVsIC5wYW5lbC1jb250ZW50IikKSi5sNShhOSwiIikKaWYoYjA9PW51bGwpe2E4PWE4LmNy
-ZWF0ZUVsZW1lbnQoInAiKQphOC50ZXh0Q29udGVudD0iU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9wb3Nl
-ZCBlZGl0LiIKQy5MdC5zRChhOCxILlZNKFsicGxhY2Vob2xkZXIiXSx1LnMpKQphOS5hcHBlbmRDaGls
-ZChhOCkKcmV0dXJufXQ9YjAuZQpzPSQublUoKQpyPXMudE0odCkKcT1iMC5jCnA9cy5IUCh0LEouVDAo
-YTgucXVlcnlTZWxlY3RvcigiLnJvb3QiKS50ZXh0Q29udGVudCkpCm89YjAuZApzPWE4LmNyZWF0ZUVs
-ZW1lbnQoInAiKQpuPXUuaApuLmIoYTkuYXBwZW5kQ2hpbGQocykpLmFwcGVuZENoaWxkKGE4LmNyZWF0
-ZVRleHROb2RlKEguZChxKSsiIGF0ICIrSC5kKHApKyI6IitILmQobykrIi4iKSkKcz1iMC5hCmlmKHMu
-bGVuZ3RoIT09MCl7bT1hOC5jcmVhdGVFbGVtZW50KCJwIikKbS50ZXh0Q29udGVudD0iRWRpdCByYXRp
-b25hbGU6IgphOS5hcHBlbmRDaGlsZChtKQptPWE4LmNyZWF0ZUVsZW1lbnQoInVsIikKbD1uLmIoYTku
-YXBwZW5kQ2hpbGQobSkpCmZvcihtPXMubGVuZ3RoLGs9MDtrPHMubGVuZ3RoO3MubGVuZ3RoPT09bXx8
-KDAsSC5saykocyksKytrKXtqPXNba10KaT1hOC5jcmVhdGVFbGVtZW50KCJsaSIpCmg9bC5hcHBlbmRD
-aGlsZChpKQpoLmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKGouYSkpCmc9ai5iCmlmKGchPW51
-bGwpe2guYXBwZW5kQ2hpbGQoYTguY3JlYXRlVGV4dE5vZGUoIiAoIikpCmguYXBwZW5kQ2hpbGQoTC5j
-NChnLHIpKQpoLmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKCIpIikpfX19cz1iMC5iCmlmKHMh
-PW51bGwpZm9yKG09cy5sZW5ndGgsaT11LnMsZj11Llgsaz0wO2s8cy5sZW5ndGg7cy5sZW5ndGg9PT1t
-fHwoMCxILmxrKShzKSwrK2spe2U9c1trXQpkPWE4LmNyZWF0ZUVsZW1lbnQoInAiKQpjPW4uYihhOS5h
-cHBlbmRDaGlsZChkKSkKZD1hOC5jcmVhdGVFbGVtZW50KCJhIikKYj1uLmIoYy5hcHBlbmRDaGlsZChk
-KSkKYi5hcHBlbmRDaGlsZChhOC5jcmVhdGVUZXh0Tm9kZShlLmEpKQpiLnNldEF0dHJpYnV0ZSgiaHJl
-ZiIsZS5iKQpkPWYuYihILlZNKFsicG9zdC1saW5rIiwiYmVmb3JlLWFwcGx5Il0saSkpCmE9Si5kUihi
-KQphLlYxKDApCmEuRlYoMCxkKX1mb3Iocz1iMC5mLG49cy5sZW5ndGgsbT11LnMsaT11Llgsaz0wO2s8
-cy5sZW5ndGg7cy5sZW5ndGg9PT1ufHwoMCxILmxrKShzKSwrK2spe2EwPXNba10KZj1hOC5jcmVhdGVF
-bGVtZW50KCJwIikKZD1pLmIoSC5WTShbInRyYWNlIl0sbSkpCmE9Si5kUihmKQphLlYxKDApCmEuRlYo
-MCxkKQphMT1hOS5hcHBlbmRDaGlsZChmKQphMS5hcHBlbmRDaGlsZChhOC5jcmVhdGVUZXh0Tm9kZSgi
-TnVsbGFiaWxpdHkgdHJhY2UgZm9yOiAiKSkKZj1hOC5jcmVhdGVFbGVtZW50KCJzcGFuIikKZD1pLmIo
-SC5WTShbInR5cGUtZGVzY3JpcHRpb24iXSxtKSkKYT1KLmRSKGYpCmEuVjEoMCkKYS5GVigwLGQpCmYu
-YXBwZW5kQ2hpbGQoYTguY3JlYXRlVGV4dE5vZGUoYTAuYSkpCmExLmFwcGVuZENoaWxkKGYpCmY9YTgu
-Y3JlYXRlRWxlbWVudCgidWwiKQpkPWkuYihILlZNKFsidHJhY2UiXSxtKSkKYT1KLmRSKGYpCmEuVjEo
-MCkKYS5GVigwLGQpCmEyPWExLmFwcGVuZENoaWxkKGYpCmZvcihmPWEwLmIsZD1mLmxlbmd0aCxhMz0w
-O2EzPGYubGVuZ3RoO2YubGVuZ3RoPT09ZHx8KDAsSC5saykoZiksKythMyl7YTQ9ZlthM10KYTU9YTgu
-Y3JlYXRlRWxlbWVudCgibGkiKQpKLmw1KGE1LCImI3gyNzRGOyAiKQphNj1hMi5hcHBlbmRDaGlsZChh
-NSkKYTU9YTguY3JlYXRlRWxlbWVudCgic3BhbiIpCmE3PWkuYihILlZNKFsiZnVuY3Rpb24iXSxtKSkK
-YT1KLmRSKGE1KQphLlYxKDApCmEuRlYoMCxhNykKYTc9YTQuYgppZihhNz09bnVsbClhNz0idW5rbm93
-biIKYTUuYXBwZW5kQ2hpbGQoYTguY3JlYXRlVGV4dE5vZGUoYTcpKQphNi5hcHBlbmRDaGlsZChhNSkK
-Zz1hNC5jCmlmKGchPW51bGwpe2E2LmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKCIgKCIpKQph
-Ni5hcHBlbmRDaGlsZChMLmM0KGcscikpCmE2LmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKCIp
-IikpfWE2LmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKCI6ICIpKQphNi5hcHBlbmRDaGlsZChh
-OC5jcmVhdGVUZXh0Tm9kZShhNC5hKSl9fX0sCkxIOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxv
-LG4sbSxsLGssaixpLGgsZyxmLGUsZD1kb2N1bWVudCxjPWQucXVlcnlTZWxlY3RvcigiLmVkaXQtbGlz
-dCAucGFuZWwtY29udGVudCIpCkoubDUoYywiIikKdD1kLmNyZWF0ZUVsZW1lbnQoInAiKQpzPXUuaApy
-PXMuYihjLmFwcGVuZENoaWxkKHQpKQpxPWIubGVuZ3RoCmlmKHE9PT0wKXIuYXBwZW5kQ2hpbGQoZC5j
-cmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9zZWQgZWRpdHMiKSkKZWxzZSByLmFwcGVuZENoaWxkKGQuY3Jl
-YXRlVGV4dE5vZGUoIiIrcSsiIHByb3Bvc2VkICIrTC5MeChxLCJlZGl0IikrIjoiKSkKdD1kLmNyZWF0
-ZUVsZW1lbnQoInVsIikKcD1zLmIoYy5hcHBlbmRDaGlsZCh0KSkKZm9yKHQ9Yi5sZW5ndGgsbz11Lmks
-bj11LlEsbT1uLkMoIn4oMSkiKSxsPXUuTSxuPW4uZCxrPTA7azxiLmxlbmd0aDtiLmxlbmd0aD09PXR8
-fCgwLEgubGspKGIpLCsrayl7aj1iW2tdCmk9ZC5jcmVhdGVFbGVtZW50KCJsaSIpCmg9cy5iKHAuYXBw
-ZW5kQ2hpbGQoaSkpCkouZFIoaCkuaSgwLCJlZGl0IikKaT1kLmNyZWF0ZUVsZW1lbnQoImEiKQpnPW8u
-YihoLmFwcGVuZENoaWxkKGkpKQpnLmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIpCmY9ai5jCmk9SC5k
-KGYpCmcuc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoZykpLk8oIm9mZnNldCIp
-LGkpCmU9ai5hCmk9SC5kKGUpCmcuc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTco
-ZykpLk8oImxpbmUiKSxpKQpnLmFwcGVuZENoaWxkKGQuY3JlYXRlVGV4dE5vZGUoImxpbmUgIitILmQo
-ZSkpKQppPW0uYihuZXcgTC5FRShmLGUsYSkpCmwuYihudWxsKQpXLkpFKGcsImNsaWNrIixpLCExLG4p
-CmguYXBwZW5kQ2hpbGQoZC5jcmVhdGVUZXh0Tm9kZSgiOiAiK0guZChqLmIpKSl9TC5UMShudWxsKX0s
-CkZyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscT13aW5kb3cubG9jYXRpb24scD1QLmhLKChxJiZD
-LkV4KS5nRHIocSkrSC5kKGEpKQpxPXUuegp0PVAuRmwodS5OLHEpCmlmKGIhPW51bGwpdC5ZKDAsIm9m
-ZnNldCIsSC5kKGIpKQppZihjIT1udWxsKXQuWSgwLCJsaW5lIixILmQoYykpCnA9cC5ubSgwLHQuYT09
-PTA/bnVsbDp0KQpzPXdpbmRvdy5oaXN0b3J5CnI9cC53KDApCnMudG9TdHJpbmcKcy5wdXNoU3RhdGUo
-bmV3IFAuQmYoW10sW10pLlB2KFAuRmwocSxxKSksIiIscil9LApFbjpmdW5jdGlvbihhKXt2YXIgdD1K
-LmJiKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQsIi8iKQppZihDLnhC
-Lm4oYSx0KSlyZXR1cm4gQy54Qi5HKGEsdC5sZW5ndGgpCmVsc2UgcmV0dXJuIGF9LApCWDpmdW5jdGlv
-bihhLGIpe3ZhciB0LHMscj17fQpyLmE9YQphPUwuRW4oYSkKci5hPWEKdD1kb2N1bWVudAp0LnF1ZXJ5
-U2VsZWN0b3IoIiN1bml0LW5hbWUiKS50ZXh0Q29udGVudD1hCnM9dS5oCkguRGgocyxzLCJUIiwicXVl
-cnlTZWxlY3RvckFsbCIpCnQ9bmV3IFcud3oodC5xdWVyeVNlbGVjdG9yQWxsKCIubmF2LXBhbmVsIC5u
-YXYtbGluayIpLHUuUykKdC5LKHQsbmV3IEwuVlMocikpfSwKQkU6ZnVuY3Rpb24oYSxiKXt2YXIgdD0i
-LnJlZ2lvbnMiLHM9ZG9jdW1lbnQscj1zLnF1ZXJ5U2VsZWN0b3IodCkscT1zLnF1ZXJ5U2VsZWN0b3Io
-Ii5jb2RlIikKSi50SChyLGIuYSwkLktHKCkpCkoudEgocSxiLmIsJC5LRygpKQpMLkxIKGEsYi5kKQpM
-LnZVKCkKTC55WCgiLmNvZGUiKQpMLnlYKHQpfSwKdFg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxw
-LG8sbixtLGwsayxqPWRvY3VtZW50LGk9ai5jcmVhdGVFbGVtZW50KCJ1bCIpLGg9dS5oLGc9aC5iKGEu
-YXBwZW5kQ2hpbGQoaSkpCmZvcihpPWIubGVuZ3RoLHQ9dS5NLHM9MDtzPGIubGVuZ3RoO2IubGVuZ3Ro
-PT09aXx8KDAsSC5saykoYiksKytzKXtyPWJbc10KcT1qLmNyZWF0ZUVsZW1lbnQoImxpIikKcD1oLmIo
-Zy5hcHBlbmRDaGlsZChxKSkKcT1KLlJFKHApCmlmKHIuYT09PUMuWTIpe3EuZ0QocCkuaSgwLCJkaXIi
-KQpxPWouY3JlYXRlRWxlbWVudCgic3BhbiIpCm89aC5iKHAuYXBwZW5kQ2hpbGQocSkpCnE9Si5SRShv
-KQpxLmdEKG8pLmkoMCwiYXJyb3ciKQpxLnNoZihvLCImI3gyNUJDOyIpCnE9ai5jcmVhdGVFbGVtZW50
-KCJzcGFuIikKSi5sNShoLmIocC5hcHBlbmRDaGlsZChxKSksIiYjeDFGNEMxOyIpCnAuYXBwZW5kQ2hp
-bGQoai5jcmVhdGVUZXh0Tm9kZShyLmIpKQpMLnRYKHAsci5jKQpMLmt6KG8pfWVsc2V7cS5zaGYocCwi
-JiN4MUY0QzQ7IikKcT1qLmNyZWF0ZUVsZW1lbnQoImEiKQpuPWguYihwLmFwcGVuZENoaWxkKHEpKQpx
-PUouUkUobikKcS5nRChuKS5pKDAsIm5hdi1saW5rIikKbi5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcg
-Vy5TeShuZXcgVy5pNyhuKSkuTygibmFtZSIpLHIuZCkKbi5zZXRBdHRyaWJ1dGUoImhyZWYiLHIuZSkK
-bi5hcHBlbmRDaGlsZChqLmNyZWF0ZVRleHROb2RlKHIuYikpCnE9cS5nVmwobikKbT1xLiR0aQptLkMo
-In4oMSkiKS5iKEwuWE4oKSkKdC5iKG51bGwpClcuSkUocS5hLHEuYixMLlhOKCksITEsbS5kKQpsPXIu
-ZgppZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBsLm9zKCkKaWYobD4wKXtxPWouY3JlYXRlRWxl
-bWVudCgic3BhbiIpCms9aC5iKHAuYXBwZW5kQ2hpbGQocSkpCkouZFIoaykuaSgwLCJlZGl0LWNvdW50
-IikKcT0iIitsKyIgIgppZihsPT09MSltPSJlZGl0IgplbHNlIG09ImVkaXRzIgprLnNldEF0dHJpYnV0
-ZSgidGl0bGUiLHErbSkKay5hcHBlbmRDaGlsZChqLmNyZWF0ZVRleHROb2RlKEMuam4udyhsKSkpfX19
-fSwKYzQ6ZnVuY3Rpb24oYSxiKXt2YXIgdD1kb2N1bWVudCxzPXQuY3JlYXRlRWxlbWVudCgiYSIpCnUu
-aS5iKHMpCnMuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShILmQoYS5jKSsiOiIrSC5kKGEuYikp
-KQp0PUQubnIoYixhLmEpCnMuc2V0QXR0cmlidXRlKCJocmVmIiwkLm5VKCkubzUodCkpCnMuY2xhc3NM
-aXN0LmFkZCgibmF2LWxpbmsiKQpyZXR1cm4gc30sCmU6ZnVuY3Rpb24gZSgpe30sClZXOmZ1bmN0aW9u
-IFZXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCm9aOmZ1bmN0aW9uIG9aKCl7fSwK
-anI6ZnVuY3Rpb24ganIoKXt9LApxbDpmdW5jdGlvbiBxbCgpe30sCkw6ZnVuY3Rpb24gTCgpe30sCld4
-OmZ1bmN0aW9uIFd4KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBTzpmdW5jdGlvbiBBTygpe30sCmRO
-OmZ1bmN0aW9uIGROKCl7fSwKSG86ZnVuY3Rpb24gSG8oYSl7dGhpcy5hPWF9LAp4ejpmdW5jdGlvbiB4
-eihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSUM6ZnVuY3Rpb24gSUMoKXt9LApMMTpmdW5jdGlvbiBM
-MSgpe30sCm5UOmZ1bmN0aW9uIG5UKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkJa
-OmZ1bmN0aW9uIEJaKGEpe3RoaXMuYT1hfSwKR0g6ZnVuY3Rpb24gR0goKXt9LApEVDpmdW5jdGlvbiBE
-VCgpe30sCmVIOmZ1bmN0aW9uIGVIKGEpe3RoaXMuYT1hfSwKekQ6ZnVuY3Rpb24gekQoYSxiLGMsZCl7
-dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCk9FOmZ1bmN0aW9uIE9FKGEpe3RoaXMu
-YT1hfSwKVFc6ZnVuY3Rpb24gVFcoKXt9LAp4cjpmdW5jdGlvbiB4cihhKXt0aGlzLmE9YX0sCkVFOmZ1
-bmN0aW9uIEVFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1bmN0aW9uIFFM
-KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9YX0sClhBOmZ1
-bmN0aW9uIFhBKCl7fSwKbUs6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG49SC5WTShbXSx1LmZo
-KQpmb3IodD1KLklUKHUuUi5iKGEpKTt0LkYoKTspe3M9dC5nbCgpCnI9Si5VNihzKQpxPUwucDIoSC55
-KHIucShzLCJ0eXBlIikpKQpwPUgueShyLnEocywibmFtZSIpKQpvPXIucShzLCJzdWJ0cmVlIikKbz1v
-PT1udWxsP251bGw6TC5tSyhvKQpDLk5tLmkobixuZXcgTC5aWihxLHAsbyxILnkoci5xKHMsInBhdGgi
-KSksSC55KHIucShzLCJocmVmIikpLEguU2Moci5xKHMsImVkaXRDb3VudCIpKSkpfXJldHVybiBufSwK
-cDI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UiZGlyZWN0b3J5IjpyZXR1cm4gQy5ZMgpjYXNlImZp
-bGUiOnJldHVybiBDLnJmCmRlZmF1bHQ6dGhyb3cgSC5iKFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0
-aW9uIHRyZWUgbm9kZSB0eXBlOiAiK0guZChhKSkpfX0sClpaOmZ1bmN0aW9uIFpaKGEsYixjLGQsZSxm
-KXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKeTg6ZnVuY3Rp
-b24geTgoYSl7dGhpcy5iPWF9LApJVjpmdW5jdGlvbiBJVihhLGIsYyxkKXt2YXIgXz10aGlzCl8uZD1h
-Cl8uZT1iCl8uZj1jCl8ucj1kfX0sTT17CllGOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4K
-Zm9yKHQ9Yi5sZW5ndGgscz0xO3M8dDsrK3Mpe2lmKGJbc109PW51bGx8fGJbcy0xXSE9bnVsbCljb250
-aW51ZQpmb3IoO3Q+PTE7dD1yKXtyPXQtMQppZihiW3JdIT1udWxsKWJyZWFrfXE9bmV3IFAuUm4oIiIp
-CnA9YSsiKCIKcS5hPXAKbz1ILnFDKGIsMCx0LEgudDYoYikuZCkKbj1vLiR0aQpuPXArbmV3IEguQTgo
-byxuLkMoInFVKGFMLkUpIikuYihuZXcgTS5ObygpKSxuLkMoIkE4PGFMLkUscVU+IikpLkgoMCwiLCAi
-KQpxLmE9bgpxLmE9bisoIik6IHBhcnQgIisocy0xKSsiIHdhcyBudWxsLCBidXQgcGFydCAiK3MrIiB3
-YXMgbm90LiIpCnRocm93IEguYihQLnhZKHEudygwKSkpfX0sCmxJOmZ1bmN0aW9uIGxJKGEpe3RoaXMu
-YT1hfSwKTWk6ZnVuY3Rpb24gTWkoKXt9LApxNzpmdW5jdGlvbiBxNygpe30sCk5vOmZ1bmN0aW9uIE5v
-KCl7fX0sWD17CkNMOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPWIueFooYSkKYi5oSyhhKQpp
-ZihvIT1udWxsKWE9Si5LVihhLG8ubGVuZ3RoKQp0PXUucwpzPUguVk0oW10sdCkKcj1ILlZNKFtdLHQp
-CnQ9YS5sZW5ndGgKaWYodCE9PTAmJmIucjQoQy54Qi5XKGEsMCkpKXtpZigwPj10KXJldHVybiBILk9I
-KGEsMCkKQy5ObS5pKHIsYVswXSkKcT0xfWVsc2V7Qy5ObS5pKHIsIiIpCnE9MH1mb3IocD1xO3A8dDsr
-K3ApaWYoYi5yNChDLnhCLlcoYSxwKSkpe0MuTm0uaShzLEMueEIuTmooYSxxLHApKQpDLk5tLmkocixh
-W3BdKQpxPXArMX1pZihxPHQpe0MuTm0uaShzLEMueEIuRyhhLHEpKQpDLk5tLmkociwiIil9cmV0dXJu
-IG5ldyBYLldEKGIsbyxzLHIpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9
-YQpfLmI9YgpfLmQ9YwpfLmU9ZH0sCnFSOmZ1bmN0aW9uIHFSKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rp
-b24oYSl7cmV0dXJuIG5ldyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhpcy5hPWF9fSxPPXsK
-Umg6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGk9bnVsbAppZihQLnVvKCkuZ0Zp
-KCkhPT0iZmlsZSIpcmV0dXJuICQuRWIoKQp0PVAudW8oKQppZighQy54Qi5UYyh0LmdJaSh0KSwiLyIp
-KXJldHVybiAkLkViKCkKcz1QLlBpKGksMCwwKQpyPVAuelIoaSwwLDApCnE9UC5PZShpLDAsMCwhMSkK
-cD1QLmxlKGksMCwwLGkpCm89UC50RyhpLDAsMCkKbj1QLndCKGkscykKbT1zPT09ImZpbGUiCmlmKHE9
-PW51bGwpdD1yLmxlbmd0aCE9PTB8fG4hPW51bGx8fG0KZWxzZSB0PSExCmlmKHQpcT0iIgp0PXE9PW51
-bGwKbD0hdAprPVAua2EoImEvYiIsMCwzLGkscyxsKQpqPXMubGVuZ3RoPT09MAppZihqJiZ0JiYhQy54
-Qi5uKGssIi8iKSlrPVAud0Yoaywhanx8bCkKZWxzZSBrPVAueGUoaykKaWYobmV3IFAuRG4ocyxyLHQm
-JkMueEIubihrLCIvLyIpPyIiOnEsbixrLHAsbykudDQoKT09PSJhXFxiIilyZXR1cm4gJC5LaygpCnJl
-dHVybiAkLmJEKCl9LAp6TDpmdW5jdGlvbiB6TCgpe319LEU9e09GOmZ1bmN0aW9uIE9GKGEsYixjKXt0
-aGlzLmQ9YQp0aGlzLmU9Ygp0aGlzLmY9Y319LEY9e3J1OmZ1bmN0aW9uIHJ1KGEsYixjLGQpe3ZhciBf
-PXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxEPXsKUlg6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9
-UC51bygpCmlmKEouUk0ociwkLkk2KSlyZXR1cm4gJC5GZgokLkk2PXIKaWYoJC5IaygpPT0kLkViKCkp
-cmV0dXJuICQuRmY9ci5aSSgiLiIpLncoMCkKZWxzZXt0PXIudDQoKQpzPXQubGVuZ3RoLTEKcmV0dXJu
-ICQuRmY9cz09PTA/dDpDLnhCLk5qKHQsMCxzKX19LApucjpmdW5jdGlvbihhLGIpe3ZhciB0PW51bGwK
-cmV0dXJuICQublUoKS5xNygwLGEsYix0LHQsdCx0LHQsdCl9fQp2YXIgdz1bQyxILEosUCxXLFUsQixU
-LEwsTSxYLE8sRSxGLERdCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeSh3KQp2
-YXIgJD17fQpILmVvLnByb3RvdHlwZT17fQpKLnZCLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIGE9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKGEpfSwKdzpmdW5jdGlvbihh
-KXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEguTShhKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1
-Lm8uYihiKQp0aHJvdyBILmIoUC5scihhLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9fQpKLnlFLnBy
-b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCmdpTzpmdW5jdGlvbihhKXty
-ZXR1cm4gYT81MTkwMTg6MjE4MTU5fSwKJGlhMjoxfQpKLllFLnByb3RvdHlwZT17CkROOmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIG51bGw9PWJ9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn0sCmdpTzpmdW5j
-dGlvbihhKXtyZXR1cm4gMH0sCmU3OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuU2ooYSx1Lm8uYihi
-KSl9LAokaWM4OjF9CkouTUYucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKdzpm
-dW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl2bToxfQpKLmlDLnByb3RvdHlwZT17fQpKLmtk
-LnByb3RvdHlwZT17fQpKLmM1LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9YVskLncoKV0K
-aWYodD09bnVsbClyZXR1cm4gdGhpcy50KGEpCnJldHVybiJKYXZhU2NyaXB0IGZ1bmN0aW9uIGZvciAi
-K0guZChKLmoodCkpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm57ZnVuYzoxLG9wdDpbLCwsLCwsLCwsLCws
-LCwsLF19fSwKJGlFSDoxfQpKLmpkLnByb3RvdHlwZT17Cmk6ZnVuY3Rpb24oYSxiKXtILnQ2KGEpLmQu
-YihiKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiYWRkIikpCmEucHVzaChiKX0sClc0OmZ1
-bmN0aW9uKGEsYil7dmFyIHQKaWYoISFhLmZpeGVkJGxlbmd0aClILnZoKFAuTDQoInJlbW92ZUF0Iikp
-CnQ9YS5sZW5ndGgKaWYoYj49dCl0aHJvdyBILmIoUC54KGIsbnVsbCkpCnJldHVybiBhLnNwbGljZShi
-LDEpWzBdfSwKVUc6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscgpILnQ2KGEpLkMoImNYPDE+IikuYihj
-KQppZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiaW5zZXJ0QWxsIikpCnQ9YS5sZW5ndGgKUC53
-QShiLDAsdCwiaW5kZXgiKQpzPWMubGVuZ3RoCnRoaXMuc0EoYSx0K3MpCnI9YitzCnRoaXMuWVcoYSxy
-LGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixjKX0sCm12OmZ1bmN0aW9uKGEpe2lmKCEhYS5maXhl
-ZCRsZW5ndGgpSC52aChQLkw0KCJyZW1vdmVMYXN0IikpCmlmKGEubGVuZ3RoPT09MCl0aHJvdyBILmIo
-SC5IWShhLC0xKSkKcmV0dXJuIGEucG9wKCl9LApGVjpmdW5jdGlvbihhLGIpe3ZhciB0CkgudDYoYSku
-QygiY1g8MT4iKS5iKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJhZGRBbGwiKSkKZm9y
-KHQ9Si5JVChiKTt0LkYoKTspYS5wdXNoKHQuZ2woKSl9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpI
-LnQ2KGEpLkMoIn4oMSkiKS5iKGIpCnQ9YS5sZW5ndGgKZm9yKHM9MDtzPHQ7KytzKXtiLiQxKGFbc10p
-CmlmKGEubGVuZ3RoIT09dCl0aHJvdyBILmIoUC5hNChhKSl9fSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0PUgudDYoYSkKcmV0dXJuIG5ldyBILkE4KGEsdC5LcShjKS5DKCIxKDIpIikuYihiKSx0LkMoIkA8
-MT4iKS5LcShjKS5DKCJBODwxLDI+IikpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9bmV3IEFycmF5
-KGEubGVuZ3RoKQpzLmZpeGVkJGxlbmd0aD1BcnJheQpmb3IodD0wO3Q8YS5sZW5ndGg7Kyt0KXRoaXMu
-WShzLHQsSC5kKGFbdF0pKQpyZXR1cm4gcy5qb2luKGIpfSwKTjA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
-IHQscyxyCmQuYihiKQpILnQ2KGEpLktxKGQpLkMoIjEoMSwyKSIpLmIoYykKdD1hLmxlbmd0aApmb3Io
-cz1iLHI9MDtyPHQ7KytyKXtzPWMuJDIocyxhW3JdKQppZihhLmxlbmd0aCE9PXQpdGhyb3cgSC5iKFAu
-YTQoYSkpfXJldHVybiBzfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJu
-IEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCkQ2OmZ1bmN0aW9uKGEsYixjKXtpZihiPDB8fGI+YS5sZW5n
-dGgpdGhyb3cgSC5iKFAuVEUoYiwwLGEubGVuZ3RoLCJzdGFydCIsbnVsbCkpCmlmKGM8Ynx8Yz5hLmxl
-bmd0aCl0aHJvdyBILmIoUC5URShjLGIsYS5sZW5ndGgsImVuZCIsbnVsbCkpCmlmKGI9PT1jKXJldHVy
-biBILlZNKFtdLEgudDYoYSkpCnJldHVybiBILlZNKGEuc2xpY2UoYixjKSxILnQ2KGEpKX0sCmdyWjpm
-dW5jdGlvbihhKXt2YXIgdD1hLmxlbmd0aAppZih0PjApcmV0dXJuIGFbdC0xXQp0aHJvdyBILmIoSC5X
-cCgpKX0sCllXOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyPUgudDYoYSkKci5DKCJjWDwxPiIp
-LmIoZCkKaWYoISFhLmltbXV0YWJsZSRsaXN0KUgudmgoUC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMs
-YS5sZW5ndGgpCnQ9Yy1iCmlmKHQ9PT0wKXJldHVybgpQLmsxKGUsInNraXBDb3VudCIpCnIuQygiek08
-MT4iKS5iKGQpCnI9Si5VNihkKQppZihlK3Q+ci5nQShkKSl0aHJvdyBILmIoSC5hcigpKQppZihlPGIp
-Zm9yKHM9dC0xO3M+PTA7LS1zKWFbYitzXT1yLnEoZCxlK3MpCmVsc2UgZm9yKHM9MDtzPHQ7KytzKWFb
-YitzXT1yLnEoZCxlK3MpfSwKdmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMs
-ZCwwKX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILnQ2KGEpLkMoImEyKDEpIikuYihiKQp0PWEu
-bGVuZ3RoCmZvcihzPTA7czx0Oysrcyl7aWYoSC5vVChiLiQxKGFbc10pKSlyZXR1cm4hMAppZihhLmxl
-bmd0aCE9PXQpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIg
-dApmb3IodD0wO3Q8YS5sZW5ndGg7Kyt0KWlmKEouUk0oYVt0XSxiKSlyZXR1cm4hMApyZXR1cm4hMX0s
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sCmdrejpmdW5jdGlvbihhKXtyZXR1
-cm4gbmV3IEoubTEoYSxhLmxlbmd0aCxILnQ2KGEpLkMoIm0xPDE+IikpfSwKZ2lPOmZ1bmN0aW9uKGEp
-e3JldHVybiBILmVRKGEpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKc0E6ZnVuY3Rp
-b24oYSxiKXtpZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgic2V0IGxlbmd0aCIpKQppZihiPDAp
-dGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmEubGVuZ3RoPWJ9LApxOmZ1
-bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZKGEsYikp
-CnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC50NihhKS5kLmIoYykKaWYoISFhLmltbXV0
-YWJsZSRsaXN0KUgudmgoUC5MNCgiaW5kZXhlZCBzZXQiKSkKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJv
-dyBILmIoSC5IWShhLGIpKQphW2JdPWN9LAokaWNYOjEsCiRpek06MX0KSi5Qby5wcm90b3R5cGU9e30K
-Si5tMS5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7
-dmFyIHQscz10aGlzLHI9cy5hLHE9ci5sZW5ndGgKaWYocy5iIT09cSl0aHJvdyBILmIoSC5sayhyKSkK
-dD1zLmMKaWYodD49cSl7cy5zTShudWxsKQpyZXR1cm4hMX1zLnNNKHJbdF0pOysrcy5jCnJldHVybiEw
-fSwKc006ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KSi5xSS5wcm90
-b3R5cGU9ewp5dTpmdW5jdGlvbihhKXt2YXIgdAppZihhPj0tMjE0NzQ4MzY0OCYmYTw9MjE0NzQ4MzY0
-NylyZXR1cm4gYXwwCmlmKGlzRmluaXRlKGEpKXt0PWE8MD9NYXRoLmNlaWwoYSk6TWF0aC5mbG9vcihh
-KQpyZXR1cm4gdCswfXRocm93IEguYihQLkw0KCIiK2ErIi50b0ludCgpIikpfSwKelE6ZnVuY3Rpb24o
-YSl7aWYoYT4wKXtpZihhIT09MS8wKXJldHVybiBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJl
-dHVybiAwLU1hdGgucm91bmQoMC1hKQp0aHJvdyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sClda
-OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEKaWYoYjwyfHxiPjM2KXRocm93IEguYihQLlRFKGIsMiwz
-NiwicmFkaXgiLG51bGwpKQp0PWEudG9TdHJpbmcoYikKaWYoQy54Qi5tKHQsdC5sZW5ndGgtMSkhPT00
-MSlyZXR1cm4gdApzPS9eKFtcZGEtel0rKSg/OlwuKFtcZGEtel0rKSk/XChlXCsoXGQrKVwpJC8uZXhl
-Yyh0KQppZihzPT1udWxsKUgudmgoUC5MNCgiVW5leHBlY3RlZCB0b1N0cmluZyByZXN1bHQ6ICIrdCkp
-CnI9cy5sZW5ndGgKaWYoMT49cilyZXR1cm4gSC5PSChzLDEpCnQ9c1sxXQppZigzPj1yKXJldHVybiBI
-Lk9IKHMsMykKcT0rc1szXQpyPXNbMl0KaWYociE9bnVsbCl7dCs9cgpxLT1yLmxlbmd0aH1yZXR1cm4g
-dCtDLnhCLkl4KCIwIixxKX0sCnc6ZnVuY3Rpb24oYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiItMC4w
-IgplbHNlIHJldHVybiIiK2F9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD1hfDAKaWYoYT09
-PXApcmV0dXJuIDUzNjg3MDkxMSZwCnQ9TWF0aC5hYnMoYSkKcz1NYXRoLmxvZyh0KS8wLjY5MzE0NzE4
-MDU1OTk0NTN8MApyPU1hdGgucG93KDIscykKcT10PDE/dC9yOnIvdApyZXR1cm4gNTM2ODcwOTExJigo
-cSo5MDA3MTk5MjU0NzQwOTkyfDApKyhxKjM1NDIyNDMxODExNzY1MjF8MCkpKjU5OTE5NytzKjEyNTl9
-LAp6WTpmdW5jdGlvbihhLGIpe3ZhciB0PWElYgppZih0PT09MClyZXR1cm4gMAppZih0PjApcmV0dXJu
-IHQKaWYoYjwwKXJldHVybiB0LWIKZWxzZSByZXR1cm4gdCtifSwKd0c6ZnVuY3Rpb24oYSxiKXt2YXIg
-dAppZihhPjApdD10aGlzLnAzKGEsYikKZWxzZXt0PWI+MzE/MzE6Ygp0PWE+PnQ+Pj4wfXJldHVybiB0
-fSwKYmY6ZnVuY3Rpb24oYSxiKXtpZihiPDApdGhyb3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlzLnAz
-KGEsYil9LApwMzpmdW5jdGlvbihhLGIpe3JldHVybiBiPjMxPzA6YT4+PmJ9LAokaUNQOjEsCiRpRks6
-MX0KSi51ci5wcm90b3R5cGU9eyRpS046MX0KSi5WQS5wcm90b3R5cGU9e30KSi5Eci5wcm90b3R5cGU9
-ewptOmZ1bmN0aW9uKGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikpCmlmKGI+PWEubGVuZ3Ro
-KUgudmgoSC5IWShhLGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKVzpmdW5jdGlvbihhLGIpe2lm
-KGI+PWEubGVuZ3RoKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApk
-ZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC51bihiLGEsMCl9LApoOmZ1bmN0aW9uKGEsYil7aWYo
-dHlwZW9mIGIhPSJzdHJpbmciKXRocm93IEguYihQLkwzKGIsbnVsbCxudWxsKSkKcmV0dXJuIGErYn0s
-ClRjOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Yi5sZW5ndGgscz1hLmxlbmd0aAppZih0PnMpcmV0dXJuITEK
-cmV0dXJuIGI9PT10aGlzLkcoYSxzLXQpfSwKaTc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscwpjPVAu
-akIoYixjLGEubGVuZ3RoKQp0PWEuc3Vic3RyaW5nKDAsYikKcz1hLnN1YnN0cmluZyhjKQpyZXR1cm4g
-dCtkK3N9LApRaTpmdW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoIUgub2soYykpSC52aChILnRMKGMpKQpp
-Zih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBjLkooKQppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cg
-SC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnQ9YytiLmxlbmd0aAppZih0PmEubGVuZ3Ro
-KXJldHVybiExCnJldHVybiBiPT09YS5zdWJzdHJpbmcoYyx0KX0sCm46ZnVuY3Rpb24oYSxiKXtyZXR1
-cm4gdGhpcy5RaShhLGIsMCl9LApOajpmdW5jdGlvbihhLGIsYyl7aWYoIUgub2soYikpSC52aChILnRM
-KGIpKQppZihjPT1udWxsKWM9YS5sZW5ndGgKaWYodHlwZW9mIGIhPT0ibnVtYmVyIilyZXR1cm4gYi5K
-KCkKaWYoYjwwKXRocm93IEguYihQLngoYixudWxsKSkKaWYoYj5jKXRocm93IEguYihQLngoYixudWxs
-KSkKaWYoYz5hLmxlbmd0aCl0aHJvdyBILmIoUC54KGMsbnVsbCkpCnJldHVybiBhLnN1YnN0cmluZyhi
-LGMpfSwKRzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLk5qKGEsYixudWxsKX0sCmhjOmZ1bmN0aW9u
-KGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9LApiUzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLnRy
-aW0oKSxwPXEubGVuZ3RoCmlmKHA9PT0wKXJldHVybiBxCmlmKHRoaXMuVyhxLDApPT09MTMzKXt0PUou
-bW0ocSwxKQppZih0PT09cClyZXR1cm4iIn1lbHNlIHQ9MApzPXAtMQpyPXRoaXMubShxLHMpPT09MTMz
-P0ouYzEocSxzKTpwCmlmKHQ9PT0wJiZyPT09cClyZXR1cm4gcQpyZXR1cm4gcS5zdWJzdHJpbmcodCxy
-KX0sCkl4OmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZigwPj1iKXJldHVybiIiCmlmKGI9PT0xfHxhLmxl
-bmd0aD09PTApcmV0dXJuIGEKaWYoYiE9PWI+Pj4wKXRocm93IEguYihDLkVxKQpmb3IodD1hLHM9IiI7
-ITA7KXtpZigoYiYxKT09PTEpcz10K3MKYj1iPj4+MQppZihiPT09MClicmVhawp0Kz10fXJldHVybiBz
-fSwKWFU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5U
-RShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKdD1hLmluZGV4T2YoYixjKQpyZXR1cm4gdH0sCk9ZOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWFUoYSxiLDApfSwKUGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
-LHMKaWYoYz09bnVsbCljPWEubGVuZ3RoCmVsc2UgaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQ
-LlRFKGMsMCxhLmxlbmd0aCxudWxsLG51bGwpKQp0PWIubGVuZ3RoCnM9YS5sZW5ndGgKaWYoYyt0PnMp
-Yz1zLXQKcmV0dXJuIGEubGFzdEluZGV4T2YoYixjKX0sCmNuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRo
-aXMuUGsoYSxiLG51bGwpfSwKSXM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PWEubGVuZ3RoCmlmKGM+dCl0
-aHJvdyBILmIoUC5URShjLDAsdCxudWxsLG51bGwpKQpyZXR1cm4gSC5tMihhLGIsYyl9LAp0ZzpmdW5j
-dGlvbihhLGIpe3JldHVybiB0aGlzLklzKGEsYiwwKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApn
-aU86ZnVuY3Rpb24oYSl7dmFyIHQscyxyCmZvcih0PWEubGVuZ3RoLHM9MCxyPTA7cjx0Oysrcil7cz01
-MzY4NzA5MTEmcythLmNoYXJDb2RlQXQocikKcz01MzY4NzA5MTEmcysoKDUyNDI4NyZzKTw8MTApCnNe
-PXM+PjZ9cz01MzY4NzA5MTEmcysoKDY3MTA4ODYzJnMpPDwzKQpzXj1zPj4xMQpyZXR1cm4gNTM2ODcw
-OTExJnMrKCgxNjM4MyZzKTw8MTUpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpm
-dW5jdGlvbihhLGIpe0guU2MoYikKaWYoYj49YS5sZW5ndGh8fCExKXRocm93IEguYihILkhZKGEsYikp
-CnJldHVybiBhW2JdfSwKJGl2WDoxLAokaXFVOjF9CkgucWoucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMueEIubSh0aGlz
-LmEsSC5TYyhiKSl9fQpILmJRLnByb3RvdHlwZT17fQpILmFMLnByb3RvdHlwZT17CmdrejpmdW5jdGlv
-bihhKXt2YXIgdD10aGlzCnJldHVybiBuZXcgSC5hNyh0LHQuZ0EodCksSC5MaCh0KS5DKCJhNzxhTC5F
-PiIpKX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscT10aGlzLHA9cS5nQShxKQppZihiLmxlbmd0
-aCE9PTApe2lmKHA9PT0wKXJldHVybiIiCnQ9SC5kKHEuRSgwLDApKQppZihwIT09cS5nQShxKSl0aHJv
-dyBILmIoUC5hNChxKSkKZm9yKHM9dCxyPTE7cjxwOysrcil7cz1zK2IrSC5kKHEuRSgwLHIpKQppZihw
-IT09cS5nQShxKSl0aHJvdyBILmIoUC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9
-ZWxzZXtmb3Iocj0wLHM9IiI7cjxwOysrcil7cys9SC5kKHEuRSgwLHIpKQppZihwIT09cS5nQShxKSl0
-aHJvdyBILmIoUC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fSwKZXY6ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gdGhpcy5HRygwLEguTGgodGhpcykuQygiYTIoYUwuRSkiKS5iKGIpKX19Ckgu
-bkgucHJvdG90eXBlPXsKZ1VEOmZ1bmN0aW9uKCl7dmFyIHQ9Si5IbSh0aGlzLmEpLHM9dGhpcy5jCmlm
-KHM9PW51bGx8fHM+dClyZXR1cm4gdApyZXR1cm4gc30sCmdBczpmdW5jdGlvbigpe3ZhciB0PUouSG0o
-dGhpcy5hKSxzPXRoaXMuYgppZihzPnQpcmV0dXJuIHQKcmV0dXJuIHN9LApnQTpmdW5jdGlvbihhKXt2
-YXIgdCxzPUouSG0odGhpcy5hKSxyPXRoaXMuYgppZihyPj1zKXJldHVybiAwCnQ9dGhpcy5jCmlmKHQ9
-PW51bGx8fHQ+PXMpcmV0dXJuIHMtcgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkhOKCkK
-cmV0dXJuIHQtcn0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMscj1zLmdBcygpK2IKaWYoYj49
-MCl7dD1zLmdVRCgpCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIEgucFkodCkKdD1yPj10fWVs
-c2UgdD0hMAppZih0KXRocm93IEguYihQLkNmKGIscywiaW5kZXgiLG51bGwsbnVsbCkpCnJldHVybiBK
-LkFNKHMuYSxyKX19CkguYTcucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwK
-RjpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcyxyPXMuYSxxPUouVTYocikscD1xLmdBKHIpCmlmKHMuYiE9
-PXApdGhyb3cgSC5iKFAuYTQocikpCnQ9cy5jCmlmKHQ+PXApe3Muc0kobnVsbCkKcmV0dXJuITF9cy5z
-SShxLkUocix0KSk7KytzLmMKcmV0dXJuITB9LApzSTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGku
-ZC5iKGEpfSwKJGlBbjoxfQpILkE4LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkht
-KHRoaXMuYSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYi4kMShKLkFNKHRoaXMuYSxiKSl9
-fQpILlU1LnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguU08oSi5JVCh0aGlz
-LmEpLHRoaXMuYix0aGlzLiR0aS5DKCJTTzwxPiIpKX19CkguU08ucHJvdG90eXBlPXsKRjpmdW5jdGlv
-bigpe3ZhciB0LHMKZm9yKHQ9dGhpcy5hLHM9dGhpcy5iO3QuRigpOylpZihILm9UKHMuJDEodC5nbCgp
-KSkpcmV0dXJuITAKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19Ckgu
-U1UucHJvdG90eXBlPXt9CkguUmUucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5MaCh0aGlz
-KS5DKCJSZS5FIikuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFi
-bGUgbGlzdCIpKX19CkguWEMucHJvdG90eXBlPXt9Ckgud3YucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMuX2hhc2hDb2RlCmlmKHQhPW51bGwpcmV0dXJuIHQKdD01MzY4NzA5MTEmNjY0
-NTk3KkouaGYodGhpcy5hKQp0aGlzLl9oYXNoQ29kZT10CnJldHVybiB0fSwKdzpmdW5jdGlvbihhKXty
-ZXR1cm4nU3ltYm9sKCInK0guZCh0aGlzLmEpKyciKSd9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51
-bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBILnd2JiZ0aGlzLmE9PWIuYX0sCiRpR0Q6MX0K
-SC5QRC5wcm90b3R5cGU9e30KSC5XVS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5P
-KHRoaXMpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0LmQuYihiKQp0LmNoWzFd
-LmIoYykKcmV0dXJuIEguZGMoKX0sCiRpWjA6MX0KSC5MUC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy5hfSwKeDQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVy
-biExCmlmKCJfX3Byb3RvX18iPT09YSlyZXR1cm4hMQpyZXR1cm4gdGhpcy5iLmhhc093blByb3BlcnR5
-KGEpfSwKcTpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLng0KGIpKXJldHVybgpyZXR1cm4gdGhpcy5xUChi
-KX0sCnFQOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJbSC55KGEpXX0sCks6ZnVuY3Rpb24oYSxiKXt2
-YXIgdCxzLHIscSxwPUguTGgodGhpcykKcC5DKCJ+KDEsMikiKS5iKGIpCnQ9dGhpcy5jCmZvcihzPXQu
-bGVuZ3RoLHA9cC5jaFsxXSxyPTA7cjxzOysrcil7cT10W3JdCmIuJDIocSxwLmIodGhpcy5xUChxKSkp
-fX19CkguTEkucHJvdG90eXBlPXsKZ1dhOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hCnJldHVybiB0fSwK
-Z25kOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzCmlmKHAuYz09PTEpcmV0dXJuIEMuaFUKdD1w
-LmQKcz10Lmxlbmd0aC1wLmUubGVuZ3RoLXAuZgppZihzPT09MClyZXR1cm4gQy5oVQpyPVtdCmZvcihx
-PTA7cTxzOysrcSl7aWYocT49dC5sZW5ndGgpcmV0dXJuIEguT0godCxxKQpyLnB1c2godFtxXSl9cmV0
-dXJuIEouekMocil9LApnVm06ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9dGhpcwppZihs
-LmMhPT0wKXJldHVybiBDLkNNCnQ9bC5lCnM9dC5sZW5ndGgKcj1sLmQKcT1yLmxlbmd0aC1zLWwuZgpp
-ZihzPT09MClyZXR1cm4gQy5DTQpwPW5ldyBILk41KHUuZW8pCmZvcihvPTA7bzxzOysrbyl7aWYobz49
-dC5sZW5ndGgpcmV0dXJuIEguT0godCxvKQpuPXRbb10KbT1xK28KaWYobTwwfHxtPj1yLmxlbmd0aCly
-ZXR1cm4gSC5PSChyLG0pCnAuWSgwLG5ldyBILnd2KG4pLHJbbV0pfXJldHVybiBuZXcgSC5QRChwLHUu
-Z0YpfSwKJGl2UToxfQpILkNqLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQKSC55KGEp
-CnQ9dGhpcy5hCnQuYj10LmIrIiQiK0guZChhKQpDLk5tLmkodGhpcy5iLGEpCkMuTm0uaSh0aGlzLmMs
-Yik7Kyt0LmF9LAokUzoxM30KSC5aci5wcm90b3R5cGU9ewpxUzpmdW5jdGlvbihhKXt2YXIgdCxzLHI9
-dGhpcyxxPW5ldyBSZWdFeHAoci5hKS5leGVjKGEpCmlmKHE9PW51bGwpcmV0dXJuCnQ9T2JqZWN0LmNy
-ZWF0ZShudWxsKQpzPXIuYgppZihzIT09LTEpdC5hcmd1bWVudHM9cVtzKzFdCnM9ci5jCmlmKHMhPT0t
-MSl0LmFyZ3VtZW50c0V4cHI9cVtzKzFdCnM9ci5kCmlmKHMhPT0tMSl0LmV4cHI9cVtzKzFdCnM9ci5l
-CmlmKHMhPT0tMSl0Lm1ldGhvZD1xW3MrMV0Kcz1yLmYKaWYocyE9PS0xKXQucmVjZWl2ZXI9cVtzKzFd
-CnJldHVybiB0fX0KSC5XMC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYgppZih0
-PT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIitILmQodGhpcy5hKQpyZXR1cm4iTm9TdWNo
-TWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK3QrIicgb24gbnVsbCJ9fQpILmF6LnByb3Rv
-dHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLHI9Ik5vU3VjaE1ldGhvZEVycm9yOiBtZXRo
-b2Qgbm90IGZvdW5kOiAnIixxPXMuYgppZihxPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjog
-IitILmQocy5hKQp0PXMuYwppZih0PT1udWxsKXJldHVybiByK3ErIicgKCIrSC5kKHMuYSkrIikiCnJl
-dHVybiByK3ErIicgb24gJyIrdCsiJyAoIitILmQocy5hKSsiKSJ9fQpILnZWLnByb3RvdHlwZT17Cnc6
-ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybiB0Lmxlbmd0aD09PTA/IkVycm9yIjoiRXJyb3I6
-ICIrdH19CkguYnEucHJvdG90eXBlPXt9CkguQW0ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7aWYo
-dS5iVS5jKGEpKWlmKGEuJHRocm93bkpzRXJyb3I9PW51bGwpYS4kdGhyb3duSnNFcnJvcj10aGlzLmEK
-cmV0dXJuIGF9LAokUzozfQpILlhPLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlz
-LmIKaWYocyE9bnVsbClyZXR1cm4gcwpzPXRoaXMuYQp0PXMhPT1udWxsJiZ0eXBlb2Ygcz09PSJvYmpl
-Y3QiP3Muc3RhY2s6bnVsbApyZXR1cm4gdGhpcy5iPXQ9PW51bGw/IiI6dH0sCiRpR3o6MX0KSC5UcC5w
-cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuY29uc3RydWN0b3Iscz10PT1udWxsP251
-bGw6dC5uYW1lCnJldHVybiJDbG9zdXJlICciK0guTlEocz09bnVsbD8idW5rbm93biI6cykrIicifSwK
-JGlFSDoxLApnUWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCiRDOiIkMSIsCiRSOjEsCiREOm51bGx9
-CkgubGMucHJvdG90eXBlPXt9CkguengucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlz
-LiRzdGF0aWNfbmFtZQppZih0PT1udWxsKXJldHVybiJDbG9zdXJlIG9mIHVua25vd24gc3RhdGljIG1l
-dGhvZCIKcmV0dXJuIkNsb3N1cmUgJyIrSC5OUSh0KSsiJyJ9fQpILnJULnByb3RvdHlwZT17CkROOmZ1
-bmN0aW9uKGEsYil7dmFyIHQ9dGhpcwppZihiPT1udWxsKXJldHVybiExCmlmKHQ9PT1iKXJldHVybiEw
-CmlmKCEoYiBpbnN0YW5jZW9mIEguclQpKXJldHVybiExCnJldHVybiB0LmE9PT1iLmEmJnQuYj09PWIu
-YiYmdC5jPT09Yi5jfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5jCmlmKHM9PW51bGwpdD1I
-LmVRKHRoaXMuYSkKZWxzZSB0PXR5cGVvZiBzIT09Im9iamVjdCI/Si5oZihzKTpILmVRKHMpCnJldHVy
-bih0XkguZVEodGhpcy5iKSk+Pj4wfSwKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmMKaWYodD09bnVs
-bCl0PXRoaXMuYQpyZXR1cm4iQ2xvc3VyZSAnIitILmQodGhpcy5kKSsiJyBvZiAiKygiSW5zdGFuY2Ug
-b2YgJyIrSC5kKEguTSh0KSkrIiciKX19CkguRXEucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1
-cm4iUnVudGltZUVycm9yOiAiK0guZCh0aGlzLmEpfX0KSC5rWS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
-KGEpe3JldHVybiJBc3NlcnRpb24gZmFpbGVkOiAiK1AucCh0aGlzLmEpfX0KSC5ONS5wcm90b3R5cGU9
-ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKZ1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEgu
-aTUodGhpcyxILkxoKHRoaXMpLkMoImk1PDE+IikpfSwKeDQ6ZnVuY3Rpb24oYSl7dmFyIHQscwppZih0
-eXBlb2YgYT09InN0cmluZyIpe3Q9dGhpcy5iCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMu
-WHUodCxhKX1lbHNle3M9dGhpcy5DWChhKQpyZXR1cm4gc319LApDWDpmdW5jdGlvbihhKXt2YXIgdD10
-aGlzLmQKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhpcy5GaCh0aGlzLkJ0KHQsSi5oZihhKSYw
-eDNmZmZmZmYpLGEpPj0wfSwKcTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9dGhpcwppZih0eXBl
-b2YgYj09InN0cmluZyIpe3Q9cC5iCmlmKHQ9PW51bGwpcmV0dXJuCnM9cC5qMih0LGIpCnI9cz09bnVs
-bD9udWxsOnMuYgpyZXR1cm4gcn1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZm
-KT09PWIpe3E9cC5jCmlmKHE9PW51bGwpcmV0dXJuCnM9cC5qMihxLGIpCnI9cz09bnVsbD9udWxsOnMu
-YgpyZXR1cm4gcn1lbHNlIHJldHVybiBwLmFhKGIpfSwKYWE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRo
-aXMuZAppZihyPT1udWxsKXJldHVybgp0PXRoaXMuQnQocixKLmhmKGEpJjB4M2ZmZmZmZikKcz10aGlz
-LkZoKHQsYSkKaWYoczwwKXJldHVybgpyZXR1cm4gdFtzXS5ifSwKWTpmdW5jdGlvbihhLGIsYyl7dmFy
-IHQscyxyLHEscCxvLG49dGhpcyxtPUguTGgobikKbS5kLmIoYikKbS5jaFsxXS5iKGMpCmlmKHR5cGVv
-ZiBiPT0ic3RyaW5nIil7dD1uLmIKbi5FSCh0PT1udWxsP24uYj1uLnpLKCk6dCxiLGMpfWVsc2UgaWYo
-dHlwZW9mIGI9PSJudW1iZXIiJiYoYiYweDNmZmZmZmYpPT09Yil7cz1uLmMKbi5FSChzPT1udWxsP24u
-Yz1uLnpLKCk6cyxiLGMpfWVsc2V7cj1uLmQKaWYocj09bnVsbClyPW4uZD1uLnpLKCkKcT1KLmhmKGIp
-JjB4M2ZmZmZmZgpwPW4uQnQocixxKQppZihwPT1udWxsKW4uRUkocixxLFtuLkhuKGIsYyldKQplbHNl
-e289bi5GaChwLGIpCmlmKG8+PTApcFtvXS5iPWMKZWxzZSBwLnB1c2gobi5IbihiLGMpKX19fSwKSzpm
-dW5jdGlvbihhLGIpe3ZhciB0LHMscj10aGlzCkguTGgocikuQygifigxLDIpIikuYihiKQp0PXIuZQpz
-PXIucgpmb3IoO3QhPW51bGw7KXtiLiQyKHQuYSx0LmIpCmlmKHMhPT1yLnIpdGhyb3cgSC5iKFAuYTQo
-cikpCnQ9dC5jfX0sCkVIOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPXRoaXMscj1ILkxoKHMpCnIuZC5i
-KGIpCnIuY2hbMV0uYihjKQp0PXMuajIoYSxiKQppZih0PT1udWxsKXMuRUkoYSxiLHMuSG4oYixjKSkK
-ZWxzZSB0LmI9Y30sCmtzOmZ1bmN0aW9uKCl7dGhpcy5yPXRoaXMucisxJjY3MTA4ODYzfSwKSG46ZnVu
-Y3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMscj1ILkxoKHMpLHE9bmV3IEguZGIoci5kLmIoYSksci5jaFsx
-XS5iKGIpKQppZihzLmU9PW51bGwpcy5lPXMuZj1xCmVsc2V7dD1zLmYKcS5kPXQKcy5mPXQuYz1xfSsr
-cy5hCnMua3MoKQpyZXR1cm4gcX0sCkZoOmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZihhPT1udWxsKXJl
-dHVybi0xCnQ9YS5sZW5ndGgKZm9yKHM9MDtzPHQ7KytzKWlmKEouUk0oYVtzXS5hLGIpKXJldHVybiBz
-CnJldHVybi0xfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCmoyOmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIGFbYl19LApCdDpmdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfSwKRUk6ZnVuY3Rpb24o
-YSxiLGMpe2FbYl09Y30sCnJuOmZ1bmN0aW9uKGEsYil7ZGVsZXRlIGFbYl19LApYdTpmdW5jdGlvbihh
-LGIpe3JldHVybiB0aGlzLmoyKGEsYikhPW51bGx9LAp6SzpmdW5jdGlvbigpe3ZhciB0PSI8bm9uLWlk
-ZW50aWZpZXIta2V5PiIscz1PYmplY3QuY3JlYXRlKG51bGwpCnRoaXMuRUkocyx0LHMpCnRoaXMucm4o
-cyx0KQpyZXR1cm4gc30sCiRpRm86MX0KSC5kYi5wcm90b3R5cGU9e30KSC5pNS5wcm90b3R5cGU9ewpn
-QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmF9LApna3o6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5h
-LHM9bmV3IEguTjYodCx0LnIsdGhpcy4kdGkuQygiTjY8MT4iKSkKcy5jPXQuZQpyZXR1cm4gc319Ckgu
-TjYucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3Zh
-ciB0PXRoaXMscz10LmEKaWYodC5iIT09cy5yKXRocm93IEguYihQLmE0KHMpKQplbHNle3M9dC5jCmlm
-KHM9PW51bGwpe3Quc3FZKG51bGwpCnJldHVybiExfWVsc2V7dC5zcVkocy5hKQp0LmM9dC5jLmMKcmV0
-dXJuITB9fX0sCnNxWTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlBbjoxfQpI
-LmRDLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoYSl9LAokUzozfQpILndO
-LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYShhLGIpfSwKJFM6Mzh9Ckgu
-VlgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYShILnkoYSkpfSwKJFM6Mzd9
-CkguVlIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5hKyIvIit0
-aGlzLmIuZmxhZ3N9LApnSGM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5jCmlmKHMhPW51bGwpcmV0
-dXJuIHMKcz10LmIKcmV0dXJuIHQuYz1ILnY0KHQuYSxzLm11bHRpbGluZSwhcy5pZ25vcmVDYXNlLHMu
-dW5pY29kZSxzLmRvdEFsbCwhMCl9LApkZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5LVyh0aGlz
-LGIsMCl9LApVWjpmdW5jdGlvbihhLGIpe3ZhciB0LHM9dGhpcy5nSGMoKQpzLmxhc3RJbmRleD1iCnQ9
-cy5leGVjKGEpCmlmKHQ9PW51bGwpcmV0dXJuCnJldHVybiBuZXcgSC5FSyh0KX0sCiRpdlg6MSwKJGl3
-TDoxfQpILkVLLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXt2YXIgdApILlNjKGIpCnQ9dGhpcy5i
-CmlmKGI+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsYikKcmV0dXJuIHRbYl19LAokaU9kOjEsCiRpaWI6
-MX0KSC5LVy5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlBiKHRoaXMuYSx0
-aGlzLmIsdGhpcy5jKX19CkguUGIucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5k
-fSwKRjpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcyxvPXAuYgppZihvPT1udWxsKXJldHVybiEx
-CnQ9cC5jCmlmKHQ8PW8ubGVuZ3RoKXtzPXAuYQpyPXMuVVoobyx0KQppZihyIT1udWxsKXtwLmQ9cgpv
-PXIuYgp0PW8uaW5kZXgKcT10K29bMF0ubGVuZ3RoCmlmKHQ9PT1xKXtpZihzLmIudW5pY29kZSl7bz1w
-LmMKdD1vKzEKcz1wLmIKaWYodDxzLmxlbmd0aCl7bz1KLnJZKHMpLm0ocyxvKQppZihvPj01NTI5NiYm
-bzw9NTYzMTkpe289Qy54Qi5tKHMsdCkKbz1vPj01NjMyMCYmbzw9NTczNDN9ZWxzZSBvPSExfWVsc2Ug
-bz0hMX1lbHNlIG89ITEKcT0obz9xKzE6cSkrMX1wLmM9cQpyZXR1cm4hMH19cC5iPXAuZD1udWxsCnJl
-dHVybiExfSwKJGlBbjoxfQpILnRRLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCmlm
-KGIhPT0wKUgudmgoUC54KGIsbnVsbCkpCnJldHVybiB0aGlzLmN9LAokaU9kOjF9CkgudW4ucHJvdG90
-eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9
-fQpILlNkLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcyxxPXIuYyxwPXIuYixv
-PXAubGVuZ3RoLG49ci5hLG09bi5sZW5ndGgKaWYocStvPm0pe3IuZD1udWxsCnJldHVybiExfXQ9bi5p
-bmRleE9mKHAscSkKaWYodDwwKXtyLmM9bSsxCnIuZD1udWxsCnJldHVybiExfXM9dCtvCnIuZD1uZXcg
-SC50USh0LHApCnIuYz1zPT09ci5jP3MrMTpzCnJldHVybiEwfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4g
-dGhpcy5kfSwKJGlBbjoxfQpILkVULnByb3RvdHlwZT17JGlFVDoxLCRpQVM6MX0KSC5iMC5wcm90b3R5
-cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LAokaVhqOjF9CkguRGcucHJvdG90eXBl
-PXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfSwK
-WTpmdW5jdGlvbihhLGIsYyl7SC5JZyhjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGljWDox
-LAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhjKQpILm9kKGIs
-YSxhLmxlbmd0aCkKYVtiXT1jfSwKJGljWDoxLAokaXpNOjF9CkgueGoucHJvdG90eXBlPXsKcTpmdW5j
-dGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kRS5wcm90
+UHYoYSwibnVtIikpfSwKRE46ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBh
+CmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJudW0iKSl9LApNTTpmdW5jdGlvbihh
+KXtyZXR1cm4gdHlwZW9mIGE9PSJzdHJpbmcifSwKYzA6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJz
+dHJpbmciKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiU3RyaW5n
+IikpfSwKeTpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYoYT09bnVs
+bClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIlN0cmluZyIpKX0sCmlvOmZ1bmN0aW9uKGEsYil7dmFy
+IHQscyxyCmZvcih0PSIiLHM9IiIscj0wO3I8YS5sZW5ndGg7KytyLHM9IiwgIil0Kz1DLnhCLmgocyxI
+LmRtKGFbcl0sYikpCnJldHVybiB0fSwKYkk6ZnVuY3Rpb24oYTAsYTEsYTIpe3ZhciB0LHMscixxLHAs
+byxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGE9IiwgIgppZihhMiE9bnVsbCl7dD1hMi5sZW5ndGgK
+aWYoYTE9PW51bGwpe2ExPUguVk0oW10sdS5zKQpzPW51bGx9ZWxzZSBzPWExLmxlbmd0aApyPWExLmxl
+bmd0aApmb3IocT10O3E+MDstLXEpQy5ObS5pKGExLCJUIisocitxKSkKZm9yKHA9IjwiLG89IiIscT0w
+O3E8dDsrK3Esbz1hKXtwKz1vCm49YTEubGVuZ3RoCm09bi0xLXEKaWYobTwwKXJldHVybiBILk9IKGEx
+LG0pCnA9Qy54Qi5oKHAsYTFbbV0pCmw9YTJbcV0KaWYoIUguY2MobCkpcCs9Qy54Qi5oKCIgZXh0ZW5k
+cyAiLEguZG0obCxhMSkpfXArPSI+In1lbHNle3A9IiIKcz1udWxsfW49YTAuUQprPWEwLmNoCmo9ay5h
+Cmk9ai5sZW5ndGgKaD1rLmIKZz1oLmxlbmd0aApmPWsuYwplPWYubGVuZ3RoCmQ9SC5kbShuLGExKQpm
+b3IoYz0iIixiPSIiLHE9MDtxPGk7KytxLGI9YSljKz1DLnhCLmgoYixILmRtKGpbcV0sYTEpKQppZihn
+PjApe2MrPWIrIlsiCmZvcihiPSIiLHE9MDtxPGc7KytxLGI9YSljKz1DLnhCLmgoYixILmRtKGhbcV0s
+YTEpKQpjKz0iXSJ9aWYoZT4wKXtjKz1iKyJ7Igpmb3IoYj0iIixxPTA7cTxlO3ErPTIsYj1hKWMrPUMu
+eEIuaChiLEguZG0oZltxKzFdLGExKSkrIiAiK2ZbcV0KYys9In0ifWlmKHMhPW51bGwpYTEubGVuZ3Ro
+PXMKcmV0dXJuIHArIigiK2MrIikgPT4gIitILmQoZCl9LApkbTpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
+cixxLHA9YS56CmlmKHA9PT01KXJldHVybiJlcmFzZWQiCmlmKHA9PT0yKXJldHVybiJkeW5hbWljIgpp
+ZihwPT09MylyZXR1cm4idm9pZCIKaWYocD09PTEpcmV0dXJuIk5ldmVyIgppZihwPT09NClyZXR1cm4i
+YW55IgppZihwPT09NilyZXR1cm4gSC5kKEguZG0oYS5RLGIpKSsiKiIKaWYocD09PTcpcmV0dXJuIEgu
+ZChILmRtKGEuUSxiKSkrIj8iCmlmKHA9PT04KXJldHVybiJGdXR1cmVPcjwiK0guZChILmRtKGEuUSxi
+KSkrIj4iCmlmKHA9PT05KXt0PUgubzMoYS5RKQpzPWEuY2gKcmV0dXJuIHMubGVuZ3RoIT09MD90Kygi
+PCIrSC5pbyhzLGIpKyI+Iik6dH1pZihwPT09MTEpcmV0dXJuIEguYkkoYSxiLG51bGwpCmlmKHA9PT0x
+MilyZXR1cm4gSC5iSShhLlEsYixhLmNoKQppZihwPT09MTMpe3I9YS5RCnE9Yi5sZW5ndGgKcj1xLTEt
+cgppZihyPDB8fHI+PXEpcmV0dXJuIEguT0goYixyKQpyZXR1cm4gYltyXX1yZXR1cm4iPyJ9LApvMzpm
+dW5jdGlvbihhKXt2YXIgdCxzPUguSmcoYSkKaWYocyE9bnVsbClyZXR1cm4gcwp0PSJtaW5pZmllZDoi
+K2EKcmV0dXJuIHR9LApRbzpmdW5jdGlvbihhLGIpe3ZhciB0PWEudFJbYl0KZm9yKDt0eXBlb2YgdD09
+InN0cmluZyI7KXQ9YS50Ult0XQpyZXR1cm4gdH0sCmFpOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEs
+cCxvPWEuZVQsbj1vW2JdCmlmKG49PW51bGwpcmV0dXJuIEguRShhLGIpCmVsc2UgaWYodHlwZW9mIG49
+PSJudW1iZXIiKXt0PW4Kcz1ILm0oYSw1LCIjIikKcj1bXQpmb3IocT0wO3E8dDsrK3Epci5wdXNoKHMp
+CnA9SC5KKGEsYixyKQpvW2JdPXAKcmV0dXJuIHB9ZWxzZSByZXR1cm4gbn0sCnhiOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIEguSXgoYS50UixiKX0sCkZGOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguSXgoYS5lVCxi
+KX0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPWEuZUMscj1zLmdldChiKQppZihyIT1udWxsKXJldHVy
+biByCnQ9SC56KGEsbnVsbCxiKQpzLnNldChiLHQpCnJldHVybiB0fSwKY0U6ZnVuY3Rpb24oYSxiLGMp
+e3ZhciB0LHMscj1iLmN4CmlmKHI9PW51bGwpcj1iLmN4PW5ldyBNYXAoKQp0PXIuZ2V0KGMpCmlmKHQh
+PW51bGwpcmV0dXJuIHQKcz1ILnooYSxiLGMpCnIuc2V0KGMscykKcmV0dXJuIHN9LAp2NTpmdW5jdGlv
+bihhLGIsYyl7dmFyIHQscyxyLHE9Yi5jeQppZihxPT1udWxsKXE9Yi5jeT1uZXcgTWFwKCkKdD1jLmRi
+CnM9cS5nZXQodCkKaWYocyE9bnVsbClyZXR1cm4gcwpyPUguYShhLGIsYy56PT09MTA/Yy5jaDpbY10p
+CnEuc2V0KHQscikKcmV0dXJuIHJ9LAp6OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILmkoSC5vKGEsYixj
+KSkKcmV0dXJuIHR9LApXRzpmdW5jdGlvbihhLGIpe3ZhciB0PWIuZGIKYS5lQy5zZXQodCxiKQpiLmE9
+SC5PegpiLmI9SC5BdgpiLmM9SC5KSgpyZXR1cm4gYn0sCm06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHM9
+YS5lQy5nZXQoYykKaWYocyE9bnVsbClyZXR1cm4gcwp0PW5ldyBILkpjKG51bGwsbnVsbCxudWxsKQp0
+Lno9Ygp0LmRiPWMKcmV0dXJuIEguV0coYSx0KX0sCnY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscz1h
+LmVDLmdldChkKQppZihzIT1udWxsKXJldHVybiBzCnQ9bmV3IEguSmMobnVsbCxudWxsLG51bGwpCnQu
+ej1iCnQuUT1jCnQuZGI9ZApyZXR1cm4gSC5XRyhhLHQpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9
+IiIrYisiXiIscj1hLmVDLmdldChzKQppZihyIT1udWxsKXJldHVybiByCnQ9bmV3IEguSmMobnVsbCxu
+dWxsLG51bGwpCnQuej0xMwp0LlE9Ygp0LmRiPXMKcmV0dXJuIEguV0coYSx0KX0sClV4OmZ1bmN0aW9u
+KGEpe3ZhciB0LHMscixxPWEubGVuZ3RoCmZvcih0PSIiLHM9IiIscj0wO3I8cTsrK3Iscz0iLCIpdCs9
+cythW3JdLmRiCnJldHVybiB0fSwKUzQ6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvPWEubGVuZ3Ro
+CmZvcih0PSIiLHM9IiIscj0wO3I8bztyKz0yLHM9IiwiKXtxPWFbcl0KcD1hW3IrMV0uZGIKdCs9cytx
+KyI6IitwfXJldHVybiB0fSwKSjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyPWIKaWYoYy5sZW5ndGgh
+PT0wKXIrPSI8IitILlV4KGMpKyI+Igp0PWEuZUMuZ2V0KHIpCmlmKHQhPW51bGwpcmV0dXJuIHQKcz1u
+ZXcgSC5KYyhudWxsLG51bGwsbnVsbCkKcy56PTkKcy5RPWIKcy5jaD1jCmlmKGMubGVuZ3RoPjApcy5k
+PWNbMF0Kcy5kYj1yCnJldHVybiBILldHKGEscyl9LAphOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIs
+cSxwCmlmKGIuej09PTEwKXt0PWIuUQpzPWIuY2guY29uY2F0KGMpfWVsc2V7cz1jCnQ9Yn1yPXQuZGIr
+IjsiKygiPCIrSC5VeChzKSsiPiIpCnE9YS5lQy5nZXQocikKaWYocSE9bnVsbClyZXR1cm4gcQpwPW5l
+dyBILkpjKG51bGwsbnVsbCxudWxsKQpwLno9MTAKcC5RPXQKcC5jaD1zCnAuZGI9cgpyZXR1cm4gSC5X
+RyhhLHApfSwKQzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9Yi5kYixwPWMuYSxvPXAubGVuZ3Ro
+LG49Yy5iLG09bi5sZW5ndGgsbD1jLmMsaz1sLmxlbmd0aCxqPSIoIitILlV4KHApCmlmKG0+MClqKz0o
+bz4wPyIsIjoiIikrIlsiK0guVXgobikrIl0iCmlmKGs+MClqKz0obz4wPyIsIjoiIikrInsiK0guUzQo
+bCkrIn0iCnQ9cSsoaisiKSIpCnM9YS5lQy5nZXQodCkKaWYocyE9bnVsbClyZXR1cm4gcwpyPW5ldyBI
+LkpjKG51bGwsbnVsbCxudWxsKQpyLno9MTEKci5RPWIKci5jaD1jCnIuZGI9dApyZXR1cm4gSC5XRyhh
+LHIpfSwKRDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1iLmRiKyI8IitILlV4KGMpKyI+IixyPWEuZUMu
+Z2V0KHMpCmlmKHIhPW51bGwpcmV0dXJuIHIKdD1uZXcgSC5KYyhudWxsLG51bGwsbnVsbCkKdC56PTEy
+CnQuUT1iCnQuY2g9Ywp0LmRiPXMKcmV0dXJuIEguV0coYSx0KX0sCm86ZnVuY3Rpb24oYSxiLGMpe3Jl
+dHVybnt1OmEsZTpiLHI6YyxzOltdLHA6MH19LAppOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxu
+LG0sbCxrLGosaSxoLGc9YS5yLGY9YS5zCmZvcih0PWcubGVuZ3RoLHM9MDtzPHQ7KXtyPWcuY2hhckNv
+ZGVBdChzKQppZihyPj00OCYmcjw9NTcpcz1ILkEocysxLHIsZyxmKQplbHNlIGlmKCgoKHJ8MzIpPj4+
+MCktOTcmNjU1MzUpPDI2fHxyPT09OTV8fHI9PT0zNilzPUgudChhLHMsZyxmLCExKQplbHNlIGlmKHI9
+PT00NilzPUgudChhLHMsZyxmLCEwKQplbHNleysrcwpzd2l0Y2gocil7Y2FzZSA0NDpicmVhawpjYXNl
+IDU4OmJyZWFrCmNhc2UgNTk6Zi5wdXNoKEguSyhhLnUsYS5lLGYucG9wKCkpKQpicmVhawpjYXNlIDk0
+OmYucHVzaChILkgoYS51LGYucG9wKCkpKQpicmVhawpjYXNlIDM1OmYucHVzaChILm0oYS51LDUsIiMi
+KSkKYnJlYWsKY2FzZSA2NDpmLnB1c2goSC5tKGEudSwyLCJAIikpCmJyZWFrCmNhc2UgMTI2OmYucHVz
+aChILm0oYS51LDMsIn4iKSkKYnJlYWsKY2FzZSA2MDpmLnB1c2goYS5wKQphLnA9Zi5sZW5ndGgKYnJl
+YWsKY2FzZSA2MjpxPWEudQpwPWYuc3BsaWNlKGEucCkKSC5yKGEudSxhLmUscCkKYS5wPWYucG9wKCkK
+bz1mLnBvcCgpCmlmKHR5cGVvZiBvPT0ic3RyaW5nIilmLnB1c2goSC5KKHEsbyxwKSkKZWxzZXtuPUgu
+SyhxLGEuZSxvKQpzd2l0Y2gobi56KXtjYXNlIDExOmYucHVzaChILkQocSxuLHApKQpicmVhawpkZWZh
+dWx0OmYucHVzaChILmEocSxuLHApKQpicmVha319YnJlYWsKY2FzZSAzODpILkkoYSxmKQpicmVhawpj
+YXNlIDQyOm09YS51Cmw9SC5LKG0sYS5lLGYucG9wKCkpCmYucHVzaChILnYobSw2LGwsbC5kYisiKiIp
+KQpicmVhawpjYXNlIDYzOm09YS51Cmw9SC5LKG0sYS5lLGYucG9wKCkpCmYucHVzaChILnYobSw3LGws
+bC5kYisiPyIpKQpicmVhawpjYXNlIDQ3Om09YS51Cmw9SC5LKG0sYS5lLGYucG9wKCkpCmYucHVzaChI
+LnYobSw4LGwsbC5kYisiLyIpKQpicmVhawpjYXNlIDQwOmYucHVzaChhLnApCmEucD1mLmxlbmd0aApi
+cmVhawpjYXNlIDQxOnE9YS51Cms9bmV3IEguRygpCmo9cS5zRUEKaT1xLnNFQQpvPWYucG9wKCkKaWYo
+dHlwZW9mIG89PSJudW1iZXIiKXN3aXRjaChvKXtjYXNlLTE6aj1mLnBvcCgpCmJyZWFrCmNhc2UtMjpp
+PWYucG9wKCkKYnJlYWsKZGVmYXVsdDpmLnB1c2gobykKYnJlYWt9ZWxzZSBmLnB1c2gobykKcD1mLnNw
+bGljZShhLnApCkgucihhLnUsYS5lLHApCmEucD1mLnBvcCgpCmsuYT1wCmsuYj1qCmsuYz1pCmYucHVz
+aChILkMocSxILksocSxhLmUsZi5wb3AoKSksaykpCmJyZWFrCmNhc2UgOTE6Zi5wdXNoKGEucCkKYS5w
+PWYubGVuZ3RoCmJyZWFrCmNhc2UgOTM6cD1mLnNwbGljZShhLnApCkgucihhLnUsYS5lLHApCmEucD1m
+LnBvcCgpCmYucHVzaChwKQpmLnB1c2goLTEpCmJyZWFrCmNhc2UgMTIzOmYucHVzaChhLnApCmEucD1m
+Lmxlbmd0aApicmVhawpjYXNlIDEyNTpwPWYuc3BsaWNlKGEucCkKSC5CKGEudSxhLmUscCkKYS5wPWYu
+cG9wKCkKZi5wdXNoKHApCmYucHVzaCgtMikKYnJlYWsKZGVmYXVsdDp0aHJvdyJCYWQgY2hhcmFjdGVy
+ICIrcn19fWg9Zi5wb3AoKQpyZXR1cm4gSC5LKGEudSxhLmUsaCl9LApBOmZ1bmN0aW9uKGEsYixjLGQp
+e3ZhciB0LHMscj1iLTQ4CmZvcih0PWMubGVuZ3RoO2E8dDsrK2Epe3M9Yy5jaGFyQ29kZUF0KGEpCmlm
+KCEocz49NDgmJnM8PTU3KSlicmVhawpyPXIqMTArKHMtNDgpfWQucHVzaChyKQpyZXR1cm4gYX0sCnQ6
+ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIscSxwLG8sbj1iKzEKZm9yKHQ9Yy5sZW5ndGg7bjx0
+Oysrbil7cz1jLmNoYXJDb2RlQXQobikKaWYocz09PTQ2KXtpZihlKWJyZWFrCmU9ITB9ZWxzZXtpZigh
+KCgoKHN8MzIpPj4+MCktOTcmNjU1MzUpPDI2fHxzPT09OTV8fHM9PT0zNikpcj1zPj00OCYmczw9NTcK
+ZWxzZSByPSEwCmlmKCFyKWJyZWFrfX1xPWMuc3Vic3RyaW5nKGIsbikKaWYoZSl7dD1hLnUKcD1hLmUK
+aWYocC56PT09MTApcD1wLlEKbz1ILlFvKHQscC5RKVtxXQppZihvPT1udWxsKUgudmgoJ05vICInK3Er
+JyIgaW4gIicrSC5tRChwKSsnIicpCmQucHVzaChILmNFKHQscCxvKSl9ZWxzZSBkLnB1c2gocSkKcmV0
+dXJuIG59LApJOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Yi5wb3AoKQppZigwPT09dCl7Yi5wdXNoKEgubShh
+LnUsMSwiMCYiKSkKcmV0dXJufWlmKDE9PT10KXtiLnB1c2goSC5tKGEudSw0LCIxJiIpKQpyZXR1cm59
+dGhyb3cgSC5iKFAuaFYoIlVuZXhwZWN0ZWQgZXh0ZW5kZWQgb3BlcmF0aW9uICIrSC5kKHQpKSl9LApL
+OmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYz09InN0cmluZyIpcmV0dXJuIEguSihhLGMsYS5zRUEp
+CmVsc2UgaWYodHlwZW9mIGM9PSJudW1iZXIiKXJldHVybiBILlRWKGEsYixjKQplbHNlIHJldHVybiBj
+fSwKcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1jLmxlbmd0aApmb3IodD0wO3Q8czsrK3QpY1t0XT1I
+LksoYSxiLGNbdF0pfSwKQjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1jLmxlbmd0aApmb3IodD0xO3Q8
+czt0Kz0yKWNbdF09SC5LKGEsYixjW3RdKX0sClRWOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHI9Yi56
+CmlmKHI9PT0xMCl7aWYoYz09PTApcmV0dXJuIGIuUQp0PWIuY2gKcz10Lmxlbmd0aAppZihjPD1zKXJl
+dHVybiB0W2MtMV0KYy09cwpiPWIuUQpyPWIuen1lbHNlIGlmKGM9PT0wKXJldHVybiBiCmlmKHIhPT05
+KXRocm93IEguYihQLmhWKCJJbmRleGVkIGJhc2UgbXVzdCBiZSBhbiBpbnRlcmZhY2UgdHlwZSIpKQp0
+PWIuY2gKaWYoYzw9dC5sZW5ndGgpcmV0dXJuIHRbYy0xXQp0aHJvdyBILmIoUC5oVigiQmFkIGluZGV4
+ICIrYysiIGZvciAiK2IudygwKSkpfSwKV2U6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIscSxw
+LG8sbixtLGwsawppZihiPT09ZClyZXR1cm4hMAppZihILmNjKGQpKXJldHVybiEwCnQ9Yi56CmlmKHQ9
+PT00KXJldHVybiEwCmlmKEguY2MoYikpcmV0dXJuITEKaWYoYj09PXUuUClyZXR1cm4hMApzPXQ9PT0x
+MwppZihzKWlmKEguV2UoYSxjW2IuUV0sYyxkLGUpKXJldHVybiEwCnI9ZC56CmlmKHQ9PT02KXJldHVy
+biBILldlKGEsYi5RLGMsZCxlKQppZihyPT09Nil7cT1kLlEKcmV0dXJuIEguV2UoYSxiLGMscSxlKX1p
+Zih0PT09OCl7aWYoIUguV2UoYSxiLlEsYyxkLGUpKXJldHVybiExCnJldHVybiBILldlKGEsSC54Wihh
+LGIpLGMsZCxlKX1pZih0PT09Nyl7cT1ILldlKGEsYi5RLGMsZCxlKQpyZXR1cm4gcX1pZihyPT09OCl7
+aWYoSC5XZShhLGIsYyxkLlEsZSkpcmV0dXJuITAKcmV0dXJuIEguV2UoYSxiLGMsSC54WihhLGQpLGUp
+fWlmKHI9PT03KXtxPUguV2UoYSxiLGMsZC5RLGUpCnJldHVybiBxfWlmKHMpcmV0dXJuITEKcT10IT09
+MTEKaWYoKCFxfHx0PT09MTIpJiZkPT09dS5aKXJldHVybiEwCmlmKHI9PT0xMil7aWYoYj09PXUuZyly
+ZXR1cm4hMAppZih0IT09MTIpcmV0dXJuITEKcD1iLmNoCm89ZC5jaApuPXAubGVuZ3RoCmlmKG4hPT1v
+Lmxlbmd0aClyZXR1cm4hMQpmb3IocT11LmF2LG09MDttPG47KyttKXtsPXBbbV0Kaz1vW21dCnEuYihs
+KQpxLmIoaykKaWYoIUguV2UoYSxsLGMsayxlKXx8IUguV2UoYSxrLGUsbCxjKSlyZXR1cm4hMX1jPWM9
+PW51bGw/cDpwLmNvbmNhdChjKQplPWU9PW51bGw/bzpvLmNvbmNhdChlKQpyZXR1cm4gSC5iTyhhLGIu
+USxjLGQuUSxlKX1pZihyPT09MTEpe2lmKGI9PT11LmcpcmV0dXJuITAKaWYocSlyZXR1cm4hMQpyZXR1
+cm4gSC5iTyhhLGIsYyxkLGUpfWlmKHQ9PT05KXtpZihyIT09OSlyZXR1cm4hMQpyZXR1cm4gSC5wRyhh
+LGIsYyxkLGUpfXJldHVybiExfSwKYk86ZnVuY3Rpb24oYTAsYTEsYTIsYTMsYTQpe3ZhciB0LHMscixx
+LHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGEKaWYoIUguV2UoYTAsYTEuUSxhMixhMy5RLGE0
+KSlyZXR1cm4hMQp0PWExLmNoCnM9YTMuY2gKcj10LmEKcT1zLmEKcD1yLmxlbmd0aApvPXEubGVuZ3Ro
+CmlmKHA+bylyZXR1cm4hMQpuPW8tcAptPXQuYgpsPXMuYgprPW0ubGVuZ3RoCmo9bC5sZW5ndGgKaWYo
+cCtrPG8railyZXR1cm4hMQpmb3IoaT0wO2k8cDsrK2kpe2g9cltpXQppZighSC5XZShhMCxxW2ldLGE0
+LGgsYTIpKXJldHVybiExfWZvcihpPTA7aTxuOysraSl7aD1tW2ldCmlmKCFILldlKGEwLHFbcCtpXSxh
+NCxoLGEyKSlyZXR1cm4hMX1mb3IoaT0wO2k8ajsrK2kpe2g9bVtuK2ldCmlmKCFILldlKGEwLGxbaV0s
+YTQsaCxhMikpcmV0dXJuITF9Zz10LmMKZj1zLmMKZT1nLmxlbmd0aApkPWYubGVuZ3RoCmZvcihpPTAs
+Yz0wO2M8ZDtjKz0yKXtiPWZbY10KZG97aWYoaT49ZSlyZXR1cm4hMQphPWdbaV0KaSs9Mn13aGlsZShh
+PGIpCmlmKGI8YSlyZXR1cm4hMQpoPWdbaS0xXQppZighSC5XZShhMCxmW2MrMV0sYTQsaCxhMikpcmV0
+dXJuITF9cmV0dXJuITB9LApwRzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0LHMscixxLHAsbyxuLG0s
+bD1iLlEsaz1kLlEKaWYobD09PWspe3Q9Yi5jaApzPWQuY2gKcj10Lmxlbmd0aApmb3IocT0wO3E8cjsr
+K3Epe3A9dFtxXQpvPXNbcV0KaWYoIUguV2UoYSxwLGMsbyxlKSlyZXR1cm4hMX1yZXR1cm4hMH1uPUgu
+UW8oYSxsKQppZihuPT1udWxsKXJldHVybiExCm09bltrXQppZihtPT1udWxsKXJldHVybiExCnI9bS5s
+ZW5ndGgKcz1kLmNoCmZvcihxPTA7cTxyOysrcSlpZighSC5XZShhLEguY0UoYSxiLG1bcV0pLGMsc1tx
+XSxlKSlyZXR1cm4hMQpyZXR1cm4hMH0sCmNjOmZ1bmN0aW9uKGEpe3ZhciB0LHMKaWYoYT09PXUuSyly
+ZXR1cm4hMAp0PWEuegppZih0IT09MilpZih0IT09MylpZih0IT09NClpZih0IT09NSlzPXQ9PT04JiZI
+LmNjKGEuUSkKZWxzZSBzPSEwCmVsc2Ugcz0hMAplbHNlIHM9ITAKZWxzZSBzPSEwCnJldHVybiBzfSwK
+SXg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9T2JqZWN0LmtleXMoYikscT1yLmxlbmd0aApmb3IodD0w
+O3Q8cTsrK3Qpe3M9clt0XQphW3NdPWJbc119fSwKSmM6ZnVuY3Rpb24gSmMoYSxiLGMpe3ZhciBfPXRo
+aXMKXy5hPWEKXy5iPWIKXy5jPWMKXy55PV8ueD1fLmQ9bnVsbApfLno9MApfLmRiPV8uY3k9Xy5jeD1f
+LmNoPV8uUT1udWxsfSwKRzpmdW5jdGlvbiBHKCl7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbH0sCnU5
+OmZ1bmN0aW9uIHU5KCl7fSwKaHo6ZnVuY3Rpb24gaHooYSl7dGhpcy5hPWF9LAppTTpmdW5jdGlvbiBp
+TShhKXt0aGlzLmE9YX0sClI5OmZ1bmN0aW9uKGEpe3JldHVybiB1LmQuYyhhKXx8dS5CLmMoYSl8fHUu
+ZHouYyhhKXx8dS5JLmMoYSl8fHUuQS5jKGEpfHx1Lmc0LmMoYSl8fHUuZzIuYyhhKX0sCkpnOmZ1bmN0
+aW9uKGEpe3JldHVybiB2Lm1hbmdsZWRHbG9iYWxOYW1lc1thXX19LEo9ewpRdTpmdW5jdGlvbihhLGIs
+YyxkKXtyZXR1cm57aTphLHA6YixlOmMseDpkfX0sCmtzOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHA9
+YVt2LmRpc3BhdGNoUHJvcGVydHlOYW1lXQppZihwPT1udWxsKWlmKCQuQnY9PW51bGwpe0guWEQoKQpw
+PWFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV19aWYocCE9bnVsbCl7dD1wLnAKaWYoITE9PT10KXJldHVy
+biBwLmkKaWYoITA9PT10KXJldHVybiBhCnM9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHQ9PT1z
+KXJldHVybiBwLmkKaWYocC5lPT09cyl0aHJvdyBILmIoUC5TWSgiUmV0dXJuIGludGVyY2VwdG9yIGZv
+ciAiK0guZCh0KGEscCkpKSl9cj1hLmNvbnN0cnVjdG9yCnE9cj09bnVsbD9udWxsOnJbJC5VTigpXQpp
+ZihxIT1udWxsKXJldHVybiBxCnE9SC53MyhhKQppZihxIT1udWxsKXJldHVybiBxCmlmKHR5cGVvZiBh
+PT0iZnVuY3Rpb24iKXJldHVybiBDLkRHCnQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHQ9PW51
+bGwpcmV0dXJuIEMuWlEKaWYodD09PU9iamVjdC5wcm90b3R5cGUpcmV0dXJuIEMuWlEKaWYodHlwZW9m
+IHI9PSJmdW5jdGlvbiIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCQuVU4oKSx7dmFsdWU6Qy52Qixl
+bnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gQy52
+Qn1yZXR1cm4gQy52Qn0sClFpOmZ1bmN0aW9uKGEsYil7aWYoYTwwfHxhPjQyOTQ5NjcyOTUpdGhyb3cg
+SC5iKFAuVEUoYSwwLDQyOTQ5NjcyOTUsImxlbmd0aCIsbnVsbCkpCnJldHVybiBKLnB5KG5ldyBBcnJh
+eShhKSxiKX0sCnB5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouRXAoSC5WTShhLGIuQygiamQ8MD4iKSkp
+fSwKRXA6ZnVuY3Rpb24oYSl7YS5maXhlZCRsZW5ndGg9QXJyYXkKcmV0dXJuIGF9LAp6QzpmdW5jdGlv
+bihhKXthLmZpeGVkJGxlbmd0aD1BcnJheQphLmltbXV0YWJsZSRsaXN0PUFycmF5CnJldHVybiBhfSwK
+R2E6ZnVuY3Rpb24oYSl7aWYoYTwyNTYpc3dpdGNoKGEpe2Nhc2UgOTpjYXNlIDEwOmNhc2UgMTE6Y2Fz
+ZSAxMjpjYXNlIDEzOmNhc2UgMzI6Y2FzZSAxMzM6Y2FzZSAxNjA6cmV0dXJuITAKZGVmYXVsdDpyZXR1
+cm4hMX1zd2l0Y2goYSl7Y2FzZSA1NzYwOmNhc2UgODE5MjpjYXNlIDgxOTM6Y2FzZSA4MTk0OmNhc2Ug
+ODE5NTpjYXNlIDgxOTY6Y2FzZSA4MTk3OmNhc2UgODE5ODpjYXNlIDgxOTk6Y2FzZSA4MjAwOmNhc2Ug
+ODIwMTpjYXNlIDgyMDI6Y2FzZSA4MjMyOmNhc2UgODIzMzpjYXNlIDgyMzk6Y2FzZSA4Mjg3OmNhc2Ug
+MTIyODg6Y2FzZSA2NTI3OTpyZXR1cm4hMApkZWZhdWx0OnJldHVybiExfX0sCm1tOmZ1bmN0aW9uKGEs
+Yil7dmFyIHQscwpmb3IodD1hLmxlbmd0aDtiPHQ7KXtzPUMueEIuVyhhLGIpCmlmKHMhPT0zMiYmcyE9
+PTEzJiYhSi5HYShzKSlicmVhazsrK2J9cmV0dXJuIGJ9LApjMTpmdW5jdGlvbihhLGIpe3ZhciB0LHMK
+Zm9yKDtiPjA7Yj10KXt0PWItMQpzPUMueEIubShhLHQpCmlmKHMhPT0zMiYmcyE9PTEzJiYhSi5HYShz
+KSlicmVha31yZXR1cm4gYn0sClJFOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYodHlw
+ZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5
+cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuaylyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sClRK
+OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gSi5xSS5wcm90b3R5cGUKaWYo
+dHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBh
+CmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9
+Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1
+cm4gYX1pZihhIGluc3RhbmNlb2YgUC5rKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKVTY6ZnVuY3Rp
+b24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxs
+KXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0
+eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3Rv
+dHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5rKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwK
+aWE6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXtpZihNYXRoLmZsb29yKGEpPT1hKXJl
+dHVybiBKLnVyLnByb3RvdHlwZQpyZXR1cm4gSi5WQS5wcm90b3R5cGV9aWYodHlwZW9mIGE9PSJzdHJp
+bmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBKLllFLnByb3RvdHlwZQpp
+Zih0eXBlb2YgYT09ImJvb2xlYW4iKXJldHVybiBKLnlFLnByb3RvdHlwZQppZihhLmNvbnN0cnVjdG9y
+PT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5cGUKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBl
+b2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5j
+ZW9mIFAuaylyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sCnJZOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBh
+PT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gYQppZighKGEg
+aW5zdGFuY2VvZiBQLmspKXJldHVybiBKLmtkLnByb3RvdHlwZQpyZXR1cm4gYX0sCncxOmZ1bmN0aW9u
+KGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXkpcmV0dXJuIEouamQu
+cHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0
+dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQLmspcmV0dXJuIGEKcmV0
+dXJuIEoua3MoYSl9LApDTTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5SRShhKS5kdShhLGIsYyxk
+KX0sCkZMOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkuZGQoYSxiKX0sCkdBOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIEoudzEoYSkuRShhLGIpfSwKR3I6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ21X
+KGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ0EoYSl9LApJVDpmdW5jdGlvbihhKXty
+ZXR1cm4gSi53MShhKS5na3ooYSl9LApKeTpmdW5jdGlvbihhLGIpe3JldHVybiBKLmlhKGEpLmU3KGEs
+Yil9LApLVjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLkcoYSxiKX0sCkx0OmZ1bmN0aW9uKGEp
+e3JldHVybiBKLlJFKGEpLndnKGEpfSwKTTE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLncxKGEpLkUy
+KGEsYixjKX0sClF6OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkuVyhhLGIpfSwKUk06ZnVuY3Rp
+b24oYSxiKXtpZihhPT1udWxsKXJldHVybiBiPT1udWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1
+cm4gYiE9bnVsbCYmYT09PWIKcmV0dXJuIEouaWEoYSkuRE4oYSxiKX0sClQwOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBKLnJZKGEpLmJTKGEpfSwKYTY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5tKGEsYil9
+LApiVDpmdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ENChhKX0sCmJiOmZ1bmN0aW9uKGEsYil7aWYo
+dHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGErYgpyZXR1cm4gSi5U
+SihhKS5oKGEsYil9LApjSDpmdW5jdGlvbihhKXtyZXR1cm4gSi5yWShhKS5oYyhhKX0sCmRSOmZ1bmN0
+aW9uKGEpe3JldHVybiBKLlJFKGEpLmdEKGEpfSwKZFo6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEou
+UkUoYSkuT24oYSxiLGMsZCl9LApkaDpmdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS50bihhKX0sCmhm
+OmZ1bmN0aW9uKGEpe3JldHVybiBKLmlhKGEpLmdpTyhhKX0sCmlnOmZ1bmN0aW9uKGEpe3JldHVybiBK
+LlJFKGEpLmdRZyhhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWEoYSkudyhhKX0sCmw1OmZ1bmN0
+aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2hmKGEsYil9LApsZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJu
+IEouclkoYSkuTmooYSxiLGMpfSwKcTA6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLnJZKGEpLlFpKGEs
+YixjKX0sCnFGOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdWbChhKX0sCnRIOmZ1bmN0aW9uKGEs
+YixjKXtyZXR1cm4gSi5SRShhKS5wayhhLGIsYyl9LAp3MjpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBi
+PT09Im51bWJlciIpaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXl8fHR5cGVvZiBhPT0ic3RyaW5nInx8SC53
+VihhLGFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV0pKWlmKGI+Pj4wPT09YiYmYjxhLmxlbmd0aClyZXR1
+cm4gYVtiXQpyZXR1cm4gSi5VNihhKS5xKGEsYil9LAp5UTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4g
+Si5yWShhKS5pNyhhLGIsYyxkKX0sCnpsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSkudGcoYSxi
+KX0sCnZCOmZ1bmN0aW9uIHZCKCl7fSwKeUU6ZnVuY3Rpb24geUUoKXt9LApZRTpmdW5jdGlvbiBZRSgp
+e30sCk1GOmZ1bmN0aW9uIE1GKCl7fSwKaUM6ZnVuY3Rpb24gaUMoKXt9LAprZDpmdW5jdGlvbiBrZCgp
+e30sCmM1OmZ1bmN0aW9uIGM1KCl7fSwKamQ6ZnVuY3Rpb24gamQoYSl7dGhpcy4kdGk9YX0sClBvOmZ1
+bmN0aW9uIFBvKGEpe3RoaXMuJHRpPWF9LAptMTpmdW5jdGlvbiBtMShhLGIsYyl7dmFyIF89dGhpcwpf
+LmE9YQpfLmI9YgpfLmM9MApfLmQ9bnVsbApfLiR0aT1jfSwKcUk6ZnVuY3Rpb24gcUkoKXt9LAp1cjpm
+dW5jdGlvbiB1cigpe30sClZBOmZ1bmN0aW9uIFZBKCl7fSwKRHI6ZnVuY3Rpb24gRHIoKXt9fSxQPXsK
+T2o6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9e30KaWYoc2VsZi5zY2hlZHVsZUltbWVkaWF0ZSE9bnVsbCly
+ZXR1cm4gUC5FWCgpCmlmKHNlbGYuTXV0YXRpb25PYnNlcnZlciE9bnVsbCYmc2VsZi5kb2N1bWVudCE9
+bnVsbCl7dD1zZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCnM9c2VsZi5kb2N1bWVudC5j
+cmVhdGVFbGVtZW50KCJzcGFuIikKci5hPW51bGwKbmV3IHNlbGYuTXV0YXRpb25PYnNlcnZlcihILnRS
+KG5ldyBQLnRoKHIpLDEpKS5vYnNlcnZlKHQse2NoaWxkTGlzdDp0cnVlfSkKcmV0dXJuIG5ldyBQLmhh
+KHIsdCxzKX1lbHNlIGlmKHNlbGYuc2V0SW1tZWRpYXRlIT1udWxsKXJldHVybiBQLnl0KCkKcmV0dXJu
+IFAucVcoKX0sClpWOmZ1bmN0aW9uKGEpe3NlbGYuc2NoZWR1bGVJbW1lZGlhdGUoSC50UihuZXcgUC5W
+cyh1Lk0uYihhKSksMCkpfSwKb0E6ZnVuY3Rpb24oYSl7c2VsZi5zZXRJbW1lZGlhdGUoSC50UihuZXcg
+UC5GdCh1Lk0uYihhKSksMCkpfSwKQno6ZnVuY3Rpb24oYSl7dS5NLmIoYSkKUC5RTigwLGEpfSwKUU46
+ZnVuY3Rpb24oYSxiKXt2YXIgdD1uZXcgUC5XMygpCnQuQ1koYSxiKQpyZXR1cm4gdH0sCkZYOmZ1bmN0
+aW9uKGEpe3JldHVybiBuZXcgUC5paChuZXcgUC52cygkLlgzLGEuQygidnM8MD4iKSksYS5DKCJpaDww
+PiIpKX0sCkRJOmZ1bmN0aW9uKGEsYil7YS4kMigwLG51bGwpCmIuYj0hMApyZXR1cm4gYi5hfSwKalE6
+ZnVuY3Rpb24oYSxiKXtQLkplKGEsYil9LAp5QzpmdW5jdGlvbihhLGIpe2IuYU0oMCxhKX0sCmYzOmZ1
+bmN0aW9uKGEsYil7Yi53MChILlJ1KGEpLEgudHMoYSkpfSwKSmU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
+LHI9bmV3IFAuV00oYikscT1uZXcgUC5TWChiKQppZihhIGluc3RhbmNlb2YgUC52cylhLlFkKHIscSx1
+LnopCmVsc2V7dD11LnoKaWYodS5jLmMoYSkpYS5TcShyLHEsdCkKZWxzZXtzPW5ldyBQLnZzKCQuWDMs
+dS5fKQpzLmE9NApzLmM9YQpzLlFkKHIsbnVsbCx0KX19fSwKbHo6ZnVuY3Rpb24oYSl7dmFyIHQ9ZnVu
+Y3Rpb24oYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlKXt3aGlsZSh0cnVlKXRyeXtiKGQsZSkKYnJlYWt9
+Y2F0Y2gocyl7ZT1zCmQ9Y319fShhLDEpCnJldHVybiAkLlgzLkxqKG5ldyBQLkdzKHQpLHUuUCx1LmVn
+LHUueil9LAprMzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgpiLmE9MQp0cnl7YS5TcShuZXcgUC5wVihi
+KSxuZXcgUC5VNyhiKSx1LlApfWNhdGNoKHIpe3Q9SC5SdShyKQpzPUgudHMocikKUC5yYihuZXcgUC52
+cihiLHQscykpfX0sCkE5OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCmZvcih0PXUuXztzPWEuYSxzPT09
+MjspYT10LmIoYS5jKQppZihzPj00KXtyPWIuYWgoKQpiLmE9YS5hCmIuYz1hLmMKUC5IWihiLHIpfWVs
+c2V7cj11LnguYihiLmMpCmIuYT0yCmIuYz1hCmEualEocil9fSwKSFo6ZnVuY3Rpb24oYSxiKXt2YXIg
+dCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsLGQ9e30sYz1kLmE9YQpmb3IodD11Lm4s
+cz11Lngscj11LmM7ITA7KXtxPXt9CnA9Yy5hPT09OAppZihiPT1udWxsKXtpZihwKXtvPXQuYihjLmMp
+ClAuTDIoZSxlLGMuYixvLmEsby5iKX1yZXR1cm59Zm9yKDtuPWIuYSxuIT1udWxsO2I9bil7Yi5hPW51
+bGwKUC5IWihkLmEsYil9Yz1kLmEKbT1jLmMKcS5hPXAKcS5iPW0KbD0hcAppZihsKXtrPWIuYwprPShr
+JjEpIT09MHx8KGsmMTUpPT09OH1lbHNlIGs9ITAKaWYoayl7az1iLmIKaj1rLmIKaWYocCl7aT1jLmI9
+PT1qCmk9IShpfHxpKX1lbHNlIGk9ITEKaWYoaSl7dC5iKG0pClAuTDIoZSxlLGMuYixtLmEsbS5iKQpy
+ZXR1cm59aD0kLlgzCmlmKGghPT1qKSQuWDM9agplbHNlIGg9ZQpjPWIuYwppZigoYyYxNSk9PT04KW5l
+dyBQLlJUKGQscSxiLHApLiQwKCkKZWxzZSBpZihsKXtpZigoYyYxKSE9PTApbmV3IFAucnEocSxiLG0p
+LiQwKCl9ZWxzZSBpZigoYyYyKSE9PTApbmV3IFAuUlcoZCxxLGIpLiQwKCkKaWYoaCE9bnVsbCkkLlgz
+PWgKYz1xLmIKaWYoci5jKGMpKXtpZihjLmE+PTQpe2c9cy5iKGsuYykKay5jPW51bGwKYj1rLk44KGcp
+CmsuYT1jLmEKay5jPWMuYwpkLmE9Ywpjb250aW51ZX1lbHNlIFAuQTkoYyxrKQpyZXR1cm59fWY9Yi5i
+Cmc9cy5iKGYuYykKZi5jPW51bGwKYj1mLk44KGcpCmM9cS5hCmw9cS5iCmlmKCFjKXtmLiR0aS5kLmIo
+bCkKZi5hPTQKZi5jPWx9ZWxzZXt0LmIobCkKZi5hPTgKZi5jPWx9ZC5hPWYKYz1mfX0sClZIOmZ1bmN0
+aW9uKGEsYil7dmFyIHQKaWYodS5XLmMoYSkpcmV0dXJuIGIuTGooYSx1LnosdS5LLHUubCkKdD11LnkK
+aWYodC5jKGEpKXJldHVybiB0LmIoYSkKdGhyb3cgSC5iKFAuTDMoYSwib25FcnJvciIsIkVycm9yIGhh
+bmRsZXIgbXVzdCBhY2NlcHQgb25lIE9iamVjdCBvciBvbmUgT2JqZWN0IGFuZCBhIFN0YWNrVHJhY2Ug
+YXMgYXJndW1lbnRzLCBhbmQgcmV0dXJuIGEgYSB2YWxpZCByZXN1bHQiKSl9LApwdTpmdW5jdGlvbigp
+e3ZhciB0LHMKZm9yKDt0PSQuUzYsdCE9bnVsbDspeyQubWc9bnVsbApzPXQuYgokLlM2PXMKaWYocz09
+bnVsbCkkLms4PW51bGwKdC5hLiQwKCl9fSwKZU46ZnVuY3Rpb24oKXskLlVEPSEwCnRyeXtQLnB1KCl9
+ZmluYWxseXskLm1nPW51bGwKJC5VRD0hMQppZigkLlM2IT1udWxsKSQudXQoKS4kMShQLlVJKCkpfX0s
+CmVXOmZ1bmN0aW9uKGEpe3ZhciB0PW5ldyBQLk9NKGEpCmlmKCQuUzY9PW51bGwpeyQuUzY9JC5rOD10
+CmlmKCEkLlVEKSQudXQoKS4kMShQLlVJKCkpfWVsc2UgJC5rOD0kLms4LmI9dH0sCnJSOmZ1bmN0aW9u
+KGEpe3ZhciB0LHMscj0kLlM2CmlmKHI9PW51bGwpe1AuZVcoYSkKJC5tZz0kLms4CnJldHVybn10PW5l
+dyBQLk9NKGEpCnM9JC5tZwppZihzPT1udWxsKXt0LmI9cgokLlM2PSQubWc9dH1lbHNle3QuYj1zLmIK
+JC5tZz1zLmI9dAppZih0LmI9PW51bGwpJC5rOD10fX0sCnJiOmZ1bmN0aW9uKGEpe3ZhciB0PW51bGws
+cz0kLlgzCmlmKEMuTlU9PT1zKXtQLlRrKHQsdCxDLk5VLGEpCnJldHVybn1QLlRrKHQsdCxzLHUuTS5i
+KHMuR1koYSkpKX0sClF3OmZ1bmN0aW9uKGEsYil7aWYoYT09bnVsbClILnZoKFAuRWUoInN0cmVhbSIp
+KQpyZXR1cm4gbmV3IFAueEkoYi5DKCJ4STwwPiIpKX0sCkwyOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFy
+IHQ9e30KdC5hPWQKUC5yUihuZXcgUC5wSyh0LGUpKX0sClQ4OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFy
+IHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQwKCkKJC5YMz1jCnQ9cwp0cnl7cz1kLiQwKCkKcmV0
+dXJuIHN9ZmluYWxseXskLlgzPXR9fSwKeXY6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHQscz0k
+LlgzCmlmKHM9PT1jKXJldHVybiBkLiQxKGUpCiQuWDM9Ywp0PXMKdHJ5e3M9ZC4kMShlKQpyZXR1cm4g
+c31maW5hbGx5eyQuWDM9dH19LApReDpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHQscz0k
+LlgzCmlmKHM9PT1jKXJldHVybiBkLiQyKGUsZikKJC5YMz1jCnQ9cwp0cnl7cz1kLiQyKGUsZikKcmV0
+dXJuIHN9ZmluYWxseXskLlgzPXR9fSwKVGs6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQKdS5NLmIoZCkK
+dD1DLk5VIT09YwppZih0KWQ9ISghdHx8ITEpP2MuR1koZCk6Yy5SVChkLHUuSCkKUC5lVyhkKX0sCnRo
+OmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRo
+aXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBG
+dChhKXt0aGlzLmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlz
+LmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMu
+JHRpPWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMu
+YT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1
+bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQs
+ZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6
+ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlzCl8uYT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApk
+YTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0
+aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0aW9uIHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24g
+VTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlvbiB2cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
+cy5jPWN9LApySDpmdW5jdGlvbiBySChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24g
+S0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClpMOmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0aW9uIFJUKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEK
+Xy5iPWIKXy5jPWMKXy5kPWR9LApqWjpmdW5jdGlvbiBqWihhKXt0aGlzLmE9YX0sCnJxOmZ1bmN0aW9u
+IHJxKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJXOmZ1bmN0aW9uIFJXKGEsYixj
+KXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk9NOmZ1bmN0aW9uIE9NKGEpe3RoaXMuYT1hCnRo
+aXMuYj1udWxsfSwKcWg6ZnVuY3Rpb24gcWgoKXt9LApCNTpmdW5jdGlvbiBCNShhLGIpe3RoaXMuYT1h
+CnRoaXMuYj1ifSwKUEk6ZnVuY3Rpb24gUEkoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk1POmZ1bmN0
+aW9uIE1PKCl7fSwKa1Q6ZnVuY3Rpb24ga1QoKXt9LAp4STpmdW5jdGlvbiB4SShhKXt0aGlzLiR0aT1h
+fSwKQ3c6ZnVuY3Rpb24gQ3coYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCm0wOmZ1bmN0aW9uIG0wKCl7
+fSwKcEs6ZnVuY3Rpb24gcEsoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkppOmZ1bmN0aW9uIEppKCl7
+fSwKaGo6ZnVuY3Rpb24gaGooYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnA6ZnVu
+Y3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlz
+LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVGOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYi5DKCJAPDA+
+IikuS3EoYykuQygiRm88MSwyPiIpLmIoSC5CNyhhLG5ldyBILk41KGIuQygiQDwwPiIpLktxKGMpLkMo
+Ik41PDEsMj4iKSkpKX0sCkZsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILk41KGEuQygiQDwwPiIp
+LktxKGIpLkMoIk41PDEsMj4iKSl9LApMczpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJi
+NjwwPiIpKX0sClQyOmZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKQp0WyI8bm9uLWlk
+ZW50aWZpZXIta2V5PiJdPXQKZGVsZXRlIHRbIjxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHR9
+LApyajpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKdC5jPWEu
+ZQpyZXR1cm4gdH0sCkVQOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzCmlmKFAuaEIoYSkpe2lmKGI9PT0i
+KCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpyZXR1cm4gYisiLi4uIitjfXQ9SC5WTShbXSx1LnMpCkMu
+Tm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEsdCl9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4g
+SC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXM9UC52ZyhiLHUuUi5iKHQpLCIsICIpK2MKcmV0dXJuIHMu
+Y2hhckNvZGVBdCgwKT09MD9zOnN9LApXRTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscwppZihQLmhCKGEp
+KXJldHVybiBiKyIuLi4iK2MKdD1uZXcgUC5SbihiKQpDLk5tLmkoJC54ZyxhKQp0cnl7cz10CnMuYT1Q
+LnZnKHMuYSxhLCIsICIpfWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54Zywt
+MSkKJC54Zy5wb3AoKX10LmErPWMKcz10LmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LApo
+QjpmdW5jdGlvbihhKXt2YXIgdCxzCmZvcih0PSQueGcubGVuZ3RoLHM9MDtzPHQ7KytzKWlmKGE9PT0k
+LnhnW3NdKXJldHVybiEwCnJldHVybiExfSwKVnI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8s
+bixtPWEuZ2t6KGEpLGw9MCxrPTAKd2hpbGUoITApe2lmKCEobDw4MHx8azwzKSlicmVhawppZighbS5G
+KCkpcmV0dXJuCnQ9SC5kKG0uZ2woKSkKQy5ObS5pKGIsdCkKbCs9dC5sZW5ndGgrMjsrK2t9aWYoIW0u
+RigpKXtpZihrPD01KXJldHVybgppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpzPWIucG9w
+KCkKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcj1iLnBvcCgpfWVsc2V7cT1tLmdsKCk7
+KytrCmlmKCFtLkYoKSl7aWYoazw9NCl7Qy5ObS5pKGIsSC5kKHEpKQpyZXR1cm59cz1ILmQocSkKaWYo
+MD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcj1iLnBvcCgpCmwrPXMubGVuZ3RoKzJ9ZWxzZXtw
+PW0uZ2woKTsrK2sKZm9yKDttLkYoKTtxPXAscD1vKXtvPW0uZ2woKTsrK2sKaWYoaz4xMDApe3doaWxl
+KCEwKXtpZighKGw+NzUmJms+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkK
+bC09Yi5wb3AoKS5sZW5ndGgrMjstLWt9Qy5ObS5pKGIsIi4uLiIpCnJldHVybn19cj1ILmQocSkKcz1I
+LmQocCkKbCs9cy5sZW5ndGgrci5sZW5ndGgrNH19aWYoaz5iLmxlbmd0aCsyKXtsKz01Cm49Ii4uLiJ9
+ZWxzZSBuPW51bGwKd2hpbGUoITApe2lmKCEobD44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYoMD49Yi5s
+ZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKbC09Yi5wb3AoKS5sZW5ndGgrMgppZihuPT1udWxsKXtsKz01
+Cm49Ii4uLiJ9fWlmKG4hPW51bGwpQy5ObS5pKGIsbikKQy5ObS5pKGIscikKQy5ObS5pKGIscyl9LAp0
+TTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj1QLkxzKGIpCmZvcih0PWEubGVuZ3RoLHM9MDtzPGEubGVu
+Z3RoO2EubGVuZ3RoPT09dHx8KDAsSC5saykoYSksKytzKXIuaSgwLGIuYihhW3NdKSkKcmV0dXJuIHJ9
+LApuTzpmdW5jdGlvbihhKXt2YXIgdCxzPXt9CmlmKFAuaEIoYSkpcmV0dXJuInsuLi59Igp0PW5ldyBQ
+LlJuKCIiKQp0cnl7Qy5ObS5pKCQueGcsYSkKdC5hKz0ieyIKcy5hPSEwCmEuSygwLG5ldyBQLnJhKHMs
+dCkpCnQuYSs9In0ifWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54ZywtMSkK
+JC54Zy5wb3AoKX1zPXQuYQpyZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCmI2OmZ1bmN0aW9u
+IGI2KGEpe3ZhciBfPXRoaXMKXy5hPTAKXy5mPV8uZT1fLmQ9Xy5jPV8uYj1udWxsCl8ucj0wCl8uJHRp
+PWF9LApibjpmdW5jdGlvbiBibihhKXt0aGlzLmE9YQp0aGlzLmM9dGhpcy5iPW51bGx9LApsbTpmdW5j
+dGlvbiBsbShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGwKXy4kdGk9Y30s
+Cm1XOmZ1bmN0aW9uIG1XKCl7fSwKTFU6ZnVuY3Rpb24gTFUoKXt9LApsRDpmdW5jdGlvbiBsRCgpe30s
+CmlsOmZ1bmN0aW9uIGlsKCl7fSwKcmE6ZnVuY3Rpb24gcmEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
+CllrOmZ1bmN0aW9uIFlrKCl7fSwKS1A6ZnVuY3Rpb24gS1AoKXt9LApQbjpmdW5jdGlvbiBQbigpe30s
+CkdqOmZ1bmN0aW9uIEdqKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmxmOmZ1bmN0aW9uIGxmKCl7
+fSwKVmo6ZnVuY3Rpb24gVmooKXt9LApYdjpmdW5jdGlvbiBYdigpe30sCm5ZOmZ1bmN0aW9uIG5ZKCl7
+fSwKV1k6ZnVuY3Rpb24gV1koKXt9LApSVTpmdW5jdGlvbiBSVSgpe30sCkJTOmZ1bmN0aW9uKGEsYil7
+dmFyIHQscyxyLHEKaWYodHlwZW9mIGEhPSJzdHJpbmciKXRocm93IEguYihILnRMKGEpKQp0PW51bGwK
+dHJ5e3Q9SlNPTi5wYXJzZShhKX1jYXRjaChyKXtzPUguUnUocikKcT1QLnJyKFN0cmluZyhzKSxudWxs
+LG51bGwpCnRocm93IEguYihxKX1xPVAuUWUodCkKcmV0dXJuIHF9LApRZTpmdW5jdGlvbihhKXt2YXIg
+dAppZihhPT1udWxsKXJldHVybiBudWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYQppZihP
+YmplY3QuZ2V0UHJvdG90eXBlT2YoYSkhPT1BcnJheS5wcm90b3R5cGUpcmV0dXJuIG5ldyBQLnV3KGEs
+T2JqZWN0LmNyZWF0ZShudWxsKSkKZm9yKHQ9MDt0PGEubGVuZ3RoOysrdClhW3RdPVAuUWUoYVt0XSkK
+cmV0dXJuIGF9LApreTpmdW5jdGlvbihhLGIsYyxkKXtpZihiIGluc3RhbmNlb2YgVWludDhBcnJheSly
+ZXR1cm4gUC5SUCghMSxiLGMsZCkKcmV0dXJuIG51bGx9LApSUDpmdW5jdGlvbihhLGIsYyxkKXt2YXIg
+dCxzLHI9JC5yZigpCmlmKHI9PW51bGwpcmV0dXJuIG51bGwKdD0wPT09YwppZih0JiYhMClyZXR1cm4g
+UC5PUShyLGIpCnM9Yi5sZW5ndGgKZD1QLmpCKGMsZCxzKQppZih0JiZkPT09cylyZXR1cm4gUC5PUShy
+LGIpCnJldHVybiBQLk9RKHIsYi5zdWJhcnJheShjLGQpKX0sCk9ROmZ1bmN0aW9uKGEsYil7aWYoUC5C
+ZShiKSlyZXR1cm4gbnVsbApyZXR1cm4gUC5KaChhLGIpfSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
+CnRyeXt0PWEuZGVjb2RlKGIpCnJldHVybiB0fWNhdGNoKHMpe0guUnUocyl9cmV0dXJuIG51bGx9LApC
+ZTpmdW5jdGlvbihhKXt2YXIgdCxzPWEubGVuZ3RoLTIKZm9yKHQ9MDt0PHM7Kyt0KWlmKGFbdF09PT0y
+MzcpaWYoKGFbdCsxXSYyMjQpPT09MTYwKXJldHVybiEwCnJldHVybiExfSwKV0k6ZnVuY3Rpb24oKXt2
+YXIgdCxzCnRyeXt0PW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtmYXRhbDp0cnVlfSkKcmV0dXJuIHR9
+Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4gbnVsbH0sCmNQOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIK
+Zm9yKHQ9Si5VNihhKSxzPWI7czxjOysrcyl7cj10LnEoYSxzKQppZih0eXBlb2YgciE9PSJudW1iZXIi
+KXJldHVybiByLnpNKCkKaWYoKHImMTI3KSE9PXIpcmV0dXJuIHMtYn1yZXR1cm4gYy1ifSwKeE06ZnVu
+Y3Rpb24oYSxiLGMsZCxlLGYpe2lmKEMuam4uelkoZiw0KSE9PTApdGhyb3cgSC5iKFAucnIoIkludmFs
+aWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBvZiBmb3VyLCBp
+cyAiK2YsYSxjKSkKaWYoZCtlIT09Zil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGlu
+ZywgJz0nIG5vdCBhdCB0aGUgZW5kIixhLGIpKQppZihlPjIpdGhyb3cgSC5iKFAucnIoIkludmFsaWQg
+YmFzZTY0IHBhZGRpbmcsIG1vcmUgdGhhbiB0d28gJz0nIGNoYXJhY3RlcnMiLGEsYikpfSwKdXc6ZnVu
+Y3Rpb24gdXcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9bnVsbH0sCmk4OmZ1bmN0aW9uIGk4
+KGEpe3RoaXMuYT1hfSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpmdW5jdGlvbiBVOCgpe30sClVrOmZ1
+bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpmdW5jdGlvbiBaaSgpe30sCmJ5OmZ1
+bmN0aW9uIGJ5KCl7fSwKTXg6ZnVuY3Rpb24gTXgoYSl7dGhpcy5hPWF9LAp1NTpmdW5jdGlvbiB1NSgp
+e30sCkUzOmZ1bmN0aW9uIEUzKCl7fSwKUnc6ZnVuY3Rpb24gUncoYSl7dGhpcy5iPTAKdGhpcy5jPWF9
+LApHWTpmdW5jdGlvbiBHWShhKXt0aGlzLmE9YX0sCmJ6OmZ1bmN0aW9uIGJ6KGEsYil7dmFyIF89dGhp
+cwpfLmE9YQpfLmI9YgpfLmM9ITAKXy5mPV8uZT1fLmQ9MH0sClFBOmZ1bmN0aW9uKGEsYixjKXt2YXIg
+dD1ILkhwKGEsYykKaWYodCE9bnVsbClyZXR1cm4gdAppZihiIT1udWxsKXJldHVybiBiLiQxKGEpCnRo
+cm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApGOmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBI
+LlRwKXJldHVybiBhLncoMCkKcmV0dXJuIkluc3RhbmNlIG9mICciK0guZChILk0oYSkpKyInIn0sCk84
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPUouUWkoYSxjKQppZihhIT09MCYmITApZm9yKHQ9MDt0PHMu
+bGVuZ3RoOysrdClDLk5tLlkocyx0LGIpCnJldHVybiBzfSwKQ0g6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
+LHM9SC5WTShbXSxjLkMoImpkPDA+IikpCmZvcih0PUouSVQoYSk7dC5GKCk7KUMuTm0uaShzLGMuYih0
+LmdsKCkpKQppZihiKXJldHVybiBzCnJldHVybiBjLkMoInpNPDA+IikuYihKLkVwKHMpKX0sCkFGOmZ1
+bmN0aW9uKGEsYil7cmV0dXJuIGIuQygiek08MD4iKS5iKEouekMoUC5DSChhLCExLGIpKSl9LApITTpm
+dW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoQXJyYXkuaXNBcnJheShhKSl7dS50LmIoYSkKdD1hLmxlbmd0
+aApjPVAuakIoYixjLHQpCnJldHVybiBILmVUKGI+MHx8Yzx0P0MuTm0uRDYoYSxiLGMpOmEpfWlmKHUu
+Ym0uYyhhKSlyZXR1cm4gSC5mdyhhLGIsUC5qQihiLGMsYS5sZW5ndGgpKQpyZXR1cm4gUC5idyhhLGIs
+Yyl9LApPbzpmdW5jdGlvbihhKXtyZXR1cm4gSC5MdyhhKX0sCmJ3OmZ1bmN0aW9uKGEsYixjKXt2YXIg
+dCxzLHIscSxwPW51bGwKaWYoYjwwKXRocm93IEguYihQLlRFKGIsMCxKLkhtKGEpLHAscCkpCnQ9Yz09
+bnVsbAppZighdCYmYzxiKXRocm93IEguYihQLlRFKGMsYixKLkhtKGEpLHAscCkpCnM9Si5JVChhKQpm
+b3Iocj0wO3I8YjsrK3IpaWYoIXMuRigpKXRocm93IEguYihQLlRFKGIsMCxyLHAscCkpCnE9W10KaWYo
+dClmb3IoO3MuRigpOylxLnB1c2gocy5nbCgpKQplbHNlIGZvcihyPWI7cjxjOysrcil7aWYoIXMuRigp
+KXRocm93IEguYihQLlRFKGMsYixyLHAscCkpCnEucHVzaChzLmdsKCkpfXJldHVybiBILmVUKHEpfSwK
+bnU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlZSKGEsSC52NChhLCExLCEwLCExLCExLCExKSl9LAp2
+ZzpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9Si5JVChiKQppZighdC5GKCkpcmV0dXJuIGEKaWYoYy5sZW5n
+dGg9PT0wKXtkbyBhKz1ILmQodC5nbCgpKQp3aGlsZSh0LkYoKSl9ZWxzZXthKz1ILmQodC5nbCgpKQpm
+b3IoO3QuRigpOylhPWErYytILmQodC5nbCgpKX1yZXR1cm4gYX0sCmxyOmZ1bmN0aW9uKGEsYixjLGQp
+e3JldHVybiBuZXcgUC5tcChhLGIsYyxkKX0sCnVvOmZ1bmN0aW9uKCl7dmFyIHQ9SC5NMCgpCmlmKHQh
+PW51bGwpcmV0dXJuIFAuaEsodCkKdGhyb3cgSC5iKFAuTDQoIidVcmkuYmFzZScgaXMgbm90IHN1cHBv
+cnRlZCIpKX0sCmVQOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxLHAsbyxuPSIwMTIzNDU2Nzg5
+QUJDREVGIgppZihjPT09Qy54TSl7dD0kLno0KCkuYgppZih0eXBlb2YgYiE9InN0cmluZyIpSC52aChI
+LnRMKGIpKQp0PXQudGVzdChiKX1lbHNlIHQ9ITEKaWYodClyZXR1cm4gYgpILkxoKGMpLkMoIlVrLlMi
+KS5iKGIpCnM9Yy5nWkUoKS5XSihiKQpmb3IodD1zLmxlbmd0aCxyPTAscT0iIjtyPHQ7KytyKXtwPXNb
+cl0KaWYocDwxMjgpe289cD4+PjQKaWYobz49OClyZXR1cm4gSC5PSChhLG8pCm89KGFbb10mMTw8KHAm
+MTUpKSE9PTB9ZWxzZSBvPSExCmlmKG8pcSs9SC5MdyhwKQplbHNlIHE9ZCYmcD09PTMyP3ErIisiOnEr
+IiUiK25bcD4+PjQmMTVdK25bcCYxNV19cmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9xOnF9LApHcTpm
+dW5jdGlvbihhKXt2YXIgdD1NYXRoLmFicyhhKSxzPWE8MD8iLSI6IiIKaWYodD49MTAwMClyZXR1cm4i
+IithCmlmKHQ+PTEwMClyZXR1cm4gcysiMCIrdAppZih0Pj0xMClyZXR1cm4gcysiMDAiK3QKcmV0dXJu
+IHMrIjAwMCIrdH0sClZ4OmZ1bmN0aW9uKGEpe2lmKGE+PTEwMClyZXR1cm4iIithCmlmKGE+PTEwKXJl
+dHVybiIwIithCnJldHVybiIwMCIrYX0sCmgwOmZ1bmN0aW9uKGEpe2lmKGE+PTEwKXJldHVybiIiK2EK
+cmV0dXJuIjAiK2F9LApwOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyInx8SC5sKGEpfHxu
+dWxsPT1hKXJldHVybiBKLmooYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09OLnN0cmlu
+Z2lmeShhKQpyZXR1cm4gUC5GKGEpfSwKaFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkM2KGEpfSwK
+eFk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnUoITEsbnVsbCxudWxsLGEpfSwKTDM6ZnVuY3Rpb24o
+YSxiLGMpe3JldHVybiBuZXcgUC51KCEwLGEsYixjKX0sCkVlOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcg
+UC51KCExLG51bGwsYSwiTXVzdCBub3QgYmUgbnVsbCIpfSwKeDpmdW5jdGlvbihhLGIpe3JldHVybiBu
+ZXcgUC5iSihudWxsLG51bGwsITAsYSxiLCJWYWx1ZSBub3QgaW4gcmFuZ2UiKX0sClRFOmZ1bmN0aW9u
+KGEsYixjLGQsZSl7cmV0dXJuIG5ldyBQLmJKKGIsYywhMCxhLGQsIkludmFsaWQgdmFsdWUiKX0sCndB
+OmZ1bmN0aW9uKGEsYixjLGQpe2lmKGE8Ynx8YT5jKXRocm93IEguYihQLlRFKGEsYixjLGQsbnVsbCkp
+fSwKakI6ZnVuY3Rpb24oYSxiLGMpe2lmKDA+YXx8YT5jKXRocm93IEguYihQLlRFKGEsMCxjLCJzdGFy
+dCIsbnVsbCkpCmlmKGIhPW51bGwpe2lmKGE+Ynx8Yj5jKXRocm93IEguYihQLlRFKGIsYSxjLCJlbmQi
+LG51bGwpKQpyZXR1cm4gYn1yZXR1cm4gY30sCmsxOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEhPT0i
+bnVtYmVyIilyZXR1cm4gYS5KKCkKaWYoYTwwKXRocm93IEguYihQLlRFKGEsMCxudWxsLGIsbnVsbCkp
+fSwKQ2Y6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1ILlNjKGU9PW51bGw/Si5IbShiKTplKQpyZXR1
+cm4gbmV3IFAuZVkodCwhMCxhLGMsIkluZGV4IG91dCBvZiByYW5nZSIpfSwKTDQ6ZnVuY3Rpb24oYSl7
+cmV0dXJuIG5ldyBQLnViKGEpfSwKU1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmRzKGEpfSwKUFY6
+ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmxqKGEpfSwKYTQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQ
+LlVWKGEpfSwKcnI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgUC5hRShhLGIsYyl9LApkSDpmdW5j
+dGlvbihhLGIsYyxkKXt2YXIgdCxzPUguVk0oW10sZC5DKCJqZDwwPiIpKQpDLk5tLnNBKHMsYSkKZm9y
+KHQ9MDt0PGE7Kyt0KUMuTm0uWShzLHQsYi4kMSh0KSkKcmV0dXJuIHN9LApoSzpmdW5jdGlvbihhKXt2
+YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsLGQ9YS5sZW5ndGgKaWYoZD49NSl7
+dD0oKEouUXooYSw0KV41OCkqM3xDLnhCLlcoYSwwKV4xMDB8Qy54Qi5XKGEsMSleOTd8Qy54Qi5XKGEs
+MileMTE2fEMueEIuVyhhLDMpXjk3KT4+PjAKaWYodD09PTApcmV0dXJuIFAuS0QoZDxkP0MueEIuTmoo
+YSwwLGQpOmEsNSxlKS5nbFIoKQplbHNlIGlmKHQ9PT0zMilyZXR1cm4gUC5LRChDLnhCLk5qKGEsNSxk
+KSwwLGUpLmdsUigpfXM9bmV3IEFycmF5KDgpCnMuZml4ZWQkbGVuZ3RoPUFycmF5CnI9SC5WTShzLHUu
+dCkKQy5ObS5ZKHIsMCwwKQpDLk5tLlkociwxLC0xKQpDLk5tLlkociwyLC0xKQpDLk5tLlkociw3LC0x
+KQpDLk5tLlkociwzLDApCkMuTm0uWShyLDQsMCkKQy5ObS5ZKHIsNSxkKQpDLk5tLlkociw2LGQpCmlm
+KFAuVUIoYSwwLGQsMCxyKT49MTQpQy5ObS5ZKHIsNyxkKQpxPXJbMV0KaWYodHlwZW9mIHEhPT0ibnVt
+YmVyIilyZXR1cm4gcS50QigpCmlmKHE+PTApaWYoUC5VQihhLDAscSwyMCxyKT09PTIwKXJbN109cQpz
+PXJbMl0KaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5oKCkKcD1zKzEKbz1yWzNdCm49cls0
+XQptPXJbNV0KbD1yWzZdCmlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIGwuSigpCmlmKHR5cGVv
+ZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFkobSkKaWYobDxtKW09bAppZih0eXBlb2YgbiE9PSJudW1i
+ZXIiKXJldHVybiBuLkooKQppZihuPHApbj1tCmVsc2UgaWYobjw9cSluPXErMQppZih0eXBlb2YgbyE9
+PSJudW1iZXIiKXJldHVybiBvLkooKQppZihvPHApbz1uCnM9cls3XQppZih0eXBlb2YgcyE9PSJudW1i
+ZXIiKXJldHVybiBzLkooKQprPXM8MAppZihrKWlmKHA+cSszKXtqPWUKaz0hMX1lbHNle3M9bz4wCmlm
+KHMmJm8rMT09PW4pe2o9ZQprPSExfWVsc2V7aWYoIShtPGQmJm09PT1uKzImJkoucTAoYSwiLi4iLG4p
+KSlpPW0+bisyJiZKLnEwKGEsIi8uLiIsbS0zKQplbHNlIGk9ITAKaWYoaSl7aj1lCms9ITF9ZWxzZXtp
+ZihxPT09NClpZihKLnEwKGEsImZpbGUiLDApKXtpZihwPD0wKXtpZighQy54Qi5RaShhLCIvIixuKSl7
+aD0iZmlsZTovLy8iCnQ9M31lbHNle2g9ImZpbGU6Ly8iCnQ9Mn1hPWgrQy54Qi5OaihhLG4sZCkKcS09
+MApzPXQtMAptKz1zCmwrPXMKZD1hLmxlbmd0aApwPTcKbz03Cm49N31lbHNlIGlmKG49PT1tKXtnPW0r
+MTsrK2wKYT1DLnhCLmk3KGEsbixtLCIvIik7KytkCm09Z31qPSJmaWxlIn1lbHNlIGlmKEMueEIuUWko
+YSwiaHR0cCIsMCkpe2lmKHMmJm8rMz09PW4mJkMueEIuUWkoYSwiODAiLG8rMSkpe2Y9bi0zCm0tPTMK
+bC09MwphPUMueEIuaTcoYSxvLG4sIiIpCmQtPTMKbj1mfWo9Imh0dHAifWVsc2Ugaj1lCmVsc2UgaWYo
+cT09PTUmJkoucTAoYSwiaHR0cHMiLDApKXtpZihzJiZvKzQ9PT1uJiZKLnEwKGEsIjQ0MyIsbysxKSl7
+Zj1uLTQKbS09NApsLT00CmE9Si55UShhLG8sbiwiIikKZC09MwpuPWZ9aj0iaHR0cHMifWVsc2Ugaj1l
+Cms9ITB9fX1lbHNlIGo9ZQppZihrKXtzPWEubGVuZ3RoCmlmKGQ8cyl7YT1KLmxkKGEsMCxkKQpxLT0w
+CnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1yZXR1cm4gbmV3IFAuVWYoYSxxLHAsbyxuLG0sbCxqKX1y
+ZXR1cm4gUC5qdihhLDAsZCxxLHAsbyxuLG0sbCxqKX0sCk10OmZ1bmN0aW9uKGEpe0gueShhKQpyZXR1
+cm4gUC5rdShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWDpmdW5jdGlvbihhKXt2YXIgdD11Lk4KcmV0
+dXJuIEMuTm0uTjAoSC5WTShhLnNwbGl0KCImIiksdS5zKSxQLkZsKHQsdCksbmV3IFAubjEoQy54TSks
+dS5mKX0sCkhoOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwsbD0iSVB2NCBh
+ZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIsaz0iZWFjaCBwYXJ0IG11c3QgYmUg
+aW4gdGhlIHJhbmdlIDAuLjI1NSIsaj1uZXcgUC5jUyhhKSxpPW5ldyBVaW50OEFycmF5KDQpCmZvcih0
+PWkubGVuZ3RoLHM9YixyPXMscT0wO3M8YzsrK3Mpe3A9Qy54Qi5tKGEscykKaWYocCE9PTQ2KXtpZigo
+cF40OCk+OSlqLiQyKCJpbnZhbGlkIGNoYXJhY3RlciIscyl9ZWxzZXtpZihxPT09MylqLiQyKGwscykK
+bz1QLlFBKEMueEIuTmooYSxyLHMpLG0sbSkKaWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4gby5v
+cygpCmlmKG8+MjU1KWouJDIoayxyKQpuPXErMQppZihxPj10KXJldHVybiBILk9IKGkscSkKaVtxXT1v
+CnI9cysxCnE9bn19aWYocSE9PTMpai4kMihsLGMpCm89UC5RQShDLnhCLk5qKGEscixjKSxtLG0pCmlm
+KHR5cGVvZiBvIT09Im51bWJlciIpcmV0dXJuIG8ub3MoKQppZihvPjI1NSlqLiQyKGsscikKaWYocT49
+dClyZXR1cm4gSC5PSChpLHEpCmlbcV09bwpyZXR1cm4gaX0sCmVnOmZ1bmN0aW9uKGEsYixhMCl7dmFy
+IHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD1uZXcgUC5WQyhhKSxjPW5ldyBQLnRwKGQs
+YSkKaWYoYS5sZW5ndGg8MilkLiQxKCJhZGRyZXNzIGlzIHRvbyBzaG9ydCIpCnQ9SC5WTShbXSx1LnQp
+CmZvcihzPWIscj1zLHE9ITEscD0hMTtzPGEwOysrcyl7bz1DLnhCLm0oYSxzKQppZihvPT09NTgpe2lm
+KHM9PT1iKXsrK3MKaWYoQy54Qi5tKGEscykhPT01OClkLiQyKCJpbnZhbGlkIHN0YXJ0IGNvbG9uLiIs
+cykKcj1zfWlmKHM9PT1yKXtpZihxKWQuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6OmAgaXMgYWxsb3dl
+ZCIscykKQy5ObS5pKHQsLTEpCnE9ITB9ZWxzZSBDLk5tLmkodCxjLiQyKHIscykpCnI9cysxfWVsc2Ug
+aWYobz09PTQ2KXA9ITB9aWYodC5sZW5ndGg9PT0wKWQuJDEoInRvbyBmZXcgcGFydHMiKQpuPXI9PT1h
+MAptPUMuTm0uZ3JaKHQpCmlmKG4mJm0hPT0tMSlkLiQyKCJleHBlY3RlZCBhIHBhcnQgYWZ0ZXIgbGFz
+dCBgOmAiLGEwKQppZighbilpZighcClDLk5tLmkodCxjLiQyKHIsYTApKQplbHNle2w9UC5IaChhLHIs
+YTApCkMuTm0uaSh0LChsWzBdPDw4fGxbMV0pPj4+MCkKQy5ObS5pKHQsKGxbMl08PDh8bFszXSk+Pj4w
+KX1pZihxKXtpZih0Lmxlbmd0aD43KWQuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJkIG11c3Qg
+aGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYodC5sZW5ndGghPT04KWQuJDEoImFuIGFkZHJl
+c3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMiKQprPW5ldyBV
+aW50OEFycmF5KDE2KQpmb3IobT10Lmxlbmd0aCxqPWsubGVuZ3RoLGk9OS1tLHM9MCxoPTA7czxtOysr
+cyl7Zz10W3NdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsrK2Ype2lmKGg8MHx8aD49ailyZXR1cm4gSC5P
+SChrLGgpCmtbaF09MAplPWgrMQppZihlPj1qKXJldHVybiBILk9IKGssZSkKa1tlXT0wCmgrPTJ9ZWxz
+ZXtlPUMuam4ud0coZyw4KQppZihoPDB8fGg+PWopcmV0dXJuIEguT0goayxoKQprW2hdPWUKZT1oKzEK
+aWYoZT49ailyZXR1cm4gSC5PSChrLGUpCmtbZV09ZyYyNTUKaCs9Mn19cmV0dXJuIGt9LApqdjpmdW5j
+dGlvbihhLGIsYyxkLGUsZixnLGgsaSxqKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwKaWYoaj09bnVs
+bClpZihkPmIpaj1QLlBpKGEsYixkKQplbHNle2lmKGQ9PT1iKVAuUjMoYSxiLCJJbnZhbGlkIGVtcHR5
+IHNjaGVtZSIpCmo9IiJ9aWYoZT5iKXt0PWQrMwpzPXQ8ZT9QLnpSKGEsdCxlLTEpOiIiCnI9UC5PZShh
+LGUsZiwhMSkKaWYodHlwZW9mIGYhPT0ibnVtYmVyIilyZXR1cm4gZi5oKCkKcT1mKzEKaWYodHlwZW9m
+IGchPT0ibnVtYmVyIilyZXR1cm4gSC5wWShnKQpwPXE8Zz9QLndCKFAuUUEoSi5sZChhLHEsZyksbmV3
+IFAuZTEoYSxmKSxtKSxqKTptfWVsc2V7cD1tCnI9cApzPSIifW89UC5rYShhLGcsaCxtLGosciE9bnVs
+bCkKaWYodHlwZW9mIGghPT0ibnVtYmVyIilyZXR1cm4gaC5KKCkKbj1oPGk/UC5sZShhLGgrMSxpLG0p
+Om0KcmV0dXJuIG5ldyBQLkRuKGoscyxyLHAsbyxuLGk8Yz9QLnRHKGEsaSsxLGMpOm0pfSwKd0s6ZnVu
+Y3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAKaWYoYT09PSJodHRwcyIpcmV0dXJuIDQ0Mwpy
+ZXR1cm4gMH0sClIzOmZ1bmN0aW9uKGEsYixjKXt0aHJvdyBILmIoUC5ycihjLGEsYikpfSwKa0U6ZnVu
+Y3Rpb24oYSxiKXtDLk5tLksoYSxuZXcgUC5OWSghMSkpfSwKSE46ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
+LHMscgpmb3IodD1ILnFDKGEsYyxudWxsLEgudDYoYSkuZCksdD1uZXcgSC5hNyh0LHQuZ0EodCksdC4k
+dGkuQygiYTc8YUwuRT4iKSk7dC5GKCk7KXtzPXQuZApyPVAubnUoJ1siKi86PD4/XFxcXHxdJykKcy50
+b1N0cmluZwppZihILm0yKHMsciwwKSl7dD1QLkw0KCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRoOiAi
+K3MpCnRocm93IEguYih0KX19fSwKcmc6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZighKDY1PD1hJiZhPD05
+MCkpdD05Nzw9YSYmYTw9MTIyCmVsc2UgdD0hMAppZih0KXJldHVybgp0PVAuTDQoIklsbGVnYWwgZHJp
+dmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHQpfSwKd0I6ZnVuY3Rpb24oYSxiKXtpZihhIT1u
+dWxsJiZhPT09UC53SyhiKSlyZXR1cm4gbnVsbApyZXR1cm4gYX0sCk9lOmZ1bmN0aW9uKGEsYixjLGQp
+e3ZhciB0LHMscixxLHAsbwppZihhPT1udWxsKXJldHVybiBudWxsCmlmKGI9PT1jKXJldHVybiIiCmlm
+KEMueEIubShhLGIpPT09OTEpe2lmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIGMuSE4oKQp0PWMt
+MQppZihDLnhCLm0oYSx0KSE9PTkzKVAuUjMoYSxiLCJNaXNzaW5nIGVuZCBgXWAgdG8gbWF0Y2ggYFtg
+IGluIGhvc3QiKQpzPWIrMQpyPVAudG8oYSxzLHQpCmlmKHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJu
+IHIuSigpCmlmKHI8dCl7cT1yKzEKcD1QLk9BKGEsQy54Qi5RaShhLCIyNSIscSk/ciszOnEsdCwiJTI1
+Iil9ZWxzZSBwPSIiClAuZWcoYSxzLHIpCnJldHVybiBDLnhCLk5qKGEsYixyKS50b0xvd2VyQ2FzZSgp
+K3ArIl0ifWlmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIEgucFkoYykKbz1iCmZvcig7bzxjOysr
+bylpZihDLnhCLm0oYSxvKT09PTU4KXtyPUMueEIuWFUoYSwiJSIsYikKaWYoIShyPj1iJiZyPGMpKXI9
+YwppZihyPGMpe3E9cisxCnA9UC5PQShhLEMueEIuUWkoYSwiMjUiLHEpP3IrMzpxLGMsIiUyNSIpfWVs
+c2UgcD0iIgpQLmVnKGEsYixyKQpyZXR1cm4iWyIrQy54Qi5OaihhLGIscikrcCsiXSJ9cmV0dXJuIFAu
+T0woYSxiLGMpfSwKdG86ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHM9Qy54Qi5YVShhLCIlIixiKQppZihz
+Pj1iKXtpZih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBILnBZKGMpCnQ9czxjfWVsc2UgdD0hMQpy
+ZXR1cm4gdD9zOmN9LApPQTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsaz1k
+IT09IiI/bmV3IFAuUm4oZCk6bnVsbAppZih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBILnBZKGMp
+CnQ9YgpzPXQKcj0hMApmb3IoO3Q8Yzspe3E9Qy54Qi5tKGEsdCkKaWYocT09PTM3KXtwPVAucnYoYSx0
+LCEwKQpvPXA9PW51bGwKaWYobyYmcil7dCs9Mwpjb250aW51ZX1pZihrPT1udWxsKWs9bmV3IFAuUm4o
+IiIpCm49ay5hKz1DLnhCLk5qKGEscyx0KQppZihvKXA9Qy54Qi5OaihhLHQsdCszKQplbHNlIGlmKHA9
+PT0iJSIpUC5SMyhhLHQsIlpvbmVJRCBzaG91bGQgbm90IGNvbnRhaW4gJSBhbnltb3JlIikKay5hPW4r
+cAp0Kz0zCnM9dApyPSEwfWVsc2V7aWYocTwxMjcpe289cT4+PjQKaWYobz49OClyZXR1cm4gSC5PSChD
+LkYzLG8pCm89KEMuRjNbb10mMTw8KHEmMTUpKSE9PTB9ZWxzZSBvPSExCmlmKG8pe2lmKHImJjY1PD1x
+JiY5MD49cSl7aWYoaz09bnVsbClrPW5ldyBQLlJuKCIiKQppZihzPHQpe2suYSs9Qy54Qi5OaihhLHMs
+dCkKcz10fXI9ITF9Kyt0fWVsc2V7aWYoKHEmNjQ1MTIpPT09NTUyOTYmJnQrMTxjKXttPUMueEIubShh
+LHQrMSkKaWYoKG0mNjQ1MTIpPT09NTYzMjApe3E9NjU1MzZ8KHEmMTAyMyk8PDEwfG0mMTAyMwpsPTJ9
+ZWxzZSBsPTF9ZWxzZSBsPTEKaWYoaz09bnVsbClrPW5ldyBQLlJuKCIiKQprLmErPUMueEIuTmooYSxz
+LHQpCmsuYSs9UC5ISChxKQp0Kz1sCnM9dH19fWlmKGs9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMp
+CmlmKHM8YylrLmErPUMueEIuTmooYSxzLGMpCm89ay5hCnJldHVybiBvLmNoYXJDb2RlQXQoMCk9PTA/
+bzpvfSwKT0w6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGoKaWYodHlwZW9m
+IGMhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShjKQp0PWIKcz10CnI9bnVsbApxPSEwCmZvcig7dDxjOyl7
+cD1DLnhCLm0oYSx0KQppZihwPT09Mzcpe289UC5ydihhLHQsITApCm49bz09bnVsbAppZihuJiZxKXt0
+Kz0zCmNvbnRpbnVlfWlmKHI9PW51bGwpcj1uZXcgUC5SbigiIikKbT1DLnhCLk5qKGEscyx0KQpsPXIu
+YSs9IXE/bS50b0xvd2VyQ2FzZSgpOm0KaWYobil7bz1DLnhCLk5qKGEsdCx0KzMpCms9M31lbHNlIGlm
+KG89PT0iJSIpe289IiUyNSIKaz0xfWVsc2Ugaz0zCnIuYT1sK28KdCs9awpzPXQKcT0hMH1lbHNle2lm
+KHA8MTI3KXtuPXA+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5lYSxuKQpuPShDLmVhW25dJjE8PChw
+JjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKXtpZihxJiY2NTw9cCYmOTA+PXApe2lmKHI9PW51bGwpcj1u
+ZXcgUC5SbigiIikKaWYoczx0KXtyLmErPUMueEIuTmooYSxzLHQpCnM9dH1xPSExfSsrdH1lbHNle2lm
+KHA8PTkzKXtuPXA+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5hayxuKQpuPShDLmFrW25dJjE8PChw
+JjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKVAuUjMoYSx0LCJJbnZhbGlkIGNoYXJhY3RlciIpCmVsc2V7
+aWYoKHAmNjQ1MTIpPT09NTUyOTYmJnQrMTxjKXtqPUMueEIubShhLHQrMSkKaWYoKGomNjQ1MTIpPT09
+NTYzMjApe3A9NjU1MzZ8KHAmMTAyMyk8PDEwfGomMTAyMwprPTJ9ZWxzZSBrPTF9ZWxzZSBrPTEKaWYo
+cj09bnVsbClyPW5ldyBQLlJuKCIiKQptPUMueEIuTmooYSxzLHQpCnIuYSs9IXE/bS50b0xvd2VyQ2Fz
+ZSgpOm0Kci5hKz1QLkhIKHApCnQrPWsKcz10fX19fWlmKHI9PW51bGwpcmV0dXJuIEMueEIuTmooYSxi
+LGMpCmlmKHM8Yyl7bT1DLnhCLk5qKGEscyxjKQpyLmErPSFxP20udG9Mb3dlckNhc2UoKTptfW49ci5h
+CnJldHVybiBuLmNoYXJDb2RlQXQoMCk9PTA/bjpufSwKUGk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMs
+cixxCmlmKGI9PT1jKXJldHVybiIiCmlmKCFQLkV0KEouclkoYSkuVyhhLGIpKSlQLlIzKGEsYiwiU2No
+ZW1lIG5vdCBzdGFydGluZyB3aXRoIGFscGhhYmV0aWMgY2hhcmFjdGVyIikKZm9yKHQ9YixzPSExO3Q8
+YzsrK3Qpe3I9Qy54Qi5XKGEsdCkKaWYocjwxMjgpe3E9cj4+PjQKaWYocT49OClyZXR1cm4gSC5PSChD
+Lm1LLHEpCnE9KEMubUtbcV0mMTw8KHImMTUpKSE9PTB9ZWxzZSBxPSExCmlmKCFxKVAuUjMoYSx0LCJJ
+bGxlZ2FsIHNjaGVtZSBjaGFyYWN0ZXIiKQppZig2NTw9ciYmcjw9OTApcz0hMH1hPUMueEIuTmooYSxi
+LGMpCnJldHVybiBQLllhKHM/YS50b0xvd2VyQ2FzZSgpOmEpfSwKWWE6ZnVuY3Rpb24oYSl7aWYoYT09
+PSJodHRwIilyZXR1cm4iaHR0cCIKaWYoYT09PSJmaWxlIilyZXR1cm4iZmlsZSIKaWYoYT09PSJodHRw
+cyIpcmV0dXJuImh0dHBzIgppZihhPT09InBhY2thZ2UiKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gYX0s
+CnpSOmZ1bmN0aW9uKGEsYixjKXtpZihhPT1udWxsKXJldHVybiIiCnJldHVybiBQLnVPKGEsYixjLEMu
+dG8sITEpfSwKa2E6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciB0LHM9ZT09PSJmaWxlIixyPXN8fGYs
+cT1hPT1udWxsCmlmKHEmJiEwKXJldHVybiBzPyIvIjoiIgp0PSFxP1AudU8oYSxiLGMsQy5XZCwhMCk6
+Qy5qTi5FMihkLG5ldyBQLlJaKCksdS5OKS5IKDAsIi8iKQppZih0Lmxlbmd0aD09PTApe2lmKHMpcmV0
+dXJuIi8ifWVsc2UgaWYociYmIUMueEIubih0LCIvIikpdD0iLyIrdApyZXR1cm4gUC5Kcih0LGUsZil9
+LApKcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9Yi5sZW5ndGg9PT0wCmlmKHQmJiFjJiYhQy54Qi5uKGEs
+Ii8iKSlyZXR1cm4gUC53RihhLCF0fHxjKQpyZXR1cm4gUC54ZShhKX0sCmxlOmZ1bmN0aW9uKGEsYixj
+LGQpe3ZhciB0LHM9e30KaWYoYSE9bnVsbCl7aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgiQm90aCBx
+dWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmllZCIpKQpyZXR1cm4gUC51TyhhLGIsYyxDLlZD
+LCEwKX1pZihkPT1udWxsKXJldHVybiBudWxsCnQ9bmV3IFAuUm4oIiIpCnMuYT0iIgpkLksoMCxuZXcg
+UC55NShuZXcgUC5NRShzLHQpKSkKcz10LmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAp0
+RzpmdW5jdGlvbihhLGIsYyl7aWYoYT09bnVsbClyZXR1cm4gbnVsbApyZXR1cm4gUC51TyhhLGIsYyxD
+LlZDLCEwKX0sCnJ2OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG89YisyCmlmKG8+PWEubGVu
+Z3RoKXJldHVybiIlIgp0PUMueEIubShhLGIrMSkKcz1DLnhCLm0oYSxvKQpyPUgub28odCkKcT1ILm9v
+KHMpCmlmKHI8MHx8cTwwKXJldHVybiIlIgpwPXIqMTYrcQppZihwPDEyNyl7bz1DLmpuLndHKHAsNCkK
+aWYobz49OClyZXR1cm4gSC5PSChDLkYzLG8pCm89KEMuRjNbb10mMTw8KHAmMTUpKSE9PTB9ZWxzZSBv
+PSExCmlmKG8pcmV0dXJuIEguTHcoYyYmNjU8PXAmJjkwPj1wPyhwfDMyKT4+PjA6cCkKaWYodD49OTd8
+fHM+PTk3KXJldHVybiBDLnhCLk5qKGEsYixiKzMpLnRvVXBwZXJDYXNlKCkKcmV0dXJuIG51bGx9LApI
+SDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbj0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYTwxMjgp
+e3Q9bmV3IEFycmF5KDMpCnQuZml4ZWQkbGVuZ3RoPUFycmF5CnM9SC5WTSh0LHUudCkKQy5ObS5ZKHMs
+MCwzNykKQy5ObS5ZKHMsMSxDLnhCLlcobixhPj4+NCkpCkMuTm0uWShzLDIsQy54Qi5XKG4sYSYxNSkp
+fWVsc2V7aWYoYT4yMDQ3KWlmKGE+NjU1MzUpe3I9MjQwCnE9NH1lbHNle3I9MjI0CnE9M31lbHNle3I9
+MTkyCnE9Mn10PW5ldyBBcnJheSgzKnEpCnQuZml4ZWQkbGVuZ3RoPUFycmF5CnM9SC5WTSh0LHUudCkK
+Zm9yKHA9MDstLXEscT49MDtyPTEyOCl7bz1DLmpuLmJmKGEsNipxKSY2M3xyCkMuTm0uWShzLHAsMzcp
+CkMuTm0uWShzLHArMSxDLnhCLlcobixvPj4+NCkpCkMuTm0uWShzLHArMixDLnhCLlcobixvJjE1KSkK
+cCs9M319cmV0dXJuIFAuSE0ocywwLG51bGwpfSwKdU86ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1Q
+LlVsKGEsYixjLGQsZSkKcmV0dXJuIHQ9PW51bGw/Qy54Qi5OaihhLGIsYyk6dH0sClVsOmZ1bmN0aW9u
+KGEsYixjLGQsZSl7dmFyIHQscyxyLHEscCxvPW51bGwsbj0hZSxtPWIsbD1tLGs9bwp3aGlsZSghMCl7
+aWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gbS5KKCkKaWYodHlwZW9mIGMhPT0ibnVtYmVyIily
+ZXR1cm4gSC5wWShjKQppZighKG08YykpYnJlYWsKYyQwOnt0PUMueEIubShhLG0pCmlmKHQ8MTI3KXtz
+PXQ+Pj40CmlmKHM+PTgpcmV0dXJuIEguT0goZCxzKQpzPShkW3NdJjE8PCh0JjE1KSkhPT0wfWVsc2Ug
+cz0hMQppZihzKSsrbQplbHNle2lmKHQ9PT0zNyl7cj1QLnJ2KGEsbSwhMSkKaWYocj09bnVsbCl7bSs9
+MwpicmVhayBjJDB9aWYoIiUiPT09cil7cj0iJTI1IgpxPTF9ZWxzZSBxPTN9ZWxzZXtpZihuKWlmKHQ8
+PTkzKXtzPXQ+Pj40CmlmKHM+PTgpcmV0dXJuIEguT0goQy5hayxzKQpzPShDLmFrW3NdJjE8PCh0JjE1
+KSkhPT0wfWVsc2Ugcz0hMQplbHNlIHM9ITEKaWYocyl7UC5SMyhhLG0sIkludmFsaWQgY2hhcmFjdGVy
+IikKcT1vCnI9cX1lbHNle2lmKCh0JjY0NTEyKT09PTU1Mjk2KXtzPW0rMQppZihzPGMpe3A9Qy54Qi5t
+KGEscykKaWYoKHAmNjQ1MTIpPT09NTYzMjApe3Q9NjU1MzZ8KHQmMTAyMyk8PDEwfHAmMTAyMwpxPTJ9
+ZWxzZSBxPTF9ZWxzZSBxPTF9ZWxzZSBxPTEKcj1QLkhIKHQpfX1pZihrPT1udWxsKWs9bmV3IFAuUm4o
+IiIpCmsuYSs9Qy54Qi5OaihhLGwsbSkKay5hKz1ILmQocikKaWYodHlwZW9mIHEhPT0ibnVtYmVyIily
+ZXR1cm4gSC5wWShxKQptKz1xCmw9bX19fWlmKGs9PW51bGwpcmV0dXJuIG8KaWYodHlwZW9mIGwhPT0i
+bnVtYmVyIilyZXR1cm4gbC5KKCkKaWYobDxjKWsuYSs9Qy54Qi5OaihhLGwsYykKbj1rLmEKcmV0dXJu
+IG4uY2hhckNvZGVBdCgwKT09MD9uOm59LAp5QjpmdW5jdGlvbihhKXtpZihDLnhCLm4oYSwiLiIpKXJl
+dHVybiEwCnJldHVybiBDLnhCLk9ZKGEsIi8uIikhPT0tMX0sCnhlOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cixxLHAsbyxuCmlmKCFQLnlCKGEpKXJldHVybiBhCnQ9SC5WTShbXSx1LnMpCmZvcihzPWEuc3BsaXQo
+Ii8iKSxyPXMubGVuZ3RoLHE9ITEscD0wO3A8cjsrK3Ape289c1twXQppZihKLlJNKG8sIi4uIikpe249
+dC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0godCwtMSkKdC5wb3AoKQppZih0Lmxl
+bmd0aD09PTApQy5ObS5pKHQsIiIpfXE9ITB9ZWxzZSBpZigiLiI9PT1vKXE9ITAKZWxzZXtDLk5tLmko
+dCxvKQpxPSExfX1pZihxKUMuTm0uaSh0LCIiKQpyZXR1cm4gQy5ObS5IKHQsIi8iKX0sCndGOmZ1bmN0
+aW9uKGEsYil7dmFyIHQscyxyLHEscCxvCmlmKCFQLnlCKGEpKXJldHVybiFiP1AuQzEoYSk6YQp0PUgu
+Vk0oW10sdS5zKQpmb3Iocz1hLnNwbGl0KCIvIikscj1zLmxlbmd0aCxxPSExLHA9MDtwPHI7KytwKXtv
+PXNbcF0KaWYoIi4uIj09PW8paWYodC5sZW5ndGghPT0wJiZDLk5tLmdyWih0KSE9PSIuLiIpe2lmKDA+
+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsLTEpCnQucG9wKCkKcT0hMH1lbHNle0MuTm0uaSh0LCIuLiIp
+CnE9ITF9ZWxzZSBpZigiLiI9PT1vKXE9ITAKZWxzZXtDLk5tLmkodCxvKQpxPSExfX1zPXQubGVuZ3Ro
+CmlmKHMhPT0wKWlmKHM9PT0xKXtpZigwPj1zKXJldHVybiBILk9IKHQsMCkKcz10WzBdLmxlbmd0aD09
+PTB9ZWxzZSBzPSExCmVsc2Ugcz0hMAppZihzKXJldHVybiIuLyIKaWYocXx8Qy5ObS5ncloodCk9PT0i
+Li4iKUMuTm0uaSh0LCIiKQppZighYil7aWYoMD49dC5sZW5ndGgpcmV0dXJuIEguT0godCwwKQpDLk5t
+LlkodCwwLFAuQzEodFswXSkpfXJldHVybiBDLk5tLkgodCwiLyIpfSwKQzE6ZnVuY3Rpb24oYSl7dmFy
+IHQscyxyLHE9YS5sZW5ndGgKaWYocT49MiYmUC5FdChKLlF6KGEsMCkpKWZvcih0PTE7dDxxOysrdCl7
+cz1DLnhCLlcoYSx0KQppZihzPT09NTgpcmV0dXJuIEMueEIuTmooYSwwLHQpKyIlM0EiK0MueEIuRyhh
+LHQrMSkKaWYoczw9MTI3KXtyPXM+Pj40CmlmKHI+PTgpcmV0dXJuIEguT0goQy5tSyxyKQpyPShDLm1L
+W3JdJjE8PChzJjE1KSk9PT0wfWVsc2Ugcj0hMAppZihyKWJyZWFrfXJldHVybiBhfSwKbW46ZnVuY3Rp
+b24oYSl7dmFyIHQscyxyLHE9YS5nRmooKSxwPXEubGVuZ3RoCmlmKHA+MCYmSi5IbShxWzBdKT09PTIm
+JkouYTYocVswXSwxKT09PTU4KXtpZigwPj1wKXJldHVybiBILk9IKHEsMCkKUC5yZyhKLmE2KHFbMF0s
+MCksITEpClAuSE4ocSwhMSwxKQp0PSEwfWVsc2V7UC5ITihxLCExLDApCnQ9ITF9cz1hLmd0VCgpJiYh
+dD8iXFwiOiIiCmlmKGEuZ2NqKCkpe3I9YS5nSmYoYSkKaWYoci5sZW5ndGghPT0wKXM9cysiXFwiK3Ir
+IlxcIn1zPVAudmcocyxxLCJcXCIpCnA9dCYmcD09PTE/cysiXFwiOnMKcmV0dXJuIHAuY2hhckNvZGVB
+dCgwKT09MD9wOnB9LApJaDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgpmb3IodD0wLHM9MDtzPDI7Kytz
+KXtyPUMueEIuVyhhLGIrcykKaWYoNDg8PXImJnI8PTU3KXQ9dCoxNityLTQ4CmVsc2V7cnw9MzIKaWYo
+OTc8PXImJnI8PTEwMil0PXQqMTYrci04NwplbHNlIHRocm93IEguYihQLnhZKCJJbnZhbGlkIFVSTCBl
+bmNvZGluZyIpKX19cmV0dXJuIHR9LAprdTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0LHMscixxLHA9
+Si5yWShhKSxvPWIKd2hpbGUoITApe2lmKCEobzxjKSl7dD0hMApicmVha31zPXAuVyhhLG8pCmlmKHM8
+PTEyNylpZihzIT09Mzcpcj1lJiZzPT09NDMKZWxzZSByPSEwCmVsc2Ugcj0hMAppZihyKXt0PSExCmJy
+ZWFrfSsrb31pZih0KXtpZihDLnhNIT09ZClyPSExCmVsc2Ugcj0hMAppZihyKXJldHVybiBwLk5qKGEs
+YixjKQplbHNlIHE9bmV3IEgucWoocC5OaihhLGIsYykpfWVsc2V7cT1ILlZNKFtdLHUudCkKZm9yKG89
+YjtvPGM7KytvKXtzPXAuVyhhLG8pCmlmKHM+MTI3KXRocm93IEguYihQLnhZKCJJbGxlZ2FsIHBlcmNl
+bnQgZW5jb2RpbmcgaW4gVVJJIikpCmlmKHM9PT0zNyl7aWYobyszPmEubGVuZ3RoKXRocm93IEguYihQ
+LnhZKCJUcnVuY2F0ZWQgVVJJIikpCkMuTm0uaShxLFAuSWgoYSxvKzEpKQpvKz0yfWVsc2UgaWYoZSYm
+cz09PTQzKUMuTm0uaShxLDMyKQplbHNlIEMuTm0uaShxLHMpfX11LkwuYihxKQpyZXR1cm4gbmV3IFAu
+R1koITEpLldKKHEpfSwKRXQ6ZnVuY3Rpb24oYSl7dmFyIHQ9YXwzMgpyZXR1cm4gOTc8PXQmJnQ8PTEy
+Mn0sCktEOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9IkludmFsaWQgTUlNRSB0
+eXBlIixrPUguVk0oW2ItMV0sdS50KQpmb3IodD1hLmxlbmd0aCxzPWIscj0tMSxxPW51bGw7czx0Oysr
+cyl7cT1DLnhCLlcoYSxzKQppZihxPT09NDR8fHE9PT01OSlicmVhawppZihxPT09NDcpe2lmKHI8MCl7
+cj1zCmNvbnRpbnVlfXRocm93IEguYihQLnJyKGwsYSxzKSl9fWlmKHI8MCYmcz5iKXRocm93IEguYihQ
+LnJyKGwsYSxzKSkKZm9yKDtxIT09NDQ7KXtDLk5tLmkoayxzKTsrK3MKZm9yKHA9LTE7czx0Oysrcyl7
+cT1DLnhCLlcoYSxzKQppZihxPT09NjEpe2lmKHA8MClwPXN9ZWxzZSBpZihxPT09NTl8fHE9PT00NCli
+cmVha31pZihwPj0wKUMuTm0uaShrLHApCmVsc2V7bz1DLk5tLmdyWihrKQppZihxIT09NDR8fHMhPT1v
+Kzd8fCFDLnhCLlFpKGEsImJhc2U2NCIsbysxKSl0aHJvdyBILmIoUC5ycigiRXhwZWN0aW5nICc9JyIs
+YSxzKSkKYnJlYWt9fUMuTm0uaShrLHMpCm49cysxCmlmKChrLmxlbmd0aCYxKT09PTEpYT1DLmg5Lnly
+KGEsbix0KQplbHNle209UC5VbChhLG4sdCxDLlZDLCEwKQppZihtIT1udWxsKWE9Qy54Qi5pNyhhLG4s
+dCxtKX1yZXR1cm4gbmV3IFAuUEUoYSxrLGMpfSwKdXg6ZnVuY3Rpb24oKXt2YXIgdD0iMDEyMzQ1Njc4
+OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXotLl9+ISQm
+JygpKissOz0iLHM9Ii4iLHI9IjoiLHE9Ii8iLHA9Ij8iLG89IiMiLG49dS5nYyxtPVAuZEgoMjIsbmV3
+IFAucTMoKSwhMCxuKSxsPW5ldyBQLnlJKG0pLGs9bmV3IFAuYzYoKSxqPW5ldyBQLnFkKCksaT1uLmIo
+bC4kMigwLDIyNSkpCmsuJDMoaSx0LDEpCmsuJDMoaSxzLDE0KQprLiQzKGksciwzNCkKay4kMyhpLHEs
+MykKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTQsMjI1KSkKay4kMyhpLHQs
+MSkKay4kMyhpLHMsMTUpCmsuJDMoaSxyLDM0KQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikKay4k
+MyhpLG8sMjA1KQppPW4uYihsLiQyKDE1LDIyNSkpCmsuJDMoaSx0LDEpCmsuJDMoaSwiJSIsMjI1KQpr
+LiQzKGksciwzNCkKay4kMyhpLHEsOSkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwu
+JDIoMSwyMjUpKQprLiQzKGksdCwxKQprLiQzKGksciwzNCkKay4kMyhpLHEsMTApCmsuJDMoaSxwLDE3
+MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDIsMjM1KSkKay4kMyhpLHQsMTM5KQprLiQzKGkscSwx
+MzEpCmsuJDMoaSxzLDE0NikKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMywy
+MzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHEsNjgpCmsuJDMoaSxzLDE4KQprLiQzKGkscCwxNzIpCmsu
+JDMoaSxvLDIwNSkKaT1uLmIobC4kMig0LDIyOSkpCmsuJDMoaSx0LDUpCmouJDMoaSwiQVoiLDIyOSkK
+ay4kMyhpLHIsMTAyKQprLiQzKGksIkAiLDY4KQprLiQzKGksIlsiLDIzMikKay4kMyhpLHEsMTM4KQpr
+LiQzKGkscCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1uLmIobC4kMig1LDIyOSkpCmsuJDMoaSx0LDUpCmou
+JDMoaSwiQVoiLDIyOSkKay4kMyhpLHIsMTAyKQprLiQzKGksIkAiLDY4KQprLiQzKGkscSwxMzgpCmsu
+JDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDYsMjMxKSkKai4kMyhpLCIxOSIsNykK
+ay4kMyhpLCJAIiw2OCkKay4kMyhpLHEsMTM4KQprLiQzKGkscCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1u
+LmIobC4kMig3LDIzMSkpCmouJDMoaSwiMDkiLDcpCmsuJDMoaSwiQCIsNjgpCmsuJDMoaSxxLDEzOCkK
+ay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmsuJDMobi5iKGwuJDIoOCw4KSksIl0iLDUpCmk9bi5i
+KGwuJDIoOSwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTYpCmsuJDMoaSxxLDIzNCkKay4kMyhp
+LHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTYsMjM1KSkKay4kMyhpLHQsMTEpCmsuJDMo
+aSxzLDE3KQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQy
+KDE3LDIzNSkpCmsuJDMoaSx0LDExKQprLiQzKGkscSw5KQprLiQzKGkscCwxNzIpCmsuJDMoaSxvLDIw
+NSkKaT1uLmIobC4kMigxMCwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTgpCmsuJDMoaSxxLDIz
+NCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTgsMjM1KSkKay4kMyhpLHQs
+MTEpCmsuJDMoaSxzLDE5KQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQpp
+PW4uYihsLiQyKDE5LDIzNSkpCmsuJDMoaSx0LDExKQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikK
+ay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDExLDIzNSkpCmsuJDMoaSx0LDExKQprLiQzKGkscSwxMCkK
+ay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTIsMjM2KSkKay4kMyhpLHQsMTIp
+CmsuJDMoaSxwLDEyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTMsMjM3KSkKay4kMyhpLHQsMTMp
+CmsuJDMoaSxwLDEzKQpqLiQzKG4uYihsLiQyKDIwLDI0NSkpLCJheiIsMjEpCmw9bi5iKGwuJDIoMjEs
+MjQ1KSkKai4kMyhsLCJheiIsMjEpCmouJDMobCwiMDkiLDIxKQprLiQzKGwsIistLiIsMjEpCnJldHVy
+biBtfSwKVUI6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIscSxwLG89JC52WigpCmZvcih0PUou
+clkoYSkscz1iO3M8YzsrK3Mpe2lmKGQ8MHx8ZD49by5sZW5ndGgpcmV0dXJuIEguT0gobyxkKQpyPW9b
+ZF0KcT10LlcoYSxzKV45NgppZihxPjk1KXE9MzEKaWYocT49ci5sZW5ndGgpcmV0dXJuIEguT0gocixx
+KQpwPXJbcV0KZD1wJjMxCkMuTm0uWShlLHA+Pj41LHMpfXJldHVybiBkfSwKV0Y6ZnVuY3Rpb24gV0Yo
+YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmEyOmZ1bmN0aW9uIGEyKCl7fSwKaVA6ZnVuY3Rpb24gaVAo
+YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkNQOmZ1bmN0aW9uIENQKCl7fSwKWFM6ZnVuY3Rpb24gWFMo
+KXt9LApDNjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0sCm46ZnVuY3Rpb24gbigpe30sCnU6ZnVuY3Rp
+b24gdShhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKYko6ZnVuY3Rp
+b24gYkooYSxiLGMsZCxlLGYpe3ZhciBfPXRoaXMKXy5lPWEKXy5mPWIKXy5hPWMKXy5iPWQKXy5jPWUK
+Xy5kPWZ9LAplWTpmdW5jdGlvbiBlWShhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5mPWEKXy5hPWIKXy5i
+PWMKXy5jPWQKXy5kPWV9LAptcDpmdW5jdGlvbiBtcChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8u
+Yj1iCl8uYz1jCl8uZD1kfSwKdWI6ZnVuY3Rpb24gdWIoYSl7dGhpcy5hPWF9LApkczpmdW5jdGlvbiBk
+cyhhKXt0aGlzLmE9YX0sCmxqOmZ1bmN0aW9uIGxqKGEpe3RoaXMuYT1hfSwKVVY6ZnVuY3Rpb24gVVYo
+YSl7dGhpcy5hPWF9LAprNTpmdW5jdGlvbiBrNSgpe30sCktZOmZ1bmN0aW9uIEtZKCl7fSwKYzpmdW5j
+dGlvbiBjKGEpe3RoaXMuYT1hfSwKQ0Q6ZnVuY3Rpb24gQ0QoYSl7dGhpcy5hPWF9LAphRTpmdW5jdGlv
+biBhRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApFSDpmdW5jdGlvbiBFSCgpe30s
+CktOOmZ1bmN0aW9uIEtOKCl7fSwKY1g6ZnVuY3Rpb24gY1goKXt9LApBbjpmdW5jdGlvbiBBbigpe30s
+CnpNOmZ1bmN0aW9uIHpNKCl7fSwKWjA6ZnVuY3Rpb24gWjAoKXt9LApjODpmdW5jdGlvbiBjOCgpe30s
+CkZLOmZ1bmN0aW9uIEZLKCl7fSwKazpmdW5jdGlvbiBrKCl7fSwKT2Q6ZnVuY3Rpb24gT2QoKXt9LApp
+YjpmdW5jdGlvbiBpYigpe30sCnh1OmZ1bmN0aW9uIHh1KCl7fSwKR3o6ZnVuY3Rpb24gR3ooKXt9LApx
+VTpmdW5jdGlvbiBxVSgpe30sClJuOmZ1bmN0aW9uIFJuKGEpe3RoaXMuYT1hfSwKR0Q6ZnVuY3Rpb24g
+R0QoKXt9LApuMTpmdW5jdGlvbiBuMShhKXt0aGlzLmE9YX0sCmNTOmZ1bmN0aW9uIGNTKGEpe3RoaXMu
+YT1hfSwKVkM6ZnVuY3Rpb24gVkMoYSl7dGhpcy5hPWF9LAp0cDpmdW5jdGlvbiB0cChhLGIpe3RoaXMu
+YT1hCnRoaXMuYj1ifSwKRG46ZnVuY3Rpb24gRG4oYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmE9
+YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9ZwpfLlE9Xy56PV8ueT1fLng9bnVsbH0s
+CmUxOmZ1bmN0aW9uIGUxKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApOWTpmdW5jdGlvbiBOWShhKXt0
+aGlzLmE9YX0sClJaOmZ1bmN0aW9uIFJaKCl7fSwKTUU6ZnVuY3Rpb24gTUUoYSxiKXt0aGlzLmE9YQp0
+aGlzLmI9Yn0sCnk1OmZ1bmN0aW9uIHk1KGEpe3RoaXMuYT1hfSwKUEU6ZnVuY3Rpb24gUEUoYSxiLGMp
+e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcTM6ZnVuY3Rpb24gcTMoKXt9LAp5STpmdW5jdGlv
+biB5SShhKXt0aGlzLmE9YX0sCmM2OmZ1bmN0aW9uIGM2KCl7fSwKcWQ6ZnVuY3Rpb24gcWQoKXt9LApV
+ZjpmdW5jdGlvbiBVZihhLGIsYyxkLGUsZixnLGgpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMK
+Xy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PWgKXy55PW51bGx9LApxZTpmdW5jdGlvbiBxZShhLGIs
+YyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8u
+cj1nCl8uUT1fLno9Xy55PV8ueD1udWxsfSwKaUo6ZnVuY3Rpb24gaUooKXt9LApsUjpmdW5jdGlvbiBs
+UihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKamc6ZnVuY3Rpb24gamcoYSxiKXt0aGlzLmE9YQp0aGlz
+LmI9Yn0sCkJmOmZ1bmN0aW9uIEJmKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBczpmdW5jdGlvbiBB
+cygpe30sCkdFOmZ1bmN0aW9uIEdFKGEpe3RoaXMuYT1hfSwKTjc6ZnVuY3Rpb24gTjcoYSxiKXt0aGlz
+LmE9YQp0aGlzLmI9Yn0sCnVROmZ1bmN0aW9uIHVRKCl7fSwKaEY6ZnVuY3Rpb24gaEYoKXt9LApSNDpm
+dW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHIKSC54ZChiKQp1LmouYihkKQppZihILm9UKGIpKXt0PVtj
+XQpDLk5tLkZWKHQsZCkKZD10fXM9dS56CnI9UC5DSChKLk0xKGQsUC53MCgpLHMpLCEwLHMpCnUuWi5i
+KGEpCnJldHVybiBQLndZKEguRWsoYSxyLG51bGwpKX0sCkRtOmZ1bmN0aW9uKGEsYixjKXt2YXIgdAp0
+cnl7aWYoT2JqZWN0LmlzRXh0ZW5zaWJsZShhKSYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVy
+dHkuY2FsbChhLGIpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTpjfSkKcmV0dXJuITB9
+fWNhdGNoKHQpe0guUnUodCl9cmV0dXJuITF9LApPbTpmdW5jdGlvbihhLGIpe2lmKE9iamVjdC5wcm90
+b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpKXJldHVybiBhW2JdCnJldHVybiBudWxsfSwKd1k6
+ZnVuY3Rpb24oYSl7aWYoYT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJl
+ciJ8fEgubChhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5FNClyZXR1cm4gYS5hCmlmKEguUjko
+YSkpcmV0dXJuIGEKaWYodS53LmMoYSkpcmV0dXJuIGEKaWYoYSBpbnN0YW5jZW9mIFAuaVApcmV0dXJu
+IEgubzIoYSkKaWYodS5aLmMoYSkpcmV0dXJuIFAuaEUoYSwiJGRhcnRfanNGdW5jdGlvbiIsbmV3IFAu
+UEMoKSkKcmV0dXJuIFAuaEUoYSwiXyRkYXJ0X2pzT2JqZWN0IixuZXcgUC5ZbSgkLmtJKCkpKX0sCmhF
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1QLk9tKGEsYikKaWYodD09bnVsbCl7dD1jLiQxKGEpClAuRG0o
+YSxiLHQpfXJldHVybiB0fSwKTDc6ZnVuY3Rpb24oYSl7dmFyIHQscwppZihhPT1udWxsfHx0eXBlb2Yg
+YT09InN0cmluZyJ8fHR5cGVvZiBhPT0ibnVtYmVyInx8dHlwZW9mIGE9PSJib29sZWFuIilyZXR1cm4g
+YQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmplY3QmJkguUjkoYSkpcmV0dXJuIGEKZWxzZSBpZihhIGlu
+c3RhbmNlb2YgT2JqZWN0JiZ1LncuYyhhKSlyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBEYXRl
+KXt0PUguU2MoYS5nZXRUaW1lKCkpCmlmKE1hdGguYWJzKHQpPD04NjRlMTMpcz0hMQplbHNlIHM9ITAK
+aWYocylILnZoKFAueFkoIkRhdGVUaW1lIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2U6ICIrdCkpCnJldHVy
+biBuZXcgUC5pUCh0LCExKX1lbHNlIGlmKGEuY29uc3RydWN0b3I9PT0kLmtJKCkpcmV0dXJuIGEubwpl
+bHNlIHJldHVybiBQLk5EKGEpfSwKTkQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIp
+cmV0dXJuIFAuaVEoYSwkLncoKSxuZXcgUC5OeigpKQppZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJu
+IFAuaVEoYSwkLlI4KCksbmV3IFAubnAoKSkKcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAuVXQoKSl9
+LAppUTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9UC5PbShhLGIpCmlmKHQ9PW51bGx8fCEoYSBpbnN0YW5j
+ZW9mIE9iamVjdCkpe3Q9Yy4kMShhKQpQLkRtKGEsYix0KX1yZXR1cm4gdH0sClBDOmZ1bmN0aW9uIFBD
+KCl7fSwKWW06ZnVuY3Rpb24gWW0oYSl7dGhpcy5hPWF9LApOejpmdW5jdGlvbiBOeigpe30sCm5wOmZ1
+bmN0aW9uIG5wKCl7fSwKVXQ6ZnVuY3Rpb24gVXQoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlzLmE9
+YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3RoaXMuYT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlzLmE9
+YQp0aGlzLiR0aT1ifSwKY286ZnVuY3Rpb24gY28oKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktlOmZ1
+bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwKZDU6ZnVuY3Rpb24gZDUoKXt9LApuNjpmdW5jdGlvbiBuNigp
+e319LFc9ewpacjpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudH0sClU5OmZ1bmN0aW9uKGEsYixjKXt2
+YXIgdD1kb2N1bWVudC5ib2R5LHM9KHQmJkMuUlkpLnI2KHQsYSxiLGMpCnMudG9TdHJpbmcKdD11LmFj
+CnQ9bmV3IEguVTUobmV3IFcuZTcocyksdC5DKCJhMihsRC5FKSIpLmIobmV3IFcuQ3YoKSksdC5DKCJV
+NTxsRC5FPiIpKQpyZXR1cm4gdS5oLmIodC5ncjgodCkpfSwKclM6ZnVuY3Rpb24oYSl7dmFyIHQscyxy
+PSJlbGVtZW50IHRhZyB1bmF2YWlsYWJsZSIKdHJ5e3Q9Si5SRShhKQppZih0eXBlb2YgdC5nbnMoYSk9
+PSJzdHJpbmciKXI9dC5nbnMoYSl9Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4gcn0sCnFEOmZ1bmN0aW9u
+KGEsYixjKXt2YXIgdCxzLHIscT1uZXcgUC52cygkLlgzLHUuYW8pLHA9bmV3IFAuWmYocSx1LmJqKSxv
+PW5ldyBYTUxIdHRwUmVxdWVzdCgpCkMuRHQuZW8obyxiPT1udWxsPyJHRVQiOmIsYSwhMCkKYy5LKDAs
+bmV3IFcuYlUobykpCnQ9dS5hbgpzPXQuYihuZXcgVy5oSChvLHApKQp1Lk0uYihudWxsKQpyPXUucApX
+LkpFKG8sImxvYWQiLHMsITEscikKVy5KRShvLCJlcnJvciIsdC5iKHAuZ1lKKCkpLCExLHIpCm8uc2Vu
+ZCgpCnJldHVybiBxfSwKQzA6ZnVuY3Rpb24oYSxiKXthPTUzNjg3MDkxMSZhK2IKYT01MzY4NzA5MTEm
+YSsoKDUyNDI4NyZhKTw8MTApCnJldHVybiBhXmE+Pj42fSwKckU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
+IHQ9Vy5DMChXLkMwKFcuQzAoVy5DMCgwLGEpLGIpLGMpLGQpLHM9NTM2ODcwOTExJnQrKCg2NzEwODg2
+MyZ0KTw8MykKc149cz4+PjExCnJldHVybiA1MzY4NzA5MTEmcysoKDE2MzgzJnMpPDwxNSl9LApUTjpm
+dW5jdGlvbihhLGIpe3ZhciB0LHMscj1hLmNsYXNzTGlzdApmb3IodD1iLmxlbmd0aCxzPTA7czxiLmxl
+bmd0aDtiLmxlbmd0aD09PXR8fCgwLEgubGspKGIpLCsrcylyLmFkZChiW3NdKX0sCkpFOmZ1bmN0aW9u
+KGEsYixjLGQsZSl7dmFyIHQ9Vy5hRihuZXcgVy52TihjKSx1LkIpCmlmKHQhPW51bGwmJiEwKUouZFoo
+YSxiLHQsITEpCnJldHVybiBuZXcgVy54QyhhLGIsdCwhMSxlLkMoInhDPDA+IikpfSwKVHc6ZnVuY3Rp
+b24oYSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLHM9bmV3IFcubWsodCx3aW5kb3cu
+bG9jYXRpb24pCnM9bmV3IFcuSlEocykKcy5DWShhKQpyZXR1cm4gc30sCnlXOmZ1bmN0aW9uKGEsYixj
+LGQpe3UuaC5iKGEpCkgueShiKQpILnkoYykKdS5PLmIoZCkKcmV0dXJuITB9LApRVzpmdW5jdGlvbihh
+LGIsYyxkKXt2YXIgdCxzLHIKdS5oLmIoYSkKSC55KGIpCkgueShjKQp0PXUuTy5iKGQpLmEKcz10LmEK
+cy5ocmVmPWMKcj1zLmhvc3RuYW1lCnQ9dC5iCmlmKCEocj09dC5ob3N0bmFtZSYmcy5wb3J0PT10LnBv
+cnQmJnMucHJvdG9jb2w9PXQucHJvdG9jb2wpKWlmKHI9PT0iIilpZihzLnBvcnQ9PT0iIil7dD1zLnBy
+b3RvY29sCnQ9dD09PSI6Inx8dD09PSIifWVsc2UgdD0hMQplbHNlIHQ9ITEKZWxzZSB0PSEwCnJldHVy
+biB0fSwKQmw6ZnVuY3Rpb24oKXt2YXIgdD11Lk4scz1QLnRNKEMuUXgsdCkscj11LmRHLmIobmV3IFcu
+SUEoKSkscT1ILlZNKFsiVEVNUExBVEUiXSx1LnMpCnQ9bmV3IFcuY3QocyxQLkxzKHQpLFAuTHModCks
+UC5Mcyh0KSxudWxsKQp0LkNZKG51bGwsbmV3IEguQTgoQy5ReCxyLHUuZHYpLHEsbnVsbCkKcmV0dXJu
+IHR9LAp1VjpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBudWxsCnJldHVybiBXLlAxKGEpfSwK
+cWM6ZnVuY3Rpb24oYSl7dmFyIHQKaWYoYT09bnVsbClyZXR1cm4gbnVsbAppZigicG9zdE1lc3NhZ2Ui
+IGluIGEpe3Q9Vy5QMShhKQpyZXR1cm4gdH1lbHNlIHJldHVybiB1LmFTLmIoYSl9LApQMTpmdW5jdGlv
+bihhKXtpZihhPT09d2luZG93KXJldHVybiB1LmNpLmIoYSkKZWxzZSByZXR1cm4gbmV3IFcuZFcoYSl9
+LAp6WDpmdW5jdGlvbihhKXtpZihhPT09d2luZG93LmxvY2F0aW9uKXJldHVybiBhCmVsc2UgcmV0dXJu
+IG5ldyBXLkZiKCl9LAphRjpmdW5jdGlvbihhLGIpe3ZhciB0PSQuWDMKaWYodD09PUMuTlUpcmV0dXJu
+IGEKcmV0dXJuIHQuUHkoYSxiKX0sCnFFOmZ1bmN0aW9uIHFFKCl7fSwKR2g6ZnVuY3Rpb24gR2goKXt9
+LApmWTpmdW5jdGlvbiBmWSgpe30sCm5COmZ1bmN0aW9uIG5CKCl7fSwKQXo6ZnVuY3Rpb24gQXooKXt9
+LApRUDpmdW5jdGlvbiBRUCgpe30sCm54OmZ1bmN0aW9uIG54KCl7fSwKb0o6ZnVuY3Rpb24gb0ooKXt9
+LAppZDpmdW5jdGlvbiBpZCgpe30sClFGOmZ1bmN0aW9uIFFGKCl7fSwKTmg6ZnVuY3Rpb24gTmgoKXt9
+LApJQjpmdW5jdGlvbiBJQigpe30sCm43OmZ1bmN0aW9uIG43KCl7fSwKd3o6ZnVuY3Rpb24gd3ooYSxi
+KXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKY3Y6ZnVuY3Rpb24gY3YoKXt9LApDdjpmdW5jdGlvbiBDdigp
+e30sCmVhOmZ1bmN0aW9uIGVhKCl7fSwKRDA6ZnVuY3Rpb24gRDAoKXt9LApUNTpmdW5jdGlvbiBUNSgp
+e30sCmg0OmZ1bmN0aW9uIGg0KCl7fSwKYnI6ZnVuY3Rpb24gYnIoKXt9LApWYjpmdW5jdGlvbiBWYigp
+e30sCk83OmZ1bmN0aW9uIE83KCl7fSwKYlU6ZnVuY3Rpb24gYlUoYSl7dGhpcy5hPWF9LApoSDpmdW5j
+dGlvbiBoSChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKd2E6ZnVuY3Rpb24gd2EoKXt9LApTZzpmdW5j
+dGlvbiBTZygpe30sCnU4OmZ1bmN0aW9uIHU4KCl7fSwKQWo6ZnVuY3Rpb24gQWooKXt9LAplNzpmdW5j
+dGlvbiBlNyhhKXt0aGlzLmE9YX0sCnVIOmZ1bmN0aW9uIHVIKCl7fSwKQkg6ZnVuY3Rpb24gQkgoKXt9
+LApTTjpmdW5jdGlvbiBTTigpe30sCmV3OmZ1bmN0aW9uIGV3KCl7fSwKbHA6ZnVuY3Rpb24gbHAoKXt9
+LApUYjpmdW5jdGlvbiBUYigpe30sCkl2OmZ1bmN0aW9uIEl2KCl7fSwKQlQ6ZnVuY3Rpb24gQlQoKXt9
+LAp5WTpmdW5jdGlvbiB5WSgpe30sCnc2OmZ1bmN0aW9uIHc2KCl7fSwKSzU6ZnVuY3Rpb24gSzUoKXt9
+LApDbTpmdW5jdGlvbiBDbSgpe30sCkNROmZ1bmN0aW9uIENRKCl7fSwKdzQ6ZnVuY3Rpb24gdzQoKXt9
+LApyaDpmdW5jdGlvbiByaCgpe30sCmNmOmZ1bmN0aW9uIGNmKCl7fSwKaTc6ZnVuY3Rpb24gaTcoYSl7
+dGhpcy5hPWF9LApTeTpmdW5jdGlvbiBTeShhKXt0aGlzLmE9YX0sCktTOmZ1bmN0aW9uIEtTKGEsYil7
+dGhpcy5hPWEKdGhpcy5iPWJ9LApBMzpmdW5jdGlvbiBBMyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
+STQ6ZnVuY3Rpb24gSTQoYSl7dGhpcy5hPWF9LApGazpmdW5jdGlvbiBGayhhLGIpe3RoaXMuYT1hCnRo
+aXMuJHRpPWJ9LApSTzpmdW5jdGlvbiBSTyhhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8u
+Yz1jCl8uJHRpPWR9LApDcTpmdW5jdGlvbiBDcShhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1i
+Cl8uYz1jCl8uJHRpPWR9LAp4QzpmdW5jdGlvbiB4QyhhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5iPWEK
+Xy5jPWIKXy5kPWMKXy5lPWQKXy4kdGk9ZX0sCnZOOmZ1bmN0aW9uIHZOKGEpe3RoaXMuYT1hfSwKSlE6
+ZnVuY3Rpb24gSlEoYSl7dGhpcy5hPWF9LApHbTpmdW5jdGlvbiBHbSgpe30sCnZEOmZ1bmN0aW9uIHZE
+KGEpe3RoaXMuYT1hfSwKVXY6ZnVuY3Rpb24gVXYoYSl7dGhpcy5hPWF9LApFZzpmdW5jdGlvbiBFZyhh
+LGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAptNjpmdW5jdGlvbiBtNigpe30sCkVvOmZ1
+bmN0aW9uIEVvKCl7fSwKV2s6ZnVuY3Rpb24gV2soKXt9LApjdDpmdW5jdGlvbiBjdChhLGIsYyxkLGUp
+e3ZhciBfPXRoaXMKXy5lPWEKXy5hPWIKXy5iPWMKXy5jPWQKXy5kPWV9LApJQTpmdW5jdGlvbiBJQSgp
+e30sCk93OmZ1bmN0aW9uIE93KCl7fSwKVzk6ZnVuY3Rpb24gVzkoYSxiLGMpe3ZhciBfPXRoaXMKXy5h
+PWEKXy5iPWIKXy5jPS0xCl8uZD1udWxsCl8uJHRpPWN9LApkVzpmdW5jdGlvbiBkVyhhKXt0aGlzLmE9
+YX0sCkZiOmZ1bmN0aW9uIEZiKCl7fSwKa0Y6ZnVuY3Rpb24ga0YoKXt9LAptazpmdW5jdGlvbiBtayhh
+LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24gS28oYSl7dGhpcy5hPWF9LApmbTpmdW5j
+dGlvbiBmbShhKXt0aGlzLmE9YX0sCkxlOmZ1bmN0aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9
+LApyQjpmdW5jdGlvbiByQigpe30sClhXOmZ1bmN0aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9
+fSxVPXsKeXU6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG49SC5WTShbXSx1LmJQKQpmb3IodD1K
+LlU2KGEpLHM9Si5JVCh1LlIuYih0LnEoYSwiZGV0YWlscyIpKSk7cy5GKCk7KXtyPXMuZ2woKQpxPUou
+VTYocikKcD1ILnkocS5xKHIsImRlc2NyaXB0aW9uIikpCnE9cS5xKHIsImxpbmsiKQppZihxPT1udWxs
+KXE9bnVsbAplbHNle289Si5VNihxKQpxPW5ldyBVLk1sKEgueShvLnEocSwiaHJlZiIpKSxILlNjKG8u
+cShxLCJsaW5lIikpLEgueShvLnEocSwicGF0aCIpKSl9Qy5ObS5pKG4sbmV3IFUudUYocCxxKSl9cmV0
+dXJuIG5ldyBVLmQyKG4sVS5qZih0LnEoYSwiZWRpdHMiKSksSC55KHQucShhLCJleHBsYW5hdGlvbiIp
+KSxILlNjKHQucShhLCJsaW5lIikpLEgueSh0LnEoYSwicGF0aCIpKSxVLk5kKHQucShhLCJ0cmFjZXMi
+KSkpfSwKamY6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEKaWYoYT09bnVsbCl0PW51bGwKZWxzZXt0PUgu
+Vk0oW10sdS5mQSkKZm9yKHM9Si5JVCh1LlIuYihhKSk7cy5GKCk7KXtyPXMuZ2woKQpxPUouVTYocikK
+Qy5ObS5pKHQsbmV3IFUuU2UoSC55KHEucShyLCJkZXNjcmlwdGlvbiIpKSxILnkocS5xKHIsImhyZWYi
+KSkpKX19cmV0dXJuIHR9LApOZDpmdW5jdGlvbihhKXt2YXIgdCxzCmlmKGE9PW51bGwpdD1udWxsCmVs
+c2V7dD1ILlZNKFtdLHUuaGgpCmZvcihzPUouSVQodS5SLmIoYSkpO3MuRigpOylDLk5tLmkodCxVLk5m
+KHMuZ2woKSkpfXJldHVybiB0fSwKTmY6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvPSJkZXNjcmlw
+dGlvbiIsbj1KLlU2KGEpLG09SC55KG4ucShhLG8pKSxsPUguVk0oW10sdS5hSikKZm9yKG49Si5JVCh1
+LlIuYihuLnEoYSwiZW50cmllcyIpKSk7bi5GKCk7KXt0PW4uZ2woKQpzPUouVTYodCkKcj1ILnkocy5x
+KHQsbykpCnE9SC55KHMucSh0LCJmdW5jdGlvbiIpKQpzPXMucSh0LCJsaW5rIikKaWYocz09bnVsbClz
+PW51bGwKZWxzZXtwPUouVTYocykKcz1uZXcgVS5NbChILnkocC5xKHMsImhyZWYiKSksSC5TYyhwLnEo
+cywibGluZSIpKSxILnkocC5xKHMsInBhdGgiKSkpfUMuTm0uaShsLG5ldyBVLndiKHIscSxzKSl9cmV0
+dXJuIG5ldyBVLnlEKG0sbCl9LApkMjpmdW5jdGlvbiBkMihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpf
+LmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9Zn0sClNlOmZ1bmN0aW9uIFNlKGEsYil7dGhp
+cy5hPWEKdGhpcy5iPWJ9LAp1RjpmdW5jdGlvbiB1RihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTWw6
+ZnVuY3Rpb24gTWwoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKeUQ6ZnVuY3Rpb24g
+eUQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCndiOmZ1bmN0aW9uIHdiKGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y319LEI9ewpZZjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1ILnkoYS5xKDAs
+InJlZ2lvbnMiKSkscD1ILnkoYS5xKDAsIm5hdmlnYXRpb25Db250ZW50IikpLG89SC55KGEucSgwLCJz
+b3VyY2VDb2RlIikpLG49SC5WTShbXSx1LnUpCmZvcih0PUouSVQodS5SLmIoYS5xKDAsImVkaXRzIikp
+KTt0LkYoKTspe3M9dC5nbCgpCnI9Si5VNihzKQpDLk5tLmkobixuZXcgQi5qOChILlNjKHIucShzLCJs
+aW5lIikpLEgueShyLnEocywiZXhwbGFuYXRpb24iKSksSC5TYyhyLnEocywib2Zmc2V0IikpKSl9cmV0
+dXJuIG5ldyBCLnFwKHEscCxvLG4pfSwKajg6ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMuYT1hCnRoaXMu
+Yj1iCnRoaXMuYz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9
+YgpfLmM9YwpfLmQ9ZH0sCkx1OmZ1bmN0aW9uIEx1KCl7fSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHQKaWYo
+IShhPj02NSYmYTw9OTApKXQ9YT49OTcmJmE8PTEyMgplbHNlIHQ9ITAKcmV0dXJuIHR9LApZdTpmdW5j
+dGlvbihhLGIpe3ZhciB0PWEubGVuZ3RoLHM9YisyCmlmKHQ8cylyZXR1cm4hMQppZighQi5PUyhDLnhC
+Lm0oYSxiKSkpcmV0dXJuITEKaWYoQy54Qi5tKGEsYisxKSE9PTU4KXJldHVybiExCmlmKHQ9PT1zKXJl
+dHVybiEwCnJldHVybiBDLnhCLm0oYSxzKT09PTQ3fX0sVD17R1Y6ZnVuY3Rpb24gR1YoKXt9fSxMPXsK
+SXE6ZnVuY3Rpb24oKXtDLkJaLkIoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLG5ldyBMLmUoKSkK
+Qy5vbC5CKHdpbmRvdywicG9wc3RhdGUiLG5ldyBMLkwoKSl9LAprejpmdW5jdGlvbihhKXt2YXIgdCxz
+PXUuaC5hKGEucGFyZW50Tm9kZSkucXVlcnlTZWxlY3RvcigiOnNjb3BlID4gdWwiKSxyPXMuc3R5bGUs
+cT0iIitDLkNELnpRKHMub2Zmc2V0SGVpZ2h0KSoyKyJweCIKci5tYXhIZWlnaHQ9cQpyPUoucUYoYSkK
+cT1yLiR0aQp0PXEuQygifigxKSIpLmIobmV3IEwuV3gocyxhKSkKdS5NLmIobnVsbCkKVy5KRShyLmEs
+ci5iLHQsITEscS5kKX0sCnlYOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPSJxdWVyeVNlbGVj
+dG9yQWxsIixuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSksbT11LmgKbi50b1N0cmluZwpILkRoKG0s
+bSwiVCIsbykKdD11LlMKcz1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5uYXYtbGluayIpLHQp
+CnMuSyhzLG5ldyBMLkFPKGIpKQpILkRoKG0sbSwiVCIsbykKcj1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0
+b3JBbGwoIi5yZWdpb24iKSx0KQppZihyLmdBKHIpIT09MCl7cT1uLnF1ZXJ5U2VsZWN0b3IoInRhYmxl
+W2RhdGEtcGF0aF0iKQpxLnRvU3RyaW5nCnIuSyhyLG5ldyBMLkhvKHEuZ2V0QXR0cmlidXRlKCJkYXRh
+LSIrbmV3IFcuU3kobmV3IFcuaTcocSkpLk8oInBhdGgiKSkpKX1ILkRoKG0sbSwiVCIsbykKcD1uZXcg
+Vy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5wb3N0LWxpbmsiKSx0KQpwLksocCxuZXcgTC5JQygpKX0s
+CnR5OmZ1bmN0aW9uKGEpe3ZhciB0PXUuTgpyZXR1cm4gVy5xRChhLCJQT1NUIixQLkVGKFsiQ29udGVu
+dC1UeXBlIiwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHQsdCkpLlc3KG5ldyBMLkwx
+KCksdS5yKX0sCmFLOmZ1bmN0aW9uKGEpe3ZhciB0PVAuaEsoYSkuZ2hZKCkucSgwLCJsaW5lIikKcmV0
+dXJuIHQ9PW51bGw/bnVsbDpILkhwKHQsbnVsbCl9LApHNjpmdW5jdGlvbihhKXt2YXIgdD1QLmhLKGEp
+LmdoWSgpLnEoMCwib2Zmc2V0IikKcmV0dXJuIHQ9PW51bGw/bnVsbDpILkhwKHQsbnVsbCl9LAp0Mjpm
+dW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvPXt9LG49by5hPXUuaC5iKFcucWMoYS5jdXJyZW50
+VGFyZ2V0KSkuZ2V0QXR0cmlidXRlKCJocmVmIikKaWYoSi56bChuLCI/Iikpe3Q9Qy54Qi5OaihuLDAs
+Qy54Qi5PWShuLCI/IikpCm8uYT10CnM9dH1lbHNlIHM9bgppZihjIT1udWxsKXtyPSQublUoKQpzPW8u
+YT1yLm81KEQubnIoci50TShjKSxzKSl9cT1MLkc2KG4pCnA9TC5hSyhuKQppZihxIT1udWxsKUwuYWYo
+cyxxLHAsYixuZXcgTC5uVChvLHEscCkpCmVsc2UgTC5hZihzLG51bGwsbnVsbCxiLG5ldyBMLkJaKG8p
+KQphLnByZXZlbnREZWZhdWx0KCl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gTC5RUyh1LlYuYihhKSl9
+LApRUzpmdW5jdGlvbihhKXt2YXIgdD0wLHM9UC5GWCh1LnopLHI9MSxxLHA9W10sbyxuLG0sbCxrLGoK
+dmFyICRhc3luYyR1bT1QLmx6KGZ1bmN0aW9uKGIsYyl7aWYoYj09PTEpe3E9Ywp0PXJ9d2hpbGUodHJ1
+ZSlzd2l0Y2godCl7Y2FzZSAwOms9dS5oLmEoVy5xYyhhLmN1cnJlbnRUYXJnZXQpKS5nZXRBdHRyaWJ1
+dGUoImhyZWYiKQphLnByZXZlbnREZWZhdWx0KCkKbT1kb2N1bWVudAptLmJvZHkuY2xhc3NMaXN0LmFk
+ZCgicmVydW5uaW5nIikKcj0zCnQ9NgpyZXR1cm4gUC5qUShMLnR5KGspLCRhc3luYyR1bSkKY2FzZSA2
+OnUuRi5hKEouR3IoVy51VihtLmRlZmF1bHRWaWV3KSkpLnJlbG9hZCgpCnAucHVzaCg1KQp0PTQKYnJl
+YWsKY2FzZSAzOnI9MgpqPXEKbz1ILlJ1KGopCm49SC50cyhqKQpMLnFKKCJoYW5kbGVQb3N0TGlua0Ns
+aWNrOiAiK0guZChvKSxuKQp3aW5kb3cuYWxlcnQoIkNvdWxkIG5vdCBsb2FkICIrSC5kKGspKyIgKCIr
+SC5kKG8pKyIpLiIpCnAucHVzaCg1KQp0PTQKYnJlYWsKY2FzZSAyOnA9WzFdCmNhc2UgNDpyPTEKbS5i
+b2R5LmNsYXNzTGlzdC5yZW1vdmUoInJlcnVubmluZyIpCnQ9cC5wb3AoKQpicmVhawpjYXNlIDU6cmV0
+dXJuIFAueUMobnVsbCxzKQpjYXNlIDE6cmV0dXJuIFAuZjMocSxzKX19KQpyZXR1cm4gUC5ESSgkYXN5
+bmMkdW0scyl9LAp2VTpmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LHM9dS5oCkguRGgocyxzLCJUIiwi
+cXVlcnlTZWxlY3RvckFsbCIpCnQ9bmV3IFcud3oodC5xdWVyeVNlbGVjdG9yQWxsKCIuY29kZSIpLHUu
+UykKdC5LKHQsbmV3IEwuR0goKSl9LApoWDpmdW5jdGlvbihhLGIpe3ZhciB0PXUuTgpXLnFEKEguZChh
+KSsiP3JlZ2lvbj1yZWdpb24mb2Zmc2V0PSIrSC5kKGIpLG51bGwsUC5FRihbIkNvbnRlbnQtVHlwZSIs
+ImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiXSx0LHQpKS5XNyhuZXcgTC5EVCgpLHUuUCku
+T0EobmV3IEwuZUgoYSkpfSwKRzc6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzCmlmKCFKLnJZKGEp
+LlRjKGEsIi5kYXJ0Iikpe0wuQkUoYSxuZXcgQi5xcCgiIiwiIiwiIixDLnhEKSxkKQpMLkJYKGEsbnVs
+bCkKaWYoZSE9bnVsbCllLiQwKCkKcmV0dXJufXQ9Qy54Qi50ZyhhLCI/Iik/YSsiJmlubGluZT10cnVl
+IjphKyI/aW5saW5lPXRydWUiCnM9dS5OClcucUQodCxudWxsLFAuRUYoWyJDb250ZW50LVR5cGUiLCJh
+cHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04Il0scyxzKSkuVzcobmV3IEwuekQoYSxkLGIsYyxl
+KSx1LlApLk9BKG5ldyBMLk9FKGEpKX0sCkdlOmZ1bmN0aW9uKCl7dmFyIHQ9Ii9fcHJldmlldy9uYXZp
+Z2F0aW9uVHJlZS5qc29uIixzPXUuTgpXLnFEKHQsbnVsbCxQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBw
+bGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHMscykpLlc3KG5ldyBMLlRXKCksdS5QKS5PQShu
+ZXcgTC54cih0KSl9LApxSjpmdW5jdGlvbihhLGIpe3ZhciB0CndpbmRvdwppZih0eXBlb2YgY29uc29s
+ZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUuZXJyb3IoYSkKd2luZG93CnQ9SC5kKGIpCmlmKHR5
+cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS5lcnJvcih0KX0sCnFPOmZ1bmN0
+aW9uKGEpe3ZhciB0PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1DLkNELnpRKCQuZmkoKS5vZmZz
+ZXRIZWlnaHQpLHI9d2luZG93LmlubmVySGVpZ2h0LHE9Qy5DRC56USgkLkRXKCkub2Zmc2V0SGVpZ2h0
+KQppZih0eXBlb2YgciE9PSJudW1iZXIiKXJldHVybiByLkhOKCkKaWYodC5ib3R0b20+ci0ocSsxNCkp
+Si5kaChhKQplbHNlIGlmKHQudG9wPHMrMTQpSi5kaChhKX0sCmZHOmZ1bmN0aW9uKGEsYil7dmFyIHQs
+cyxyCmlmKGEhPW51bGwpe3Q9ZG9jdW1lbnQKcz10LmdldEVsZW1lbnRCeUlkKCJvIitILmQoYSkpCnI9
+dC5xdWVyeVNlbGVjdG9yKCIubGluZS0iK0guZChiKSkKaWYocyE9bnVsbCl7TC5xTyhzKQpKLmRSKHMp
+LmkoMCwidGFyZ2V0Iil9ZWxzZSBpZihyIT1udWxsKUwucU8oci5wYXJlbnRFbGVtZW50KQppZihyIT1u
+dWxsKUouZFIodS5oLmEoci5wYXJlbnROb2RlKSkuaSgwLCJoaWdobGlnaHQiKX1lbHNlIEwucU8oJC5E
+OSgpKX0sCmFmOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyPUwuRzYod2luZG93LmxvY2F0aW9u
+LmhyZWYpLHE9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKaWYociE9bnVsbCl7dD1kb2N1bWVudC5n
+ZXRFbGVtZW50QnlJZCgibyIrSC5kKHIpKQppZih0IT1udWxsKUouZFIodCkuUigwLCJ0YXJnZXQiKX1p
+ZihxIT1udWxsKXtzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5kKHEpKQppZihzIT1u
+dWxsKUouZFIocy5wYXJlbnRFbGVtZW50KS5SKDAsImhpZ2hsaWdodCIpfWlmKGE9PXdpbmRvdy5sb2Nh
+dGlvbi5wYXRobmFtZSl7TC5mRyhiLGMpCmUuJDAoKX1lbHNlIEwuRzcoYSxiLGMsZCxlKX0sCkx4OmZ1
+bmN0aW9uKGEsYil7dmFyIHQKaWYoYT09PTEpdD1iCmVsc2UgdD1iKyJzIgpyZXR1cm4gdH0sClQxOmZ1
+bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG09JC5oTCgpCkoubDUobSwiIikKaWYoYT09bnVsbCl7
+dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIikKdC50ZXh0Q29udGVudD0iU2VlIGRldGFpbHMgYWJv
+dXQgYSBwcm9wb3NlZCBlZGl0LiIKQy5MdC5zRCh0LEguVk0oWyJwbGFjZWhvbGRlciJdLHUucykpCm0u
+YXBwZW5kQ2hpbGQodCkKcmV0dXJufXM9YS5lCnQ9JC5uVSgpCnI9dC50TShzKQpxPWEuYwpwPWRvY3Vt
+ZW50Cm89dC5IUChzLEouVDAocC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSkKbj1h
+LmQKdD1wLmNyZWF0ZUVsZW1lbnQoInAiKQp1LmguYihtLmFwcGVuZENoaWxkKHQpKS5hcHBlbmRDaGls
+ZChwLmNyZWF0ZVRleHROb2RlKEguZChxKSsiIGF0ICIrSC5kKG8pKyI6IitILmQobikrIi4iKSkKTC5D
+QyhhLG0scikKTC5GeihhLG0pCkwuTkcoYSxtLHIpfSwKTEg6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMs
+cixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQ9JC5tUSgpCkoubDUoZCwiIikKdD1kb2N1bWVudApz
+PXQuY3JlYXRlRWxlbWVudCgicCIpCnI9dS5oCnE9ci5iKGQuYXBwZW5kQ2hpbGQocykpCnA9Yi5sZW5n
+dGgKaWYocD09PTApcS5hcHBlbmRDaGlsZCh0LmNyZWF0ZVRleHROb2RlKCJObyBwcm9wb3NlZCBlZGl0
+cyIpKQplbHNlIHEuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZSgiIitwKyIgcHJvcG9zZWQgIitM
+Lkx4KHAsImVkaXQiKSsiOiIpKQpzPXQuY3JlYXRlRWxlbWVudCgidWwiKQpvPXIuYihkLmFwcGVuZENo
+aWxkKHMpKQpmb3IoZD1iLmxlbmd0aCxzPXUuaSxuPXUuUSxtPW4uQygifigxKSIpLGw9dS5NLG49bi5k
+LGs9MDtrPGIubGVuZ3RoO2IubGVuZ3RoPT09ZHx8KDAsSC5saykoYiksKytrKXtqPWJba10KaT10LmNy
+ZWF0ZUVsZW1lbnQoImxpIikKaD1yLmIoby5hcHBlbmRDaGlsZChpKSkKSi5kUihoKS5pKDAsImVkaXQi
+KQppPXQuY3JlYXRlRWxlbWVudCgiYSIpCmc9cy5iKGguYXBwZW5kQ2hpbGQoaSkpCmcuY2xhc3NMaXN0
+LmFkZCgiZWRpdC1saW5rIikKZj1qLmMKaT1ILmQoZikKZy5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcg
+Vy5TeShuZXcgVy5pNyhnKSkuTygib2Zmc2V0IiksaSkKZT1qLmEKaT1ILmQoZSkKZy5zZXRBdHRyaWJ1
+dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhnKSkuTygibGluZSIpLGkpCmcuYXBwZW5kQ2hpbGQo
+dC5jcmVhdGVUZXh0Tm9kZSgibGluZSAiK0guZChlKSkpCmk9bS5iKG5ldyBMLkVFKGYsZSxhKSkKbC5i
+KG51bGwpClcuSkUoZywiY2xpY2siLGksITEsbikKaC5hcHBlbmRDaGlsZCh0LmNyZWF0ZVRleHROb2Rl
+KCI6ICIrSC5kKGouYikpKX1pZihjKUwuVDEobnVsbCl9LApGcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQs
+cyxyLHE9d2luZG93LmxvY2F0aW9uLHA9UC5oSygocSYmQy5FeCkuZ0RyKHEpK0guZChhKSkKcT11LnoK
+dD1QLkZsKHUuTixxKQppZihiIT1udWxsKXQuWSgwLCJvZmZzZXQiLEguZChiKSkKaWYoYyE9bnVsbCl0
+LlkoMCwibGluZSIsSC5kKGMpKQpwPXAubm0oMCx0LmE9PT0wP251bGw6dCkKcz13aW5kb3cuaGlzdG9y
+eQpyPXAudygwKQpzLnRvU3RyaW5nCnMucHVzaFN0YXRlKG5ldyBQLkJmKFtdLFtdKS5QdihQLkZsKHEs
+cSkpLCIiLHIpfSwKRW46ZnVuY3Rpb24oYSl7dmFyIHQ9Si5iYihkb2N1bWVudC5xdWVyeVNlbGVjdG9y
+KCIucm9vdCIpLnRleHRDb250ZW50LCIvIikKaWYoQy54Qi5uKGEsdCkpcmV0dXJuIEMueEIuRyhhLHQu
+bGVuZ3RoKQplbHNlIHJldHVybiBhfSwKQlg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9e30Kci5hPWEK
+YT1MLkVuKGEpCnIuYT1hCiQuRDkoKS50ZXh0Q29udGVudD1hCnQ9ZG9jdW1lbnQKcz11LmgKSC5EaChz
+LHMsIlQiLCJxdWVyeVNlbGVjdG9yQWxsIikKdD1uZXcgVy53eih0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5u
+YXYtcGFuZWwgLm5hdi1saW5rIiksdS5TKQp0LksodCxuZXcgTC5WUyhyKSl9LApCRTpmdW5jdGlvbihh
+LGIsYyl7dmFyIHQ9Ii5yZWdpb25zIixzPWRvY3VtZW50LHI9cy5xdWVyeVNlbGVjdG9yKHQpLHE9cy5x
+dWVyeVNlbGVjdG9yKCIuY29kZSIpCkoudEgocixiLmEsJC5LRygpKQpKLnRIKHEsYi5iLCQuS0coKSkK
+TC5MSChhLGIuZCxjKQpMLnZVKCkKTC55WCgiLmNvZGUiLCEwKQpMLnlYKHQsITApfSwKdFg6ZnVuY3Rp
+b24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGk9ZG9jdW1lbnQsaD1pLmNyZWF0ZUVsZW1l
+bnQoInVsIiksZz11LmgsZj1nLmIoYS5hcHBlbmRDaGlsZChoKSkKZm9yKGg9Yi5sZW5ndGgsdD11Lk0s
+cz0wO3M8Yi5sZW5ndGg7Yi5sZW5ndGg9PT1ofHwoMCxILmxrKShiKSwrK3Mpe3I9YltzXQpxPWkuY3Jl
+YXRlRWxlbWVudCgibGkiKQpwPWcuYihmLmFwcGVuZENoaWxkKHEpKQpxPUouUkUocCkKaWYoci5hPT09
+Qy5ZMil7cS5nRChwKS5pKDAsImRpciIpCnE9aS5jcmVhdGVFbGVtZW50KCJzcGFuIikKbz1nLmIocC5h
+cHBlbmRDaGlsZChxKSkKcT1KLlJFKG8pCnEuZ0QobykuaSgwLCJhcnJvdyIpCnEuc2hmKG8sIiYjeDI1
+QkM7IikKcT1pLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpKLmw1KGcuYihwLmFwcGVuZENoaWxkKHEpKSwi
+JiN4MUY0QzE7IikKcC5hcHBlbmRDaGlsZChpLmNyZWF0ZVRleHROb2RlKHIuYikpCkwudFgocCxyLmMp
+Ckwua3oobyl9ZWxzZXtxLnNoZihwLCImI3gxRjRDNDsiKQpxPWkuY3JlYXRlRWxlbWVudCgiYSIpCm49
+Zy5iKHAuYXBwZW5kQ2hpbGQocSkpCnE9Si5SRShuKQpxLmdEKG4pLmkoMCwibmF2LWxpbmsiKQpuLnNl
+dEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KG4pKS5PKCJuYW1lIiksci5kKQpuLnNl
+dEF0dHJpYnV0ZSgiaHJlZiIsci5lKQpuLmFwcGVuZENoaWxkKGkuY3JlYXRlVGV4dE5vZGUoci5iKSkK
+cT1xLmdWbChuKQptPXEuJHRpCmw9bS5DKCJ+KDEpIikuYihuZXcgTC5URCgpKQp0LmIobnVsbCkKVy5K
+RShxLmEscS5iLGwsITEsbS5kKQprPXIuZgppZih0eXBlb2YgayE9PSJudW1iZXIiKXJldHVybiBrLm9z
+KCkKaWYoaz4wKXtxPWkuY3JlYXRlRWxlbWVudCgic3BhbiIpCmo9Zy5iKHAuYXBwZW5kQ2hpbGQocSkp
+CkouZFIoaikuaSgwLCJlZGl0LWNvdW50IikKcT0iIitrKyIgIgppZihrPT09MSltPSJlZGl0IgplbHNl
+IG09ImVkaXRzIgpqLnNldEF0dHJpYnV0ZSgidGl0bGUiLHErbSkKai5hcHBlbmRDaGlsZChpLmNyZWF0
+ZVRleHROb2RlKEMuam4udyhrKSkpfX19fSwKYzQ6ZnVuY3Rpb24oYSxiKXt2YXIgdD1kb2N1bWVudCxz
+PXQuY3JlYXRlRWxlbWVudCgiYSIpCnUuaS5iKHMpCnMuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9k
+ZShILmQoYS5jKSsiOiIrSC5kKGEuYikpKQp0PUQubnIoYixhLmEpCnMuc2V0QXR0cmlidXRlKCJocmVm
+IiwkLm5VKCkubzUodCkpCnMuY2xhc3NMaXN0LmFkZCgibmF2LWxpbmsiKQpyZXR1cm4gc30sCkZ6OmZ1
+bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpPWEuYgppZihpIT1udWxsKWZvcih0
+PWkubGVuZ3RoLHM9dS5oLHI9dS5zLHE9dS5YLHA9MDtwPGkubGVuZ3RoO2kubGVuZ3RoPT09dHx8KDAs
+SC5saykoaSksKytwKXtvPWlbcF0Kbj1kb2N1bWVudAptPW4uY3JlYXRlRWxlbWVudCgicCIpCmw9cy5i
+KGIuYXBwZW5kQ2hpbGQobSkpCm09bi5jcmVhdGVFbGVtZW50KCJhIikKaz1zLmIobC5hcHBlbmRDaGls
+ZChtKSkKay5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKG8uYSkpCmsuc2V0QXR0cmlidXRlKCJo
+cmVmIixvLmIpCm49cS5iKEguVk0oWyJwb3N0LWxpbmsiLCJiZWZvcmUtYXBwbHkiXSxyKSkKaj1KLmRS
+KGspCmouVjEoMCkKai5GVigwLG4pfX0sCk5HOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8s
+bixtLGw9YS5hCmlmKGwubGVuZ3RoIT09MCl7dD1kb2N1bWVudApzPXQuY3JlYXRlRWxlbWVudCgicCIp
+CnMudGV4dENvbnRlbnQ9IkVkaXQgcmF0aW9uYWxlIChleHBlcmltZW50YWwpOiIKYi5hcHBlbmRDaGls
+ZChzKQpzPXQuY3JlYXRlRWxlbWVudCgidWwiKQpyPXUuaC5iKGIuYXBwZW5kQ2hpbGQocykpCmZvcihz
+PWwubGVuZ3RoLHE9MDtxPGwubGVuZ3RoO2wubGVuZ3RoPT09c3x8KDAsSC5saykobCksKytxKXtwPWxb
+cV0Kbz10LmNyZWF0ZUVsZW1lbnQoImxpIikKbj1yLmFwcGVuZENoaWxkKG8pCm4uYXBwZW5kQ2hpbGQo
+dC5jcmVhdGVUZXh0Tm9kZShwLmEpKQptPXAuYgppZihtIT1udWxsKXtuLmFwcGVuZENoaWxkKHQuY3Jl
+YXRlVGV4dE5vZGUoIiAoIikpCm4uYXBwZW5kQ2hpbGQoTC5jNChtLGMpKQpuLmFwcGVuZENoaWxkKHQu
+Y3JlYXRlVGV4dE5vZGUoIikiKSl9fX19LApDQzpmdW5jdGlvbihhLGIsYTApe3ZhciB0LHMscixxLHAs
+byxuLG0sbCxrLGosaSxoLGcsZixlLGQsYwpmb3IodD1hLmYscz10Lmxlbmd0aCxyPXUucyxxPXUuWCxw
+PTA7cDx0Lmxlbmd0aDt0Lmxlbmd0aD09PXN8fCgwLEgubGspKHQpLCsrcCl7bz10W3BdCm49ZG9jdW1l
+bnQKbT1uLmNyZWF0ZUVsZW1lbnQoInAiKQpsPXEuYihILlZNKFsidHJhY2UiXSxyKSkKaz1KLmRSKG0p
+CmsuVjEoMCkKay5GVigwLGwpCmo9Yi5hcHBlbmRDaGlsZChtKQptPW4uY3JlYXRlRWxlbWVudCgic3Bh
+biIpCmw9cS5iKEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scikpCms9Si5kUihtKQprLlYxKDApCmsu
+RlYoMCxsKQptLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoby5hKSkKai5hcHBlbmRDaGlsZCht
+KQpqLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoIjoiKSkKbT1uLmNyZWF0ZUVsZW1lbnQoInVs
+IikKbD1xLmIoSC5WTShbInRyYWNlIl0scikpCms9Si5kUihtKQprLlYxKDApCmsuRlYoMCxsKQppPWou
+YXBwZW5kQ2hpbGQobSkKZm9yKG09by5iLGw9bS5sZW5ndGgsaD0wO2g8bS5sZW5ndGg7bS5sZW5ndGg9
+PT1sfHwoMCxILmxrKShtKSwrK2gpe2c9bVtoXQpmPW4uY3JlYXRlRWxlbWVudCgibGkiKQpKLmw1KGYs
+IiYjeDI3NEY7ICIpCmU9aS5hcHBlbmRDaGlsZChmKQpmPW4uY3JlYXRlRWxlbWVudCgic3BhbiIpCmQ9
+cS5iKEguVk0oWyJmdW5jdGlvbiJdLHIpKQprPUouZFIoZikKay5WMSgwKQprLkZWKDAsZCkKZD1nLmIK
+aWYoZD09bnVsbClkPSJ1bmtub3duIgpmLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoZCkpCmUu
+YXBwZW5kQ2hpbGQoZikKYz1nLmMKaWYoYyE9bnVsbCl7ZS5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHRO
+b2RlKCIgKCIpKQplLmFwcGVuZENoaWxkKEwuYzQoYyxhMCkpCmUuYXBwZW5kQ2hpbGQobi5jcmVhdGVU
+ZXh0Tm9kZSgiKSIpKX1lLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoIjogIikpCmUuYXBwZW5k
+Q2hpbGQobi5jcmVhdGVUZXh0Tm9kZShnLmEpKX19fSwKZTpmdW5jdGlvbiBlKCl7fSwKVlc6ZnVuY3Rp
+b24gVlcoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKb1o6ZnVuY3Rpb24gb1ooKXt9
+LApqcjpmdW5jdGlvbiBqcigpe30sCnFsOmZ1bmN0aW9uIHFsKCl7fSwKTDpmdW5jdGlvbiBMKCl7fSwK
+V3g6ZnVuY3Rpb24gV3goYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFPOmZ1bmN0aW9uIEFPKGEpe3Ro
+aXMuYT1hfSwKZE46ZnVuY3Rpb24gZE4oYSl7dGhpcy5hPWF9LApIbzpmdW5jdGlvbiBIbyhhKXt0aGlz
+LmE9YX0sCnh6OmZ1bmN0aW9uIHh6KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApJQzpmdW5jdGlvbiBJ
+Qygpe30sCkwxOmZ1bmN0aW9uIEwxKCl7fSwKblQ6ZnVuY3Rpb24gblQoYSxiLGMpe3RoaXMuYT1hCnRo
+aXMuYj1iCnRoaXMuYz1jfSwKQlo6ZnVuY3Rpb24gQlooYSl7dGhpcy5hPWF9LApHSDpmdW5jdGlvbiBH
+SCgpe30sCkRUOmZ1bmN0aW9uIERUKCl7fSwKZUg6ZnVuY3Rpb24gZUgoYSl7dGhpcy5hPWF9LAp6RDpm
+dW5jdGlvbiB6RChhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5l
+PWV9LApPRTpmdW5jdGlvbiBPRShhKXt0aGlzLmE9YX0sClRXOmZ1bmN0aW9uIFRXKCl7fSwKeHI6ZnVu
+Y3Rpb24geHIoYSl7dGhpcy5hPWF9LApFRTpmdW5jdGlvbiBFRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5i
+PWIKdGhpcy5jPWN9LApRTDpmdW5jdGlvbiBRTChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKVlM6ZnVu
+Y3Rpb24gVlMoYSl7dGhpcy5hPWF9LApURDpmdW5jdGlvbiBURCgpe30sClhBOmZ1bmN0aW9uIFhBKCl7
+fSwKbUs6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG49SC5WTShbXSx1LmZoKQpmb3IodD1KLklU
+KHUuUi5iKGEpKTt0LkYoKTspe3M9dC5nbCgpCnI9Si5VNihzKQpxPUwucDIoSC55KHIucShzLCJ0eXBl
+IikpKQpwPUgueShyLnEocywibmFtZSIpKQpvPXIucShzLCJzdWJ0cmVlIikKbz1vPT1udWxsP251bGw6
+TC5tSyhvKQpDLk5tLmkobixuZXcgTC5aWihxLHAsbyxILnkoci5xKHMsInBhdGgiKSksSC55KHIucShz
+LCJocmVmIikpLEguU2Moci5xKHMsImVkaXRDb3VudCIpKSkpfXJldHVybiBufSwKcDI6ZnVuY3Rpb24o
+YSl7c3dpdGNoKGEpe2Nhc2UiZGlyZWN0b3J5IjpyZXR1cm4gQy5ZMgpjYXNlImZpbGUiOnJldHVybiBD
+LnJmCmRlZmF1bHQ6dGhyb3cgSC5iKFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0aW9uIHRyZWUgbm9k
+ZSB0eXBlOiAiK0guZChhKSkpfX0sClpaOmZ1bmN0aW9uIFpaKGEsYixjLGQsZSxmKXt2YXIgXz10aGlz
+Cl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKeTg6ZnVuY3Rpb24geTgoYSl7dGhp
+cy5iPWF9LApJVjpmdW5jdGlvbiBJVihhLGIsYyxkKXt2YXIgXz10aGlzCl8uZD1hCl8uZT1iCl8uZj1j
+Cl8ucj1kfX0sTT17CllGOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4KZm9yKHQ9Yi5sZW5n
+dGgscz0xO3M8dDsrK3Mpe2lmKGJbc109PW51bGx8fGJbcy0xXSE9bnVsbCljb250aW51ZQpmb3IoO3Q+
+PTE7dD1yKXtyPXQtMQppZihiW3JdIT1udWxsKWJyZWFrfXE9bmV3IFAuUm4oIiIpCnA9YSsiKCIKcS5h
+PXAKbz1ILnFDKGIsMCx0LEgudDYoYikuZCkKbj1vLiR0aQpuPXArbmV3IEguQTgobyxuLkMoInFVKGFM
+LkUpIikuYihuZXcgTS5ObygpKSxuLkMoIkE4PGFMLkUscVU+IikpLkgoMCwiLCAiKQpxLmE9bgpxLmE9
+bisoIik6IHBhcnQgIisocy0xKSsiIHdhcyBudWxsLCBidXQgcGFydCAiK3MrIiB3YXMgbm90LiIpCnRo
+cm93IEguYihQLnhZKHEudygwKSkpfX0sCmxJOmZ1bmN0aW9uIGxJKGEpe3RoaXMuYT1hfSwKTWk6ZnVu
+Y3Rpb24gTWkoKXt9LApxNzpmdW5jdGlvbiBxNygpe30sCk5vOmZ1bmN0aW9uIE5vKCl7fX0sWD17CkNM
+OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPWIueFooYSkKYi5oSyhhKQppZihvIT1udWxsKWE9
+Si5LVihhLG8ubGVuZ3RoKQp0PXUucwpzPUguVk0oW10sdCkKcj1ILlZNKFtdLHQpCnQ9YS5sZW5ndGgK
+aWYodCE9PTAmJmIucjQoQy54Qi5XKGEsMCkpKXtpZigwPj10KXJldHVybiBILk9IKGEsMCkKQy5ObS5p
+KHIsYVswXSkKcT0xfWVsc2V7Qy5ObS5pKHIsIiIpCnE9MH1mb3IocD1xO3A8dDsrK3ApaWYoYi5yNChD
+LnhCLlcoYSxwKSkpe0MuTm0uaShzLEMueEIuTmooYSxxLHApKQpDLk5tLmkocixhW3BdKQpxPXArMX1p
+ZihxPHQpe0MuTm0uaShzLEMueEIuRyhhLHEpKQpDLk5tLmkociwiIil9cmV0dXJuIG5ldyBYLldEKGIs
+byxzLHIpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9
+YwpfLmU9ZH0sCnFSOmZ1bmN0aW9uIHFSKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rpb24oYSl7cmV0dXJu
+IG5ldyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhpcy5hPWF9fSxPPXsKUmg6ZnVuY3Rpb24o
+KXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGk9bnVsbAppZihQLnVvKCkuZ0ZpKCkhPT0iZmlsZSIp
+cmV0dXJuICQuRWIoKQp0PVAudW8oKQppZighQy54Qi5UYyh0LmdJaSh0KSwiLyIpKXJldHVybiAkLkVi
+KCkKcz1QLlBpKGksMCwwKQpyPVAuelIoaSwwLDApCnE9UC5PZShpLDAsMCwhMSkKcD1QLmxlKGksMCww
+LGkpCm89UC50RyhpLDAsMCkKbj1QLndCKGkscykKbT1zPT09ImZpbGUiCmlmKHE9PW51bGwpdD1yLmxl
+bmd0aCE9PTB8fG4hPW51bGx8fG0KZWxzZSB0PSExCmlmKHQpcT0iIgp0PXE9PW51bGwKbD0hdAprPVAu
+a2EoImEvYiIsMCwzLGkscyxsKQpqPXMubGVuZ3RoPT09MAppZihqJiZ0JiYhQy54Qi5uKGssIi8iKSlr
+PVAud0Yoaywhanx8bCkKZWxzZSBrPVAueGUoaykKaWYobmV3IFAuRG4ocyxyLHQmJkMueEIubihrLCIv
+LyIpPyIiOnEsbixrLHAsbykudDQoKT09PSJhXFxiIilyZXR1cm4gJC5LaygpCnJldHVybiAkLmJEKCl9
+LAp6TDpmdW5jdGlvbiB6TCgpe319LEU9e09GOmZ1bmN0aW9uIE9GKGEsYixjKXt0aGlzLmQ9YQp0aGlz
+LmU9Ygp0aGlzLmY9Y319LEY9e3J1OmZ1bmN0aW9uIHJ1KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5kPWEK
+Xy5lPWIKXy5mPWMKXy5yPWR9fSxEPXsKUlg6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9UC51bygpCmlmKEou
+Uk0ociwkLkk2KSlyZXR1cm4gJC5GZgokLkk2PXIKaWYoJC5IaygpPT0kLkViKCkpcmV0dXJuICQuRmY9
+ci5aSSgiLiIpLncoMCkKZWxzZXt0PXIudDQoKQpzPXQubGVuZ3RoLTEKcmV0dXJuICQuRmY9cz09PTA/
+dDpDLnhCLk5qKHQsMCxzKX19LApucjpmdW5jdGlvbihhLGIpe3ZhciB0PW51bGwKcmV0dXJuICQublUo
+KS5xNygwLGEsYix0LHQsdCx0LHQsdCl9fQp2YXIgdz1bQyxILEosUCxXLFUsQixULEwsTSxYLE8sRSxG
+LERdCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeSh3KQp2YXIgJD17fQpILmVv
+LnByb3RvdHlwZT17fQpKLnZCLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1i
+fSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKGEpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5z
+dGFuY2Ugb2YgJyIrSC5kKEguTShhKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1Lm8uYihiKQp0aHJv
+dyBILmIoUC5scihhLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9fQpKLnlFLnByb3RvdHlwZT17Cnc6
+ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gYT81MTkw
+MTg6MjE4MTU5fSwKJGlhMjoxfQpKLllFLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7cmV0dXJu
+IG51bGw9PWJ9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1
+cm4gMH0sCmU3OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuU2ooYSx1Lm8uYihiKSl9LAokaWM4OjF9
+CkouTUYucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKdzpmdW5jdGlvbihhKXty
+ZXR1cm4gU3RyaW5nKGEpfSwKJGl2bToxfQpKLmlDLnByb3RvdHlwZT17fQpKLmtkLnByb3RvdHlwZT17
+fQpKLmM1LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9YVskLncoKV0KaWYodD09bnVsbCly
+ZXR1cm4gdGhpcy50KGEpCnJldHVybiJKYXZhU2NyaXB0IGZ1bmN0aW9uIGZvciAiK0guZChKLmoodCkp
+fSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm57ZnVuYzoxLG9wdDpbLCwsLCwsLCwsLCwsLCwsLF19fSwKJGlF
+SDoxfQpKLmpkLnByb3RvdHlwZT17Cmk6ZnVuY3Rpb24oYSxiKXtILnQ2KGEpLmQuYihiKQppZighIWEu
+Zml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiYWRkIikpCmEucHVzaChiKX0sClc0OmZ1bmN0aW9uKGEsYil7
+dmFyIHQKaWYoISFhLmZpeGVkJGxlbmd0aClILnZoKFAuTDQoInJlbW92ZUF0IikpCnQ9YS5sZW5ndGgK
+aWYoYj49dCl0aHJvdyBILmIoUC54KGIsbnVsbCkpCnJldHVybiBhLnNwbGljZShiLDEpWzBdfSwKVUc6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscgpILnQ2KGEpLkMoImNYPDE+IikuYihjKQppZighIWEuZml4
+ZWQkbGVuZ3RoKUgudmgoUC5MNCgiaW5zZXJ0QWxsIikpCnQ9YS5sZW5ndGgKUC53QShiLDAsdCwiaW5k
+ZXgiKQpzPWMubGVuZ3RoCnRoaXMuc0EoYSx0K3MpCnI9YitzCnRoaXMuWVcoYSxyLGEubGVuZ3RoLGEs
+YikKdGhpcy52ZyhhLGIscixjKX0sCm12OmZ1bmN0aW9uKGEpe2lmKCEhYS5maXhlZCRsZW5ndGgpSC52
+aChQLkw0KCJyZW1vdmVMYXN0IikpCmlmKGEubGVuZ3RoPT09MCl0aHJvdyBILmIoSC5IWShhLC0xKSkK
+cmV0dXJuIGEucG9wKCl9LApGVjpmdW5jdGlvbihhLGIpe3ZhciB0CkgudDYoYSkuQygiY1g8MT4iKS5i
+KGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJhZGRBbGwiKSkKZm9yKHQ9Si5JVChiKTt0
+LkYoKTspYS5wdXNoKHQuZ2woKSl9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILnQ2KGEpLkMoIn4o
+MSkiKS5iKGIpCnQ9YS5sZW5ndGgKZm9yKHM9MDtzPHQ7KytzKXtiLiQxKGFbc10pCmlmKGEubGVuZ3Ro
+IT09dCl0aHJvdyBILmIoUC5hNChhKSl9fSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PUgudDYoYSkK
+cmV0dXJuIG5ldyBILkE4KGEsdC5LcShjKS5DKCIxKDIpIikuYihiKSx0LkMoIkA8MT4iKS5LcShjKS5D
+KCJBODwxLDI+IikpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9bmV3IEFycmF5KGEubGVuZ3RoKQpz
+LmZpeGVkJGxlbmd0aD1BcnJheQpmb3IodD0wO3Q8YS5sZW5ndGg7Kyt0KXRoaXMuWShzLHQsSC5kKGFb
+dF0pKQpyZXR1cm4gcy5qb2luKGIpfSwKTjA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyCmQuYihi
+KQpILnQ2KGEpLktxKGQpLkMoIjEoMSwyKSIpLmIoYykKdD1hLmxlbmd0aApmb3Iocz1iLHI9MDtyPHQ7
+KytyKXtzPWMuJDIocyxhW3JdKQppZihhLmxlbmd0aCE9PXQpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVy
+biBzfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpy
+ZXR1cm4gYVtiXX0sCkQ2OmZ1bmN0aW9uKGEsYixjKXtpZihiPDB8fGI+YS5sZW5ndGgpdGhyb3cgSC5i
+KFAuVEUoYiwwLGEubGVuZ3RoLCJzdGFydCIsbnVsbCkpCmlmKGM8Ynx8Yz5hLmxlbmd0aCl0aHJvdyBI
+LmIoUC5URShjLGIsYS5sZW5ndGgsImVuZCIsbnVsbCkpCmlmKGI9PT1jKXJldHVybiBILlZNKFtdLEgu
+dDYoYSkpCnJldHVybiBILlZNKGEuc2xpY2UoYixjKSxILnQ2KGEpKX0sCmdyWjpmdW5jdGlvbihhKXt2
+YXIgdD1hLmxlbmd0aAppZih0PjApcmV0dXJuIGFbdC0xXQp0aHJvdyBILmIoSC5XcCgpKX0sCllXOmZ1
+bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyPUgudDYoYSkKci5DKCJjWDwxPiIpLmIoZCkKaWYoISFh
+LmltbXV0YWJsZSRsaXN0KUgudmgoUC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMsYS5sZW5ndGgpCnQ9
+Yy1iCmlmKHQ9PT0wKXJldHVybgpQLmsxKGUsInNraXBDb3VudCIpCnIuQygiek08MT4iKS5iKGQpCnI9
+Si5VNihkKQppZihlK3Q+ci5nQShkKSl0aHJvdyBILmIoSC5hcigpKQppZihlPGIpZm9yKHM9dC0xO3M+
+PTA7LS1zKWFbYitzXT1yLnEoZCxlK3MpCmVsc2UgZm9yKHM9MDtzPHQ7KytzKWFbYitzXT1yLnEoZCxl
+K3MpfSwKdmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMsZCwwKX0sClZyOmZ1
+bmN0aW9uKGEsYil7dmFyIHQscwpILnQ2KGEpLkMoImEyKDEpIikuYihiKQp0PWEubGVuZ3RoCmZvcihz
+PTA7czx0Oysrcyl7aWYoSC5vVChiLiQxKGFbc10pKSlyZXR1cm4hMAppZihhLmxlbmd0aCE9PXQpdGhy
+b3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgdApmb3IodD0wO3Q8
+YS5sZW5ndGg7Kyt0KWlmKEouUk0oYVt0XSxiKSlyZXR1cm4hMApyZXR1cm4hMX0sCnc6ZnVuY3Rpb24o
+YSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sCmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEoubTEo
+YSxhLmxlbmd0aCxILnQ2KGEpLkMoIm0xPDE+IikpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVR
+KGEpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKc0E6ZnVuY3Rpb24oYSxiKXtpZigh
+IWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgic2V0IGxlbmd0aCIpKQppZihiPDApdGhyb3cgSC5iKFAu
+VEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmEubGVuZ3RoPWJ9LApxOmZ1bmN0aW9uKGEsYil7
+SC5TYyhiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhW2Jd
+fSwKWTpmdW5jdGlvbihhLGIsYyl7SC50NihhKS5kLmIoYykKaWYoISFhLmltbXV0YWJsZSRsaXN0KUgu
+dmgoUC5MNCgiaW5kZXhlZCBzZXQiKSkKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJvdyBILmIoSC5IWShh
+LGIpKQphW2JdPWN9LAokaWNYOjEsCiRpek06MX0KSi5Qby5wcm90b3R5cGU9e30KSi5tMS5wcm90b3R5
+cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7dmFyIHQscz10aGlz
+LHI9cy5hLHE9ci5sZW5ndGgKaWYocy5iIT09cSl0aHJvdyBILmIoSC5sayhyKSkKdD1zLmMKaWYodD49
+cSl7cy5zTShudWxsKQpyZXR1cm4hMX1zLnNNKHJbdF0pOysrcy5jCnJldHVybiEwfSwKc006ZnVuY3Rp
+b24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KSi5xSS5wcm90b3R5cGU9ewp5dTpm
+dW5jdGlvbihhKXt2YXIgdAppZihhPj0tMjE0NzQ4MzY0OCYmYTw9MjE0NzQ4MzY0NylyZXR1cm4gYXww
+CmlmKGlzRmluaXRlKGEpKXt0PWE8MD9NYXRoLmNlaWwoYSk6TWF0aC5mbG9vcihhKQpyZXR1cm4gdCsw
+fXRocm93IEguYihQLkw0KCIiK2ErIi50b0ludCgpIikpfSwKelE6ZnVuY3Rpb24oYSl7aWYoYT4wKXtp
+ZihhIT09MS8wKXJldHVybiBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1hdGgu
+cm91bmQoMC1hKQp0aHJvdyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sCldaOmZ1bmN0aW9uKGEs
+Yil7dmFyIHQscyxyLHEKaWYoYjwyfHxiPjM2KXRocm93IEguYihQLlRFKGIsMiwzNiwicmFkaXgiLG51
+bGwpKQp0PWEudG9TdHJpbmcoYikKaWYoQy54Qi5tKHQsdC5sZW5ndGgtMSkhPT00MSlyZXR1cm4gdApz
+PS9eKFtcZGEtel0rKSg/OlwuKFtcZGEtel0rKSk/XChlXCsoXGQrKVwpJC8uZXhlYyh0KQppZihzPT1u
+dWxsKUgudmgoUC5MNCgiVW5leHBlY3RlZCB0b1N0cmluZyByZXN1bHQ6ICIrdCkpCnI9cy5sZW5ndGgK
+aWYoMT49cilyZXR1cm4gSC5PSChzLDEpCnQ9c1sxXQppZigzPj1yKXJldHVybiBILk9IKHMsMykKcT0r
+c1szXQpyPXNbMl0KaWYociE9bnVsbCl7dCs9cgpxLT1yLmxlbmd0aH1yZXR1cm4gdCtDLnhCLkl4KCIw
+IixxKX0sCnc6ZnVuY3Rpb24oYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiItMC4wIgplbHNlIHJldHVy
+biIiK2F9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD1hfDAKaWYoYT09PXApcmV0dXJuIDUz
+Njg3MDkxMSZwCnQ9TWF0aC5hYnMoYSkKcz1NYXRoLmxvZyh0KS8wLjY5MzE0NzE4MDU1OTk0NTN8MApy
+PU1hdGgucG93KDIscykKcT10PDE/dC9yOnIvdApyZXR1cm4gNTM2ODcwOTExJigocSo5MDA3MTk5MjU0
+NzQwOTkyfDApKyhxKjM1NDIyNDMxODExNzY1MjF8MCkpKjU5OTE5NytzKjEyNTl9LAp6WTpmdW5jdGlv
+bihhLGIpe3ZhciB0PWElYgppZih0PT09MClyZXR1cm4gMAppZih0PjApcmV0dXJuIHQKaWYoYjwwKXJl
+dHVybiB0LWIKZWxzZSByZXR1cm4gdCtifSwKd0c6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihhPjApdD10
+aGlzLnAzKGEsYikKZWxzZXt0PWI+MzE/MzE6Ygp0PWE+PnQ+Pj4wfXJldHVybiB0fSwKYmY6ZnVuY3Rp
+b24oYSxiKXtpZihiPDApdGhyb3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlzLnAzKGEsYil9LApwMzpm
+dW5jdGlvbihhLGIpe3JldHVybiBiPjMxPzA6YT4+PmJ9LAokaUNQOjEsCiRpRks6MX0KSi51ci5wcm90
+b3R5cGU9eyRpS046MX0KSi5WQS5wcm90b3R5cGU9e30KSi5Eci5wcm90b3R5cGU9ewptOmZ1bmN0aW9u
+KGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikpCmlmKGI+PWEubGVuZ3RoKUgudmgoSC5IWShh
+LGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKVzpmdW5jdGlvbihhLGIpe2lmKGI+PWEubGVuZ3Ro
+KXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApkZDpmdW5jdGlvbihh
+LGIpe3JldHVybiBuZXcgSC51bihiLGEsMCl9LApoOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIhPSJz
+dHJpbmciKXRocm93IEguYihQLkwzKGIsbnVsbCxudWxsKSkKcmV0dXJuIGErYn0sClRjOmZ1bmN0aW9u
+KGEsYil7dmFyIHQ9Yi5sZW5ndGgscz1hLmxlbmd0aAppZih0PnMpcmV0dXJuITEKcmV0dXJuIGI9PT10
+aGlzLkcoYSxzLXQpfSwKaTc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscwpjPVAuakIoYixjLGEubGVu
+Z3RoKQp0PWEuc3Vic3RyaW5nKDAsYikKcz1hLnN1YnN0cmluZyhjKQpyZXR1cm4gdCtkK3N9LApRaTpm
+dW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoIUgub2soYykpSC52aChILnRMKGMpKQppZih0eXBlb2YgYyE9
+PSJudW1iZXIiKXJldHVybiBjLkooKQppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYyww
+LGEubGVuZ3RoLG51bGwsbnVsbCkpCnQ9YytiLmxlbmd0aAppZih0PmEubGVuZ3RoKXJldHVybiExCnJl
+dHVybiBiPT09YS5zdWJzdHJpbmcoYyx0KX0sCm46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5RaShh
+LGIsMCl9LApOajpmdW5jdGlvbihhLGIsYyl7aWYoIUgub2soYikpSC52aChILnRMKGIpKQppZihjPT1u
+dWxsKWM9YS5sZW5ndGgKaWYodHlwZW9mIGIhPT0ibnVtYmVyIilyZXR1cm4gYi5KKCkKaWYoYjwwKXRo
+cm93IEguYihQLngoYixudWxsKSkKaWYoYj5jKXRocm93IEguYihQLngoYixudWxsKSkKaWYoYz5hLmxl
+bmd0aCl0aHJvdyBILmIoUC54KGMsbnVsbCkpCnJldHVybiBhLnN1YnN0cmluZyhiLGMpfSwKRzpmdW5j
+dGlvbihhLGIpe3JldHVybiB0aGlzLk5qKGEsYixudWxsKX0sCmhjOmZ1bmN0aW9uKGEpe3JldHVybiBh
+LnRvTG93ZXJDYXNlKCl9LApiUzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLnRyaW0oKSxwPXEubGVu
+Z3RoCmlmKHA9PT0wKXJldHVybiBxCmlmKHRoaXMuVyhxLDApPT09MTMzKXt0PUoubW0ocSwxKQppZih0
+PT09cClyZXR1cm4iIn1lbHNlIHQ9MApzPXAtMQpyPXRoaXMubShxLHMpPT09MTMzP0ouYzEocSxzKTpw
+CmlmKHQ9PT0wJiZyPT09cClyZXR1cm4gcQpyZXR1cm4gcS5zdWJzdHJpbmcodCxyKX0sCkl4OmZ1bmN0
+aW9uKGEsYil7dmFyIHQscwppZigwPj1iKXJldHVybiIiCmlmKGI9PT0xfHxhLmxlbmd0aD09PTApcmV0
+dXJuIGEKaWYoYiE9PWI+Pj4wKXRocm93IEguYihDLkVxKQpmb3IodD1hLHM9IiI7ITA7KXtpZigoYiYx
+KT09PTEpcz10K3MKYj1iPj4+MQppZihiPT09MClicmVhawp0Kz10fXJldHVybiBzfSwKWFU6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0CmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5n
+dGgsbnVsbCxudWxsKSkKdD1hLmluZGV4T2YoYixjKQpyZXR1cm4gdH0sCk9ZOmZ1bmN0aW9uKGEsYil7
+cmV0dXJuIHRoaXMuWFUoYSxiLDApfSwKUGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMKaWYoYz09bnVs
+bCljPWEubGVuZ3RoCmVsc2UgaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsMCxhLmxl
+bmd0aCxudWxsLG51bGwpKQp0PWIubGVuZ3RoCnM9YS5sZW5ndGgKaWYoYyt0PnMpYz1zLXQKcmV0dXJu
+IGEubGFzdEluZGV4T2YoYixjKX0sCmNuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUGsoYSxiLG51
+bGwpfSwKSXM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PWEubGVuZ3RoCmlmKGM+dCl0aHJvdyBILmIoUC5U
+RShjLDAsdCxudWxsLG51bGwpKQpyZXR1cm4gSC5tMihhLGIsYyl9LAp0ZzpmdW5jdGlvbihhLGIpe3Jl
+dHVybiB0aGlzLklzKGEsYiwwKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApnaU86ZnVuY3Rpb24o
+YSl7dmFyIHQscyxyCmZvcih0PWEubGVuZ3RoLHM9MCxyPTA7cjx0Oysrcil7cz01MzY4NzA5MTEmcyth
+LmNoYXJDb2RlQXQocikKcz01MzY4NzA5MTEmcysoKDUyNDI4NyZzKTw8MTApCnNePXM+PjZ9cz01MzY4
+NzA5MTEmcysoKDY3MTA4ODYzJnMpPDwzKQpzXj1zPj4xMQpyZXR1cm4gNTM2ODcwOTExJnMrKCgxNjM4
+MyZzKTw8MTUpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIp
+e0guU2MoYikKaWYoYj49YS5sZW5ndGh8fCExKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhW2Jd
+fSwKJGl2WDoxLAokaXFVOjF9CkgucWoucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
+aXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMueEIubSh0aGlzLmEsSC5TYyhiKSl9
+fQpILmJRLnByb3RvdHlwZT17fQpILmFMLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXt2YXIgdD10
+aGlzCnJldHVybiBuZXcgSC5hNyh0LHQuZ0EodCksSC5MaCh0KS5DKCJhNzxhTC5FPiIpKX0sCkg6ZnVu
+Y3Rpb24oYSxiKXt2YXIgdCxzLHIscT10aGlzLHA9cS5nQShxKQppZihiLmxlbmd0aCE9PTApe2lmKHA9
+PT0wKXJldHVybiIiCnQ9SC5kKHEuRSgwLDApKQppZihwIT09cS5nQShxKSl0aHJvdyBILmIoUC5hNChx
+KSkKZm9yKHM9dCxyPTE7cjxwOysrcil7cz1zK2IrSC5kKHEuRSgwLHIpKQppZihwIT09cS5nQShxKSl0
+aHJvdyBILmIoUC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9ZWxzZXtmb3Iocj0w
+LHM9IiI7cjxwOysrcil7cys9SC5kKHEuRSgwLHIpKQppZihwIT09cS5nQShxKSl0aHJvdyBILmIoUC5h
+NChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fSwKZXY6ZnVuY3Rpb24oYSxiKXtyZXR1
+cm4gdGhpcy5HRygwLEguTGgodGhpcykuQygiYTIoYUwuRSkiKS5iKGIpKX19CkgubkgucHJvdG90eXBl
+PXsKZ1VEOmZ1bmN0aW9uKCl7dmFyIHQ9Si5IbSh0aGlzLmEpLHM9dGhpcy5jCmlmKHM9PW51bGx8fHM+
+dClyZXR1cm4gdApyZXR1cm4gc30sCmdBczpmdW5jdGlvbigpe3ZhciB0PUouSG0odGhpcy5hKSxzPXRo
+aXMuYgppZihzPnQpcmV0dXJuIHQKcmV0dXJuIHN9LApnQTpmdW5jdGlvbihhKXt2YXIgdCxzPUouSG0o
+dGhpcy5hKSxyPXRoaXMuYgppZihyPj1zKXJldHVybiAwCnQ9dGhpcy5jCmlmKHQ9PW51bGx8fHQ+PXMp
+cmV0dXJuIHMtcgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkhOKCkKcmV0dXJuIHQtcn0s
+CkU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMscj1zLmdBcygpK2IKaWYoYj49MCl7dD1zLmdVRCgp
+CmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIEgucFkodCkKdD1yPj10fWVsc2UgdD0hMAppZih0
+KXRocm93IEguYihQLkNmKGIscywiaW5kZXgiLG51bGwsbnVsbCkpCnJldHVybiBKLkdBKHMuYSxyKX19
+CkguYTcucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigp
+e3ZhciB0LHM9dGhpcyxyPXMuYSxxPUouVTYocikscD1xLmdBKHIpCmlmKHMuYiE9PXApdGhyb3cgSC5i
+KFAuYTQocikpCnQ9cy5jCmlmKHQ+PXApe3Muc0kobnVsbCkKcmV0dXJuITF9cy5zSShxLkUocix0KSk7
+KytzLmMKcmV0dXJuITB9LApzSTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlB
+bjoxfQpILkE4LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApF
+OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILlU1LnByb3Rv
+dHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguU08oSi5JVCh0aGlzLmEpLHRoaXMuYix0
+aGlzLiR0aS5DKCJTTzwxPiIpKX19CkguU08ucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciB0LHMK
+Zm9yKHQ9dGhpcy5hLHM9dGhpcy5iO3QuRigpOylpZihILm9UKHMuJDEodC5nbCgpKSkpcmV0dXJuITAK
+cmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19CkguU1UucHJvdG90eXBl
+PXt9CkguUmUucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5MaCh0aGlzKS5DKCJSZS5FIiku
+YihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpKX19
+CkguWEMucHJvdG90eXBlPXt9Ckgud3YucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3ZhciB0PXRo
+aXMuX2hhc2hDb2RlCmlmKHQhPW51bGwpcmV0dXJuIHQKdD01MzY4NzA5MTEmNjY0NTk3KkouaGYodGhp
+cy5hKQp0aGlzLl9oYXNoQ29kZT10CnJldHVybiB0fSwKdzpmdW5jdGlvbihhKXtyZXR1cm4nU3ltYm9s
+KCInK0guZCh0aGlzLmEpKyciKSd9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEK
+cmV0dXJuIGIgaW5zdGFuY2VvZiBILnd2JiZ0aGlzLmE9PWIuYX0sCiRpR0Q6MX0KSC5QRC5wcm90b3R5
+cGU9e30KSC5XVS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKWTpm
+dW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0LmQuYihiKQp0LmNoWzFdLmIoYykKcmV0dXJu
+IEguZGMoKX0sCiRpWjA6MX0KSC5MUC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
+cy5hfSwKeDQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiExCmlmKCJfX3By
+b3RvX18iPT09YSlyZXR1cm4hMQpyZXR1cm4gdGhpcy5iLmhhc093blByb3BlcnR5KGEpfSwKcTpmdW5j
+dGlvbihhLGIpe2lmKCF0aGlzLng0KGIpKXJldHVybiBudWxsCnJldHVybiB0aGlzLnFQKGIpfSwKcVA6
+ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYltILnkoYSldfSwKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
+cixxLHA9SC5MaCh0aGlzKQpwLkMoIn4oMSwyKSIpLmIoYikKdD10aGlzLmMKZm9yKHM9dC5sZW5ndGgs
+cD1wLmNoWzFdLHI9MDtyPHM7KytyKXtxPXRbcl0KYi4kMihxLHAuYih0aGlzLnFQKHEpKSl9fX0KSC5M
+SS5wcm90b3R5cGU9ewpnV2E6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmEKcmV0dXJuIHR9LApnbmQ6ZnVu
+Y3Rpb24oKXt2YXIgdCxzLHIscSxwPXRoaXMKaWYocC5jPT09MSlyZXR1cm4gQy5oVQp0PXAuZApzPXQu
+bGVuZ3RoLXAuZS5sZW5ndGgtcC5mCmlmKHM9PT0wKXJldHVybiBDLmhVCnI9W10KZm9yKHE9MDtxPHM7
+KytxKXtpZihxPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LHEpCnIucHVzaCh0W3FdKX1yZXR1cm4gSi56
+QyhyKX0sCmdWbTpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbyxuLG0sbD10aGlzCmlmKGwuYyE9PTAp
+cmV0dXJuIEMuQ00KdD1sLmUKcz10Lmxlbmd0aApyPWwuZApxPXIubGVuZ3RoLXMtbC5mCmlmKHM9PT0w
+KXJldHVybiBDLkNNCnA9bmV3IEguTjUodS5lbykKZm9yKG89MDtvPHM7KytvKXtpZihvPj10Lmxlbmd0
+aClyZXR1cm4gSC5PSCh0LG8pCm49dFtvXQptPXErbwppZihtPDB8fG0+PXIubGVuZ3RoKXJldHVybiBI
+Lk9IKHIsbSkKcC5ZKDAsbmV3IEgud3YobiksclttXSl9cmV0dXJuIG5ldyBILlBEKHAsdS5nRil9LAok
+aXZROjF9CkguQ2oucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdApILnkoYSkKdD10aGlz
+LmEKdC5iPXQuYisiJCIrSC5kKGEpCkMuTm0uaSh0aGlzLmIsYSkKQy5ObS5pKHRoaXMuYyxiKTsrK3Qu
+YX0sCiRTOjEyfQpILmY5LnByb3RvdHlwZT17CnFTOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLHE9
+bmV3IFJlZ0V4cChyLmEpLmV4ZWMoYSkKaWYocT09bnVsbClyZXR1cm4gbnVsbAp0PU9iamVjdC5jcmVh
+dGUobnVsbCkKcz1yLmIKaWYocyE9PS0xKXQuYXJndW1lbnRzPXFbcysxXQpzPXIuYwppZihzIT09LTEp
+dC5hcmd1bWVudHNFeHByPXFbcysxXQpzPXIuZAppZihzIT09LTEpdC5leHByPXFbcysxXQpzPXIuZQpp
+ZihzIT09LTEpdC5tZXRob2Q9cVtzKzFdCnM9ci5mCmlmKHMhPT0tMSl0LnJlY2VpdmVyPXFbcysxXQpy
+ZXR1cm4gdH19CkguVzAucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmIKaWYodD09
+bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIrSC5kKHRoaXMuYSkKcmV0dXJuIk5vU3VjaE1l
+dGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIit0KyInIG9uIG51bGwifX0KSC5hei5wcm90b3R5
+cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcyxyPSJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9k
+IG5vdCBmb3VuZDogJyIscT1zLmIKaWYocT09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIr
+SC5kKHMuYSkKdD1zLmMKaWYodD09bnVsbClyZXR1cm4gcitxKyInICgiK0guZChzLmEpKyIpIgpyZXR1
+cm4gcitxKyInIG9uICciK3QrIicgKCIrSC5kKHMuYSkrIikifX0KSC52Vi5wcm90b3R5cGU9ewp3OmZ1
+bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5sZW5ndGg9PT0wPyJFcnJvciI6IkVycm9yOiAi
+K3R9fQpILmJxLnByb3RvdHlwZT17fQpILkFtLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe2lmKHUu
+YlUuYyhhKSlpZihhLiR0aHJvd25Kc0Vycm9yPT1udWxsKWEuJHRocm93bkpzRXJyb3I9dGhpcy5hCnJl
+dHVybiBhfSwKJFM6NH0KSC5YTy5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5i
+CmlmKHMhPW51bGwpcmV0dXJuIHMKcz10aGlzLmEKdD1zIT09bnVsbCYmdHlwZW9mIHM9PT0ib2JqZWN0
+Ij9zLnN0YWNrOm51bGwKcmV0dXJuIHRoaXMuYj10PT1udWxsPyIiOnR9LAokaUd6OjF9CkguVHAucHJv
+dG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmNvbnN0cnVjdG9yLHM9dD09bnVsbD9udWxs
+OnQubmFtZQpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHM9PW51bGw/InVua25vd24iOnMpKyInIn0sCiRp
+RUg6MSwKZ1FsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LAokQzoiJDEiLAokUjoxLAokRDpudWxsfQpI
+LmxjLnByb3RvdHlwZT17fQpILnp4LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy4k
+c3RhdGljX25hbWUKaWYodD09bnVsbClyZXR1cm4iQ2xvc3VyZSBvZiB1bmtub3duIHN0YXRpYyBtZXRo
+b2QiCnJldHVybiJDbG9zdXJlICciK0guTlEodCkrIicifX0KSC5yVC5wcm90b3R5cGU9ewpETjpmdW5j
+dGlvbihhLGIpe3ZhciB0PXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZih0PT09YilyZXR1cm4hMApp
+ZighKGIgaW5zdGFuY2VvZiBILnJUKSlyZXR1cm4hMQpyZXR1cm4gdC5hPT09Yi5hJiZ0LmI9PT1iLmIm
+JnQuYz09PWIuY30sCmdpTzpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuYwppZihzPT1udWxsKXQ9SC5l
+USh0aGlzLmEpCmVsc2UgdD10eXBlb2YgcyE9PSJvYmplY3QiP0ouaGYocyk6SC5lUShzKQpyZXR1cm4o
+dF5ILmVRKHRoaXMuYikpPj4+MH0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCmlmKHQ9PW51bGwp
+dD10aGlzLmEKcmV0dXJuIkNsb3N1cmUgJyIrSC5kKHRoaXMuZCkrIicgb2YgIisoIkluc3RhbmNlIG9m
+ICciK0guZChILk0odCkpKyInIil9fQpILkVxLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJu
+IlJ1bnRpbWVFcnJvcjogIitILmQodGhpcy5hKX19Ckgua1kucHJvdG90eXBlPXsKdzpmdW5jdGlvbihh
+KXtyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLnAodGhpcy5hKX19CkguTjUucHJvdG90eXBlPXsK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCmdWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBILmk1
+KHRoaXMsSC5MaCh0aGlzKS5DKCJpNTwxPiIpKX0sCng0OmZ1bmN0aW9uKGEpe3ZhciB0LHMKaWYodHlw
+ZW9mIGE9PSJzdHJpbmciKXt0PXRoaXMuYgppZih0PT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLlh1
+KHQsYSl9ZWxzZXtzPXRoaXMuQ1goYSkKcmV0dXJuIHN9fSwKQ1g6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhp
+cy5kCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMuRmgodGhpcy5CdCh0LEouaGYoYSkmMHgz
+ZmZmZmZmKSxhKT49MH0sCnE6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1udWxsCmlm
+KHR5cGVvZiBiPT0ic3RyaW5nIil7dD1wLmIKaWYodD09bnVsbClyZXR1cm4gbwpzPXAuajIodCxiKQpy
+PXM9PW51bGw/bzpzLmIKcmV0dXJuIHJ9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2Zm
+ZmZmZik9PT1iKXtxPXAuYwppZihxPT1udWxsKXJldHVybiBvCnM9cC5qMihxLGIpCnI9cz09bnVsbD9v
+OnMuYgpyZXR1cm4gcn1lbHNlIHJldHVybiBwLmFhKGIpfSwKYWE6ZnVuY3Rpb24oYSl7dmFyIHQscyxy
+PXRoaXMuZAppZihyPT1udWxsKXJldHVybiBudWxsCnQ9dGhpcy5CdChyLEouaGYoYSkmMHgzZmZmZmZm
+KQpzPXRoaXMuRmgodCxhKQppZihzPDApcmV0dXJuIG51bGwKcmV0dXJuIHRbc10uYn0sClk6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuPXRoaXMsbT1ILkxoKG4pCm0uZC5iKGIpCm0uY2hbMV0u
+YihjKQppZih0eXBlb2YgYj09InN0cmluZyIpe3Q9bi5iCm4uRUgodD09bnVsbD9uLmI9bi56SygpOnQs
+YixjKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3M9bi5jCm4u
+RUgocz09bnVsbD9uLmM9bi56SygpOnMsYixjKX1lbHNle3I9bi5kCmlmKHI9PW51bGwpcj1uLmQ9bi56
+SygpCnE9Si5oZihiKSYweDNmZmZmZmYKcD1uLkJ0KHIscSkKaWYocD09bnVsbCluLkVJKHIscSxbbi5I
+bihiLGMpXSkKZWxzZXtvPW4uRmgocCxiKQppZihvPj0wKXBbb10uYj1jCmVsc2UgcC5wdXNoKG4uSG4o
+YixjKSl9fX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9dGhpcwpILkxoKHIpLkMoIn4oMSwyKSIp
+LmIoYikKdD1yLmUKcz1yLnIKZm9yKDt0IT1udWxsOyl7Yi4kMih0LmEsdC5iKQppZihzIT09ci5yKXRo
+cm93IEguYihQLmE0KHIpKQp0PXQuY319LApFSDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz10aGlzLHI9
+SC5MaChzKQpyLmQuYihiKQpyLmNoWzFdLmIoYykKdD1zLmoyKGEsYikKaWYodD09bnVsbClzLkVJKGEs
+YixzLkhuKGIsYykpCmVsc2UgdC5iPWN9LAprczpmdW5jdGlvbigpe3RoaXMucj10aGlzLnIrMSY2NzEw
+ODg2M30sCkhuOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLHI9SC5MaChzKSxxPW5ldyBILmRiKHIu
+ZC5iKGEpLHIuY2hbMV0uYihiKSkKaWYocy5lPT1udWxsKXMuZT1zLmY9cQplbHNle3Q9cy5mCnEuZD10
+CnMuZj10LmM9cX0rK3MuYQpzLmtzKCkKcmV0dXJuIHF9LApGaDpmdW5jdGlvbihhLGIpe3ZhciB0LHMK
+aWYoYT09bnVsbClyZXR1cm4tMQp0PWEubGVuZ3RoCmZvcihzPTA7czx0OysrcylpZihKLlJNKGFbc10u
+YSxiKSlyZXR1cm4gcwpyZXR1cm4tMX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAubk8odGhpcyl9LApq
+MjpmdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfSwKQnQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVtiXX0s
+CkVJOmZ1bmN0aW9uKGEsYixjKXthW2JdPWN9LApybjpmdW5jdGlvbihhLGIpe2RlbGV0ZSBhW2JdfSwK
+WHU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5qMihhLGIpIT1udWxsfSwKeks6ZnVuY3Rpb24oKXt2
+YXIgdD0iPG5vbi1pZGVudGlmaWVyLWtleT4iLHM9T2JqZWN0LmNyZWF0ZShudWxsKQp0aGlzLkVJKHMs
+dCxzKQp0aGlzLnJuKHMsdCkKcmV0dXJuIHN9LAokaUZvOjF9CkguZGIucHJvdG90eXBlPXt9CkguaTUu
+cHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5hfSwKZ2t6OmZ1bmN0aW9uKGEp
+e3ZhciB0PXRoaXMuYSxzPW5ldyBILk42KHQsdC5yLHRoaXMuJHRpLkMoIk42PDE+IikpCnMuYz10LmUK
+cmV0dXJuIHN9fQpILk42LnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6
+ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5hCmlmKHQuYiE9PXMucil0aHJvdyBILmIoUC5hNChzKSkK
+ZWxzZXtzPXQuYwppZihzPT1udWxsKXt0LnNxWShudWxsKQpyZXR1cm4hMX1lbHNle3Quc3FZKHMuYSkK
+dC5jPXQuYy5jCnJldHVybiEwfX19LApzcVk6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihh
+KX0sCiRpQW46MX0KSC5kQy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hKGEp
+fSwKJFM6NH0KSC53Ti5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEoYSxi
+KX0sCiRTOjM4fQpILlZYLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoSC55
+KGEpKX0sCiRTOjQwfQpILlZSLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlZ0V4cC8i
+K3RoaXMuYSsiLyIrdGhpcy5iLmZsYWdzfSwKZ0hjOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxzPXQuYwpp
+ZihzIT1udWxsKXJldHVybiBzCnM9dC5iCnJldHVybiB0LmM9SC52NCh0LmEscy5tdWx0aWxpbmUsIXMu
+aWdub3JlQ2FzZSxzLnVuaWNvZGUscy5kb3RBbGwsITApfSwKZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+bmV3IEguS1codGhpcyxiLDApfSwKVVo6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMuZ0hjKCkKcy5s
+YXN0SW5kZXg9Ygp0PXMuZXhlYyhhKQppZih0PT1udWxsKXJldHVybiBudWxsCnJldHVybiBuZXcgSC5F
+Syh0KX0sCiRpdlg6MSwKJGl3TDoxfQpILkVLLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXt2YXIg
+dApILlNjKGIpCnQ9dGhpcy5iCmlmKGI+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsYikKcmV0dXJuIHRb
+Yl19LAokaU9kOjEsCiRpaWI6MX0KSC5LVy5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7cmV0dXJu
+IG5ldyBILlBiKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX19CkguUGIucHJvdG90eXBlPXsKZ2w6ZnVuY3Rp
+b24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcyxvPXAuYgpp
+ZihvPT1udWxsKXJldHVybiExCnQ9cC5jCmlmKHQ8PW8ubGVuZ3RoKXtzPXAuYQpyPXMuVVoobyx0KQpp
+ZihyIT1udWxsKXtwLmQ9cgpvPXIuYgp0PW8uaW5kZXgKcT10K29bMF0ubGVuZ3RoCmlmKHQ9PT1xKXtp
+ZihzLmIudW5pY29kZSl7bz1wLmMKdD1vKzEKcz1wLmIKaWYodDxzLmxlbmd0aCl7bz1KLnJZKHMpLm0o
+cyxvKQppZihvPj01NTI5NiYmbzw9NTYzMTkpe289Qy54Qi5tKHMsdCkKbz1vPj01NjMyMCYmbzw9NTcz
+NDN9ZWxzZSBvPSExfWVsc2Ugbz0hMX1lbHNlIG89ITEKcT0obz9xKzE6cSkrMX1wLmM9cQpyZXR1cm4h
+MH19cC5iPXAuZD1udWxsCnJldHVybiExfSwKJGlBbjoxfQpILnRRLnByb3RvdHlwZT17CnE6ZnVuY3Rp
+b24oYSxiKXtILlNjKGIpCmlmKGIhPT0wKUgudmgoUC54KGIsbnVsbCkpCnJldHVybiB0aGlzLmN9LAok
+aU9kOjF9CkgudW4ucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5TZCh0aGlz
+LmEsdGhpcy5iLHRoaXMuYyl9fQpILlNkLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9
+dGhpcyxxPXIuYyxwPXIuYixvPXAubGVuZ3RoLG49ci5hLG09bi5sZW5ndGgKaWYocStvPm0pe3IuZD1u
+dWxsCnJldHVybiExfXQ9bi5pbmRleE9mKHAscSkKaWYodDwwKXtyLmM9bSsxCnIuZD1udWxsCnJldHVy
+biExfXM9dCtvCnIuZD1uZXcgSC50USh0LHApCnIuYz1zPT09ci5jP3MrMTpzCnJldHVybiEwfSwKZ2w6
+ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKJGlBbjoxfQpILkVULnByb3RvdHlwZT17JGlFVDoxLCRp
+QVM6MX0KSC5iMC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LAokaVhq
+OjF9CkguRGcucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5n
+dGgpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC5JZyhjKQpILm9kKGIsYSxhLmxlbmd0
+aCkKYVtiXT1jfSwKJGljWDoxLAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIs
+Yyl7SC5TYyhjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGljWDoxLAokaXpNOjF9CkgueGou
+cHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVy
+biBhW2JdfX0KSC5kRS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQpILm9kKGIsYSxh
+Lmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlpBLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNj
+KGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19Ckgud2YucHJvdG90eXBlPXsKcTpmdW5j
+dGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5QcS5wcm90
b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFb
-Yl19fQpILlpBLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixhLGEubGVu
-Z3RoKQpyZXR1cm4gYVtiXX19Ckgud2YucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikK
-SC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5QcS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9u
-KGEsYil7SC5TYyhiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmVFLnByb3RvdHlw
-ZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIp
-Ckgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguVjYucHJvdG90eXBlPXsKZ0E6ZnVuY3Rp
-b24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5s
-ZW5ndGgpCnJldHVybiBhW2JdfSwKJGlWNjoxLAokaW42OjF9CkguUkcucHJvdG90eXBlPXt9CkguVlAu
-cHJvdG90eXBlPXt9CkguV0IucHJvdG90eXBlPXt9CkguWkcucHJvdG90eXBlPXt9CkguSmMucHJvdG90
-eXBlPXsKQzpmdW5jdGlvbihhKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfSwKS3E6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEgudjUodi50eXBlVW5pdmVyc2UsdGhpcyxhKX19CkguRy5wcm90b3R5
-cGU9e30KSC51OS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9fQpILmh6LnBy
-b3RvdHlwZT17fQpILmlNLnByb3RvdHlwZT17fQpQLnRoLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e3ZhciB0PXRoaXMuYSxzPXQuYQp0LmE9bnVsbApzLiQwKCl9LAokUzoxMn0KUC5oYS5wcm90b3R5cGU9
-ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzCnRoaXMuYS5hPXUuTS5iKGEpCnQ9dGhpcy5iCnM9dGhpcy5j
-CnQuZmlyc3RDaGlsZD90LnJlbW92ZUNoaWxkKHMpOnQuYXBwZW5kQ2hpbGQocyl9LAokUzoyMH0KUC5W
-cy5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS4kMCgpfSwKJEM6IiQwIiwKJFI6MCwKJFM6
-MH0KUC5GdC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS4kMCgpfSwKJEM6IiQwIiwKJFI6
-MCwKJFM6MH0KUC5XMy5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihhLGIpe2lmKHNlbGYuc2V0VGltZW91
-dCE9bnVsbClzZWxmLnNldFRpbWVvdXQoSC50UihuZXcgUC55SCh0aGlzLGIpLDApLGEpCmVsc2UgdGhy
-b3cgSC5iKFAuTDQoImBzZXRUaW1lb3V0KClgIG5vdCBmb3VuZC4iKSl9fQpQLnlILnByb3RvdHlwZT17
-CiQwOmZ1bmN0aW9uKCl7dGhpcy5iLiQwKCl9LAokQzoiJDAiLAokUjowLAokUzoyfQpQLmloLnByb3Rv
-dHlwZT17CmFNOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRoaXMuJHRpCnIuQygiMS8iKS5iKGIpCnQ9
-IXRoaXMuYnx8ci5DKCJiODwxPiIpLmMoYikKcz10aGlzLmEKaWYodClzLlhmKGIpCmVsc2Ugcy5YMihy
-LmQuYihiKSl9LAp3MDpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYQppZih0aGlzLmIpdC5aTChhLGIp
-CmVsc2UgdC5OayhhLGIpfX0KUC5XTS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5hLiQyKDAsYSl9LAokUzo0N30KUC5TWC5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMu
-YS4kMigxLG5ldyBILmJxKGEsdS5sLmIoYikpKX0sCiRDOiIkMiIsCiRSOjIsCiRTOjIxfQpQLkdzLnBy
-b3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hKEguU2MoYSksYil9LAokUzoyNn0KUC5QZi5w
-cm90b3R5cGU9ewp3MDpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGE9PW51bGwpYT1uZXcgUC5uKCkKdD10
-aGlzLmEKaWYodC5hIT09MCl0aHJvdyBILmIoUC5QVigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikp
-CnQuTmsoYSxiKX0sCnBtOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLncwKGEsbnVsbCl9fQpQLlpmLnBy
-b3RvdHlwZT17CmFNOmZ1bmN0aW9uKGEsYil7dmFyIHQKdGhpcy4kdGkuQygiMS8iKS5iKGIpCnQ9dGhp
-cy5hCmlmKHQuYSE9PTApdGhyb3cgSC5iKFAuUFYoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpKQp0
-LlhmKGIpfX0KUC5GZS5wcm90b3R5cGU9ewpIUjpmdW5jdGlvbihhKXtpZigodGhpcy5jJjE1KSE9PTYp
-cmV0dXJuITAKcmV0dXJuIHRoaXMuYi5iLmJ2KHUuYWwuYih0aGlzLmQpLGEuYSx1LmNKLHUuSyl9LApL
-dzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmUscz11Lnoscj11LksscT10aGlzLiR0aS5DKCIyLyIpLHA9
-dGhpcy5iLmIKaWYodS5XLmModCkpcmV0dXJuIHEuYihwLnJwKHQsYS5hLGEuYixzLHIsdS5sKSkKZWxz
-ZSByZXR1cm4gcS5iKHAuYnYodS55LmIodCksYS5hLHMscikpfX0KUC52cy5wcm90b3R5cGU9ewpTcTpm
-dW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9dGhpcy4kdGkKcS5LcShjKS5DKCIxLygyKSIpLmIoYSkK
-dD0kLlgzCmlmKHQhPT1DLk5VKXtjLkMoIkA8MC8+IikuS3EocS5kKS5DKCIxKDIpIikuYihhKQppZihi
-IT1udWxsKWI9UC5WSChiLHQpfXM9bmV3IFAudnMoJC5YMyxjLkMoInZzPDA+IikpCnI9Yj09bnVsbD8x
-OjMKdGhpcy54ZihuZXcgUC5GZShzLHIsYSxiLHEuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkp
-CnJldHVybiBzfSwKVzc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5TcShhLG51bGwsYil9LApRZDpm
-dW5jdGlvbihhLGIsYyl7dmFyIHQscz10aGlzLiR0aQpzLktxKGMpLkMoIjEvKDIpIikuYihhKQp0PW5l
-dyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQp0aGlzLnhmKG5ldyBQLkZlKHQsKGI9PW51bGw/MTozKXwx
-NixhLGIscy5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0dXJuIHR9LApPQTpmdW5jdGlv
-bihhKXt2YXIgdCxzLHIKdS5iZi5iKG51bGwpCnQ9dGhpcy4kdGkKcz0kLlgzCnI9bmV3IFAudnMocyx0
-KQppZihzIT09Qy5OVSlhPVAuVkgoYSxzKQp0aGlzLnhmKG5ldyBQLkZlKHIsMixudWxsLGEsdC5DKCJA
-PDE+IikuS3EodC5kKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gcn0sCnhmOmZ1bmN0aW9uKGEpe3ZhciB0
-LHM9dGhpcyxyPXMuYQppZihyPD0xKXthLmE9dS54LmIocy5jKQpzLmM9YX1lbHNle2lmKHI9PT0yKXt0
-PXUuXy5iKHMuYykKcj10LmEKaWYocjw0KXt0LnhmKGEpCnJldHVybn1zLmE9cgpzLmM9dC5jfVAuVGso
-bnVsbCxudWxsLHMuYix1Lk0uYihuZXcgUC5kYShzLGEpKSl9fSwKalE6ZnVuY3Rpb24oYSl7dmFyIHQs
-cyxyLHEscCxvPXRoaXMsbj17fQpuLmE9YQppZihhPT1udWxsKXJldHVybgp0PW8uYQppZih0PD0xKXtz
-PXUueC5iKG8uYykKcj1vLmM9YQppZihzIT1udWxsKXtmb3IoO3E9ci5hLHEhPW51bGw7cj1xKTtyLmE9
-c319ZWxzZXtpZih0PT09Mil7cD11Ll8uYihvLmMpCnQ9cC5hCmlmKHQ8NCl7cC5qUShhKQpyZXR1cm59
-by5hPXQKby5jPXAuY31uLmE9by5OOChhKQpQLlRrKG51bGwsbnVsbCxvLmIsdS5NLmIobmV3IFAub1Eo
-bixvKSkpfX0sCmFoOmZ1bmN0aW9uKCl7dmFyIHQ9dS54LmIodGhpcy5jKQp0aGlzLmM9bnVsbApyZXR1
-cm4gdGhpcy5OOCh0KX0sCk44OmZ1bmN0aW9uKGEpe3ZhciB0LHMscgpmb3IodD1hLHM9bnVsbDt0IT1u
-dWxsO3M9dCx0PXIpe3I9dC5hCnQuYT1zfXJldHVybiBzfSwKSEg6ZnVuY3Rpb24oYSl7dmFyIHQscz10
-aGlzLHI9cy4kdGkKci5DKCIxLyIpLmIoYSkKaWYoci5DKCJiODwxPiIpLmMoYSkpaWYoci5jKGEpKVAu
-QTkoYSxzKQplbHNlIFAuazMoYSxzKQplbHNle3Q9cy5haCgpCnIuZC5iKGEpCnMuYT00CnMuYz1hClAu
-SFoocyx0KX19LApYMjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMKcy4kdGkuZC5iKGEpCnQ9cy5haCgp
-CnMuYT00CnMuYz1hClAuSFoocyx0KX0sClpMOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzCnUubC5i
-KGIpCnQ9cy5haCgpCnMuYT04CnMuYz1uZXcgUC5DdyhhLGIpClAuSFoocyx0KX0sClhmOmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMoIjEvIikuYihhKQppZihzLkMoImI4PDE+IikuYyhhKSl7
-dC5jVShhKQpyZXR1cm59dC5hPTEKUC5UayhudWxsLG51bGwsdC5iLHUuTS5iKG5ldyBQLnJIKHQsYSkp
-KX0sCmNVOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMoImI4PDE+IikuYihhKQppZihz
-LmMoYSkpe2lmKGEuYT09PTgpe3QuYT0xClAuVGsobnVsbCxudWxsLHQuYix1Lk0uYihuZXcgUC5LRih0
-LGEpKSl9ZWxzZSBQLkE5KGEsdCkKcmV0dXJufVAuazMoYSx0KX0sCk5rOmZ1bmN0aW9uKGEsYil7dGhp
-cy5hPTEKUC5UayhudWxsLG51bGwsdGhpcy5iLHUuTS5iKG5ldyBQLlpMKHRoaXMsYSxiKSkpfSwKJGli
-ODoxfQpQLmRhLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5IWih0aGlzLmEsdGhpcy5iKX0sCiRT
-OjB9ClAub1EucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkhaKHRoaXMuYix0aGlzLmEuYSl9LAok
-UzowfQpQLnBWLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQp0LmE9MAp0LkhI
-KGEpfSwKJFM6MTJ9ClAuVTcucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt1LmwuYihiKQp0aGlz
-LmEuWkwoYSxiKX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiQyKGEsbnVsbCl9LAokQzoiJDIi
-LAokRDpmdW5jdGlvbigpe3JldHVybltudWxsXX0sCiRTOjMwfQpQLnZyLnByb3RvdHlwZT17CiQwOmZ1
-bmN0aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KUC5ySC5wcm90b3R5cGU9ewok
-MDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYQp0LlgyKHQuJHRpLmQuYih0aGlzLmIpKX0sCiRTOjB9ClAu
-S0YucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkE5KHRoaXMuYix0aGlzLmEpfSwKJFM6MH0KUC5a
-TC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9
-ClAuUlQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbj10aGlzLG09bnVs
-bAp0cnl7cj1uLmMKbT1yLmIuYi56eih1LmZPLmIoci5kKSx1LnopfWNhdGNoKHEpe3Q9SC5SdShxKQpz
-PUgudHMocSkKaWYobi5kKXtyPXUubi5iKG4uYS5hLmMpLmEKcD10CnA9cj09bnVsbD9wPT1udWxsOnI9
-PT1wCnI9cH1lbHNlIHI9ITEKcD1uLmIKaWYocilwLmI9dS5uLmIobi5hLmEuYykKZWxzZSBwLmI9bmV3
-IFAuQ3codCxzKQpwLmE9ITAKcmV0dXJufWlmKHUuYy5jKG0pKXtpZihtIGluc3RhbmNlb2YgUC52cyYm
-bS5hPj00KXtpZihtLmE9PT04KXtyPW4uYgpyLmI9dS5uLmIobS5jKQpyLmE9ITB9cmV0dXJufW89bi5h
-LmEKcj1uLmIKci5iPW0uVzcobmV3IFAualoobyksdS56KQpyLmE9ITF9fSwKJFM6Mn0KUC5qWi5wcm90
-b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKJFM6MzN9ClAucnEucHJvdG90eXBl
-PXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMKdHJ5e3I9bS5iCnE9ci4kdGkK
-cD1xLmQKbz1wLmIobS5jKQptLmEuYj1yLmIuYi5idihxLkMoIjIvKDEpIikuYihyLmQpLG8scS5DKCIy
-LyIpLHApfWNhdGNoKG4pe3Q9SC5SdShuKQpzPUgudHMobikKcj1tLmEKci5iPW5ldyBQLkN3KHQscykK
-ci5hPSEwfX0sCiRTOjJ9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxw
-LG8sbixtLGw9dGhpcwp0cnl7dD11Lm4uYihsLmEuYS5jKQpxPWwuYwppZihILm9UKHEuSFIodCkpJiZx
-LmUhPW51bGwpe3A9bC5iCnAuYj1xLkt3KHQpCnAuYT0hMX19Y2F0Y2gobyl7cz1ILlJ1KG8pCnI9SC50
-cyhvKQpxPXUubi5iKGwuYS5hLmMpCnA9cS5hCm49cwptPWwuYgppZihwPT1udWxsP249PW51bGw6cD09
-PW4pbS5iPXEKZWxzZSBtLmI9bmV3IFAuQ3cocyxyKQptLmE9ITB9fSwKJFM6Mn0KUC5PTS5wcm90b3R5
-cGU9e30KUC5xaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIgdCxzLHI9dGhpcyxxPXt9LHA9
-bmV3IFAudnMoJC5YMyx1LmZKKQpxLmE9MAp0PUguTGgocikKcz10LkMoIn4oMSkiKS5iKG5ldyBQLkI1
-KHEscikpCnUuTS5iKG5ldyBQLlBJKHEscCkpClcuSkUoci5hLHIuYixzLCExLHQuZCkKcmV0dXJuIHB9
-fQpQLkI1LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgodGhpcy5iKS5kLmIoYSk7Kyt0aGlz
-LmEuYX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5iKS5DKCJjOCgxKSIpfX0KUC5QSS5w
-cm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi5ISCh0aGlzLmEuYSl9LAokUzowfQpQLk1PLnBy
-b3RvdHlwZT17fQpQLmtULnByb3RvdHlwZT17fQpQLnhJLnByb3RvdHlwZT17fQpQLkN3LnByb3RvdHlw
-ZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLmEpfSwKJGlYUzoxfQpQLm0wLnByb3RvdHlw
-ZT17JGlKQjoxfQpQLnBLLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHQscz10aGlzLmEscj1z
-LmEKcz1yPT1udWxsP3MuYT1uZXcgUC5uKCk6cgpyPXRoaXMuYgppZihyPT1udWxsKXRocm93IEguYihz
-KQp0PUguYihzKQp0LnN0YWNrPXIudygwKQp0aHJvdyB0fSwKJFM6MH0KUC5KaS5wcm90b3R5cGU9ewpi
-SDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1udWxsCnUuTS5iKGEpCnRyeXtpZihDLk5VPT09JC5YMyl7
-YS4kMCgpCnJldHVybn1QLlQ4KHEscSx0aGlzLGEsdS5IKX1jYXRjaChyKXt0PUguUnUocikKcz1ILnRz
-KHIpClAuTDIocSxxLHRoaXMsdCx1LmwuYihzKSl9fSwKRGw6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMs
-cixxPW51bGwKYy5DKCJ+KDApIikuYihhKQpjLmIoYikKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQxKGIp
-CnJldHVybn1QLnl2KHEscSx0aGlzLGEsYix1LkgsYyl9Y2F0Y2gocil7dD1ILlJ1KHIpCnM9SC50cyhy
-KQpQLkwyKHEscSx0aGlzLHQsdS5sLmIocykpfX0sClJUOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQ
-LmhqKHRoaXMsYi5DKCIwKCkiKS5iKGEpLGIpfSwKR1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlZw
-KHRoaXMsdS5NLmIoYSkpfSwKUHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAuT1IodGhpcyxiLkMo
-In4oMCkiKS5iKGEpLGIpfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybn0sCnp6OmZ1bmN0aW9uKGEsYil7
-Yi5DKCIwKCkiKS5iKGEpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQwKCkKcmV0dXJuIFAuVDgobnVs
-bCxudWxsLHRoaXMsYSxiKX0sCmJ2OmZ1bmN0aW9uKGEsYixjLGQpe2MuQygiQDwwPiIpLktxKGQpLkMo
-IjEoMikiKS5iKGEpCmQuYihiKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMShiKQpyZXR1cm4gUC55
-dihudWxsLG51bGwsdGhpcyxhLGIsYyxkKX0sCnJwOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXtkLkMoIkA8
-MD4iKS5LcShlKS5LcShmKS5DKCIxKDIsMykiKS5iKGEpCmUuYihiKQpmLmIoYykKaWYoJC5YMz09PUMu
-TlUpcmV0dXJuIGEuJDIoYixjKQpyZXR1cm4gUC5ReChudWxsLG51bGwsdGhpcyxhLGIsYyxkLGUsZil9
-LApMajpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuS3EoZCkuQygiMSgy
-LDMpIikuYihhKX19ClAuaGoucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnp6
-KHRoaXMuYix0aGlzLmMpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLkMoIjAoKSIpfX0KUC5W
-cC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuYkgodGhpcy5iKX0sCiRTOjJ9
-ClAuT1IucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCnJldHVybiB0aGlzLmEu
-RGwodGhpcy5iLHQuYihhKSx0KX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5DKCJ+KDApIil9
-fQpQLmI2LnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXt2YXIgdD10aGlzLHM9bmV3IFAubG0odCx0
-LnIsSC5MaCh0KS5DKCJsbTwxPiIpKQpzLmM9dC5lCnJldHVybiBzfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHRoaXMuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZih0eXBlb2YgYj09InN0cmluZyIm
-JmIhPT0iX19wcm90b19fIil7dD10aGlzLmIKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4gdS5KLmIo
-dFtiXSkhPW51bGx9ZWxzZXtzPXRoaXMuUFIoYikKcmV0dXJuIHN9fSwKUFI6ZnVuY3Rpb24oYSl7dmFy
-IHQ9dGhpcy5kCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMuREYodFt0aGlzLk4oYSldLGEp
-Pj0wfSwKaTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj10aGlzCkguTGgocikuZC5iKGIpCmlmKHR5cGVv
-ZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXt0PXIuYgpyZXR1cm4gci5iUSh0PT1udWxsP3Iu
-Yj1QLlQyKCk6dCxiKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0MTgyMyk9PT1i
-KXtzPXIuYwpyZXR1cm4gci5iUShzPT1udWxsP3IuYz1QLlQyKCk6cyxiKX1lbHNlIHJldHVybiByLkI3
-KGIpfSwKQjc6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9dGhpcwpILkxoKHEpLmQuYihhKQp0PXEuZApp
-Zih0PT1udWxsKXQ9cS5kPVAuVDIoKQpzPXEuTihhKQpyPXRbc10KaWYocj09bnVsbCl0W3NdPVtxLnlv
-KGEpXQplbHNle2lmKHEuREYocixhKT49MClyZXR1cm4hMQpyLnB1c2gocS55byhhKSl9cmV0dXJuITB9
-LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcwppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19w
-cm90b19fIilyZXR1cm4gdC5MKHQuYixiKQplbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3
-Mzc0MTgyMyk9PT1iKXJldHVybiB0LkwodC5jLGIpCmVsc2UgcmV0dXJuIHQucWcoYil9LApxZzpmdW5j
-dGlvbihhKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1wLmQKaWYobz09bnVsbClyZXR1cm4hMQp0PXAuTihh
-KQpzPW9bdF0Kcj1wLkRGKHMsYSkKaWYocjwwKXJldHVybiExCnE9cy5zcGxpY2UociwxKVswXQppZigw
-PT09cy5sZW5ndGgpZGVsZXRlIG9bdF0KcC5HUyhxKQpyZXR1cm4hMH0sCmJROmZ1bmN0aW9uKGEsYil7
-SC5MaCh0aGlzKS5kLmIoYikKaWYodS5KLmIoYVtiXSkhPW51bGwpcmV0dXJuITEKYVtiXT10aGlzLnlv
-KGIpCnJldHVybiEwfSwKTDpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGE9PW51bGwpcmV0dXJuITEKdD11
-LkouYihhW2JdKQppZih0PT1udWxsKXJldHVybiExCnRoaXMuR1ModCkKZGVsZXRlIGFbYl0KcmV0dXJu
-ITB9LApTOmZ1bmN0aW9uKCl7dGhpcy5yPTEwNzM3NDE4MjMmdGhpcy5yKzF9LAp5bzpmdW5jdGlvbihh
-KXt2YXIgdCxzPXRoaXMscj1uZXcgUC5ibihILkxoKHMpLmQuYihhKSkKaWYocy5lPT1udWxsKXMuZT1z
-LmY9cgplbHNle3Q9cy5mCnIuYz10CnMuZj10LmI9cn0rK3MuYQpzLlMoKQpyZXR1cm4gcn0sCkdTOmZ1
-bmN0aW9uKGEpe3ZhciB0PXRoaXMscz1hLmMscj1hLmIKaWYocz09bnVsbCl0LmU9cgplbHNlIHMuYj1y
-CmlmKHI9PW51bGwpdC5mPXMKZWxzZSByLmM9czstLXQuYQp0LlMoKX0sCk46ZnVuY3Rpb24oYSl7cmV0
-dXJuIEouaGYoYSkmMTA3Mzc0MTgyM30sCkRGOmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZihhPT1udWxs
-KXJldHVybi0xCnQ9YS5sZW5ndGgKZm9yKHM9MDtzPHQ7KytzKWlmKEouUk0oYVtzXS5hLGIpKXJldHVy
-biBzCnJldHVybi0xfX0KUC5ibi5wcm90b3R5cGU9e30KUC5sbS5wcm90b3R5cGU9ewpnbDpmdW5jdGlv
-bigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxzPXQuYQppZih0LmIhPT1z
-LnIpdGhyb3cgSC5iKFAuYTQocykpCmVsc2V7cz10LmMKaWYocz09bnVsbCl7dC5zaihudWxsKQpyZXR1
-cm4hMX1lbHNle3Quc2oodC4kdGkuZC5iKHMuYSkpCnQuYz10LmMuYgpyZXR1cm4hMH19fSwKc2o6ZnVu
-Y3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KUC5tVy5wcm90b3R5cGU9e30K
-UC5MVS5wcm90b3R5cGU9eyRpY1g6MSwkaXpNOjF9ClAubEQucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9u
-KGEpe3JldHVybiBuZXcgSC5hNyhhLHRoaXMuZ0EoYSksSC56SyhhKS5DKCJhNzxsRC5FPiIpKX0sCkU6
-ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5xKGEsYil9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpI
-LnpLKGEpLkMoIn4obEQuRSkiKS5iKGIpCnQ9dGhpcy5nQShhKQpmb3Iocz0wO3M8dDsrK3Mpe2IuJDEo
-dGhpcy5xKGEscykpCmlmKHQhPT10aGlzLmdBKGEpKXRocm93IEguYihQLmE0KGEpKX19LApFMjpmdW5j
-dGlvbihhLGIsYyl7dmFyIHQ9SC56SyhhKQpyZXR1cm4gbmV3IEguQTgoYSx0LktxKGMpLkMoIjEobEQu
-RSkiKS5iKGIpLHQuQygiQDxsRC5FPiIpLktxKGMpLkMoIkE4PDEsMj4iKSl9LApkdTpmdW5jdGlvbihh
-LGIsYyxkKXt2YXIgdApILnpLKGEpLkMoImxELkUiKS5iKGQpClAuakIoYixjLHRoaXMuZ0EoYSkpCmZv
-cih0PWI7dDxjOysrdCl0aGlzLlkoYSx0LGQpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRShhLCJb
-IiwiXSIpfX0KUC5pbC5wcm90b3R5cGU9e30KUC5HQS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
-e3ZhciB0LHM9dGhpcy5hCmlmKCFzLmEpdGhpcy5iLmErPSIsICIKcy5hPSExCnM9dGhpcy5iCnQ9cy5h
-Kz1ILmQoYSkKcy5hPXQrIjogIgpzLmErPUguZChiKX0sCiRTOjF9ClAuWWsucHJvdG90eXBlPXsKSzpm
-dW5jdGlvbihhLGIpe3ZhciB0LHMKSC5MaCh0aGlzKS5DKCJ+KFlrLkssWWsuVikiKS5iKGIpCmZvcih0
-PUouSVQodGhpcy5nVigpKTt0LkYoKTspe3M9dC5nbCgpCmIuJDIocyx0aGlzLnEoMCxzKSl9fSwKZ0E6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouSG0odGhpcy5nVigpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAu
-bk8odGhpcyl9LAokaVowOjF9ClAuS1AucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9
-SC5MaCh0aGlzKQp0LmQuYihiKQp0LmNoWzFdLmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBtb2Rp
-ZnkgdW5tb2RpZmlhYmxlIG1hcCIpKX19ClAuUG4ucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3Jl
-dHVybiB0aGlzLmEucSgwLGIpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0aGlz
-LmEuWSgwLHQuZC5iKGIpLHQuY2hbMV0uYihjKSl9LApLOmZ1bmN0aW9uKGEsYil7dGhpcy5hLksoMCxI
-LkxoKHRoaXMpLkMoIn4oMSwyKSIpLmIoYikpfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJl
-dHVybiB0LmdBKHQpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gSi5qKHRoaXMuYSl9LAokaVowOjF9ClAu
-R2oucHJvdG90eXBlPXt9ClAubGYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRSh0
-aGlzLCJ7IiwifSIpfX0KUC5Wai5wcm90b3R5cGU9eyRpY1g6MSwkaXh1OjF9ClAuWHYucHJvdG90eXBl
-PXsKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgdApmb3IodD1KLklUKEguTGgodGhpcykuQygiY1g8MT4iKS5i
-KGIpKTt0LkYoKTspdGhpcy5pKDAsdC5nbCgpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhp
-cywieyIsIn0iKX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPVAucmoodGhpcyx0aGlzLnIsSC5MaCh0
-aGlzKS5kKQppZighcy5GKCkpcmV0dXJuIiIKaWYoYj09PSIiKXt0PSIiCmRvIHQrPUguZChzLmQpCndo
-aWxlKHMuRigpKX1lbHNle3Q9SC5kKHMuZCkKZm9yKDtzLkYoKTspdD10K2IrSC5kKHMuZCl9cmV0dXJu
-IHQuY2hhckNvZGVBdCgwKT09MD90OnR9LAokaWNYOjEsCiRpeHU6MX0KUC5uWS5wcm90b3R5cGU9e30K
-UC5XWS5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5cGU9e30KUC51dy5wcm90b3R5cGU9ewpxOmZ1bmN0
-aW9uKGEsYil7dmFyIHQscz10aGlzLmIKaWYocz09bnVsbClyZXR1cm4gdGhpcy5jLnEoMCxiKQplbHNl
-IGlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4KZWxzZXt0PXNbYl0KcmV0dXJuIHR5cGVvZiB0PT0i
-dW5kZWZpbmVkIj90aGlzLmZiKGIpOnR9fSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYj09bnVs
-bD90aGlzLmMuYTp0aGlzLkNmKCkubGVuZ3RofSwKZ1Y6ZnVuY3Rpb24oKXtpZih0aGlzLmI9PW51bGwp
-e3ZhciB0PXRoaXMuYwpyZXR1cm4gbmV3IEguaTUodCxILkxoKHQpLkMoImk1PDE+IikpfXJldHVybiBu
-ZXcgUC5pOCh0aGlzKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj10aGlzCmlmKHIuYj09bnVs
-bClyLmMuWSgwLGIsYykKZWxzZSBpZihyLng0KGIpKXt0PXIuYgp0W2JdPWMKcz1yLmEKaWYocz09bnVs
-bD90IT1udWxsOnMhPT10KXNbYl09bnVsbH1lbHNlIHIuWEsoKS5ZKDAsYixjKX0sCng0OmZ1bmN0aW9u
-KGEpe2lmKHRoaXMuYj09bnVsbClyZXR1cm4gdGhpcy5jLng0KGEpCnJldHVybiBPYmplY3QucHJvdG90
-eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpfSwKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
-cixxLHA9dGhpcwp1LmNBLmIoYikKaWYocC5iPT1udWxsKXJldHVybiBwLmMuSygwLGIpCnQ9cC5DZigp
-CmZvcihzPTA7czx0Lmxlbmd0aDsrK3Mpe3I9dFtzXQpxPXAuYltyXQppZih0eXBlb2YgcT09InVuZGVm
-aW5lZCIpe3E9UC5RZShwLmFbcl0pCnAuYltyXT1xfWIuJDIocixxKQppZih0IT09cC5jKXRocm93IEgu
-YihQLmE0KHApKX19LApDZjpmdW5jdGlvbigpe3ZhciB0PXUuai5iKHRoaXMuYykKaWYodD09bnVsbCl0
-PXRoaXMuYz1ILlZNKE9iamVjdC5rZXlzKHRoaXMuYSksdS5zKQpyZXR1cm4gdH0sClhLOmZ1bmN0aW9u
-KCl7dmFyIHQscyxyLHEscCxvPXRoaXMKaWYoby5iPT1udWxsKXJldHVybiBvLmMKdD1QLkZsKHUuTix1
-LnopCnM9by5DZigpCmZvcihyPTA7cT1zLmxlbmd0aCxyPHE7KytyKXtwPXNbcl0KdC5ZKDAscCxvLnEo
-MCxwKSl9aWYocT09PTApQy5ObS5pKHMsbnVsbCkKZWxzZSBDLk5tLnNBKHMsMCkKby5hPW8uYj1udWxs
-CnJldHVybiBvLmM9dH0sCmZiOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKCFPYmplY3QucHJvdG90eXBlLmhh
-c093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpKXJldHVybgp0PVAuUWUodGhpcy5hW2FdKQpyZXR1cm4g
-dGhpcy5iW2FdPXR9fQpQLmk4LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpy
-ZXR1cm4gdC5nQSh0KX0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzLmEKaWYodC5iPT1udWxsKXQ9
-dC5nVigpLkUoMCxiKQplbHNle3Q9dC5DZigpCmlmKGI8MHx8Yj49dC5sZW5ndGgpcmV0dXJuIEguT0go
-dCxiKQp0PXRbYl19cmV0dXJuIHR9LApna3o6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCmlmKHQuYj09
-bnVsbCl7dD10LmdWKCkKdD10Lmdreih0KX1lbHNle3Q9dC5DZigpCnQ9bmV3IEoubTEodCx0Lmxlbmd0
-aCxILnQ2KHQpLkMoIm0xPDE+IikpfXJldHVybiB0fX0KUC5DVi5wcm90b3R5cGU9ewp5cjpmdW5jdGlv
-bihhLGEwLGExKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYj0iSW52YWxp
-ZCBiYXNlNjQgZW5jb2RpbmcgbGVuZ3RoICIKYTE9UC5qQihhMCxhMSxhLmxlbmd0aCkKdD0kLlY3KCkK
-Zm9yKHM9YTAscj1zLHE9bnVsbCxwPS0xLG89LTEsbj0wO3M8YTE7cz1tKXttPXMrMQpsPUMueEIuVyhh
-LHMpCmlmKGw9PT0zNyl7az1tKzIKaWYoazw9YTEpe2o9SC5vbyhDLnhCLlcoYSxtKSkKaT1ILm9vKEMu
-eEIuVyhhLG0rMSkpCmg9aioxNitpLShpJjI1NikKaWYoaD09PTM3KWg9LTEKbT1rfWVsc2UgaD0tMX1l
-bHNlIGg9bAppZigwPD1oJiZoPD0xMjcpe2lmKGg8MHx8aD49dC5sZW5ndGgpcmV0dXJuIEguT0godCxo
-KQpnPXRbaF0KaWYoZz49MCl7aD1DLnhCLm0oIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVm
-Z2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGcpCmlmKGg9PT1sKWNvbnRpbnVlCmw9aH1l
-bHNle2lmKGc9PT0tMSl7aWYocDwwKXtmPXE9PW51bGw/bnVsbDpxLmEubGVuZ3RoCmlmKGY9PW51bGwp
-Zj0wCnA9Zisocy1yKQpvPXN9KytuCmlmKGw9PT02MSljb250aW51ZX1sPWh9aWYoZyE9PS0yKXtpZihx
-PT1udWxsKXE9bmV3IFAuUm4oIiIpCnEuYSs9Qy54Qi5OaihhLHIscykKcS5hKz1ILkx3KGwpCnI9bQpj
-b250aW51ZX19dGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IGRhdGEiLGEscykpfWlmKHEhPW51
-bGwpe2Y9cS5hKz1DLnhCLk5qKGEscixhMSkKZT1mLmxlbmd0aAppZihwPj0wKVAueE0oYSxvLGExLHAs
-bixlKQplbHNle2Q9Qy5qbi56WShlLTEsNCkrMQppZihkPT09MSl0aHJvdyBILmIoUC5ycihiLGEsYTEp
-KQpmb3IoO2Q8NDspe2YrPSI9IgpxLmE9ZjsrK2R9fWY9cS5hCnJldHVybiBDLnhCLmk3KGEsYTAsYTEs
-Zi5jaGFyQ29kZUF0KDApPT0wP2Y6Zil9Yz1hMS1hMAppZihwPj0wKVAueE0oYSxvLGExLHAsbixjKQpl
-bHNle2Q9Qy5qbi56WShjLDQpCmlmKGQ9PT0xKXRocm93IEguYihQLnJyKGIsYSxhMSkpCmlmKGQ+MSlh
-PUMueEIuaTcoYSxhMSxhMSxkPT09Mj8iPT0iOiI9Iil9cmV0dXJuIGF9fQpQLlU4LnByb3RvdHlwZT17
-fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnByb3RvdHlwZT17fQpQLlppLnByb3RvdHlwZT17fQpQLmJ5
-LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9uKGEsYixjKXt2YXIgdAp1LmVwLmIoYykKdD1QLkJTKGIsdGhp
-cy5nSGUoKS5hKQpyZXR1cm4gdH0sCmdIZTpmdW5jdGlvbigpe3JldHVybiBDLkEzfX0KUC5NeC5wcm90
-b3R5cGU9e30KUC51NS5wcm90b3R5cGU9ewpnWkU6ZnVuY3Rpb24oKXtyZXR1cm4gQy5Ra319ClAuRTMu
-cHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPVAuakIoMCxudWxsLGEubGVuZ3RoKSxx
-PXItMAppZihxPT09MClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCkKdD1uZXcgVWludDhBcnJheShxKjMp
-CnM9bmV3IFAuUncodCkKaWYocy5HeChhLDAscikhPT1yKXMuTzYoSi5hNihhLHItMSksMCkKcmV0dXJu
-IG5ldyBVaW50OEFycmF5KHQuc3ViYXJyYXkoMCxILnJNKDAscy5iLHQubGVuZ3RoKSkpfX0KUC5Sdy5w
-cm90b3R5cGU9ewpPNjpmdW5jdGlvbihhLGIpe3ZhciB0LHM9dGhpcyxyPXMuYyxxPXMuYixwPXErMSxv
-PXIubGVuZ3RoCmlmKChiJjY0NTEyKT09PTU2MzIwKXt0PTY1NTM2KygoYSYxMDIzKTw8MTApfGImMTAy
-MwpzLmI9cAppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT0yNDB8dD4+PjE4CnE9cy5iPXArMQpp
-ZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT0xMjh8dD4+PjEyJjYzCnA9cy5iPXErMQppZihxPj1v
-KXJldHVybiBILk9IKHIscSkKcltxXT0xMjh8dD4+PjYmNjMKcy5iPXArMQppZihwPj1vKXJldHVybiBI
-Lk9IKHIscCkKcltwXT0xMjh8dCY2MwpyZXR1cm4hMH1lbHNle3MuYj1wCmlmKHE+PW8pcmV0dXJuIEgu
-T0gocixxKQpyW3FdPTIyNHxhPj4+MTIKcT1zLmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixwKQpy
-W3BdPTEyOHxhPj4+NiY2MwpzLmI9cSsxCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTEyOHxh
-JjYzCnJldHVybiExfX0sCkd4OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMK
-aWYoYiE9PWMmJihDLnhCLm0oYSxjLTEpJjY0NTEyKT09PTU1Mjk2KS0tYwpmb3IodD1tLmMscz10Lmxl
-bmd0aCxyPWI7cjxjOysrcil7cT1DLnhCLlcoYSxyKQppZihxPD0xMjcpe3A9bS5iCmlmKHA+PXMpYnJl
-YWsKbS5iPXArMQp0W3BdPXF9ZWxzZSBpZigocSY2NDUxMik9PT01NTI5Nil7aWYobS5iKzM+PXMpYnJl
-YWsKbz1yKzEKaWYobS5PNihxLEMueEIuVyhhLG8pKSlyPW99ZWxzZSBpZihxPD0yMDQ3KXtwPW0uYgpu
-PXArMQppZihuPj1zKWJyZWFrCm0uYj1uCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTE5Mnxx
-Pj4+NgptLmI9bisxCnRbbl09MTI4fHEmNjN9ZWxzZXtwPW0uYgppZihwKzI+PXMpYnJlYWsKbj1tLmI9
-cCsxCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTIyNHxxPj4+MTIKcD1tLmI9bisxCmlmKG4+
-PXMpcmV0dXJuIEguT0godCxuKQp0W25dPTEyOHxxPj4+NiY2MwptLmI9cCsxCmlmKHA+PXMpcmV0dXJu
-IEguT0godCxwKQp0W3BdPTEyOHxxJjYzfX1yZXR1cm4gcn19ClAuR1kucHJvdG90eXBlPXsKV0o6ZnVu
-Y3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxsCnUuTC5iKGEpCnQ9UC5reSghMSxhLDAsbnVsbCkK
-aWYodCE9bnVsbClyZXR1cm4gdApzPVAuakIoMCxudWxsLEouSG0oYSkpCnI9UC53RyhhLDAscykKaWYo
-cj4wKXtxPVAuSE0oYSwwLHIpCmlmKHI9PT1zKXJldHVybiBxCnA9bmV3IFAuUm4ocSkKbz1yCm49ITF9
-ZWxzZXtvPTAKcD1udWxsCm49ITB9aWYocD09bnVsbClwPW5ldyBQLlJuKCIiKQptPW5ldyBQLmJ6KCEx
-LHApCm0uYz1uCm0uTUUoYSxvLHMpCmlmKG0uZT4wKXtILnZoKFAucnIoIlVuZmluaXNoZWQgVVRGLTgg
-b2N0ZXQgc2VxdWVuY2UiLGEscykpCnAuYSs9SC5Mdyg2NTUzMykKbS5mPW0uZT1tLmQ9MH1sPXAuYQpy
-ZXR1cm4gbC5jaGFyQ29kZUF0KDApPT0wP2w6bH19ClAuYnoucHJvdG90eXBlPXsKTUU6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMsZz0iQmFkIFVURi04IGVuY29k
-aW5nIDB4Igp1LkwuYihhKQp0PWguZApzPWguZQpyPWguZgpoLmY9aC5lPWguZD0wCiRsYWJlbDAkMDpm
-b3IocT1KLlU2KGEpLHA9aC5iLG89YjshMDtvPWopeyRsYWJlbDEkMTppZihzPjApe2Rve2lmKG89PT1j
-KWJyZWFrICRsYWJlbDAkMApuPXEucShhLG8pCmlmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJuIG4u
-ek0oKQppZigobiYxOTIpIT09MTI4KXttPVAucnIoZytDLmpuLldaKG4sMTYpLGEsbykKdGhyb3cgSC5i
-KG0pfWVsc2V7dD0odDw8NnxuJjYzKT4+PjA7LS1zOysrb319d2hpbGUocz4wKQptPXItMQppZihtPDB8
-fG0+PTQpcmV0dXJuIEguT0goQy5HYixtKQppZih0PD1DLkdiW21dKXttPVAucnIoIk92ZXJsb25nIGVu
-Y29kaW5nIG9mIDB4IitDLmpuLldaKHQsMTYpLGEsby1yLTEpCnRocm93IEguYihtKX1pZih0PjExMTQx
-MTEpe209UC5ycigiQ2hhcmFjdGVyIG91dHNpZGUgdmFsaWQgVW5pY29kZSByYW5nZTogMHgiK0Muam4u
-V1oodCwxNiksYSxvLXItMSkKdGhyb3cgSC5iKG0pfWlmKCFoLmN8fHQhPT02NTI3OSlwLmErPUguTHco
-dCkKaC5jPSExfWZvcihtPW88YzttOyl7bD1QLndHKGEsbyxjKQppZihsPjApe2guYz0hMQprPW8rbApw
-LmErPVAuSE0oYSxvLGspCmlmKGs9PT1jKWJyZWFrfWVsc2Ugaz1vCmo9aysxCm49cS5xKGEsaykKaWYo
-dHlwZW9mIG4hPT0ibnVtYmVyIilyZXR1cm4gbi5KKCkKaWYobjwwKXtpPVAucnIoIk5lZ2F0aXZlIFVU
-Ri04IGNvZGUgdW5pdDogLTB4IitDLmpuLldaKC1uLDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfWVsc2V7
-aWYoKG4mMjI0KT09PTE5Mil7dD1uJjMxCnM9MQpyPTEKY29udGludWUgJGxhYmVsMCQwfWlmKChuJjI0
-MCk9PT0yMjQpe3Q9biYxNQpzPTIKcj0yCmNvbnRpbnVlICRsYWJlbDAkMH1pZigobiYyNDgpPT09MjQw
-JiZuPDI0NSl7dD1uJjcKcz0zCnI9Mwpjb250aW51ZSAkbGFiZWwwJDB9aT1QLnJyKGcrQy5qbi5XWihu
-LDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfX1icmVhayAkbGFiZWwwJDB9aWYocz4wKXtoLmQ9dApoLmU9
-cwpoLmY9cn19fQpQLldGLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCnUuZm8u
-YihhKQp0PXRoaXMuYgpzPXRoaXMuYQp0LmErPXMuYQpyPXQuYSs9SC5kKGEuYSkKdC5hPXIrIjogIgp0
-LmErPVAucChiKQpzLmE9IiwgIn0sCiRTOjE4fQpQLmEyLnByb3RvdHlwZT17fQpQLmlQLnByb3RvdHlw
-ZT17CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9m
-IFAuaVAmJnRoaXMuYT09PWIuYSYmITB9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVy
-bih0XkMuam4ud0codCwzMCkpJjEwNzM3NDE4MjN9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz1Q
-LkdxKEgudEoodCkpLHI9UC5oMChILk5TKHQpKSxxPVAuaDAoSC5qQSh0KSkscD1QLmgwKEguS0wodCkp
-LG89UC5oMChILmNoKHQpKSxuPVAuaDAoSC5KZCh0KSksbT1QLlZ4KEgubzEodCkpLGw9cysiLSIrcisi
-LSIrcSsiICIrcCsiOiIrbysiOiIrbisiLiIrbQpyZXR1cm4gbH19ClAuQ1AucHJvdG90eXBlPXt9ClAu
-WFMucHJvdG90eXBlPXt9ClAuQzYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEK
-aWYodCE9bnVsbClyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLnAodCkKcmV0dXJuIkFzc2VydGlv
-biBmYWlsZWQifX0KUC5uLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlRocm93IG9mIG51
-bGwuIn19ClAudS5wcm90b3R5cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJJbnZhbGlkIGFyZ3VtZW50
-IisoIXRoaXMuYT8iKHMpIjoiIil9LApndTpmdW5jdGlvbigpe3JldHVybiIifSwKdzpmdW5jdGlvbihh
-KXt2YXIgdCxzLHIscSxwPXRoaXMsbz1wLmMsbj1vIT1udWxsPyIgKCIrbysiKSI6IiIKbz1wLmQKdD1v
-PT1udWxsPyIiOiI6ICIrSC5kKG8pCnM9cC5nWigpK24rdAppZighcC5hKXJldHVybiBzCnI9cC5ndSgp
-CnE9UC5wKHAuYikKcmV0dXJuIHMrcisiOiAiK3F9fQpQLmJKLnByb3RvdHlwZT17CmdaOmZ1bmN0aW9u
-KCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcy5lCmlmKHI9
-PW51bGwpe3I9dGhpcy5mCnQ9ciE9bnVsbD8iOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIrSC5k
-KHIpOiIifWVsc2V7cz10aGlzLmYKaWYocz09bnVsbCl0PSI6IE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1
-YWwgdG8gIitILmQocikKZWxzZSBpZihzPnIpdD0iOiBOb3QgaW4gcmFuZ2UgIitILmQocikrIi4uIitI
-LmQocykrIiwgaW5jbHVzaXZlIgplbHNlIHQ9czxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5
-IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIrSC5kKHIpfXJldHVybiB0fX0KUC5lWS5wcm90b3R5cGU9
-ewpnWjpmdW5jdGlvbigpe3JldHVybiJSYW5nZUVycm9yIn0sCmd1OmZ1bmN0aW9uKCl7dmFyIHQscz1I
-LlNjKHRoaXMuYikKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5KKCkKaWYoczwwKXJldHVy
-biI6IGluZGV4IG11c3Qgbm90IGJlIG5lZ2F0aXZlIgp0PXRoaXMuZgppZih0PT09MClyZXR1cm4iOiBu
-byBpbmRpY2VzIGFyZSB2YWxpZCIKcmV0dXJuIjogaW5kZXggc2hvdWxkIGJlIGxlc3MgdGhhbiAiK0gu
-ZCh0KX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmZ9fQpQLm1wLnByb3RvdHlwZT17Cnc6ZnVu
-Y3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxsPXRoaXMsaz17fSxqPW5ldyBQLlJuKCIiKQprLmE9
-IiIKZm9yKHQ9bC5jLHM9dC5sZW5ndGgscj0wLHE9IiIscD0iIjtyPHM7KytyLHA9IiwgIil7bz10W3Jd
-CmouYT1xK3AKcT1qLmErPVAucChvKQprLmE9IiwgIn1sLmQuSygwLG5ldyBQLldGKGssaikpCm49UC5w
-KGwuYSkKbT1qLncoMCkKdD0iTm9TdWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK0gu
-ZChsLmIuYSkrIidcblJlY2VpdmVyOiAiK24rIlxuQXJndW1lbnRzOiBbIittKyJdIgpyZXR1cm4gdH19
-ClAudWIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0aW9u
-OiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0
-dXJuIHQhPW51bGw/IlVuaW1wbGVtZW50ZWRFcnJvcjogIit0OiJVbmltcGxlbWVudGVkRXJyb3IifX0K
-UC5sai5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJCYWQgc3RhdGU6ICIrdGhpcy5hfX0K
-UC5VVi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQppZih0PT1udWxsKXJldHVy
-biJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uLiIKcmV0dXJuIkNvbmN1cnJl
-bnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb246ICIrUC5wKHQpKyIuIn19ClAuazUucHJvdG90
-eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LAokaVhTOjF9ClAuS1kucHJv
-dG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iU3RhY2sgT3ZlcmZsb3cifSwKJGlYUzoxfQpQLmMu
-cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQ9PW51bGw/IlJlYWRp
-bmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24iOiJSZWFkaW5nIHN0YXRp
-YyB2YXJpYWJsZSAnIit0KyInIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24ifX0KUC5DRC5wcm90b3R5
-cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJFeGNlcHRpb246ICIrdGhpcy5hfX0KUC5hRS5wcm90b3R5
-cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMuYSxnPWgh
-PW51bGwmJiIiIT09aD8iRm9ybWF0RXhjZXB0aW9uOiAiK0guZChoKToiRm9ybWF0RXhjZXB0aW9uIixm
-PXRoaXMuYyxlPXRoaXMuYgppZih0eXBlb2YgZT09InN0cmluZyIpe2lmKGYhPW51bGwpaD1mPDB8fGY+
-ZS5sZW5ndGgKZWxzZSBoPSExCmlmKGgpZj1udWxsCmlmKGY9PW51bGwpe3Q9ZS5sZW5ndGg+Nzg/Qy54
-Qi5OaihlLDAsNzUpKyIuLi4iOmUKcmV0dXJuIGcrIlxuIit0fWZvcihzPTEscj0wLHE9ITEscD0wO3A8
-ZjsrK3Ape289Qy54Qi5XKGUscCkKaWYobz09PTEwKXtpZihyIT09cHx8IXEpKytzCnI9cCsxCnE9ITF9
-ZWxzZSBpZihvPT09MTMpeysrcwpyPXArMQpxPSEwfX1nPXM+MT9nKygiIChhdCBsaW5lICIrcysiLCBj
-aGFyYWN0ZXIgIisoZi1yKzEpKyIpXG4iKTpnKygiIChhdCBjaGFyYWN0ZXIgIisoZisxKSsiKVxuIikK
-bj1lLmxlbmd0aApmb3IocD1mO3A8bjsrK3Ape289Qy54Qi5tKGUscCkKaWYobz09PTEwfHxvPT09MTMp
-e249cApicmVha319aWYobi1yPjc4KWlmKGYtcjw3NSl7bT1yKzc1Cmw9cgprPSIiCmo9Ii4uLiJ9ZWxz
-ZXtpZihuLWY8NzUpe2w9bi03NQptPW4Kaj0iIn1lbHNle2w9Zi0zNgptPWYrMzYKaj0iLi4uIn1rPSIu
-Li4ifWVsc2V7bT1uCmw9cgprPSIiCmo9IiJ9aT1DLnhCLk5qKGUsbCxtKQpyZXR1cm4gZytrK2kraisi
-XG4iK0MueEIuSXgoIiAiLGYtbCtrLmxlbmd0aCkrIl5cbiJ9ZWxzZSByZXR1cm4gZiE9bnVsbD9nKygi
-IChhdCBvZmZzZXQgIitILmQoZikrIikiKTpnfX0KUC5FSC5wcm90b3R5cGU9e30KUC5LTi5wcm90b3R5
-cGU9e30KUC5jWC5wcm90b3R5cGU9ewpldjpmdW5jdGlvbihhLGIpe3ZhciB0PUguTGgodGhpcykKcmV0
-dXJuIG5ldyBILlU1KHRoaXMsdC5DKCJhMihjWC5FKSIpLmIoYiksdC5DKCJVNTxjWC5FPiIpKX0sCmdB
-OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5na3oodGhpcykKZm9yKHQ9MDtzLkYoKTspKyt0CnJldHVy
-biB0fSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmdreih0aGlzKS5GKCl9LApncjg6ZnVuY3Rp
-b24oYSl7dmFyIHQscz10aGlzLmdreih0aGlzKQppZighcy5GKCkpdGhyb3cgSC5iKEguV3AoKSkKdD1z
-LmdsKCkKaWYocy5GKCkpdGhyb3cgSC5iKEguZFUoKSkKcmV0dXJuIHR9LApFOmZ1bmN0aW9uKGEsYil7
-dmFyIHQscyxyClAuazEoYiwiaW5kZXgiKQpmb3IodD10aGlzLmdreih0aGlzKSxzPTA7dC5GKCk7KXty
-PXQuZ2woKQppZihiPT09cylyZXR1cm4gcjsrK3N9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIs
-bnVsbCxzKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnBy
-b3RvdHlwZT17fQpQLnpNLnByb3RvdHlwZT17JGljWDoxfQpQLlowLnByb3RvdHlwZT17fQpQLmM4LnBy
-b3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gUC5rLnByb3RvdHlwZS5naU8uY2FsbCh0aGlz
-LHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4ibnVsbCJ9fQpQLkZLLnByb3RvdHlwZT17fQpQLmsu
-cHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQLmssJGlrOjEsCkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRo
-aXM9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKHRoaXMpfSwKdzpmdW5jdGlvbihhKXty
-ZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEguTSh0aGlzKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1
-Lm8uYihiKQp0aHJvdyBILmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9LAp0b1N0
-cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLncodGhpcyl9fQpQLk9kLnByb3RvdHlwZT17fQpQLmli
-LnByb3RvdHlwZT17JGlPZDoxfQpQLnh1LnByb3RvdHlwZT17fQpQLkd6LnByb3RvdHlwZT17fQpQLnFV
-LnByb3RvdHlwZT17JGl2WDoxfQpQLlJuLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0
-aGlzLmEubGVuZ3RofSwKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQuY2hhckNvZGVB
-dCgwKT09MD90OnR9LAokaUJMOjF9ClAuR0QucHJvdG90eXBlPXt9ClAubjEucHJvdG90eXBlPXsKJDI6
-ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscQp1LmYuYihhKQpILnkoYikKdD1KLnJZKGIpLk9ZKGIsIj0i
-KQppZih0PT09LTEpe2lmKGIhPT0iIilhLlkoMCxQLmt1KGIsMCxiLmxlbmd0aCx0aGlzLmEsITApLCIi
-KX1lbHNlIGlmKHQhPT0wKXtzPUMueEIuTmooYiwwLHQpCnI9Qy54Qi5HKGIsdCsxKQpxPXRoaXMuYQph
-LlkoMCxQLmt1KHMsMCxzLmxlbmd0aCxxLCEwKSxQLmt1KHIsMCxyLmxlbmd0aCxxLCEwKSl9cmV0dXJu
-IGF9LAokUzo0MH0KUC5jUy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJy
-KCJJbGxlZ2FsIElQdjQgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAokUzo0M30KUC5WQy5wcm90b3R5
-cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJyKCJJbGxlZ2FsIElQdjYgYWRkcmVzcywg
-IithLHRoaXMuYSxiKSl9LAokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kMihhLG51bGwpfSwKJFM6
-NDR9ClAudHAucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihiLWE+NCl0aGlzLmEu
-JDIoImFuIElQdjYgcGFydCBjYW4gb25seSBjb250YWluIGEgbWF4aW11bSBvZiA0IGhleCBkaWdpdHMi
-LGEpCnQ9UC5RQShDLnhCLk5qKHRoaXMuYixhLGIpLG51bGwsMTYpCmlmKHR5cGVvZiB0IT09Im51bWJl
-ciIpcmV0dXJuIHQuSigpCmlmKHQ8MHx8dD42NTUzNSl0aGlzLmEuJDIoImVhY2ggcGFydCBtdXN0IGJl
-IGluIHRoZSByYW5nZSBvZiBgMHgwLi4weEZGRkZgIixhKQpyZXR1cm4gdH0sCiRTOjE5fQpQLkRuLnBy
-b3RvdHlwZT17CmdrdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ9LApnSmY6ZnVuY3Rpb24oYSl7dmFy
-IHQ9dGhpcy5jCmlmKHQ9PW51bGwpcmV0dXJuIiIKaWYoQy54Qi5uKHQsIlsiKSlyZXR1cm4gQy54Qi5O
-aih0LDEsdC5sZW5ndGgtMSkKcmV0dXJuIHR9LApndHA6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5kCmlm
-KHQ9PW51bGwpcmV0dXJuIFAud0sodGhpcy5hKQpyZXR1cm4gdH0sCmd0UDpmdW5jdGlvbigpe3ZhciB0
-PXRoaXMuZgpyZXR1cm4gdD09bnVsbD8iIjp0fSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yCnJl
-dHVybiB0PT1udWxsPyIiOnR9LApubTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG0sbD10
-aGlzCnUuWC5iKG51bGwpCnUuYi5iKGIpCnQ9bC5hCnM9dD09PSJmaWxlIgpyPWwuYgpxPWwuZApwPWwu
-YwppZighKHAhPW51bGwpKXA9ci5sZW5ndGghPT0wfHxxIT1udWxsfHxzPyIiOm51bGwKbz1sLmUKaWYo
-IXMpbj1wIT1udWxsJiZvLmxlbmd0aCE9PTAKZWxzZSBuPSEwCmlmKG4mJiFDLnhCLm4obywiLyIpKW89
-Ii8iK28KaWYoYiE9bnVsbCltPVAubGUobnVsbCwwLDAsYikKZWxzZSBtPWwuZgpyZXR1cm4gbmV3IFAu
-RG4odCxyLHAscSxvLG0sbC5yKX0sCmdGajpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcy54CmlmKHMhPW51
-bGwpcmV0dXJuIHMKdD10aGlzLmUKaWYodC5sZW5ndGghPT0wJiZDLnhCLlcodCwwKT09PTQ3KXQ9Qy54
-Qi5HKHQsMSkKcz10PT09IiI/Qy5kbjpQLkFGKG5ldyBILkE4KEguVk0odC5zcGxpdCgiLyIpLHUucyks
-dS5kTy5iKFAuUEgoKSksdS5kbyksdS5OKQp0aGlzLnNvNihzKQpyZXR1cm4gc30sCmdoWTpmdW5jdGlv
-bigpe3ZhciB0LHM9dGhpcwppZihzLlE9PW51bGwpe3Q9cy5mCnMuc1JIKG5ldyBQLkdqKFAuV1godD09
-bnVsbD8iIjp0KSx1LlQpKX1yZXR1cm4gcy5RfSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxw
-LG8KZm9yKHQ9MCxzPTA7Qy54Qi5RaShiLCIuLi8iLHMpOyl7cys9MzsrK3R9cj1DLnhCLmNuKGEsIi8i
-KQp3aGlsZSghMCl7aWYoIShyPjAmJnQ+MCkpYnJlYWsKcT1DLnhCLlBrKGEsIi8iLHItMSkKaWYocTww
-KWJyZWFrCnA9ci1xCm89cCE9PTIKaWYoIW98fHA9PT0zKWlmKEMueEIubShhLHErMSk9PT00NilvPSFv
-fHxDLnhCLm0oYSxxKzIpPT09NDYKZWxzZSBvPSExCmVsc2Ugbz0hMQppZihvKWJyZWFrOy0tdApyPXF9
-cmV0dXJuIEMueEIuaTcoYSxyKzEsbnVsbCxDLnhCLkcoYixzLTMqdCkpfSwKWkk6ZnVuY3Rpb24oYSl7
-cmV0dXJuIHRoaXMubVMoUC5oSyhhKSl9LAptUzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixt
-LGwsaz10aGlzLGo9bnVsbAppZihhLmdGaSgpLmxlbmd0aCE9PTApe3Q9YS5nRmkoKQppZihhLmdjaigp
-KXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPWEuZ3hBKCk/YS5ndHAoYSk6an1lbHNle3E9agpyPXEKcz0i
-In1wPVAueGUoYS5nSWkoYSkpCm89YS5nUUQoKT9hLmd0UCgpOmp9ZWxzZXt0PWsuYQppZihhLmdjaigp
-KXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPVAud0IoYS5neEEoKT9hLmd0cChhKTpqLHQpCnA9UC54ZShh
-LmdJaShhKSkKbz1hLmdRRCgpP2EuZ3RQKCk6an1lbHNle3M9ay5iCnI9ay5jCnE9ay5kCmlmKGEuZ0lp
-KGEpPT09IiIpe3A9ay5lCm89YS5nUUQoKT9hLmd0UCgpOmsuZn1lbHNle2lmKGEuZ3RUKCkpcD1QLnhl
-KGEuZ0lpKGEpKQplbHNle249ay5lCmlmKG4ubGVuZ3RoPT09MClpZihyPT1udWxsKXA9dC5sZW5ndGg9
-PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2UgcD1QLnhlKCIvIithLmdJaShhKSkKZWxzZXtt
-PWsuSmgobixhLmdJaShhKSkKbD10Lmxlbmd0aD09PTAKaWYoIWx8fHIhPW51bGx8fEMueEIubihuLCIv
-IikpcD1QLnhlKG0pCmVsc2UgcD1QLndGKG0sIWx8fHIhPW51bGwpfX1vPWEuZ1FEKCk/YS5ndFAoKTpq
-fX19cmV0dXJuIG5ldyBQLkRuKHQscyxyLHEscCxvLGEuZ1o4KCk/YS5nS2EoKTpqKX0sCmdjajpmdW5j
-dGlvbigpe3JldHVybiB0aGlzLmMhPW51bGx9LApneEE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kIT1u
-dWxsfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZiE9bnVsbH0sCmdaODpmdW5jdGlvbigpe3Jl
-dHVybiB0aGlzLnIhPW51bGx9LApndFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54Qi5uKHRoaXMuZSwiLyIp
-fSwKdDQ6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIp
-dGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSAiK0guZChxKSsi
-IFVSSSIpKQpxPXIuZgppZigocT09bnVsbD8iIjpxKSE9PSIiKXRocm93IEguYihQLkw0KCJDYW5ub3Qg
-ZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiKSkKcT1y
-LnIKaWYoKHE9PW51bGw/IiI6cSkhPT0iIil0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBm
-aWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50IikpCnQ9JC53USgpCmlm
-KEgub1QodCkpcT1QLm1uKHIpCmVsc2V7aWYoci5jIT1udWxsJiZyLmdKZihyKSE9PSIiKUgudmgoUC5M
-NCgiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdp
-dGggYW4gYXV0aG9yaXR5IikpCnM9ci5nRmooKQpQLmtFKHMsITEpCnE9UC52ZyhDLnhCLm4oci5lLCIv
-Iik/Ii8iOiIiLHMsIi8iKQpxPXEuY2hhckNvZGVBdCgwKT09MD9xOnF9cmV0dXJuIHF9LAp3OmZ1bmN0
-aW9uKGEpe3ZhciB0LHMscixxPXRoaXMscD1xLnkKaWYocD09bnVsbCl7cD1xLmEKdD1wLmxlbmd0aCE9
-PTA/cCsiOiI6IiIKcz1xLmMKcj1zPT1udWxsCmlmKCFyfHxwPT09ImZpbGUiKXtwPXQrIi8vIgp0PXEu
-YgppZih0Lmxlbmd0aCE9PTApcD1wK3QrIkAiCmlmKCFyKXArPXMKdD1xLmQKaWYodCE9bnVsbClwPXAr
-IjoiK0guZCh0KX1lbHNlIHA9dApwKz1xLmUKdD1xLmYKaWYodCE9bnVsbClwPXArIj8iK3QKdD1xLnIK
-aWYodCE9bnVsbClwPXArIiMiK3QKcD1xLnk9cC5jaGFyQ29kZUF0KDApPT0wP3A6cH1yZXR1cm4gcH0s
-CkROOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZihyPT09
-YilyZXR1cm4hMAppZih1LkQuYyhiKSlpZihyLmE9PWIuZ0ZpKCkpaWYoci5jIT1udWxsPT09Yi5nY2oo
-KSlpZihyLmI9PWIuZ2t1KCkpaWYoci5nSmYocik9PWIuZ0pmKGIpKWlmKHIuZ3RwKHIpPT1iLmd0cChi
-KSlpZihyLmU9PT1iLmdJaShiKSl7dD1yLmYKcz10PT1udWxsCmlmKCFzPT09Yi5nUUQoKSl7aWYocyl0
-PSIiCmlmKHQ9PT1iLmd0UCgpKXt0PXIucgpzPXQ9PW51bGwKaWYoIXM9PT1iLmdaOCgpKXtpZihzKXQ9
-IiIKdD10PT09Yi5nS2EoKX1lbHNlIHQ9ITF9ZWxzZSB0PSExfWVsc2UgdD0hMX1lbHNlIHQ9ITEKZWxz
-ZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKcmV0
-dXJuIHR9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy56CnJldHVybiB0PT1udWxsP3RoaXMuej1D
-LnhCLmdpTyh0aGlzLncoMCkpOnR9LApzbzY6ZnVuY3Rpb24oYSl7dGhpcy54PXUuYS5iKGEpfSwKc1JI
-OmZ1bmN0aW9uKGEpe3RoaXMuUT11LmYuYihhKX0sCiRpaUQ6MSwKZ0ZpOmZ1bmN0aW9uKCl7cmV0dXJu
-IHRoaXMuYX0sCmdJaTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lfX0KUC5lMS5wcm90b3R5cGU9ewok
-MTpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5ycigiSW52YWxpZCBwb3J0Iix0aGlzLmEsdGhpcy5iKzEp
-KX0sCiRTOjE0fQpQLk5ZLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PSJJbGxlZ2FsIHBh
-dGggY2hhcmFjdGVyICIKSC55KGEpCmlmKEouemwoYSwiLyIpKWlmKHRoaXMuYSl0aHJvdyBILmIoUC54
-WSh0K2EpKQplbHNlIHRocm93IEguYihQLkw0KHQrYSkpfSwKJFM6MTR9ClAuUloucHJvdG90eXBlPXsK
-JDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAoQy5aSixhLEMueE0sITEpfSwKJFM6NH0KUC5NRS5wcm90
-b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYixzPXRoaXMuYQp0LmErPXMuYQpzLmE9
-IiYiCnM9dC5hKz1ILmQoUC5lUChDLkYzLGEsQy54TSwhMCkpCmlmKGIhPW51bGwmJmIubGVuZ3RoIT09
-MCl7dC5hPXMrIj0iCnQuYSs9SC5kKFAuZVAoQy5GMyxiLEMueE0sITApKX19LAokUzoyMn0KUC55NS5w
-cm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0LHMKSC55KGEpCmlmKGI9PW51bGx8fHR5cGVv
-ZiBiPT0ic3RyaW5nIil0aGlzLmEuJDIoYSxILnkoYikpCmVsc2UgZm9yKHQ9Si5JVCh1LlIuYihiKSks
-cz10aGlzLmE7dC5GKCk7KXMuJDIoYSxILnkodC5nbCgpKSl9LAokUzoxM30KUC5QRS5wcm90b3R5cGU9
-ewpnbFI6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1udWxsLG49cC5jCmlmKG4hPW51bGwp
-cmV0dXJuIG4Kbj1wLmIKaWYoMD49bi5sZW5ndGgpcmV0dXJuIEguT0gobiwwKQp0PXAuYQpuPW5bMF0r
-MQpzPUMueEIuWFUodCwiPyIsbikKcj10Lmxlbmd0aAppZihzPj0wKXtxPVAudU8odCxzKzEscixDLlZD
-LCExKQpyPXN9ZWxzZSBxPW8KcmV0dXJuIHAuYz1uZXcgUC5xZSgiZGF0YSIsbyxvLG8sUC51Tyh0LG4s
-cixDLldkLCExKSxxLG8pfSwKdzpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuYgppZigwPj1zLmxlbmd0
-aClyZXR1cm4gSC5PSChzLDApCnQ9dGhpcy5hCnJldHVybiBzWzBdPT09LTE/ImRhdGE6Iit0OnR9fQpQ
-LnEzLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVWludDhBcnJheSg5Nil9LAok
-UzoyM30KUC55SS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYQppZihhPj10
-Lmxlbmd0aClyZXR1cm4gSC5PSCh0LGEpCnQ9dFthXQpKLkNNKHQsMCw5NixiKQpyZXR1cm4gdH0sCiRT
-OjI0fQpQLmM2LnByb3RvdHlwZT17CiQzOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQpmb3IodD1i
-Lmxlbmd0aCxzPWEubGVuZ3RoLHI9MDtyPHQ7KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PXMpcmV0
-dXJuIEguT0goYSxxKQphW3FdPWN9fX0KUC5xZC5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7
-dmFyIHQscyxyLHEKZm9yKHQ9Qy54Qi5XKGIsMCkscz1DLnhCLlcoYiwxKSxyPWEubGVuZ3RoO3Q8PXM7
-Kyt0KXtxPSh0Xjk2KT4+PjAKaWYocT49cilyZXR1cm4gSC5PSChhLHEpCmFbcV09Y319fQpQLlVmLnBy
-b3RvdHlwZT17CmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3Zh
-ciB0LHMKaWYodGhpcy5jPjApe3Q9dGhpcy5kCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQu
-aCgpCnM9dGhpcy5lCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIEgucFkocykKcz10KzE8cwp0
-PXN9ZWxzZSB0PSExCnJldHVybiB0fSwKZ1FEOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mCmlmKHR5cGVv
-ZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigpCnJldHVybiB0PHRoaXMucn0sCmdaODpmdW5jdGlvbigp
-e3JldHVybiB0aGlzLnI8dGhpcy5hLmxlbmd0aH0sCmdOdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmI9
-PT00JiZDLnhCLm4odGhpcy5hLCJmaWxlIil9LApndmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iPT09
-NCYmQy54Qi5uKHRoaXMuYSwiaHR0cCIpfSwKZ3FCOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYj09PTUm
-JkMueEIubih0aGlzLmEsImh0dHBzIil9LApndFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54Qi5RaSh0aGlz
-LmEsIi8iLHRoaXMuZSl9LApnRmk6ZnVuY3Rpb24oKXt2YXIgdCxzPXRoaXMscj0icGFja2FnZSIscT1z
-LmIKaWYocTw9MClyZXR1cm4iIgp0PXMueAppZih0IT1udWxsKXJldHVybiB0CmlmKHMuZ3ZoKCkpcT1z
-Lng9Imh0dHAiCmVsc2UgaWYocy5ncUIoKSl7cy54PSJodHRwcyIKcT0iaHR0cHMifWVsc2UgaWYocy5n
-TncoKSl7cy54PSJmaWxlIgpxPSJmaWxlIn1lbHNlIGlmKHE9PT03JiZDLnhCLm4ocy5hLHIpKXtzLng9
-cgpxPXJ9ZWxzZXtxPUMueEIuTmoocy5hLDAscSkKcy54PXF9cmV0dXJuIHF9LApna3U6ZnVuY3Rpb24o
-KXt2YXIgdD10aGlzLmMscz10aGlzLmIrMwpyZXR1cm4gdD5zP0MueEIuTmoodGhpcy5hLHMsdC0xKToi
-In0sCmdKZjpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmMKcmV0dXJuIHQ+MD9DLnhCLk5qKHRoaXMuYSx0
-LHRoaXMuZCk6IiJ9LApndHA6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzCmlmKHMuZ3hBKCkpe3Q9cy5k
-CmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuaCgpCnJldHVybiBQLlFBKEMueEIuTmoocy5h
-LHQrMSxzLmUpLG51bGwsbnVsbCl9aWYocy5ndmgoKSlyZXR1cm4gODAKaWYocy5ncUIoKSlyZXR1cm4g
-NDQzCnJldHVybiAwfSwKZ0lpOmZ1bmN0aW9uKGEpe3JldHVybiBDLnhCLk5qKHRoaXMuYSx0aGlzLmUs
-dGhpcy5mKX0sCmd0UDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZixzPXRoaXMucgppZih0eXBlb2YgdCE9
-PSJudW1iZXIiKXJldHVybiB0LkooKQpyZXR1cm4gdDxzP0MueEIuTmoodGhpcy5hLHQrMSxzKToiIn0s
-CmdLYTpmdW5jdGlvbigpe3ZhciB0PXRoaXMucixzPXRoaXMuYQpyZXR1cm4gdDxzLmxlbmd0aD9DLnhC
-Lkcocyx0KzEpOiIifSwKZ0ZqOmZ1bmN0aW9uKCl7dmFyIHQscyxyPXRoaXMuZSxxPXRoaXMuZixwPXRo
-aXMuYQppZihDLnhCLlFpKHAsIi8iLHIpKXtpZih0eXBlb2YgciE9PSJudW1iZXIiKXJldHVybiByLmgo
-KTsrK3J9aWYocj09cSlyZXR1cm4gQy5kbgp0PUguVk0oW10sdS5zKQpzPXIKd2hpbGUoITApe2lmKHR5
-cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuSigpCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJu
-IEgucFkocSkKaWYoIShzPHEpKWJyZWFrCmlmKEMueEIubShwLHMpPT09NDcpe0MuTm0uaSh0LEMueEIu
-TmoocCxyLHMpKQpyPXMrMX0rK3N9Qy5ObS5pKHQsQy54Qi5OaihwLHIscSkpCnJldHVybiBQLkFGKHQs
-dS5OKX0sCmdoWTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJl
-dHVybiB0LkooKQppZih0Pj10aGlzLnIpcmV0dXJuIEMuV08KcmV0dXJuIG5ldyBQLkdqKFAuV1godGhp
-cy5ndFAoKSksdS5UKX0sCmtYOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5kCmlmKHR5cGVvZiBzIT09
-Im51bWJlciIpcmV0dXJuIHMuaCgpCnQ9cysxCnJldHVybiB0K2EubGVuZ3RoPT09dGhpcy5lJiZDLnhC
-LlFpKHRoaXMuYSxhLHQpfSwKTjk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5yLHI9dC5hCmlmKHM+
-PXIubGVuZ3RoKXJldHVybiB0CnJldHVybiBuZXcgUC5VZihDLnhCLk5qKHIsMCxzKSx0LmIsdC5jLHQu
-ZCx0LmUsdC5mLHMsdC54KX0sCm5tOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGss
-aixpPXRoaXMsaD1udWxsCnUuWC5iKG51bGwpCnUuYi5iKGIpCnQ9aS5nRmkoKQpzPXQ9PT0iZmlsZSIK
-cj1pLmMKcT1yPjA/Qy54Qi5OaihpLmEsaS5iKzMscik6IiIKcD1pLmd4QSgpP2kuZ3RwKGkpOmgKcj1p
-LmMKaWYocj4wKW89Qy54Qi5OaihpLmEscixpLmQpCmVsc2Ugbz1xLmxlbmd0aCE9PTB8fHAhPW51bGx8
-fHM/IiI6aApyPWkuYQpuPWkuZgptPUMueEIuTmoocixpLmUsbikKaWYoIXMpbD1vIT1udWxsJiZtLmxl
-bmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFDLnhCLm4obSwiLyIpKW09Ii8iK20KaWYoYiE9bnVsbClr
-PVAubGUoaCwwLDAsYikKZWxzZXtsPWkucgppZih0eXBlb2YgbiE9PSJudW1iZXIiKXJldHVybiBuLkoo
-KQprPW48bD9DLnhCLk5qKHIsbisxLGwpOmh9bj1pLnIKaj1uPHIubGVuZ3RoP0MueEIuRyhyLG4rMSk6
-aApyZXR1cm4gbmV3IFAuRG4odCxxLG8scCxtLGssail9LApaSTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5tUyhQLmhLKGEpKX0sCm1TOmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBQLlVmKXJldHVybiB0
-aGlzLnUxKHRoaXMsYSkKcmV0dXJuIHRoaXMuUmUoKS5tUyhhKX0sCnUxOmZ1bmN0aW9uKGEsYil7dmFy
-IHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGU9Yi5iCmlmKGU+MClyZXR1cm4gYgp0PWIuYwpp
-Zih0PjApe3M9YS5iCmlmKHM8PTApcmV0dXJuIGIKaWYoYS5nTncoKSlyPWIuZSE9Yi5mCmVsc2UgaWYo
-YS5ndmgoKSlyPSFiLmtYKCI4MCIpCmVsc2Ugcj0hYS5ncUIoKXx8IWIua1goIjQ0MyIpCmlmKHIpe3E9
-cysxCnA9Qy54Qi5OaihhLmEsMCxxKStDLnhCLkcoYi5hLGUrMSkKZT1iLmQKaWYodHlwZW9mIGUhPT0i
-bnVtYmVyIilyZXR1cm4gZS5oKCkKbz1iLmUKaWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4gby5o
-KCkKbj1iLmYKaWYodHlwZW9mIG4hPT0ibnVtYmVyIilyZXR1cm4gbi5oKCkKcmV0dXJuIG5ldyBQLlVm
-KHAscyx0K3EsZStxLG8rcSxuK3EsYi5yK3EsYS54KX1lbHNlIHJldHVybiB0aGlzLlJlKCkubVMoYil9
-bT1iLmUKZT1iLmYKaWYobT09ZSl7dD1iLnIKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5K
-KCkKaWYoZTx0KXtzPWEuZgppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLkhOKCkKcT1zLWUK
-cmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAscykrQy54Qi5HKGIuYSxlKSxhLmIsYS5jLGEuZCxh
-LmUsZStxLHQrcSxhLngpfWU9Yi5hCmlmKHQ8ZS5sZW5ndGgpe3M9YS5yCnJldHVybiBuZXcgUC5VZihD
-LnhCLk5qKGEuYSwwLHMpK0MueEIuRyhlLHQpLGEuYixhLmMsYS5kLGEuZSxhLmYsdCsocy10KSxhLngp
-fXJldHVybiBhLk45KCl9dD1iLmEKaWYoQy54Qi5RaSh0LCIvIixtKSl7cz1hLmUKaWYodHlwZW9mIHMh
-PT0ibnVtYmVyIilyZXR1cm4gcy5ITigpCmlmKHR5cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFko
-bSkKcT1zLW0KcD1DLnhCLk5qKGEuYSwwLHMpK0MueEIuRyh0LG0pCmlmKHR5cGVvZiBlIT09Im51bWJl
-ciIpcmV0dXJuIGUuaCgpCnJldHVybiBuZXcgUC5VZihwLGEuYixhLmMsYS5kLHMsZStxLGIucitxLGEu
-eCl9bD1hLmUKaz1hLmYKaWYobD09ayYmYS5jPjApe2Zvcig7Qy54Qi5RaSh0LCIuLi8iLG0pOyl7aWYo
-dHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gbS5oKCkKbSs9M31pZih0eXBlb2YgbCE9PSJudW1iZXIi
-KXJldHVybiBsLkhOKCkKaWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gSC5wWShtKQpxPWwtbSsx
-CnA9Qy54Qi5OaihhLmEsMCxsKSsiLyIrQy54Qi5HKHQsbSkKaWYodHlwZW9mIGUhPT0ibnVtYmVyIily
-ZXR1cm4gZS5oKCkKcmV0dXJuIG5ldyBQLlVmKHAsYS5iLGEuYyxhLmQsbCxlK3EsYi5yK3EsYS54KX1q
-PWEuYQpmb3IoaT1sO0MueEIuUWkoaiwiLi4vIixpKTspe2lmKHR5cGVvZiBpIT09Im51bWJlciIpcmV0
-dXJuIGkuaCgpCmkrPTN9aD0wCndoaWxlKCEwKXtpZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBt
-LmgoKQpnPW0rMwppZih0eXBlb2YgZSE9PSJudW1iZXIiKXJldHVybiBILnBZKGUpCmlmKCEoZzw9ZSYm
-Qy54Qi5RaSh0LCIuLi8iLG0pKSlicmVhazsrK2gKbT1nfWY9IiIKd2hpbGUoITApe2lmKHR5cGVvZiBr
-IT09Im51bWJlciIpcmV0dXJuIGsub3MoKQppZih0eXBlb2YgaSE9PSJudW1iZXIiKXJldHVybiBILnBZ
-KGkpCmlmKCEoaz5pKSlicmVhazstLWsKaWYoQy54Qi5tKGosayk9PT00Nyl7aWYoaD09PTApe2Y9Ii8i
-CmJyZWFrfS0taApmPSIvIn19aWYoaz09PWkmJmEuYjw9MCYmIUMueEIuUWkoaiwiLyIsbCkpe20tPWgq
-MwpmPSIifXE9ay1tK2YubGVuZ3RoCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGosMCxrKStmK0MueEIu
-Ryh0LG0pLGEuYixhLmMsYS5kLGwsZStxLGIucitxLGEueCl9LAp0NDpmdW5jdGlvbigpe3ZhciB0LHMs
-cixxLHA9dGhpcwppZihwLmI+PTAmJiFwLmdOdygpKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFj
-dCBhIGZpbGUgcGF0aCBmcm9tIGEgIitILmQocC5nRmkoKSkrIiBVUkkiKSkKdD1wLmYKcz1wLmEKaWYo
-dHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5KKCkKaWYodDxzLmxlbmd0aCl7aWYodDxwLnIpdGhy
-b3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1
-ZXJ5IGNvbXBvbmVudCIpKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGgg
-ZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50IikpfXI9JC53USgpCmlmKEgub1Qocikp
-dD1QLm1uKHApCmVsc2V7cT1wLmQKaWYodHlwZW9mIHEhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShxKQpp
-ZihwLmM8cSlILnZoKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZy
-b20gYSBmaWxlIFVSSSB3aXRoIGFuIGF1dGhvcml0eSIpKQp0PUMueEIuTmoocyxwLmUsdCl9cmV0dXJu
-IHR9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy55CnJldHVybiB0PT1udWxsP3RoaXMueT1DLnhC
-LmdpTyh0aGlzLmEpOnR9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKaWYodGhp
-cz09PWIpcmV0dXJuITAKcmV0dXJuIHUuRC5jKGIpJiZ0aGlzLmE9PT1iLncoMCl9LApSZTpmdW5jdGlv
-bigpe3ZhciB0PXRoaXMscz1udWxsLHI9dC5nRmkoKSxxPXQuZ2t1KCkscD10LmM+MD90LmdKZih0KTpz
-LG89dC5neEEoKT90Lmd0cCh0KTpzLG49dC5hLG09dC5mLGw9Qy54Qi5OaihuLHQuZSxtKSxrPXQucgpp
-Zih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBtLkooKQptPW08az90Lmd0UCgpOnMKcmV0dXJuIG5l
-dyBQLkRuKHIscSxwLG8sbCxtLGs8bi5sZW5ndGg/dC5nS2EoKTpzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHRoaXMuYX0sCiRpaUQ6MX0KUC5xZS5wcm90b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5H
-aC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaUdoOjF9ClcuZlku
-cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfX0KVy5uQi5wcm90b3R5cGU9
-eyRpbkI6MX0KVy5Bei5wcm90b3R5cGU9eyRpQXo6MX0KVy5RUC5wcm90b3R5cGU9eyRpUVA6MX0KVy5u
-eC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLm9KLnByb3RvdHlw
-ZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClcuaWQucHJvdG90eXBlPXt9ClcuUUYu
-cHJvdG90eXBlPXt9ClcuTmgucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEp
-fX0KVy5JQi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJSZWN0YW5nbGUgKCIrSC5kKGEu
-bGVmdCkrIiwgIitILmQoYS50b3ApKyIpICIrSC5kKGEud2lkdGgpKyIgeCAiK0guZChhLmhlaWdodCl9
-LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIHUucS5jKGIpJiZhLmxl
-ZnQ9PT1iLmxlZnQmJmEudG9wPT09Yi50b3AmJmEud2lkdGg9PT1iLndpZHRoJiZhLmhlaWdodD09PWIu
-aGVpZ2h0fSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBXLnJFKEMuQ0QuZ2lPKGEubGVmdCksQy5DRC5n
-aU8oYS50b3ApLEMuQ0QuZ2lPKGEud2lkdGgpLEMuQ0QuZ2lPKGEuaGVpZ2h0KSl9LAokaXRuOjF9Clcu
-bjcucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy53ei5wcm90b3R5
-cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXt2
-YXIgdApILlNjKGIpCnQ9dGhpcy5hCmlmKGI8MHx8Yj49dC5sZW5ndGgpcmV0dXJuIEguT0godCxiKQpy
-ZXR1cm4gdGhpcy4kdGkuZC5iKHRbYl0pfSwKWTpmdW5jdGlvbihhLGIsYyl7dGhpcy4kdGkuZC5iKGMp
-CnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IGxpc3QiKSl9fQpXLmN2LnByb3RvdHlwZT17CmdR
-ZzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuaTcoYSl9LApnRDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3
-IFcuSTQoYSl9LApzRDpmdW5jdGlvbihhLGIpe3ZhciB0CnUuWC5iKGIpCnQ9dGhpcy5nRChhKQp0LlYx
-KDApCnQuRlYoMCxiKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKdG46ZnVuY3Rp
-b24oYSl7dmFyIHQ9ISFhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQKaWYodClhLnNjcm9sbEludG9WaWV3
-SWZOZWVkZWQoKQplbHNlIGEuc2Nyb2xsSW50b1ZpZXcoKX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3Zh
-ciB0LHMscixxCmlmKGM9PW51bGwpe2lmKGQ9PW51bGwpe3Q9JC5sdAppZih0PT1udWxsKXt0PUguVk0o
-W10sdS5rKQpzPW5ldyBXLnZEKHQpCkMuTm0uaSh0LFcuVHcobnVsbCkpCkMuTm0uaSh0LFcuQmwoKSkK
-JC5sdD1zCmQ9c31lbHNlIGQ9dH10PSQuRVUKaWYodD09bnVsbCl7dD1uZXcgVy5LbyhkKQokLkVVPXQK
-Yz10fWVsc2V7dC5hPWQKYz10fX1lbHNlIGlmKGQhPW51bGwpdGhyb3cgSC5iKFAueFkoInZhbGlkYXRv
-ciBjYW4gb25seSBiZSBwYXNzZWQgaWYgdHJlZVNhbml0aXplciBpcyBudWxsIikpCmlmKCQueG89PW51
-bGwpe3Q9ZG9jdW1lbnQKcz10LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikKJC54
-bz1zCiQuQk89cy5jcmVhdGVSYW5nZSgpCnM9JC54by5jcmVhdGVFbGVtZW50KCJiYXNlIikKdS5jUi5i
-KHMpCnMuaHJlZj10LmJhc2VVUkkKJC54by5oZWFkLmFwcGVuZENoaWxkKHMpfXQ9JC54bwppZih0LmJv
-ZHk9PW51bGwpe3M9dC5jcmVhdGVFbGVtZW50KCJib2R5IikKdC5ib2R5PXUuWS5iKHMpfXQ9JC54bwpp
-Zih1LlkuYyhhKSlyPXQuYm9keQplbHNle3I9dC5jcmVhdGVFbGVtZW50KGEudGFnTmFtZSkKJC54by5i
-b2R5LmFwcGVuZENoaWxkKHIpfWlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5S
-YW5nZS5wcm90b3R5cGUmJiFDLk5tLnRnKEMuU3EsYS50YWdOYW1lKSl7JC5CTy5zZWxlY3ROb2RlQ29u
-dGVudHMocikKcT0kLkJPLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChiKX1lbHNle3IuaW5uZXJIVE1M
-PWIKcT0kLnhvLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpmb3IoO3Q9ci5maXJzdENoaWxkLHQhPW51
-bGw7KXEuYXBwZW5kQ2hpbGQodCl9dD0kLnhvLmJvZHkKaWYocj09bnVsbD90IT1udWxsOnIhPT10KUou
-THQocikKYy5QbihxKQpkb2N1bWVudC5hZG9wdE5vZGUocSkKcmV0dXJuIHF9LApBSDpmdW5jdGlvbihh
-LGIsYyl7cmV0dXJuIHRoaXMucjYoYSxiLGMsbnVsbCl9LApzaGY6ZnVuY3Rpb24oYSxiKXt0aGlzLllD
-KGEsYil9LApwazpmdW5jdGlvbihhLGIsYyl7YS50ZXh0Q29udGVudD1udWxsCmEuYXBwZW5kQ2hpbGQo
-dGhpcy5yNihhLGIsbnVsbCxjKSl9LApZQzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnBrKGEsYixu
-dWxsKX0sCmdWbDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuQ3EoYSwiY2xpY2siLCExLHUuUSl9LAok
-aWN2OjEsCmduczpmdW5jdGlvbihhKXtyZXR1cm4gYS50YWdOYW1lfX0KVy5Ddi5wcm90b3R5cGU9ewok
-MTpmdW5jdGlvbihhKXtyZXR1cm4gdS5oLmModS5BLmIoYSkpfSwKJFM6MjV9ClcuZWEucHJvdG90eXBl
-PXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT246ZnVuY3Rpb24oYSxiLGMsZCl7dS5VLmIoYykKaWYo
-YyE9bnVsbCl0aGlzLnYoYSxiLGMsZCl9LApCOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5Pbihh
-LGIsYyxudWxsKX0sCnY6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcihi
-LEgudFIodS5VLmIoYyksMSksZCl9LAokaUQwOjF9ClcuVDUucHJvdG90eXBlPXskaVQ1OjF9ClcuaDQu
-cHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5ici5wcm90b3R5cGU9
-ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLlZiLnByb3RvdHlwZT17fQpXLk83LnBy
-b3RvdHlwZT17CmVvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRpTzc6
-MX0KVy5iVS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5zZXRSZXF1ZXN0SGVhZGVy
-KEgueShhKSxILnkoYikpfSwKJFM6OX0KVy5oSC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIg
-dCxzLHIscSxwCnUucC5iKGEpCnQ9dGhpcy5hCnM9dC5zdGF0dXMKaWYodHlwZW9mIHMhPT0ibnVtYmVy
-IilyZXR1cm4gcy50QigpCnI9cz49MjAwJiZzPDMwMApxPXM+MzA3JiZzPDQwMApzPXJ8fHM9PT0wfHxz
-PT09MzA0fHxxCnA9dGhpcy5iCmlmKHMpcC5hTSgwLHQpCmVsc2UgcC5wbShhKX0sCiRTOjI3fQpXLndh
-LnByb3RvdHlwZT17fQpXLlNnLnByb3RvdHlwZT17JGlTZzoxfQpXLnU4LnByb3RvdHlwZT17CmdEcjpm
-dW5jdGlvbihhKXtpZigib3JpZ2luIiBpbiBhKXJldHVybiBhLm9yaWdpbgpyZXR1cm4gSC5kKGEucHJv
-dG9jb2wpKyIvLyIrSC5kKGEuaG9zdCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAok
-aXU4OjF9ClcuQWoucHJvdG90eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4OmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMuYSxzPXQuY2hpbGROb2Rlcy5sZW5ndGgKaWYocz09PTApdGhyb3cgSC5iKFAu
-UFYoIk5vIGVsZW1lbnRzIikpCmlmKHM+MSl0aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVt
-ZW50IikpCnJldHVybiB0LmZpcnN0Q2hpbGR9LApGVjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxCnUu
-ZWguYihiKQp0PWIuYQpzPXRoaXMuYQppZih0IT09cylmb3Iocj10LmNoaWxkTm9kZXMubGVuZ3RoLHE9
-MDtxPHI7KytxKXMuYXBwZW5kQ2hpbGQodC5maXJzdENoaWxkKQpyZXR1cm59LApZOmZ1bmN0aW9uKGEs
-YixjKXt2YXIgdCxzCnUuQS5iKGMpCnQ9dGhpcy5hCnM9dC5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49cy5s
-ZW5ndGgpcmV0dXJuIEguT0gocyxiKQp0LnJlcGxhY2VDaGlsZChjLHNbYl0pfSwKZ2t6OmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMuYS5jaGlsZE5vZGVzCnJldHVybiBuZXcgVy5XOSh0LHQubGVuZ3RoLEguekso
-dCkuQygiVzk8R20uRT4iKSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNoaWxkTm9kZXMu
-bGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe3ZhciB0CkguU2MoYikKdD10aGlzLmEuY2hpbGROb2Rlcwpp
-ZihiPDB8fGI+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsYikKcmV0dXJuIHRbYl19fQpXLnVILnByb3Rv
-dHlwZT17CndnOmZ1bmN0aW9uKGEpe3ZhciB0PWEucGFyZW50Tm9kZQppZih0IT1udWxsKXQucmVtb3Zl
-Q2hpbGQoYSl9LApENDpmdW5jdGlvbihhKXt2YXIgdApmb3IoO3Q9YS5maXJzdENoaWxkLHQhPW51bGw7
-KWEucmVtb3ZlQ2hpbGQodCl9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0PWEubm9kZVZhbHVlCnJldHVybiB0
-PT1udWxsP3RoaXMuVShhKTp0fSwKJGl1SDoxfQpXLkJILnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEp
-e3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCmlmKGI+Pj4wIT09Ynx8Yj49
-YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19LApZ
-OmZ1bmN0aW9uKGEsYixjKXt1LkEuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVt
-ZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVu
-Z3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpX
-LlNOLnByb3RvdHlwZT17fQpXLmV3LnByb3RvdHlwZT17JGlldzoxfQpXLmxwLnByb3RvdHlwZT17CmdB
-OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVGIucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHQscwppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFu
-Z2UucHJvdG90eXBlKXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnQ9Vy5VOSgiPHRhYmxlPiIrSC5kKGIp
-KyI8L3RhYmxlPiIsYyxkKQpzPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpzLnRvU3Ry
-aW5nCnQudG9TdHJpbmcKbmV3IFcuZTcocykuRlYoMCxuZXcgVy5lNyh0KSkKcmV0dXJuIHN9fQpXLkl2
-LnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxCmlmKCJjcmVhdGVDb250
-ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxi
-LGMsZCkKdD1kb2N1bWVudApzPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnQ9Qy5JZS5yNih0LmNy
-ZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnQudG9TdHJpbmcKdD1uZXcgVy5lNyh0KQpyPXQuZ3I4
-KHQpCnIudG9TdHJpbmcKdD1uZXcgVy5lNyhyKQpxPXQuZ3I4KHQpCnMudG9TdHJpbmcKcS50b1N0cmlu
-ZwpuZXcgVy5lNyhzKS5GVigwLG5ldyBXLmU3KHEpKQpyZXR1cm4gc319ClcuQlQucHJvdG90eXBlPXsK
-cjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQi
-IGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKdD1kb2N1bWVu
-dApzPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnQ9Qy5JZS5yNih0LmNyZWF0ZUVsZW1lbnQoInRh
-YmxlIiksYixjLGQpCnQudG9TdHJpbmcKdD1uZXcgVy5lNyh0KQpyPXQuZ3I4KHQpCnMudG9TdHJpbmcK
-ci50b1N0cmluZwpuZXcgVy5lNyhzKS5GVigwLG5ldyBXLmU3KHIpKQpyZXR1cm4gc319ClcueVkucHJv
-dG90eXBlPXsKcGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMKYS50ZXh0Q29udGVudD1udWxsCnQ9YS5j
-b250ZW50CnQudG9TdHJpbmcKSi5iVCh0KQpzPXRoaXMucjYoYSxiLG51bGwsYykKYS5jb250ZW50LmFw
-cGVuZENoaWxkKHMpfSwKWUM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wayhhLGIsbnVsbCl9LAok
-aXlZOjF9ClcudzYucHJvdG90eXBlPXt9ClcuSzUucHJvdG90eXBlPXsKZ21XOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBhLmxvY2F0aW9ufSwKJGlLNToxLAokaXY2OjF9ClcuQ20ucHJvdG90eXBlPXskaUNtOjF9Clcu
-Q1EucHJvdG90eXBlPXskaUNROjF9ClcudzQucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4i
-UmVjdGFuZ2xlICgiK0guZChhLmxlZnQpKyIsICIrSC5kKGEudG9wKSsiKSAiK0guZChhLndpZHRoKSsi
-IHggIitILmQoYS5oZWlnaHQpfSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJl
-dHVybiB1LnEuYyhiKSYmYS5sZWZ0PT09Yi5sZWZ0JiZhLnRvcD09PWIudG9wJiZhLndpZHRoPT09Yi53
-aWR0aCYmYS5oZWlnaHQ9PT1iLmhlaWdodH0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gVy5yRShDLkNE
-LmdpTyhhLmxlZnQpLEMuQ0QuZ2lPKGEudG9wKSxDLkNELmdpTyhhLndpZHRoKSxDLkNELmdpTyhhLmhl
-aWdodCkpfX0KVy5yaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApx
-OmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQ
-LkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7dS5B
-LmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlz
-dC4iKSl9LApFOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIp
-CnJldHVybiBhW2JdfSwKJGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5EOS5wcm90b3R5cGU9ewpLOmZ1
-bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscAp1LkUuYihiKQpmb3IodD10aGlzLmdWKCkscz10Lmxlbmd0
-aCxyPXRoaXMuYSxxPTA7cTx0Lmxlbmd0aDt0Lmxlbmd0aD09PXN8fCgwLEgubGspKHQpLCsrcSl7cD10
-W3FdCmIuJDIocCxyLmdldEF0dHJpYnV0ZShwKSl9fSwKZ1Y6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxw
-PXRoaXMuYS5hdHRyaWJ1dGVzLG89SC5WTShbXSx1LnMpCmZvcih0PXAubGVuZ3RoLHM9dS5oOSxyPTA7
-cjx0Oysrcil7aWYocj49cC5sZW5ndGgpcmV0dXJuIEguT0gocCxyKQpxPXMuYihwW3JdKQppZihxLm5h
-bWVzcGFjZVVSST09bnVsbClDLk5tLmkobyxxLm5hbWUpfXJldHVybiBvfX0KVy5pNy5wcm90b3R5cGU9
-ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5nZXRBdHRyaWJ1dGUoSC55KGIpKX0sClk6ZnVu
-Y3Rpb24oYSxiLGMpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoYixjKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVy
-biB0aGlzLmdWKCkubGVuZ3RofX0KVy5TeS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJu
-IHRoaXMuYS5hLmdldEF0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuTyhILnkoYikpKX0sClk6ZnVuY3Rpb24o
-YSxiLGMpe3RoaXMuYS5hLnNldEF0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuTyhiKSxjKX0sCks6ZnVuY3Rp
-b24oYSxiKXt0aGlzLmEuSygwLG5ldyBXLktTKHRoaXMsdS5FLmIoYikpKX0sCmdWOmZ1bmN0aW9uKCl7
-dmFyIHQ9SC5WTShbXSx1LnMpCnRoaXMuYS5LKDAsbmV3IFcuQTModGhpcyx0KSkKcmV0dXJuIHR9LApn
-QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH0sCms6ZnVuY3Rpb24oYSl7dmFyIHQs
-cyxyPUguVk0oYS5zcGxpdCgiLSIpLHUucykKZm9yKHQ9MTt0PHIubGVuZ3RoOysrdCl7cz1yW3RdCmlm
-KHMubGVuZ3RoPjApQy5ObS5ZKHIsdCxzWzBdLnRvVXBwZXJDYXNlKCkrSi5LVihzLDEpKX1yZXR1cm4g
-Qy5ObS5IKHIsIiIpfSwKTzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwCmZvcih0PWEubGVuZ3RoLHM9
-MCxyPSIiO3M8dDsrK3Mpe3E9YVtzXQpwPXEudG9Mb3dlckNhc2UoKQpyPShxIT09cCYmcz4wP3IrIi0i
-OnIpK3B9cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9fQpXLktTLnByb3RvdHlwZT17CiQyOmZ1
-bmN0aW9uKGEsYil7aWYoSi5yWShhKS5uKGEsImRhdGEtIikpdGhpcy5iLiQyKHRoaXMuYS5rKEMueEIu
-RyhhLDUpKSxiKX0sCiRTOjl9ClcuQTMucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtpZihKLnJZ
-KGEpLm4oYSwiZGF0YS0iKSlDLk5tLmkodGhpcy5iLHRoaXMuYS5rKEMueEIuRyhhLDUpKSl9LAokUzo5
-fQpXLkk0LnByb3RvdHlwZT17ClA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwPVAuTHModS5OKQpmb3Io
-dD10aGlzLmEuY2xhc3NOYW1lLnNwbGl0KCIgIikscz10Lmxlbmd0aCxyPTA7cjxzOysrcil7cT1KLlQw
-KHRbcl0pCmlmKHEubGVuZ3RoIT09MClwLmkoMCxxKX1yZXR1cm4gcH0sClg6ZnVuY3Rpb24oYSl7dGhp
-cy5hLmNsYXNzTmFtZT11LkMuYihhKS5IKDAsIiAiKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz
-LmEuY2xhc3NMaXN0Lmxlbmd0aH0sClYxOmZ1bmN0aW9uKGEpe3RoaXMuYS5jbGFzc05hbWU9IiJ9LAp0
-ZzpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYS5jbGFzc0xpc3QuY29udGFpbnMoYikKcmV0dXJuIHR9
-LAppOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxzPXQuY29udGFpbnMoYikKdC5h
-ZGQoYikKcmV0dXJuIXN9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxzPXQu
-Y29udGFpbnMoYikKdC5yZW1vdmUoYikKcmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe1cuVE4odGhp
-cy5hLHUuWC5iKGIpKX19ClcuRmsucHJvdG90eXBlPXt9ClcuUk8ucHJvdG90eXBlPXt9ClcuQ3EucHJv
-dG90eXBlPXt9ClcueEMucHJvdG90eXBlPXt9Clcudk4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7
-cmV0dXJuIHRoaXMuYS4kMSh1LkIuYihhKSl9LAokUzoyOH0KVy5KUS5wcm90b3R5cGU9ewpDWTpmdW5j
-dGlvbihhKXt2YXIgdAppZigkLm9yLmE9PT0wKXtmb3IodD0wO3Q8MjYyOysrdCkkLm9yLlkoMCxDLmNt
-W3RdLFcucFMoKSkKZm9yKHQ9MDt0PDEyOysrdCkkLm9yLlkoMCxDLkJJW3RdLFcuVjQoKSl9fSwKaTA6
-ZnVuY3Rpb24oYSl7cmV0dXJuICQuQU4oKS50ZygwLFcuclMoYSkpfSwKRWI6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciB0PSQub3IucSgwLEguZChXLnJTKGEpKSsiOjoiK2IpCmlmKHQ9PW51bGwpdD0kLm9yLnEoMCwi
-Kjo6IitiKQppZih0PT1udWxsKXJldHVybiExCnJldHVybiBILnhkKHQuJDQoYSxiLGMsdGhpcykpfSwK
-JGlrRjoxfQpXLkdtLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuVzkoYSx0
-aGlzLmdBKGEpLEgueksoYSkuQygiVzk8R20uRT4iKSl9fQpXLnZELnByb3RvdHlwZT17CmkwOmZ1bmN0
-aW9uKGEpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5VdihhKSl9LApFYjpmdW5jdGlvbihhLGIs
-Yyl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLkVnKGEsYixjKSl9LAokaWtGOjF9ClcuVXYucHJv
-dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHUuZS5iKGEpLmkwKHRoaXMuYSl9LAokUzoxNX0K
-Vy5FZy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5lLmIoYSkuRWIodGhpcy5hLHRo
-aXMuYix0aGlzLmMpfSwKJFM6MTV9ClcubTYucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiLGMsZCl7
-dmFyIHQscyxyCnRoaXMuYS5GVigwLGMpCnQ9Yi5ldigwLG5ldyBXLkVvKCkpCnM9Yi5ldigwLG5ldyBX
-LldrKCkpCnRoaXMuYi5GVigwLHQpCnI9dGhpcy5jCnIuRlYoMCxDLmRuKQpyLkZWKDAscyl9LAppMDpm
-dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnRnKDAsVy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7
-dmFyIHQ9dGhpcyxzPVcuclMoYSkscj10LmMKaWYoci50ZygwLEguZChzKSsiOjoiK2IpKXJldHVybiB0
-LmQuRHQoYykKZWxzZSBpZihyLnRnKDAsIio6OiIrYikpcmV0dXJuIHQuZC5EdChjKQplbHNle3I9dC5i
-CmlmKHIudGcoMCxILmQocykrIjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHIudGcoMCwiKjo6IitiKSly
-ZXR1cm4hMAplbHNlIGlmKHIudGcoMCxILmQocykrIjo6KiIpKXJldHVybiEwCmVsc2UgaWYoci50Zygw
-LCIqOjoqIikpcmV0dXJuITB9cmV0dXJuITF9LAokaWtGOjF9ClcuRW8ucHJvdG90eXBlPXsKJDE6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIUMuTm0udGcoQy5CSSxILnkoYSkpfSwKJFM6OH0KVy5Xay5wcm90b3R5cGU9
-ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gQy5ObS50ZyhDLkJJLEgueShhKSl9LAokUzo4fQpXLmN0LnBy
-b3RvdHlwZT17CkViOmZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLmpGKGEsYixjKSlyZXR1cm4hMAppZihi
-PT09InRlbXBsYXRlIiYmYz09PSIiKXJldHVybiEwCmlmKGEuZ2V0QXR0cmlidXRlKCJ0ZW1wbGF0ZSIp
-PT09IiIpcmV0dXJuIHRoaXMuZS50ZygwLGIpCnJldHVybiExfX0KVy5JQS5wcm90b3R5cGU9ewokMTpm
-dW5jdGlvbihhKXtyZXR1cm4iVEVNUExBVEU6OiIrSC5kKEgueShhKSl9LAokUzo0fQpXLk93LnByb3Rv
-dHlwZT17CmkwOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKHUuZXcuYyhhKSlyZXR1cm4hMQp0PXUuZzcuYyhh
-KQppZih0JiZXLnJTKGEpPT09ImZvcmVpZ25PYmplY3QiKXJldHVybiExCmlmKHQpcmV0dXJuITAKcmV0
-dXJuITF9LApFYjpmdW5jdGlvbihhLGIsYyl7aWYoYj09PSJpcyJ8fEMueEIubihiLCJvbiIpKXJldHVy
-biExCnJldHVybiB0aGlzLmkwKGEpfSwKJGlrRjoxfQpXLlc5LnByb3RvdHlwZT17CkY6ZnVuY3Rpb24o
-KXt2YXIgdD10aGlzLHM9dC5jKzEscj10LmIKaWYoczxyKXt0LnNwKEoudzIodC5hLHMpKQp0LmM9cwpy
-ZXR1cm4hMH10LnNwKG51bGwpCnQuYz1yCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
-cy5kfSwKc3A6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KVy5kVy5w
-cm90b3R5cGU9ewpnbVc6ZnVuY3Rpb24oYSl7cmV0dXJuIFcuelgodGhpcy5hLmxvY2F0aW9uKX0sCiRp
-RDA6MSwKJGl2NjoxfQpXLkZiLnByb3RvdHlwZT17fQpXLmtGLnByb3RvdHlwZT17fQpXLm1rLnByb3Rv
-dHlwZT17JGl5MDoxfQpXLktvLnByb3RvdHlwZT17ClBuOmZ1bmN0aW9uKGEpe25ldyBXLmZtKHRoaXMp
-LiQyKGEsbnVsbCl9LApFUDpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpSi5MdChhKQplbHNlIGIucmVt
-b3ZlQ2hpbGQoYSl9LApJNDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbz0hMCxuPW51bGwsbT1u
-dWxsCnRyeXtuPUouaWcoYSkKbT1uLmEuZ2V0QXR0cmlidXRlKCJpcyIpCnUuaC5iKGEpCnQ9ZnVuY3Rp
-b24oYyl7aWYoIShjLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApKXJldHVybiB0cnVl
-CnZhciBsPWMuY2hpbGROb2RlcwppZihjLmxhc3RDaGlsZCYmYy5sYXN0Q2hpbGQhPT1sW2wubGVuZ3Ro
-LTFdKXJldHVybiB0cnVlCmlmKGMuY2hpbGRyZW4paWYoIShjLmNoaWxkcmVuIGluc3RhbmNlb2YgSFRN
-TENvbGxlY3Rpb258fGMuY2hpbGRyZW4gaW5zdGFuY2VvZiBOb2RlTGlzdCkpcmV0dXJuIHRydWUKdmFy
-IGs9MAppZihjLmNoaWxkcmVuKWs9Yy5jaGlsZHJlbi5sZW5ndGgKZm9yKHZhciBqPTA7ajxrO2orKyl7
-dmFyIGk9Yy5jaGlsZHJlbltqXQppZihpLmlkPT0nYXR0cmlidXRlcyd8fGkubmFtZT09J2F0dHJpYnV0
-ZXMnfHxpLmlkPT0nbGFzdENoaWxkJ3x8aS5uYW1lPT0nbGFzdENoaWxkJ3x8aS5pZD09J2NoaWxkcmVu
-J3x8aS5uYW1lPT0nY2hpbGRyZW4nKXJldHVybiB0cnVlfXJldHVybiBmYWxzZX0oYSkKbz1ILm9UKHQp
-PyEwOiEoYS5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWROb2RlTWFwKX1jYXRjaChxKXtILlJ1KHEp
-fXM9ImVsZW1lbnQgdW5wcmludGFibGUiCnRyeXtzPUouaihhKX1jYXRjaChxKXtILlJ1KHEpfXRyeXty
-PVcuclMoYSkKdGhpcy5rUih1LmguYihhKSxiLG8scyxyLHUuRy5iKG4pLEgueShtKSl9Y2F0Y2gocSl7
-aWYoSC5SdShxKSBpbnN0YW5jZW9mIFAudSl0aHJvdyBxCmVsc2V7dGhpcy5FUChhLGIpCndpbmRvdwpw
-PSJSZW1vdmluZyBjb3JydXB0ZWQgZWxlbWVudCAiK0guZChzKQppZih0eXBlb2YgY29uc29sZSE9InVu
-ZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihwKX19fSwKa1I6ZnVuY3Rpb24oYSxiLGMsZCxlLGYs
-Zyl7dmFyIHQscyxyLHEscCxvLG49dGhpcwppZihjKXtuLkVQKGEsYikKd2luZG93CnQ9IlJlbW92aW5n
-IGVsZW1lbnQgZHVlIHRvIGNvcnJ1cHRlZCBhdHRyaWJ1dGVzIG9uIDwiK2QrIj4iCmlmKHR5cGVvZiBj
-b25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHQpCnJldHVybn1pZighbi5hLmkw
-KGEpKXtuLkVQKGEsYikKd2luZG93CnQ9IlJlbW92aW5nIGRpc2FsbG93ZWQgZWxlbWVudCA8IitILmQo
-ZSkrIj4gZnJvbSAiK0guZChiKQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNv
-bnNvbGUud2Fybih0KQpyZXR1cm59aWYoZyE9bnVsbClpZighbi5hLkViKGEsImlzIixnKSl7bi5FUChh
-LGIpCndpbmRvdwp0PSJSZW1vdmluZyBkaXNhbGxvd2VkIHR5cGUgZXh0ZW5zaW9uIDwiK0guZChlKSsn
-IGlzPSInK2crJyI+JwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
-d2Fybih0KQpyZXR1cm59dD1mLmdWKCkKcz1ILlZNKHQuc2xpY2UoMCksSC50Nih0KS5DKCJqZDwxPiIp
-KQpmb3Iocj1mLmdWKCkubGVuZ3RoLTEsdD1mLmE7cj49MDstLXIpe2lmKHI+PXMubGVuZ3RoKXJldHVy
-biBILk9IKHMscikKcT1zW3JdCnA9bi5hCm89Si5jSChxKQpILnkocSkKaWYoIXAuRWIoYSxvLHQuZ2V0
-QXR0cmlidXRlKHEpKSl7d2luZG93CnA9IlJlbW92aW5nIGRpc2FsbG93ZWQgYXR0cmlidXRlIDwiK0gu
-ZChlKSsiICIrcSsnPSInK0guZCh0LmdldEF0dHJpYnV0ZShxKSkrJyI+JwppZih0eXBlb2YgY29uc29s
-ZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihwKQp0LnJlbW92ZUF0dHJpYnV0ZShxKX19
-aWYodS5hVy5jKGEpKW4uUG4oYS5jb250ZW50KX0sCiRpb246MX0KVy5mbS5wcm90b3R5cGU9ewokMjpm
-dW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9dGhpcy5hCnN3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6
-cC5JNChhLGIpCmJyZWFrCmNhc2UgODpjYXNlIDExOmNhc2UgMzpjYXNlIDQ6YnJlYWsKZGVmYXVsdDpw
-LkVQKGEsYil9dD1hLmxhc3RDaGlsZApmb3IocD11LkE7bnVsbCE9dDspe3M9bnVsbAp0cnl7cz10LnBy
-ZXZpb3VzU2libGluZ31jYXRjaChyKXtILlJ1KHIpCnE9cC5iKHQpCmEucmVtb3ZlQ2hpbGQocSkKdD1u
-dWxsCnM9YS5sYXN0Q2hpbGR9aWYodCE9bnVsbCl0aGlzLiQyKHQsYSkKdD1wLmIocyl9fSwKJFM6Mzl9
-ClcuTGUucHJvdG90eXBlPXt9ClcuSzcucHJvdG90eXBlPXt9ClcuckIucHJvdG90eXBlPXt9ClcuWFcu
-cHJvdG90eXBlPXt9Clcub2EucHJvdG90eXBlPXt9ClAuaUoucHJvdG90eXBlPXsKVkg6ZnVuY3Rpb24o
-YSl7dmFyIHQscz10aGlzLmEscj1zLmxlbmd0aApmb3IodD0wO3Q8cjsrK3QpaWYoc1t0XT09PWEpcmV0
-dXJuIHQKQy5ObS5pKHMsYSkKQy5ObS5pKHRoaXMuYixudWxsKQpyZXR1cm4gcn0sClB2OmZ1bmN0aW9u
-KGEpe3ZhciB0LHMscixxPXRoaXMscD17fQppZihhPT1udWxsKXJldHVybiBhCmlmKEgubChhKSlyZXR1
-cm4gYQppZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJl
-dHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLmlQKXJldHVybiBuZXcgRGF0ZShhLmEpCmlmKHUuZnYuYyhh
-KSl0aHJvdyBILmIoUC5TWSgic3RydWN0dXJlZCBjbG9uZSBvZiBSZWdFeHAiKSkKaWYodS5jOC5jKGEp
-KXJldHVybiBhCmlmKHUuZC5jKGEpKXJldHVybiBhCmlmKHUuSS5jKGEpKXJldHVybiBhCnQ9dS5kRC5j
-KGEpfHwhMQppZih0KXJldHVybiBhCmlmKHUuRy5jKGEpKXtzPXEuVkgoYSkKdD1xLmIKaWYocz49dC5s
-ZW5ndGgpcmV0dXJuIEguT0godCxzKQpyPXAuYT10W3NdCmlmKHIhPW51bGwpcmV0dXJuIHIKcj17fQpw
-LmE9cgpDLk5tLlkodCxzLHIpCmEuSygwLG5ldyBQLmxSKHAscSkpCnJldHVybiBwLmF9aWYodS5qLmMo
-YSkpe3M9cS5WSChhKQpwPXEuYgppZihzPj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHMpCnI9cFtzXQpp
-ZihyIT1udWxsKXJldHVybiByCnJldHVybiBxLmVrKGEscyl9aWYodS5lSC5jKGEpKXtzPXEuVkgoYSkK
-dD1xLmIKaWYocz49dC5sZW5ndGgpcmV0dXJuIEguT0godCxzKQpyPXAuYj10W3NdCmlmKHIhPW51bGwp
-cmV0dXJuIHIKcj17fQpwLmI9cgpDLk5tLlkodCxzLHIpCnEuaW0oYSxuZXcgUC5qZyhwLHEpKQpyZXR1
-cm4gcC5ifXRocm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LApl
-azpmdW5jdGlvbihhLGIpe3ZhciB0LHM9Si5VNihhKSxyPXMuZ0EoYSkscT1uZXcgQXJyYXkocikKQy5O
-bS5ZKHRoaXMuYixiLHEpCmZvcih0PTA7dDxyOysrdClDLk5tLlkocSx0LHRoaXMuUHYocy5xKGEsdCkp
-KQpyZXR1cm4gcX19ClAubFIucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYVthXT10
-aGlzLmIuUHYoYil9LAokUzoxfQpQLmpnLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5h
-LmJbYV09dGhpcy5iLlB2KGIpfSwKJFM6MX0KUC5CZi5wcm90b3R5cGU9ewppbTpmdW5jdGlvbihhLGIp
-e3ZhciB0LHMscixxCnUuYjguYihiKQpmb3IodD1PYmplY3Qua2V5cyhhKSxzPXQubGVuZ3RoLHI9MDty
-PHM7KytyKXtxPXRbcl0KYi4kMihxLGFbcV0pfX19ClAuQXMucHJvdG90eXBlPXsKVDpmdW5jdGlvbihh
-KXt2YXIgdApILnkoYSkKdD0kLmhHKCkuYgppZih0eXBlb2YgYSE9InN0cmluZyIpSC52aChILnRMKGEp
-KQppZih0LnRlc3QoYSkpcmV0dXJuIGEKdGhyb3cgSC5iKFAuTDMoYSwidmFsdWUiLCJOb3QgYSB2YWxp
-ZCBjbGFzcyB0b2tlbiIpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUCgpLkgoMCwiICIpfSwK
-Z2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuUCgpCnJldHVybiBQLnJqKHQsdC5yLEguTGgodCkuZCl9
-LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QKCkuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dGhpcy5U
-KGIpCnJldHVybiB0aGlzLlAoKS50ZygwLGIpfSwKaTpmdW5jdGlvbihhLGIpe3RoaXMuVChiKQpyZXR1
-cm4gSC54ZCh0aGlzLk9TKG5ldyBQLkdFKGIpKSl9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQscwp0aGlz
-LlQoYikKdD10aGlzLlAoKQpzPXQuUigwLGIpCnRoaXMuWCh0KQpyZXR1cm4gc30sCkZWOmZ1bmN0aW9u
-KGEsYil7dGhpcy5PUyhuZXcgUC5ONyh0aGlzLHUuWC5iKGIpKSl9LApWMTpmdW5jdGlvbihhKXt0aGlz
-Lk9TKG5ldyBQLnVRKCkpfSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHQscwp1LmNoLmIoYSkKdD10aGlzLlAo
-KQpzPWEuJDEodCkKdGhpcy5YKHQpCnJldHVybiBzfX0KUC5HRS5wcm90b3R5cGU9ewokMTpmdW5jdGlv
-bihhKXtyZXR1cm4gdS5DLmIoYSkuaSgwLHRoaXMuYSl9LAokUzozMn0KUC5ONy5wcm90b3R5cGU9ewok
-MTpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmIscz1ILnQ2KHQpCnJldHVybiB1LkMuYihhKS5GVigwLG5l
-dyBILkE4KHQscy5DKCJxVSgxKSIpLmIodGhpcy5hLmd1TSgpKSxzLkMoIkE4PDEscVU+IikpKX0sCiRT
-OjE2fQpQLnVRLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3UuQy5iKGEpCmlmKGEuYT4wKXthLmI9
-YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5hPTAKYS5TKCl9cmV0dXJufSwKJFM6MTZ9ClAuaEYucHJvdG90
-eXBlPXskaWhGOjF9ClAuUEMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQKdS5aLmIoYSkK
-dD1mdW5jdGlvbihiLGMsZCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGIoYyxkLHRoaXMsQXJyYXku
-cHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpfX0oUC5SNCxhLCExKQpQLkRtKHQsJC53KCks
-YSkKcmV0dXJuIHR9LAokUzozfQpQLlltLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBu
-ZXcgdGhpcy5hKGEpfSwKJFM6M30KUC5Oei5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4g
-bmV3IFAucjcoYSl9LAokUzozNH0KUC5ucC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4g
-bmV3IFAuVHooYSx1LmFtKX0sCiRTOjM1fQpQLlV0LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBuZXcgUC5FNChhKX0sCiRTOjM2fQpQLkU0LnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtp
-Zih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJv
-cGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIpKQpyZXR1cm4gUC5MNyh0aGlzLmFbYl0pfSwKWTpm
-dW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIhPSJzdHJpbmciJiZ0eXBlb2YgYiE9Im51bWJlciIpdGhy
-b3cgSC5iKFAueFkoInByb3BlcnR5IGlzIG5vdCBhIFN0cmluZyBvciBudW0iKSkKdGhpcy5hW2JdPVAu
-d1koYyl9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFu
-Y2VvZiBQLkU0JiZ0aGlzLmE9PT1iLmF9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMKdHJ5e3Q9U3RyaW5n
-KHRoaXMuYSkKcmV0dXJuIHR9Y2F0Y2gocyl7SC5SdShzKQp0PXRoaXMueGIoMCkKcmV0dXJuIHR9fSwK
-Vjc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMuYQppZihiPT1udWxsKXQ9bnVsbAplbHNle3Q9SC50
-NihiKQp0PVAuQ0gobmV3IEguQTgoYix0LkMoIkAoMSkiKS5iKFAuaUcoKSksdC5DKCJBODwxLEA+Iikp
-LCEwLHUueil9cmV0dXJuIFAuTDcoc1thXS5hcHBseShzLHQpKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1
-cm4gMH19ClAucjcucHJvdG90eXBlPXt9ClAuVHoucHJvdG90eXBlPXsKY1A6ZnVuY3Rpb24oYSl7dmFy
-IHQ9dGhpcyxzPWE8MHx8YT49dC5nQSh0KQppZihzKXRocm93IEguYihQLlRFKGEsMCx0LmdBKHQpLG51
-bGwsbnVsbCkpfSwKcTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiPT0ibnVtYmVyIiYmYj09PUMuam4u
-eXUoYikpdGhpcy5jUChILlNjKGIpKQpyZXR1cm4gdGhpcy4kdGkuZC5iKHRoaXMuVXIoMCxiKSl9LApZ
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgdAp0aGlzLiR0aS5kLmIoYykKdD1DLmpuLnl1KGIpCmlmKGI9PT10
-KXRoaXMuY1AoYikKdGhpcy5lNCgwLGIsYyl9LApnQTpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEubGVu
-Z3RoCmlmKHR5cGVvZiB0PT09Im51bWJlciImJnQ+Pj4wPT09dClyZXR1cm4gdAp0aHJvdyBILmIoUC5Q
-VigiQmFkIEpzQXJyYXkgbGVuZ3RoIikpfSwKJGljWDoxLAokaXpNOjF9ClAuY28ucHJvdG90eXBlPXt9
-ClAubmQucHJvdG90eXBlPXskaW5kOjF9ClAuS2UucHJvdG90eXBlPXsKUDpmdW5jdGlvbigpe3ZhciB0
-LHMscixxLHA9dGhpcy5hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSxvPVAuTHModS5OKQppZihwPT1udWxs
-KXJldHVybiBvCmZvcih0PXAuc3BsaXQoIiAiKSxzPXQubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUouVDAo
-dFtyXSkKaWYocS5sZW5ndGghPT0wKW8uaSgwLHEpfXJldHVybiBvfSwKWDpmdW5jdGlvbihhKXt0aGlz
-LmEuc2V0QXR0cmlidXRlKCJjbGFzcyIsYS5IKDAsIiAiKSl9fQpQLmQ1LnByb3RvdHlwZT17CmdEOmZ1
-bmN0aW9uKGEpe3JldHVybiBuZXcgUC5LZShhKX0sCnNoZjpmdW5jdGlvbihhLGIpe3RoaXMuWUMoYSxi
-KX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxLHAsbwppZihkPT1udWxsKXt0PUguVk0o
-W10sdS5rKQpkPW5ldyBXLnZEKHQpCkMuTm0uaSh0LFcuVHcobnVsbCkpCkMuTm0uaSh0LFcuQmwoKSkK
-Qy5ObS5pKHQsbmV3IFcuT3coKSl9Yz1uZXcgVy5LbyhkKQpzPSc8c3ZnIHZlcnNpb249IjEuMSI+JytI
-LmQoYikrIjwvc3ZnPiIKdD1kb2N1bWVudApyPXQuYm9keQpxPShyJiZDLlJZKS5BSChyLHMsYykKcD10
-LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpxLnRvU3RyaW5nCnQ9bmV3IFcuZTcocSkKbz10LmdyOCh0
-KQpmb3IoO3Q9by5maXJzdENoaWxkLHQhPW51bGw7KXAuYXBwZW5kQ2hpbGQodCkKcmV0dXJuIHB9LApn
-Vmw6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLkNxKGEsImNsaWNrIiwhMSx1LlEpfSwKJGlkNToxfQpQ
-Lm42LnByb3RvdHlwZT17JGljWDoxLCRpek06MSwkaUFTOjF9ClUuZDIucHJvdG90eXBlPXt9ClUuU2Uu
-cHJvdG90eXBlPXt9ClUudUYucHJvdG90eXBlPXt9ClUuTWwucHJvdG90eXBlPXt9ClUueUQucHJvdG90
-eXBlPXt9ClUud2IucHJvdG90eXBlPXt9CkIuajgucHJvdG90eXBlPXt9CkIucXAucHJvdG90eXBlPXt9
-ClQuR1YucHJvdG90eXBlPXt9CkwuZS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIs
-cSxwLG8KdS5CLmIoYSkKdD13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUKcz1MLkc2KHdpbmRvdy5sb2Nh
-dGlvbi5ocmVmKQpyPUwuYUsod2luZG93LmxvY2F0aW9uLmhyZWYpCkwuR2UoKQppZih0IT09Ii8iJiZ0
-IT09Si5UMChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSlMLkc3KHQs
-cyxyLG5ldyBMLlZXKHQscyxyKSkKcT1KLnFGKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5hcHBseS1t
-aWdyYXRpb24iKSkKcD1xLiR0aQpvPXAuQygifigxKSIpLmIobmV3IEwub1ooKSkKdS5NLmIobnVsbCkK
-Vy5KRShxLmEscS5iLG8sITEscC5kKX0sCiRTOjE3fQpMLlZXLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9u
-KCl7TC5Gcih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LAokUzowfQpMLm9aLnByb3RvdHlwZT17CiQxOmZ1
-bmN0aW9uKGEpe3UuVi5iKGEpCkwudHkoIi9hcHBseS1taWdyYXRpb24iKS5XNyhuZXcgTC5qcigpLHUu
-UCkuT0EobmV3IEwucWwoKSl9LAokUzo1fQpMLmpyLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Zh
-ciB0CnUuci5iKGEpCnQ9ZG9jdW1lbnQuYm9keQp0LmNsYXNzTGlzdC5yZW1vdmUoInByb3Bvc2VkIikK
-dC5jbGFzc0xpc3QuYWRkKCJhcHBsaWVkIil9LAokUzo3fQpMLnFsLnByb3RvdHlwZT17CiQyOmZ1bmN0
-aW9uKGEsYil7TC5xSigiYXBwbHkgbWlncmF0aW9uIGVycm9yOiAiK0guZChhKSxiKQp3aW5kb3cuYWxl
-cnQoIkNvdWxkIG5vdCBhcHBseSBtaWdyYXRpb24gKCIrSC5kKGEpKyIpLiIpfSwKJEM6IiQyIiwKJFI6
-MiwKJFM6MX0KTC5MLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscgp1LkIuYihhKQp0
-PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpzPUwuRzYod2luZG93LmxvY2F0aW9uLmhyZWYpCnI9TC5h
-Syh3aW5kb3cubG9jYXRpb24uaHJlZikKaWYodC5sZW5ndGg+MSlMLkc3KHQscyxyLG51bGwpCmVsc2V7
-TC5CRSh0LG5ldyBCLnFwKCIiLCIiLCIiLEMueEQpKQpMLkJYKCImbmJzcDsiLG51bGwpfX0sCiRTOjE3
-fQpMLld4LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPSJjb2xsYXBzZWQiCnUu
-Vi5iKGEpCnQ9dGhpcy5hCnM9Si5SRSh0KQpyPXRoaXMuYgppZighcy5nRCh0KS50ZygwLHEpKXtzLmdE
-KHQpLmkoMCxxKQpKLmRSKHIpLmkoMCxxKX1lbHNle3MuZ0QodCkuUigwLHEpCkouZFIocikuUigwLHEp
-fX0sCiRTOjV9CkwuQU8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9Si5xRih1LmguYihh
-KSkscz10LiR0aSxyPXMuQygifigxKSIpLmIobmV3IEwuZE4oKSkKdS5NLmIobnVsbCkKVy5KRSh0LmEs
-dC5iLHIsITEscy5kKX0sCiRTOjZ9CkwuZE4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQK
-dS5WLmIoYSkKdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikKdC50b1N0
-cmluZwpMLnQyKGEsdC5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyh0KSkuTygi
-cGF0aCIpKSl9LAokUzo1fQpMLkhvLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscgp1
-LmguYihhKQp0PUoucUYoYSkKcz10LiR0aQpyPXMuQygifigxKSIpLmIobmV3IEwueHooYSx0aGlzLmEp
-KQp1Lk0uYihudWxsKQpXLkpFKHQuYSx0LmIsciwhMSxzLmQpfSwKJFM6Nn0KTC54ei5wcm90b3R5cGU9
-ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlYuYihhKQp0PXRoaXMuYQpMLmhYKHRoaXMuYixQLlFBKHQu
-Z2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcodCkpLk8oIm9mZnNldCIpKSxudWxs
-LG51bGwpKX0sCiRTOjV9CkwuSUMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9Si5xRih1
-LmguYihhKSkscz10LiR0aQpzLkMoIn4oMSkiKS5iKEwuSDAoKSkKdS5NLmIobnVsbCkKVy5KRSh0LmEs
-dC5iLEwuSDAoKSwhMSxzLmQpfSwKJFM6Nn0KTC5MMS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2
-YXIgdAp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDApcmV0dXJuIGEKZWxzZSB0aHJvdyBILmIo
-IlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2YgIitILmQodCkpfSwKJFM6NDF9CkwublQucHJvdG90eXBl
-PXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYS5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5CWi5w
-cm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIodGhpcy5hLmEsbnVsbCxudWxsKX0sCiRTOjB9Ckwu
-R0gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dS5oLmIoYSkKJC56QigpLnRvU3RyaW5nCnUudi5i
-KCQub3coKS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixbYV0pfSwKJFM6Nn0KTC5EVC5w
-cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0y
-MDApe0wuVDEoVS55dShDLkN0LnBXKDAsYS5yZXNwb25zZVRleHQsbnVsbCkpKQpMLnlYKCIuZWRpdC1w
-YW5lbCAucGFuZWwtY29udGVudCIpfWVsc2Ugd2luZG93LmFsZXJ0KCJSZXF1ZXN0IGZhaWxlZDsgc3Rh
-dHVzIG9mICIrSC5kKHQpKX0sCiRTOjd9CkwuZUgucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtM
-LnFKKCJsb2FkUmVnaW9uRXhwbGFuYXRpb246ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQg
-bm90IGxvYWQgIitILmQodGhpcy5hKSsiICgiK0guZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRSOjIsCiRT
-OjF9CkwuekQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRoaXMKdS5yLmIoYSkK
-dD1hLnN0YXR1cwppZih0PT09MjAwKXtzPXIuYQpMLkJFKHMsQi5ZZih1LmIuYihDLkN0LnBXKDAsYS5y
-ZXNwb25zZVRleHQsbnVsbCkpKSkKdD1yLmIKTC5mRyh0LHIuYykKTC5CWChDLnhCLnRnKHMsIj8iKT9D
-LnhCLk5qKHMsMCxDLnhCLk9ZKHMsIj8iKSk6cyx0KQp0PXIuZAppZih0IT1udWxsKXQuJDAoKX1lbHNl
-IHdpbmRvdy5hbGVydCgiUmVxdWVzdCBmYWlsZWQ7IHN0YXR1cyBvZiAiK0guZCh0KSl9LAokUzo3fQpM
-Lk9FLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7TC5xSigibG9hZEZpbGU6ICIrSC5kKGEpLGIp
-CndpbmRvdy5hbGVydCgiQ291bGQgbm90IGxvYWQgIit0aGlzLmErIiAoIitILmQoYSkrIikuIil9LAok
-QzoiJDIiLAokUjoyLAokUzoxfQpMLlRXLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
-cgp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDApe3M9Qy5DdC5wVygwLGEucmVzcG9uc2VUZXh0
-LG51bGwpCnI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5hdi10cmVlIikKSi5sNShyLCIiKQpMLnRY
-KHIsTC5tSyhzKSl9ZWxzZSB3aW5kb3cuYWxlcnQoIlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2YgIitI
-LmQodCkpfSwKJFM6N30KTC54ci5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe0wucUooImxvYWRO
-YXZpZ2F0aW9uVHJlZTogIitILmQoYSksYikKd2luZG93LmFsZXJ0KCJDb3VsZCBub3QgbG9hZCAiK3Ro
-aXMuYSsiICgiK0guZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRSOjIsCiRTOjF9CkwuRUUucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscwp1LlYuYihhKQp0PXRoaXMuYQpzPXRoaXMuYgpMLmFmKHdp
-bmRvdy5sb2NhdGlvbi5wYXRobmFtZSx0LHMsbmV3IEwuUUwodCxzKSkKTC5oWCh0aGlzLmMsdCl9LAok
-Uzo1fQpMLlFMLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih3aW5kb3cubG9jYXRpb24ucGF0
-aG5hbWUsdGhpcy5hLHRoaXMuYil9LAokUzowfQpMLlZTLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e3ZhciB0LHM9InNlbGVjdGVkLWZpbGUiCnUuaC5iKGEpCmEudG9TdHJpbmcKdD1KLlJFKGEpCmlmKGEu
-Z2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoYSkpLk8oIm5hbWUiKSk9PT10aGlz
-LmEuYSl0LmdEKGEpLmkoMCxzKQplbHNlIHQuZ0QoYSkuUigwLHMpfSwKJFM6Nn0KTC5YQS5wcm90b3R5
-cGU9ewpFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuITB9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4hMH0s
-CiRpa0Y6MX0KTC5aWi5wcm90b3R5cGU9e30KTC55OC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3Jl
-dHVybiB0aGlzLmJ9fQpNLmxJLnByb3RvdHlwZT17CldPOmZ1bmN0aW9uKGEsYil7dmFyIHQscz1udWxs
-Ck0uWUYoImFic29sdXRlIixILlZNKFtiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSx1LnMp
-KQp0PXRoaXMuYQp0PXQuWXIoYik+MCYmIXQuaEsoYikKaWYodClyZXR1cm4gYgp0PUQuUlgoKQpyZXR1
-cm4gdGhpcy5xNygwLHQsYixzLHMscyxzLHMscyl9LAp0TTpmdW5jdGlvbihhKXt2YXIgdCxzLHI9WC5D
-TChhLHRoaXMuYSkKci5JVigpCnQ9ci5kCnM9dC5sZW5ndGgKaWYocz09PTApe3Q9ci5iCnJldHVybiB0
-PT1udWxsPyIuIjp0fWlmKHM9PT0xKXt0PXIuYgpyZXR1cm4gdD09bnVsbD8iLiI6dH1pZigwPj1zKXJl
-dHVybiBILk9IKHQsLTEpCnQucG9wKCkKQy5ObS5tdihyLmUpCnIuSVYoKQpyZXR1cm4gci53KDApfSwK
-cTc6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciB0PUguVk0oW2IsYyxkLGUsZixnLGgsaV0s
-dS5zKQpNLllGKCJqb2luIix0KQpyZXR1cm4gdGhpcy5JUChuZXcgSC5VNSh0LHUuYkIuYihuZXcgTS5N
-aSgpKSx1LmNjKSl9LApJUDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwKdS5YLmIoYSkK
-Zm9yKHQ9YS4kdGkscz10LkMoImEyKGNYLkUpIikuYihuZXcgTS5xNygpKSxyPWEuZ2t6KGEpLHQ9bmV3
-IEguU08ocixzLHQuQygiU088Y1guRT4iKSkscz10aGlzLmEscT0hMSxwPSExLG89IiI7dC5GKCk7KXtu
-PXIuZ2woKQppZihzLmhLKG4pJiZwKXttPVguQ0wobixzKQpsPW8uY2hhckNvZGVBdCgwKT09MD9vOm8K
-bz1DLnhCLk5qKGwsMCxzLlNwKGwsITApKQptLmI9bwppZihzLmRzKG8pKUMuTm0uWShtLmUsMCxzLmdt
-SSgpKQpvPW0udygwKX1lbHNlIGlmKHMuWXIobik+MCl7cD0hcy5oSyhuKQpvPUguZChuKX1lbHNle2lm
-KCEobi5sZW5ndGg+MCYmcy5VZChuWzBdKSkpaWYocSlvKz1zLmdtSSgpCm8rPUguZChuKX1xPXMuZHMo
-bil9cmV0dXJuIG8uY2hhckNvZGVBdCgwKT09MD9vOm99LApvNTpmdW5jdGlvbihhKXt2YXIgdAppZigh
-dGhpcy55MyhhKSlyZXR1cm4gYQp0PVguQ0woYSx0aGlzLmEpCnQuclIoKQpyZXR1cm4gdC53KDApfSwK
-eTM6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGsKYS50b1N0cmluZwp0PXRoaXMuYQpz
-PXQuWXIoYSkKaWYocyE9PTApe2lmKHQ9PT0kLktrKCkpZm9yKHI9MDtyPHM7KytyKWlmKEMueEIuVyhh
-LHIpPT09NDcpcmV0dXJuITAKcT1zCnA9NDd9ZWxzZXtxPTAKcD1udWxsfWZvcihvPW5ldyBILnFqKGEp
-LmEsbj1vLmxlbmd0aCxyPXEsbT1udWxsO3I8bjsrK3IsbT1wLHA9bCl7bD1DLnhCLm0obyxyKQppZih0
-LnI0KGwpKXtpZih0PT09JC5LaygpJiZsPT09NDcpcmV0dXJuITAKaWYocCE9bnVsbCYmdC5yNChwKSly
-ZXR1cm4hMAppZihwPT09NDYpaz1tPT1udWxsfHxtPT09NDZ8fHQucjQobSkKZWxzZSBrPSExCmlmKGsp
-cmV0dXJuITB9fWlmKHA9PW51bGwpcmV0dXJuITAKaWYodC5yNChwKSlyZXR1cm4hMAppZihwPT09NDYp
-dD1tPT1udWxsfHx0LnI0KG0pfHxtPT09NDYKZWxzZSB0PSExCmlmKHQpcmV0dXJuITAKcmV0dXJuITF9
-LApIUDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbz10aGlzLG49J1VuYWJsZSB0byBmaW5kIGEg
-cGF0aCB0byAiJwpiPW8uV08oMCxiKQp0PW8uYQppZih0LllyKGIpPD0wJiZ0LllyKGEpPjApcmV0dXJu
-IG8ubzUoYSkKaWYodC5ZcihhKTw9MHx8dC5oSyhhKSlhPW8uV08oMCxhKQppZih0LllyKGEpPD0wJiZ0
-LllyKGIpPjApdGhyb3cgSC5iKFguSlQobitILmQoYSkrJyIgZnJvbSAiJytILmQoYikrJyIuJykpCnM9
-WC5DTChiLHQpCnMuclIoKQpyPVguQ0woYSx0KQpyLnJSKCkKcT1zLmQKaWYocS5sZW5ndGg+MCYmSi5S
-TShxWzBdLCIuIikpcmV0dXJuIHIudygwKQpxPXMuYgpwPXIuYgppZihxIT1wKXE9cT09bnVsbHx8cD09
-bnVsbHx8IXQuTmMocSxwKQplbHNlIHE9ITEKaWYocSlyZXR1cm4gci53KDApCndoaWxlKCEwKXtxPXMu
-ZAppZihxLmxlbmd0aD4wKXtwPXIuZApxPXAubGVuZ3RoPjAmJnQuTmMocVswXSxwWzBdKX1lbHNlIHE9
-ITEKaWYoIXEpYnJlYWsKQy5ObS5XNChzLmQsMCkKQy5ObS5XNChzLmUsMSkKQy5ObS5XNChyLmQsMCkK
-Qy5ObS5XNChyLmUsMSl9cT1zLmQKaWYocS5sZW5ndGg+MCYmSi5STShxWzBdLCIuLiIpKXRocm93IEgu
-YihYLkpUKG4rSC5kKGEpKyciIGZyb20gIicrSC5kKGIpKyciLicpKQpxPXUuTgpDLk5tLlVHKHIuZCww
-LFAuTzgocy5kLmxlbmd0aCwiLi4iLHEpKQpDLk5tLlkoci5lLDAsIiIpCkMuTm0uVUcoci5lLDEsUC5P
-OChzLmQubGVuZ3RoLHQuZ21JKCkscSkpCnQ9ci5kCnE9dC5sZW5ndGgKaWYocT09PTApcmV0dXJuIi4i
-CmlmKHE+MSYmSi5STShDLk5tLmdyWih0KSwiLiIpKXt0PXIuZAppZigwPj10Lmxlbmd0aClyZXR1cm4g
-SC5PSCh0LC0xKQp0LnBvcCgpCnQ9ci5lCkMuTm0ubXYodCkKQy5ObS5tdih0KQpDLk5tLmkodCwiIil9
-ci5iPSIiCnIuSVYoKQpyZXR1cm4gci53KDApfX0KTS5NaS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
-KXtyZXR1cm4gSC55KGEpIT1udWxsfSwKJFM6OH0KTS5xNy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
-KXtyZXR1cm4gSC55KGEpIT09IiJ9LAokUzo4fQpNLk5vLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e0gueShhKQpyZXR1cm4gYT09bnVsbD8ibnVsbCI6JyInK2ErJyInfSwKJFM6NH0KQi5MdS5wcm90b3R5
-cGU9ewp4WjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuWXIoYSkKaWYocz4wKXJldHVybiBKLmxkKGEs
-MCxzKQppZih0aGlzLmhLKGEpKXtpZigwPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLDApCnQ9YVswXX1l
-bHNlIHQ9bnVsbApyZXR1cm4gdH0sCk5jOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PWJ9fQpYLldELnBy
-b3RvdHlwZT17CklWOmZ1bmN0aW9uKCl7dmFyIHQscyxyPXRoaXMKd2hpbGUoITApe3Q9ci5kCmlmKCEo
-dC5sZW5ndGghPT0wJiZKLlJNKEMuTm0uZ3JaKHQpLCIiKSkpYnJlYWsKdD1yLmQKaWYoMD49dC5sZW5n
-dGgpcmV0dXJuIEguT0godCwtMSkKdC5wb3AoKQpDLk5tLm12KHIuZSl9dD1yLmUKcz10Lmxlbmd0aApp
-ZihzPjApQy5ObS5ZKHQscy0xLCIiKX0sCnJSOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscCxvLG4sbT10
-aGlzLGw9SC5WTShbXSx1LnMpCmZvcih0PW0uZCxzPXQubGVuZ3RoLHI9MCxxPTA7cTx0Lmxlbmd0aDt0
-Lmxlbmd0aD09PXN8fCgwLEgubGspKHQpLCsrcSl7cD10W3FdCm89Si5pYShwKQppZighKG8uRE4ocCwi
-LiIpfHxvLkROKHAsIiIpKSlpZihvLkROKHAsIi4uIikpaWYobC5sZW5ndGg+MClsLnBvcCgpCmVsc2Ug
-KytyCmVsc2UgQy5ObS5pKGwscCl9aWYobS5iPT1udWxsKUMuTm0uVUcobCwwLFAuTzgociwiLi4iLHUu
-TikpCmlmKGwubGVuZ3RoPT09MCYmbS5iPT1udWxsKUMuTm0uaShsLCIuIikKbj1QLmRIKGwubGVuZ3Ro
-LG5ldyBYLnFSKG0pLCEwLHUuTikKdD1tLmIKdD10IT1udWxsJiZsLmxlbmd0aD4wJiZtLmEuZHModCk/
-bS5hLmdtSSgpOiIiCkgudDYobikuZC5iKHQpCmlmKCEhbi5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJp
-bnNlcnQiKSkKbi5zcGxpY2UoMCwwLHQpCm0uc25KKGwpCm0uc1BoKG4pCnQ9bS5iCmlmKHQhPW51bGwm
-Jm0uYT09PSQuS2soKSl7dC50b1N0cmluZwptLmI9SC55cyh0LCIvIiwiXFwiKX1tLklWKCl9LAp3OmZ1
-bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLHE9ci5iCnE9cSE9bnVsbD9xOiIiCmZvcih0PTA7dDxyLmQu
-bGVuZ3RoOysrdCl7cz1yLmUKaWYodD49cy5sZW5ndGgpcmV0dXJuIEguT0gocyx0KQpzPXErSC5kKHNb
-dF0pCnE9ci5kCmlmKHQ+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsdCkKcT1zK0guZChxW3RdKX1xKz1I
-LmQoQy5ObS5nclooci5lKSkKcmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9xOnF9LApzbko6ZnVuY3Rp
-b24oYSl7dGhpcy5kPXUuYS5iKGEpfSwKc1BoOmZ1bmN0aW9uKGEpe3RoaXMuZT11LmEuYihhKX19Clgu
-cVIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5hLmdtSSgpfSwKJFM6NDJ9
-ClguZHYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUGF0aEV4Y2VwdGlvbjogIit0aGlz
-LmF9fQpPLnpMLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ29jKHRoaXMpfX0K
-RS5PRi5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpm
-dW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKcmV0
-dXJuIHQhPT0wJiZDLnhCLm0oYSx0LTEpIT09NDd9LApTcDpmdW5jdGlvbihhLGIpe2lmKGEubGVuZ3Ro
-IT09MCYmQy54Qi5XKGEsMCk9PT00NylyZXR1cm4gMQpyZXR1cm4gMH0sCllyOmZ1bmN0aW9uKGEpe3Jl
-dHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7cmV0dXJuITF9LApnb2M6ZnVuY3Rpb24o
-KXtyZXR1cm4icG9zaXgifSwKZ21JOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifX0KRi5ydS5wcm90b3R5cGU9
-ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1
-cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKaWYodD09PTApcmV0dXJuITEK
-aWYoQy54Qi5tKGEsdC0xKSE9PTQ3KXJldHVybiEwCnJldHVybiBDLnhCLlRjKGEsIjovLyIpJiZ0aGlz
-LllyKGEpPT09dH0sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscD1hLmxlbmd0aAppZihwPT09
-MClyZXR1cm4gMAppZihDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCmZvcih0PTA7dDxwOysrdCl7cz1D
-LnhCLlcoYSx0KQppZihzPT09NDcpcmV0dXJuIDAKaWYocz09PTU4KXtpZih0PT09MClyZXR1cm4gMApy
-PUMueEIuWFUoYSwiLyIsQy54Qi5RaShhLCIvLyIsdCsxKT90KzM6dCkKaWYocjw9MClyZXR1cm4gcApp
-ZighYnx8cDxyKzMpcmV0dXJuIHIKaWYoIUMueEIubihhLCJmaWxlOi8vIikpcmV0dXJuIHIKaWYoIUIu
-WXUoYSxyKzEpKXJldHVybiByCnE9ciszCnJldHVybiBwPT09cT9xOnIrNH19cmV0dXJuIDB9LApZcjpm
-dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxl
-bmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDd9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4idXJsIn0sCmdt
-STpmdW5jdGlvbigpe3JldHVybiIvIn19CkwuSVYucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0
-dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N3x8YT09PTkyfSwK
-ZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKaWYodD09PTApcmV0dXJuITEKdD1DLnhCLm0oYSx0
-LTEpCnJldHVybiEodD09PTQ3fHx0PT09OTIpfSwKU3A6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9YS5s
-ZW5ndGgKaWYocj09PTApcmV0dXJuIDAKdD1DLnhCLlcoYSwwKQppZih0PT09NDcpcmV0dXJuIDEKaWYo
-dD09PTkyKXtpZihyPDJ8fEMueEIuVyhhLDEpIT09OTIpcmV0dXJuIDEKcz1DLnhCLlhVKGEsIlxcIiwy
-KQppZihzPjApe3M9Qy54Qi5YVShhLCJcXCIscysxKQppZihzPjApcmV0dXJuIHN9cmV0dXJuIHJ9aWYo
-cjwzKXJldHVybiAwCmlmKCFCLk9TKHQpKXJldHVybiAwCmlmKEMueEIuVyhhLDEpIT09NTgpcmV0dXJu
-IDAKcj1DLnhCLlcoYSwyKQppZighKHI9PT00N3x8cj09PTkyKSlyZXR1cm4gMApyZXR1cm4gM30sClly
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
-aXMuWXIoYSk9PT0xfSwKT3Q6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihhPT09YilyZXR1cm4hMAppZihh
-PT09NDcpcmV0dXJuIGI9PT05MgppZihhPT09OTIpcmV0dXJuIGI9PT00NwppZigoYV5iKSE9PTMyKXJl
-dHVybiExCnQ9YXwzMgpyZXR1cm4gdD49OTcmJnQ8PTEyMn0sCk5jOmZ1bmN0aW9uKGEsYil7dmFyIHQs
-cyxyCmlmKGE9PWIpcmV0dXJuITAKdD1hLmxlbmd0aAppZih0IT09Yi5sZW5ndGgpcmV0dXJuITEKZm9y
-KHM9Si5yWShiKSxyPTA7cjx0OysrcilpZighdGhpcy5PdChDLnhCLlcoYSxyKSxzLlcoYixyKSkpcmV0
-dXJuITEKcmV0dXJuITB9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4id2luZG93cyJ9LApnbUk6ZnVuY3Rp
-b24oKXtyZXR1cm4iXFwifX07KGZ1bmN0aW9uIGFsaWFzZXMoKXt2YXIgdD1KLnZCLnByb3RvdHlwZQp0
-LlU9dC53CnQuU2o9dC5lNwp0PUouTUYucHJvdG90eXBlCnQudD10LncKdD1QLmNYLnByb3RvdHlwZQp0
-LkdHPXQuZXYKdD1QLmsucHJvdG90eXBlCnQueGI9dC53CnQ9Vy5jdi5wcm90b3R5cGUKdC5EVz10LnI2
-CnQ9Vy5tNi5wcm90b3R5cGUKdC5qRj10LkViCnQ9UC5FNC5wcm90b3R5cGUKdC5Vcj10LnEKdC5lND10
-Lll9KSgpOyhmdW5jdGlvbiBpbnN0YWxsVGVhck9mZnMoKXt2YXIgdD1odW5rSGVscGVycy5fc3RhdGlj
-XzEscz1odW5rSGVscGVycy5fc3RhdGljXzAscj1odW5rSGVscGVycy5pbnN0YWxsSW5zdGFuY2VUZWFy
-T2ZmLHE9aHVua0hlbHBlcnMuaW5zdGFsbFN0YXRpY1RlYXJPZmYscD1odW5rSGVscGVycy5faW5zdGFu
-Y2VfMXUKdChQLCJFWCIsIlpWIiwxMCkKdChQLCJ5dCIsIm9BIiwxMCkKdChQLCJxVyIsIkJ6IiwxMCkK
-cyhQLCJVSSIsImVOIiwyKQpyKFAuUGYucHJvdG90eXBlLCJnWUoiLDAsMSxudWxsLFsiJDIiLCIkMSJd
-LFsidzAiLCJwbSJdLDI5LDApCnQoUCwiUEgiLCJNdCIsNCkKcShXLCJwUyIsNCxudWxsLFsiJDQiXSxb
-InlXIl0sMTEsMCkKcShXLCJWNCIsNCxudWxsLFsiJDQiXSxbIlFXIl0sMTEsMCkKcChQLkFzLnByb3Rv
-dHlwZSwiZ3VNIiwiVCIsNCkKdChQLCJpRyIsIndZIiwzKQp0KFAsIncwIiwiTDciLDQ1KQpxKEwsIlhO
-IiwxLG51bGwsWyIkMiRyZWxhdGl2ZVRvIiwiJDEiXSxbInQyIixmdW5jdGlvbihhKXtyZXR1cm4gTC50
-MihhLG51bGwpfV0sNDYsMCkKdChMLCJIMCIsInVtIiwzMSl9KSgpOyhmdW5jdGlvbiBpbmhlcml0YW5j
-ZSgpe3ZhciB0PWh1bmtIZWxwZXJzLm1peGluLHM9aHVua0hlbHBlcnMuaW5oZXJpdCxyPWh1bmtIZWxw
-ZXJzLmluaGVyaXRNYW55CnMoUC5rLG51bGwpCnIoUC5rLFtILmVvLEoudkIsSi5tMSxQLm5ZLFAuY1gs
-SC5hNyxQLkFuLEguU1UsSC5SZSxILnd2LFAuUG4sSC5XVSxILkxJLEguVHAsSC5acixQLlhTLEguYnEs
-SC5YTyxQLllrLEguZGIsSC5ONixILlZSLEguRUssSC5QYixILnRRLEguU2QsSC5KYyxILkcsUC5XMyxQ
-LmloLFAuUGYsUC5GZSxQLnZzLFAuT00sUC5xaCxQLk1PLFAua1QsUC54SSxQLkN3LFAubTAsUC5YdixQ
-LmJuLFAubG0sUC5sRCxQLktQLFAubGYsUC5XWSxQLlVrLFAuUncsUC5ieixQLmEyLFAuaVAsUC5GSyxQ
-Lms1LFAuS1ksUC5DRCxQLmFFLFAuRUgsUC56TSxQLlowLFAuYzgsUC5PZCxQLmliLFAuR3osUC5xVSxQ
-LlJuLFAuR0QsUC5EbixQLlBFLFAuVWYsVy5pZCxXLkZrLFcuSlEsVy5HbSxXLnZELFcubTYsVy5PdyxX
-Llc5LFcuZFcsVy5GYixXLmtGLFcubWssVy5LbyxQLmlKLFAuRTQsUC5uNixVLmQyLFUuU2UsVS51RixV
-Lk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5HVixMLlhBLEwuWlosTC55OCxNLmxJLE8uekwsWC5XRCxY
-LmR2XSkKcihKLnZCLFtKLnlFLEouWUUsSi5NRixKLmpkLEoucUksSi5EcixILkVULFcuRDAsVy5BeixX
-LkxlLFcuTmgsVy5JQixXLm43LFcuZWEsVy5icixXLlNnLFcudTgsVy5LNyxXLlhXLFAuaEZdKQpyKEou
-TUYsW0ouaUMsSi5rZCxKLmM1XSkKcyhKLlBvLEouamQpCnIoSi5xSSxbSi51cixKLlZBXSkKcyhQLkxV
-LFAublkpCnIoUC5MVSxbSC5YQyxXLnd6LFcuZTddKQpzKEgucWosSC5YQykKcihQLmNYLFtILmJRLEgu
-VTUsUC5tVyxILnVuXSkKcihILmJRLFtILmFMLEguaTUsUC54dV0pCnIoSC5hTCxbSC5uSCxILkE4LFAu
-aThdKQpzKEguU08sUC5BbikKcyhQLlJVLFAuUG4pCnMoUC5HaixQLlJVKQpzKEguUEQsUC5HaikKcyhI
-LkxQLEguV1UpCnIoSC5UcCxbSC5DaixILkFtLEgubGMsSC5kQyxILndOLEguVlgsUC50aCxQLmhhLFAu
-VnMsUC5GdCxQLnlILFAuV00sUC5TWCxQLkdzLFAuZGEsUC5vUSxQLnBWLFAuVTcsUC52cixQLnJILFAu
-S0YsUC5aTCxQLlJULFAualosUC5ycSxQLlJXLFAuQjUsUC5QSSxQLnBLLFAuaGosUC5WcCxQLk9SLFAu
-R0EsUC5XRixQLm4xLFAuY1MsUC5WQyxQLnRwLFAuZTEsUC5OWSxQLlJaLFAuTUUsUC55NSxQLnEzLFAu
-eUksUC5jNixQLnFkLFcuQ3YsVy5iVSxXLmhILFcuS1MsVy5BMyxXLnZOLFcuVXYsVy5FZyxXLkVvLFcu
-V2ssVy5JQSxXLmZtLFAubFIsUC5qZyxQLkdFLFAuTjcsUC51USxQLlBDLFAuWW0sUC5OeixQLm5wLFAu
-VXQsTC5lLEwuVlcsTC5vWixMLmpyLEwucWwsTC5MLEwuV3gsTC5BTyxMLmROLEwuSG8sTC54eixMLklD
-LEwuTDEsTC5uVCxMLkJaLEwuR0gsTC5EVCxMLmVILEwuekQsTC5PRSxMLlRXLEwueHIsTC5FRSxMLlFM
-LEwuVlMsTS5NaSxNLnE3LE0uTm8sWC5xUl0pCnIoUC5YUyxbSC5XMCxILmF6LEgudlYsSC5FcSxQLkM2
-LEgudTksUC5uLFAudSxQLm1wLFAudWIsUC5kcyxQLmxqLFAuVVYsUC5jXSkKcihILmxjLFtILnp4LEgu
-clRdKQpzKEgua1ksUC5DNikKcyhQLmlsLFAuWWspCnIoUC5pbCxbSC5ONSxQLnV3LFcuRDksVy5TeV0p
-CnMoSC5LVyxQLm1XKQpzKEguYjAsSC5FVCkKcihILmIwLFtILlJHLEguV0JdKQpzKEguVlAsSC5SRykK
-cyhILkRnLEguVlApCnMoSC5aRyxILldCKQpzKEguUGcsSC5aRykKcihILlBnLFtILnhqLEguZEUsSC5a
-QSxILndmLEguUHEsSC5lRSxILlY2XSkKcihILnU5LFtILmh6LEguaU1dKQpzKFAuWmYsUC5QZikKcyhQ
-LkppLFAubTApCnMoUC5iNixQLlh2KQpzKFAuVmosUC5XWSkKcihQLlVrLFtQLkNWLFAuWmksUC5ieV0p
-CnMoUC53SSxQLmtUKQpyKFAud0ksW1AuVTgsUC5NeCxQLkUzLFAuR1ldKQpzKFAudTUsUC5aaSkKcihQ
-LkZLLFtQLkNQLFAuS05dKQpyKFAudSxbUC5iSixQLmVZXSkKcyhQLnFlLFAuRG4pCnIoVy5EMCxbVy51
-SCxXLndhLFcuSzUsVy5DbV0pCnIoVy51SCxbVy5jdixXLm54LFcuUUYsVy5DUV0pCnIoVy5jdixbVy5x
-RSxQLmQ1XSkKcihXLnFFLFtXLkdoLFcuZlksVy5uQixXLlFQLFcuaDQsVy5TTixXLmxwLFcuVGIsVy5J
-dixXLkJULFcueVldKQpzKFcub0osVy5MZSkKcyhXLlQ1LFcuQXopCnMoVy5WYixXLlFGKQpzKFcuTzcs
-Vy53YSkKcihXLmVhLFtXLnc2LFcuZXddKQpzKFcuQWosVy53NikKcyhXLnJCLFcuSzcpCnMoVy5CSCxX
-LnJCKQpzKFcudzQsVy5JQikKcyhXLm9hLFcuWFcpCnMoVy5yaCxXLm9hKQpzKFcuaTcsVy5EOSkKcyhQ
-LkFzLFAuVmopCnIoUC5BcyxbVy5JNCxQLktlXSkKcyhXLlJPLFAucWgpCnMoVy5DcSxXLlJPKQpzKFcu
-eEMsUC5NTykKcyhXLmN0LFcubTYpCnMoUC5CZixQLmlKKQpyKFAuRTQsW1AucjcsUC5jb10pCnMoUC5U
-eixQLmNvKQpzKFAubmQsUC5kNSkKcyhCLkx1LE8uekwpCnIoQi5MdSxbRS5PRixGLnJ1LEwuSVZdKQp0
-KEguWEMsSC5SZSkKdChILlJHLFAubEQpCnQoSC5WUCxILlNVKQp0KEguV0IsUC5sRCkKdChILlpHLEgu
-U1UpCnQoUC5uWSxQLmxEKQp0KFAuV1ksUC5sZikKdChQLlJVLFAuS1ApCnQoVy5MZSxXLmlkKQp0KFcu
-SzcsUC5sRCkKdChXLnJCLFcuR20pCnQoVy5YVyxQLmxEKQp0KFcub2EsVy5HbSkKdChQLmNvLFAubEQp
-fSkoKQp2YXIgdj17dHlwZVVuaXZlcnNlOntlQzpuZXcgTWFwKCksdFI6e30sZVQ6e30sdFBWOnt9LHNF
-QTpbXX0sbWFuZ2xlZEdsb2JhbE5hbWVzOntLTjoiaW50IixDUDoiZG91YmxlIixGSzoibnVtIixxVToi
-U3RyaW5nIixhMjoiYm9vbCIsYzg6Ik51bGwiLHpNOiJMaXN0In0sbWFuZ2xlZE5hbWVzOnt9LGdldFR5
-cGVGcm9tTmFtZTpnZXRHbG9iYWxGcm9tTmFtZSxtZXRhZGF0YTpbXSx0eXBlczpbImM4KCkiLCJjOChA
-LEApIiwifigpIiwiQChAKSIsInFVKHFVKSIsImM4KEFqKSIsImM4KGN2KSIsImM4KE83KSIsImEyKHFV
-KSIsImM4KHFVLHFVKSIsIn4ofigpKSIsImEyKGN2LHFVLHFVLEpRKSIsImM4KEApIiwiYzgocVUsQCki
-LCJjOChxVSkiLCJhMihrRikiLCJ+KHh1PHFVPikiLCJjOChlYSkiLCJjOChHRCxAKSIsIktOKEtOLEtO
-KSIsImM4KH4oKSkiLCJjOChALEd6KSIsIn4ocVUscVUpIiwibjYoS04pIiwibjYoQCxAKSIsImEyKHVI
-KSIsImM4KEtOLEApIiwiYzgoZXcpIiwiQChlYSkiLCJ+KGtbR3pdKSIsImM4KEBbR3pdKSIsIn4oQWop
-IiwiYTIoeHU8cVU+KSIsInZzPEA+KEApIiwicjcoQCkiLCJUejxAPihAKSIsIkU0KEApIiwiQChxVSki
-LCJAKEAscVUpIiwifih1SCx1SCkiLCJaMDxxVSxxVT4oWjA8cVUscVU+LHFVKSIsIk83KE83KSIsInFV
-KEtOKSIsIn4ocVUsS04pIiwifihxVVtAXSkiLCJrKEApIiwifihBantyZWxhdGl2ZVRvOnFVfSkiLCJ+
-KEApIl0saW50ZXJjZXB0b3JzQnlUYWc6bnVsbCxsZWFmVGFnczpudWxsfQpILnhiKHYudHlwZVVuaXZl
-cnNlLEpTT04ucGFyc2UoJ3sicngiOiJlYSIsImU1IjoiZWEiLCJZMCI6ImQ1IiwiV3QiOiJkNSIsInYw
-IjoiZXciLCJNciI6InFFIiwiZUwiOiJxRSIsIkkwIjoidUgiLCJocyI6InVIIiwiWGciOiJRRiIsInlj
-IjoiQWoiLCJ5NCI6Inc2IiwiYVAiOiJDbSIsInhjIjoibngiLCJrSiI6Im54IiwielUiOiJEZyIsImRm
-IjoiRVQiLCJ5RSI6eyJhMiI6W119LCJZRSI6eyJjOCI6W119LCJNRiI6eyJ2bSI6W119LCJpQyI6eyJ2
-bSI6W119LCJrZCI6eyJ2bSI6W119LCJjNSI6eyJFSCI6W10sInZtIjpbXX0sImpkIjp7InpNIjpbIjEi
-XSwiY1giOlsiMSJdfSwiUG8iOnsiamQiOlsiMSJdLCJ6TSI6WyIxIl0sImNYIjpbIjEiXX0sIm0xIjp7
-IkFuIjpbIjEiXX0sInFJIjp7IkNQIjpbXSwiRksiOltdfSwidXIiOnsiS04iOltdLCJDUCI6W10sIkZL
-IjpbXX0sIlZBIjp7IkNQIjpbXSwiRksiOltdfSwiRHIiOnsicVUiOltdLCJ2WCI6W119LCJxaiI6eyJS
-ZSI6WyJLTiJdLCJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04iLCJS
-ZS5FIjoiS04ifSwiYlEiOnsiY1giOlsiMSJdfSwiYUwiOnsiY1giOlsiMSJdfSwibkgiOnsiYUwiOlsi
-MSJdLCJjWCI6WyIxIl0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsiMSJdfSwiQTgi
-OnsiYUwiOlsiMiJdLCJjWCI6WyIyIl0sImFMLkUiOiIyIiwiY1guRSI6IjIifSwiVTUiOnsiY1giOlsi
-MSJdLCJjWC5FIjoiMSJ9LCJTTyI6eyJBbiI6WyIxIl19LCJYQyI6eyJSZSI6WyIxIl0sImxEIjpbIjEi
-XSwiek0iOlsiMSJdLCJjWCI6WyIxIl19LCJ3diI6eyJHRCI6W119LCJQRCI6eyJHaiI6WyIxIiwiMiJd
-LCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJd
-fSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0sIkxQIjp7IldVIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19
-LCJMSSI6eyJ2USI6W119LCJXMCI6eyJYUyI6W119LCJheiI6eyJYUyI6W119LCJ2ViI6eyJYUyI6W119
-LCJYTyI6eyJHeiI6W119LCJUcCI6eyJFSCI6W119LCJsYyI6eyJFSCI6W119LCJ6eCI6eyJFSCI6W119
-LCJyVCI6eyJFSCI6W119LCJFcSI6eyJYUyI6W119LCJrWSI6eyJYUyI6W119LCJONSI6eyJGbyI6WyIx
-IiwiMiJdLCJZayI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdLCJZay5LIjoiMSIsIllrLlYiOiIyIn0s
-Imk1Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiTjYiOnsiQW4iOlsiMSJdfSwiVlIiOnsid0wiOltd
-LCJ2WCI6W119LCJFSyI6eyJpYiI6W10sIk9kIjpbXX0sIktXIjp7ImNYIjpbImliIl0sImNYLkUiOiJp
-YiJ9LCJQYiI6eyJBbiI6WyJpYiJdfSwidFEiOnsiT2QiOltdfSwidW4iOnsiY1giOlsiT2QiXSwiY1gu
-RSI6Ik9kIn0sIlNkIjp7IkFuIjpbIk9kIl19LCJFVCI6eyJBUyI6W119LCJiMCI6eyJYaiI6WyJAIl0s
-IkVUIjpbXSwiQVMiOltdfSwiRGciOnsibEQiOlsiQ1AiXSwiWGoiOlsiQCJdLCJ6TSI6WyJDUCJdLCJF
-VCI6W10sIlNVIjpbIkNQIl0sIkFTIjpbXSwiY1giOlsiQ1AiXSwibEQuRSI6IkNQIn0sIlBnIjp7ImxE
-IjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10s
-ImNYIjpbIktOIl19LCJ4aiI6eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpb
-XSwiU1UiOlsiS04iXSwiQVMiOltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiZEUiOnsibEQiOlsi
-S04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1gi
-OlsiS04iXSwibEQuRSI6IktOIn0sIlpBIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAi
-XSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJ3ZiI6
-eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwiU1UiOlsiS04iXSwiQVMi
-OltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiUHEiOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwi
-WGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktO
-In0sImVFIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJL
-TiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJWNiI6eyJuNiI6W10sImxEIjpbIktO
-Il0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpb
-IktOIl0sImxELkUiOiJLTiJ9LCJ1OSI6eyJYUyI6W119LCJoeiI6eyJYUyI6W119LCJpTSI6eyJYUyI6
-W119LCJaZiI6eyJQZiI6WyIxIl19LCJ2cyI6eyJiOCI6WyIxIl19LCJDdyI6eyJYUyI6W119LCJtMCI6
-eyJKQiI6W119LCJKaSI6eyJKQiI6W119LCJiNiI6eyJYdiI6WyIxIl0sInh1IjpbIjEiXSwiY1giOlsi
-MSJdfSwibG0iOnsiQW4iOlsiMSJdfSwibVciOnsiY1giOlsiMSJdfSwiTFUiOnsibEQiOlsiMSJdLCJ6
-TSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJZ
-ayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsiMSIsIjIiXX0sIkdqIjp7IlJVIjpbIjEiLCIy
-Il0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJWaiI6eyJsZiI6
-WyIxIl0sInh1IjpbIjEiXSwiY1giOlsiMSJdfSwiWHYiOnsieHUiOlsiMSJdLCJjWCI6WyIxIl19LCJ1
-dyI6eyJZayI6WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0s
-Imk4Ijp7ImFMIjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJxVSJ9LCJDViI6
-eyJVayI6WyJ6TTxLTj4iLCJxVSJdLCJVay5TIjoiek08S04+In0sIlU4Ijp7IndJIjpbInpNPEtOPiIs
-InFVIl19LCJaaSI6eyJVayI6WyJxVSIsInpNPEtOPiJdfSwiYnkiOnsiVWsiOlsiayIsInFVIl0sIlVr
-LlMiOiJrIn0sIk14Ijp7IndJIjpbInFVIiwiayJdfSwidTUiOnsiVWsiOlsicVUiLCJ6TTxLTj4iXSwi
-VWsuUyI6InFVIn0sIkUzIjp7IndJIjpbInFVIiwiek08S04+Il19LCJHWSI6eyJ3SSI6WyJ6TTxLTj4i
-LCJxVSJdfSwiQ1AiOnsiRksiOltdfSwiQzYiOnsiWFMiOltdfSwibiI6eyJYUyI6W119LCJ1Ijp7IlhT
-IjpbXX0sImJKIjp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhTIjpbXX0sInViIjp7IlhT
-IjpbXX0sImRzIjp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhTIjpbXX0sIms1Ijp7IlhT
-IjpbXX0sIktZIjp7IlhTIjpbXX0sImMiOnsiWFMiOltdfSwiS04iOnsiRksiOltdfSwiek0iOnsiY1gi
-OlsiMSJdfSwiaWIiOnsiT2QiOltdfSwieHUiOnsiY1giOlsiMSJdfSwicVUiOnsidlgiOltdfSwiUm4i
-OnsiQkwiOltdfSwiRG4iOnsiaUQiOltdfSwiVWYiOnsiaUQiOltdfSwicWUiOnsiaUQiOltdfSwicUUi
-OnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIkdoIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJm
-WSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwibkIiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0s
-IlFQIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJueCI6eyJ1SCI6W10sIkQwIjpbXX0sIlFGIjp7
-InVIIjpbXSwiRDAiOltdfSwiSUIiOnsidG4iOlsiRksiXX0sInd6Ijp7ImxEIjpbIjEiXSwiek0iOlsi
-MSJdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sImN2Ijp7InVIIjpbXSwiRDAiOltdfSwiVDUiOnsiQXoi
-OltdfSwiaDQiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlZiIjp7InVIIjpbXSwiRDAiOltdfSwi
-TzciOnsiRDAiOltdfSwid2EiOnsiRDAiOltdfSwiQWoiOnsiZWEiOltdfSwiZTciOnsibEQiOlsidUgi
-XSwiek0iOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVIIn0sInVIIjp7IkQwIjpbXX0sIkJIIjp7
-IkdtIjpbInVIIl0sImxEIjpbInVIIl0sInpNIjpbInVIIl0sIlhqIjpbInVIIl0sImNYIjpbInVIIl0s
-ImxELkUiOiJ1SCIsIkdtLkUiOiJ1SCJ9LCJTTiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiZXci
-OnsiZWEiOltdfSwibHAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlRiIjp7ImN2IjpbXSwidUgi
-OltdLCJEMCI6W119LCJJdiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiQlQiOnsiY3YiOltdLCJ1
-SCI6W10sIkQwIjpbXX0sInlZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJ3NiI6eyJlYSI6W119
-LCJLNSI6eyJ2NiI6W10sIkQwIjpbXX0sIkNtIjp7IkQwIjpbXX0sIkNRIjp7InVIIjpbXSwiRDAiOltd
-fSwidzQiOnsidG4iOlsiRksiXX0sInJoIjp7IkdtIjpbInVIIl0sImxEIjpbInVIIl0sInpNIjpbInVI
-Il0sIlhqIjpbInVIIl0sImNYIjpbInVIIl0sImxELkUiOiJ1SCIsIkdtLkUiOiJ1SCJ9LCJEOSI6eyJZ
-ayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXX0sImk3Ijp7IllrIjpbInFVIiwicVUiXSwiWjAi
-OlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUifSwiU3kiOnsiWWsiOlsicVUiLCJxVSJd
-LCJaMCI6WyJxVSIsInFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJxVSJ9LCJJNCI6eyJsZiI6WyJxVSJd
-LCJ4dSI6WyJxVSJdLCJjWCI6WyJxVSJdfSwiUk8iOnsicWgiOlsiMSJdfSwiQ3EiOnsiUk8iOlsiMSJd
-LCJxaCI6WyIxIl19LCJ4QyI6eyJNTyI6WyIxIl19LCJKUSI6eyJrRiI6W119LCJ2RCI6eyJrRiI6W119
-LCJtNiI6eyJrRiI6W119LCJjdCI6eyJrRiI6W119LCJPdyI6eyJrRiI6W119LCJXOSI6eyJBbiI6WyIx
-Il19LCJkVyI6eyJ2NiI6W10sIkQwIjpbXX0sIm1rIjp7InkwIjpbXX0sIktvIjp7Im9uIjpbXX0sIkFz
-Ijp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImNYIjpbInFVIl19LCJyNyI6eyJFNCI6W119LCJUeiI6
-eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sIm5kIjp7
-ImQ1IjpbXSwiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0sInh1IjpbInFV
-Il0sImNYIjpbInFVIl19LCJkNSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwibjYiOnsiek0iOlsi
-S04iXSwiQVMiOltdLCJjWCI6WyJLTiJdfSwiWEEiOnsia0YiOltdfSwiT0YiOnsiTHUiOltdfSwicnUi
-OnsiTHUiOltdfSwiSVYiOnsiTHUiOltdfX0nKSkKSC5GRih2LnR5cGVVbml2ZXJzZSxKU09OLnBhcnNl
-KCd7ImJRIjoxLCJYQyI6MSwiTU8iOjEsImtUIjoyLCJtVyI6MSwiTFUiOjEsImlsIjoyLCJWaiI6MSwi
-blkiOjEsIldZIjoxLCJjbyI6MX0nKSkKdmFyIHU9KGZ1bmN0aW9uIHJ0aWkoKXt2YXIgdD1ILk4wCnJl
-dHVybntpOnQoIkdoIiksbjp0KCJDdyIpLGNSOnQoIm5CIiksZDp0KCJBeiIpLFk6dCgiUVAiKSxnRjp0
-KCJQRDxHRCxAPiIpLGg6dCgiY3YiKSxiVTp0KCJYUyIpLEI6dCgiZWEiKSxhUzp0KCJEMCIpLGM4OnQo
-IlQ1IiksWjp0KCJFSCIpLGM6dCgiYjg8QD4iKSxyOnQoIk83IiksSTp0KCJTZyIpLG86dCgidlEiKSxl
-aDp0KCJjWDx1SD4iKSxYOnQoImNYPHFVPiIpLFI6dCgiY1g8QD4iKSxmQTp0KCJqZDxTZT4iKSx1OnQo
-ImpkPGo4PiIpLGJQOnQoImpkPHVGPiIpLGZoOnQoImpkPFpaPiIpLGs6dCgiamQ8a0Y+Iiksczp0KCJq
-ZDxxVT4iKSxoaDp0KCJqZDx5RD4iKSxhSjp0KCJqZDx3Yj4iKSxtOnQoImpkPEA+IiksdDp0KCJqZDxL
-Tj4iKSxlSDp0KCJ2bSIpLGc6dCgiYzUiKSxhVTp0KCJYajxAPiIpLGFtOnQoIlR6PEA+IiksZW86dCgi
-TjU8R0QsQD4iKSx2OnQoIkU0IiksZHo6dCgiaEYiKSxhOnQoInpNPHFVPiIpLGo6dCgiek08QD4iKSxM
-OnQoInpNPEtOPiIpLEY6dCgidTgiKSxmOnQoIlowPHFVLHFVPiIpLGI6dCgiWjA8cVUsQD4iKSxHOnQo
-IlowPEAsQD4iKSxkdjp0KCJBODxxVSxxVT4iKSxkbzp0KCJBODxxVSxAPiIpLFY6dCgiQWoiKSxkRDp0
-KCJFVCIpLGJtOnQoIlY2IiksQTp0KCJ1SCIpLGU6dCgia0YiKSxQOnQoImM4IiksSzp0KCJrIikscDp0
-KCJldyIpLHE6dCgidG48Rks+IiksZnY6dCgid0wiKSxldzp0KCJuZCIpLEM6dCgieHU8cVU+IiksbDp0
-KCJHeiIpLE46dCgicVUiKSxkRzp0KCJxVShxVSkiKSxnNzp0KCJkNSIpLGZvOnQoIkdEIiksYVc6dCgi
-eVkiKSx3OnQoIkFTIiksZ2M6dCgibjYiKSxhazp0KCJrZCIpLFQ6dCgiR2o8cVUscVU+IiksRDp0KCJp
-RCIpLGNjOnQoIlU1PHFVPiIpLGc0OnQoIks1IiksY2k6dCgidjYiKSxnMjp0KCJDbSIpLGJqOnQoIlpm
-PE83PiIpLGg5OnQoIkNRIiksYWM6dCgiZTciKSxROnQoIkNxPEFqPiIpLFM6dCgid3o8Y3Y+IikseDp0
-KCJGZTxALEA+IiksYW86dCgidnM8Tzc+IiksXzp0KCJ2czxAPiIpLGZKOnQoInZzPEtOPiIpLE86dCgi
-SlEiKSxKOnQoImJuIiksY0o6dCgiYTIiKSxhbDp0KCJhMihrKSIpLGJCOnQoImEyKHFVKSIpLGJmOnQo
-ImEyKEApIiksejp0KCJAIiksZk86dCgiQCgpIiksVTp0KCJAKGVhKSIpLHk6dCgiQChrKSIpLGVwOnQo
-IkAoayxrKSIpLFc6dCgiQChrLEd6KSIpLGNoOnQoIkAoeHU8cVU+KSIpLGRPOnQoIkAocVUpIiksYjg6
-dCgiQChALEApIiksZWc6dCgiS04iKSxIOnQoIn4iKSxNOnQoIn4oKSIpLGFuOnQoIn4oZXcpIiksRTp0
-KCJ+KHFVLHFVKSIpLGNBOnQoIn4ocVUsQCkiKX19KSgpOyhmdW5jdGlvbiBjb25zdGFudHMoKXt2YXIg
-dD1odW5rSGVscGVycy5tYWtlQ29uc3RMaXN0CkMuUlk9Vy5RUC5wcm90b3R5cGUKQy5CWj1XLlZiLnBy
-b3RvdHlwZQpDLkR0PVcuTzcucHJvdG90eXBlCkMuT2s9Si52Qi5wcm90b3R5cGUKQy5ObT1KLmpkLnBy
-b3RvdHlwZQpDLmpuPUoudXIucHJvdG90eXBlCkMuak49Si5ZRS5wcm90b3R5cGUKQy5DRD1KLnFJLnBy
-b3RvdHlwZQpDLnhCPUouRHIucHJvdG90eXBlCkMuREc9Si5jNS5wcm90b3R5cGUKQy5FeD1XLnU4LnBy
-b3RvdHlwZQpDLkx0PVcuU04ucHJvdG90eXBlCkMuWlE9Si5pQy5wcm90b3R5cGUKQy5JZT1XLlRiLnBy
-b3RvdHlwZQpDLnZCPUoua2QucHJvdG90eXBlCkMub2w9Vy5LNS5wcm90b3R5cGUKQy55OD1uZXcgUC5V
-OCgpCkMuaDk9bmV3IFAuQ1YoKQpDLk80PWZ1bmN0aW9uIGdldFRhZ0ZhbGxiYWNrKG8pIHsKICB2YXIg
-cyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTsKICByZXR1cm4gcy5zdWJzdHJpbmco
-OCwgcy5sZW5ndGggLSAxKTsKfQpDLllxPWZ1bmN0aW9uKCkgewogIHZhciB0b1N0cmluZ0Z1bmN0aW9u
-ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICBmdW5jdGlvbiBnZXRUYWcobykgewogICAgdmFy
-IHMgPSB0b1N0cmluZ0Z1bmN0aW9uLmNhbGwobyk7CiAgICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5s
-ZW5ndGggLSAxKTsKICB9CiAgZnVuY3Rpb24gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZykgewogICAg
-aWYgKC9eSFRNTFtBLVpdLipFbGVtZW50JC8udGVzdCh0YWcpKSB7CiAgICAgIHZhciBuYW1lID0gdG9T
-dHJpbmdGdW5jdGlvbi5jYWxsKG9iamVjdCk7CiAgICAgIGlmIChuYW1lID09ICJbb2JqZWN0IE9iamVj
-dF0iKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuICJIVE1MRWxlbWVudCI7CiAgICB9CiAgfQogIGZ1
-bmN0aW9uIGdldFVua25vd25UYWdHZW5lcmljQnJvd3NlcihvYmplY3QsIHRhZykgewogICAgaWYgKHNl
-bGYuSFRNTEVsZW1lbnQgJiYgb2JqZWN0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHJldHVybiAiSFRN
-TEVsZW1lbnQiOwogICAgcmV0dXJuIGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpOwogIH0KICBmdW5j
-dGlvbiBwcm90b3R5cGVGb3JUYWcodGFnKSB7CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAidW5kZWZp
-bmVkIikgcmV0dXJuIG51bGw7CiAgICBpZiAodHlwZW9mIHdpbmRvd1t0YWddID09ICJ1bmRlZmluZWQi
-KSByZXR1cm4gbnVsbDsKICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKHR5
-cGVvZiBjb25zdHJ1Y3RvciAhPSAiZnVuY3Rpb24iKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBjb25z
-dHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGZ1bmN0aW9uIGRpc2NyaW1pbmF0b3IodGFnKSB7IHJldHVy
-biBudWxsOyB9CiAgdmFyIGlzQnJvd3NlciA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCI7CiAg
-cmV0dXJuIHsKICAgIGdldFRhZzogZ2V0VGFnLAogICAgZ2V0VW5rbm93blRhZzogaXNCcm93c2VyID8g
-Z2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2VyIDogZ2V0VW5rbm93blRhZywKICAgIHByb3RvdHlwZUZv
-clRhZzogcHJvdG90eXBlRm9yVGFnLAogICAgZGlzY3JpbWluYXRvcjogZGlzY3JpbWluYXRvciB9Owp9
-CkMud2I9ZnVuY3Rpb24oZ2V0VGFnRmFsbGJhY2spIHsKICByZXR1cm4gZnVuY3Rpb24oaG9va3MpIHsK
-ICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9ICJvYmplY3QiKSByZXR1cm4gaG9va3M7CiAgICB2YXIg
-dWEgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgaWYgKHVhLmluZGV4T2YoIkR1bXBSZW5kZXJUcmVl
-IikgPj0gMCkgcmV0dXJuIGhvb2tzOwogICAgaWYgKHVhLmluZGV4T2YoIkNocm9tZSIpID49IDApIHsK
-ICAgICAgZnVuY3Rpb24gY29uZmlybShwKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT0g
-Im9iamVjdCIgJiYgd2luZG93W3BdICYmIHdpbmRvd1twXS5uYW1lID09IHA7CiAgICAgIH0KICAgICAg
-aWYgKGNvbmZpcm0oIldpbmRvdyIpICYmIGNvbmZpcm0oIkhUTUxFbGVtZW50IikpIHJldHVybiBob29r
-czsKICAgIH0KICAgIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZhbGxiYWNrOwogIH07Cn0KQy5LVT1mdW5j
-dGlvbihob29rcykgewogIGlmICh0eXBlb2YgZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnICE9ICJm
-dW5jdGlvbiIpIHJldHVybiBob29rczsKICBob29rcy5nZXRUYWcgPSBkYXJ0RXhwZXJpbWVudGFsRml4
-dXBHZXRUYWcoaG9va3MuZ2V0VGFnKTsKfQpDLmZRPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIGdldFRh
-ZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcHJvdG90eXBlRm9yVGFnID0gaG9va3MucHJvdG90eXBlRm9y
-VGFnOwogIGZ1bmN0aW9uIGdldFRhZ0ZpeGVkKG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAg
-ICBpZiAodGFnID09ICJEb2N1bWVudCIpIHsKICAgICAgaWYgKCEhby54bWxWZXJzaW9uKSByZXR1cm4g
-IiFEb2N1bWVudCI7CiAgICAgIHJldHVybiAiIUhUTUxEb2N1bWVudCI7CiAgICB9CiAgICByZXR1cm4g
-dGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWdGaXhlZCh0YWcpIHsKICAgIGlmICh0YWcg
-PT0gIkRvY3VtZW50IikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gcHJvdG90eXBlRm9yVGFnKHRhZyk7
-CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZpeGVkOwogIGhvb2tzLnByb3RvdHlwZUZvclRhZyA9
-IHByb3RvdHlwZUZvclRhZ0ZpeGVkOwp9CkMuZGs9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFn
-ZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAi
-IjsKICBpZiAodXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwog
-IHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVu
-bG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJH
-ZW9HZW9sb2NhdGlvbiI6ICJHZW9sb2NhdGlvbiIsCiAgICAiTG9jYXRpb24iOiAiIUxvY2F0aW9uIiwK
-ICAgICJXb3JrZXJNZXNzYWdlRXZlbnQiOiAiTWVzc2FnZUV2ZW50IiwKICAgICJYTUxEb2N1bWVudCI6
-ICIhRG9jdW1lbnQifTsKICBmdW5jdGlvbiBnZXRUYWdGaXJlZm94KG8pIHsKICAgIHZhciB0YWcgPSBn
-ZXRUYWcobyk7CiAgICByZXR1cm4gcXVpY2tNYXBbdGFnXSB8fCB0YWc7CiAgfQogIGhvb2tzLmdldFRh
-ZyA9IGdldFRhZ0ZpcmVmb3g7Cn0KQy54aT1mdW5jdGlvbihob29rcykgewogIHZhciB1c2VyQWdlbnQg
-PSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICIiOwog
-IGlmICh1c2VyQWdlbnQuaW5kZXhPZigiVHJpZGVudC8iKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZh
-ciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9h
-ZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJIVE1M
-RERFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJIVE1MRFRFbGVtZW50IjogIkhUTUxFbGVtZW50
-IiwKICAgICJIVE1MUGhyYXNlRWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiUG9zaXRpb24iOiAi
-R2VvcG9zaXRpb24iCiAgfTsKICBmdW5jdGlvbiBnZXRUYWdJRShvKSB7CiAgICB2YXIgdGFnID0gZ2V0
-VGFnKG8pOwogICAgdmFyIG5ld1RhZyA9IHF1aWNrTWFwW3RhZ107CiAgICBpZiAobmV3VGFnKSByZXR1
-cm4gbmV3VGFnOwogICAgaWYgKHRhZyA9PSAiT2JqZWN0IikgewogICAgICBpZiAod2luZG93LkRhdGFW
-aWV3ICYmIChvIGluc3RhbmNlb2Ygd2luZG93LkRhdGFWaWV3KSkgcmV0dXJuICJEYXRhVmlldyI7CiAg
-ICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWdJRSh0YWcpIHsK
-ICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKGNvbnN0cnVjdG9yID09IG51
-bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9CiAgaG9v
-a3MuZ2V0VGFnID0gZ2V0VGFnSUU7CiAgaG9va3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90eXBlRm9y
-VGFnSUU7Cn0KQy5pNz1mdW5jdGlvbihob29rcykgeyByZXR1cm4gaG9va3M7IH0KCkMuQ3Q9bmV3IFAu
-YnkoKQpDLkVxPW5ldyBQLms1KCkKQy54TT1uZXcgUC51NSgpCkMuUWs9bmV3IFAuRTMoKQpDLk5VPW5l
-dyBQLkppKCkKQy5BMz1uZXcgUC5NeChudWxsKQpDLkdiPUguVk0odChbMTI3LDIwNDcsNjU1MzUsMTEx
-NDExMV0pLHUudCkKQy5haz1ILlZNKHQoWzAsMCwzMjc3NiwzMzc5MiwxLDEwMjQwLDAsMF0pLHUudCkK
-Qy5jbT1ILlZNKHQoWyIqOjpjbGFzcyIsIio6OmRpciIsIio6OmRyYWdnYWJsZSIsIio6OmhpZGRlbiIs
-Iio6OmlkIiwiKjo6aW5lcnQiLCIqOjppdGVtcHJvcCIsIio6Oml0ZW1yZWYiLCIqOjppdGVtc2NvcGUi
-LCIqOjpsYW5nIiwiKjo6c3BlbGxjaGVjayIsIio6OnRpdGxlIiwiKjo6dHJhbnNsYXRlIiwiQTo6YWNj
-ZXNza2V5IiwiQTo6Y29vcmRzIiwiQTo6aHJlZmxhbmciLCJBOjpuYW1lIiwiQTo6c2hhcGUiLCJBOjp0
-YWJpbmRleCIsIkE6OnRhcmdldCIsIkE6OnR5cGUiLCJBUkVBOjphY2Nlc3NrZXkiLCJBUkVBOjphbHQi
-LCJBUkVBOjpjb29yZHMiLCJBUkVBOjpub2hyZWYiLCJBUkVBOjpzaGFwZSIsIkFSRUE6OnRhYmluZGV4
-IiwiQVJFQTo6dGFyZ2V0IiwiQVVESU86OmNvbnRyb2xzIiwiQVVESU86Omxvb3AiLCJBVURJTzo6bWVk
-aWFncm91cCIsIkFVRElPOjptdXRlZCIsIkFVRElPOjpwcmVsb2FkIiwiQkRPOjpkaXIiLCJCT0RZOjph
-bGluayIsIkJPRFk6OmJnY29sb3IiLCJCT0RZOjpsaW5rIiwiQk9EWTo6dGV4dCIsIkJPRFk6OnZsaW5r
-IiwiQlI6OmNsZWFyIiwiQlVUVE9OOjphY2Nlc3NrZXkiLCJCVVRUT046OmRpc2FibGVkIiwiQlVUVE9O
-OjpuYW1lIiwiQlVUVE9OOjp0YWJpbmRleCIsIkJVVFRPTjo6dHlwZSIsIkJVVFRPTjo6dmFsdWUiLCJD
-QU5WQVM6OmhlaWdodCIsIkNBTlZBUzo6d2lkdGgiLCJDQVBUSU9OOjphbGlnbiIsIkNPTDo6YWxpZ24i
-LCJDT0w6OmNoYXIiLCJDT0w6OmNoYXJvZmYiLCJDT0w6OnNwYW4iLCJDT0w6OnZhbGlnbiIsIkNPTDo6
-d2lkdGgiLCJDT0xHUk9VUDo6YWxpZ24iLCJDT0xHUk9VUDo6Y2hhciIsIkNPTEdST1VQOjpjaGFyb2Zm
-IiwiQ09MR1JPVVA6OnNwYW4iLCJDT0xHUk9VUDo6dmFsaWduIiwiQ09MR1JPVVA6OndpZHRoIiwiQ09N
-TUFORDo6Y2hlY2tlZCIsIkNPTU1BTkQ6OmNvbW1hbmQiLCJDT01NQU5EOjpkaXNhYmxlZCIsIkNPTU1B
-TkQ6OmxhYmVsIiwiQ09NTUFORDo6cmFkaW9ncm91cCIsIkNPTU1BTkQ6OnR5cGUiLCJEQVRBOjp2YWx1
-ZSIsIkRFTDo6ZGF0ZXRpbWUiLCJERVRBSUxTOjpvcGVuIiwiRElSOjpjb21wYWN0IiwiRElWOjphbGln
-biIsIkRMOjpjb21wYWN0IiwiRklFTERTRVQ6OmRpc2FibGVkIiwiRk9OVDo6Y29sb3IiLCJGT05UOjpm
-YWNlIiwiRk9OVDo6c2l6ZSIsIkZPUk06OmFjY2VwdCIsIkZPUk06OmF1dG9jb21wbGV0ZSIsIkZPUk06
-OmVuY3R5cGUiLCJGT1JNOjptZXRob2QiLCJGT1JNOjpuYW1lIiwiRk9STTo6bm92YWxpZGF0ZSIsIkZP
-Uk06OnRhcmdldCIsIkZSQU1FOjpuYW1lIiwiSDE6OmFsaWduIiwiSDI6OmFsaWduIiwiSDM6OmFsaWdu
-IiwiSDQ6OmFsaWduIiwiSDU6OmFsaWduIiwiSDY6OmFsaWduIiwiSFI6OmFsaWduIiwiSFI6Om5vc2hh
-ZGUiLCJIUjo6c2l6ZSIsIkhSOjp3aWR0aCIsIkhUTUw6OnZlcnNpb24iLCJJRlJBTUU6OmFsaWduIiwi
-SUZSQU1FOjpmcmFtZWJvcmRlciIsIklGUkFNRTo6aGVpZ2h0IiwiSUZSQU1FOjptYXJnaW5oZWlnaHQi
-LCJJRlJBTUU6Om1hcmdpbndpZHRoIiwiSUZSQU1FOjp3aWR0aCIsIklNRzo6YWxpZ24iLCJJTUc6OmFs
-dCIsIklNRzo6Ym9yZGVyIiwiSU1HOjpoZWlnaHQiLCJJTUc6OmhzcGFjZSIsIklNRzo6aXNtYXAiLCJJ
-TUc6Om5hbWUiLCJJTUc6OnVzZW1hcCIsIklNRzo6dnNwYWNlIiwiSU1HOjp3aWR0aCIsIklOUFVUOjph
-Y2NlcHQiLCJJTlBVVDo6YWNjZXNza2V5IiwiSU5QVVQ6OmFsaWduIiwiSU5QVVQ6OmFsdCIsIklOUFVU
-OjphdXRvY29tcGxldGUiLCJJTlBVVDo6YXV0b2ZvY3VzIiwiSU5QVVQ6OmNoZWNrZWQiLCJJTlBVVDo6
-ZGlzYWJsZWQiLCJJTlBVVDo6aW5wdXRtb2RlIiwiSU5QVVQ6OmlzbWFwIiwiSU5QVVQ6Omxpc3QiLCJJ
-TlBVVDo6bWF4IiwiSU5QVVQ6Om1heGxlbmd0aCIsIklOUFVUOjptaW4iLCJJTlBVVDo6bXVsdGlwbGUi
-LCJJTlBVVDo6bmFtZSIsIklOUFVUOjpwbGFjZWhvbGRlciIsIklOUFVUOjpyZWFkb25seSIsIklOUFVU
-OjpyZXF1aXJlZCIsIklOUFVUOjpzaXplIiwiSU5QVVQ6OnN0ZXAiLCJJTlBVVDo6dGFiaW5kZXgiLCJJ
-TlBVVDo6dHlwZSIsIklOUFVUOjp1c2VtYXAiLCJJTlBVVDo6dmFsdWUiLCJJTlM6OmRhdGV0aW1lIiwi
-S0VZR0VOOjpkaXNhYmxlZCIsIktFWUdFTjo6a2V5dHlwZSIsIktFWUdFTjo6bmFtZSIsIkxBQkVMOjph
-Y2Nlc3NrZXkiLCJMQUJFTDo6Zm9yIiwiTEVHRU5EOjphY2Nlc3NrZXkiLCJMRUdFTkQ6OmFsaWduIiwi
-TEk6OnR5cGUiLCJMSTo6dmFsdWUiLCJMSU5LOjpzaXplcyIsIk1BUDo6bmFtZSIsIk1FTlU6OmNvbXBh
-Y3QiLCJNRU5VOjpsYWJlbCIsIk1FTlU6OnR5cGUiLCJNRVRFUjo6aGlnaCIsIk1FVEVSOjpsb3ciLCJN
-RVRFUjo6bWF4IiwiTUVURVI6Om1pbiIsIk1FVEVSOjp2YWx1ZSIsIk9CSkVDVDo6dHlwZW11c3RtYXRj
-aCIsIk9MOjpjb21wYWN0IiwiT0w6OnJldmVyc2VkIiwiT0w6OnN0YXJ0IiwiT0w6OnR5cGUiLCJPUFRH
-Uk9VUDo6ZGlzYWJsZWQiLCJPUFRHUk9VUDo6bGFiZWwiLCJPUFRJT046OmRpc2FibGVkIiwiT1BUSU9O
-OjpsYWJlbCIsIk9QVElPTjo6c2VsZWN0ZWQiLCJPUFRJT046OnZhbHVlIiwiT1VUUFVUOjpmb3IiLCJP
-VVRQVVQ6Om5hbWUiLCJQOjphbGlnbiIsIlBSRTo6d2lkdGgiLCJQUk9HUkVTUzo6bWF4IiwiUFJPR1JF
-U1M6Om1pbiIsIlBST0dSRVNTOjp2YWx1ZSIsIlNFTEVDVDo6YXV0b2NvbXBsZXRlIiwiU0VMRUNUOjpk
-aXNhYmxlZCIsIlNFTEVDVDo6bXVsdGlwbGUiLCJTRUxFQ1Q6Om5hbWUiLCJTRUxFQ1Q6OnJlcXVpcmVk
-IiwiU0VMRUNUOjpzaXplIiwiU0VMRUNUOjp0YWJpbmRleCIsIlNPVVJDRTo6dHlwZSIsIlRBQkxFOjph
-bGlnbiIsIlRBQkxFOjpiZ2NvbG9yIiwiVEFCTEU6OmJvcmRlciIsIlRBQkxFOjpjZWxscGFkZGluZyIs
-IlRBQkxFOjpjZWxsc3BhY2luZyIsIlRBQkxFOjpmcmFtZSIsIlRBQkxFOjpydWxlcyIsIlRBQkxFOjpz
-dW1tYXJ5IiwiVEFCTEU6OndpZHRoIiwiVEJPRFk6OmFsaWduIiwiVEJPRFk6OmNoYXIiLCJUQk9EWTo6
-Y2hhcm9mZiIsIlRCT0RZOjp2YWxpZ24iLCJURDo6YWJiciIsIlREOjphbGlnbiIsIlREOjpheGlzIiwi
-VEQ6OmJnY29sb3IiLCJURDo6Y2hhciIsIlREOjpjaGFyb2ZmIiwiVEQ6OmNvbHNwYW4iLCJURDo6aGVh
-ZGVycyIsIlREOjpoZWlnaHQiLCJURDo6bm93cmFwIiwiVEQ6OnJvd3NwYW4iLCJURDo6c2NvcGUiLCJU
-RDo6dmFsaWduIiwiVEQ6OndpZHRoIiwiVEVYVEFSRUE6OmFjY2Vzc2tleSIsIlRFWFRBUkVBOjphdXRv
-Y29tcGxldGUiLCJURVhUQVJFQTo6Y29scyIsIlRFWFRBUkVBOjpkaXNhYmxlZCIsIlRFWFRBUkVBOjpp
-bnB1dG1vZGUiLCJURVhUQVJFQTo6bmFtZSIsIlRFWFRBUkVBOjpwbGFjZWhvbGRlciIsIlRFWFRBUkVB
-OjpyZWFkb25seSIsIlRFWFRBUkVBOjpyZXF1aXJlZCIsIlRFWFRBUkVBOjpyb3dzIiwiVEVYVEFSRUE6
-OnRhYmluZGV4IiwiVEVYVEFSRUE6OndyYXAiLCJURk9PVDo6YWxpZ24iLCJURk9PVDo6Y2hhciIsIlRG
-T09UOjpjaGFyb2ZmIiwiVEZPT1Q6OnZhbGlnbiIsIlRIOjphYmJyIiwiVEg6OmFsaWduIiwiVEg6OmF4
-aXMiLCJUSDo6Ymdjb2xvciIsIlRIOjpjaGFyIiwiVEg6OmNoYXJvZmYiLCJUSDo6Y29sc3BhbiIsIlRI
-OjpoZWFkZXJzIiwiVEg6OmhlaWdodCIsIlRIOjpub3dyYXAiLCJUSDo6cm93c3BhbiIsIlRIOjpzY29w
-ZSIsIlRIOjp2YWxpZ24iLCJUSDo6d2lkdGgiLCJUSEVBRDo6YWxpZ24iLCJUSEVBRDo6Y2hhciIsIlRI
-RUFEOjpjaGFyb2ZmIiwiVEhFQUQ6OnZhbGlnbiIsIlRSOjphbGlnbiIsIlRSOjpiZ2NvbG9yIiwiVFI6
-OmNoYXIiLCJUUjo6Y2hhcm9mZiIsIlRSOjp2YWxpZ24iLCJUUkFDSzo6ZGVmYXVsdCIsIlRSQUNLOjpr
-aW5kIiwiVFJBQ0s6OmxhYmVsIiwiVFJBQ0s6OnNyY2xhbmciLCJVTDo6Y29tcGFjdCIsIlVMOjp0eXBl
-IiwiVklERU86OmNvbnRyb2xzIiwiVklERU86OmhlaWdodCIsIlZJREVPOjpsb29wIiwiVklERU86Om1l
-ZGlhZ3JvdXAiLCJWSURFTzo6bXV0ZWQiLCJWSURFTzo6cHJlbG9hZCIsIlZJREVPOjp3aWR0aCJdKSx1
-LnMpCkMuVkM9SC5WTSh0KFswLDAsNjU0OTAsNDUwNTUsNjU1MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx1
-LnQpCkMubUs9SC5WTSh0KFswLDAsMjY2MjQsMTAyMyw2NTUzNCwyMDQ3LDY1NTM0LDIwNDddKSx1LnQp
-CkMuU3E9SC5WTSh0KFsiSEVBRCIsIkFSRUEiLCJCQVNFIiwiQkFTRUZPTlQiLCJCUiIsIkNPTCIsIkNP
-TEdST1VQIiwiRU1CRUQiLCJGUkFNRSIsIkZSQU1FU0VUIiwiSFIiLCJJTUFHRSIsIklNRyIsIklOUFVU
-IiwiSVNJTkRFWCIsIkxJTksiLCJNRVRBIiwiUEFSQU0iLCJTT1VSQ0UiLCJTVFlMRSIsIlRJVExFIiwi
-V0JSIl0pLHUucykKQy54RD1ILlZNKHQoW10pLHUudSkKQy5kbj1ILlZNKHQoW10pLHUucykKQy5oVT1I
-LlZNKHQoW10pLHUubSkKQy50bz1ILlZNKHQoWzAsMCwzMjcyMiwxMjI4Nyw2NTUzNCwzNDgxNSw2NTUz
-NCwxODQzMV0pLHUudCkKQy5GMz1ILlZNKHQoWzAsMCwyNDU3NiwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0
-LDE4NDMxXSksdS50KQpDLmVhPUguVk0odChbMCwwLDMyNzU0LDExMjYzLDY1NTM0LDM0ODE1LDY1NTM0
-LDE4NDMxXSksdS50KQpDLlpKPUguVk0odChbMCwwLDMyNzIyLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0
-LDE4NDMxXSksdS50KQpDLldkPUguVk0odChbMCwwLDY1NDkwLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0
-LDE4NDMxXSksdS50KQpDLlF4PUguVk0odChbImJpbmQiLCJpZiIsInJlZiIsInJlcGVhdCIsInN5bnRh
-eCJdKSx1LnMpCkMuQkk9SC5WTSh0KFsiQTo6aHJlZiIsIkFSRUE6OmhyZWYiLCJCTE9DS1FVT1RFOjpj
-aXRlIiwiQk9EWTo6YmFja2dyb3VuZCIsIkNPTU1BTkQ6Omljb24iLCJERUw6OmNpdGUiLCJGT1JNOjph
-Y3Rpb24iLCJJTUc6OnNyYyIsIklOUFVUOjpzcmMiLCJJTlM6OmNpdGUiLCJROjpjaXRlIiwiVklERU86
-OnBvc3RlciJdKSx1LnMpCkMuV089bmV3IEguTFAoMCx7fSxDLmRuLEguTjAoIkxQPHFVLHFVPiIpKQpD
-LmlIPUguVk0odChbXSksSC5OMCgiamQ8R0Q+IikpCkMuQ009bmV3IEguTFAoMCx7fSxDLmlILEguTjAo
-IkxQPEdELEA+IikpCkMuWTI9bmV3IEwueTgoIk5hdmlnYXRpb25UcmVlTm9kZVR5cGUuZGlyZWN0b3J5
-IikKQy5yZj1uZXcgTC55OCgiTmF2aWdhdGlvblRyZWVOb2RlVHlwZS5maWxlIikKQy5UZT1uZXcgSC53
-digiY2FsbCIpfSkoKTsoZnVuY3Rpb24gc3RhdGljRmllbGRzKCl7JC55aj0wCiQubUo9bnVsbAokLlA0
-PW51bGwKJC5ORj1udWxsCiQuVFg9bnVsbAokLng3PW51bGwKJC5udz1udWxsCiQudnY9bnVsbAokLkJ2
-PW51bGwKJC5TNj1udWxsCiQuazg9bnVsbAokLm1nPW51bGwKJC5VRD0hMQokLlgzPUMuTlUKJC54Zz1b
-XQokLnhvPW51bGwKJC5CTz1udWxsCiQubHQ9bnVsbAokLkVVPW51bGwKJC5vcj1QLkZsKHUuTix1Llop
-CiQuSTY9bnVsbAokLkZmPW51bGx9KSgpOyhmdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXJzKCl7dmFyIHQ9
-aHVua0hlbHBlcnMubGF6eQp0KCQsImZhIiwidyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5ZZygiXyRkYXJ0
-X2RhcnRDbG9zdXJlIil9KQp0KCQsIlkyIiwiVU4iLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFy
-dF9qcyIpfSkKdCgkLCJVMiIsIlNuIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoewp0b1N0cmlu
-ZzpmdW5jdGlvbigpe3JldHVybiIkcmVjZWl2ZXIkIn19KSl9KQp0KCQsInhxIiwibHEiLGZ1bmN0aW9u
-KCl7cmV0dXJuIEguY00oSC5TNyh7JG1ldGhvZCQ6bnVsbCwKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1
-cm4iJHJlY2VpdmVyJCJ9fSkpfSkKdCgkLCJSMSIsIk45IixmdW5jdGlvbigpe3JldHVybiBILmNNKEgu
-UzcobnVsbCkpfSkKdCgkLCJmTiIsImlJIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7
-dmFyICRhcmd1bWVudHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXtudWxsLiRtZXRob2QkKCRhcmd1bWVu
-dHNFeHByJCl9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2FnZX19KCkpfSkKdCgkLCJxaSIsIktmIixmdW5j
-dGlvbigpe3JldHVybiBILmNNKEguUzcodm9pZCAwKSl9KQp0KCQsInJaIiwiWmgiLGZ1bmN0aW9uKCl7
-cmV0dXJuIEguY00oZnVuY3Rpb24oKXt2YXIgJGFyZ3VtZW50c0V4cHIkPSckYXJndW1lbnRzJCcKdHJ5
-eyh2b2lkIDApLiRtZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2Fn
-ZX19KCkpfSkKdCgkLCJrcSIsImNQIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguTWoobnVsbCkpfSkK
-dCgkLCJ0dCIsImMzIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5e251bGwuJG1l
-dGhvZCR9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2FnZX19KCkpfSkKdCgkLCJkdCIsIkhLIixmdW5jdGlv
-bigpe3JldHVybiBILmNNKEguTWoodm9pZCAwKSl9KQp0KCQsIkE3IiwicjEiLGZ1bmN0aW9uKCl7cmV0
-dXJuIEguY00oZnVuY3Rpb24oKXt0cnl7KHZvaWQgMCkuJG1ldGhvZCR9Y2F0Y2gocyl7cmV0dXJuIHMu
-bWVzc2FnZX19KCkpfSkKdCgkLCJXYyIsInV0IixmdW5jdGlvbigpe3JldHVybiBQLk9qKCl9KQp0KCQs
-ImtoIiwicmYiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuV0koKX0pCnQoJCwiYnQiLCJWNyIsZnVuY3Rpb24o
-KXtyZXR1cm4gSC5EUShILlhGKEguVk0oWy0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
-LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
-LC0yLC0yLC0yLC0yLC0yLC0xLC0yLC0yLC0yLC0yLC0yLDYyLC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1
-LDU2LDU3LDU4LDU5LDYwLDYxLC0yLC0yLC0yLC0xLC0yLC0yLC0yLDAsMSwyLDMsNCw1LDYsNyw4LDks
-MTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIs
-NjMsLTIsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMs
-NDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTIsLTIsLTIsLTIsLTJdLHUudCkpKX0pCnQoJCwiTTUiLCJ3
-USIsZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJv
-dG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PSJbb2JqZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5w
-bGF0Zm9ybT09IndpbjMyIn0pCnQoJCwibWYiLCJ6NCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXltc
-XC1cXC4wLTlBLVpfYS16fl0qJCIpfSkKdCgkLCJKRyIsInZaIixmdW5jdGlvbigpe3JldHVybiBQLnV4
-KCl9KQp0KCQsIlNDIiwiQU4iLGZ1bmN0aW9uKCl7cmV0dXJuIFAudE0oWyJBIiwiQUJCUiIsIkFDUk9O
-WU0iLCJBRERSRVNTIiwiQVJFQSIsIkFSVElDTEUiLCJBU0lERSIsIkFVRElPIiwiQiIsIkJESSIsIkJE
-TyIsIkJJRyIsIkJMT0NLUVVPVEUiLCJCUiIsIkJVVFRPTiIsIkNBTlZBUyIsIkNBUFRJT04iLCJDRU5U
-RVIiLCJDSVRFIiwiQ09ERSIsIkNPTCIsIkNPTEdST1VQIiwiQ09NTUFORCIsIkRBVEEiLCJEQVRBTElT
-VCIsIkREIiwiREVMIiwiREVUQUlMUyIsIkRGTiIsIkRJUiIsIkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJ
-RUxEU0VUIiwiRklHQ0FQVElPTiIsIkZJR1VSRSIsIkZPTlQiLCJGT09URVIiLCJGT1JNIiwiSDEiLCJI
-MiIsIkgzIiwiSDQiLCJINSIsIkg2IiwiSEVBREVSIiwiSEdST1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwi
-SU1HIiwiSU5QVVQiLCJJTlMiLCJLQkQiLCJMQUJFTCIsIkxFR0VORCIsIkxJIiwiTUFQIiwiTUFSSyIs
-Ik1FTlUiLCJNRVRFUiIsIk5BViIsIk5PQlIiLCJPTCIsIk9QVEdST1VQIiwiT1BUSU9OIiwiT1VUUFVU
-IiwiUCIsIlBSRSIsIlBST0dSRVNTIiwiUSIsIlMiLCJTQU1QIiwiU0VDVElPTiIsIlNFTEVDVCIsIlNN
-QUxMIiwiU09VUkNFIiwiU1BBTiIsIlNUUklLRSIsIlNUUk9ORyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAi
-LCJUQUJMRSIsIlRCT0RZIiwiVEQiLCJURVhUQVJFQSIsIlRGT09UIiwiVEgiLCJUSEVBRCIsIlRJTUUi
-LCJUUiIsIlRSQUNLIiwiVFQiLCJVIiwiVUwiLCJWQVIiLCJWSURFTyIsIldCUiJdLHUuTil9KQp0KCQs
-Ilg0IiwiaEciLGZ1bmN0aW9uKCl7cmV0dXJuIFAubnUoIl5cXFMrJCIpfSkKdCgkLCJ3TyIsIm93Iixm
-dW5jdGlvbigpe3JldHVybiB1LnYuYihQLk5EKHNlbGYpKX0pCnQoJCwia3QiLCJSOCIsZnVuY3Rpb24o
-KXtyZXR1cm4gSC5ZZygiXyRkYXJ0X2RhcnRPYmplY3QiKX0pCnQoJCwiZksiLCJrSSIsZnVuY3Rpb24o
-KXtyZXR1cm4gZnVuY3Rpb24gRGFydE9iamVjdChhKXt0aGlzLm89YX19KQp0KCQsInF0IiwiekIiLGZ1
-bmN0aW9uKCl7cmV0dXJuIG5ldyBULkdWKCl9KQp0KCQsImZlIiwiS0ciLGZ1bmN0aW9uKCl7cmV0dXJu
-IG5ldyBMLlhBKCl9KQp0KCQsIm1NIiwiblUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLmxJKCQuSGso
-KSl9KQp0KCQsInlyIiwiYkQiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51
-KCJbXi9dJCIpLFAubnUoIl4vIikpfSkKdCgkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcg
-TC5JVihQLm51KCJbL1xcXFxdIiksUC5udSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxc
-XF0rXFxcXFteXFxcXC9dK3xbYS16QS1aXTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxc
-XSkiKSl9KQp0KCQsImFrIiwiRWIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQ
-Lm51KCIoXlthLXpBLVpdWy0rLmEtekEtWlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0r
-LmEtekEtWlxcZF0qOi8vW14vXSoiKSxQLm51KCJeLyIpKX0pCnQoJCwibHMiLCJIayIsZnVuY3Rpb24o
-KXtyZXR1cm4gTy5SaCgpfSl9KSgpOyhmdW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7
-dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIG49e30KblthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVs
-cGVycy5jb252ZXJ0VG9GYXN0T2JqZWN0KG4pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEp
-e3JldHVybiB0KCJfX19kYXJ0XyIrYSt2Lmlzb2xhdGVUYWcpfQp2YXIgcz0iX19fZGFydF9pc29sYXRl
-X3RhZ3NfIgp2YXIgcj1PYmplY3Rbc118fChPYmplY3Rbc109T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFy
-IHE9Il9aeFl4WCIKZm9yKHZhciBwPTA7O3ArKyl7dmFyIG89dChxKyJfIitwKyJfIikKaWYoIShvIGlu
-IHIpKXtyW29dPTEKdi5pc29sYXRlVGFnPW8KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5n
-ZXRJc29sYXRlVGFnKCJkaXNwYXRjaF9yZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUlu
-dGVyY2VwdG9yc0J5VGFnKHtET01FcnJvcjpKLnZCLERPTUltcGxlbWVudGF0aW9uOkoudkIsTWVkaWFF
-cnJvcjpKLnZCLE5hdmlnYXRvcjpKLnZCLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLnZCLE5h
-dmlnYXRvclVzZXJNZWRpYUVycm9yOkoudkIsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6Si52QixQb3NpdGlv
-bkVycm9yOkoudkIsUmFuZ2U6Si52QixTUUxFcnJvcjpKLnZCLERhdGFWaWV3OkguRVQsQXJyYXlCdWZm
-ZXJWaWV3OkguRVQsRmxvYXQzMkFycmF5OkguRGcsRmxvYXQ2NEFycmF5OkguRGcsSW50MTZBcnJheTpI
-LnhqLEludDMyQXJyYXk6SC5kRSxJbnQ4QXJyYXk6SC5aQSxVaW50MTZBcnJheTpILndmLFVpbnQzMkFy
-cmF5OkguUHEsVWludDhDbGFtcGVkQXJyYXk6SC5lRSxDYW52YXNQaXhlbEFycmF5OkguZUUsVWludDhB
-cnJheTpILlY2LEhUTUxBdWRpb0VsZW1lbnQ6Vy5xRSxIVE1MQlJFbGVtZW50OlcucUUsSFRNTEJ1dHRv
-bkVsZW1lbnQ6Vy5xRSxIVE1MQ2FudmFzRWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFF
-LEhUTUxETGlzdEVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVt
-ZW50OlcucUUsSFRNTERldGFpbHNFbGVtZW50OlcucUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1M
-RGl2RWxlbWVudDpXLnFFLEhUTUxFbWJlZEVsZW1lbnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50Olcu
-cUUsSFRNTEhSRWxlbWVudDpXLnFFLEhUTUxIZWFkRWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVu
-dDpXLnFFLEhUTUxIdG1sRWxlbWVudDpXLnFFLEhUTUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdl
-RWxlbWVudDpXLnFFLEhUTUxJbnB1dEVsZW1lbnQ6Vy5xRSxIVE1MTElFbGVtZW50OlcucUUsSFRNTExh
-YmVsRWxlbWVudDpXLnFFLEhUTUxMZWdlbmRFbGVtZW50OlcucUUsSFRNTExpbmtFbGVtZW50OlcucUUs
-SFRNTE1hcEVsZW1lbnQ6Vy5xRSxIVE1MTWVkaWFFbGVtZW50OlcucUUsSFRNTE1lbnVFbGVtZW50Olcu
-cUUsSFRNTE1ldGFFbGVtZW50OlcucUUsSFRNTE1ldGVyRWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50
-OlcucUUsSFRNTE9MaXN0RWxlbWVudDpXLnFFLEhUTUxPYmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdy
-b3VwRWxlbWVudDpXLnFFLEhUTUxPcHRpb25FbGVtZW50OlcucUUsSFRNTE91dHB1dEVsZW1lbnQ6Vy5x
-RSxIVE1MUGFyYW1FbGVtZW50OlcucUUsSFRNTFBpY3R1cmVFbGVtZW50OlcucUUsSFRNTFByZUVsZW1l
-bnQ6Vy5xRSxIVE1MUHJvZ3Jlc3NFbGVtZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxT
-Y3JpcHRFbGVtZW50OlcucUUsSFRNTFNoYWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5x
-RSxIVE1MU291cmNlRWxlbWVudDpXLnFFLEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1l
-bnQ6Vy5xRSxIVE1MVGFibGVDYXB0aW9uRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50Olcu
-cUUsSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6
-Vy5xRSxIVE1MVGFibGVDb2xFbGVtZW50OlcucUUsSFRNTFRleHRBcmVhRWxlbWVudDpXLnFFLEhUTUxU
-aW1lRWxlbWVudDpXLnFFLEhUTUxUaXRsZUVsZW1lbnQ6Vy5xRSxIVE1MVHJhY2tFbGVtZW50OlcucUUs
-SFRNTFVMaXN0RWxlbWVudDpXLnFFLEhUTUxVbmtub3duRWxlbWVudDpXLnFFLEhUTUxWaWRlb0VsZW1l
-bnQ6Vy5xRSxIVE1MRGlyZWN0b3J5RWxlbWVudDpXLnFFLEhUTUxGb250RWxlbWVudDpXLnFFLEhUTUxG
-cmFtZUVsZW1lbnQ6Vy5xRSxIVE1MRnJhbWVTZXRFbGVtZW50OlcucUUsSFRNTE1hcnF1ZWVFbGVtZW50
-OlcucUUsSFRNTEVsZW1lbnQ6Vy5xRSxIVE1MQW5jaG9yRWxlbWVudDpXLkdoLEhUTUxBcmVhRWxlbWVu
-dDpXLmZZLEhUTUxCYXNlRWxlbWVudDpXLm5CLEJsb2I6Vy5BeixIVE1MQm9keUVsZW1lbnQ6Vy5RUCxD
-REFUQVNlY3Rpb246Vy5ueCxDaGFyYWN0ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJ
-bnN0cnVjdGlvbjpXLm54LFRleHQ6Vy5ueCxDU1NTdHlsZURlY2xhcmF0aW9uOlcub0osTVNTdHlsZUNT
-U1Byb3BlcnRpZXM6Vy5vSixDU1MyUHJvcGVydGllczpXLm9KLFhNTERvY3VtZW50OlcuUUYsRG9jdW1l
-bnQ6Vy5RRixET01FeGNlcHRpb246Vy5OaCxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tlbkxpc3Q6
-Vy5uNyxFbGVtZW50OlcuY3YsQWJvcnRQYXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVudDpXLmVh
-LEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDpXLmVh
-LEJhY2tncm91bmRGZXRjaENsaWNrRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpXLmVhLEJh
-Y2tncm91bmRGZXRjaEZhaWxFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5lYSxCZWZv
-cmVJbnN0YWxsUHJvbXB0RXZlbnQ6Vy5lYSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JFdmVudDpX
-LmVhLENhbk1ha2VQYXltZW50RXZlbnQ6Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3NlRXZlbnQ6
-Vy5lYSxDdXN0b21FdmVudDpXLmVhLERldmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3JpZW50YXRp
-b25FdmVudDpXLmVhLEVycm9yRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRlbmRhYmxl
-TWVzc2FnZUV2ZW50OlcuZWEsRmV0Y2hFdmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50OlcuZWEs
-Rm9yZWlnbkZldGNoRXZlbnQ6Vy5lYSxHYW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZlbnQ6Vy5l
-YSxJbnN0YWxsRXZlbnQ6Vy5lYSxNZWRpYUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlNZXNzYWdl
-RXZlbnQ6Vy5lYSxNZWRpYVF1ZXJ5TGlzdEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpXLmVhLE1l
-ZGlhU3RyZWFtVHJhY2tFdmVudDpXLmVhLE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0aW9uRXZl
-bnQ6Vy5lYSxNSURJTWVzc2FnZUV2ZW50OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlmaWNhdGlv
-bkV2ZW50OlcuZWEsUGFnZVRyYW5zaXRpb25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZlbnQ6Vy5l
-YSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFByZXNlbnRh
-dGlvbkNvbm5lY3Rpb25BdmFpbGFibGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9z
-ZUV2ZW50OlcuZWEsUHJvbWlzZVJlamVjdGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEsUlRDRGF0
-YUNoYW5uZWxFdmVudDpXLmVhLFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVyQ29ubmVj
-dGlvbkljZUV2ZW50OlcuZWEsUlRDVHJhY2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9u
-RXZlbnQ6Vy5lYSxTZW5zb3JFcnJvckV2ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJvcjpXLmVh
-LFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVhLFN0b3Jh
-Z2VFdmVudDpXLmVhLFN5bmNFdmVudDpXLmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9uRXZlbnQ6
-Vy5lYSxXZWJLaXRUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJEaXNwbGF5
-RXZlbnQ6Vy5lYSxWUlNlc3Npb25FdmVudDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6Vy5l
-YSxVU0JDb25uZWN0aW9uRXZlbnQ6Vy5lYSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxBdWRpb1By
-b2Nlc3NpbmdFdmVudDpXLmVhLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdlYkdMQ29u
-dGV4dEV2ZW50OlcuZWEsRXZlbnQ6Vy5lYSxJbnB1dEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxG
-aWxlOlcuVDUsSFRNTEZvcm1FbGVtZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZi
-LFhNTEh0dHBSZXF1ZXN0OlcuTzcsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0
-YTpXLlNnLExvY2F0aW9uOlcudTgsTW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJF
-dmVudDpXLkFqLFdoZWVsRXZlbnQ6Vy5BaixEb2N1bWVudEZyYWdtZW50OlcudUgsU2hhZG93Um9vdDpX
-LnVILERvY3VtZW50VHlwZTpXLnVILE5vZGU6Vy51SCxOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6
-Vy5CSCxIVE1MUGFyYWdyYXBoRWxlbWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVBy
-b2dyZXNzRXZlbnQ6Vy5ldyxIVE1MU2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5U
-YixIVE1MVGFibGVSb3dFbGVtZW50OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5CVCxIVE1M
-VGVtcGxhdGVFbGVtZW50OlcueVksQ29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixL
-ZXlib2FyZEV2ZW50OlcudzYsVGV4dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53
-NixXaW5kb3c6Vy5LNSxET01XaW5kb3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNt
-LFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20s
-V29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53
-NCxOYW1lZE5vZGVNYXA6Vy5yaCxNb3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNW
-R1NjcmlwdEVsZW1lbnQ6UC5uZCxTVkdBRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGVFbGVtZW50OlAuZDUs
-U1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6UC5kNSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmQ1
-LFNWR0FuaW1hdGlvbkVsZW1lbnQ6UC5kNSxTVkdDaXJjbGVFbGVtZW50OlAuZDUsU1ZHQ2xpcFBhdGhF
-bGVtZW50OlAuZDUsU1ZHRGVmc0VsZW1lbnQ6UC5kNSxTVkdEZXNjRWxlbWVudDpQLmQ1LFNWR0Rpc2Nh
-cmRFbGVtZW50OlAuZDUsU1ZHRWxsaXBzZUVsZW1lbnQ6UC5kNSxTVkdGRUJsZW5kRWxlbWVudDpQLmQ1
-LFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50OlAuZDUsU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6
-UC5kNSxTVkdGRUNvbXBvc2l0ZUVsZW1lbnQ6UC5kNSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQ
-LmQ1LFNWR0ZFRGlmZnVzZUxpZ2h0aW5nRWxlbWVudDpQLmQ1LFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxl
-bWVudDpQLmQ1LFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudDpQLmQ1LFNWR0ZFRmxvb2RFbGVtZW50OlAu
-ZDUsU1ZHRkVGdW5jQUVsZW1lbnQ6UC5kNSxTVkdGRUZ1bmNCRWxlbWVudDpQLmQ1LFNWR0ZFRnVuY0dF
-bGVtZW50OlAuZDUsU1ZHRkVGdW5jUkVsZW1lbnQ6UC5kNSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6
-UC5kNSxTVkdGRUltYWdlRWxlbWVudDpQLmQ1LFNWR0ZFTWVyZ2VFbGVtZW50OlAuZDUsU1ZHRkVNZXJn
-ZU5vZGVFbGVtZW50OlAuZDUsU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDpQLmQ1LFNWR0ZFT2Zmc2V0RWxl
-bWVudDpQLmQ1LFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQ6UC5kNSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdF
-bGVtZW50OlAuZDUsU1ZHRkVTcG90TGlnaHRFbGVtZW50OlAuZDUsU1ZHRkVUaWxlRWxlbWVudDpQLmQ1
-LFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQ6UC5kNSxTVkdGaWx0ZXJFbGVtZW50OlAuZDUsU1ZHRm9yZWln
-bk9iamVjdEVsZW1lbnQ6UC5kNSxTVkdHRWxlbWVudDpQLmQ1LFNWR0dlb21ldHJ5RWxlbWVudDpQLmQ1
-LFNWR0dyYXBoaWNzRWxlbWVudDpQLmQ1LFNWR0ltYWdlRWxlbWVudDpQLmQ1LFNWR0xpbmVFbGVtZW50
-OlAuZDUsU1ZHTGluZWFyR3JhZGllbnRFbGVtZW50OlAuZDUsU1ZHTWFya2VyRWxlbWVudDpQLmQ1LFNW
-R01hc2tFbGVtZW50OlAuZDUsU1ZHTWV0YWRhdGFFbGVtZW50OlAuZDUsU1ZHUGF0aEVsZW1lbnQ6UC5k
-NSxTVkdQYXR0ZXJuRWxlbWVudDpQLmQ1LFNWR1BvbHlnb25FbGVtZW50OlAuZDUsU1ZHUG9seWxpbmVF
-bGVtZW50OlAuZDUsU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OlAuZDUsU1ZHUmVjdEVsZW1lbnQ6UC5k
-NSxTVkdTZXRFbGVtZW50OlAuZDUsU1ZHU3RvcEVsZW1lbnQ6UC5kNSxTVkdTdHlsZUVsZW1lbnQ6UC5k
-NSxTVkdTVkdFbGVtZW50OlAuZDUsU1ZHU3dpdGNoRWxlbWVudDpQLmQ1LFNWR1N5bWJvbEVsZW1lbnQ6
-UC5kNSxTVkdUU3BhbkVsZW1lbnQ6UC5kNSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5kNSxTVkdUZXh0
-RWxlbWVudDpQLmQ1LFNWR1RleHRQYXRoRWxlbWVudDpQLmQ1LFNWR1RleHRQb3NpdGlvbmluZ0VsZW1l
-bnQ6UC5kNSxTVkdUaXRsZUVsZW1lbnQ6UC5kNSxTVkdVc2VFbGVtZW50OlAuZDUsU1ZHVmlld0VsZW1l
-bnQ6UC5kNSxTVkdHcmFkaWVudEVsZW1lbnQ6UC5kNSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9u
-RWxlbWVudDpQLmQ1LFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6UC5kNSxTVkdNUGF0aEVsZW1lbnQ6UC5k
-NSxTVkdFbGVtZW50OlAuZDV9KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJv
-cjp0cnVlLERPTUltcGxlbWVudGF0aW9uOnRydWUsTWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVl
-LE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTp0cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRy
-dWUsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6dHJ1ZSxQb3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxT
-UUxFcnJvcjp0cnVlLERhdGFWaWV3OnRydWUsQXJyYXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJh
-eTp0cnVlLEZsb2F0NjRBcnJheTp0cnVlLEludDE2QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50
-OEFycmF5OnRydWUsVWludDE2QXJyYXk6dHJ1ZSxVaW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFy
-cmF5OnRydWUsQ2FudmFzUGl4ZWxBcnJheTp0cnVlLFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxl
-bWVudDp0cnVlLEhUTUxCUkVsZW1lbnQ6dHJ1ZSxIVE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52
-YXNFbGVtZW50OnRydWUsSFRNTENvbnRlbnRFbGVtZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVl
-LEhUTUxEYXRhRWxlbWVudDp0cnVlLEhUTUxEYXRhTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0Vs
-ZW1lbnQ6dHJ1ZSxIVE1MRGlhbG9nRWxlbWVudDp0cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVt
-YmVkRWxlbWVudDp0cnVlLEhUTUxGaWVsZFNldEVsZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUs
-SFRNTEhlYWRFbGVtZW50OnRydWUsSFRNTEhlYWRpbmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50
-OnRydWUsSFRNTElGcmFtZUVsZW1lbnQ6dHJ1ZSxIVE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0
-RWxlbWVudDp0cnVlLEhUTUxMSUVsZW1lbnQ6dHJ1ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExl
-Z2VuZEVsZW1lbnQ6dHJ1ZSxIVE1MTGlua0VsZW1lbnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhU
-TUxNZWRpYUVsZW1lbnQ6dHJ1ZSxIVE1MTWVudUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1
-ZSxIVE1MTWV0ZXJFbGVtZW50OnRydWUsSFRNTE1vZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50
-OnRydWUsSFRNTE9iamVjdEVsZW1lbnQ6dHJ1ZSxIVE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9w
-dGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MT3V0cHV0RWxlbWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1
-ZSxIVE1MUGljdHVyZUVsZW1lbnQ6dHJ1ZSxIVE1MUHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0Vs
-ZW1lbnQ6dHJ1ZSxIVE1MUXVvdGVFbGVtZW50OnRydWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1M
-U2hhZG93RWxlbWVudDp0cnVlLEhUTUxTbG90RWxlbWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRy
-dWUsSFRNTFNwYW5FbGVtZW50OnRydWUsSFRNTFN0eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRp
-b25FbGVtZW50OnRydWUsSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVs
-ZW1lbnQ6dHJ1ZSxIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1l
-bnQ6dHJ1ZSxIVE1MVGV4dEFyZWFFbGVtZW50OnRydWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRp
-dGxlRWxlbWVudDp0cnVlLEhUTUxUcmFja0VsZW1lbnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUs
-SFRNTFVua25vd25FbGVtZW50OnRydWUsSFRNTFZpZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlF
-bGVtZW50OnRydWUsSFRNTEZvbnRFbGVtZW50OnRydWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxG
-cmFtZVNldEVsZW1lbnQ6dHJ1ZSxIVE1MTWFycXVlZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxz
-ZSxIVE1MQW5jaG9yRWxlbWVudDp0cnVlLEhUTUxBcmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVu
-dDp0cnVlLEJsb2I6ZmFsc2UsSFRNTEJvZHlFbGVtZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hh
-cmFjdGVyRGF0YTp0cnVlLENvbW1lbnQ6dHJ1ZSxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0
-OnRydWUsQ1NTU3R5bGVEZWNsYXJhdGlvbjp0cnVlLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NT
-MlByb3BlcnRpZXM6dHJ1ZSxYTUxEb2N1bWVudDp0cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlv
-bjp0cnVlLERPTVJlY3RSZWFkT25seTpmYWxzZSxET01Ub2tlbkxpc3Q6dHJ1ZSxFbGVtZW50OmZhbHNl
-LEFib3J0UGF5bWVudEV2ZW50OnRydWUsQW5pbWF0aW9uRXZlbnQ6dHJ1ZSxBbmltYXRpb25QbGF5YmFj
-a0V2ZW50OnRydWUsQXBwbGljYXRpb25DYWNoZUVycm9yRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hD
-bGlja0V2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hGYWls
-RXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hlZEV2ZW50OnRydWUsQmVmb3JlSW5zdGFsbFByb21wdEV2
-ZW50OnRydWUsQmVmb3JlVW5sb2FkRXZlbnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1ZSxDYW5NYWtlUGF5bWVu
-dEV2ZW50OnRydWUsQ2xpcGJvYXJkRXZlbnQ6dHJ1ZSxDbG9zZUV2ZW50OnRydWUsQ3VzdG9tRXZlbnQ6
-dHJ1ZSxEZXZpY2VNb3Rpb25FdmVudDp0cnVlLERldmljZU9yaWVudGF0aW9uRXZlbnQ6dHJ1ZSxFcnJv
-ckV2ZW50OnRydWUsRXh0ZW5kYWJsZUV2ZW50OnRydWUsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDp0cnVl
-LEZldGNoRXZlbnQ6dHJ1ZSxGb250RmFjZVNldExvYWRFdmVudDp0cnVlLEZvcmVpZ25GZXRjaEV2ZW50
-OnRydWUsR2FtZXBhZEV2ZW50OnRydWUsSGFzaENoYW5nZUV2ZW50OnRydWUsSW5zdGFsbEV2ZW50OnRy
-dWUsTWVkaWFFbmNyeXB0ZWRFdmVudDp0cnVlLE1lZGlhS2V5TWVzc2FnZUV2ZW50OnRydWUsTWVkaWFR
-dWVyeUxpc3RFdmVudDp0cnVlLE1lZGlhU3RyZWFtRXZlbnQ6dHJ1ZSxNZWRpYVN0cmVhbVRyYWNrRXZl
-bnQ6dHJ1ZSxNZXNzYWdlRXZlbnQ6dHJ1ZSxNSURJQ29ubmVjdGlvbkV2ZW50OnRydWUsTUlESU1lc3Nh
-Z2VFdmVudDp0cnVlLE11dGF0aW9uRXZlbnQ6dHJ1ZSxOb3RpZmljYXRpb25FdmVudDp0cnVlLFBhZ2VU
-cmFuc2l0aW9uRXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdEV2ZW50OnRydWUsUGF5bWVudFJlcXVlc3RV
-cGRhdGVFdmVudDp0cnVlLFBvcFN0YXRlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZh
-aWxhYmxlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDp0cnVlLFByb21p
-c2VSZWplY3Rpb25FdmVudDp0cnVlLFB1c2hFdmVudDp0cnVlLFJUQ0RhdGFDaGFubmVsRXZlbnQ6dHJ1
-ZSxSVENEVE1GVG9uZUNoYW5nZUV2ZW50OnRydWUsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDp0cnVl
-LFJUQ1RyYWNrRXZlbnQ6dHJ1ZSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OnRydWUsU2Vuc29y
-RXJyb3JFdmVudDp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXJyb3I6dHJ1ZSxTcGVlY2hSZWNvZ25pdGlv
-bkV2ZW50OnRydWUsU3BlZWNoU3ludGhlc2lzRXZlbnQ6dHJ1ZSxTdG9yYWdlRXZlbnQ6dHJ1ZSxTeW5j
-RXZlbnQ6dHJ1ZSxUcmFja0V2ZW50OnRydWUsVHJhbnNpdGlvbkV2ZW50OnRydWUsV2ViS2l0VHJhbnNp
-dGlvbkV2ZW50OnRydWUsVlJEZXZpY2VFdmVudDp0cnVlLFZSRGlzcGxheUV2ZW50OnRydWUsVlJTZXNz
-aW9uRXZlbnQ6dHJ1ZSxNb2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OnRydWUsVVNCQ29ubmVjdGlvbkV2
-ZW50OnRydWUsSURCVmVyc2lvbkNoYW5nZUV2ZW50OnRydWUsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6dHJ1
-ZSxPZmZsaW5lQXVkaW9Db21wbGV0aW9uRXZlbnQ6dHJ1ZSxXZWJHTENvbnRleHRFdmVudDp0cnVlLEV2
-ZW50OmZhbHNlLElucHV0RXZlbnQ6ZmFsc2UsRXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxG
-b3JtRWxlbWVudDp0cnVlLEhpc3Rvcnk6dHJ1ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVz
-dDp0cnVlLFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRp
-b246dHJ1ZSxNb3VzZUV2ZW50OnRydWUsRHJhZ0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hl
-ZWxFdmVudDp0cnVlLERvY3VtZW50RnJhZ21lbnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRU
-eXBlOnRydWUsTm9kZTpmYWxzZSxOb2RlTGlzdDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFy
-YWdyYXBoRWxlbWVudDp0cnVlLFByb2dyZXNzRXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6
-dHJ1ZSxIVE1MU2VsZWN0RWxlbWVudDp0cnVlLEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVS
-b3dFbGVtZW50OnRydWUsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVt
-ZW50OnRydWUsQ29tcG9zaXRpb25FdmVudDp0cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50
-OnRydWUsVGV4dEV2ZW50OnRydWUsVG91Y2hFdmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRy
-dWUsRE9NV2luZG93OnRydWUsRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29y
-a2VyR2xvYmFsU2NvcGU6dHJ1ZSxTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2Jh
-bFNjb3BlOnRydWUsQXR0cjp0cnVlLENsaWVudFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2Rl
-TWFwOnRydWUsTW96TmFtZWRBdHRyTWFwOnRydWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVt
-ZW50OnRydWUsU1ZHQUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVN
-b3Rpb25FbGVtZW50OnRydWUsU1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRp
-b25FbGVtZW50OnRydWUsU1ZHQ2lyY2xlRWxlbWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVl
-LFNWR0RlZnNFbGVtZW50OnRydWUsU1ZHRGVzY0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0
-cnVlLFNWR0VsbGlwc2VFbGVtZW50OnRydWUsU1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9y
-TWF0cml4RWxlbWVudDp0cnVlLFNWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVD
-b21wb3NpdGVFbGVtZW50OnRydWUsU1ZHRkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURp
-ZmZ1c2VMaWdodGluZ0VsZW1lbnQ6dHJ1ZSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxT
-VkdGRURpc3RhbnRMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVu
-Y0FFbGVtZW50OnRydWUsU1ZHRkVGdW5jQkVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVl
-LFNWR0ZFRnVuY1JFbGVtZW50OnRydWUsU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJ
-bWFnZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1lcmdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVu
-dDp0cnVlLFNWR0ZFTW9ycGhvbG9neUVsZW1lbnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxT
-VkdGRVBvaW50TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVl
-LFNWR0ZFU3BvdExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1
-bGVuY2VFbGVtZW50OnRydWUsU1ZHRmlsdGVyRWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVt
-ZW50OnRydWUsU1ZHR0VsZW1lbnQ6dHJ1ZSxTVkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGlj
-c0VsZW1lbnQ6dHJ1ZSxTVkdJbWFnZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xp
-bmVhckdyYWRpZW50RWxlbWVudDp0cnVlLFNWR01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVu
-dDp0cnVlLFNWR01ldGFkYXRhRWxlbWVudDp0cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVy
-bkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5Z29uRWxlbWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVl
-LFNWR1JhZGlhbEdyYWRpZW50RWxlbWVudDp0cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxl
-bWVudDp0cnVlLFNWR1N0b3BFbGVtZW50OnRydWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxl
-bWVudDp0cnVlLFNWR1N3aXRjaEVsZW1lbnQ6dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNw
-YW5FbGVtZW50OnRydWUsU1ZHVGV4dENvbnRlbnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1
-ZSxTVkdUZXh0UGF0aEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZH
-VGl0bGVFbGVtZW50OnRydWUsU1ZHVXNlRWxlbWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZH
-R3JhZGllbnRFbGVtZW50OnRydWUsU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1
-ZSxTVkdGRURyb3BTaGFkb3dFbGVtZW50OnRydWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVu
-dDpmYWxzZX0pCkguYjAuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4k
-bmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNz
-VGFnPSJBcnJheUJ1ZmZlclZpZXciCkguRGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVy
-VmlldyIKSC5XQi4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRp
-dmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9
-IkFycmF5QnVmZmVyVmlldyJ9KSgpCmNvbnZlcnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFz
-dE9iamVjdCgkKTsoZnVuY3Rpb24oYSl7aWYodHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2Eo
-bnVsbCkKcmV0dXJufWlmKHR5cGVvZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IT0ndW5kZWZpbmVkJyl7
-YShkb2N1bWVudC5jdXJyZW50U2NyaXB0KQpyZXR1cm59dmFyIHQ9ZG9jdW1lbnQuc2NyaXB0cwpmdW5j
-dGlvbiBvbkxvYWQoYil7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5yZW1vdmVFdmVudExp
-c3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2UpCmEoYi50YXJnZXQpfWZvcih2YXIgcz0wO3M8dC5sZW5n
-dGg7KytzKXRbc10uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9u
-KGEpe3YuY3VycmVudFNjcmlwdD1hCmlmKHR5cGVvZiBkYXJ0TWFpblJ1bm5lcj09PSJmdW5jdGlvbiIp
-ZGFydE1haW5SdW5uZXIoTC5JcSxbXSkKZWxzZSBMLklxKFtdKX0pfSkoKQovLyMgc291cmNlTWFwcGlu
-Z1VSTD1taWdyYXRpb24uanMubWFwCg==
+Yl19fQpILmVFLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVu
+Y3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguVjYucHJv
+dG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0gu
+U2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfSwKJGlWNjoxLAokaW42OjF9CkguUkcu
+cHJvdG90eXBlPXt9CkguVlAucHJvdG90eXBlPXt9CkguV0IucHJvdG90eXBlPXt9CkguWkcucHJvdG90
+eXBlPXt9CkguSmMucHJvdG90eXBlPXsKQzpmdW5jdGlvbihhKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2
+ZXJzZSx0aGlzLGEpfSwKS3E6ZnVuY3Rpb24oYSl7cmV0dXJuIEgudjUodi50eXBlVW5pdmVyc2UsdGhp
+cyxhKX19CkguRy5wcm90b3R5cGU9e30KSC51OS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVy
+biB0aGlzLmF9fQpILmh6LnByb3RvdHlwZT17fQpILmlNLnByb3RvdHlwZT17fQpQLnRoLnByb3RvdHlw
+ZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYSxzPXQuYQp0LmE9bnVsbApzLiQwKCl9LAokUzox
+OH0KUC5oYS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzCnRoaXMuYS5hPXUuTS5iKGEp
+CnQ9dGhpcy5iCnM9dGhpcy5jCnQuZmlyc3RDaGlsZD90LnJlbW92ZUNoaWxkKHMpOnQuYXBwZW5kQ2hp
+bGQocyl9LAokUzoyMX0KUC5Wcy5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS4kMCgpfSwK
+JEM6IiQwIiwKJFI6MCwKJFM6MH0KUC5GdC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS4k
+MCgpfSwKJEM6IiQwIiwKJFI6MCwKJFM6MH0KUC5XMy5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihhLGIp
+e2lmKHNlbGYuc2V0VGltZW91dCE9bnVsbClzZWxmLnNldFRpbWVvdXQoSC50UihuZXcgUC55SCh0aGlz
+LGIpLDApLGEpCmVsc2UgdGhyb3cgSC5iKFAuTDQoImBzZXRUaW1lb3V0KClgIG5vdCBmb3VuZC4iKSl9
+fQpQLnlILnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5iLiQwKCl9LAokQzoiJDAiLAokUjow
+LAokUzoyfQpQLmloLnByb3RvdHlwZT17CmFNOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRoaXMuJHRp
+CnIuQygiMS8iKS5iKGIpCnQ9IXRoaXMuYnx8ci5DKCJiODwxPiIpLmMoYikKcz10aGlzLmEKaWYodClz
+LlhmKGIpCmVsc2Ugcy5YMihyLmQuYihiKSl9LAp3MDpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYQpp
+Zih0aGlzLmIpdC5aTChhLGIpCmVsc2UgdC5OayhhLGIpfX0KUC5XTS5wcm90b3R5cGU9ewokMTpmdW5j
+dGlvbihhKXtyZXR1cm4gdGhpcy5hLiQyKDAsYSl9LAokUzoyMH0KUC5TWC5wcm90b3R5cGU9ewokMjpm
+dW5jdGlvbihhLGIpe3RoaXMuYS4kMigxLG5ldyBILmJxKGEsdS5sLmIoYikpKX0sCiRDOiIkMiIsCiRS
+OjIsCiRTOjMzfQpQLkdzLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hKEguU2MoYSks
+Yil9LAokUzoyM30KUC5QZi5wcm90b3R5cGU9ewp3MDpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGE9PW51
+bGwpYT1uZXcgUC5uKCkKdD10aGlzLmEKaWYodC5hIT09MCl0aHJvdyBILmIoUC5QVigiRnV0dXJlIGFs
+cmVhZHkgY29tcGxldGVkIikpCnQuTmsoYSxiKX0sCnBtOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLncw
+KGEsbnVsbCl9fQpQLlpmLnByb3RvdHlwZT17CmFNOmZ1bmN0aW9uKGEsYil7dmFyIHQKdGhpcy4kdGku
+QygiMS8iKS5iKGIpCnQ9dGhpcy5hCmlmKHQuYSE9PTApdGhyb3cgSC5iKFAuUFYoIkZ1dHVyZSBhbHJl
+YWR5IGNvbXBsZXRlZCIpKQp0LlhmKGIpfX0KUC5GZS5wcm90b3R5cGU9ewpIUjpmdW5jdGlvbihhKXtp
+ZigodGhpcy5jJjE1KSE9PTYpcmV0dXJuITAKcmV0dXJuIHRoaXMuYi5iLmJ2KHUuYWwuYih0aGlzLmQp
+LGEuYSx1LmNKLHUuSyl9LApLdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmUscz11Lnoscj11LksscT10
+aGlzLiR0aS5DKCIyLyIpLHA9dGhpcy5iLmIKaWYodS5XLmModCkpcmV0dXJuIHEuYihwLnJwKHQsYS5h
+LGEuYixzLHIsdS5sKSkKZWxzZSByZXR1cm4gcS5iKHAuYnYodS55LmIodCksYS5hLHMscikpfX0KUC52
+cy5wcm90b3R5cGU9ewpTcTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9dGhpcy4kdGkKcS5LcShj
+KS5DKCIxLygyKSIpLmIoYSkKdD0kLlgzCmlmKHQhPT1DLk5VKXtjLkMoIkA8MC8+IikuS3EocS5kKS5D
+KCIxKDIpIikuYihhKQppZihiIT1udWxsKWI9UC5WSChiLHQpfXM9bmV3IFAudnMoJC5YMyxjLkMoInZz
+PDA+IikpCnI9Yj09bnVsbD8xOjMKdGhpcy54ZihuZXcgUC5GZShzLHIsYSxiLHEuQygiQDwxPiIpLktx
+KGMpLkMoIkZlPDEsMj4iKSkpCnJldHVybiBzfSwKVzc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5T
+cShhLG51bGwsYil9LApRZDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz10aGlzLiR0aQpzLktxKGMpLkMo
+IjEvKDIpIikuYihhKQp0PW5ldyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQp0aGlzLnhmKG5ldyBQLkZl
+KHQsKGI9PW51bGw/MTozKXwxNixhLGIscy5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0
+dXJuIHR9LApPQTpmdW5jdGlvbihhKXt2YXIgdCxzLHIKdS5iZi5iKG51bGwpCnQ9dGhpcy4kdGkKcz0k
+LlgzCnI9bmV3IFAudnMocyx0KQppZihzIT09Qy5OVSlhPVAuVkgoYSxzKQp0aGlzLnhmKG5ldyBQLkZl
+KHIsMixudWxsLGEsdC5DKCJAPDE+IikuS3EodC5kKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gcn0sCnhm
+OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcyxyPXMuYQppZihyPD0xKXthLmE9dS54LmIocy5jKQpzLmM9
+YX1lbHNle2lmKHI9PT0yKXt0PXUuXy5iKHMuYykKcj10LmEKaWYocjw0KXt0LnhmKGEpCnJldHVybn1z
+LmE9cgpzLmM9dC5jfVAuVGsobnVsbCxudWxsLHMuYix1Lk0uYihuZXcgUC5kYShzLGEpKSl9fSwKalE6
+ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvPXRoaXMsbj17fQpuLmE9YQppZihhPT1udWxsKXJldHVy
+bgp0PW8uYQppZih0PD0xKXtzPXUueC5iKG8uYykKcj1vLmM9YQppZihzIT1udWxsKXtmb3IoO3E9ci5h
+LHEhPW51bGw7cj1xKTtyLmE9c319ZWxzZXtpZih0PT09Mil7cD11Ll8uYihvLmMpCnQ9cC5hCmlmKHQ8
+NCl7cC5qUShhKQpyZXR1cm59by5hPXQKby5jPXAuY31uLmE9by5OOChhKQpQLlRrKG51bGwsbnVsbCxv
+LmIsdS5NLmIobmV3IFAub1EobixvKSkpfX0sCmFoOmZ1bmN0aW9uKCl7dmFyIHQ9dS54LmIodGhpcy5j
+KQp0aGlzLmM9bnVsbApyZXR1cm4gdGhpcy5OOCh0KX0sCk44OmZ1bmN0aW9uKGEpe3ZhciB0LHMscgpm
+b3IodD1hLHM9bnVsbDt0IT1udWxsO3M9dCx0PXIpe3I9dC5hCnQuYT1zfXJldHVybiBzfSwKSEg6ZnVu
+Y3Rpb24oYSl7dmFyIHQscz10aGlzLHI9cy4kdGkKci5DKCIxLyIpLmIoYSkKaWYoci5DKCJiODwxPiIp
+LmMoYSkpaWYoci5jKGEpKVAuQTkoYSxzKQplbHNlIFAuazMoYSxzKQplbHNle3Q9cy5haCgpCnIuZC5i
+KGEpCnMuYT00CnMuYz1hClAuSFoocyx0KX19LApYMjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMKcy4k
+dGkuZC5iKGEpCnQ9cy5haCgpCnMuYT00CnMuYz1hClAuSFoocyx0KX0sClpMOmZ1bmN0aW9uKGEsYil7
+dmFyIHQscz10aGlzCnUubC5iKGIpCnQ9cy5haCgpCnMuYT04CnMuYz1uZXcgUC5DdyhhLGIpClAuSFoo
+cyx0KX0sClhmOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMoIjEvIikuYihhKQppZihz
+LkMoImI4PDE+IikuYyhhKSl7dC5jVShhKQpyZXR1cm59dC5hPTEKUC5UayhudWxsLG51bGwsdC5iLHUu
+TS5iKG5ldyBQLnJIKHQsYSkpKX0sCmNVOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMo
+ImI4PDE+IikuYihhKQppZihzLmMoYSkpe2lmKGEuYT09PTgpe3QuYT0xClAuVGsobnVsbCxudWxsLHQu
+Yix1Lk0uYihuZXcgUC5LRih0LGEpKSl9ZWxzZSBQLkE5KGEsdCkKcmV0dXJufVAuazMoYSx0KX0sCk5r
+OmZ1bmN0aW9uKGEsYil7dGhpcy5hPTEKUC5UayhudWxsLG51bGwsdGhpcy5iLHUuTS5iKG5ldyBQLlpM
+KHRoaXMsYSxiKSkpfSwKJGliODoxfQpQLmRhLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5IWih0
+aGlzLmEsdGhpcy5iKX0sCiRTOjB9ClAub1EucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkhaKHRo
+aXMuYix0aGlzLmEuYSl9LAokUzowfQpQLnBWLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0
+PXRoaXMuYQp0LmE9MAp0LkhIKGEpfSwKJFM6MTh9ClAuVTcucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24o
+YSxiKXt1LmwuYihiKQp0aGlzLmEuWkwoYSxiKX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiQy
+KGEsbnVsbCl9LAokQzoiJDIiLAokRDpmdW5jdGlvbigpe3JldHVybltudWxsXX0sCiRTOjQyfQpQLnZy
+LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMpfSwKJFM6MH0K
+UC5ySC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYQp0LlgyKHQuJHRpLmQuYih0
+aGlzLmIpKX0sCiRTOjB9ClAuS0YucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkE5KHRoaXMuYix0
+aGlzLmEpfSwKJFM6MH0KUC5aTC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS5aTCh0aGlz
+LmIsdGhpcy5jKX0sCiRTOjB9ClAuUlQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIs
+cSxwLG8sbj10aGlzLG09bnVsbAp0cnl7cj1uLmMKbT1yLmIuYi56eih1LmZPLmIoci5kKSx1LnopfWNh
+dGNoKHEpe3Q9SC5SdShxKQpzPUgudHMocSkKaWYobi5kKXtyPXUubi5iKG4uYS5hLmMpLmEKcD10CnA9
+cj09bnVsbD9wPT1udWxsOnI9PT1wCnI9cH1lbHNlIHI9ITEKcD1uLmIKaWYocilwLmI9dS5uLmIobi5h
+LmEuYykKZWxzZSBwLmI9bmV3IFAuQ3codCxzKQpwLmE9ITAKcmV0dXJufWlmKHUuYy5jKG0pKXtpZiht
+IGluc3RhbmNlb2YgUC52cyYmbS5hPj00KXtpZihtLmE9PT04KXtyPW4uYgpyLmI9dS5uLmIobS5jKQpy
+LmE9ITB9cmV0dXJufW89bi5hLmEKcj1uLmIKci5iPW0uVzcobmV3IFAualoobyksdS56KQpyLmE9ITF9
+fSwKJFM6Mn0KUC5qWi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKJFM6
+Mzd9ClAucnEucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMK
+dHJ5e3I9bS5iCnE9ci4kdGkKcD1xLmQKbz1wLmIobS5jKQptLmEuYj1yLmIuYi5idihxLkMoIjIvKDEp
+IikuYihyLmQpLG8scS5DKCIyLyIpLHApfWNhdGNoKG4pe3Q9SC5SdShuKQpzPUgudHMobikKcj1tLmEK
+ci5iPW5ldyBQLkN3KHQscykKci5hPSEwfX0sCiRTOjJ9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rp
+b24oKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9dGhpcwp0cnl7dD11Lm4uYihsLmEuYS5jKQpxPWwuYwpp
+ZihILm9UKHEuSFIodCkpJiZxLmUhPW51bGwpe3A9bC5iCnAuYj1xLkt3KHQpCnAuYT0hMX19Y2F0Y2go
+byl7cz1ILlJ1KG8pCnI9SC50cyhvKQpxPXUubi5iKGwuYS5hLmMpCnA9cS5hCm49cwptPWwuYgppZihw
+PT1udWxsP249PW51bGw6cD09PW4pbS5iPXEKZWxzZSBtLmI9bmV3IFAuQ3cocyxyKQptLmE9ITB9fSwK
+JFM6Mn0KUC5PTS5wcm90b3R5cGU9e30KUC5xaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIg
+dCxzLHI9dGhpcyxxPXt9LHA9bmV3IFAudnMoJC5YMyx1LmZKKQpxLmE9MAp0PUguTGgocikKcz10LkMo
+In4oMSkiKS5iKG5ldyBQLkI1KHEscikpCnUuTS5iKG5ldyBQLlBJKHEscCkpClcuSkUoci5hLHIuYixz
+LCExLHQuZCkKcmV0dXJuIHB9fQpQLkI1LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgodGhp
+cy5iKS5kLmIoYSk7Kyt0aGlzLmEuYX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5iKS5D
+KCJjOCgxKSIpfX0KUC5QSS5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi5ISCh0aGlzLmEu
+YSl9LAokUzowfQpQLk1PLnByb3RvdHlwZT17fQpQLmtULnByb3RvdHlwZT17fQpQLnhJLnByb3RvdHlw
+ZT17fQpQLkN3LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLmEpfSwKJGlY
+UzoxfQpQLm0wLnByb3RvdHlwZT17JGlKQjoxfQpQLnBLLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7
+dmFyIHQscz10aGlzLmEscj1zLmEKcz1yPT1udWxsP3MuYT1uZXcgUC5uKCk6cgpyPXRoaXMuYgppZihy
+PT1udWxsKXRocm93IEguYihzKQp0PUguYihzKQp0LnN0YWNrPXIudygwKQp0aHJvdyB0fSwKJFM6MH0K
+UC5KaS5wcm90b3R5cGU9ewpiSDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1udWxsCnUuTS5iKGEpCnRy
+eXtpZihDLk5VPT09JC5YMyl7YS4kMCgpCnJldHVybn1QLlQ4KHEscSx0aGlzLGEsdS5IKX1jYXRjaChy
+KXt0PUguUnUocikKcz1ILnRzKHIpClAuTDIocSxxLHRoaXMsdCx1LmwuYihzKSl9fSwKRGw6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0LHMscixxPW51bGwKYy5DKCJ+KDApIikuYihhKQpjLmIoYikKdHJ5e2lmKEMu
+TlU9PT0kLlgzKXthLiQxKGIpCnJldHVybn1QLnl2KHEscSx0aGlzLGEsYix1LkgsYyl9Y2F0Y2gocil7
+dD1ILlJ1KHIpCnM9SC50cyhyKQpQLkwyKHEscSx0aGlzLHQsdS5sLmIocykpfX0sClJUOmZ1bmN0aW9u
+KGEsYil7cmV0dXJuIG5ldyBQLmhqKHRoaXMsYi5DKCIwKCkiKS5iKGEpLGIpfSwKR1k6ZnVuY3Rpb24o
+YSl7cmV0dXJuIG5ldyBQLlZwKHRoaXMsdS5NLmIoYSkpfSwKUHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+bmV3IFAuT1IodGhpcyxiLkMoIn4oMCkiKS5iKGEpLGIpfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiBu
+dWxsfSwKeno6ZnVuY3Rpb24oYSxiKXtiLkMoIjAoKSIpLmIoYSkKaWYoJC5YMz09PUMuTlUpcmV0dXJu
+IGEuJDAoKQpyZXR1cm4gUC5UOChudWxsLG51bGwsdGhpcyxhLGIpfSwKYnY6ZnVuY3Rpb24oYSxiLGMs
+ZCl7Yy5DKCJAPDA+IikuS3EoZCkuQygiMSgyKSIpLmIoYSkKZC5iKGIpCmlmKCQuWDM9PT1DLk5VKXJl
+dHVybiBhLiQxKGIpCnJldHVybiBQLnl2KG51bGwsbnVsbCx0aGlzLGEsYixjLGQpfSwKcnA6ZnVuY3Rp
+b24oYSxiLGMsZCxlLGYpe2QuQygiQDwwPiIpLktxKGUpLktxKGYpLkMoIjEoMiwzKSIpLmIoYSkKZS5i
+KGIpCmYuYihjKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMihiLGMpCnJldHVybiBQLlF4KG51bGws
+bnVsbCx0aGlzLGEsYixjLGQsZSxmKX0sCkxqOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiLkMoIkA8
+MD4iKS5LcShjKS5LcShkKS5DKCIxKDIsMykiKS5iKGEpfX0KUC5oai5wcm90b3R5cGU9ewokMDpmdW5j
+dGlvbigpe3JldHVybiB0aGlzLmEuenoodGhpcy5iLHRoaXMuYyl9LAokUzpmdW5jdGlvbigpe3JldHVy
+biB0aGlzLmMuQygiMCgpIil9fQpQLlZwLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRo
+aXMuYS5iSCh0aGlzLmIpfSwKJFM6Mn0KUC5PUi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIg
+dD10aGlzLmMKcmV0dXJuIHRoaXMuYS5EbCh0aGlzLmIsdC5iKGEpLHQpfSwKJFM6ZnVuY3Rpb24oKXty
+ZXR1cm4gdGhpcy5jLkMoIn4oMCkiKX19ClAuYjYucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3Zh
+ciB0PXRoaXMscz1uZXcgUC5sbSh0LHQucixILkxoKHQpLkMoImxtPDE+IikpCnMuYz10LmUKcmV0dXJu
+IHN9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
+CmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXt0PXRoaXMuYgppZih0PT1udWxs
+KXJldHVybiExCnJldHVybiB1LkouYih0W2JdKSE9bnVsbH1lbHNle3M9dGhpcy5QUihiKQpyZXR1cm4g
+c319LApQUjpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmQKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4g
+dGhpcy5ERih0W3RoaXMuTihhKV0sYSk+PTB9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRoaXMK
+SC5MaChyKS5kLmIoYikKaWYodHlwZW9mIGI9PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIpe3Q9ci5i
+CnJldHVybiByLmJRKHQ9PW51bGw/ci5iPVAuVDIoKTp0LGIpfWVsc2UgaWYodHlwZW9mIGI9PSJudW1i
+ZXIiJiYoYiYxMDczNzQxODIzKT09PWIpe3M9ci5jCnJldHVybiByLmJRKHM9PW51bGw/ci5jPVAuVDIo
+KTpzLGIpfWVsc2UgcmV0dXJuIHIuQjcoYil9LApCNzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT10aGlz
+CkguTGgocSkuZC5iKGEpCnQ9cS5kCmlmKHQ9PW51bGwpdD1xLmQ9UC5UMigpCnM9cS5OKGEpCnI9dFtz
+XQppZihyPT1udWxsKXRbc109W3EueW8oYSldCmVsc2V7aWYocS5ERihyLGEpPj0wKXJldHVybiExCnIu
+cHVzaChxLnlvKGEpKX1yZXR1cm4hMH0sClI6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzCmlmKHR5cGVv
+ZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXJldHVybiB0LkwodC5iLGIpCmVsc2UgaWYodHlw
+ZW9mIGI9PSJudW1iZXIiJiYoYiYxMDczNzQxODIzKT09PWIpcmV0dXJuIHQuTCh0LmMsYikKZWxzZSBy
+ZXR1cm4gdC5xZyhiKX0sCnFnOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHA9dGhpcyxvPXAuZAppZihv
+PT1udWxsKXJldHVybiExCnQ9cC5OKGEpCnM9b1t0XQpyPXAuREYocyxhKQppZihyPDApcmV0dXJuITEK
+cT1zLnNwbGljZShyLDEpWzBdCmlmKDA9PT1zLmxlbmd0aClkZWxldGUgb1t0XQpwLkdTKHEpCnJldHVy
+biEwfSwKYlE6ZnVuY3Rpb24oYSxiKXtILkxoKHRoaXMpLmQuYihiKQppZih1LkouYihhW2JdKSE9bnVs
+bClyZXR1cm4hMQphW2JdPXRoaXMueW8oYikKcmV0dXJuITB9LApMOmZ1bmN0aW9uKGEsYil7dmFyIHQK
+aWYoYT09bnVsbClyZXR1cm4hMQp0PXUuSi5iKGFbYl0pCmlmKHQ9PW51bGwpcmV0dXJuITEKdGhpcy5H
+Uyh0KQpkZWxldGUgYVtiXQpyZXR1cm4hMH0sClM6ZnVuY3Rpb24oKXt0aGlzLnI9MTA3Mzc0MTgyMyZ0
+aGlzLnIrMX0sCnlvOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcyxyPW5ldyBQLmJuKEguTGgocykuZC5i
+KGEpKQppZihzLmU9PW51bGwpcy5lPXMuZj1yCmVsc2V7dD1zLmYKci5jPXQKcy5mPXQuYj1yfSsrcy5h
+CnMuUygpCnJldHVybiByfSwKR1M6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcyxzPWEuYyxyPWEuYgppZihz
+PT1udWxsKXQuZT1yCmVsc2Ugcy5iPXIKaWYocj09bnVsbCl0LmY9cwplbHNlIHIuYz1zOy0tdC5hCnQu
+UygpfSwKTjpmdW5jdGlvbihhKXtyZXR1cm4gSi5oZihhKSYxMDczNzQxODIzfSwKREY6ZnVuY3Rpb24o
+YSxiKXt2YXIgdCxzCmlmKGE9PW51bGwpcmV0dXJuLTEKdD1hLmxlbmd0aApmb3Iocz0wO3M8dDsrK3Mp
+aWYoSi5STShhW3NdLmEsYikpcmV0dXJuIHMKcmV0dXJuLTF9fQpQLmJuLnByb3RvdHlwZT17fQpQLmxt
+LnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24oKXt2YXIg
+dD10aGlzLHM9dC5hCmlmKHQuYiE9PXMucil0aHJvdyBILmIoUC5hNChzKSkKZWxzZXtzPXQuYwppZihz
+PT1udWxsKXt0LnNqKG51bGwpCnJldHVybiExfWVsc2V7dC5zaih0LiR0aS5kLmIocy5hKSkKdC5jPXQu
+Yy5iCnJldHVybiEwfX19LApzajpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlB
+bjoxfQpQLm1XLnByb3RvdHlwZT17fQpQLkxVLnByb3RvdHlwZT17JGljWDoxLCRpek06MX0KUC5sRC5w
+cm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmE3KGEsdGhpcy5nQShhKSxILnpL
+KGEpLkMoImE3PGxELkU+IikpfSwKRTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnEoYSxiKX0sCks6
+ZnVuY3Rpb24oYSxiKXt2YXIgdCxzCkgueksoYSkuQygifihsRC5FKSIpLmIoYikKdD10aGlzLmdBKGEp
+CmZvcihzPTA7czx0Oysrcyl7Yi4kMSh0aGlzLnEoYSxzKSkKaWYodCE9PXRoaXMuZ0EoYSkpdGhyb3cg
+SC5iKFAuYTQoYSkpfX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILnpLKGEpCnJldHVybiBuZXcg
+SC5BOChhLHQuS3EoYykuQygiMShsRC5FKSIpLmIoYiksdC5DKCJAPGxELkU+IikuS3EoYykuQygiQTg8
+MSwyPiIpKX0sCmR1OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0CkgueksoYSkuQygibEQuRSIpLmIoZCkK
+UC5qQihiLGMsdGhpcy5nQShhKSkKZm9yKHQ9Yjt0PGM7Kyt0KXRoaXMuWShhLHQsZCl9LAp3OmZ1bmN0
+aW9uKGEpe3JldHVybiBQLldFKGEsIlsiLCJdIil9fQpQLmlsLnByb3RvdHlwZT17fQpQLnJhLnByb3Rv
+dHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLmEKaWYoIXMuYSl0aGlzLmIuYSs9Iiwg
+IgpzLmE9ITEKcz10aGlzLmIKdD1zLmErPUguZChhKQpzLmE9dCsiOiAiCnMuYSs9SC5kKGIpfSwKJFM6
+MX0KUC5Zay5wcm90b3R5cGU9ewpLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILkxoKHRoaXMpLkMoIn4o
+WWsuSyxZay5WKSIpLmIoYikKZm9yKHQ9Si5JVCh0aGlzLmdWKCkpO3QuRigpOyl7cz10LmdsKCkKYi4k
+MihzLHRoaXMucSgwLHMpKX19LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmdWKCkpfSwK
+dzpmdW5jdGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCiRpWjA6MX0KUC5LUC5wcm90b3R5cGU9ewpZ
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILkxoKHRoaXMpCnQuZC5iKGIpCnQuY2hbMV0uYihjKQp0aHJv
+dyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIikpfX0KUC5Qbi5wcm90b3R5
+cGU9ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5xKDAsYil9LApZOmZ1bmN0aW9uKGEsYixj
+KXt2YXIgdD1ILkxoKHRoaXMpCnRoaXMuYS5ZKDAsdC5kLmIoYiksdC5jaFsxXS5iKGMpKX0sCks6ZnVu
+Y3Rpb24oYSxiKXt0aGlzLmEuSygwLEguTGgodGhpcykuQygifigxLDIpIikuYihiKSl9LApnQTpmdW5j
+dGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQuZ0EodCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBK
+LmoodGhpcy5hKX0sCiRpWjA6MX0KUC5Hai5wcm90b3R5cGU9e30KUC5sZi5wcm90b3R5cGU9ewp3OmZ1
+bmN0aW9uKGEpe3JldHVybiBQLldFKHRoaXMsInsiLCJ9Iil9fQpQLlZqLnByb3RvdHlwZT17JGljWDox
+LCRpeHU6MX0KUC5Ydi5wcm90b3R5cGU9ewpGVjpmdW5jdGlvbihhLGIpe3ZhciB0CmZvcih0PUouSVQo
+SC5MaCh0aGlzKS5DKCJjWDwxPiIpLmIoYikpO3QuRigpOyl0aGlzLmkoMCx0LmdsKCkpfSwKdzpmdW5j
+dGlvbihhKXtyZXR1cm4gUC5XRSh0aGlzLCJ7IiwifSIpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9
+UC5yaih0aGlzLHRoaXMucixILkxoKHRoaXMpLmQpCmlmKCFzLkYoKSlyZXR1cm4iIgppZihiPT09IiIp
+e3Q9IiIKZG8gdCs9SC5kKHMuZCkKd2hpbGUocy5GKCkpfWVsc2V7dD1ILmQocy5kKQpmb3IoO3MuRigp
+Oyl0PXQrYitILmQocy5kKX1yZXR1cm4gdC5jaGFyQ29kZUF0KDApPT0wP3Q6dH0sCiRpY1g6MSwKJGl4
+dToxfQpQLm5ZLnByb3RvdHlwZT17fQpQLldZLnByb3RvdHlwZT17fQpQLlJVLnByb3RvdHlwZT17fQpQ
+LnV3LnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMuYgppZihzPT1udWxsKXJl
+dHVybiB0aGlzLmMucSgwLGIpCmVsc2UgaWYodHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBudWxsCmVs
+c2V7dD1zW2JdCnJldHVybiB0eXBlb2YgdD09InVuZGVmaW5lZCI/dGhpcy5mYihiKTp0fX0sCmdBOmZ1
+bmN0aW9uKGEpe3JldHVybiB0aGlzLmI9PW51bGw/dGhpcy5jLmE6dGhpcy5DZigpLmxlbmd0aH0sCmdW
+OmZ1bmN0aW9uKCl7aWYodGhpcy5iPT1udWxsKXt2YXIgdD10aGlzLmMKcmV0dXJuIG5ldyBILmk1KHQs
+SC5MaCh0KS5DKCJpNTwxPiIpKX1yZXR1cm4gbmV3IFAuaTgodGhpcyl9LApZOmZ1bmN0aW9uKGEsYixj
+KXt2YXIgdCxzLHI9dGhpcwppZihyLmI9PW51bGwpci5jLlkoMCxiLGMpCmVsc2UgaWYoci54NChiKSl7
+dD1yLmIKdFtiXT1jCnM9ci5hCmlmKHM9PW51bGw/dCE9bnVsbDpzIT09dClzW2JdPW51bGx9ZWxzZSBy
+LlhLKCkuWSgwLGIsYyl9LAp4NDpmdW5jdGlvbihhKXtpZih0aGlzLmI9PW51bGwpcmV0dXJuIHRoaXMu
+Yy54NChhKQpyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYSxh
+KX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwPXRoaXMKdS5jQS5iKGIpCmlmKHAuYj09bnVs
+bClyZXR1cm4gcC5jLksoMCxiKQp0PXAuQ2YoKQpmb3Iocz0wO3M8dC5sZW5ndGg7KytzKXtyPXRbc10K
+cT1wLmJbcl0KaWYodHlwZW9mIHE9PSJ1bmRlZmluZWQiKXtxPVAuUWUocC5hW3JdKQpwLmJbcl09cX1i
+LiQyKHIscSkKaWYodCE9PXAuYyl0aHJvdyBILmIoUC5hNChwKSl9fSwKQ2Y6ZnVuY3Rpb24oKXt2YXIg
+dD11LmouYih0aGlzLmMpCmlmKHQ9PW51bGwpdD10aGlzLmM9SC5WTShPYmplY3Qua2V5cyh0aGlzLmEp
+LHUucykKcmV0dXJuIHR9LApYSzpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbz10aGlzCmlmKG8uYj09
+bnVsbClyZXR1cm4gby5jCnQ9UC5GbCh1Lk4sdS56KQpzPW8uQ2YoKQpmb3Iocj0wO3E9cy5sZW5ndGgs
+cjxxOysrcil7cD1zW3JdCnQuWSgwLHAsby5xKDAscCkpfWlmKHE9PT0wKUMuTm0uaShzLG51bGwpCmVs
+c2UgQy5ObS5zQShzLDApCm8uYT1vLmI9bnVsbApyZXR1cm4gby5jPXR9LApmYjpmdW5jdGlvbihhKXt2
+YXIgdAppZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYSxhKSlyZXR1
+cm4gbnVsbAp0PVAuUWUodGhpcy5hW2FdKQpyZXR1cm4gdGhpcy5iW2FdPXR9fQpQLmk4LnByb3RvdHlw
+ZT17CmdBOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5nQSh0KX0sCkU6ZnVuY3Rpb24o
+YSxiKXt2YXIgdD10aGlzLmEKaWYodC5iPT1udWxsKXQ9dC5nVigpLkUoMCxiKQplbHNle3Q9dC5DZigp
+CmlmKGI8MHx8Yj49dC5sZW5ndGgpcmV0dXJuIEguT0godCxiKQp0PXRbYl19cmV0dXJuIHR9LApna3o6
+ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCmlmKHQuYj09bnVsbCl7dD10LmdWKCkKdD10Lmdreih0KX1l
+bHNle3Q9dC5DZigpCnQ9bmV3IEoubTEodCx0Lmxlbmd0aCxILnQ2KHQpLkMoIm0xPDE+IikpfXJldHVy
+biB0fX0KUC5DVi5wcm90b3R5cGU9ewp5cjpmdW5jdGlvbihhLGEwLGExKXt2YXIgdCxzLHIscSxwLG8s
+bixtLGwsayxqLGksaCxnLGYsZSxkLGMsYj0iSW52YWxpZCBiYXNlNjQgZW5jb2RpbmcgbGVuZ3RoICIK
+YTE9UC5qQihhMCxhMSxhLmxlbmd0aCkKdD0kLlY3KCkKZm9yKHM9YTAscj1zLHE9bnVsbCxwPS0xLG89
+LTEsbj0wO3M8YTE7cz1tKXttPXMrMQpsPUMueEIuVyhhLHMpCmlmKGw9PT0zNyl7az1tKzIKaWYoazw9
+YTEpe2o9SC5vbyhDLnhCLlcoYSxtKSkKaT1ILm9vKEMueEIuVyhhLG0rMSkpCmg9aioxNitpLShpJjI1
+NikKaWYoaD09PTM3KWg9LTEKbT1rfWVsc2UgaD0tMX1lbHNlIGg9bAppZigwPD1oJiZoPD0xMjcpe2lm
+KGg8MHx8aD49dC5sZW5ndGgpcmV0dXJuIEguT0godCxoKQpnPXRbaF0KaWYoZz49MCl7aD1DLnhCLm0o
+IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2
+Nzg5Ky8iLGcpCmlmKGg9PT1sKWNvbnRpbnVlCmw9aH1lbHNle2lmKGc9PT0tMSl7aWYocDwwKXtmPXE9
+PW51bGw/bnVsbDpxLmEubGVuZ3RoCmlmKGY9PW51bGwpZj0wCnA9Zisocy1yKQpvPXN9KytuCmlmKGw9
+PT02MSljb250aW51ZX1sPWh9aWYoZyE9PS0yKXtpZihxPT1udWxsKXE9bmV3IFAuUm4oIiIpCnEuYSs9
+Qy54Qi5OaihhLHIscykKcS5hKz1ILkx3KGwpCnI9bQpjb250aW51ZX19dGhyb3cgSC5iKFAucnIoIklu
+dmFsaWQgYmFzZTY0IGRhdGEiLGEscykpfWlmKHEhPW51bGwpe2Y9cS5hKz1DLnhCLk5qKGEscixhMSkK
+ZT1mLmxlbmd0aAppZihwPj0wKVAueE0oYSxvLGExLHAsbixlKQplbHNle2Q9Qy5qbi56WShlLTEsNCkr
+MQppZihkPT09MSl0aHJvdyBILmIoUC5ycihiLGEsYTEpKQpmb3IoO2Q8NDspe2YrPSI9IgpxLmE9Zjsr
+K2R9fWY9cS5hCnJldHVybiBDLnhCLmk3KGEsYTAsYTEsZi5jaGFyQ29kZUF0KDApPT0wP2Y6Zil9Yz1h
+MS1hMAppZihwPj0wKVAueE0oYSxvLGExLHAsbixjKQplbHNle2Q9Qy5qbi56WShjLDQpCmlmKGQ9PT0x
+KXRocm93IEguYihQLnJyKGIsYSxhMSkpCmlmKGQ+MSlhPUMueEIuaTcoYSxhMSxhMSxkPT09Mj8iPT0i
+OiI9Iil9cmV0dXJuIGF9fQpQLlU4LnByb3RvdHlwZT17fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnBy
+b3RvdHlwZT17fQpQLlppLnByb3RvdHlwZT17fQpQLmJ5LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgdAp1LmVwLmIoYykKdD1QLkJTKGIsdGhpcy5nSGUoKS5hKQpyZXR1cm4gdH0sCmdIZTpm
+dW5jdGlvbigpe3JldHVybiBDLkEzfX0KUC5NeC5wcm90b3R5cGU9e30KUC51NS5wcm90b3R5cGU9ewpn
+WkU6ZnVuY3Rpb24oKXtyZXR1cm4gQy5Ra319ClAuRTMucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7
+dmFyIHQscyxyPVAuakIoMCxudWxsLGEubGVuZ3RoKSxxPXItMAppZihxPT09MClyZXR1cm4gbmV3IFVp
+bnQ4QXJyYXkoMCkKdD1uZXcgVWludDhBcnJheShxKjMpCnM9bmV3IFAuUncodCkKaWYocy5HeChhLDAs
+cikhPT1yKXMuTzYoSi5hNihhLHItMSksMCkKcmV0dXJuIG5ldyBVaW50OEFycmF5KHQuc3ViYXJyYXko
+MCxILnJNKDAscy5iLHQubGVuZ3RoKSkpfX0KUC5Sdy5wcm90b3R5cGU9ewpPNjpmdW5jdGlvbihhLGIp
+e3ZhciB0LHM9dGhpcyxyPXMuYyxxPXMuYixwPXErMSxvPXIubGVuZ3RoCmlmKChiJjY0NTEyKT09PTU2
+MzIwKXt0PTY1NTM2KygoYSYxMDIzKTw8MTApfGImMTAyMwpzLmI9cAppZihxPj1vKXJldHVybiBILk9I
+KHIscSkKcltxXT0yNDB8dD4+PjE4CnE9cy5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltw
+XT0xMjh8dD4+PjEyJjYzCnA9cy5iPXErMQppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT0xMjh8
+dD4+PjYmNjMKcy5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT0xMjh8dCY2MwpyZXR1
+cm4hMH1lbHNle3MuYj1wCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTIyNHxhPj4+MTIKcT1z
+LmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixwKQpyW3BdPTEyOHxhPj4+NiY2MwpzLmI9cSsxCmlm
+KHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTEyOHxhJjYzCnJldHVybiExfX0sCkd4OmZ1bmN0aW9u
+KGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMKaWYoYiE9PWMmJihDLnhCLm0oYSxjLTEpJjY0
+NTEyKT09PTU1Mjk2KS0tYwpmb3IodD1tLmMscz10Lmxlbmd0aCxyPWI7cjxjOysrcil7cT1DLnhCLlco
+YSxyKQppZihxPD0xMjcpe3A9bS5iCmlmKHA+PXMpYnJlYWsKbS5iPXArMQp0W3BdPXF9ZWxzZSBpZigo
+cSY2NDUxMik9PT01NTI5Nil7aWYobS5iKzM+PXMpYnJlYWsKbz1yKzEKaWYobS5PNihxLEMueEIuVyhh
+LG8pKSlyPW99ZWxzZSBpZihxPD0yMDQ3KXtwPW0uYgpuPXArMQppZihuPj1zKWJyZWFrCm0uYj1uCmlm
+KHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTE5MnxxPj4+NgptLmI9bisxCnRbbl09MTI4fHEmNjN9
+ZWxzZXtwPW0uYgppZihwKzI+PXMpYnJlYWsKbj1tLmI9cCsxCmlmKHA+PXMpcmV0dXJuIEguT0godCxw
+KQp0W3BdPTIyNHxxPj4+MTIKcD1tLmI9bisxCmlmKG4+PXMpcmV0dXJuIEguT0godCxuKQp0W25dPTEy
+OHxxPj4+NiY2MwptLmI9cCsxCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTEyOHxxJjYzfX1y
+ZXR1cm4gcn19ClAuR1kucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4s
+bSxsCnUuTC5iKGEpCnQ9UC5reSghMSxhLDAsbnVsbCkKaWYodCE9bnVsbClyZXR1cm4gdApzPVAuakIo
+MCxudWxsLEouSG0oYSkpCnI9UC5jUChhLDAscykKaWYocj4wKXtxPVAuSE0oYSwwLHIpCmlmKHI9PT1z
+KXJldHVybiBxCnA9bmV3IFAuUm4ocSkKbz1yCm49ITF9ZWxzZXtvPTAKcD1udWxsCm49ITB9aWYocD09
+bnVsbClwPW5ldyBQLlJuKCIiKQptPW5ldyBQLmJ6KCExLHApCm0uYz1uCm0uTUUoYSxvLHMpCmlmKG0u
+ZT4wKXtILnZoKFAucnIoIlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2UiLGEscykpCnAuYSs9
+SC5Mdyg2NTUzMykKbS5mPW0uZT1tLmQ9MH1sPXAuYQpyZXR1cm4gbC5jaGFyQ29kZUF0KDApPT0wP2w6
+bH19ClAuYnoucHJvdG90eXBlPXsKTUU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0s
+bCxrLGosaSxoPXRoaXMsZz0iQmFkIFVURi04IGVuY29kaW5nIDB4Igp1LkwuYihhKQp0PWguZApzPWgu
+ZQpyPWguZgpoLmY9aC5lPWguZD0wCiRsYWJlbDAkMDpmb3IocT1KLlU2KGEpLHA9aC5iLG89YjshMDtv
+PWopeyRsYWJlbDEkMTppZihzPjApe2Rve2lmKG89PT1jKWJyZWFrICRsYWJlbDAkMApuPXEucShhLG8p
+CmlmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJuIG4uek0oKQppZigobiYxOTIpIT09MTI4KXttPVAu
+cnIoZytDLmpuLldaKG4sMTYpLGEsbykKdGhyb3cgSC5iKG0pfWVsc2V7dD0odDw8NnxuJjYzKT4+PjA7
+LS1zOysrb319d2hpbGUocz4wKQptPXItMQppZihtPDB8fG0+PTQpcmV0dXJuIEguT0goQy5HYixtKQpp
+Zih0PD1DLkdiW21dKXttPVAucnIoIk92ZXJsb25nIGVuY29kaW5nIG9mIDB4IitDLmpuLldaKHQsMTYp
+LGEsby1yLTEpCnRocm93IEguYihtKX1pZih0PjExMTQxMTEpe209UC5ycigiQ2hhcmFjdGVyIG91dHNp
+ZGUgdmFsaWQgVW5pY29kZSByYW5nZTogMHgiK0Muam4uV1oodCwxNiksYSxvLXItMSkKdGhyb3cgSC5i
+KG0pfWlmKCFoLmN8fHQhPT02NTI3OSlwLmErPUguTHcodCkKaC5jPSExfWZvcihtPW88YzttOyl7bD1Q
+LmNQKGEsbyxjKQppZihsPjApe2guYz0hMQprPW8rbApwLmErPVAuSE0oYSxvLGspCmlmKGs9PT1jKWJy
+ZWFrfWVsc2Ugaz1vCmo9aysxCm49cS5xKGEsaykKaWYodHlwZW9mIG4hPT0ibnVtYmVyIilyZXR1cm4g
+bi5KKCkKaWYobjwwKXtpPVAucnIoIk5lZ2F0aXZlIFVURi04IGNvZGUgdW5pdDogLTB4IitDLmpuLlda
+KC1uLDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfWVsc2V7aWYoKG4mMjI0KT09PTE5Mil7dD1uJjMxCnM9
+MQpyPTEKY29udGludWUgJGxhYmVsMCQwfWlmKChuJjI0MCk9PT0yMjQpe3Q9biYxNQpzPTIKcj0yCmNv
+bnRpbnVlICRsYWJlbDAkMH1pZigobiYyNDgpPT09MjQwJiZuPDI0NSl7dD1uJjcKcz0zCnI9Mwpjb250
+aW51ZSAkbGFiZWwwJDB9aT1QLnJyKGcrQy5qbi5XWihuLDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfX1i
+cmVhayAkbGFiZWwwJDB9aWYocz4wKXtoLmQ9dApoLmU9cwpoLmY9cn19fQpQLldGLnByb3RvdHlwZT17
+CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCnUuZm8uYihhKQp0PXRoaXMuYgpzPXRoaXMuYQp0LmEr
+PXMuYQpyPXQuYSs9SC5kKGEuYSkKdC5hPXIrIjogIgp0LmErPVAucChiKQpzLmE9IiwgIn0sCiRTOjMy
+fQpQLmEyLnByb3RvdHlwZT17fQpQLmlQLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09
+bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuaVAmJnRoaXMuYT09PWIuYSYmITB9LApn
+aU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybih0XkMuam4ud0codCwzMCkpJjEwNzM3NDE4
+MjN9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz1QLkdxKEgudEoodCkpLHI9UC5oMChILk5TKHQp
+KSxxPVAuaDAoSC5qQSh0KSkscD1QLmgwKEguS0wodCkpLG89UC5oMChILmNoKHQpKSxuPVAuaDAoSC5K
+ZCh0KSksbT1QLlZ4KEgubzEodCkpLGw9cysiLSIrcisiLSIrcSsiICIrcCsiOiIrbysiOiIrbisiLiIr
+bQpyZXR1cm4gbH19ClAuQ1AucHJvdG90eXBlPXt9ClAuWFMucHJvdG90eXBlPXt9ClAuQzYucHJvdG90
+eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKaWYodCE9bnVsbClyZXR1cm4iQXNzZXJ0aW9u
+IGZhaWxlZDogIitQLnAodCkKcmV0dXJuIkFzc2VydGlvbiBmYWlsZWQifX0KUC5uLnByb3RvdHlwZT17
+Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlRocm93IG9mIG51bGwuIn19ClAudS5wcm90b3R5cGU9ewpnWjpm
+dW5jdGlvbigpe3JldHVybiJJbnZhbGlkIGFyZ3VtZW50IisoIXRoaXMuYT8iKHMpIjoiIil9LApndTpm
+dW5jdGlvbigpe3JldHVybiIifSwKdzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1wLmMs
+bj1vIT1udWxsPyIgKCIrbysiKSI6IiIKbz1wLmQKdD1vPT1udWxsPyIiOiI6ICIrSC5kKG8pCnM9cC5n
+WigpK24rdAppZighcC5hKXJldHVybiBzCnI9cC5ndSgpCnE9UC5wKHAuYikKcmV0dXJuIHMrcisiOiAi
+K3F9fQpQLmJKLnByb3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6
+ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcy5lCmlmKHI9PW51bGwpe3I9dGhpcy5mCnQ9ciE9bnVsbD8i
+OiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIrSC5kKHIpOiIifWVsc2V7cz10aGlzLmYKaWYocz09
+bnVsbCl0PSI6IE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIitILmQocikKZWxzZSBpZihzPnIp
+dD0iOiBOb3QgaW4gcmFuZ2UgIitILmQocikrIi4uIitILmQocykrIiwgaW5jbHVzaXZlIgplbHNlIHQ9
+czxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIr
+SC5kKHIpfXJldHVybiB0fX0KUC5lWS5wcm90b3R5cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJSYW5n
+ZUVycm9yIn0sCmd1OmZ1bmN0aW9uKCl7dmFyIHQscz1ILlNjKHRoaXMuYikKaWYodHlwZW9mIHMhPT0i
+bnVtYmVyIilyZXR1cm4gcy5KKCkKaWYoczwwKXJldHVybiI6IGluZGV4IG11c3Qgbm90IGJlIG5lZ2F0
+aXZlIgp0PXRoaXMuZgppZih0PT09MClyZXR1cm4iOiBubyBpbmRpY2VzIGFyZSB2YWxpZCIKcmV0dXJu
+IjogaW5kZXggc2hvdWxkIGJlIGxlc3MgdGhhbiAiK0guZCh0KX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVy
+biB0aGlzLmZ9fQpQLm1wLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4s
+bSxsPXRoaXMsaz17fSxqPW5ldyBQLlJuKCIiKQprLmE9IiIKZm9yKHQ9bC5jLHM9dC5sZW5ndGgscj0w
+LHE9IiIscD0iIjtyPHM7KytyLHA9IiwgIil7bz10W3JdCmouYT1xK3AKcT1qLmErPVAucChvKQprLmE9
+IiwgIn1sLmQuSygwLG5ldyBQLldGKGssaikpCm49UC5wKGwuYSkKbT1qLncoMCkKdD0iTm9TdWNoTWV0
+aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK0guZChsLmIuYSkrIidcblJlY2VpdmVyOiAiK24r
+IlxuQXJndW1lbnRzOiBbIittKyJdIgpyZXR1cm4gdH19ClAudWIucHJvdG90eXBlPXsKdzpmdW5jdGlv
+bihhKXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBl
+PXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQhPW51bGw/IlVuaW1wbGVtZW50ZWRF
+cnJvcjogIit0OiJVbmltcGxlbWVudGVkRXJyb3IifX0KUC5sai5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
+KGEpe3JldHVybiJCYWQgc3RhdGU6ICIrdGhpcy5hfX0KUC5VVi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
+KGEpe3ZhciB0PXRoaXMuYQppZih0PT1udWxsKXJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBk
+dXJpbmcgaXRlcmF0aW9uLiIKcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVy
+YXRpb246ICIrUC5wKHQpKyIuIn19ClAuazUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4i
+T3V0IG9mIE1lbW9yeSJ9LAokaVhTOjF9ClAuS1kucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1
+cm4iU3RhY2sgT3ZlcmZsb3cifSwKJGlYUzoxfQpQLmMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2
+YXIgdD10aGlzLmEKcmV0dXJuIHQ9PW51bGw/IlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBp
+dHMgaW5pdGlhbGl6YXRpb24iOiJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAnIit0KyInIGR1cmluZyBp
+dHMgaW5pdGlhbGl6YXRpb24ifX0KUC5DRC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJF
+eGNlcHRpb246ICIrdGhpcy5hfX0KUC5hRS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMuYSxnPWghPW51bGwmJiIiIT09aD8iRm9ybWF0RXhjZXB0
+aW9uOiAiK0guZChoKToiRm9ybWF0RXhjZXB0aW9uIixmPXRoaXMuYyxlPXRoaXMuYgppZih0eXBlb2Yg
+ZT09InN0cmluZyIpe2lmKGYhPW51bGwpaD1mPDB8fGY+ZS5sZW5ndGgKZWxzZSBoPSExCmlmKGgpZj1u
+dWxsCmlmKGY9PW51bGwpe3Q9ZS5sZW5ndGg+Nzg/Qy54Qi5OaihlLDAsNzUpKyIuLi4iOmUKcmV0dXJu
+IGcrIlxuIit0fWZvcihzPTEscj0wLHE9ITEscD0wO3A8ZjsrK3Ape289Qy54Qi5XKGUscCkKaWYobz09
+PTEwKXtpZihyIT09cHx8IXEpKytzCnI9cCsxCnE9ITF9ZWxzZSBpZihvPT09MTMpeysrcwpyPXArMQpx
+PSEwfX1nPXM+MT9nKygiIChhdCBsaW5lICIrcysiLCBjaGFyYWN0ZXIgIisoZi1yKzEpKyIpXG4iKTpn
+KygiIChhdCBjaGFyYWN0ZXIgIisoZisxKSsiKVxuIikKbj1lLmxlbmd0aApmb3IocD1mO3A8bjsrK3Ap
+e289Qy54Qi5tKGUscCkKaWYobz09PTEwfHxvPT09MTMpe249cApicmVha319aWYobi1yPjc4KWlmKGYt
+cjw3NSl7bT1yKzc1Cmw9cgprPSIiCmo9Ii4uLiJ9ZWxzZXtpZihuLWY8NzUpe2w9bi03NQptPW4Kaj0i
+In1lbHNle2w9Zi0zNgptPWYrMzYKaj0iLi4uIn1rPSIuLi4ifWVsc2V7bT1uCmw9cgprPSIiCmo9IiJ9
+aT1DLnhCLk5qKGUsbCxtKQpyZXR1cm4gZytrK2kraisiXG4iK0MueEIuSXgoIiAiLGYtbCtrLmxlbmd0
+aCkrIl5cbiJ9ZWxzZSByZXR1cm4gZiE9bnVsbD9nKygiIChhdCBvZmZzZXQgIitILmQoZikrIikiKTpn
+fX0KUC5FSC5wcm90b3R5cGU9e30KUC5LTi5wcm90b3R5cGU9e30KUC5jWC5wcm90b3R5cGU9ewpldjpm
+dW5jdGlvbihhLGIpe3ZhciB0PUguTGgodGhpcykKcmV0dXJuIG5ldyBILlU1KHRoaXMsdC5DKCJhMihj
+WC5FKSIpLmIoYiksdC5DKCJVNTxjWC5FPiIpKX0sCmdBOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5n
+a3oodGhpcykKZm9yKHQ9MDtzLkYoKTspKyt0CnJldHVybiB0fSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVy
+biF0aGlzLmdreih0aGlzKS5GKCl9LApncjg6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLmdreih0aGlz
+KQppZighcy5GKCkpdGhyb3cgSC5iKEguV3AoKSkKdD1zLmdsKCkKaWYocy5GKCkpdGhyb3cgSC5iKEgu
+ZFUoKSkKcmV0dXJuIHR9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyClAuazEoYiwiaW5kZXgiKQpm
+b3IodD10aGlzLmdreih0aGlzKSxzPTA7dC5GKCk7KXtyPXQuZ2woKQppZihiPT09cylyZXR1cm4gcjsr
+K3N9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIsbnVsbCxzKSl9LAp3OmZ1bmN0aW9uKGEpe3Jl
+dHVybiBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnByb3RvdHlwZT17fQpQLnpNLnByb3RvdHlwZT17
+JGljWDoxfQpQLlowLnByb3RvdHlwZT17fQpQLmM4LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXty
+ZXR1cm4gUC5rLnByb3RvdHlwZS5naU8uY2FsbCh0aGlzLHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1
+cm4ibnVsbCJ9fQpQLkZLLnByb3RvdHlwZT17fQpQLmsucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQLmss
+JGlrOjEsCkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXM9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBILmVRKHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEgu
+TSh0aGlzKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1Lm8uYihiKQp0aHJvdyBILmIoUC5scih0aGlz
+LGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9LAp0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlz
+LncodGhpcyl9fQpQLk9kLnByb3RvdHlwZT17fQpQLmliLnByb3RvdHlwZT17JGlPZDoxfQpQLnh1LnBy
+b3RvdHlwZT17fQpQLkd6LnByb3RvdHlwZT17fQpQLnFVLnByb3RvdHlwZT17JGl2WDoxfQpQLlJuLnBy
+b3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKdzpmdW5jdGlvbihh
+KXt2YXIgdD10aGlzLmEKcmV0dXJuIHQuY2hhckNvZGVBdCgwKT09MD90OnR9LAokaUJMOjF9ClAuR0Qu
+cHJvdG90eXBlPXt9ClAubjEucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscQp1
+LmYuYihhKQpILnkoYikKdD1KLnJZKGIpLk9ZKGIsIj0iKQppZih0PT09LTEpe2lmKGIhPT0iIilhLlko
+MCxQLmt1KGIsMCxiLmxlbmd0aCx0aGlzLmEsITApLCIiKX1lbHNlIGlmKHQhPT0wKXtzPUMueEIuTmoo
+YiwwLHQpCnI9Qy54Qi5HKGIsdCsxKQpxPXRoaXMuYQphLlkoMCxQLmt1KHMsMCxzLmxlbmd0aCxxLCEw
+KSxQLmt1KHIsMCxyLmxlbmd0aCxxLCEwKSl9cmV0dXJuIGF9LAokUzozOX0KUC5jUy5wcm90b3R5cGU9
+ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJyKCJJbGxlZ2FsIElQdjQgYWRkcmVzcywgIith
+LHRoaXMuYSxiKSl9LAokUzoyOX0KUC5WQy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93
+IEguYihQLnJyKCJJbGxlZ2FsIElQdjYgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAokMTpmdW5jdGlv
+bihhKXtyZXR1cm4gdGhpcy4kMihhLG51bGwpfSwKJFM6MjZ9ClAudHAucHJvdG90eXBlPXsKJDI6ZnVu
+Y3Rpb24oYSxiKXt2YXIgdAppZihiLWE+NCl0aGlzLmEuJDIoImFuIElQdjYgcGFydCBjYW4gb25seSBj
+b250YWluIGEgbWF4aW11bSBvZiA0IGhleCBkaWdpdHMiLGEpCnQ9UC5RQShDLnhCLk5qKHRoaXMuYixh
+LGIpLG51bGwsMTYpCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigpCmlmKHQ8MHx8dD42
+NTUzNSl0aGlzLmEuJDIoImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBgMHgwLi4weEZG
+RkZgIixhKQpyZXR1cm4gdH0sCiRTOjE5fQpQLkRuLnByb3RvdHlwZT17CmdrdTpmdW5jdGlvbigpe3Jl
+dHVybiB0aGlzLmJ9LApnSmY6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCmlmKHQ9PW51bGwpcmV0dXJu
+IiIKaWYoQy54Qi5uKHQsIlsiKSlyZXR1cm4gQy54Qi5Oaih0LDEsdC5sZW5ndGgtMSkKcmV0dXJuIHR9
+LApndHA6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5kCmlmKHQ9PW51bGwpcmV0dXJuIFAud0sodGhpcy5h
+KQpyZXR1cm4gdH0sCmd0UDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZgpyZXR1cm4gdD09bnVsbD8iIjp0
+fSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yCnJldHVybiB0PT1udWxsPyIiOnR9LApubTpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG0sbD10aGlzCnUuWC5iKG51bGwpCnUuYi5iKGIpCnQ9
+bC5hCnM9dD09PSJmaWxlIgpyPWwuYgpxPWwuZApwPWwuYwppZighKHAhPW51bGwpKXA9ci5sZW5ndGgh
+PT0wfHxxIT1udWxsfHxzPyIiOm51bGwKbz1sLmUKaWYoIXMpbj1wIT1udWxsJiZvLmxlbmd0aCE9PTAK
+ZWxzZSBuPSEwCmlmKG4mJiFDLnhCLm4obywiLyIpKW89Ii8iK28KaWYoYiE9bnVsbCltPVAubGUobnVs
+bCwwLDAsYikKZWxzZSBtPWwuZgpyZXR1cm4gbmV3IFAuRG4odCxyLHAscSxvLG0sbC5yKX0sCmdGajpm
+dW5jdGlvbigpe3ZhciB0LHM9dGhpcy54CmlmKHMhPW51bGwpcmV0dXJuIHMKdD10aGlzLmUKaWYodC5s
+ZW5ndGghPT0wJiZDLnhCLlcodCwwKT09PTQ3KXQ9Qy54Qi5HKHQsMSkKcz10PT09IiI/Qy5kbjpQLkFG
+KG5ldyBILkE4KEguVk0odC5zcGxpdCgiLyIpLHUucyksdS5kTy5iKFAuUEgoKSksdS5kbyksdS5OKQp0
+aGlzLnNvNihzKQpyZXR1cm4gc30sCmdoWTpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcwppZihzLlE9PW51
+bGwpe3Q9cy5mCnMuc1JIKG5ldyBQLkdqKFAuV1godD09bnVsbD8iIjp0KSx1LlQpKX1yZXR1cm4gcy5R
+fSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8KZm9yKHQ9MCxzPTA7Qy54Qi5RaShiLCIu
+Li8iLHMpOyl7cys9MzsrK3R9cj1DLnhCLmNuKGEsIi8iKQp3aGlsZSghMCl7aWYoIShyPjAmJnQ+MCkp
+YnJlYWsKcT1DLnhCLlBrKGEsIi8iLHItMSkKaWYocTwwKWJyZWFrCnA9ci1xCm89cCE9PTIKaWYoIW98
+fHA9PT0zKWlmKEMueEIubShhLHErMSk9PT00NilvPSFvfHxDLnhCLm0oYSxxKzIpPT09NDYKZWxzZSBv
+PSExCmVsc2Ugbz0hMQppZihvKWJyZWFrOy0tdApyPXF9cmV0dXJuIEMueEIuaTcoYSxyKzEsbnVsbCxD
+LnhCLkcoYixzLTMqdCkpfSwKWkk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubVMoUC5oSyhhKSl9LApt
+UzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsaz10aGlzLGo9bnVsbAppZihhLmdGaSgp
+Lmxlbmd0aCE9PTApe3Q9YS5nRmkoKQppZihhLmdjaigpKXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPWEu
+Z3hBKCk/YS5ndHAoYSk6an1lbHNle3E9agpyPXEKcz0iIn1wPVAueGUoYS5nSWkoYSkpCm89YS5nUUQo
+KT9hLmd0UCgpOmp9ZWxzZXt0PWsuYQppZihhLmdjaigpKXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPVAu
+d0IoYS5neEEoKT9hLmd0cChhKTpqLHQpCnA9UC54ZShhLmdJaShhKSkKbz1hLmdRRCgpP2EuZ3RQKCk6
+an1lbHNle3M9ay5iCnI9ay5jCnE9ay5kCmlmKGEuZ0lpKGEpPT09IiIpe3A9ay5lCm89YS5nUUQoKT9h
+Lmd0UCgpOmsuZn1lbHNle2lmKGEuZ3RUKCkpcD1QLnhlKGEuZ0lpKGEpKQplbHNle249ay5lCmlmKG4u
+bGVuZ3RoPT09MClpZihyPT1udWxsKXA9dC5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkp
+CmVsc2UgcD1QLnhlKCIvIithLmdJaShhKSkKZWxzZXttPWsuSmgobixhLmdJaShhKSkKbD10Lmxlbmd0
+aD09PTAKaWYoIWx8fHIhPW51bGx8fEMueEIubihuLCIvIikpcD1QLnhlKG0pCmVsc2UgcD1QLndGKG0s
+IWx8fHIhPW51bGwpfX1vPWEuZ1FEKCk/YS5ndFAoKTpqfX19cmV0dXJuIG5ldyBQLkRuKHQscyxyLHEs
+cCxvLGEuZ1o4KCk/YS5nS2EoKTpqKX0sCmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMhPW51bGx9
+LApneEE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kIT1udWxsfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJu
+IHRoaXMuZiE9bnVsbH0sCmdaODpmdW5jdGlvbigpe3JldHVybiB0aGlzLnIhPW51bGx9LApndFQ6ZnVu
+Y3Rpb24oKXtyZXR1cm4gQy54Qi5uKHRoaXMuZSwiLyIpfSwKdDQ6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9
+dGhpcyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRy
+YWN0IGEgZmlsZSBwYXRoIGZyb20gYSAiK0guZChxKSsiIFVSSSIpKQpxPXIuZgppZigocT09bnVsbD8i
+IjpxKSE9PSIiKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEg
+VVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiKSkKcT1yLnIKaWYoKHE9PW51bGw/IiI6cSkhPT0iIil0
+aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEg
+ZnJhZ21lbnQgY29tcG9uZW50IikpCnQ9JC53USgpCmlmKEgub1QodCkpcT1QLm1uKHIpCmVsc2V7aWYo
+ci5jIT1udWxsJiZyLmdKZihyKSE9PSIiKUgudmgoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBub24tV2lu
+ZG93cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IikpCnM9ci5nRmoo
+KQpQLmtFKHMsITEpCnE9UC52ZyhDLnhCLm4oci5lLCIvIik/Ii8iOiIiLHMsIi8iKQpxPXEuY2hhckNv
+ZGVBdCgwKT09MD9xOnF9cmV0dXJuIHF9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPXRoaXMscD1x
+LnkKaWYocD09bnVsbCl7cD1xLmEKdD1wLmxlbmd0aCE9PTA/cCsiOiI6IiIKcz1xLmMKcj1zPT1udWxs
+CmlmKCFyfHxwPT09ImZpbGUiKXtwPXQrIi8vIgp0PXEuYgppZih0Lmxlbmd0aCE9PTApcD1wK3QrIkAi
+CmlmKCFyKXArPXMKdD1xLmQKaWYodCE9bnVsbClwPXArIjoiK0guZCh0KX1lbHNlIHA9dApwKz1xLmUK
+dD1xLmYKaWYodCE9bnVsbClwPXArIj8iK3QKdD1xLnIKaWYodCE9bnVsbClwPXArIiMiK3QKcD1xLnk9
+cC5jaGFyQ29kZUF0KDApPT0wP3A6cH1yZXR1cm4gcH0sCkROOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxy
+PXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZihyPT09YilyZXR1cm4hMAppZih1LkQuYyhiKSlpZihy
+LmE9PWIuZ0ZpKCkpaWYoci5jIT1udWxsPT09Yi5nY2ooKSlpZihyLmI9PWIuZ2t1KCkpaWYoci5nSmYo
+cik9PWIuZ0pmKGIpKWlmKHIuZ3RwKHIpPT1iLmd0cChiKSlpZihyLmU9PT1iLmdJaShiKSl7dD1yLmYK
+cz10PT1udWxsCmlmKCFzPT09Yi5nUUQoKSl7aWYocyl0PSIiCmlmKHQ9PT1iLmd0UCgpKXt0PXIucgpz
+PXQ9PW51bGwKaWYoIXM9PT1iLmdaOCgpKXtpZihzKXQ9IiIKdD10PT09Yi5nS2EoKX1lbHNlIHQ9ITF9
+ZWxzZSB0PSExfWVsc2UgdD0hMX1lbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEK
+ZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKcmV0dXJuIHR9LApnaU86ZnVuY3Rpb24oYSl7dmFy
+IHQ9dGhpcy56CnJldHVybiB0PT1udWxsP3RoaXMuej1DLnhCLmdpTyh0aGlzLncoMCkpOnR9LApzbzY6
+ZnVuY3Rpb24oYSl7dGhpcy54PXUuYS5iKGEpfSwKc1JIOmZ1bmN0aW9uKGEpe3RoaXMuUT11LmYuYihh
+KX0sCiRpaUQ6MSwKZ0ZpOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYX0sCmdJaTpmdW5jdGlvbihhKXty
+ZXR1cm4gdGhpcy5lfX0KUC5lMS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5y
+cigiSW52YWxpZCBwb3J0Iix0aGlzLmEsdGhpcy5iKzEpKX0sCiRTOjExfQpQLk5ZLnByb3RvdHlwZT17
+CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PSJJbGxlZ2FsIHBhdGggY2hhcmFjdGVyICIKSC55KGEpCmlmKEou
+emwoYSwiLyIpKWlmKHRoaXMuYSl0aHJvdyBILmIoUC54WSh0K2EpKQplbHNlIHRocm93IEguYihQLkw0
+KHQrYSkpfSwKJFM6MTF9ClAuUloucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAo
+Qy5aSixhLEMueE0sITEpfSwKJFM6NX0KUC5NRS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Zh
+ciB0PXRoaXMuYixzPXRoaXMuYQp0LmErPXMuYQpzLmE9IiYiCnM9dC5hKz1ILmQoUC5lUChDLkYzLGEs
+Qy54TSwhMCkpCmlmKGIhPW51bGwmJmIubGVuZ3RoIT09MCl7dC5hPXMrIj0iCnQuYSs9SC5kKFAuZVAo
+Qy5GMyxiLEMueE0sITApKX19LAokUzoyMn0KUC55NS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
+e3ZhciB0LHMKSC55KGEpCmlmKGI9PW51bGx8fHR5cGVvZiBiPT0ic3RyaW5nIil0aGlzLmEuJDIoYSxI
+LnkoYikpCmVsc2UgZm9yKHQ9Si5JVCh1LlIuYihiKSkscz10aGlzLmE7dC5GKCk7KXMuJDIoYSxILnko
+dC5nbCgpKSl9LAokUzoxMn0KUC5QRS5wcm90b3R5cGU9ewpnbFI6ZnVuY3Rpb24oKXt2YXIgdCxzLHIs
+cSxwPXRoaXMsbz1udWxsLG49cC5jCmlmKG4hPW51bGwpcmV0dXJuIG4Kbj1wLmIKaWYoMD49bi5sZW5n
+dGgpcmV0dXJuIEguT0gobiwwKQp0PXAuYQpuPW5bMF0rMQpzPUMueEIuWFUodCwiPyIsbikKcj10Lmxl
+bmd0aAppZihzPj0wKXtxPVAudU8odCxzKzEscixDLlZDLCExKQpyPXN9ZWxzZSBxPW8KcmV0dXJuIHAu
+Yz1uZXcgUC5xZSgiZGF0YSIsbyxvLG8sUC51Tyh0LG4scixDLldkLCExKSxxLG8pfSwKdzpmdW5jdGlv
+bihhKXt2YXIgdCxzPXRoaXMuYgppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLDApCnQ9dGhpcy5h
+CnJldHVybiBzWzBdPT09LTE/ImRhdGE6Iit0OnR9fQpQLnEzLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9u
+KGEpe3JldHVybiBuZXcgVWludDhBcnJheSg5Nil9LAokUzo0Nn0KUC55SS5wcm90b3R5cGU9ewokMjpm
+dW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYQppZihhPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LGEpCnQ9
+dFthXQpKLkNNKHQsMCw5NixiKQpyZXR1cm4gdH0sCiRTOjI0fQpQLmM2LnByb3RvdHlwZT17CiQzOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQpmb3IodD1iLmxlbmd0aCxzPWEubGVuZ3RoLHI9MDtyPHQ7
+KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PXMpcmV0dXJuIEguT0goYSxxKQphW3FdPWN9fX0KUC5x
+ZC5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEKZm9yKHQ9Qy54Qi5XKGIs
+MCkscz1DLnhCLlcoYiwxKSxyPWEubGVuZ3RoO3Q8PXM7Kyt0KXtxPSh0Xjk2KT4+PjAKaWYocT49cily
+ZXR1cm4gSC5PSChhLHEpCmFbcV09Y319fQpQLlVmLnByb3RvdHlwZT17CmdjajpmdW5jdGlvbigpe3Jl
+dHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3ZhciB0LHMKaWYodGhpcy5jPjApe3Q9dGhpcy5k
+CmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuaCgpCnM9dGhpcy5lCmlmKHR5cGVvZiBzIT09
+Im51bWJlciIpcmV0dXJuIEgucFkocykKcz10KzE8cwp0PXN9ZWxzZSB0PSExCnJldHVybiB0fSwKZ1FE
+OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigp
+CnJldHVybiB0PHRoaXMucn0sCmdaODpmdW5jdGlvbigpe3JldHVybiB0aGlzLnI8dGhpcy5hLmxlbmd0
+aH0sCmdOdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmI9PT00JiZDLnhCLm4odGhpcy5hLCJmaWxlIil9
+LApndmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwiaHR0cCIpfSwK
+Z3FCOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYj09PTUmJkMueEIubih0aGlzLmEsImh0dHBzIil9LApn
+dFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54Qi5RaSh0aGlzLmEsIi8iLHRoaXMuZSl9LApnRmk6ZnVuY3Rp
+b24oKXt2YXIgdCxzPXRoaXMscj0icGFja2FnZSIscT1zLmIKaWYocTw9MClyZXR1cm4iIgp0PXMueApp
+Zih0IT1udWxsKXJldHVybiB0CmlmKHMuZ3ZoKCkpcT1zLng9Imh0dHAiCmVsc2UgaWYocy5ncUIoKSl7
+cy54PSJodHRwcyIKcT0iaHR0cHMifWVsc2UgaWYocy5nTncoKSl7cy54PSJmaWxlIgpxPSJmaWxlIn1l
+bHNlIGlmKHE9PT03JiZDLnhCLm4ocy5hLHIpKXtzLng9cgpxPXJ9ZWxzZXtxPUMueEIuTmoocy5hLDAs
+cSkKcy54PXF9cmV0dXJuIHF9LApna3U6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmMscz10aGlzLmIrMwpy
+ZXR1cm4gdD5zP0MueEIuTmoodGhpcy5hLHMsdC0xKToiIn0sCmdKZjpmdW5jdGlvbihhKXt2YXIgdD10
+aGlzLmMKcmV0dXJuIHQ+MD9DLnhCLk5qKHRoaXMuYSx0LHRoaXMuZCk6IiJ9LApndHA6ZnVuY3Rpb24o
+YSl7dmFyIHQscz10aGlzCmlmKHMuZ3hBKCkpe3Q9cy5kCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0
+dXJuIHQuaCgpCnJldHVybiBQLlFBKEMueEIuTmoocy5hLHQrMSxzLmUpLG51bGwsbnVsbCl9aWYocy5n
+dmgoKSlyZXR1cm4gODAKaWYocy5ncUIoKSlyZXR1cm4gNDQzCnJldHVybiAwfSwKZ0lpOmZ1bmN0aW9u
+KGEpe3JldHVybiBDLnhCLk5qKHRoaXMuYSx0aGlzLmUsdGhpcy5mKX0sCmd0UDpmdW5jdGlvbigpe3Zh
+ciB0PXRoaXMuZixzPXRoaXMucgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQpyZXR1
+cm4gdDxzP0MueEIuTmoodGhpcy5hLHQrMSxzKToiIn0sCmdLYTpmdW5jdGlvbigpe3ZhciB0PXRoaXMu
+cixzPXRoaXMuYQpyZXR1cm4gdDxzLmxlbmd0aD9DLnhCLkcocyx0KzEpOiIifSwKZ0ZqOmZ1bmN0aW9u
+KCl7dmFyIHQscyxyPXRoaXMuZSxxPXRoaXMuZixwPXRoaXMuYQppZihDLnhCLlFpKHAsIi8iLHIpKXtp
+Zih0eXBlb2YgciE9PSJudW1iZXIiKXJldHVybiByLmgoKTsrK3J9aWYocj09cSlyZXR1cm4gQy5kbgp0
+PUguVk0oW10sdS5zKQpzPXIKd2hpbGUoITApe2lmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMu
+SigpCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJuIEgucFkocSkKaWYoIShzPHEpKWJyZWFrCmlm
+KEMueEIubShwLHMpPT09NDcpe0MuTm0uaSh0LEMueEIuTmoocCxyLHMpKQpyPXMrMX0rK3N9Qy5ObS5p
+KHQsQy54Qi5OaihwLHIscSkpCnJldHVybiBQLkFGKHQsdS5OKX0sCmdoWTpmdW5jdGlvbigpe3ZhciB0
+PXRoaXMuZgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQppZih0Pj10aGlzLnIpcmV0
+dXJuIEMuV08KcmV0dXJuIG5ldyBQLkdqKFAuV1godGhpcy5ndFAoKSksdS5UKX0sCmtYOmZ1bmN0aW9u
+KGEpe3ZhciB0LHM9dGhpcy5kCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuaCgpCnQ9cysx
+CnJldHVybiB0K2EubGVuZ3RoPT09dGhpcy5lJiZDLnhCLlFpKHRoaXMuYSxhLHQpfSwKTjk6ZnVuY3Rp
+b24oKXt2YXIgdD10aGlzLHM9dC5yLHI9dC5hCmlmKHM+PXIubGVuZ3RoKXJldHVybiB0CnJldHVybiBu
+ZXcgUC5VZihDLnhCLk5qKHIsMCxzKSx0LmIsdC5jLHQuZCx0LmUsdC5mLHMsdC54KX0sCm5tOmZ1bmN0
+aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpPXRoaXMsaD1udWxsCnUuWC5iKG51bGwp
+CnUuYi5iKGIpCnQ9aS5nRmkoKQpzPXQ9PT0iZmlsZSIKcj1pLmMKcT1yPjA/Qy54Qi5OaihpLmEsaS5i
+KzMscik6IiIKcD1pLmd4QSgpP2kuZ3RwKGkpOmgKcj1pLmMKaWYocj4wKW89Qy54Qi5OaihpLmEscixp
+LmQpCmVsc2Ugbz1xLmxlbmd0aCE9PTB8fHAhPW51bGx8fHM/IiI6aApyPWkuYQpuPWkuZgptPUMueEIu
+TmoocixpLmUsbikKaWYoIXMpbD1vIT1udWxsJiZtLmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFD
+LnhCLm4obSwiLyIpKW09Ii8iK20KaWYoYiE9bnVsbClrPVAubGUoaCwwLDAsYikKZWxzZXtsPWkucgpp
+Zih0eXBlb2YgbiE9PSJudW1iZXIiKXJldHVybiBuLkooKQprPW48bD9DLnhCLk5qKHIsbisxLGwpOmh9
+bj1pLnIKaj1uPHIubGVuZ3RoP0MueEIuRyhyLG4rMSk6aApyZXR1cm4gbmV3IFAuRG4odCxxLG8scCxt
+LGssail9LApaSTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tUyhQLmhLKGEpKX0sCm1TOmZ1bmN0aW9u
+KGEpe2lmKGEgaW5zdGFuY2VvZiBQLlVmKXJldHVybiB0aGlzLnUxKHRoaXMsYSkKcmV0dXJuIHRoaXMu
+UmUoKS5tUyhhKX0sCnUxOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgs
+ZyxmLGU9Yi5iCmlmKGU+MClyZXR1cm4gYgp0PWIuYwppZih0PjApe3M9YS5iCmlmKHM8PTApcmV0dXJu
+IGIKaWYoYS5nTncoKSlyPWIuZSE9Yi5mCmVsc2UgaWYoYS5ndmgoKSlyPSFiLmtYKCI4MCIpCmVsc2Ug
+cj0hYS5ncUIoKXx8IWIua1goIjQ0MyIpCmlmKHIpe3E9cysxCnA9Qy54Qi5OaihhLmEsMCxxKStDLnhC
+LkcoYi5hLGUrMSkKZT1iLmQKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5oKCkKbz1iLmUK
+aWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4gby5oKCkKbj1iLmYKaWYodHlwZW9mIG4hPT0ibnVt
+YmVyIilyZXR1cm4gbi5oKCkKcmV0dXJuIG5ldyBQLlVmKHAscyx0K3EsZStxLG8rcSxuK3EsYi5yK3Es
+YS54KX1lbHNlIHJldHVybiB0aGlzLlJlKCkubVMoYil9bT1iLmUKZT1iLmYKaWYobT09ZSl7dD1iLnIK
+aWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5KKCkKaWYoZTx0KXtzPWEuZgppZih0eXBlb2Yg
+cyE9PSJudW1iZXIiKXJldHVybiBzLkhOKCkKcT1zLWUKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5h
+LDAscykrQy54Qi5HKGIuYSxlKSxhLmIsYS5jLGEuZCxhLmUsZStxLHQrcSxhLngpfWU9Yi5hCmlmKHQ8
+ZS5sZW5ndGgpe3M9YS5yCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHMpK0MueEIuRyhlLHQp
+LGEuYixhLmMsYS5kLGEuZSxhLmYsdCsocy10KSxhLngpfXJldHVybiBhLk45KCl9dD1iLmEKaWYoQy54
+Qi5RaSh0LCIvIixtKSl7cz1hLmUKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5ITigpCmlm
+KHR5cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFkobSkKcT1zLW0KcD1DLnhCLk5qKGEuYSwwLHMp
+K0MueEIuRyh0LG0pCmlmKHR5cGVvZiBlIT09Im51bWJlciIpcmV0dXJuIGUuaCgpCnJldHVybiBuZXcg
+UC5VZihwLGEuYixhLmMsYS5kLHMsZStxLGIucitxLGEueCl9bD1hLmUKaz1hLmYKaWYobD09ayYmYS5j
+PjApe2Zvcig7Qy54Qi5RaSh0LCIuLi8iLG0pOyl7aWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4g
+bS5oKCkKbSs9M31pZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBsLkhOKCkKaWYodHlwZW9mIG0h
+PT0ibnVtYmVyIilyZXR1cm4gSC5wWShtKQpxPWwtbSsxCnA9Qy54Qi5OaihhLmEsMCxsKSsiLyIrQy54
+Qi5HKHQsbSkKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5oKCkKcmV0dXJuIG5ldyBQLlVm
+KHAsYS5iLGEuYyxhLmQsbCxlK3EsYi5yK3EsYS54KX1qPWEuYQpmb3IoaT1sO0MueEIuUWkoaiwiLi4v
+IixpKTspe2lmKHR5cGVvZiBpIT09Im51bWJlciIpcmV0dXJuIGkuaCgpCmkrPTN9aD0wCndoaWxlKCEw
+KXtpZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBtLmgoKQpnPW0rMwppZih0eXBlb2YgZSE9PSJu
+dW1iZXIiKXJldHVybiBILnBZKGUpCmlmKCEoZzw9ZSYmQy54Qi5RaSh0LCIuLi8iLG0pKSlicmVhazsr
+K2gKbT1nfWY9IiIKd2hpbGUoITApe2lmKHR5cGVvZiBrIT09Im51bWJlciIpcmV0dXJuIGsub3MoKQpp
+Zih0eXBlb2YgaSE9PSJudW1iZXIiKXJldHVybiBILnBZKGkpCmlmKCEoaz5pKSlicmVhazstLWsKaWYo
+Qy54Qi5tKGosayk9PT00Nyl7aWYoaD09PTApe2Y9Ii8iCmJyZWFrfS0taApmPSIvIn19aWYoaz09PWkm
+JmEuYjw9MCYmIUMueEIuUWkoaiwiLyIsbCkpe20tPWgqMwpmPSIifXE9ay1tK2YubGVuZ3RoCnJldHVy
+biBuZXcgUC5VZihDLnhCLk5qKGosMCxrKStmK0MueEIuRyh0LG0pLGEuYixhLmMsYS5kLGwsZStxLGIu
+citxLGEueCl9LAp0NDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcwppZihwLmI+PTAmJiFwLmdO
+dygpKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgIitILmQo
+cC5nRmkoKSkrIiBVUkkiKSkKdD1wLmYKcz1wLmEKaWYodHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4g
+dC5KKCkKaWYodDxzLmxlbmd0aCl7aWYodDxwLnIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0
+IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIpKQp0aHJvdyBILmIo
+UC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQg
+Y29tcG9uZW50IikpfXI9JC53USgpCmlmKEgub1QocikpdD1QLm1uKHApCmVsc2V7cT1wLmQKaWYodHlw
+ZW9mIHEhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShxKQppZihwLmM8cSlILnZoKFAuTDQoIkNhbm5vdCBl
+eHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSB3aXRoIGFuIGF1dGhv
+cml0eSIpKQp0PUMueEIuTmoocyxwLmUsdCl9cmV0dXJuIHR9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9
+dGhpcy55CnJldHVybiB0PT1udWxsP3RoaXMueT1DLnhCLmdpTyh0aGlzLmEpOnR9LApETjpmdW5jdGlv
+bihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKaWYodGhpcz09PWIpcmV0dXJuITAKcmV0dXJuIHUuRC5j
+KGIpJiZ0aGlzLmE9PT1iLncoMCl9LApSZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMscz1udWxsLHI9dC5n
+RmkoKSxxPXQuZ2t1KCkscD10LmM+MD90LmdKZih0KTpzLG89dC5neEEoKT90Lmd0cCh0KTpzLG49dC5h
+LG09dC5mLGw9Qy54Qi5OaihuLHQuZSxtKSxrPXQucgppZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVy
+biBtLkooKQptPW08az90Lmd0UCgpOnMKcmV0dXJuIG5ldyBQLkRuKHIscSxwLG8sbCxtLGs8bi5sZW5n
+dGg/dC5nS2EoKTpzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCiRpaUQ6MX0KUC5xZS5w
+cm90b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5HaC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEp
+e3JldHVybiBTdHJpbmcoYSl9LAokaUdoOjF9ClcuZlkucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXty
+ZXR1cm4gU3RyaW5nKGEpfX0KVy5uQi5wcm90b3R5cGU9eyRpbkI6MX0KVy5Bei5wcm90b3R5cGU9eyRp
+QXo6MX0KVy5RUC5wcm90b3R5cGU9eyRpUVA6MX0KVy5ueC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihh
+KXtyZXR1cm4gYS5sZW5ndGh9fQpXLm9KLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBh
+Lmxlbmd0aH19ClcuaWQucHJvdG90eXBlPXt9ClcuUUYucHJvdG90eXBlPXt9ClcuTmgucHJvdG90eXBl
+PXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfX0KVy5JQi5wcm90b3R5cGU9ewp3OmZ1bmN0
+aW9uKGEpe3JldHVybiJSZWN0YW5nbGUgKCIrSC5kKGEubGVmdCkrIiwgIitILmQoYS50b3ApKyIpICIr
+SC5kKGEud2lkdGgpKyIgeCAiK0guZChhLmhlaWdodCl9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51
+bGwpcmV0dXJuITEKcmV0dXJuIHUucS5jKGIpJiZhLmxlZnQ9PT1iLmxlZnQmJmEudG9wPT09Yi50b3Am
+JmEud2lkdGg9PT1iLndpZHRoJiZhLmhlaWdodD09PWIuaGVpZ2h0fSwKZ2lPOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBXLnJFKEMuQ0QuZ2lPKGEubGVmdCksQy5DRC5naU8oYS50b3ApLEMuQ0QuZ2lPKGEud2lkdGgp
+LEMuQ0QuZ2lPKGEuaGVpZ2h0KSl9LAokaXRuOjF9ClcubjcucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24o
+YSl7cmV0dXJuIGEubGVuZ3RofX0KVy53ei5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXt2YXIgdApILlNjKGIpCnQ9dGhpcy5hCmlmKGI8
+MHx8Yj49dC5sZW5ndGgpcmV0dXJuIEguT0godCxiKQpyZXR1cm4gdGhpcy4kdGkuZC5iKHRbYl0pfSwK
+WTpmdW5jdGlvbihhLGIsYyl7dGhpcy4kdGkuZC5iKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9k
+aWZ5IGxpc3QiKSl9fQpXLmN2LnByb3RvdHlwZT17CmdRZzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcu
+aTcoYSl9LApnRDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuSTQoYSl9LApzRDpmdW5jdGlvbihhLGIp
+e3ZhciB0CnUuWC5iKGIpCnQ9dGhpcy5nRChhKQp0LlYxKDApCnQuRlYoMCxiKX0sCnc6ZnVuY3Rpb24o
+YSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKdG46ZnVuY3Rpb24oYSl7dmFyIHQ9ISFhLnNjcm9sbEludG9W
+aWV3SWZOZWVkZWQKaWYodClhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKQplbHNlIGEuc2Nyb2xsSW50
+b1ZpZXcoKX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxCmlmKGM9PW51bGwpe2lmKGQ9
+PW51bGwpe3Q9JC5sdAppZih0PT1udWxsKXt0PUguVk0oW10sdS5rKQpzPW5ldyBXLnZEKHQpCkMuTm0u
+aSh0LFcuVHcobnVsbCkpCkMuTm0uaSh0LFcuQmwoKSkKJC5sdD1zCmQ9c31lbHNlIGQ9dH10PSQuRVUK
+aWYodD09bnVsbCl7dD1uZXcgVy5LbyhkKQokLkVVPXQKYz10fWVsc2V7dC5hPWQKYz10fX1lbHNlIGlm
+KGQhPW51bGwpdGhyb3cgSC5iKFAueFkoInZhbGlkYXRvciBjYW4gb25seSBiZSBwYXNzZWQgaWYgdHJl
+ZVNhbml0aXplciBpcyBudWxsIikpCmlmKCQueG89PW51bGwpe3Q9ZG9jdW1lbnQKcz10LmltcGxlbWVu
+dGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikKJC54bz1zCiQuQk89cy5jcmVhdGVSYW5nZSgpCnM9
+JC54by5jcmVhdGVFbGVtZW50KCJiYXNlIikKdS5jUi5iKHMpCnMuaHJlZj10LmJhc2VVUkkKJC54by5o
+ZWFkLmFwcGVuZENoaWxkKHMpfXQ9JC54bwppZih0LmJvZHk9PW51bGwpe3M9dC5jcmVhdGVFbGVtZW50
+KCJib2R5IikKdC5ib2R5PXUuWS5iKHMpfXQ9JC54bwppZih1LlkuYyhhKSlyPXQuYm9keQplbHNle3I9
+dC5jcmVhdGVFbGVtZW50KGEudGFnTmFtZSkKJC54by5ib2R5LmFwcGVuZENoaWxkKHIpfWlmKCJjcmVh
+dGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUmJiFDLk5tLnRnKEMu
+U3EsYS50YWdOYW1lKSl7JC5CTy5zZWxlY3ROb2RlQ29udGVudHMocikKcT0kLkJPLmNyZWF0ZUNvbnRl
+eHR1YWxGcmFnbWVudChiKX1lbHNle3IuaW5uZXJIVE1MPWIKcT0kLnhvLmNyZWF0ZURvY3VtZW50RnJh
+Z21lbnQoKQpmb3IoO3Q9ci5maXJzdENoaWxkLHQhPW51bGw7KXEuYXBwZW5kQ2hpbGQodCl9dD0kLnhv
+LmJvZHkKaWYocj09bnVsbD90IT1udWxsOnIhPT10KUouTHQocikKYy5QbihxKQpkb2N1bWVudC5hZG9w
+dE5vZGUocSkKcmV0dXJuIHF9LApBSDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMucjYoYSxiLGMs
+bnVsbCl9LApzaGY6ZnVuY3Rpb24oYSxiKXt0aGlzLllDKGEsYil9LApwazpmdW5jdGlvbihhLGIsYyl7
+YS50ZXh0Q29udGVudD1udWxsCmEuYXBwZW5kQ2hpbGQodGhpcy5yNihhLGIsbnVsbCxjKSl9LApZQzpm
+dW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnBrKGEsYixudWxsKX0sCmdWbDpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IFcuQ3EoYSwiY2xpY2siLCExLHUuUSl9LAokaWN2OjEsCmduczpmdW5jdGlvbihhKXtyZXR1
+cm4gYS50YWdOYW1lfX0KVy5Ddi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5oLmMo
+dS5BLmIoYSkpfSwKJFM6MjV9ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsK
+T246ZnVuY3Rpb24oYSxiLGMsZCl7dS5VLmIoYykKaWYoYyE9bnVsbCl0aGlzLnYoYSxiLGMsZCl9LApC
+OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5PbihhLGIsYyxudWxsKX0sCnY6ZnVuY3Rpb24oYSxi
+LGMsZCl7cmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcihiLEgudFIodS5VLmIoYyksMSksZCl9LAokaUQw
+OjF9ClcuVDUucHJvdG90eXBlPXskaVQ1OjF9ClcuaDQucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7
+cmV0dXJuIGEubGVuZ3RofX0KVy5ici5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5s
+ZW5ndGh9fQpXLlZiLnByb3RvdHlwZT17fQpXLk83LnByb3RvdHlwZT17CmVvOmZ1bmN0aW9uKGEsYixj
+LGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRpTzc6MX0KVy5iVS5wcm90b3R5cGU9ewokMjpmdW5j
+dGlvbihhLGIpe3RoaXMuYS5zZXRSZXF1ZXN0SGVhZGVyKEgueShhKSxILnkoYikpfSwKJFM6MTB9Clcu
+aEgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscAp1LnAuYihhKQp0PXRoaXMu
+YQpzPXQuc3RhdHVzCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMudEIoKQpyPXM+PTIwMCYm
+czwzMDAKcT1zPjMwNyYmczw0MDAKcz1yfHxzPT09MHx8cz09PTMwNHx8cQpwPXRoaXMuYgppZihzKXAu
+YU0oMCx0KQplbHNlIHAucG0oYSl9LAokUzoyN30KVy53YS5wcm90b3R5cGU9e30KVy5TZy5wcm90b3R5
+cGU9eyRpU2c6MX0KVy51OC5wcm90b3R5cGU9ewpnRHI6ZnVuY3Rpb24oYSl7aWYoIm9yaWdpbiIgaW4g
+YSlyZXR1cm4gYS5vcmlnaW4KcmV0dXJuIEguZChhLnByb3RvY29sKSsiLy8iK0guZChhLmhvc3QpfSwK
+dzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl1ODoxfQpXLkFqLnByb3RvdHlwZT17JGlB
+ajoxfQpXLmU3LnByb3RvdHlwZT17CmdyODpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEscz10LmNoaWxk
+Tm9kZXMubGVuZ3RoCmlmKHM9PT0wKXRocm93IEguYihQLlBWKCJObyBlbGVtZW50cyIpKQppZihzPjEp
+dGhyb3cgSC5iKFAuUFYoIk1vcmUgdGhhbiBvbmUgZWxlbWVudCIpKQpyZXR1cm4gdC5maXJzdENoaWxk
+fSwKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscQp1LmVoLmIoYikKdD1iLmEKcz10aGlzLmEKaWYo
+dCE9PXMpZm9yKHI9dC5jaGlsZE5vZGVzLmxlbmd0aCxxPTA7cTxyOysrcSlzLmFwcGVuZENoaWxkKHQu
+Zmlyc3RDaGlsZCkKcmV0dXJufSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscwp1LkEuYihjKQp0PXRo
+aXMuYQpzPXQuY2hpbGROb2RlcwppZihiPDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKdC5y
+ZXBsYWNlQ2hpbGQoYyxzW2JdKX0sCmdrejpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEuY2hpbGROb2Rl
+cwpyZXR1cm4gbmV3IFcuVzkodCx0Lmxlbmd0aCxILnpLKHQpLkMoIlc5PEdtLkU+IikpfSwKZ0E6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5jaGlsZE5vZGVzLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXt2
+YXIgdApILlNjKGIpCnQ9dGhpcy5hLmNoaWxkTm9kZXMKaWYoYjwwfHxiPj10Lmxlbmd0aClyZXR1cm4g
+SC5PSCh0LGIpCnJldHVybiB0W2JdfX0KVy51SC5wcm90b3R5cGU9ewp3ZzpmdW5jdGlvbihhKXt2YXIg
+dD1hLnBhcmVudE5vZGUKaWYodCE9bnVsbCl0LnJlbW92ZUNoaWxkKGEpfSwKRDQ6ZnVuY3Rpb24oYSl7
+dmFyIHQKZm9yKDt0PWEuZmlyc3RDaGlsZCx0IT1udWxsOylhLnJlbW92ZUNoaWxkKHQpfSwKdzpmdW5j
+dGlvbihhKXt2YXIgdD1hLm5vZGVWYWx1ZQpyZXR1cm4gdD09bnVsbD90aGlzLlUoYSk6dH0sCiRpdUg6
+MX0KVy5CSC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0
+aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIs
+YSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7dS5BLmIoYykK
+dGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9
+LApFOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVy
+biBhW2JdfSwKJGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5TTi5wcm90b3R5cGU9e30KVy5ldy5wcm90
+b3R5cGU9eyRpZXc6MX0KVy5scC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5n
+dGh9fQpXLlRiLnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMKaWYoImNyZWF0
+ZUNvbnRleHR1YWxGcmFnbWVudCIgaW4gd2luZG93LlJhbmdlLnByb3RvdHlwZSlyZXR1cm4gdGhpcy5E
+VyhhLGIsYyxkKQp0PVcuVTkoIjx0YWJsZT4iK0guZChiKSsiPC90YWJsZT4iLGMsZCkKcz1kb2N1bWVu
+dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKcy50b1N0cmluZwp0LnRvU3RyaW5nCm5ldyBXLmU3KHMp
+LkZWKDAsbmV3IFcuZTcodCkpCnJldHVybiBzfX0KVy5Jdi5wcm90b3R5cGU9ewpyNjpmdW5jdGlvbihh
+LGIsYyxkKXt2YXIgdCxzLHIscQppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cu
+UmFuZ2UucHJvdG90eXBlKXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnQ9ZG9jdW1lbnQKcz10LmNyZWF0
+ZURvY3VtZW50RnJhZ21lbnQoKQp0PUMuSWUucjYodC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIsYyxk
+KQp0LnRvU3RyaW5nCnQ9bmV3IFcuZTcodCkKcj10LmdyOCh0KQpyLnRvU3RyaW5nCnQ9bmV3IFcuZTco
+cikKcT10LmdyOCh0KQpzLnRvU3RyaW5nCnEudG9TdHJpbmcKbmV3IFcuZTcocykuRlYoMCxuZXcgVy5l
+NyhxKSkKcmV0dXJuIHN9fQpXLkJULnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0
+LHMscgppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBl
+KXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnQ9ZG9jdW1lbnQKcz10LmNyZWF0ZURvY3VtZW50RnJhZ21l
+bnQoKQp0PUMuSWUucjYodC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIsYyxkKQp0LnRvU3RyaW5nCnQ9
+bmV3IFcuZTcodCkKcj10LmdyOCh0KQpzLnRvU3RyaW5nCnIudG9TdHJpbmcKbmV3IFcuZTcocykuRlYo
+MCxuZXcgVy5lNyhyKSkKcmV0dXJuIHN9fQpXLnlZLnByb3RvdHlwZT17CnBrOmZ1bmN0aW9uKGEsYixj
+KXt2YXIgdCxzCmEudGV4dENvbnRlbnQ9bnVsbAp0PWEuY29udGVudAp0LnRvU3RyaW5nCkouYlQodCkK
+cz10aGlzLnI2KGEsYixudWxsLGMpCmEuY29udGVudC5hcHBlbmRDaGlsZChzKX0sCllDOmZ1bmN0aW9u
+KGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKJGl5WToxfQpXLnc2LnByb3RvdHlwZT17fQpX
+Lks1LnByb3RvdHlwZT17CmdtVzpmdW5jdGlvbihhKXtyZXR1cm4gYS5sb2NhdGlvbn0sCiRpSzU6MSwK
+JGl2NjoxfQpXLkNtLnByb3RvdHlwZT17JGlDbToxfQpXLkNRLnByb3RvdHlwZT17JGlDUToxfQpXLnc0
+LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlY3RhbmdsZSAoIitILmQoYS5sZWZ0KSsi
+LCAiK0guZChhLnRvcCkrIikgIitILmQoYS53aWR0aCkrIiB4ICIrSC5kKGEuaGVpZ2h0KX0sCkROOmZ1
+bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gdS5xLmMoYikmJmEubGVmdD09PWIu
+bGVmdCYmYS50b3A9PT1iLnRvcCYmYS53aWR0aD09PWIud2lkdGgmJmEuaGVpZ2h0PT09Yi5oZWlnaHR9
+LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIFcuckUoQy5DRC5naU8oYS5sZWZ0KSxDLkNELmdpTyhhLnRv
+cCksQy5DRC5naU8oYS53aWR0aCksQy5DRC5naU8oYS5oZWlnaHQpKX19ClcucmgucHJvdG90eXBlPXsK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKaWYo
+Yj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpy
+ZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe3UuQS5iKGMpCnRocm93IEguYihQLkw0KCJDYW5u
+b3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3QuIikpfSwKRTpmdW5jdGlvbihhLGIpe2lm
+KGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCiRpWGo6MSwKJGlj
+WDoxLAokaXpNOjF9ClcuY2YucHJvdG90eXBlPXsKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAK
+dS5FLmIoYikKZm9yKHQ9dGhpcy5nVigpLHM9dC5sZW5ndGgscj10aGlzLmEscT0wO3E8dC5sZW5ndGg7
+dC5sZW5ndGg9PT1zfHwoMCxILmxrKSh0KSwrK3Epe3A9dFtxXQpiLiQyKHAsci5nZXRBdHRyaWJ1dGUo
+cCkpfX0sCmdWOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzLmEuYXR0cmlidXRlcyxvPUguVk0o
+W10sdS5zKQpmb3IodD1wLmxlbmd0aCxzPXUuaDkscj0wO3I8dDsrK3Ipe2lmKHI+PXAubGVuZ3RoKXJl
+dHVybiBILk9IKHAscikKcT1zLmIocFtyXSkKaWYocS5uYW1lc3BhY2VVUkk9PW51bGwpQy5ObS5pKG8s
+cS5uYW1lKX1yZXR1cm4gb319ClcuaTcucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0
+aGlzLmEuZ2V0QXR0cmlidXRlKEgueShiKSl9LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmEuc2V0QXR0
+cmlidXRlKGIsYyl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH19ClcuU3ku
+cHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEuYS5nZXRBdHRyaWJ1dGUoImRh
+dGEtIit0aGlzLk8oSC55KGIpKSl9LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmEuYS5zZXRBdHRyaWJ1
+dGUoImRhdGEtIit0aGlzLk8oYiksYyl9LApLOmZ1bmN0aW9uKGEsYil7dGhpcy5hLksoMCxuZXcgVy5L
+Uyh0aGlzLHUuRS5iKGIpKSl9LApnVjpmdW5jdGlvbigpe3ZhciB0PUguVk0oW10sdS5zKQp0aGlzLmEu
+SygwLG5ldyBXLkEzKHRoaXMsdCkpCnJldHVybiB0fSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+Z1YoKS5sZW5ndGh9LAprOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj1ILlZNKGEuc3BsaXQoIi0iKSx1LnMp
+CmZvcih0PTE7dDxyLmxlbmd0aDsrK3Qpe3M9clt0XQppZihzLmxlbmd0aD4wKUMuTm0uWShyLHQsc1sw
+XS50b1VwcGVyQ2FzZSgpK0ouS1YocywxKSl9cmV0dXJuIEMuTm0uSChyLCIiKX0sCk86ZnVuY3Rpb24o
+YSl7dmFyIHQscyxyLHEscApmb3IodD1hLmxlbmd0aCxzPTAscj0iIjtzPHQ7KytzKXtxPWFbc10KcD1x
+LnRvTG93ZXJDYXNlKCkKcj0ocSE9PXAmJnM+MD9yKyItIjpyKStwfXJldHVybiByLmNoYXJDb2RlQXQo
+MCk9PTA/cjpyfX0KVy5LUy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihh
+LCJkYXRhLSIpKXRoaXMuYi4kMih0aGlzLmEuayhDLnhCLkcoYSw1KSksYil9LAokUzoxMH0KVy5BMy5w
+cm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKUMuTm0uaSh0
+aGlzLmIsdGhpcy5hLmsoQy54Qi5HKGEsNSkpKX0sCiRTOjEwfQpXLkk0LnByb3RvdHlwZT17ClA6ZnVu
+Y3Rpb24oKXt2YXIgdCxzLHIscSxwPVAuTHModS5OKQpmb3IodD10aGlzLmEuY2xhc3NOYW1lLnNwbGl0
+KCIgIikscz10Lmxlbmd0aCxyPTA7cjxzOysrcil7cT1KLlQwKHRbcl0pCmlmKHEubGVuZ3RoIT09MClw
+LmkoMCxxKX1yZXR1cm4gcH0sClg6ZnVuY3Rpb24oYSl7dGhpcy5hLmNsYXNzTmFtZT11LkMuYihhKS5I
+KDAsIiAiKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aH0sClYx
+OmZ1bmN0aW9uKGEpe3RoaXMuYS5jbGFzc05hbWU9IiJ9LAp0ZzpmdW5jdGlvbihhLGIpe3ZhciB0PXRo
+aXMuYS5jbGFzc0xpc3QuY29udGFpbnMoYikKcmV0dXJuIHR9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHQ9
+dGhpcy5hLmNsYXNzTGlzdCxzPXQuY29udGFpbnMoYikKdC5hZGQoYikKcmV0dXJuIXN9LApSOmZ1bmN0
+aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxzPXQuY29udGFpbnMoYikKdC5yZW1vdmUoYikK
+cmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe1cuVE4odGhpcy5hLHUuWC5iKGIpKX19ClcuRmsucHJv
+dG90eXBlPXt9ClcuUk8ucHJvdG90eXBlPXt9ClcuQ3EucHJvdG90eXBlPXt9ClcueEMucHJvdG90eXBl
+PXt9Clcudk4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS4kMSh1LkIuYihh
+KSl9LAokUzoyOH0KVy5KUS5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihhKXt2YXIgdAppZigkLm9yLmE9
+PT0wKXtmb3IodD0wO3Q8MjYyOysrdCkkLm9yLlkoMCxDLmNtW3RdLFcucFMoKSkKZm9yKHQ9MDt0PDEy
+OysrdCkkLm9yLlkoMCxDLkJJW3RdLFcuVjQoKSl9fSwKaTA6ZnVuY3Rpb24oYSl7cmV0dXJuICQuQU4o
+KS50ZygwLFcuclMoYSkpfSwKRWI6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PSQub3IucSgwLEguZChXLnJT
+KGEpKSsiOjoiK2IpCmlmKHQ9PW51bGwpdD0kLm9yLnEoMCwiKjo6IitiKQppZih0PT1udWxsKXJldHVy
+biExCnJldHVybiBILnhkKHQuJDQoYSxiLGMsdGhpcykpfSwKJGlrRjoxfQpXLkdtLnByb3RvdHlwZT17
+CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuVzkoYSx0aGlzLmdBKGEpLEgueksoYSkuQygiVzk8
+R20uRT4iKSl9fQpXLnZELnByb3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLlZyKHRo
+aXMuYSxuZXcgVy5VdihhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEMuTm0uVnIodGhpcy5h
+LG5ldyBXLkVnKGEsYixjKSl9LAokaWtGOjF9ClcuVXYucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7
+cmV0dXJuIHUuZS5iKGEpLmkwKHRoaXMuYSl9LAokUzoxN30KVy5FZy5wcm90b3R5cGU9ewokMTpmdW5j
+dGlvbihhKXtyZXR1cm4gdS5lLmIoYSkuRWIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MTd9Clcu
+bTYucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyCnRoaXMuYS5GVigwLGMp
+CnQ9Yi5ldigwLG5ldyBXLkVvKCkpCnM9Yi5ldigwLG5ldyBXLldrKCkpCnRoaXMuYi5GVigwLHQpCnI9
+dGhpcy5jCnIuRlYoMCxDLmRuKQpyLkZWKDAscyl9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5h
+LnRnKDAsVy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9dGhpcyxzPVcuclMoYSkscj10
+LmMKaWYoci50ZygwLEguZChzKSsiOjoiK2IpKXJldHVybiB0LmQuRHQoYykKZWxzZSBpZihyLnRnKDAs
+Iio6OiIrYikpcmV0dXJuIHQuZC5EdChjKQplbHNle3I9dC5iCmlmKHIudGcoMCxILmQocykrIjo6Iiti
+KSlyZXR1cm4hMAplbHNlIGlmKHIudGcoMCwiKjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHIudGcoMCxI
+LmQocykrIjo6KiIpKXJldHVybiEwCmVsc2UgaWYoci50ZygwLCIqOjoqIikpcmV0dXJuITB9cmV0dXJu
+ITF9LAokaWtGOjF9ClcuRW8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIUMuTm0udGco
+Qy5CSSxILnkoYSkpfSwKJFM6OH0KVy5Xay5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4g
+Qy5ObS50ZyhDLkJJLEgueShhKSl9LAokUzo4fQpXLmN0LnByb3RvdHlwZT17CkViOmZ1bmN0aW9uKGEs
+YixjKXtpZih0aGlzLmpGKGEsYixjKSlyZXR1cm4hMAppZihiPT09InRlbXBsYXRlIiYmYz09PSIiKXJl
+dHVybiEwCmlmKGEuZ2V0QXR0cmlidXRlKCJ0ZW1wbGF0ZSIpPT09IiIpcmV0dXJuIHRoaXMuZS50Zygw
+LGIpCnJldHVybiExfX0KVy5JQS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4iVEVNUExB
+VEU6OiIrSC5kKEgueShhKSl9LAokUzo1fQpXLk93LnByb3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEpe3Zh
+ciB0CmlmKHUuZXcuYyhhKSlyZXR1cm4hMQp0PXUuZzcuYyhhKQppZih0JiZXLnJTKGEpPT09ImZvcmVp
+Z25PYmplY3QiKXJldHVybiExCmlmKHQpcmV0dXJuITAKcmV0dXJuITF9LApFYjpmdW5jdGlvbihhLGIs
+Yyl7aWYoYj09PSJpcyJ8fEMueEIubihiLCJvbiIpKXJldHVybiExCnJldHVybiB0aGlzLmkwKGEpfSwK
+JGlrRjoxfQpXLlc5LnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5jKzEscj10
+LmIKaWYoczxyKXt0LnNwKEoudzIodC5hLHMpKQp0LmM9cwpyZXR1cm4hMH10LnNwKG51bGwpCnQuYz1y
+CnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKc3A6ZnVuY3Rpb24oYSl7dGhp
+cy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KVy5kVy5wcm90b3R5cGU9ewpnbVc6ZnVuY3Rpb24o
+YSl7cmV0dXJuIFcuelgodGhpcy5hLmxvY2F0aW9uKX0sCiRpRDA6MSwKJGl2NjoxfQpXLkZiLnByb3Rv
+dHlwZT17fQpXLmtGLnByb3RvdHlwZT17fQpXLm1rLnByb3RvdHlwZT17JGl5MDoxfQpXLktvLnByb3Rv
+dHlwZT17ClBuOmZ1bmN0aW9uKGEpe25ldyBXLmZtKHRoaXMpLiQyKGEsbnVsbCl9LApFUDpmdW5jdGlv
+bihhLGIpe2lmKGI9PW51bGwpSi5MdChhKQplbHNlIGIucmVtb3ZlQ2hpbGQoYSl9LApJNDpmdW5jdGlv
+bihhLGIpe3ZhciB0LHMscixxLHAsbz0hMCxuPW51bGwsbT1udWxsCnRyeXtuPUouaWcoYSkKbT1uLmEu
+Z2V0QXR0cmlidXRlKCJpcyIpCnUuaC5iKGEpCnQ9ZnVuY3Rpb24oYyl7aWYoIShjLmF0dHJpYnV0ZXMg
+aW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApKXJldHVybiB0cnVlCnZhciBsPWMuY2hpbGROb2RlcwppZihj
+Lmxhc3RDaGlsZCYmYy5sYXN0Q2hpbGQhPT1sW2wubGVuZ3RoLTFdKXJldHVybiB0cnVlCmlmKGMuY2hp
+bGRyZW4paWYoIShjLmNoaWxkcmVuIGluc3RhbmNlb2YgSFRNTENvbGxlY3Rpb258fGMuY2hpbGRyZW4g
+aW5zdGFuY2VvZiBOb2RlTGlzdCkpcmV0dXJuIHRydWUKdmFyIGs9MAppZihjLmNoaWxkcmVuKWs9Yy5j
+aGlsZHJlbi5sZW5ndGgKZm9yKHZhciBqPTA7ajxrO2orKyl7dmFyIGk9Yy5jaGlsZHJlbltqXQppZihp
+LmlkPT0nYXR0cmlidXRlcyd8fGkubmFtZT09J2F0dHJpYnV0ZXMnfHxpLmlkPT0nbGFzdENoaWxkJ3x8
+aS5uYW1lPT0nbGFzdENoaWxkJ3x8aS5pZD09J2NoaWxkcmVuJ3x8aS5uYW1lPT0nY2hpbGRyZW4nKXJl
+dHVybiB0cnVlfXJldHVybiBmYWxzZX0oYSkKbz1ILm9UKHQpPyEwOiEoYS5hdHRyaWJ1dGVzIGluc3Rh
+bmNlb2YgTmFtZWROb2RlTWFwKX1jYXRjaChxKXtILlJ1KHEpfXM9ImVsZW1lbnQgdW5wcmludGFibGUi
+CnRyeXtzPUouaihhKX1jYXRjaChxKXtILlJ1KHEpfXRyeXtyPVcuclMoYSkKdGhpcy5rUih1LmguYihh
+KSxiLG8scyxyLHUuRy5iKG4pLEgueShtKSl9Y2F0Y2gocSl7aWYoSC5SdShxKSBpbnN0YW5jZW9mIFAu
+dSl0aHJvdyBxCmVsc2V7dGhpcy5FUChhLGIpCndpbmRvdwpwPSJSZW1vdmluZyBjb3JydXB0ZWQgZWxl
+bWVudCAiK0guZChzKQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
+d2FybihwKX19fSwKa1I6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHQscyxyLHEscCxvLG49dGhp
+cwppZihjKXtuLkVQKGEsYikKd2luZG93CnQ9IlJlbW92aW5nIGVsZW1lbnQgZHVlIHRvIGNvcnJ1cHRl
+ZCBhdHRyaWJ1dGVzIG9uIDwiK2QrIj4iCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5k
+b3cuY29uc29sZS53YXJuKHQpCnJldHVybn1pZighbi5hLmkwKGEpKXtuLkVQKGEsYikKd2luZG93CnQ9
+IlJlbW92aW5nIGRpc2FsbG93ZWQgZWxlbWVudCA8IitILmQoZSkrIj4gZnJvbSAiK0guZChiKQppZih0
+eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2Fybih0KQpyZXR1cm59aWYo
+ZyE9bnVsbClpZighbi5hLkViKGEsImlzIixnKSl7bi5FUChhLGIpCndpbmRvdwp0PSJSZW1vdmluZyBk
+aXNhbGxvd2VkIHR5cGUgZXh0ZW5zaW9uIDwiK0guZChlKSsnIGlzPSInK2crJyI+JwppZih0eXBlb2Yg
+Y29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2Fybih0KQpyZXR1cm59dD1mLmdWKCkK
+cz1ILlZNKHQuc2xpY2UoMCksSC50Nih0KS5DKCJqZDwxPiIpKQpmb3Iocj1mLmdWKCkubGVuZ3RoLTEs
+dD1mLmE7cj49MDstLXIpe2lmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1zW3JdCnA9bi5h
+Cm89Si5jSChxKQpILnkocSkKaWYoIXAuRWIoYSxvLHQuZ2V0QXR0cmlidXRlKHEpKSl7d2luZG93CnA9
+IlJlbW92aW5nIGRpc2FsbG93ZWQgYXR0cmlidXRlIDwiK0guZChlKSsiICIrcSsnPSInK0guZCh0Lmdl
+dEF0dHJpYnV0ZShxKSkrJyI+JwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNv
+bnNvbGUud2FybihwKQp0LnJlbW92ZUF0dHJpYnV0ZShxKX19aWYodS5hVy5jKGEpKW4uUG4oYS5jb250
+ZW50KX0sCiRpb246MX0KVy5mbS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixx
+LHA9dGhpcy5hCnN3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6cC5JNChhLGIpCmJyZWFrCmNhc2UgODpj
+YXNlIDExOmNhc2UgMzpjYXNlIDQ6YnJlYWsKZGVmYXVsdDpwLkVQKGEsYil9dD1hLmxhc3RDaGlsZApm
+b3IocD11LkE7bnVsbCE9dDspe3M9bnVsbAp0cnl7cz10LnByZXZpb3VzU2libGluZ31jYXRjaChyKXtI
+LlJ1KHIpCnE9cC5iKHQpCmEucmVtb3ZlQ2hpbGQocSkKdD1udWxsCnM9YS5sYXN0Q2hpbGR9aWYodCE9
+bnVsbCl0aGlzLiQyKHQsYSkKdD1wLmIocyl9fSwKJFM6MzF9ClcuTGUucHJvdG90eXBlPXt9ClcuSzcu
+cHJvdG90eXBlPXt9ClcuckIucHJvdG90eXBlPXt9ClcuWFcucHJvdG90eXBlPXt9Clcub2EucHJvdG90
+eXBlPXt9ClAuaUoucHJvdG90eXBlPXsKVkg6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLmEscj1zLmxl
+bmd0aApmb3IodD0wO3Q8cjsrK3QpaWYoc1t0XT09PWEpcmV0dXJuIHQKQy5ObS5pKHMsYSkKQy5ObS5p
+KHRoaXMuYixudWxsKQpyZXR1cm4gcn0sClB2OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPXRoaXMscD17
+fQppZihhPT1udWxsKXJldHVybiBhCmlmKEgubChhKSlyZXR1cm4gYQppZih0eXBlb2YgYT09Im51bWJl
+ciIpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQ
+LmlQKXJldHVybiBuZXcgRGF0ZShhLmEpCmlmKHUuZnYuYyhhKSl0aHJvdyBILmIoUC5TWSgic3RydWN0
+dXJlZCBjbG9uZSBvZiBSZWdFeHAiKSkKaWYodS5jOC5jKGEpKXJldHVybiBhCmlmKHUuZC5jKGEpKXJl
+dHVybiBhCmlmKHUuSS5jKGEpKXJldHVybiBhCnQ9dS5kRC5jKGEpfHwhMQppZih0KXJldHVybiBhCmlm
+KHUuRy5jKGEpKXtzPXEuVkgoYSkKdD1xLmIKaWYocz49dC5sZW5ndGgpcmV0dXJuIEguT0godCxzKQpy
+PXAuYT10W3NdCmlmKHIhPW51bGwpcmV0dXJuIHIKcj17fQpwLmE9cgpDLk5tLlkodCxzLHIpCmEuSygw
+LG5ldyBQLmxSKHAscSkpCnJldHVybiBwLmF9aWYodS5qLmMoYSkpe3M9cS5WSChhKQpwPXEuYgppZihz
+Pj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHMpCnI9cFtzXQppZihyIT1udWxsKXJldHVybiByCnJldHVy
+biBxLmVrKGEscyl9aWYodS5lSC5jKGEpKXtzPXEuVkgoYSkKdD1xLmIKaWYocz49dC5sZW5ndGgpcmV0
+dXJuIEguT0godCxzKQpyPXAuYj10W3NdCmlmKHIhPW51bGwpcmV0dXJuIHIKcj17fQpwLmI9cgpDLk5t
+LlkodCxzLHIpCnEuaW0oYSxuZXcgUC5qZyhwLHEpKQpyZXR1cm4gcC5ifXRocm93IEguYihQLlNZKCJz
+dHJ1Y3R1cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LAplazpmdW5jdGlvbihhLGIpe3ZhciB0LHM9
+Si5VNihhKSxyPXMuZ0EoYSkscT1uZXcgQXJyYXkocikKQy5ObS5ZKHRoaXMuYixiLHEpCmZvcih0PTA7
+dDxyOysrdClDLk5tLlkocSx0LHRoaXMuUHYocy5xKGEsdCkpKQpyZXR1cm4gcX19ClAubFIucHJvdG90
+eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYVthXT10aGlzLmIuUHYoYil9LAokUzoxfQpQLmpn
+LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLmJbYV09dGhpcy5iLlB2KGIpfSwKJFM6
+MX0KUC5CZi5wcm90b3R5cGU9ewppbTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxCnUuYjguYihiKQpm
+b3IodD1PYmplY3Qua2V5cyhhKSxzPXQubGVuZ3RoLHI9MDtyPHM7KytyKXtxPXRbcl0KYi4kMihxLGFb
+cV0pfX19ClAuQXMucHJvdG90eXBlPXsKVDpmdW5jdGlvbihhKXt2YXIgdApILnkoYSkKdD0kLmhHKCku
+YgppZih0eXBlb2YgYSE9InN0cmluZyIpSC52aChILnRMKGEpKQppZih0LnRlc3QoYSkpcmV0dXJuIGEK
+dGhyb3cgSC5iKFAuTDMoYSwidmFsdWUiLCJOb3QgYSB2YWxpZCBjbGFzcyB0b2tlbiIpKX0sCnc6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHRoaXMuUCgpLkgoMCwiICIpfSwKZ2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRo
+aXMuUCgpCnJldHVybiBQLnJqKHQsdC5yLEguTGgodCkuZCl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5QKCkuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dGhpcy5UKGIpCnJldHVybiB0aGlzLlAoKS50Zygw
+LGIpfSwKaTpmdW5jdGlvbihhLGIpe3RoaXMuVChiKQpyZXR1cm4gSC54ZCh0aGlzLk9TKG5ldyBQLkdF
+KGIpKSl9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQscwp0aGlzLlQoYikKdD10aGlzLlAoKQpzPXQuUigw
+LGIpCnRoaXMuWCh0KQpyZXR1cm4gc30sCkZWOmZ1bmN0aW9uKGEsYil7dGhpcy5PUyhuZXcgUC5ONyh0
+aGlzLHUuWC5iKGIpKSl9LApWMTpmdW5jdGlvbihhKXt0aGlzLk9TKG5ldyBQLnVRKCkpfSwKT1M6ZnVu
+Y3Rpb24oYSl7dmFyIHQscwp1LmNoLmIoYSkKdD10aGlzLlAoKQpzPWEuJDEodCkKdGhpcy5YKHQpCnJl
+dHVybiBzfX0KUC5HRS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5DLmIoYSkuaSgw
+LHRoaXMuYSl9LAokUzo0NX0KUC5ONy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD10aGlz
+LmIscz1ILnQ2KHQpCnJldHVybiB1LkMuYihhKS5GVigwLG5ldyBILkE4KHQscy5DKCJxVSgxKSIpLmIo
+dGhpcy5hLmd1TSgpKSxzLkMoIkE4PDEscVU+IikpKX0sCiRTOjE0fQpQLnVRLnByb3RvdHlwZT17CiQx
+OmZ1bmN0aW9uKGEpe3UuQy5iKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5h
+PTAKYS5TKCl9cmV0dXJuIG51bGx9LAokUzoxNH0KUC5oRi5wcm90b3R5cGU9eyRpaEY6MX0KUC5QQy5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlouYihhKQp0PWZ1bmN0aW9uKGIsYyxkKXty
+ZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBw
+bHkoYXJndW1lbnRzKSl9fShQLlI0LGEsITEpClAuRG0odCwkLncoKSxhKQpyZXR1cm4gdH0sCiRTOjR9
+ClAuWW0ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLmEoYSl9LAokUzo0
+fQpQLk56LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5yNyhhKX0sCiRTOjM0
+fQpQLm5wLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5UeihhLHUuYW0pfSwK
+JFM6MzV9ClAuVXQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkU0KGEpfSwK
+JFM6MzZ9ClAuRTQucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5n
+IiYmdHlwZW9mIGIhPSJudW1iZXIiKXRocm93IEguYihQLnhZKCJwcm9wZXJ0eSBpcyBub3QgYSBTdHJp
+bmcgb3IgbnVtIikpCnJldHVybiBQLkw3KHRoaXMuYVtiXSl9LApZOmZ1bmN0aW9uKGEsYixjKXtpZih0
+eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVy
+dHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIpKQp0aGlzLmFbYl09UC53WShjKX0sCkROOmZ1bmN0aW9u
+KGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuRTQmJnRoaXMuYT09
+PWIuYX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQscwp0cnl7dD1TdHJpbmcodGhpcy5hKQpyZXR1cm4gdH1j
+YXRjaChzKXtILlJ1KHMpCnQ9dGhpcy54YigwKQpyZXR1cm4gdH19LApWNzpmdW5jdGlvbihhLGIpe3Zh
+ciB0LHM9dGhpcy5hCmlmKGI9PW51bGwpdD1udWxsCmVsc2V7dD1ILnQ2KGIpCnQ9UC5DSChuZXcgSC5B
+OChiLHQuQygiQCgxKSIpLmIoUC5pRygpKSx0LkMoIkE4PDEsQD4iKSksITAsdS56KX1yZXR1cm4gUC5M
+NyhzW2FdLmFwcGx5KHMsdCkpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfX0KUC5yNy5wcm90b3R5
+cGU9e30KUC5Uei5wcm90b3R5cGU9ewpjUDpmdW5jdGlvbihhKXt2YXIgdD10aGlzLHM9YTwwfHxhPj10
+LmdBKHQpCmlmKHMpdGhyb3cgSC5iKFAuVEUoYSwwLHQuZ0EodCksbnVsbCxudWxsKSl9LApxOmZ1bmN0
+aW9uKGEsYil7aWYodHlwZW9mIGI9PSJudW1iZXIiJiZiPT09Qy5qbi55dShiKSl0aGlzLmNQKEguU2Mo
+YikpCnJldHVybiB0aGlzLiR0aS5kLmIodGhpcy5VcigwLGIpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciB0CnRoaXMuJHRpLmQuYihjKQp0PUMuam4ueXUoYikKaWYoYj09PXQpdGhpcy5jUChiKQp0aGlzLmU0
+KDAsYixjKX0sCmdBOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYS5sZW5ndGgKaWYodHlwZW9mIHQ9PT0i
+bnVtYmVyIiYmdD4+PjA9PT10KXJldHVybiB0CnRocm93IEguYihQLlBWKCJCYWQgSnNBcnJheSBsZW5n
+dGgiKSl9LAokaWNYOjEsCiRpek06MX0KUC5jby5wcm90b3R5cGU9e30KUC5uZC5wcm90b3R5cGU9eyRp
+bmQ6MX0KUC5LZS5wcm90b3R5cGU9ewpQOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzLmEuZ2V0
+QXR0cmlidXRlKCJjbGFzcyIpLG89UC5Mcyh1Lk4pCmlmKHA9PW51bGwpcmV0dXJuIG8KZm9yKHQ9cC5z
+cGxpdCgiICIpLHM9dC5sZW5ndGgscj0wO3I8czsrK3Ipe3E9Si5UMCh0W3JdKQppZihxLmxlbmd0aCE9
+PTApby5pKDAscSl9cmV0dXJuIG99LApYOmZ1bmN0aW9uKGEpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoImNs
+YXNzIixhLkgoMCwiICIpKX19ClAuZDUucHJvdG90eXBlPXsKZ0Q6ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
+dyBQLktlKGEpfSwKc2hmOmZ1bmN0aW9uKGEsYil7dGhpcy5ZQyhhLGIpfSwKcjY6ZnVuY3Rpb24oYSxi
+LGMsZCl7dmFyIHQscyxyLHEscCxvCmlmKGQ9PW51bGwpe3Q9SC5WTShbXSx1LmspCmQ9bmV3IFcudkQo
+dCkKQy5ObS5pKHQsVy5UdyhudWxsKSkKQy5ObS5pKHQsVy5CbCgpKQpDLk5tLmkodCxuZXcgVy5Pdygp
+KX1jPW5ldyBXLktvKGQpCnM9JzxzdmcgdmVyc2lvbj0iMS4xIj4nK0guZChiKSsiPC9zdmc+Igp0PWRv
+Y3VtZW50CnI9dC5ib2R5CnE9KHImJkMuUlkpLkFIKHIscyxjKQpwPXQuY3JlYXRlRG9jdW1lbnRGcmFn
+bWVudCgpCnEudG9TdHJpbmcKdD1uZXcgVy5lNyhxKQpvPXQuZ3I4KHQpCmZvcig7dD1vLmZpcnN0Q2hp
+bGQsdCE9bnVsbDspcC5hcHBlbmRDaGlsZCh0KQpyZXR1cm4gcH0sCmdWbDpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IFcuQ3EoYSwiY2xpY2siLCExLHUuUSl9LAokaWQ1OjF9ClAubjYucHJvdG90eXBlPXskaWNY
+OjEsJGl6TToxLCRpQVM6MX0KVS5kMi5wcm90b3R5cGU9e30KVS5TZS5wcm90b3R5cGU9e30KVS51Ri5w
+cm90b3R5cGU9e30KVS5NbC5wcm90b3R5cGU9e30KVS55RC5wcm90b3R5cGU9e30KVS53Yi5wcm90b3R5
+cGU9e30KQi5qOC5wcm90b3R5cGU9e30KQi5xcC5wcm90b3R5cGU9e30KVC5HVi5wcm90b3R5cGU9e30K
+TC5lLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbwp1LkIuYihhKQp0PXdp
+bmRvdy5sb2NhdGlvbi5wYXRobmFtZQpzPUwuRzYod2luZG93LmxvY2F0aW9uLmhyZWYpCnI9TC5hSyh3
+aW5kb3cubG9jYXRpb24uaHJlZikKTC5HZSgpCmlmKHQhPT0iLyImJnQhPT1KLlQwKGRvY3VtZW50LnF1
+ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQpKUwuRzcodCxzLHIsITAsbmV3IEwuVlcodCxz
+LHIpKQpxPUoucUYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmFwcGx5LW1pZ3JhdGlvbiIpKQpwPXEu
+JHRpCm89cC5DKCJ+KDEpIikuYihuZXcgTC5vWigpKQp1Lk0uYihudWxsKQpXLkpFKHEuYSxxLmIsbywh
+MSxwLmQpfSwKJFM6MTN9CkwuVlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYSx0
+aGlzLmIsdGhpcy5jKX0sCiRTOjB9Ckwub1oucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dS5WLmIo
+YSkKTC50eSgiL2FwcGx5LW1pZ3JhdGlvbiIpLlc3KG5ldyBMLmpyKCksdS5QKS5PQShuZXcgTC5xbCgp
+KX0sCiRTOjZ9CkwuanIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQKdS5yLmIoYSkKdD1k
+b2N1bWVudC5ib2R5CnQuY2xhc3NMaXN0LnJlbW92ZSgicHJvcG9zZWQiKQp0LmNsYXNzTGlzdC5hZGQo
+ImFwcGxpZWQiKX0sCiRTOjd9CkwucWwucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLnFKKCJh
+cHBseSBtaWdyYXRpb24gZXJyb3I6ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQgbm90IGFw
+cGx5IG1pZ3JhdGlvbiAoIitILmQoYSkrIikuIil9LAokQzoiJDIiLAokUjoyLAokUzoxfQpMLkwucHJv
+dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyCnUuQi5iKGEpCnQ9d2luZG93LmxvY2F0aW9u
+LnBhdGhuYW1lCnM9TC5HNih3aW5kb3cubG9jYXRpb24uaHJlZikKcj1MLmFLKHdpbmRvdy5sb2NhdGlv
+bi5ocmVmKQppZih0Lmxlbmd0aD4xKUwuRzcodCxzLHIsITEsbnVsbCkKZWxzZXtMLkJFKHQsbmV3IEIu
+cXAoIiIsIiIsIiIsQy54RCksITApCkwuQlgoIiZuYnNwOyIsbnVsbCl9fSwKJFM6MTN9CkwuV3gucHJv
+dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9ImNvbGxhcHNlZCIKdS5WLmIoYSkKdD10
+aGlzLmEKcz1KLlJFKHQpCnI9dGhpcy5iCmlmKCFzLmdEKHQpLnRnKDAscSkpe3MuZ0QodCkuaSgwLHEp
+CkouZFIocikuaSgwLHEpfWVsc2V7cy5nRCh0KS5SKDAscSkKSi5kUihyKS5SKDAscSl9fSwKJFM6Nn0K
+TC5BTy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD1KLnFGKHUuaC5iKGEpKSxzPXQuJHRp
+LHI9cy5DKCJ+KDEpIikuYihuZXcgTC5kTih0aGlzLmEpKQp1Lk0uYihudWxsKQpXLkpFKHQuYSx0LmIs
+ciwhMSxzLmQpfSwKJFM6M30KTC5kTi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlYu
+YihhKQp0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0iKQp0LnRvU3RyaW5n
+CkwudDIoYSx0aGlzLmEsdC5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyh0KSku
+TygicGF0aCIpKSl9LAokUzo2fQpMLkhvLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cgp1LmguYihhKQp0PUoucUYoYSkKcz10LiR0aQpyPXMuQygifigxKSIpLmIobmV3IEwueHooYSx0aGlz
+LmEpKQp1Lk0uYihudWxsKQpXLkpFKHQuYSx0LmIsciwhMSxzLmQpfSwKJFM6M30KTC54ei5wcm90b3R5
+cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlYuYihhKQp0PXRoaXMuYQpMLmhYKHRoaXMuYixQLlFB
+KHQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcodCkpLk8oIm9mZnNldCIpKSxu
+dWxsLG51bGwpKX0sCiRTOjZ9CkwuSUMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9Si5x
+Rih1LmguYihhKSkscz10LiR0aQpzLkMoIn4oMSkiKS5iKEwuSDAoKSkKdS5NLmIobnVsbCkKVy5KRSh0
+LmEsdC5iLEwuSDAoKSwhMSxzLmQpfSwKJFM6M30KTC5MMS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
+KXt2YXIgdAp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDApcmV0dXJuIGEKZWxzZSB0aHJvdyBI
+LmIoIlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2YgIitILmQodCkpfSwKJFM6NDF9CkwublQucHJvdG90
+eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYS5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5C
+Wi5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIodGhpcy5hLmEsbnVsbCxudWxsKX0sCiRTOjB9
+CkwuR0gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dS5oLmIoYSkKJC56QigpLnRvU3RyaW5nCnUu
+di5iKCQub3coKS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixbYV0pfSwKJFM6M30KTC5E
+VC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9
+PT0yMDApe0wuVDEoVS55dShDLkN0LnBXKDAsYS5yZXNwb25zZVRleHQsbnVsbCkpKQpMLnlYKCIuZWRp
+dC1wYW5lbCAucGFuZWwtY29udGVudCIsITEpfWVsc2Ugd2luZG93LmFsZXJ0KCJSZXF1ZXN0IGZhaWxl
+ZDsgc3RhdHVzIG9mICIrSC5kKHQpKX0sCiRTOjd9CkwuZUgucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24o
+YSxiKXtMLnFKKCJsb2FkUmVnaW9uRXhwbGFuYXRpb246ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgi
+Q291bGQgbm90IGxvYWQgIitILmQodGhpcy5hKSsiICgiK0guZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRS
+OjIsCiRTOjF9CkwuekQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRoaXMKdS5y
+LmIoYSkKdD1hLnN0YXR1cwppZih0PT09MjAwKXtzPXIuYQpMLkJFKHMsQi5ZZih1LmIuYihDLkN0LnBX
+KDAsYS5yZXNwb25zZVRleHQsbnVsbCkpKSxyLmIpCnQ9ci5jCkwuZkcodCxyLmQpCkwuQlgoQy54Qi50
+ZyhzLCI/Iik/Qy54Qi5OaihzLDAsQy54Qi5PWShzLCI/IikpOnMsdCkKdD1yLmUKaWYodCE9bnVsbCl0
+LiQwKCl9ZWxzZSB3aW5kb3cuYWxlcnQoIlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2YgIitILmQodCkp
+fSwKJFM6N30KTC5PRS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe0wucUooImxvYWRGaWxlOiAi
+K0guZChhKSxiKQp3aW5kb3cuYWxlcnQoIkNvdWxkIG5vdCBsb2FkICIrdGhpcy5hKyIgKCIrSC5kKGEp
+KyIpLiIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MX0KTC5UVy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
+KXt2YXIgdCxzLHIKdS5yLmIoYSkKdD1hLnN0YXR1cwppZih0PT09MjAwKXtzPUMuQ3QucFcoMCxhLnJl
+c3BvbnNlVGV4dCxudWxsKQpyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uYXYtdHJlZSIpCkoubDUo
+ciwiIikKTC50WChyLEwubUsocykpfWVsc2Ugd2luZG93LmFsZXJ0KCJSZXF1ZXN0IGZhaWxlZDsgc3Rh
+dHVzIG9mICIrSC5kKHQpKX0sCiRTOjd9CkwueHIucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtM
+LnFKKCJsb2FkTmF2aWdhdGlvblRyZWU6ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQgbm90
+IGxvYWQgIit0aGlzLmErIiAoIitILmQoYSkrIikuIil9LAokQzoiJDIiLAokUjoyLAokUzoxfQpMLkVF
+LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMKdS5WLmIoYSkKdD10aGlzLmEKcz10aGlz
+LmIKTC5hZih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsdCxzLCEwLG5ldyBMLlFMKHQscykpCkwuaFgo
+dGhpcy5jLHQpfSwKJFM6Nn0KTC5RTC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIod2luZG93
+LmxvY2F0aW9uLnBhdGhuYW1lLHRoaXMuYSx0aGlzLmIpfSwKJFM6MH0KTC5WUy5wcm90b3R5cGU9ewok
+MTpmdW5jdGlvbihhKXt2YXIgdCxzPSJzZWxlY3RlZC1maWxlIgp1LmguYihhKQphLnRvU3RyaW5nCnQ9
+Si5SRShhKQppZihhLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGEpKS5PKCJu
+YW1lIikpPT09dGhpcy5hLmEpdC5nRChhKS5pKDAscykKZWxzZSB0LmdEKGEpLlIoMCxzKX0sCiRTOjN9
+CkwuVEQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEwudDIodS5WLmIoYSksITAsbnVs
+bCl9LAokUzoxNn0KTC5YQS5wcm90b3R5cGU9ewpFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuITB9LApp
+MDpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCiRpa0Y6MX0KTC5aWi5wcm90b3R5cGU9e30KTC55OC5wcm90
+b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJ9fQpNLmxJLnByb3RvdHlwZT17CldPOmZ1
+bmN0aW9uKGEsYil7dmFyIHQscz1udWxsCk0uWUYoImFic29sdXRlIixILlZNKFtiLG51bGwsbnVsbCxu
+dWxsLG51bGwsbnVsbCxudWxsXSx1LnMpKQp0PXRoaXMuYQp0PXQuWXIoYik+MCYmIXQuaEsoYikKaWYo
+dClyZXR1cm4gYgp0PUQuUlgoKQpyZXR1cm4gdGhpcy5xNygwLHQsYixzLHMscyxzLHMscyl9LAp0TTpm
+dW5jdGlvbihhKXt2YXIgdCxzLHI9WC5DTChhLHRoaXMuYSkKci5JVigpCnQ9ci5kCnM9dC5sZW5ndGgK
+aWYocz09PTApe3Q9ci5iCnJldHVybiB0PT1udWxsPyIuIjp0fWlmKHM9PT0xKXt0PXIuYgpyZXR1cm4g
+dD09bnVsbD8iLiI6dH1pZigwPj1zKXJldHVybiBILk9IKHQsLTEpCnQucG9wKCkKQy5ObS5tdihyLmUp
+CnIuSVYoKQpyZXR1cm4gci53KDApfSwKcTc6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciB0
+PUguVk0oW2IsYyxkLGUsZixnLGgsaV0sdS5zKQpNLllGKCJqb2luIix0KQpyZXR1cm4gdGhpcy5JUChu
+ZXcgSC5VNSh0LHUuYkIuYihuZXcgTS5NaSgpKSx1LmNjKSl9LApJUDpmdW5jdGlvbihhKXt2YXIgdCxz
+LHIscSxwLG8sbixtLGwKdS5YLmIoYSkKZm9yKHQ9YS4kdGkscz10LkMoImEyKGNYLkUpIikuYihuZXcg
+TS5xNygpKSxyPWEuZ2t6KGEpLHQ9bmV3IEguU08ocixzLHQuQygiU088Y1guRT4iKSkscz10aGlzLmEs
+cT0hMSxwPSExLG89IiI7dC5GKCk7KXtuPXIuZ2woKQppZihzLmhLKG4pJiZwKXttPVguQ0wobixzKQps
+PW8uY2hhckNvZGVBdCgwKT09MD9vOm8Kbz1DLnhCLk5qKGwsMCxzLlNwKGwsITApKQptLmI9bwppZihz
+LmRzKG8pKUMuTm0uWShtLmUsMCxzLmdtSSgpKQpvPW0udygwKX1lbHNlIGlmKHMuWXIobik+MCl7cD0h
+cy5oSyhuKQpvPUguZChuKX1lbHNle2lmKCEobi5sZW5ndGg+MCYmcy5VZChuWzBdKSkpaWYocSlvKz1z
+LmdtSSgpCm8rPUguZChuKX1xPXMuZHMobil9cmV0dXJuIG8uY2hhckNvZGVBdCgwKT09MD9vOm99LApv
+NTpmdW5jdGlvbihhKXt2YXIgdAppZighdGhpcy55MyhhKSlyZXR1cm4gYQp0PVguQ0woYSx0aGlzLmEp
+CnQuclIoKQpyZXR1cm4gdC53KDApfSwKeTM6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxs
+LGsKYS50b1N0cmluZwp0PXRoaXMuYQpzPXQuWXIoYSkKaWYocyE9PTApe2lmKHQ9PT0kLktrKCkpZm9y
+KHI9MDtyPHM7KytyKWlmKEMueEIuVyhhLHIpPT09NDcpcmV0dXJuITAKcT1zCnA9NDd9ZWxzZXtxPTAK
+cD1udWxsfWZvcihvPW5ldyBILnFqKGEpLmEsbj1vLmxlbmd0aCxyPXEsbT1udWxsO3I8bjsrK3IsbT1w
+LHA9bCl7bD1DLnhCLm0obyxyKQppZih0LnI0KGwpKXtpZih0PT09JC5LaygpJiZsPT09NDcpcmV0dXJu
+ITAKaWYocCE9bnVsbCYmdC5yNChwKSlyZXR1cm4hMAppZihwPT09NDYpaz1tPT1udWxsfHxtPT09NDZ8
+fHQucjQobSkKZWxzZSBrPSExCmlmKGspcmV0dXJuITB9fWlmKHA9PW51bGwpcmV0dXJuITAKaWYodC5y
+NChwKSlyZXR1cm4hMAppZihwPT09NDYpdD1tPT1udWxsfHx0LnI0KG0pfHxtPT09NDYKZWxzZSB0PSEx
+CmlmKHQpcmV0dXJuITAKcmV0dXJuITF9LApIUDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbz10
+aGlzLG49J1VuYWJsZSB0byBmaW5kIGEgcGF0aCB0byAiJwpiPW8uV08oMCxiKQp0PW8uYQppZih0Llly
+KGIpPD0wJiZ0LllyKGEpPjApcmV0dXJuIG8ubzUoYSkKaWYodC5ZcihhKTw9MHx8dC5oSyhhKSlhPW8u
+V08oMCxhKQppZih0LllyKGEpPD0wJiZ0LllyKGIpPjApdGhyb3cgSC5iKFguSlQobitILmQoYSkrJyIg
+ZnJvbSAiJytILmQoYikrJyIuJykpCnM9WC5DTChiLHQpCnMuclIoKQpyPVguQ0woYSx0KQpyLnJSKCkK
+cT1zLmQKaWYocS5sZW5ndGg+MCYmSi5STShxWzBdLCIuIikpcmV0dXJuIHIudygwKQpxPXMuYgpwPXIu
+YgppZihxIT1wKXE9cT09bnVsbHx8cD09bnVsbHx8IXQuTmMocSxwKQplbHNlIHE9ITEKaWYocSlyZXR1
+cm4gci53KDApCndoaWxlKCEwKXtxPXMuZAppZihxLmxlbmd0aD4wKXtwPXIuZApxPXAubGVuZ3RoPjAm
+JnQuTmMocVswXSxwWzBdKX1lbHNlIHE9ITEKaWYoIXEpYnJlYWsKQy5ObS5XNChzLmQsMCkKQy5ObS5X
+NChzLmUsMSkKQy5ObS5XNChyLmQsMCkKQy5ObS5XNChyLmUsMSl9cT1zLmQKaWYocS5sZW5ndGg+MCYm
+Si5STShxWzBdLCIuLiIpKXRocm93IEguYihYLkpUKG4rSC5kKGEpKyciIGZyb20gIicrSC5kKGIpKyci
+LicpKQpxPXUuTgpDLk5tLlVHKHIuZCwwLFAuTzgocy5kLmxlbmd0aCwiLi4iLHEpKQpDLk5tLlkoci5l
+LDAsIiIpCkMuTm0uVUcoci5lLDEsUC5POChzLmQubGVuZ3RoLHQuZ21JKCkscSkpCnQ9ci5kCnE9dC5s
+ZW5ndGgKaWYocT09PTApcmV0dXJuIi4iCmlmKHE+MSYmSi5STShDLk5tLmdyWih0KSwiLiIpKXt0PXIu
+ZAppZigwPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LC0xKQp0LnBvcCgpCnQ9ci5lCkMuTm0ubXYodCkK
+Qy5ObS5tdih0KQpDLk5tLmkodCwiIil9ci5iPSIiCnIuSVYoKQpyZXR1cm4gci53KDApfX0KTS5NaS5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gSC55KGEpIT1udWxsfSwKJFM6OH0KTS5xNy5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gSC55KGEpIT09IiJ9LAokUzo4fQpNLk5vLnBy
+b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0gueShhKQpyZXR1cm4gYT09bnVsbD8ibnVsbCI6JyInK2Er
+JyInfSwKJFM6NX0KQi5MdS5wcm90b3R5cGU9ewp4WjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuWXIo
+YSkKaWYocz4wKXJldHVybiBKLmxkKGEsMCxzKQppZih0aGlzLmhLKGEpKXtpZigwPj1hLmxlbmd0aCly
+ZXR1cm4gSC5PSChhLDApCnQ9YVswXX1lbHNlIHQ9bnVsbApyZXR1cm4gdH0sCk5jOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIGE9PWJ9fQpYLldELnByb3RvdHlwZT17CklWOmZ1bmN0aW9uKCl7dmFyIHQscyxyPXRo
+aXMKd2hpbGUoITApe3Q9ci5kCmlmKCEodC5sZW5ndGghPT0wJiZKLlJNKEMuTm0uZ3JaKHQpLCIiKSkp
+YnJlYWsKdD1yLmQKaWYoMD49dC5sZW5ndGgpcmV0dXJuIEguT0godCwtMSkKdC5wb3AoKQpDLk5tLm12
+KHIuZSl9dD1yLmUKcz10Lmxlbmd0aAppZihzPjApQy5ObS5ZKHQscy0xLCIiKX0sCnJSOmZ1bmN0aW9u
+KCl7dmFyIHQscyxyLHEscCxvLG4sbT10aGlzLGw9SC5WTShbXSx1LnMpCmZvcih0PW0uZCxzPXQubGVu
+Z3RoLHI9MCxxPTA7cTx0Lmxlbmd0aDt0Lmxlbmd0aD09PXN8fCgwLEgubGspKHQpLCsrcSl7cD10W3Fd
+Cm89Si5pYShwKQppZighKG8uRE4ocCwiLiIpfHxvLkROKHAsIiIpKSlpZihvLkROKHAsIi4uIikpaWYo
+bC5sZW5ndGg+MClsLnBvcCgpCmVsc2UgKytyCmVsc2UgQy5ObS5pKGwscCl9aWYobS5iPT1udWxsKUMu
+Tm0uVUcobCwwLFAuTzgociwiLi4iLHUuTikpCmlmKGwubGVuZ3RoPT09MCYmbS5iPT1udWxsKUMuTm0u
+aShsLCIuIikKbj1QLmRIKGwubGVuZ3RoLG5ldyBYLnFSKG0pLCEwLHUuTikKdD1tLmIKdD10IT1udWxs
+JiZsLmxlbmd0aD4wJiZtLmEuZHModCk/bS5hLmdtSSgpOiIiCkgudDYobikuZC5iKHQpCmlmKCEhbi5m
+aXhlZCRsZW5ndGgpSC52aChQLkw0KCJpbnNlcnQiKSkKbi5zcGxpY2UoMCwwLHQpCm0uc25KKGwpCm0u
+c1BoKG4pCnQ9bS5iCmlmKHQhPW51bGwmJm0uYT09PSQuS2soKSl7dC50b1N0cmluZwptLmI9SC55cyh0
+LCIvIiwiXFwiKX1tLklWKCl9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLHE9ci5iCnE9cSE9
+bnVsbD9xOiIiCmZvcih0PTA7dDxyLmQubGVuZ3RoOysrdCl7cz1yLmUKaWYodD49cy5sZW5ndGgpcmV0
+dXJuIEguT0gocyx0KQpzPXErSC5kKHNbdF0pCnE9ci5kCmlmKHQ+PXEubGVuZ3RoKXJldHVybiBILk9I
+KHEsdCkKcT1zK0guZChxW3RdKX1xKz1ILmQoQy5ObS5nclooci5lKSkKcmV0dXJuIHEuY2hhckNvZGVB
+dCgwKT09MD9xOnF9LApzbko6ZnVuY3Rpb24oYSl7dGhpcy5kPXUuYS5iKGEpfSwKc1BoOmZ1bmN0aW9u
+KGEpe3RoaXMuZT11LmEuYihhKX19ClgucVIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJu
+IHRoaXMuYS5hLmdtSSgpfSwKJFM6NDN9ClguZHYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1
+cm4iUGF0aEV4Y2VwdGlvbjogIit0aGlzLmF9fQpPLnpMLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7
+cmV0dXJuIHRoaXMuZ29jKHRoaXMpfX0KRS5PRi5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1
+cm4gQy54Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rp
+b24oYSl7dmFyIHQ9YS5sZW5ndGgKcmV0dXJuIHQhPT0wJiZDLnhCLm0oYSx0LTEpIT09NDd9LApTcDpm
+dW5jdGlvbihhLGIpe2lmKGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00NylyZXR1cm4gMQpyZXR1
+cm4gMH0sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7
+cmV0dXJuITF9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4icG9zaXgifSwKZ21JOmZ1bmN0aW9uKCl7cmV0
+dXJuIi8ifX0KRi5ydS5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi50ZyhhLCIv
+Iil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5s
+ZW5ndGgKaWYodD09PTApcmV0dXJuITEKaWYoQy54Qi5tKGEsdC0xKSE9PTQ3KXJldHVybiEwCnJldHVy
+biBDLnhCLlRjKGEsIjovLyIpJiZ0aGlzLllyKGEpPT09dH0sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHQs
+cyxyLHEscD1hLmxlbmd0aAppZihwPT09MClyZXR1cm4gMAppZihDLnhCLlcoYSwwKT09PTQ3KXJldHVy
+biAxCmZvcih0PTA7dDxwOysrdCl7cz1DLnhCLlcoYSx0KQppZihzPT09NDcpcmV0dXJuIDAKaWYocz09
+PTU4KXtpZih0PT09MClyZXR1cm4gMApyPUMueEIuWFUoYSwiLyIsQy54Qi5RaShhLCIvLyIsdCsxKT90
+KzM6dCkKaWYocjw9MClyZXR1cm4gcAppZighYnx8cDxyKzMpcmV0dXJuIHIKaWYoIUMueEIubihhLCJm
+aWxlOi8vIikpcmV0dXJuIHIKaWYoIUIuWXUoYSxyKzEpKXJldHVybiByCnE9ciszCnJldHVybiBwPT09
+cT9xOnIrNH19cmV0dXJuIDB9LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhL
+OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDd9LApnb2M6ZnVu
+Y3Rpb24oKXtyZXR1cm4idXJsIn0sCmdtSTpmdW5jdGlvbigpe3JldHVybiIvIn19CkwuSVYucHJvdG90
+eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7
+cmV0dXJuIGE9PT00N3x8YT09PTkyfSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKaWYodD09
+PTApcmV0dXJuITEKdD1DLnhCLm0oYSx0LTEpCnJldHVybiEodD09PTQ3fHx0PT09OTIpfSwKU3A6ZnVu
+Y3Rpb24oYSxiKXt2YXIgdCxzLHI9YS5sZW5ndGgKaWYocj09PTApcmV0dXJuIDAKdD1DLnhCLlcoYSww
+KQppZih0PT09NDcpcmV0dXJuIDEKaWYodD09PTkyKXtpZihyPDJ8fEMueEIuVyhhLDEpIT09OTIpcmV0
+dXJuIDEKcz1DLnhCLlhVKGEsIlxcIiwyKQppZihzPjApe3M9Qy54Qi5YVShhLCJcXCIscysxKQppZihz
+PjApcmV0dXJuIHN9cmV0dXJuIHJ9aWYocjwzKXJldHVybiAwCmlmKCFCLk9TKHQpKXJldHVybiAwCmlm
+KEMueEIuVyhhLDEpIT09NTgpcmV0dXJuIDAKcj1DLnhCLlcoYSwyKQppZighKHI9PT00N3x8cj09PTky
+KSlyZXR1cm4gMApyZXR1cm4gM30sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwK
+aEs6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWXIoYSk9PT0xfSwKT3Q6ZnVuY3Rpb24oYSxiKXt2YXIg
+dAppZihhPT09YilyZXR1cm4hMAppZihhPT09NDcpcmV0dXJuIGI9PT05MgppZihhPT09OTIpcmV0dXJu
+IGI9PT00NwppZigoYV5iKSE9PTMyKXJldHVybiExCnQ9YXwzMgpyZXR1cm4gdD49OTcmJnQ8PTEyMn0s
+Ck5jOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCmlmKGE9PWIpcmV0dXJuITAKdD1hLmxlbmd0aAppZih0
+IT09Yi5sZW5ndGgpcmV0dXJuITEKZm9yKHM9Si5yWShiKSxyPTA7cjx0OysrcilpZighdGhpcy5PdChD
+LnhCLlcoYSxyKSxzLlcoYixyKSkpcmV0dXJuITEKcmV0dXJuITB9LApnb2M6ZnVuY3Rpb24oKXtyZXR1
+cm4id2luZG93cyJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iXFwifX07KGZ1bmN0aW9uIGFsaWFzZXMo
+KXt2YXIgdD1KLnZCLnByb3RvdHlwZQp0LlU9dC53CnQuU2o9dC5lNwp0PUouTUYucHJvdG90eXBlCnQu
+dD10LncKdD1QLmNYLnByb3RvdHlwZQp0LkdHPXQuZXYKdD1QLmsucHJvdG90eXBlCnQueGI9dC53CnQ9
+Vy5jdi5wcm90b3R5cGUKdC5EVz10LnI2CnQ9Vy5tNi5wcm90b3R5cGUKdC5qRj10LkViCnQ9UC5FNC5w
+cm90b3R5cGUKdC5Vcj10LnEKdC5lND10Lll9KSgpOyhmdW5jdGlvbiBpbnN0YWxsVGVhck9mZnMoKXt2
+YXIgdD1odW5rSGVscGVycy5fc3RhdGljXzEscz1odW5rSGVscGVycy5fc3RhdGljXzAscj1odW5rSGVs
+cGVycy5pbnN0YWxsSW5zdGFuY2VUZWFyT2ZmLHE9aHVua0hlbHBlcnMuaW5zdGFsbFN0YXRpY1RlYXJP
+ZmYscD1odW5rSGVscGVycy5faW5zdGFuY2VfMXUKdChQLCJFWCIsIlpWIiw5KQp0KFAsInl0Iiwib0Ei
+LDkpCnQoUCwicVciLCJCeiIsOSkKcyhQLCJVSSIsImVOIiwyKQpyKFAuUGYucHJvdG90eXBlLCJnWUoi
+LDAsMSxudWxsLFsiJDIiLCIkMSJdLFsidzAiLCJwbSJdLDQ0LDApCnQoUCwiUEgiLCJNdCIsNSkKcShX
+LCJwUyIsNCxudWxsLFsiJDQiXSxbInlXIl0sMTUsMCkKcShXLCJWNCIsNCxudWxsLFsiJDQiXSxbIlFX
+Il0sMTUsMCkKcChQLkFzLnByb3RvdHlwZSwiZ3VNIiwiVCIsNSkKdChQLCJpRyIsIndZIiw0KQp0KFAs
+IncwIiwiTDciLDMwKQp0KEwsIkgwIiwidW0iLDE2KX0pKCk7KGZ1bmN0aW9uIGluaGVyaXRhbmNlKCl7
+dmFyIHQ9aHVua0hlbHBlcnMubWl4aW4scz1odW5rSGVscGVycy5pbmhlcml0LHI9aHVua0hlbHBlcnMu
+aW5oZXJpdE1hbnkKcyhQLmssbnVsbCkKcihQLmssW0guZW8sSi52QixKLm0xLFAublksUC5jWCxILmE3
+LFAuQW4sSC5TVSxILlJlLEgud3YsUC5QbixILldVLEguTEksSC5UcCxILmY5LFAuWFMsSC5icSxILlhP
+LFAuWWssSC5kYixILk42LEguVlIsSC5FSyxILlBiLEgudFEsSC5TZCxILkpjLEguRyxQLlczLFAuaWgs
+UC5QZixQLkZlLFAudnMsUC5PTSxQLnFoLFAuTU8sUC5rVCxQLnhJLFAuQ3csUC5tMCxQLlh2LFAuYm4s
+UC5sbSxQLmxELFAuS1AsUC5sZixQLldZLFAuVWssUC5SdyxQLmJ6LFAuYTIsUC5pUCxQLkZLLFAuazUs
+UC5LWSxQLkNELFAuYUUsUC5FSCxQLnpNLFAuWjAsUC5jOCxQLk9kLFAuaWIsUC5HeixQLnFVLFAuUm4s
+UC5HRCxQLkRuLFAuUEUsUC5VZixXLmlkLFcuRmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcuVzks
+Vy5kVyxXLkZiLFcua0YsVy5tayxXLktvLFAuaUosUC5FNCxQLm42LFUuZDIsVS5TZSxVLnVGLFUuTWws
+VS55RCxVLndiLEIuajgsQi5xcCxULkdWLEwuWEEsTC5aWixMLnk4LE0ubEksTy56TCxYLldELFguZHZd
+KQpyKEoudkIsW0oueUUsSi5ZRSxKLk1GLEouamQsSi5xSSxKLkRyLEguRVQsVy5EMCxXLkF6LFcuTGUs
+Vy5OaCxXLklCLFcubjcsVy5lYSxXLmJyLFcuU2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnIoSi5NRixb
+Si5pQyxKLmtkLEouYzVdKQpzKEouUG8sSi5qZCkKcihKLnFJLFtKLnVyLEouVkFdKQpzKFAuTFUsUC5u
+WSkKcihQLkxVLFtILlhDLFcud3osVy5lN10pCnMoSC5xaixILlhDKQpyKFAuY1gsW0guYlEsSC5VNSxQ
+Lm1XLEgudW5dKQpyKEguYlEsW0guYUwsSC5pNSxQLnh1XSkKcihILmFMLFtILm5ILEguQTgsUC5pOF0p
+CnMoSC5TTyxQLkFuKQpzKFAuUlUsUC5QbikKcyhQLkdqLFAuUlUpCnMoSC5QRCxQLkdqKQpzKEguTFAs
+SC5XVSkKcihILlRwLFtILkNqLEguQW0sSC5sYyxILmRDLEgud04sSC5WWCxQLnRoLFAuaGEsUC5WcyxQ
+LkZ0LFAueUgsUC5XTSxQLlNYLFAuR3MsUC5kYSxQLm9RLFAucFYsUC5VNyxQLnZyLFAuckgsUC5LRixQ
+LlpMLFAuUlQsUC5qWixQLnJxLFAuUlcsUC5CNSxQLlBJLFAucEssUC5oaixQLlZwLFAuT1IsUC5yYSxQ
+LldGLFAubjEsUC5jUyxQLlZDLFAudHAsUC5lMSxQLk5ZLFAuUlosUC5NRSxQLnk1LFAucTMsUC55SSxQ
+LmM2LFAucWQsVy5DdixXLmJVLFcuaEgsVy5LUyxXLkEzLFcudk4sVy5VdixXLkVnLFcuRW8sVy5XayxX
+LklBLFcuZm0sUC5sUixQLmpnLFAuR0UsUC5ONyxQLnVRLFAuUEMsUC5ZbSxQLk56LFAubnAsUC5VdCxM
+LmUsTC5WVyxMLm9aLEwuanIsTC5xbCxMLkwsTC5XeCxMLkFPLEwuZE4sTC5IbyxMLnh6LEwuSUMsTC5M
+MSxMLm5ULEwuQlosTC5HSCxMLkRULEwuZUgsTC56RCxMLk9FLEwuVFcsTC54cixMLkVFLEwuUUwsTC5W
+UyxMLlRELE0uTWksTS5xNyxNLk5vLFgucVJdKQpyKFAuWFMsW0guVzAsSC5heixILnZWLEguRXEsUC5D
+NixILnU5LFAubixQLnUsUC5tcCxQLnViLFAuZHMsUC5saixQLlVWLFAuY10pCnIoSC5sYyxbSC56eCxI
+LnJUXSkKcyhILmtZLFAuQzYpCnMoUC5pbCxQLllrKQpyKFAuaWwsW0guTjUsUC51dyxXLmNmLFcuU3ld
+KQpzKEguS1csUC5tVykKcyhILmIwLEguRVQpCnIoSC5iMCxbSC5SRyxILldCXSkKcyhILlZQLEguUkcp
+CnMoSC5EZyxILlZQKQpzKEguWkcsSC5XQikKcyhILlBnLEguWkcpCnIoSC5QZyxbSC54aixILmRFLEgu
+WkEsSC53ZixILlBxLEguZUUsSC5WNl0pCnIoSC51OSxbSC5oeixILmlNXSkKcyhQLlpmLFAuUGYpCnMo
+UC5KaSxQLm0wKQpzKFAuYjYsUC5YdikKcyhQLlZqLFAuV1kpCnIoUC5VayxbUC5DVixQLlppLFAuYnld
+KQpzKFAud0ksUC5rVCkKcihQLndJLFtQLlU4LFAuTXgsUC5FMyxQLkdZXSkKcyhQLnU1LFAuWmkpCnIo
+UC5GSyxbUC5DUCxQLktOXSkKcihQLnUsW1AuYkosUC5lWV0pCnMoUC5xZSxQLkRuKQpyKFcuRDAsW1cu
+dUgsVy53YSxXLks1LFcuQ21dKQpyKFcudUgsW1cuY3YsVy5ueCxXLlFGLFcuQ1FdKQpyKFcuY3YsW1cu
+cUUsUC5kNV0pCnIoVy5xRSxbVy5HaCxXLmZZLFcubkIsVy5RUCxXLmg0LFcuU04sVy5scCxXLlRiLFcu
+SXYsVy5CVCxXLnlZXSkKcyhXLm9KLFcuTGUpCnMoVy5UNSxXLkF6KQpzKFcuVmIsVy5RRikKcyhXLk83
+LFcud2EpCnIoVy5lYSxbVy53NixXLmV3XSkKcyhXLkFqLFcudzYpCnMoVy5yQixXLks3KQpzKFcuQkgs
+Vy5yQikKcyhXLnc0LFcuSUIpCnMoVy5vYSxXLlhXKQpzKFcucmgsVy5vYSkKcyhXLmk3LFcuY2YpCnMo
+UC5BcyxQLlZqKQpyKFAuQXMsW1cuSTQsUC5LZV0pCnMoVy5STyxQLnFoKQpzKFcuQ3EsVy5STykKcyhX
+LnhDLFAuTU8pCnMoVy5jdCxXLm02KQpzKFAuQmYsUC5pSikKcihQLkU0LFtQLnI3LFAuY29dKQpzKFAu
+VHosUC5jbykKcyhQLm5kLFAuZDUpCnMoQi5MdSxPLnpMKQpyKEIuTHUsW0UuT0YsRi5ydSxMLklWXSkK
+dChILlhDLEguUmUpCnQoSC5SRyxQLmxEKQp0KEguVlAsSC5TVSkKdChILldCLFAubEQpCnQoSC5aRyxI
+LlNVKQp0KFAublksUC5sRCkKdChQLldZLFAubGYpCnQoUC5SVSxQLktQKQp0KFcuTGUsVy5pZCkKdChX
+Lks3LFAubEQpCnQoVy5yQixXLkdtKQp0KFcuWFcsUC5sRCkKdChXLm9hLFcuR20pCnQoUC5jbyxQLmxE
+KX0pKCkKdmFyIHY9e3R5cGVVbml2ZXJzZTp7ZUM6bmV3IE1hcCgpLHRSOnt9LGVUOnt9LHRQVjp7fSxz
+RUE6W119LG1hbmdsZWRHbG9iYWxOYW1lczp7S046ImludCIsQ1A6ImRvdWJsZSIsRks6Im51bSIscVU6
+IlN0cmluZyIsYTI6ImJvb2wiLGM4OiJOdWxsIix6TToiTGlzdCJ9LG1hbmdsZWROYW1lczp7fSxnZXRU
+eXBlRnJvbU5hbWU6Z2V0R2xvYmFsRnJvbU5hbWUsbWV0YWRhdGE6W10sdHlwZXM6WyJjOCgpIiwiYzgo
+QCxAKSIsIn4oKSIsImM4KGN2KSIsIkAoQCkiLCJxVShxVSkiLCJjOChBaikiLCJjOChPNykiLCJhMihx
+VSkiLCJ+KH4oKSkiLCJjOChxVSxxVSkiLCJjOChxVSkiLCJjOChxVSxAKSIsImM4KGVhKSIsIn4oeHU8
+cVU+KSIsImEyKGN2LHFVLHFVLEpRKSIsIn4oQWopIiwiYTIoa0YpIiwiYzgoQCkiLCJLTihLTixLTiki
+LCJ+KEApIiwiYzgofigpKSIsIn4ocVUscVUpIiwiYzgoS04sQCkiLCJuNihALEApIiwiYTIodUgpIiwi
+fihxVVtAXSkiLCJjOChldykiLCJAKGVhKSIsIn4ocVUsS04pIiwiayhAKSIsIn4odUgsdUgpIiwiYzgo
+R0QsQCkiLCJjOChALEd6KSIsInI3KEApIiwiVHo8QD4oQCkiLCJFNChAKSIsInZzPEA+KEApIiwiQChA
+LHFVKSIsIlowPHFVLHFVPihaMDxxVSxxVT4scVUpIiwiQChxVSkiLCJPNyhPNykiLCJjOChAW0d6XSki
+LCJxVShLTikiLCJ+KGtbR3pdKSIsImEyKHh1PHFVPikiLCJuNihLTikiXSxpbnRlcmNlcHRvcnNCeVRh
+ZzpudWxsLGxlYWZUYWdzOm51bGx9CkgueGIodi50eXBlVW5pdmVyc2UsSlNPTi5wYXJzZSgneyJjNSI6
+Ik1GIiwiaUMiOiJNRiIsImtkIjoiTUYiLCJyeCI6ImVhIiwiZTUiOiJlYSIsIlkwIjoiZDUiLCJXdCI6
+ImQ1IiwidjAiOiJldyIsIk1yIjoicUUiLCJlTCI6InFFIiwiSTAiOiJ1SCIsImhzIjoidUgiLCJYZyI6
+IlFGIiwieWMiOiJBaiIsInk0IjoidzYiLCJhUCI6IkNtIiwieGMiOiJueCIsImtKIjoibngiLCJ6VSI6
+IkRnIiwiZGYiOiJFVCIsInlFIjp7ImEyIjpbXX0sIllFIjp7ImM4IjpbXX0sIk1GIjp7InZtIjpbXSwi
+RUgiOltdfSwiamQiOnsiek0iOlsiMSJdLCJjWCI6WyIxIl19LCJQbyI6eyJqZCI6WyIxIl0sInpNIjpb
+IjEiXSwiY1giOlsiMSJdfSwibTEiOnsiQW4iOlsiMSJdfSwicUkiOnsiQ1AiOltdLCJGSyI6W119LCJ1
+ciI6eyJLTiI6W10sIkNQIjpbXSwiRksiOltdfSwiVkEiOnsiQ1AiOltdLCJGSyI6W119LCJEciI6eyJx
+VSI6W10sInZYIjpbXX0sInFqIjp7IlJlIjpbIktOIl0sImxEIjpbIktOIl0sInpNIjpbIktOIl0sImNY
+IjpbIktOIl0sImxELkUiOiJLTiIsIlJlLkUiOiJLTiJ9LCJiUSI6eyJjWCI6WyIxIl19LCJhTCI6eyJj
+WCI6WyIxIl19LCJuSCI6eyJhTCI6WyIxIl0sImNYIjpbIjEiXSwiYUwuRSI6IjEiLCJjWC5FIjoiMSJ9
+LCJhNyI6eyJBbiI6WyIxIl19LCJBOCI6eyJhTCI6WyIyIl0sImNYIjpbIjIiXSwiYUwuRSI6IjIiLCJj
+WC5FIjoiMiJ9LCJVNSI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlNPIjp7IkFuIjpbIjEiXX0sIlhD
+Ijp7IlJlIjpbIjEiXSwibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImNYIjpbIjEiXX0sInd2Ijp7IkdEIjpb
+XX0sIlBEIjp7IkdqIjpbIjEiLCIyIl0sIlJVIjpbIjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpb
+IjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJXVSI6eyJaMCI6WyIxIiwiMiJdfSwiTFAiOnsiV1UiOlsi
+MSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIkxJIjp7InZRIjpbXX0sIlcwIjp7IlhTIjpbXX0sImF6Ijp7
+IlhTIjpbXX0sInZWIjp7IlhTIjpbXX0sIlhPIjp7Ikd6IjpbXX0sIlRwIjp7IkVIIjpbXX0sImxjIjp7
+IkVIIjpbXX0sInp4Ijp7IkVIIjpbXX0sInJUIjp7IkVIIjpbXX0sIkVxIjp7IlhTIjpbXX0sImtZIjp7
+IlhTIjpbXX0sIk41Ijp7IkZvIjpbIjEiLCIyIl0sIllrIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl0s
+IllrLksiOiIxIiwiWWsuViI6IjIifSwiaTUiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJONiI6eyJB
+biI6WyIxIl19LCJWUiI6eyJ3TCI6W10sInZYIjpbXX0sIkVLIjp7ImliIjpbXSwiT2QiOltdfSwiS1ci
+OnsiY1giOlsiaWIiXSwiY1guRSI6ImliIn0sIlBiIjp7IkFuIjpbImliIl19LCJ0USI6eyJPZCI6W119
+LCJ1biI6eyJjWCI6WyJPZCJdLCJjWC5FIjoiT2QifSwiU2QiOnsiQW4iOlsiT2QiXX0sIkVUIjp7IkFT
+IjpbXX0sImIwIjp7IlhqIjpbIkAiXSwiRVQiOltdLCJBUyI6W119LCJEZyI6eyJsRCI6WyJDUCJdLCJY
+aiI6WyJAIl0sInpNIjpbIkNQIl0sIkVUIjpbXSwiU1UiOlsiQ1AiXSwiQVMiOltdLCJjWCI6WyJDUCJd
+LCJsRC5FIjoiQ1AifSwiUGciOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6
+W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXX0sInhqIjp7ImxEIjpbIktOIl0sInpNIjpb
+IktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxE
+LkUiOiJLTiJ9LCJkRSI6eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwi
+U1UiOlsiS04iXSwiQVMiOltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiWkEiOnsibEQiOlsiS04i
+XSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsi
+S04iXSwibEQuRSI6IktOIn0sIndmIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwi
+RVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJQcSI6eyJs
+RCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwiU1UiOlsiS04iXSwiQVMiOltd
+LCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiZUUiOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoi
+OlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0s
+IlY2Ijp7Im42IjpbXSwibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNV
+IjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0sInU5Ijp7IlhTIjpbXX0sImh6
+Ijp7IlhTIjpbXX0sImlNIjp7IlhTIjpbXX0sIlpmIjp7IlBmIjpbIjEiXX0sInZzIjp7ImI4IjpbIjEi
+XX0sIkN3Ijp7IlhTIjpbXX0sIm0wIjp7IkpCIjpbXX0sIkppIjp7IkpCIjpbXX0sImI2Ijp7Ilh2Ijpb
+IjEiXSwieHUiOlsiMSJdLCJjWCI6WyIxIl19LCJsbSI6eyJBbiI6WyIxIl19LCJtVyI6eyJjWCI6WyIx
+Il19LCJMVSI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiY1giOlsiMSJdfSwiaWwiOnsiWWsiOlsiMSIs
+IjIiXSwiWjAiOlsiMSIsIjIiXX0sIllrIjp7IlowIjpbIjEiLCIyIl19LCJQbiI6eyJaMCI6WyIxIiwi
+MiJdfSwiR2oiOnsiUlUiOlsiMSIsIjIiXSwiUG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIsIjIiXSwiWjAi
+OlsiMSIsIjIiXX0sIlZqIjp7ImxmIjpbIjEiXSwieHUiOlsiMSJdLCJjWCI6WyIxIl19LCJYdiI6eyJ4
+dSI6WyIxIl0sImNYIjpbIjEiXX0sInV3Ijp7IllrIjpbInFVIiwiQCJdLCJaMCI6WyJxVSIsIkAiXSwi
+WWsuSyI6InFVIiwiWWsuViI6IkAifSwiaTgiOnsiYUwiOlsicVUiXSwiY1giOlsicVUiXSwiYUwuRSI6
+InFVIiwiY1guRSI6InFVIn0sIkNWIjp7IlVrIjpbInpNPEtOPiIsInFVIl0sIlVrLlMiOiJ6TTxLTj4i
+fSwiVTgiOnsid0kiOlsiek08S04+IiwicVUiXX0sIlppIjp7IlVrIjpbInFVIiwiek08S04+Il19LCJi
+eSI6eyJVayI6WyJrIiwicVUiXSwiVWsuUyI6ImsifSwiTXgiOnsid0kiOlsicVUiLCJrIl19LCJ1NSI6
+eyJVayI6WyJxVSIsInpNPEtOPiJdLCJVay5TIjoicVUifSwiRTMiOnsid0kiOlsicVUiLCJ6TTxLTj4i
+XX0sIkdZIjp7IndJIjpbInpNPEtOPiIsInFVIl19LCJDUCI6eyJGSyI6W119LCJDNiI6eyJYUyI6W119
+LCJuIjp7IlhTIjpbXX0sInUiOnsiWFMiOltdfSwiYkoiOnsiWFMiOltdfSwiZVkiOnsiWFMiOltdfSwi
+bXAiOnsiWFMiOltdfSwidWIiOnsiWFMiOltdfSwiZHMiOnsiWFMiOltdfSwibGoiOnsiWFMiOltdfSwi
+VVYiOnsiWFMiOltdfSwiazUiOnsiWFMiOltdfSwiS1kiOnsiWFMiOltdfSwiYyI6eyJYUyI6W119LCJL
+TiI6eyJGSyI6W119LCJ6TSI6eyJjWCI6WyIxIl19LCJpYiI6eyJPZCI6W119LCJ4dSI6eyJjWCI6WyIx
+Il19LCJxVSI6eyJ2WCI6W119LCJSbiI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119LCJVZiI6eyJpRCI6
+W119LCJxZSI6eyJpRCI6W119LCJxRSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiR2giOnsiY3Yi
+OltdLCJ1SCI6W10sIkQwIjpbXX0sImZZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJuQiI6eyJj
+diI6W10sInVIIjpbXSwiRDAiOltdfSwiUVAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIm54Ijp7
+InVIIjpbXSwiRDAiOltdfSwiUUYiOnsidUgiOltdLCJEMCI6W119LCJJQiI6eyJ0biI6WyJGSyJdfSwi
+d3oiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImNYIjpbIjEiXSwibEQuRSI6IjEifSwiY3YiOnsidUgi
+OltdLCJEMCI6W119LCJUNSI6eyJBeiI6W119LCJoNCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwi
+VmIiOnsidUgiOltdLCJEMCI6W119LCJPNyI6eyJEMCI6W119LCJ3YSI6eyJEMCI6W119LCJBaiI6eyJl
+YSI6W119LCJlNyI6eyJsRCI6WyJ1SCJdLCJ6TSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJsRC5FIjoidUgi
+fSwidUgiOnsiRDAiOltdfSwiQkgiOnsiR20iOlsidUgiXSwibEQiOlsidUgiXSwiek0iOlsidUgiXSwi
+WGoiOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVIIiwiR20uRSI6InVIIn0sIlNOIjp7ImN2Ijpb
+XSwidUgiOltdLCJEMCI6W119LCJldyI6eyJlYSI6W119LCJscCI6eyJjdiI6W10sInVIIjpbXSwiRDAi
+OltdfSwiVGIiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIkl2Ijp7ImN2IjpbXSwidUgiOltdLCJE
+MCI6W119LCJCVCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwieVkiOnsiY3YiOltdLCJ1SCI6W10s
+IkQwIjpbXX0sInc2Ijp7ImVhIjpbXX0sIks1Ijp7InY2IjpbXSwiRDAiOltdfSwiQ20iOnsiRDAiOltd
+fSwiQ1EiOnsidUgiOltdLCJEMCI6W119LCJ3NCI6eyJ0biI6WyJGSyJdfSwicmgiOnsiR20iOlsidUgi
+XSwibEQiOlsidUgiXSwiek0iOlsidUgiXSwiWGoiOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVI
+IiwiR20uRSI6InVIIn0sImNmIjp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdfSwiaTci
+OnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJxVSJ9
+LCJTeSI6eyJZayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsuViI6
+InFVIn0sIkk0Ijp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImNYIjpbInFVIl19LCJSTyI6eyJxaCI6
+WyIxIl19LCJDcSI6eyJSTyI6WyIxIl0sInFoIjpbIjEiXX0sInhDIjp7Ik1PIjpbIjEiXX0sIkpRIjp7
+ImtGIjpbXX0sInZEIjp7ImtGIjpbXX0sIm02Ijp7ImtGIjpbXX0sImN0Ijp7ImtGIjpbXX0sIk93Ijp7
+ImtGIjpbXX0sIlc5Ijp7IkFuIjpbIjEiXX0sImRXIjp7InY2IjpbXSwiRDAiOltdfSwibWsiOnsieTAi
+OltdfSwiS28iOnsib24iOltdfSwiQXMiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiY1giOlsicVUi
+XX0sInI3Ijp7IkU0IjpbXX0sIlR6Ijp7ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJFNCI6W10sImNYIjpb
+IjEiXSwibEQuRSI6IjEifSwibmQiOnsiZDUiOltdLCJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiS2Ui
+OnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiY1giOlsicVUiXX0sImQ1Ijp7ImN2IjpbXSwidUgiOltd
+LCJEMCI6W119LCJuNiI6eyJ6TSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl19LCJYQSI6eyJrRiI6
+W119LCJPRiI6eyJMdSI6W119LCJydSI6eyJMdSI6W119LCJJViI6eyJMdSI6W119fScpKQpILkZGKHYu
+dHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3siYlEiOjEsIlhDIjoxLCJNTyI6MSwia1QiOjIsIm1XIjox
+LCJMVSI6MSwiaWwiOjIsIlZqIjoxLCJuWSI6MSwiV1kiOjEsImNvIjoxfScpKQp2YXIgdT0oZnVuY3Rp
+b24gcnRpaSgpe3ZhciB0PUguTjAKcmV0dXJue2k6dCgiR2giKSxuOnQoIkN3IiksY1I6dCgibkIiKSxk
+OnQoIkF6IiksWTp0KCJRUCIpLGdGOnQoIlBEPEdELEA+IiksaDp0KCJjdiIpLGJVOnQoIlhTIiksQjp0
+KCJlYSIpLGFTOnQoIkQwIiksYzg6dCgiVDUiKSxaOnQoIkVIIiksYzp0KCJiODxAPiIpLHI6dCgiTzci
+KSxJOnQoIlNnIiksbzp0KCJ2USIpLGVoOnQoImNYPHVIPiIpLFg6dCgiY1g8cVU+IiksUjp0KCJjWDxA
+PiIpLGZBOnQoImpkPFNlPiIpLHU6dCgiamQ8ajg+IiksYlA6dCgiamQ8dUY+IiksZmg6dCgiamQ8Wlo+
+Iiksazp0KCJqZDxrRj4iKSxzOnQoImpkPHFVPiIpLGhoOnQoImpkPHlEPiIpLGFKOnQoImpkPHdiPiIp
+LG06dCgiamQ8QD4iKSx0OnQoImpkPEtOPiIpLGVIOnQoInZtIiksZzp0KCJjNSIpLGFVOnQoIlhqPEA+
+IiksYW06dCgiVHo8QD4iKSxlbzp0KCJONTxHRCxAPiIpLHY6dCgiRTQiKSxkejp0KCJoRiIpLGE6dCgi
+ek08cVU+Iiksajp0KCJ6TTxAPiIpLEw6dCgiek08S04+IiksRjp0KCJ1OCIpLGY6dCgiWjA8cVUscVU+
+IiksYjp0KCJaMDxxVSxAPiIpLEc6dCgiWjA8QCxAPiIpLGR2OnQoIkE4PHFVLHFVPiIpLGRvOnQoIkE4
+PHFVLEA+IiksVjp0KCJBaiIpLGREOnQoIkVUIiksYm06dCgiVjYiKSxBOnQoInVIIiksZTp0KCJrRiIp
+LFA6dCgiYzgiKSxLOnQoImsiKSxwOnQoImV3IikscTp0KCJ0bjxGSz4iKSxmdjp0KCJ3TCIpLGF2OnQo
+IkpjIiksZXc6dCgibmQiKSxDOnQoInh1PHFVPiIpLGw6dCgiR3oiKSxOOnQoInFVIiksZEc6dCgicVUo
+cVUpIiksZzc6dCgiZDUiKSxmbzp0KCJHRCIpLGFXOnQoInlZIiksdzp0KCJBUyIpLGdjOnQoIm42Iiks
+YWs6dCgia2QiKSxUOnQoIkdqPHFVLHFVPiIpLEQ6dCgiaUQiKSxjYzp0KCJVNTxxVT4iKSxnNDp0KCJL
+NSIpLGNpOnQoInY2IiksZzI6dCgiQ20iKSxiajp0KCJaZjxPNz4iKSxoOTp0KCJDUSIpLGFjOnQoImU3
+IiksUTp0KCJDcTxBaj4iKSxTOnQoInd6PGN2PiIpLHg6dCgiRmU8QCxAPiIpLGFvOnQoInZzPE83PiIp
+LF86dCgidnM8QD4iKSxmSjp0KCJ2czxLTj4iKSxPOnQoIkpRIiksSjp0KCJibiIpLGNKOnQoImEyIiks
+YWw6dCgiYTIoaykiKSxiQjp0KCJhMihxVSkiKSxiZjp0KCJhMihAKSIpLHo6dCgiQCIpLGZPOnQoIkAo
+KSIpLFU6dCgiQChlYSkiKSx5OnQoIkAoaykiKSxlcDp0KCJAKGssaykiKSxXOnQoIkAoayxHeikiKSxj
+aDp0KCJAKHh1PHFVPikiKSxkTzp0KCJAKHFVKSIpLGI4OnQoIkAoQCxAKSIpLGVnOnQoIktOIiksSDp0
+KCJ+IiksTTp0KCJ+KCkiKSxhbjp0KCJ+KGV3KSIpLEU6dCgifihxVSxxVSkiKSxjQTp0KCJ+KHFVLEAp
+Iil9fSkoKTsoZnVuY3Rpb24gY29uc3RhbnRzKCl7dmFyIHQ9aHVua0hlbHBlcnMubWFrZUNvbnN0TGlz
+dApDLlJZPVcuUVAucHJvdG90eXBlCkMuQlo9Vy5WYi5wcm90b3R5cGUKQy5EdD1XLk83LnByb3RvdHlw
+ZQpDLk9rPUoudkIucHJvdG90eXBlCkMuTm09Si5qZC5wcm90b3R5cGUKQy5qbj1KLnVyLnByb3RvdHlw
+ZQpDLmpOPUouWUUucHJvdG90eXBlCkMuQ0Q9Si5xSS5wcm90b3R5cGUKQy54Qj1KLkRyLnByb3RvdHlw
+ZQpDLkRHPUouYzUucHJvdG90eXBlCkMuRXg9Vy51OC5wcm90b3R5cGUKQy5MdD1XLlNOLnByb3RvdHlw
+ZQpDLlpRPUouaUMucHJvdG90eXBlCkMuSWU9Vy5UYi5wcm90b3R5cGUKQy52Qj1KLmtkLnByb3RvdHlw
+ZQpDLm9sPVcuSzUucHJvdG90eXBlCkMueTg9bmV3IFAuVTgoKQpDLmg5PW5ldyBQLkNWKCkKQy5PND1m
+dW5jdGlvbiBnZXRUYWdGYWxsYmFjayhvKSB7CiAgdmFyIHMgPSBPYmplY3QucHJvdG90eXBlLnRvU3Ry
+aW5nLmNhbGwobyk7CiAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7Cn0KQy5ZcT1m
+dW5jdGlvbigpIHsKICB2YXIgdG9TdHJpbmdGdW5jdGlvbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJp
+bmc7CiAgZnVuY3Rpb24gZ2V0VGFnKG8pIHsKICAgIHZhciBzID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxs
+KG8pOwogICAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7CiAgfQogIGZ1bmN0aW9u
+IGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpIHsKICAgIGlmICgvXkhUTUxbQS1aXS4qRWxlbWVudCQv
+LnRlc3QodGFnKSkgewogICAgICB2YXIgbmFtZSA9IHRvU3RyaW5nRnVuY3Rpb24uY2FsbChvYmplY3Qp
+OwogICAgICBpZiAobmFtZSA9PSAiW29iamVjdCBPYmplY3RdIikgcmV0dXJuIG51bGw7CiAgICAgIHJl
+dHVybiAiSFRNTEVsZW1lbnQiOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRVbmtub3duVGFnR2VuZXJp
+Y0Jyb3dzZXIob2JqZWN0LCB0YWcpIHsKICAgIGlmIChzZWxmLkhUTUxFbGVtZW50ICYmIG9iamVjdCBp
+bnN0YW5jZW9mIEhUTUxFbGVtZW50KSByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAgIHJldHVybiBnZXRV
+bmtub3duVGFnKG9iamVjdCwgdGFnKTsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnKHRhZykg
+ewogICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaWYg
+KHR5cGVvZiB3aW5kb3dbdGFnXSA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICB2YXIgY29u
+c3RydWN0b3IgPSB3aW5kb3dbdGFnXTsKICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT0gImZ1bmN0
+aW9uIikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlOwogIH0KICBm
+dW5jdGlvbiBkaXNjcmltaW5hdG9yKHRhZykgeyByZXR1cm4gbnVsbDsgfQogIHZhciBpc0Jyb3dzZXIg
+PSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiOwogIHJldHVybiB7CiAgICBnZXRUYWc6IGdldFRh
+ZywKICAgIGdldFVua25vd25UYWc6IGlzQnJvd3NlciA/IGdldFVua25vd25UYWdHZW5lcmljQnJvd3Nl
+ciA6IGdldFVua25vd25UYWcsCiAgICBwcm90b3R5cGVGb3JUYWc6IHByb3RvdHlwZUZvclRhZywKICAg
+IGRpc2NyaW1pbmF0b3I6IGRpc2NyaW1pbmF0b3IgfTsKfQpDLndiPWZ1bmN0aW9uKGdldFRhZ0ZhbGxi
+YWNrKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGhvb2tzKSB7CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAh
+PSAib2JqZWN0IikgcmV0dXJuIGhvb2tzOwogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsK
+ICAgIGlmICh1YS5pbmRleE9mKCJEdW1wUmVuZGVyVHJlZSIpID49IDApIHJldHVybiBob29rczsKICAg
+IGlmICh1YS5pbmRleE9mKCJDaHJvbWUiKSA+PSAwKSB7CiAgICAgIGZ1bmN0aW9uIGNvbmZpcm0ocCkg
+ewogICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiICYmIHdpbmRvd1twXSAmJiB3
+aW5kb3dbcF0ubmFtZSA9PSBwOwogICAgICB9CiAgICAgIGlmIChjb25maXJtKCJXaW5kb3ciKSAmJiBj
+b25maXJtKCJIVE1MRWxlbWVudCIpKSByZXR1cm4gaG9va3M7CiAgICB9CiAgICBob29rcy5nZXRUYWcg
+PSBnZXRUYWdGYWxsYmFjazsKICB9Owp9CkMuS1U9ZnVuY3Rpb24oaG9va3MpIHsKICBpZiAodHlwZW9m
+IGRhcnRFeHBlcmltZW50YWxGaXh1cEdldFRhZyAhPSAiZnVuY3Rpb24iKSByZXR1cm4gaG9va3M7CiAg
+aG9va3MuZ2V0VGFnID0gZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnKGhvb2tzLmdldFRhZyk7Cn0K
+Qy5mUT1mdW5jdGlvbihob29rcykgewogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHBy
+b3RvdHlwZUZvclRhZyA9IGhvb2tzLnByb3RvdHlwZUZvclRhZzsKICBmdW5jdGlvbiBnZXRUYWdGaXhl
+ZChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgaWYgKHRhZyA9PSAiRG9jdW1lbnQiKSB7
+CiAgICAgIGlmICghIW8ueG1sVmVyc2lvbikgcmV0dXJuICIhRG9jdW1lbnQiOwogICAgICByZXR1cm4g
+IiFIVE1MRG9jdW1lbnQiOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAgZnVuY3Rpb24gcHJvdG90
+eXBlRm9yVGFnRml4ZWQodGFnKSB7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHJldHVybiBudWxs
+OwogICAgcmV0dXJuIHByb3RvdHlwZUZvclRhZyh0YWcpOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRU
+YWdGaXhlZDsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdGaXhlZDsKfQpD
+LmRrPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0g
+Im9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogIiI7CiAgaWYgKHVzZXJBZ2VudC5pbmRleE9m
+KCJGaXJlZm94IikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFn
+OwogIHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAi
+RGF0YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiR2VvR2VvbG9jYXRpb24iOiAiR2VvbG9jYXRp
+b24iLAogICAgIkxvY2F0aW9uIjogIiFMb2NhdGlvbiIsCiAgICAiV29ya2VyTWVzc2FnZUV2ZW50Ijog
+Ik1lc3NhZ2VFdmVudCIsCiAgICAiWE1MRG9jdW1lbnQiOiAiIURvY3VtZW50In07CiAgZnVuY3Rpb24g
+Z2V0VGFnRmlyZWZveChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgcmV0dXJuIHF1aWNr
+TWFwW3RhZ10gfHwgdGFnOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdGaXJlZm94Owp9CkMueGk9
+ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2Jq
+ZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2YoIlRy
+aWRlbnQvIikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwog
+IHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAiRGF0
+YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiSFRNTERERWxlbWVudCI6ICJIVE1MRWxlbWVudCIs
+CiAgICAiSFRNTERURWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiSFRNTFBocmFzZUVsZW1lbnQi
+OiAiSFRNTEVsZW1lbnQiLAogICAgIlBvc2l0aW9uIjogIkdlb3Bvc2l0aW9uIgogIH07CiAgZnVuY3Rp
+b24gZ2V0VGFnSUUobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIHZhciBuZXdUYWcgPSBx
+dWlja01hcFt0YWddOwogICAgaWYgKG5ld1RhZykgcmV0dXJuIG5ld1RhZzsKICAgIGlmICh0YWcgPT0g
+Ik9iamVjdCIpIHsKICAgICAgaWYgKHdpbmRvdy5EYXRhVmlldyAmJiAobyBpbnN0YW5jZW9mIHdpbmRv
+dy5EYXRhVmlldykpIHJldHVybiAiRGF0YVZpZXciOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAg
+ZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnSUUodGFnKSB7CiAgICB2YXIgY29uc3RydWN0b3IgPSB3aW5k
+b3dbdGFnXTsKICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVy
+biBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0lFOwogIGhv
+b2tzLnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRhZ0lFOwp9CkMuaTc9ZnVuY3Rpb24oaG9v
+a3MpIHsgcmV0dXJuIGhvb2tzOyB9CgpDLkN0PW5ldyBQLmJ5KCkKQy5FcT1uZXcgUC5rNSgpCkMueE09
+bmV3IFAudTUoKQpDLlFrPW5ldyBQLkUzKCkKQy5OVT1uZXcgUC5KaSgpCkMuQTM9bmV3IFAuTXgobnVs
+bCkKQy5HYj1ILlZNKHQoWzEyNywyMDQ3LDY1NTM1LDExMTQxMTFdKSx1LnQpCkMuYWs9SC5WTSh0KFsw
+LDAsMzI3NzYsMzM3OTIsMSwxMDI0MCwwLDBdKSx1LnQpCkMuY209SC5WTSh0KFsiKjo6Y2xhc3MiLCIq
+OjpkaXIiLCIqOjpkcmFnZ2FibGUiLCIqOjpoaWRkZW4iLCIqOjppZCIsIio6OmluZXJ0IiwiKjo6aXRl
+bXByb3AiLCIqOjppdGVtcmVmIiwiKjo6aXRlbXNjb3BlIiwiKjo6bGFuZyIsIio6OnNwZWxsY2hlY2si
+LCIqOjp0aXRsZSIsIio6OnRyYW5zbGF0ZSIsIkE6OmFjY2Vzc2tleSIsIkE6OmNvb3JkcyIsIkE6Omhy
+ZWZsYW5nIiwiQTo6bmFtZSIsIkE6OnNoYXBlIiwiQTo6dGFiaW5kZXgiLCJBOjp0YXJnZXQiLCJBOjp0
+eXBlIiwiQVJFQTo6YWNjZXNza2V5IiwiQVJFQTo6YWx0IiwiQVJFQTo6Y29vcmRzIiwiQVJFQTo6bm9o
+cmVmIiwiQVJFQTo6c2hhcGUiLCJBUkVBOjp0YWJpbmRleCIsIkFSRUE6OnRhcmdldCIsIkFVRElPOjpj
+b250cm9scyIsIkFVRElPOjpsb29wIiwiQVVESU86Om1lZGlhZ3JvdXAiLCJBVURJTzo6bXV0ZWQiLCJB
+VURJTzo6cHJlbG9hZCIsIkJETzo6ZGlyIiwiQk9EWTo6YWxpbmsiLCJCT0RZOjpiZ2NvbG9yIiwiQk9E
+WTo6bGluayIsIkJPRFk6OnRleHQiLCJCT0RZOjp2bGluayIsIkJSOjpjbGVhciIsIkJVVFRPTjo6YWNj
+ZXNza2V5IiwiQlVUVE9OOjpkaXNhYmxlZCIsIkJVVFRPTjo6bmFtZSIsIkJVVFRPTjo6dGFiaW5kZXgi
+LCJCVVRUT046OnR5cGUiLCJCVVRUT046OnZhbHVlIiwiQ0FOVkFTOjpoZWlnaHQiLCJDQU5WQVM6Ondp
+ZHRoIiwiQ0FQVElPTjo6YWxpZ24iLCJDT0w6OmFsaWduIiwiQ09MOjpjaGFyIiwiQ09MOjpjaGFyb2Zm
+IiwiQ09MOjpzcGFuIiwiQ09MOjp2YWxpZ24iLCJDT0w6OndpZHRoIiwiQ09MR1JPVVA6OmFsaWduIiwi
+Q09MR1JPVVA6OmNoYXIiLCJDT0xHUk9VUDo6Y2hhcm9mZiIsIkNPTEdST1VQOjpzcGFuIiwiQ09MR1JP
+VVA6OnZhbGlnbiIsIkNPTEdST1VQOjp3aWR0aCIsIkNPTU1BTkQ6OmNoZWNrZWQiLCJDT01NQU5EOjpj
+b21tYW5kIiwiQ09NTUFORDo6ZGlzYWJsZWQiLCJDT01NQU5EOjpsYWJlbCIsIkNPTU1BTkQ6OnJhZGlv
+Z3JvdXAiLCJDT01NQU5EOjp0eXBlIiwiREFUQTo6dmFsdWUiLCJERUw6OmRhdGV0aW1lIiwiREVUQUlM
+Uzo6b3BlbiIsIkRJUjo6Y29tcGFjdCIsIkRJVjo6YWxpZ24iLCJETDo6Y29tcGFjdCIsIkZJRUxEU0VU
+OjpkaXNhYmxlZCIsIkZPTlQ6OmNvbG9yIiwiRk9OVDo6ZmFjZSIsIkZPTlQ6OnNpemUiLCJGT1JNOjph
+Y2NlcHQiLCJGT1JNOjphdXRvY29tcGxldGUiLCJGT1JNOjplbmN0eXBlIiwiRk9STTo6bWV0aG9kIiwi
+Rk9STTo6bmFtZSIsIkZPUk06Om5vdmFsaWRhdGUiLCJGT1JNOjp0YXJnZXQiLCJGUkFNRTo6bmFtZSIs
+IkgxOjphbGlnbiIsIkgyOjphbGlnbiIsIkgzOjphbGlnbiIsIkg0OjphbGlnbiIsIkg1OjphbGlnbiIs
+Ikg2OjphbGlnbiIsIkhSOjphbGlnbiIsIkhSOjpub3NoYWRlIiwiSFI6OnNpemUiLCJIUjo6d2lkdGgi
+LCJIVE1MOjp2ZXJzaW9uIiwiSUZSQU1FOjphbGlnbiIsIklGUkFNRTo6ZnJhbWVib3JkZXIiLCJJRlJB
+TUU6OmhlaWdodCIsIklGUkFNRTo6bWFyZ2luaGVpZ2h0IiwiSUZSQU1FOjptYXJnaW53aWR0aCIsIklG
+UkFNRTo6d2lkdGgiLCJJTUc6OmFsaWduIiwiSU1HOjphbHQiLCJJTUc6OmJvcmRlciIsIklNRzo6aGVp
+Z2h0IiwiSU1HOjpoc3BhY2UiLCJJTUc6OmlzbWFwIiwiSU1HOjpuYW1lIiwiSU1HOjp1c2VtYXAiLCJJ
+TUc6OnZzcGFjZSIsIklNRzo6d2lkdGgiLCJJTlBVVDo6YWNjZXB0IiwiSU5QVVQ6OmFjY2Vzc2tleSIs
+IklOUFVUOjphbGlnbiIsIklOUFVUOjphbHQiLCJJTlBVVDo6YXV0b2NvbXBsZXRlIiwiSU5QVVQ6OmF1
+dG9mb2N1cyIsIklOUFVUOjpjaGVja2VkIiwiSU5QVVQ6OmRpc2FibGVkIiwiSU5QVVQ6OmlucHV0bW9k
+ZSIsIklOUFVUOjppc21hcCIsIklOUFVUOjpsaXN0IiwiSU5QVVQ6Om1heCIsIklOUFVUOjptYXhsZW5n
+dGgiLCJJTlBVVDo6bWluIiwiSU5QVVQ6Om11bHRpcGxlIiwiSU5QVVQ6Om5hbWUiLCJJTlBVVDo6cGxh
+Y2Vob2xkZXIiLCJJTlBVVDo6cmVhZG9ubHkiLCJJTlBVVDo6cmVxdWlyZWQiLCJJTlBVVDo6c2l6ZSIs
+IklOUFVUOjpzdGVwIiwiSU5QVVQ6OnRhYmluZGV4IiwiSU5QVVQ6OnR5cGUiLCJJTlBVVDo6dXNlbWFw
+IiwiSU5QVVQ6OnZhbHVlIiwiSU5TOjpkYXRldGltZSIsIktFWUdFTjo6ZGlzYWJsZWQiLCJLRVlHRU46
+OmtleXR5cGUiLCJLRVlHRU46Om5hbWUiLCJMQUJFTDo6YWNjZXNza2V5IiwiTEFCRUw6OmZvciIsIkxF
+R0VORDo6YWNjZXNza2V5IiwiTEVHRU5EOjphbGlnbiIsIkxJOjp0eXBlIiwiTEk6OnZhbHVlIiwiTElO
+Szo6c2l6ZXMiLCJNQVA6Om5hbWUiLCJNRU5VOjpjb21wYWN0IiwiTUVOVTo6bGFiZWwiLCJNRU5VOjp0
+eXBlIiwiTUVURVI6OmhpZ2giLCJNRVRFUjo6bG93IiwiTUVURVI6Om1heCIsIk1FVEVSOjptaW4iLCJN
+RVRFUjo6dmFsdWUiLCJPQkpFQ1Q6OnR5cGVtdXN0bWF0Y2giLCJPTDo6Y29tcGFjdCIsIk9MOjpyZXZl
+cnNlZCIsIk9MOjpzdGFydCIsIk9MOjp0eXBlIiwiT1BUR1JPVVA6OmRpc2FibGVkIiwiT1BUR1JPVVA6
+OmxhYmVsIiwiT1BUSU9OOjpkaXNhYmxlZCIsIk9QVElPTjo6bGFiZWwiLCJPUFRJT046OnNlbGVjdGVk
+IiwiT1BUSU9OOjp2YWx1ZSIsIk9VVFBVVDo6Zm9yIiwiT1VUUFVUOjpuYW1lIiwiUDo6YWxpZ24iLCJQ
+UkU6OndpZHRoIiwiUFJPR1JFU1M6Om1heCIsIlBST0dSRVNTOjptaW4iLCJQUk9HUkVTUzo6dmFsdWUi
+LCJTRUxFQ1Q6OmF1dG9jb21wbGV0ZSIsIlNFTEVDVDo6ZGlzYWJsZWQiLCJTRUxFQ1Q6Om11bHRpcGxl
+IiwiU0VMRUNUOjpuYW1lIiwiU0VMRUNUOjpyZXF1aXJlZCIsIlNFTEVDVDo6c2l6ZSIsIlNFTEVDVDo6
+dGFiaW5kZXgiLCJTT1VSQ0U6OnR5cGUiLCJUQUJMRTo6YWxpZ24iLCJUQUJMRTo6Ymdjb2xvciIsIlRB
+QkxFOjpib3JkZXIiLCJUQUJMRTo6Y2VsbHBhZGRpbmciLCJUQUJMRTo6Y2VsbHNwYWNpbmciLCJUQUJM
+RTo6ZnJhbWUiLCJUQUJMRTo6cnVsZXMiLCJUQUJMRTo6c3VtbWFyeSIsIlRBQkxFOjp3aWR0aCIsIlRC
+T0RZOjphbGlnbiIsIlRCT0RZOjpjaGFyIiwiVEJPRFk6OmNoYXJvZmYiLCJUQk9EWTo6dmFsaWduIiwi
+VEQ6OmFiYnIiLCJURDo6YWxpZ24iLCJURDo6YXhpcyIsIlREOjpiZ2NvbG9yIiwiVEQ6OmNoYXIiLCJU
+RDo6Y2hhcm9mZiIsIlREOjpjb2xzcGFuIiwiVEQ6OmhlYWRlcnMiLCJURDo6aGVpZ2h0IiwiVEQ6Om5v
+d3JhcCIsIlREOjpyb3dzcGFuIiwiVEQ6OnNjb3BlIiwiVEQ6OnZhbGlnbiIsIlREOjp3aWR0aCIsIlRF
+WFRBUkVBOjphY2Nlc3NrZXkiLCJURVhUQVJFQTo6YXV0b2NvbXBsZXRlIiwiVEVYVEFSRUE6OmNvbHMi
+LCJURVhUQVJFQTo6ZGlzYWJsZWQiLCJURVhUQVJFQTo6aW5wdXRtb2RlIiwiVEVYVEFSRUE6Om5hbWUi
+LCJURVhUQVJFQTo6cGxhY2Vob2xkZXIiLCJURVhUQVJFQTo6cmVhZG9ubHkiLCJURVhUQVJFQTo6cmVx
+dWlyZWQiLCJURVhUQVJFQTo6cm93cyIsIlRFWFRBUkVBOjp0YWJpbmRleCIsIlRFWFRBUkVBOjp3cmFw
+IiwiVEZPT1Q6OmFsaWduIiwiVEZPT1Q6OmNoYXIiLCJURk9PVDo6Y2hhcm9mZiIsIlRGT09UOjp2YWxp
+Z24iLCJUSDo6YWJiciIsIlRIOjphbGlnbiIsIlRIOjpheGlzIiwiVEg6OmJnY29sb3IiLCJUSDo6Y2hh
+ciIsIlRIOjpjaGFyb2ZmIiwiVEg6OmNvbHNwYW4iLCJUSDo6aGVhZGVycyIsIlRIOjpoZWlnaHQiLCJU
+SDo6bm93cmFwIiwiVEg6OnJvd3NwYW4iLCJUSDo6c2NvcGUiLCJUSDo6dmFsaWduIiwiVEg6OndpZHRo
+IiwiVEhFQUQ6OmFsaWduIiwiVEhFQUQ6OmNoYXIiLCJUSEVBRDo6Y2hhcm9mZiIsIlRIRUFEOjp2YWxp
+Z24iLCJUUjo6YWxpZ24iLCJUUjo6Ymdjb2xvciIsIlRSOjpjaGFyIiwiVFI6OmNoYXJvZmYiLCJUUjo6
+dmFsaWduIiwiVFJBQ0s6OmRlZmF1bHQiLCJUUkFDSzo6a2luZCIsIlRSQUNLOjpsYWJlbCIsIlRSQUNL
+OjpzcmNsYW5nIiwiVUw6OmNvbXBhY3QiLCJVTDo6dHlwZSIsIlZJREVPOjpjb250cm9scyIsIlZJREVP
+OjpoZWlnaHQiLCJWSURFTzo6bG9vcCIsIlZJREVPOjptZWRpYWdyb3VwIiwiVklERU86Om11dGVkIiwi
+VklERU86OnByZWxvYWQiLCJWSURFTzo6d2lkdGgiXSksdS5zKQpDLlZDPUguVk0odChbMCwwLDY1NDkw
+LDQ1MDU1LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdS50KQpDLm1LPUguVk0odChbMCwwLDI2NjI0
+LDEwMjMsNjU1MzQsMjA0Nyw2NTUzNCwyMDQ3XSksdS50KQpDLlNxPUguVk0odChbIkhFQUQiLCJBUkVB
+IiwiQkFTRSIsIkJBU0VGT05UIiwiQlIiLCJDT0wiLCJDT0xHUk9VUCIsIkVNQkVEIiwiRlJBTUUiLCJG
+UkFNRVNFVCIsIkhSIiwiSU1BR0UiLCJJTUciLCJJTlBVVCIsIklTSU5ERVgiLCJMSU5LIiwiTUVUQSIs
+IlBBUkFNIiwiU09VUkNFIiwiU1RZTEUiLCJUSVRMRSIsIldCUiJdKSx1LnMpCkMueEQ9SC5WTSh0KFtd
+KSx1LnUpCkMuZG49SC5WTSh0KFtdKSx1LnMpCkMuaFU9SC5WTSh0KFtdKSx1Lm0pCkMudG89SC5WTSh0
+KFswLDAsMzI3MjIsMTIyODcsNjU1MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx1LnQpCkMuRjM9SC5WTSh0
+KFswLDAsMjQ1NzYsMTAyMyw2NTUzNCwzNDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5lYT1ILlZNKHQo
+WzAsMCwzMjc1NCwxMTI2Myw2NTUzNCwzNDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5aSj1ILlZNKHQo
+WzAsMCwzMjcyMiwxMjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5XZD1ILlZNKHQo
+WzAsMCw2NTQ5MCwxMjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5ReD1ILlZNKHQo
+WyJiaW5kIiwiaWYiLCJyZWYiLCJyZXBlYXQiLCJzeW50YXgiXSksdS5zKQpDLkJJPUguVk0odChbIkE6
+OmhyZWYiLCJBUkVBOjpocmVmIiwiQkxPQ0tRVU9URTo6Y2l0ZSIsIkJPRFk6OmJhY2tncm91bmQiLCJD
+T01NQU5EOjppY29uIiwiREVMOjpjaXRlIiwiRk9STTo6YWN0aW9uIiwiSU1HOjpzcmMiLCJJTlBVVDo6
+c3JjIiwiSU5TOjpjaXRlIiwiUTo6Y2l0ZSIsIlZJREVPOjpwb3N0ZXIiXSksdS5zKQpDLldPPW5ldyBI
+LkxQKDAse30sQy5kbixILk4wKCJMUDxxVSxxVT4iKSkKQy5pSD1ILlZNKHQoW10pLEguTjAoImpkPEdE
+PiIpKQpDLkNNPW5ldyBILkxQKDAse30sQy5pSCxILk4wKCJMUDxHRCxAPiIpKQpDLlkyPW5ldyBMLnk4
+KCJOYXZpZ2F0aW9uVHJlZU5vZGVUeXBlLmRpcmVjdG9yeSIpCkMucmY9bmV3IEwueTgoIk5hdmlnYXRp
+b25UcmVlTm9kZVR5cGUuZmlsZSIpCkMuVGU9bmV3IEgud3YoImNhbGwiKX0pKCk7KGZ1bmN0aW9uIHN0
+YXRpY0ZpZWxkcygpeyQueWo9MAokLm1KPW51bGwKJC5QND1udWxsCiQuTkY9bnVsbAokLlRYPW51bGwK
+JC54Nz1udWxsCiQubnc9bnVsbAokLnZ2PW51bGwKJC5Cdj1udWxsCiQuUzY9bnVsbAokLms4PW51bGwK
+JC5tZz1udWxsCiQuVUQ9ITEKJC5YMz1DLk5VCiQueGc9W10KJC54bz1udWxsCiQuQk89bnVsbAokLmx0
+PW51bGwKJC5FVT1udWxsCiQub3I9UC5GbCh1Lk4sdS5aKQokLkk2PW51bGwKJC5GZj1udWxsfSkoKTso
+ZnVuY3Rpb24gbGF6eUluaXRpYWxpemVycygpe3ZhciB0PWh1bmtIZWxwZXJzLmxhenkKdCgkLCJmYSIs
+InciLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFydF9kYXJ0Q2xvc3VyZSIpfSkKdCgkLCJZMiIs
+IlVOIixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfanMiKX0pCnQoJCwiVTIiLCJTbiIsZnVu
+Y3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2Vp
+dmVyJCJ9fSkpfSkKdCgkLCJ4cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoeyRtZXRo
+b2QkOm51bGwsCnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnQoJCwi
+UjEiLCJOOSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0pCnQoJCwiZk4iLCJpSSIs
+ZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1
+bWVudHMkJwp0cnl7bnVsbC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHMpe3JldHVybiBz
+Lm1lc3NhZ2V9fSgpKX0pCnQoJCwicWkiLCJLZiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHZv
+aWQgMCkpfSkKdCgkLCJyWiIsIlpoIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFy
+ICRhcmd1bWVudHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXsodm9pZCAwKS4kbWV0aG9kJCgkYXJndW1l
+bnRzRXhwciQpfWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0pCnQoJCwia3EiLCJyTiIsZnVu
+Y3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKG51bGwpKX0pCnQoJCwidHQiLCJjMyIsZnVuY3Rpb24oKXty
+ZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHMpe3JldHVybiBzLm1l
+c3NhZ2V9fSgpKX0pCnQoJCwiZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKHZvaWQg
+MCkpfSkKdCgkLCJBNyIsInIxIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2
+b2lkIDApLiRtZXRob2QkfWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0pCnQoJCwiV2MiLCJ1
+dCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5PaigpfSkKdCgkLCJraCIsInJmIixmdW5jdGlvbigpe3JldHVy
+biBQLldJKCl9KQp0KCQsImJ0IiwiVjciLGZ1bmN0aW9uKCl7cmV0dXJuIEguRFEoSC5YRihILlZNKFst
+MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwt
+MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMSwtMiwtMiwt
+MiwtMiwtMiw2MiwtMiw2MiwtMiw2Myw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMiwtMiwt
+MiwtMSwtMiwtMiwtMiwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4
+LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0yLC0yLC0yLC0yLDYzLC0yLDI2LDI3LDI4LDI5LDMwLDMxLDMy
+LDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0y
+LC0yLC0yLC0yLC0yXSx1LnQpKSl9KQp0KCQsIk01Iiwid1EiLGZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVv
+ZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nl
+c3MpPT0iW29iamVjdCBwcm9jZXNzXSImJnByb2Nlc3MucGxhdGZvcm09PSJ3aW4zMiJ9KQp0KCQsIm1m
+IiwiejQiLGZ1bmN0aW9uKCl7cmV0dXJuIFAubnUoIl5bXFwtXFwuMC05QS1aX2Eten5dKiQiKX0pCnQo
+JCwiSkciLCJ2WiIsZnVuY3Rpb24oKXtyZXR1cm4gUC51eCgpfSkKdCgkLCJTQyIsIkFOIixmdW5jdGlv
+bigpe3JldHVybiBQLnRNKFsiQSIsIkFCQlIiLCJBQ1JPTllNIiwiQUREUkVTUyIsIkFSRUEiLCJBUlRJ
+Q0xFIiwiQVNJREUiLCJBVURJTyIsIkIiLCJCREkiLCJCRE8iLCJCSUciLCJCTE9DS1FVT1RFIiwiQlIi
+LCJCVVRUT04iLCJDQU5WQVMiLCJDQVBUSU9OIiwiQ0VOVEVSIiwiQ0lURSIsIkNPREUiLCJDT0wiLCJD
+T0xHUk9VUCIsIkNPTU1BTkQiLCJEQVRBIiwiREFUQUxJU1QiLCJERCIsIkRFTCIsIkRFVEFJTFMiLCJE
+Rk4iLCJESVIiLCJESVYiLCJETCIsIkRUIiwiRU0iLCJGSUVMRFNFVCIsIkZJR0NBUFRJT04iLCJGSUdV
+UkUiLCJGT05UIiwiRk9PVEVSIiwiRk9STSIsIkgxIiwiSDIiLCJIMyIsIkg0IiwiSDUiLCJINiIsIkhF
+QURFUiIsIkhHUk9VUCIsIkhSIiwiSSIsIklGUkFNRSIsIklNRyIsIklOUFVUIiwiSU5TIiwiS0JEIiwi
+TEFCRUwiLCJMRUdFTkQiLCJMSSIsIk1BUCIsIk1BUksiLCJNRU5VIiwiTUVURVIiLCJOQVYiLCJOT0JS
+IiwiT0wiLCJPUFRHUk9VUCIsIk9QVElPTiIsIk9VVFBVVCIsIlAiLCJQUkUiLCJQUk9HUkVTUyIsIlEi
+LCJTIiwiU0FNUCIsIlNFQ1RJT04iLCJTRUxFQ1QiLCJTTUFMTCIsIlNPVVJDRSIsIlNQQU4iLCJTVFJJ
+S0UiLCJTVFJPTkciLCJTVUIiLCJTVU1NQVJZIiwiU1VQIiwiVEFCTEUiLCJUQk9EWSIsIlREIiwiVEVY
+VEFSRUEiLCJURk9PVCIsIlRIIiwiVEhFQUQiLCJUSU1FIiwiVFIiLCJUUkFDSyIsIlRUIiwiVSIsIlVM
+IiwiVkFSIiwiVklERU8iLCJXQlIiXSx1Lk4pfSkKdCgkLCJYNCIsImhHIixmdW5jdGlvbigpe3JldHVy
+biBQLm51KCJeXFxTKyQiKX0pCnQoJCwid08iLCJvdyIsZnVuY3Rpb24oKXtyZXR1cm4gdS52LmIoUC5O
+RChzZWxmKSl9KQp0KCQsImt0IiwiUjgiLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFydF9kYXJ0
+T2JqZWN0Iil9KQp0KCQsImZLIiwia0kiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIERhcnRPYmpl
+Y3QoYSl7dGhpcy5vPWF9fSkKdCgkLCJxdCIsInpCIixmdW5jdGlvbigpe3JldHVybiBuZXcgVC5HVigp
+fSkKdCgkLCJFWSIsImZpIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiaGVh
+ZGVyIil9KQp0KCQsIlRSIiwiRFciLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9y
+KCJmb290ZXIiKX0pCnQoJCwiVzYiLCJoTCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2Vs
+ZWN0b3IoIi5lZGl0LXBhbmVsIC5wYW5lbC1jb250ZW50Iil9KQp0KCQsImhUIiwibVEiLGZ1bmN0aW9u
+KCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250ZW50Iil9
+KQp0KCQsImF2IiwiRDkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIjdW5p
+dC1uYW1lIil9KQp0KCQsImZlIiwiS0ciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLlhBKCl9KQp0KCQs
+Im1NIiwiblUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLmxJKCQuSGsoKSl9KQp0KCQsInlyIiwiYkQi
+LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51KCJbXi9dJCIpLFAubnUoIl4v
+IikpfSkKdCgkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5JVihQLm51KCJbL1xcXFxd
+IiksUC5udSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxcXF0rXFxcXFteXFxcXC9dK3xb
+YS16QS1aXTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxcXSkiKSl9KQp0KCQsImFrIiwi
+RWIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQLm51KCIoXlthLXpBLVpdWy0r
+LmEtekEtWlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0rLmEtekEtWlxcZF0qOi8vW14v
+XSoiKSxQLm51KCJeLyIpKX0pCnQoJCwibHMiLCJIayIsZnVuY3Rpb24oKXtyZXR1cm4gTy5SaCgpfSl9
+KSgpOyhmdW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oYSl7
+dmFyIG49e30KblthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVscGVycy5jb252ZXJ0VG9GYXN0
+T2JqZWN0KG4pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEpe3JldHVybiB0KCJfX19kYXJ0
+XyIrYSt2Lmlzb2xhdGVUYWcpfQp2YXIgcz0iX19fZGFydF9pc29sYXRlX3RhZ3NfIgp2YXIgcj1PYmpl
+Y3Rbc118fChPYmplY3Rbc109T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFyIHE9Il9aeFl4WCIKZm9yKHZh
+ciBwPTA7O3ArKyl7dmFyIG89dChxKyJfIitwKyJfIikKaWYoIShvIGluIHIpKXtyW29dPTEKdi5pc29s
+YXRlVGFnPW8KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5nZXRJc29sYXRlVGFnKCJkaXNw
+YXRjaF9yZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnKHtE
+T01FcnJvcjpKLnZCLERPTUltcGxlbWVudGF0aW9uOkoudkIsTWVkaWFFcnJvcjpKLnZCLE5hdmlnYXRv
+cjpKLnZCLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLnZCLE5hdmlnYXRvclVzZXJNZWRpYUVy
+cm9yOkoudkIsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6Si52QixQb3NpdGlvbkVycm9yOkoudkIsUmFuZ2U6
+Si52QixTUUxFcnJvcjpKLnZCLERhdGFWaWV3OkguRVQsQXJyYXlCdWZmZXJWaWV3OkguRVQsRmxvYXQz
+MkFycmF5OkguRGcsRmxvYXQ2NEFycmF5OkguRGcsSW50MTZBcnJheTpILnhqLEludDMyQXJyYXk6SC5k
+RSxJbnQ4QXJyYXk6SC5aQSxVaW50MTZBcnJheTpILndmLFVpbnQzMkFycmF5OkguUHEsVWludDhDbGFt
+cGVkQXJyYXk6SC5lRSxDYW52YXNQaXhlbEFycmF5OkguZUUsVWludDhBcnJheTpILlY2LEhUTUxBdWRp
+b0VsZW1lbnQ6Vy5xRSxIVE1MQlJFbGVtZW50OlcucUUsSFRNTEJ1dHRvbkVsZW1lbnQ6Vy5xRSxIVE1M
+Q2FudmFzRWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFFLEhUTUxETGlzdEVsZW1lbnQ6
+Vy5xRSxIVE1MRGF0YUVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVtZW50OlcucUUsSFRNTERldGFp
+bHNFbGVtZW50OlcucUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1MRGl2RWxlbWVudDpXLnFFLEhU
+TUxFbWJlZEVsZW1lbnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50OlcucUUsSFRNTEhSRWxlbWVudDpX
+LnFFLEhUTUxIZWFkRWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVudDpXLnFFLEhUTUxIdG1sRWxl
+bWVudDpXLnFFLEhUTUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdlRWxlbWVudDpXLnFFLEhUTUxJ
+bnB1dEVsZW1lbnQ6Vy5xRSxIVE1MTElFbGVtZW50OlcucUUsSFRNTExhYmVsRWxlbWVudDpXLnFFLEhU
+TUxMZWdlbmRFbGVtZW50OlcucUUsSFRNTExpbmtFbGVtZW50OlcucUUsSFRNTE1hcEVsZW1lbnQ6Vy5x
+RSxIVE1MTWVkaWFFbGVtZW50OlcucUUsSFRNTE1lbnVFbGVtZW50OlcucUUsSFRNTE1ldGFFbGVtZW50
+OlcucUUsSFRNTE1ldGVyRWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50OlcucUUsSFRNTE9MaXN0RWxl
+bWVudDpXLnFFLEhUTUxPYmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdyb3VwRWxlbWVudDpXLnFFLEhU
+TUxPcHRpb25FbGVtZW50OlcucUUsSFRNTE91dHB1dEVsZW1lbnQ6Vy5xRSxIVE1MUGFyYW1FbGVtZW50
+OlcucUUsSFRNTFBpY3R1cmVFbGVtZW50OlcucUUsSFRNTFByZUVsZW1lbnQ6Vy5xRSxIVE1MUHJvZ3Jl
+c3NFbGVtZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxTY3JpcHRFbGVtZW50OlcucUUs
+SFRNTFNoYWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5xRSxIVE1MU291cmNlRWxlbWVu
+dDpXLnFFLEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVD
+YXB0aW9uRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlRGF0YUNl
+bGxFbGVtZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVDb2xF
+bGVtZW50OlcucUUsSFRNTFRleHRBcmVhRWxlbWVudDpXLnFFLEhUTUxUaW1lRWxlbWVudDpXLnFFLEhU
+TUxUaXRsZUVsZW1lbnQ6Vy5xRSxIVE1MVHJhY2tFbGVtZW50OlcucUUsSFRNTFVMaXN0RWxlbWVudDpX
+LnFFLEhUTUxVbmtub3duRWxlbWVudDpXLnFFLEhUTUxWaWRlb0VsZW1lbnQ6Vy5xRSxIVE1MRGlyZWN0
+b3J5RWxlbWVudDpXLnFFLEhUTUxGb250RWxlbWVudDpXLnFFLEhUTUxGcmFtZUVsZW1lbnQ6Vy5xRSxI
+VE1MRnJhbWVTZXRFbGVtZW50OlcucUUsSFRNTE1hcnF1ZWVFbGVtZW50OlcucUUsSFRNTEVsZW1lbnQ6
+Vy5xRSxIVE1MQW5jaG9yRWxlbWVudDpXLkdoLEhUTUxBcmVhRWxlbWVudDpXLmZZLEhUTUxCYXNlRWxl
+bWVudDpXLm5CLEJsb2I6Vy5BeixIVE1MQm9keUVsZW1lbnQ6Vy5RUCxDREFUQVNlY3Rpb246Vy5ueCxD
+aGFyYWN0ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJbnN0cnVjdGlvbjpXLm54LFRl
+eHQ6Vy5ueCxDU1NTdHlsZURlY2xhcmF0aW9uOlcub0osTVNTdHlsZUNTU1Byb3BlcnRpZXM6Vy5vSixD
+U1MyUHJvcGVydGllczpXLm9KLFhNTERvY3VtZW50OlcuUUYsRG9jdW1lbnQ6Vy5RRixET01FeGNlcHRp
+b246Vy5OaCxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tlbkxpc3Q6Vy5uNyxFbGVtZW50OlcuY3Ys
+QWJvcnRQYXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVudDpXLmVhLEFuaW1hdGlvblBsYXliYWNr
+RXZlbnQ6Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaENs
+aWNrRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaEZhaWxF
+dmVudDpXLmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5lYSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZl
+bnQ6Vy5lYSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JFdmVudDpXLmVhLENhbk1ha2VQYXltZW50
+RXZlbnQ6Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3NlRXZlbnQ6Vy5lYSxDdXN0b21FdmVudDpX
+LmVhLERldmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3JpZW50YXRpb25FdmVudDpXLmVhLEVycm9y
+RXZlbnQ6Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OlcuZWEs
+RmV0Y2hFdmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50OlcuZWEsRm9yZWlnbkZldGNoRXZlbnQ6
+Vy5lYSxHYW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZlbnQ6Vy5lYSxJbnN0YWxsRXZlbnQ6Vy5l
+YSxNZWRpYUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6Vy5lYSxNZWRpYVF1
+ZXJ5TGlzdEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpXLmVhLE1lZGlhU3RyZWFtVHJhY2tFdmVu
+dDpXLmVhLE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0aW9uRXZlbnQ6Vy5lYSxNSURJTWVzc2Fn
+ZUV2ZW50OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlmaWNhdGlvbkV2ZW50OlcuZWEsUGFnZVRy
+YW5zaXRpb25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZlbnQ6Vy5lYSxQYXltZW50UmVxdWVzdFVw
+ZGF0ZUV2ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFp
+bGFibGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OlcuZWEsUHJvbWlz
+ZVJlamVjdGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEsUlRDRGF0YUNoYW5uZWxFdmVudDpXLmVh
+LFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OlcuZWEs
+UlRDVHJhY2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6Vy5lYSxTZW5zb3JF
+cnJvckV2ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJvcjpXLmVhLFNwZWVjaFJlY29nbml0aW9u
+RXZlbnQ6Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVhLFN0b3JhZ2VFdmVudDpXLmVhLFN5bmNF
+dmVudDpXLmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxXZWJLaXRUcmFuc2l0
+aW9uRXZlbnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJEaXNwbGF5RXZlbnQ6Vy5lYSxWUlNlc3Np
+b25FdmVudDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6Vy5lYSxVU0JDb25uZWN0aW9uRXZl
+bnQ6Vy5lYSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxBdWRpb1Byb2Nlc3NpbmdFdmVudDpXLmVh
+LE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdlYkdMQ29udGV4dEV2ZW50OlcuZWEsRXZl
+bnQ6Vy5lYSxJbnB1dEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxGaWxlOlcuVDUsSFRNTEZvcm1F
+bGVtZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZiLFhNTEh0dHBSZXF1ZXN0Olcu
+TzcsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLExvY2F0aW9uOlcu
+dTgsTW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJFdmVudDpXLkFqLFdoZWVsRXZl
+bnQ6Vy5BaixEb2N1bWVudEZyYWdtZW50OlcudUgsU2hhZG93Um9vdDpXLnVILERvY3VtZW50VHlwZTpX
+LnVILE5vZGU6Vy51SCxOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6Vy5CSCxIVE1MUGFyYWdyYXBo
+RWxlbWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6Vy5ldyxI
+VE1MU2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5UYixIVE1MVGFibGVSb3dFbGVt
+ZW50OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5CVCxIVE1MVGVtcGxhdGVFbGVtZW50Olcu
+eVksQ29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixLZXlib2FyZEV2ZW50OlcudzYs
+VGV4dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53NixXaW5kb3c6Vy5LNSxET01X
+aW5kb3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNlcnZpY2VXb3JrZXJHbG9i
+YWxTY29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sV29ya2VyR2xvYmFsU2NvcGU6
+Vy5DbSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53NCxOYW1lZE5vZGVNYXA6Vy5y
+aCxNb3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNWR1NjcmlwdEVsZW1lbnQ6UC5u
+ZCxTVkdBRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGVFbGVtZW50OlAuZDUsU1ZHQW5pbWF0ZU1vdGlvbkVs
+ZW1lbnQ6UC5kNSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGlvbkVsZW1l
+bnQ6UC5kNSxTVkdDaXJjbGVFbGVtZW50OlAuZDUsU1ZHQ2xpcFBhdGhFbGVtZW50OlAuZDUsU1ZHRGVm
+c0VsZW1lbnQ6UC5kNSxTVkdEZXNjRWxlbWVudDpQLmQ1LFNWR0Rpc2NhcmRFbGVtZW50OlAuZDUsU1ZH
+RWxsaXBzZUVsZW1lbnQ6UC5kNSxTVkdGRUJsZW5kRWxlbWVudDpQLmQ1LFNWR0ZFQ29sb3JNYXRyaXhF
+bGVtZW50OlAuZDUsU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6UC5kNSxTVkdGRUNvbXBvc2l0
+ZUVsZW1lbnQ6UC5kNSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQLmQ1LFNWR0ZFRGlmZnVzZUxp
+Z2h0aW5nRWxlbWVudDpQLmQ1LFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudDpQLmQ1LFNWR0ZFRGlz
+dGFudExpZ2h0RWxlbWVudDpQLmQ1LFNWR0ZFRmxvb2RFbGVtZW50OlAuZDUsU1ZHRkVGdW5jQUVsZW1l
+bnQ6UC5kNSxTVkdGRUZ1bmNCRWxlbWVudDpQLmQ1LFNWR0ZFRnVuY0dFbGVtZW50OlAuZDUsU1ZHRkVG
+dW5jUkVsZW1lbnQ6UC5kNSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6UC5kNSxTVkdGRUltYWdlRWxl
+bWVudDpQLmQ1LFNWR0ZFTWVyZ2VFbGVtZW50OlAuZDUsU1ZHRkVNZXJnZU5vZGVFbGVtZW50OlAuZDUs
+U1ZHRkVNb3JwaG9sb2d5RWxlbWVudDpQLmQ1LFNWR0ZFT2Zmc2V0RWxlbWVudDpQLmQ1LFNWR0ZFUG9p
+bnRMaWdodEVsZW1lbnQ6UC5kNSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50OlAuZDUsU1ZHRkVT
+cG90TGlnaHRFbGVtZW50OlAuZDUsU1ZHRkVUaWxlRWxlbWVudDpQLmQ1LFNWR0ZFVHVyYnVsZW5jZUVs
+ZW1lbnQ6UC5kNSxTVkdGaWx0ZXJFbGVtZW50OlAuZDUsU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6UC5k
+NSxTVkdHRWxlbWVudDpQLmQ1LFNWR0dlb21ldHJ5RWxlbWVudDpQLmQ1LFNWR0dyYXBoaWNzRWxlbWVu
+dDpQLmQ1LFNWR0ltYWdlRWxlbWVudDpQLmQ1LFNWR0xpbmVFbGVtZW50OlAuZDUsU1ZHTGluZWFyR3Jh
+ZGllbnRFbGVtZW50OlAuZDUsU1ZHTWFya2VyRWxlbWVudDpQLmQ1LFNWR01hc2tFbGVtZW50OlAuZDUs
+U1ZHTWV0YWRhdGFFbGVtZW50OlAuZDUsU1ZHUGF0aEVsZW1lbnQ6UC5kNSxTVkdQYXR0ZXJuRWxlbWVu
+dDpQLmQ1LFNWR1BvbHlnb25FbGVtZW50OlAuZDUsU1ZHUG9seWxpbmVFbGVtZW50OlAuZDUsU1ZHUmFk
+aWFsR3JhZGllbnRFbGVtZW50OlAuZDUsU1ZHUmVjdEVsZW1lbnQ6UC5kNSxTVkdTZXRFbGVtZW50OlAu
+ZDUsU1ZHU3RvcEVsZW1lbnQ6UC5kNSxTVkdTdHlsZUVsZW1lbnQ6UC5kNSxTVkdTVkdFbGVtZW50OlAu
+ZDUsU1ZHU3dpdGNoRWxlbWVudDpQLmQ1LFNWR1N5bWJvbEVsZW1lbnQ6UC5kNSxTVkdUU3BhbkVsZW1l
+bnQ6UC5kNSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5kNSxTVkdUZXh0RWxlbWVudDpQLmQ1LFNWR1Rl
+eHRQYXRoRWxlbWVudDpQLmQ1LFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQ6UC5kNSxTVkdUaXRsZUVs
+ZW1lbnQ6UC5kNSxTVkdVc2VFbGVtZW50OlAuZDUsU1ZHVmlld0VsZW1lbnQ6UC5kNSxTVkdHcmFkaWVu
+dEVsZW1lbnQ6UC5kNSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudDpQLmQ1LFNWR0ZF
+RHJvcFNoYWRvd0VsZW1lbnQ6UC5kNSxTVkdNUGF0aEVsZW1lbnQ6UC5kNSxTVkdFbGVtZW50OlAuZDV9
+KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJvcjp0cnVlLERPTUltcGxlbWVu
+dGF0aW9uOnRydWUsTWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVlLE5hdmlnYXRvckNvbmN1cnJl
+bnRIYXJkd2FyZTp0cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRydWUsT3ZlcmNvbnN0cmFpbmVk
+RXJyb3I6dHJ1ZSxQb3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxTUUxFcnJvcjp0cnVlLERhdGFW
+aWV3OnRydWUsQXJyYXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJheTp0cnVlLEZsb2F0NjRBcnJh
+eTp0cnVlLEludDE2QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50OEFycmF5OnRydWUsVWludDE2
+QXJyYXk6dHJ1ZSxVaW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFycmF5OnRydWUsQ2FudmFzUGl4
+ZWxBcnJheTp0cnVlLFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxlbWVudDp0cnVlLEhUTUxCUkVs
+ZW1lbnQ6dHJ1ZSxIVE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52YXNFbGVtZW50OnRydWUsSFRN
+TENvbnRlbnRFbGVtZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVlLEhUTUxEYXRhRWxlbWVudDp0
+cnVlLEhUTUxEYXRhTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0VsZW1lbnQ6dHJ1ZSxIVE1MRGlh
+bG9nRWxlbWVudDp0cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVtYmVkRWxlbWVudDp0cnVlLEhU
+TUxGaWVsZFNldEVsZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUsSFRNTEhlYWRFbGVtZW50OnRy
+dWUsSFRNTEhlYWRpbmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50OnRydWUsSFRNTElGcmFtZUVs
+ZW1lbnQ6dHJ1ZSxIVE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0RWxlbWVudDp0cnVlLEhUTUxM
+SUVsZW1lbnQ6dHJ1ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExlZ2VuZEVsZW1lbnQ6dHJ1ZSxI
+VE1MTGlua0VsZW1lbnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhUTUxNZWRpYUVsZW1lbnQ6dHJ1
+ZSxIVE1MTWVudUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0ZXJFbGVtZW50
+OnRydWUsSFRNTE1vZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50OnRydWUsSFRNTE9iamVjdEVs
+ZW1lbnQ6dHJ1ZSxIVE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9wdGlvbkVsZW1lbnQ6dHJ1ZSxI
+VE1MT3V0cHV0RWxlbWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1ZSxIVE1MUGljdHVyZUVsZW1l
+bnQ6dHJ1ZSxIVE1MUHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0VsZW1lbnQ6dHJ1ZSxIVE1MUXVv
+dGVFbGVtZW50OnRydWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1MU2hhZG93RWxlbWVudDp0cnVl
+LEhUTUxTbG90RWxlbWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRydWUsSFRNTFNwYW5FbGVtZW50
+OnRydWUsSFRNTFN0eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OnRydWUsSFRN
+TFRhYmxlQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFi
+bGVIZWFkZXJDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1lbnQ6dHJ1ZSxIVE1MVGV4dEFy
+ZWFFbGVtZW50OnRydWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRpdGxlRWxlbWVudDp0cnVlLEhU
+TUxUcmFja0VsZW1lbnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUsSFRNTFVua25vd25FbGVtZW50
+OnRydWUsSFRNTFZpZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlFbGVtZW50OnRydWUsSFRNTEZv
+bnRFbGVtZW50OnRydWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxGcmFtZVNldEVsZW1lbnQ6dHJ1
+ZSxIVE1MTWFycXVlZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxzZSxIVE1MQW5jaG9yRWxlbWVu
+dDp0cnVlLEhUTUxBcmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVudDp0cnVlLEJsb2I6ZmFsc2Us
+SFRNTEJvZHlFbGVtZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hhcmFjdGVyRGF0YTp0cnVlLENv
+bW1lbnQ6dHJ1ZSxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0OnRydWUsQ1NTU3R5bGVEZWNs
+YXJhdGlvbjp0cnVlLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NTMlByb3BlcnRpZXM6dHJ1ZSxY
+TUxEb2N1bWVudDp0cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlvbjp0cnVlLERPTVJlY3RSZWFk
+T25seTpmYWxzZSxET01Ub2tlbkxpc3Q6dHJ1ZSxFbGVtZW50OmZhbHNlLEFib3J0UGF5bWVudEV2ZW50
+OnRydWUsQW5pbWF0aW9uRXZlbnQ6dHJ1ZSxBbmltYXRpb25QbGF5YmFja0V2ZW50OnRydWUsQXBwbGlj
+YXRpb25DYWNoZUVycm9yRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OnRydWUsQmFj
+a2dyb3VuZEZldGNoRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6dHJ1ZSxCYWNrZ3Jv
+dW5kRmV0Y2hlZEV2ZW50OnRydWUsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OnRydWUsQmVmb3JlVW5s
+b2FkRXZlbnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1ZSxDYW5NYWtlUGF5bWVudEV2ZW50OnRydWUsQ2xpcGJv
+YXJkRXZlbnQ6dHJ1ZSxDbG9zZUV2ZW50OnRydWUsQ3VzdG9tRXZlbnQ6dHJ1ZSxEZXZpY2VNb3Rpb25F
+dmVudDp0cnVlLERldmljZU9yaWVudGF0aW9uRXZlbnQ6dHJ1ZSxFcnJvckV2ZW50OnRydWUsRXh0ZW5k
+YWJsZUV2ZW50OnRydWUsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDp0cnVlLEZldGNoRXZlbnQ6dHJ1ZSxG
+b250RmFjZVNldExvYWRFdmVudDp0cnVlLEZvcmVpZ25GZXRjaEV2ZW50OnRydWUsR2FtZXBhZEV2ZW50
+OnRydWUsSGFzaENoYW5nZUV2ZW50OnRydWUsSW5zdGFsbEV2ZW50OnRydWUsTWVkaWFFbmNyeXB0ZWRF
+dmVudDp0cnVlLE1lZGlhS2V5TWVzc2FnZUV2ZW50OnRydWUsTWVkaWFRdWVyeUxpc3RFdmVudDp0cnVl
+LE1lZGlhU3RyZWFtRXZlbnQ6dHJ1ZSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6dHJ1ZSxNZXNzYWdlRXZl
+bnQ6dHJ1ZSxNSURJQ29ubmVjdGlvbkV2ZW50OnRydWUsTUlESU1lc3NhZ2VFdmVudDp0cnVlLE11dGF0
+aW9uRXZlbnQ6dHJ1ZSxOb3RpZmljYXRpb25FdmVudDp0cnVlLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6dHJ1
+ZSxQYXltZW50UmVxdWVzdEV2ZW50OnRydWUsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDp0cnVlLFBv
+cFN0YXRlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6dHJ1ZSxQ
+cmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDp0cnVlLFByb21pc2VSZWplY3Rpb25FdmVudDp0
+cnVlLFB1c2hFdmVudDp0cnVlLFJUQ0RhdGFDaGFubmVsRXZlbnQ6dHJ1ZSxSVENEVE1GVG9uZUNoYW5n
+ZUV2ZW50OnRydWUsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDp0cnVlLFJUQ1RyYWNrRXZlbnQ6dHJ1
+ZSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OnRydWUsU2Vuc29yRXJyb3JFdmVudDp0cnVlLFNw
+ZWVjaFJlY29nbml0aW9uRXJyb3I6dHJ1ZSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OnRydWUsU3BlZWNo
+U3ludGhlc2lzRXZlbnQ6dHJ1ZSxTdG9yYWdlRXZlbnQ6dHJ1ZSxTeW5jRXZlbnQ6dHJ1ZSxUcmFja0V2
+ZW50OnRydWUsVHJhbnNpdGlvbkV2ZW50OnRydWUsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OnRydWUsVlJE
+ZXZpY2VFdmVudDp0cnVlLFZSRGlzcGxheUV2ZW50OnRydWUsVlJTZXNzaW9uRXZlbnQ6dHJ1ZSxNb2pv
+SW50ZXJmYWNlUmVxdWVzdEV2ZW50OnRydWUsVVNCQ29ubmVjdGlvbkV2ZW50OnRydWUsSURCVmVyc2lv
+bkNoYW5nZUV2ZW50OnRydWUsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6dHJ1ZSxPZmZsaW5lQXVkaW9Db21w
+bGV0aW9uRXZlbnQ6dHJ1ZSxXZWJHTENvbnRleHRFdmVudDp0cnVlLEV2ZW50OmZhbHNlLElucHV0RXZl
+bnQ6ZmFsc2UsRXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxGb3JtRWxlbWVudDp0cnVlLEhp
+c3Rvcnk6dHJ1ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0cnVlLFhNTEh0dHBSZXF1
+ZXN0RXZlbnRUYXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRpb246dHJ1ZSxNb3VzZUV2ZW50
+OnRydWUsRHJhZ0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hlZWxFdmVudDp0cnVlLERvY3Vt
+ZW50RnJhZ21lbnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRUeXBlOnRydWUsTm9kZTpmYWxz
+ZSxOb2RlTGlzdDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFyYWdyYXBoRWxlbWVudDp0cnVl
+LFByb2dyZXNzRXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6dHJ1ZSxIVE1MU2VsZWN0RWxl
+bWVudDp0cnVlLEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVSb3dFbGVtZW50OnRydWUsSFRN
+TFRhYmxlU2VjdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVtZW50OnRydWUsQ29tcG9zaXRp
+b25FdmVudDp0cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50OnRydWUsVGV4dEV2ZW50OnRy
+dWUsVG91Y2hFdmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRydWUsRE9NV2luZG93OnRydWUs
+RGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6dHJ1
+ZSxTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNjb3BlOnRydWUsQXR0cjp0
+cnVlLENsaWVudFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2RlTWFwOnRydWUsTW96TmFtZWRB
+dHRyTWFwOnRydWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVtZW50OnRydWUsU1ZHQUVsZW1l
+bnQ6dHJ1ZSxTVkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OnRydWUs
+U1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRpb25FbGVtZW50OnRydWUsU1ZH
+Q2lyY2xlRWxlbWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVlLFNWR0RlZnNFbGVtZW50OnRy
+dWUsU1ZHRGVzY0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0cnVlLFNWR0VsbGlwc2VFbGVt
+ZW50OnRydWUsU1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDp0cnVl
+LFNWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVDb21wb3NpdGVFbGVtZW50OnRy
+dWUsU1ZHRkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1l
+bnQ6dHJ1ZSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxTVkdGRURpc3RhbnRMaWdodEVs
+ZW1lbnQ6dHJ1ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0FFbGVtZW50OnRydWUsU1ZH
+RkVGdW5jQkVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVlLFNWR0ZFRnVuY1JFbGVtZW50
+OnRydWUsU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJbWFnZUVsZW1lbnQ6dHJ1ZSxT
+VkdGRU1lcmdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDp0cnVlLFNWR0ZFTW9ycGhv
+bG9neUVsZW1lbnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxTVkdGRVBvaW50TGlnaHRFbGVt
+ZW50OnRydWUsU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFU3BvdExpZ2h0RWxl
+bWVudDp0cnVlLFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OnRydWUs
+U1ZHRmlsdGVyRWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OnRydWUsU1ZHR0VsZW1l
+bnQ6dHJ1ZSxTVkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGljc0VsZW1lbnQ6dHJ1ZSxTVkdJ
+bWFnZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xpbmVhckdyYWRpZW50RWxlbWVu
+dDp0cnVlLFNWR01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVudDp0cnVlLFNWR01ldGFkYXRh
+RWxlbWVudDp0cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVybkVsZW1lbnQ6dHJ1ZSxTVkdQ
+b2x5Z29uRWxlbWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVlLFNWR1JhZGlhbEdyYWRpZW50
+RWxlbWVudDp0cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxlbWVudDp0cnVlLFNWR1N0b3BF
+bGVtZW50OnRydWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxlbWVudDp0cnVlLFNWR1N3aXRj
+aEVsZW1lbnQ6dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNwYW5FbGVtZW50OnRydWUsU1ZH
+VGV4dENvbnRlbnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UGF0aEVsZW1l
+bnQ6dHJ1ZSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZHVGl0bGVFbGVtZW50OnRydWUs
+U1ZHVXNlRWxlbWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZHR3JhZGllbnRFbGVtZW50OnRy
+dWUsU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdGRURyb3BTaGFkb3dF
+bGVtZW50OnRydWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVudDpmYWxzZX0pCkguYjAuJG5h
+dGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4kbmF0aXZlU3VwZXJjbGFzc1Rh
+Zz0iQXJyYXlCdWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZp
+ZXciCkguRGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5XQi4kbmF0aXZl
+U3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJB
+cnJheUJ1ZmZlclZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyJ9
+KSgpCmNvbnZlcnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFzdE9iamVjdCgkKTsoZnVuY3Rp
+b24oYSl7aWYodHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2EobnVsbCkKcmV0dXJufWlmKHR5
+cGVvZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IT0ndW5kZWZpbmVkJyl7YShkb2N1bWVudC5jdXJyZW50
+U2NyaXB0KQpyZXR1cm59dmFyIHQ9ZG9jdW1lbnQuc2NyaXB0cwpmdW5jdGlvbiBvbkxvYWQoYil7Zm9y
+KHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixvbkxv
+YWQsZmFsc2UpCmEoYi50YXJnZXQpfWZvcih2YXIgcz0wO3M8dC5sZW5ndGg7KytzKXRbc10uYWRkRXZl
+bnRMaXN0ZW5lcigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9uKGEpe3YuY3VycmVudFNjcmlw
+dD1hCmlmKHR5cGVvZiBkYXJ0TWFpblJ1bm5lcj09PSJmdW5jdGlvbiIpZGFydE1haW5SdW5uZXIoTC5J
+cSxbXSkKZWxzZSBMLklxKFtdKX0pfSkoKQovLyMgc291cmNlTWFwcGluZ1VSTD1taWdyYXRpb24uanMu
+bWFwCg==
''';
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart
index 29267f3d..5817faa 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart
@@ -174,11 +174,10 @@
return 'added-region';
case RegionType.remove:
return 'removed-region';
- case RegionType.unchanged:
- return 'unchanged-region';
- default:
- return null;
+ case RegionType.informative:
+ return 'informative-region';
}
+ throw StateError('Unexpected RegionType $type');
}
int previousOffset = 0;
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
index e72631a..53b9557 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
@@ -25,7 +25,7 @@
loadNavigationTree();
if (path != '/' && path != rootPath) {
// TODO(srawlins): replaceState?
- loadFile(path, offset, lineNumber, callback: () {
+ loadFile(path, offset, lineNumber, true, callback: () {
pushState(path, offset, lineNumber);
});
}
@@ -49,10 +49,10 @@
int offset = getOffset(window.location.href);
int lineNumber = getLine(window.location.href);
if (path.length > 1) {
- loadFile(path, offset, lineNumber);
+ loadFile(path, offset, lineNumber, false);
} else {
// Blank out the page, for the index screen.
- writeCodeAndRegions(path, FileDetails.empty());
+ writeCodeAndRegions(path, FileDetails.empty(), true);
updatePage(' ', null);
}
});
@@ -79,7 +79,7 @@
});
}
-void addClickHandlers(String selector) {
+void addClickHandlers(String selector, bool clearEditDetails) {
Element parentElement = document.querySelector(selector);
// Add navigation handlers for navigation links in the source code.
@@ -88,7 +88,7 @@
link.onClick.listen((event) {
Element tableElement = document.querySelector('table[data-path]');
String parentPath = tableElement.dataset['path'];
- handleNavLinkClick(event, relativeTo: parentPath);
+ handleNavLinkClick(event, clearEditDetails, relativeTo: parentPath);
});
});
@@ -134,7 +134,8 @@
}
void handleNavLinkClick(
- MouseEvent event, {
+ MouseEvent event,
+ bool clearEditDetails, {
String relativeTo,
}) {
Element target = event.currentTarget;
@@ -153,11 +154,11 @@
int lineNumber = getLine(location);
if (offset != null) {
- navigate(path, offset, lineNumber, callback: () {
+ navigate(path, offset, lineNumber, clearEditDetails, callback: () {
pushState(path, offset, lineNumber);
});
} else {
- navigate(path, null, null, callback: () {
+ navigate(path, null, null, clearEditDetails, callback: () {
pushState(path, null, null);
});
}
@@ -202,7 +203,7 @@
if (xhr.status == 200) {
var response = EditDetails.fromJson(jsonDecode(xhr.responseText));
populateEditDetails(response);
- addClickHandlers('.edit-panel .panel-content');
+ addClickHandlers('.edit-panel .panel-content', false);
} else {
window.alert('Request failed; status of ${xhr.status}');
}
@@ -218,12 +219,13 @@
void loadFile(
String path,
int offset,
- int line, {
+ int line,
+ bool clearEditDetails, {
VoidCallback callback,
}) {
// Handle the case where we're requesting a directory.
if (!path.endsWith('.dart')) {
- writeCodeAndRegions(path, FileDetails.empty());
+ writeCodeAndRegions(path, FileDetails.empty(), clearEditDetails);
updatePage(path);
if (callback != null) {
callback();
@@ -239,7 +241,8 @@
).then((HttpRequest xhr) {
if (xhr.status == 200) {
Map<String, dynamic> response = jsonDecode(xhr.responseText);
- writeCodeAndRegions(path, FileDetails.fromJson(response));
+ writeCodeAndRegions(
+ path, FileDetails.fromJson(response), clearEditDetails);
maybeScrollToAndHighlight(offset, line);
String filePathPart =
path.contains('?') ? path.substring(0, path.indexOf('?')) : path;
@@ -287,11 +290,22 @@
window.console.error('$st');
}
+final Element headerPanel = document.querySelector('header');
+final Element footerPanel = document.querySelector('footer');
+
+/// Scroll an element into view if it is not visible.
void maybeScrollIntoView(Element element) {
Rectangle rect = element.getBoundingClientRect();
- if (rect.bottom > window.innerHeight) {
+ // A line of text in the code view is 14px high. Including it here means we
+ // only choose to _not_ scroll a line of code into view if the entire line is
+ // visible.
+ var lineHeight = 14;
+ var visibleCeiling = headerPanel.offsetHeight + lineHeight;
+ var visibleFloor =
+ window.innerHeight - (footerPanel.offsetHeight + lineHeight);
+ if (rect.bottom > visibleFloor) {
element.scrollIntoView();
- } else if (rect.top < 0) {
+ } else if (rect.top < visibleCeiling) {
element.scrollIntoView();
}
}
@@ -324,8 +338,7 @@
} else {
// If no offset is given, this is likely a navigation link, and we need to
// scroll back to the top of the page.
- target = document.getElementById('unit-name');
- maybeScrollIntoView(target);
+ maybeScrollIntoView(unitName);
}
}
@@ -336,7 +349,8 @@
void navigate(
String path,
int offset,
- int lineNumber, {
+ int lineNumber,
+ bool clearEditDetails, {
VoidCallback callback,
}) {
int currentOffset = getOffset(window.location.href);
@@ -349,7 +363,7 @@
callback();
}
} else {
- loadFile(path, offset, lineNumber, callback: callback);
+ loadFile(path, offset, lineNumber, clearEditDetails, callback: callback);
}
}
@@ -357,8 +371,9 @@
return count == 1 ? single : (multiple ?? '${single}s');
}
+final Element editPanel = document.querySelector('.edit-panel .panel-content');
+
void populateEditDetails([EditDetails response]) {
- var editPanel = document.querySelector('.edit-panel .panel-content');
editPanel.innerHtml = '';
if (response == null) {
@@ -378,65 +393,17 @@
int line = response.line;
Element explanation = editPanel.append(document.createElement('p'));
explanation.append(Text('$explanationMessage at $relPath:$line.'));
- int detailCount = response.details.length;
- if (detailCount == 0) {
- // Having 0 details is not necessarily an expected possibility, but handling
- // the possibility prevents awkward text, "for 0 reasons:".
- } else {
- editPanel.append(ParagraphElement()..text = 'Edit rationale:');
-
- Element detailList = editPanel.append(document.createElement('ul'));
- for (var detail in response.details) {
- var detailItem = detailList.append(document.createElement('li'));
- detailItem.append(Text(detail.description));
- var link = detail.link;
- if (link != null) {
- detailItem.append(Text(' ('));
- detailItem.append(_aElementForLink(link, parentDirectory));
- detailItem.append(Text(')'));
- }
- }
- }
-
- if (response.edits != null) {
- for (var edit in response.edits) {
- Element editParagraph = editPanel.append(document.createElement('p'));
- Element a = editParagraph.append(document.createElement('a'));
- a.append(Text(edit.description));
- a.setAttribute('href', edit.href);
- a.classes = ['post-link', 'before-apply'];
- }
- }
-
- for (var trace in response.traces) {
- var traceParagraph =
- editPanel.append(document.createElement('p')..classes = ['trace']);
- traceParagraph.append(Text('Nullability trace for: '));
- traceParagraph.append(document.createElement('span')
- ..classes = ['type-description']
- ..append(Text(trace.description)));
- var ul = traceParagraph
- .append(document.createElement('ul')..classes = ['trace']);
- for (var entry in trace.entries) {
- var li = ul.append(document.createElement('li')..innerHtml = '❏ ');
- li.append(document.createElement('span')
- ..classes = ['function']
- ..append(Text(entry.function ?? 'unknown')));
- var link = entry.link;
- if (link != null) {
- li.append(Text(' ('));
- li.append(_aElementForLink(link, parentDirectory));
- li.append(Text(')'));
- }
- li.append(Text(': '));
- li.append(Text(entry.description));
- }
- }
+ _populateEditTraces(response, editPanel, parentDirectory);
+ _populateEditLinks(response, editPanel);
+ _populateEditRationale(response, editPanel, parentDirectory);
}
+final Element editListElement =
+ document.querySelector('.edit-list .panel-content');
+
/// Write the contents of the Edit List, from JSON data [editListData].
-void populateProposedEdits(String path, List<EditListItem> edits) {
- Element editListElement = document.querySelector('.edit-list .panel-content');
+void populateProposedEdits(
+ String path, List<EditListItem> edits, bool clearEditDetails) {
editListElement.innerHtml = '';
Element p = editListElement.append(document.createElement('p'));
@@ -459,7 +426,7 @@
anchor.dataset['line'] = '$line';
anchor.append(Text('line $line'));
anchor.onClick.listen((MouseEvent event) {
- navigate(window.location.pathname, offset, line, callback: () {
+ navigate(window.location.pathname, offset, line, true, callback: () {
pushState(window.location.pathname, offset, line);
});
loadAndPopulateEditDetails(path, offset);
@@ -467,8 +434,9 @@
item.append(Text(': ${edit.explanation}'));
}
- // Clear out any existing edit details.
- populateEditDetails();
+ if (clearEditDetails) {
+ populateEditDetails();
+ }
}
void pushState(String path, int offset, int line) {
@@ -509,13 +477,14 @@
}
}
+final Element unitName = document.querySelector('#unit-name');
+
/// Update the heading and navigation links.
///
/// Call this after updating page content on a navigation.
void updatePage(String path, [int offset]) {
path = relativePath(path);
// Update page heading.
- Element unitName = document.querySelector('#unit-name');
unitName.text = path;
// Update navigation styles.
document.querySelectorAll('.nav-panel .nav-link').forEach((Element link) {
@@ -529,17 +498,17 @@
}
/// Load data from [data] into the .code and the .regions divs.
-void writeCodeAndRegions(String path, FileDetails data) {
+void writeCodeAndRegions(String path, FileDetails data, bool clearEditDetails) {
Element regionsElement = document.querySelector('.regions');
Element codeElement = document.querySelector('.code');
_PermissiveNodeValidator.setInnerHtml(regionsElement, data.regions);
_PermissiveNodeValidator.setInnerHtml(codeElement, data.navigationContent);
- populateProposedEdits(path, data.edits);
+ populateProposedEdits(path, data.edits, clearEditDetails);
highlightAllCode();
- addClickHandlers('.code');
- addClickHandlers('.regions');
+ addClickHandlers('.code', true);
+ addClickHandlers('.regions', true);
}
void writeNavigationSubtree(
@@ -564,7 +533,7 @@
a.dataset['name'] = entity.path;
a.setAttribute('href', entity.href);
a.append(Text(entity.name));
- a.onClick.listen(handleNavLinkClick);
+ a.onClick.listen((MouseEvent event) => handleNavLinkClick(event, true));
int editCount = entity.editCount;
if (editCount > 0) {
Element editsBadge = li.append(document.createElement('span'));
@@ -590,6 +559,70 @@
return a;
}
+void _populateEditLinks(EditDetails response, Element editPanel) {
+ if (response.edits != null) {
+ for (var edit in response.edits) {
+ Element editParagraph = editPanel.append(document.createElement('p'));
+ Element a = editParagraph.append(document.createElement('a'));
+ a.append(Text(edit.description));
+ a.setAttribute('href', edit.href);
+ a.classes = ['post-link', 'before-apply'];
+ }
+ }
+}
+
+void _populateEditRationale(
+ EditDetails response, Element editPanel, String parentDirectory) {
+ int detailCount = response.details.length;
+ if (detailCount == 0) {
+ // Having 0 details is not necessarily an expected possibility, but handling
+ // the possibility prevents awkward text, "for 0 reasons:".
+ } else {
+ editPanel
+ .append(ParagraphElement()..text = 'Edit rationale (experimental):');
+
+ Element detailList = editPanel.append(document.createElement('ul'));
+ for (var detail in response.details) {
+ var detailItem = detailList.append(document.createElement('li'));
+ detailItem.append(Text(detail.description));
+ var link = detail.link;
+ if (link != null) {
+ detailItem.append(Text(' ('));
+ detailItem.append(_aElementForLink(link, parentDirectory));
+ detailItem.append(Text(')'));
+ }
+ }
+ }
+}
+
+void _populateEditTraces(
+ EditDetails response, Element editPanel, String parentDirectory) {
+ for (var trace in response.traces) {
+ var traceParagraph =
+ editPanel.append(document.createElement('p')..classes = ['trace']);
+ traceParagraph.append(document.createElement('span')
+ ..classes = ['type-description']
+ ..append(Text(trace.description)));
+ traceParagraph.append(Text(':'));
+ var ul = traceParagraph
+ .append(document.createElement('ul')..classes = ['trace']);
+ for (var entry in trace.entries) {
+ var li = ul.append(document.createElement('li')..innerHtml = '❏ ');
+ li.append(document.createElement('span')
+ ..classes = ['function']
+ ..append(Text(entry.function ?? 'unknown')));
+ var link = entry.link;
+ if (link != null) {
+ li.append(Text(' ('));
+ li.append(_aElementForLink(link, parentDirectory));
+ li.append(Text(')'));
+ }
+ li.append(Text(': '));
+ li.append(Text(entry.description));
+ }
+ }
+}
+
class _PermissiveNodeValidator implements NodeValidator {
static _PermissiveNodeValidator instance = _PermissiveNodeValidator();
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index 98ce643..edb8e87 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -4,6 +4,8 @@
import 'dart:async';
+import 'package:analysis_server/src/protocol_server.dart'
+ show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -16,10 +18,8 @@
show GenericInferrer, LibraryScope;
import 'package:analyzer/src/generated/type_system.dart' show GenericInferrer;
-import '../../../protocol_server.dart' show CompletionSuggestion;
-
-/// A contributor for calculating suggestions based on the members of
-/// extensions.
+/// A contributor that produces suggestions based on the members of an
+/// extension.
class ExtensionMemberContributor extends DartCompletionContributor {
MemberSuggestionBuilder builder;
@@ -27,15 +27,15 @@
Future<List<CompletionSuggestion>> computeSuggestions(
DartCompletionRequest request) async {
LibraryElement containingLibrary = request.libraryElement;
- // Gracefully degrade if the library element is not resolved
- // e.g. detached part file or source change
+ // Gracefully degrade if the library could not be determined, such as with a
+ // detached part file or source change.
if (containingLibrary == null) {
return const <CompletionSuggestion>[];
}
- builder = MemberSuggestionBuilder(containingLibrary);
+ builder = MemberSuggestionBuilder(request);
- // Recompute the target since resolution may have changed it.
+ // Recompute the target because resolution might have changed it.
Expression expression = request.dotTarget;
if (expression == null) {
@@ -48,12 +48,18 @@
var extension = request.target.containingNode
.thisOrAncestorOfType<ExtensionDeclaration>();
if (extension != null) {
- var type = extension.extendedType.type;
- if (type is InterfaceType) {
+ var extendedType = extension.extendedType.type;
+ if (extendedType is InterfaceType) {
var types = <InterfaceType>[];
- ClassElementImpl.collectAllSupertypes(types, type, null);
+ ClassElementImpl.collectAllSupertypes(types, extendedType, null);
for (var type in types) {
- _addTypeMembers(type);
+ double inheritanceDistance;
+ if (request.useNewRelevance) {
+ inheritanceDistance = builder.request.featureComputer
+ .inheritanceDistanceFeature(
+ extendedType.element, type.element);
+ }
+ _addTypeMembers(type, inheritanceDistance);
}
}
}
@@ -68,28 +74,27 @@
if (expression is Identifier) {
Element elem = expression.staticElement;
if (elem is ClassElement) {
- // Suggestions provided by StaticMemberContributor
+ // Suggestions provided by StaticMemberContributor.
return const <CompletionSuggestion>[];
} else if (elem is ExtensionElement) {
- // Suggestions provided by StaticMemberContributor
+ // Suggestions provided by StaticMemberContributor.
return const <CompletionSuggestion>[];
} else if (elem is PrefixElement) {
- // Suggestions provided by LibraryMemberContributor
+ // Suggestions provided by LibraryMemberContributor.
return const <CompletionSuggestion>[];
}
}
if (expression is ExtensionOverride) {
- _addInstanceMembers(expression.staticElement);
+ _addInstanceMembers(expression.staticElement, -1.0);
} else {
var type = expression.staticType;
if (type == null) {
- // Without a type we cannot find the extensions that apply.
- // We shouldn't get to this point, but there's an NPE if we invoke
+ // Without a type we can't find the extensions that apply. We shouldn't
+ // get to this point, but there's an NPE if we invoke
// `_resolveExtendedType` when `type` is `null`, so we guard against it
// to ensure that we can return the suggestions from other providers.
return const <CompletionSuggestion>[];
}
-
_addExtensionMembers(containingLibrary, type);
expression.staticType;
}
@@ -103,42 +108,42 @@
var extendedType =
_resolveExtendedType(containingLibrary, extension, type);
if (extendedType != null && typeSystem.isSubtypeOf(type, extendedType)) {
+ double inheritanceDistance;
+ if (builder.request.useNewRelevance) {
+ inheritanceDistance = builder.request.featureComputer
+ .inheritanceDistanceFeature(type.element, extendedType.element);
+ }
// TODO(brianwilkerson) We might want to apply the substitution to the
// members of the extension for display purposes.
- _addInstanceMembers(extension);
+ _addInstanceMembers(extension, inheritanceDistance);
}
}
}
- void _addInstanceMembers(ExtensionElement extension) {
- for (MethodElement method in extension.methods) {
+ void _addInstanceMembers(
+ ExtensionElement extension, double inheritanceDistance) {
+ for (var method in extension.methods) {
if (!method.isStatic) {
- builder.addSuggestion(method);
+ builder.addSuggestionForMethod(
+ method: method, inheritanceDistance: inheritanceDistance);
}
}
- for (PropertyAccessorElement accessor in extension.accessors) {
+ for (var accessor in extension.accessors) {
if (!accessor.isStatic) {
- builder.addSuggestion(accessor);
+ builder.addSuggestionForAccessor(
+ accessor: accessor, inheritanceDistance: inheritanceDistance);
}
}
}
- void _addTypeMembers(InterfaceType type) {
- for (var elem in type.methods) {
- builder.addSuggestion(elem);
+ void _addTypeMembers(InterfaceType type, double inheritanceDistance) {
+ for (var method in type.methods) {
+ builder.addSuggestionForMethod(
+ method: method, inheritanceDistance: inheritanceDistance);
}
- var variables = <Element>{};
- for (var elem in type.accessors) {
- if (elem.isSynthetic) {
- var variable = elem.variable;
- // Ensure we don't have duplicate suggestions for accessors of non-final
- // fields (which have a getter and setter).
- if (variables.add(variable)) {
- builder.addSuggestion(elem.variable);
- }
- } else {
- builder.addSuggestion(elem);
- }
+ for (var accessor in type.accessors) {
+ builder.addSuggestionForAccessor(
+ accessor: accessor, inheritanceDistance: inheritanceDistance);
}
}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
index 93f984f..d4f91c3 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
@@ -7,7 +7,7 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart'
- show ClassElement, FieldElement;
+ show ClassElement, Element, FieldElement;
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/type_provider.dart';
import 'package:analyzer/dart/element/type_system.dart';
@@ -89,6 +89,11 @@
}
}
+ /// Return the value of the _has deprecated_ feature for the given [element].
+ double hasDeprecatedFeature(Element element) {
+ return element.hasDeprecated ? 0.0 : 1.0;
+ }
+
/// Return the inheritance distance between the [subclass] and the
/// [superclass]. We define the inheritance distance between two types to be
/// zero if the two types are the same and the minimum number of edges that
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
index 0267de3..c632403 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
@@ -4,6 +4,8 @@
import 'dart:async';
+import 'package:analysis_server/src/protocol_server.dart'
+ show CompletionSuggestion, CompletionSuggestionKind;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analysis_server/src/services/completion/dart/utilities.dart';
@@ -12,107 +14,117 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
-import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
-import '../../../protocol_server.dart'
- show CompletionSuggestion, CompletionSuggestionKind;
+/// A contributor that produces suggestions based on the instance members from
+/// the supertypes of a given type. More concretely, this class produces
+/// suggestions for places where an inherited instance member might be invoked
+/// via an implicit target of `this`.
+class InheritedReferenceContributor extends DartCompletionContributor {
+ /// The builder used to build the suggestions.
+ MemberSuggestionBuilder builder;
-/// Return the class containing the target
-/// or `null` if the target is in a static method or field
-/// or not in a class.
-ClassOrMixinDeclaration _enclosingClass(CompletionTarget target) {
- AstNode node = target.containingNode;
- while (node != null) {
- if (node is ClassOrMixinDeclaration) {
- return node;
- } else if (node is MethodDeclaration) {
- if (node.isStatic) {
- return null;
- }
- } else if (node is FieldDeclaration) {
- if (node.isStatic) {
- return null;
- }
- }
- node = node.parent;
- }
- return null;
-}
-
-/// A contributor for calculating suggestions for inherited references.
-class InheritedReferenceContributor extends DartCompletionContributor
- with ElementSuggestionBuilder {
- @override
- LibraryElement containingLibrary;
-
- @override
+ /// The kind of suggestion to make.
CompletionSuggestionKind kind;
@override
Future<List<CompletionSuggestion>> computeSuggestions(
DartCompletionRequest request) async {
- // TODO(brianwilkerson) Determine whether this await is necessary.
- await null;
if (!request.includeIdentifiers) {
return const <CompletionSuggestion>[];
}
- ClassOrMixinDeclaration classDecl = _enclosingClass(request.target);
- if (classDecl == null || classDecl.declaredElement == null) {
+ var member = _enclosingMember(request.target);
+ if (member == null) {
return const <CompletionSuggestion>[];
}
- containingLibrary = request.libraryElement;
- if (classDecl is ClassDeclaration) {
- return _computeSuggestionsForClass2(classDecl.declaredElement, request);
- } else if (classDecl is MixinDeclaration) {
- return _computeSuggestionsForClass2(classDecl.declaredElement, request);
+ var classOrMixin = member.parent;
+ if (classOrMixin is ClassOrMixinDeclaration &&
+ classOrMixin.declaredElement != null) {
+ builder = MemberSuggestionBuilder(request);
+ return _computeSuggestionsForClass(classOrMixin.declaredElement, request);
}
return const <CompletionSuggestion>[];
}
void _addSuggestionsForType(InterfaceType type, DartCompletionRequest request,
+ double inheritanceDistance,
{bool isFunctionalArgument = false}) {
- OpType opType = request.opType;
+ var opType = request.opType;
if (!isFunctionalArgument) {
- for (PropertyAccessorElement elem in type.accessors) {
- if (elem.isGetter) {
+ for (var accessor in type.accessors) {
+ if (accessor.isGetter) {
if (opType.includeReturnValueSuggestions) {
- addSuggestion(elem);
+ builder.addSuggestionForAccessor(
+ accessor: accessor, inheritanceDistance: inheritanceDistance);
}
} else {
if (opType.includeVoidReturnSuggestions) {
- addSuggestion(elem);
+ builder.addSuggestionForAccessor(
+ accessor: accessor, inheritanceDistance: inheritanceDistance);
}
}
}
}
- for (MethodElement elem in type.methods) {
- if (elem.returnType == null) {
- addSuggestion(elem);
- } else if (!elem.returnType.isVoid) {
+ for (var method in type.methods) {
+ if (method.returnType == null) {
+ builder.addSuggestionForMethod(
+ method: method,
+ inheritanceDistance: inheritanceDistance,
+ kind: kind);
+ } else if (!method.returnType.isVoid) {
if (opType.includeReturnValueSuggestions) {
- addSuggestion(elem);
+ builder.addSuggestionForMethod(
+ method: method,
+ inheritanceDistance: inheritanceDistance,
+ kind: kind);
}
} else {
if (opType.includeVoidReturnSuggestions) {
- CompletionSuggestion suggestion = addSuggestion(elem);
- _updateFlutterSuggestions(request, elem, suggestion);
+ var suggestion = builder.addSuggestionForMethod(
+ method: method,
+ inheritanceDistance: inheritanceDistance,
+ kind: kind);
+ _updateFlutterSuggestions(request, method, suggestion);
}
}
}
}
- List<CompletionSuggestion> _computeSuggestionsForClass2(
+ List<CompletionSuggestion> _computeSuggestionsForClass(
ClassElement classElement, DartCompletionRequest request) {
- bool isFunctionalArgument = request.target.isFunctionalArgument();
+ var isFunctionalArgument = request.target.isFunctionalArgument();
kind = isFunctionalArgument
? CompletionSuggestionKind.IDENTIFIER
: CompletionSuggestionKind.INVOCATION;
- for (InterfaceType type in classElement.allSupertypes) {
- _addSuggestionsForType(type, request,
+ for (var type in classElement.allSupertypes) {
+ double inheritanceDistance;
+ if (request.useNewRelevance) {
+ inheritanceDistance = request.featureComputer
+ .inheritanceDistanceFeature(classElement, type.element);
+ }
+ _addSuggestionsForType(type, request, inheritanceDistance,
isFunctionalArgument: isFunctionalArgument);
}
- return suggestions;
+ return builder.suggestions.toList();
+ }
+
+ /// Return the class member containing the target or `null` if the target is
+ /// in a static method or static field or not in a class member.
+ ClassMember _enclosingMember(CompletionTarget target) {
+ AstNode node = target.containingNode;
+ while (node != null) {
+ if (node is MethodDeclaration) {
+ if (!node.isStatic) {
+ return node;
+ }
+ } else if (node is FieldDeclaration) {
+ if (!node.isStatic) {
+ return node;
+ }
+ }
+ node = node.parent;
+ }
+ return null;
}
void _updateFlutterSuggestions(DartCompletionRequest request, Element element,
@@ -124,7 +136,7 @@
element.name == 'setState' &&
Flutter.of(request.result).isExactState(element.enclosingElement)) {
// Find the line indentation.
- String indent = getRequestLineIndent(request);
+ var indent = getRequestLineIndent(request);
// Let the user know that we are going to insert a complete statement.
suggestion.displayText = 'setState(() {});';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index d08d787..baff745 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -71,10 +71,10 @@
if (entity == node.rightParenthesis) {
_addExpressionKeywords(node);
Token previous = node.findPrevious(entity as Token);
- if (previous.isSynthetic) {
+ if (previous != null && previous.isSynthetic) {
previous = node.findPrevious(previous);
}
- if (previous.lexeme == ')') {
+ if (previous != null && previous.lexeme == ')') {
_addSuggestion(Keyword.ASYNC);
_addSuggestion2(ASYNC_STAR);
_addSuggestion2(SYNC_STAR);
@@ -128,14 +128,15 @@
if (expression is SimpleIdentifier) {
Token token = expression.token;
Token previous = node.findPrevious(token);
- if (previous.isSynthetic) {
+ if (previous != null && previous.isSynthetic) {
previous = node.findPrevious(previous);
}
Token next = token.next;
if (next.isSynthetic) {
next = next.next;
}
- if (previous.type == TokenType.CLOSE_PAREN &&
+ if (previous != null &&
+ previous.type == TokenType.CLOSE_PAREN &&
next.type == TokenType.OPEN_CURLY_BRACKET) {
_addSuggestion(Keyword.ASYNC);
_addSuggestion2(ASYNC_STAR);
@@ -511,6 +512,11 @@
}
}
}
+ if (entity == node.returnType || entity == node.name) {
+ // If the cursor is at the beginning of the declaration, include the class
+ // body keywords. See dartbug.com/41039.
+ _addClassBodyKeywords();
+ }
}
@override
@@ -938,7 +944,9 @@
if (entity is AstNode) {
Token token = entity.beginToken;
Token previousToken = entity.findPrevious(token);
- return previousToken.isSynthetic && previousToken.type == type;
+ return previousToken != null &&
+ previousToken.isSynthetic &&
+ previousToken.type == type;
}
return false;
}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index 0386f36..5c11d07 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -26,8 +26,6 @@
@override
Future<List<CompletionSuggestion>> computeSuggestions(
DartCompletionRequest request) async {
- // TODO(brianwilkerson) Determine whether this await is necessary.
- await null;
SimpleIdentifier targetId = _getTargetId(request.target);
if (targetId == null) {
return const <CompletionSuggestion>[];
@@ -109,7 +107,7 @@
displayTextBuffer.isNotEmpty ? displayTextBuffer.toString() : null;
CompletionSuggestion suggestion = CompletionSuggestion(
CompletionSuggestionKind.OVERRIDE,
- DART_RELEVANCE_HIGH,
+ request.useNewRelevance ? Relevance.override : DART_RELEVANCE_HIGH,
completion,
selectionRange.offset - offsetDelta,
selectionRange.length,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index f88d1ae7..988a547 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -13,6 +13,7 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/visitor.dart';
+import 'package:meta/meta.dart';
/// A contributor that produces suggestions based on the static members of a
/// given class, enum, or extension. More concretely, this class produces
@@ -107,18 +108,39 @@
return;
}
var relevance = DART_RELEVANCE_DEFAULT;
- if (request.useNewRelevance) {
+ var useNewRelevance = request.useNewRelevance;
+ if (useNewRelevance) {
var contextType = request.featureComputer
.contextTypeFeature(request.contextType, elementType);
- relevance = toRelevance(contextType, 500);
+ var hasDeprecated = request.featureComputer.hasDeprecatedFeature(element);
+ relevance = _computeRelevance(
+ contextType: contextType, hasDeprecated: hasDeprecated);
}
- CompletionSuggestion suggestion =
- createSuggestion(element, completion: completion, relevance: relevance);
+ CompletionSuggestion suggestion = createSuggestion(element,
+ completion: completion,
+ relevance: relevance,
+ useNewRelevance: useNewRelevance);
if (suggestion != null) {
suggestions.add(suggestion);
}
}
+ /// Compute a relevance value from the given feature scores:
+ /// - [contextType] is higher if the type of the element matches the context
+ /// type,
+ /// - [hasDeprecated] is higher if the element is not deprecated,
+ /// - [inheritanceDistance] is higher if the element is defined closer to the
+ /// target type,
+ /// - [startsWithDollar] is higher if the element's name doe _not_ start with
+ /// a dollar sign, and
+ /// - [superMatches] is higher if the element is being invoked through `super`
+ /// and the element's name matches the name of the enclosing method.
+ int _computeRelevance(
+ {@required double contextType, @required double hasDeprecated}) {
+ var score = weightedAverage([contextType, hasDeprecated], [1.0, 0.5]);
+ return toRelevance(score, Relevance.member);
+ }
+
/// Determine whether the [element] is one of the synthetic enum accessors
/// for which we should generate a suggestion.
bool _isSpecialEnumField(FieldElement element) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index d551db7..cda9b55 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -7,21 +7,24 @@
import 'package:analysis_server/src/protocol_server.dart' as protocol;
import 'package:analysis_server/src/protocol_server.dart'
hide Element, ElementKind;
+import 'package:analysis_server/src/protocol_server.dart'
+ show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
import 'package:analysis_server/src/services/completion/dart/utilities.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/visitor.dart';
import 'package:analyzer/src/util/comment.dart';
-
-import '../../../protocol_server.dart' show CompletionSuggestion;
+import 'package:meta/meta.dart';
/// Return a suggestion based upon the given element or `null` if a suggestion
/// is not appropriate for the given element.
CompletionSuggestion createSuggestion(Element element,
{String completion,
- CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
- int relevance = DART_RELEVANCE_DEFAULT}) {
+ CompletionSuggestionKind kind,
+ int relevance = DART_RELEVANCE_DEFAULT,
+ bool useNewRelevance = false}) {
if (element == null) {
return null;
}
@@ -30,15 +33,13 @@
return null;
}
completion ??= element.displayName;
+ kind ??= CompletionSuggestionKind.INVOCATION;
bool isDeprecated = element.hasDeprecated;
+ if (!useNewRelevance && isDeprecated) {
+ relevance = DART_RELEVANCE_LOW;
+ }
CompletionSuggestion suggestion = CompletionSuggestion(
- kind,
- isDeprecated ? DART_RELEVANCE_LOW : relevance,
- completion,
- completion.length,
- 0,
- isDeprecated,
- false);
+ kind, relevance, completion, completion.length, 0, isDeprecated, false);
// Attach docs.
String doc = getDartDocPlainText(element.documentationComment);
@@ -100,6 +101,7 @@
CompletionSuggestion addSuggestion(Element element,
{String prefix,
int relevance = DART_RELEVANCE_DEFAULT,
+ bool useNewRelevance = false,
String elementCompletion}) {
if (element.isPrivate) {
if (element.library != containingLibrary) {
@@ -118,7 +120,10 @@
return null;
}
CompletionSuggestion suggestion = createSuggestion(element,
- completion: completion, kind: kind, relevance: relevance);
+ completion: completion,
+ kind: kind,
+ relevance: relevance,
+ useNewRelevance: useNewRelevance);
if (suggestion != null) {
if (element.isSynthetic && element is PropertyAccessorElement) {
String cacheKey;
@@ -253,8 +258,8 @@
/// field, a method, or a getter/setter pair.
static const int _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET = 3;
- /// The library containing the unit in which the completion is requested.
- final LibraryElement containingLibrary;
+ /// The request for which suggestions are being built.
+ final DartCompletionRequest request;
/// Map indicating, for each possible completion identifier, whether we have
/// already generated completions for a getter, setter, or both. The "both"
@@ -265,11 +270,11 @@
/// compared.
final Map<String, int> _completionTypesGenerated = HashMap<String, int>();
- /// Map from completion identifier to completion suggestion
+ /// A map from a completion identifier to a completion suggestion.
final Map<String, CompletionSuggestion> _suggestionMap =
<String, CompletionSuggestion>{};
- MemberSuggestionBuilder(this.containingLibrary);
+ MemberSuggestionBuilder(this.request);
Iterable<CompletionSuggestion> get suggestions => _suggestionMap.values;
@@ -278,37 +283,147 @@
_suggestionMap[suggestion.completion] = suggestion;
}
- /// Add a suggestion based upon the given element, provided that it is not
- /// shadowed by a previously added suggestion.
- void addSuggestion(Element element,
- {int relevance, bool useNewRelevance = false}) {
- if (element.isPrivate) {
- if (element.library != containingLibrary) {
- // Do not suggest private members for imported libraries
- return;
+ /// Add a suggestion for the given [method].
+ CompletionSuggestion addSuggestionForAccessor(
+ {@required PropertyAccessorElement accessor,
+ String containingMethodName,
+ @required double inheritanceDistance}) {
+ int oldRelevance() {
+ if (accessor.hasDeprecated) {
+ return DART_RELEVANCE_LOW;
}
- }
- String identifier = element.displayName;
-
- if (useNewRelevance) {
- assert(relevance != null);
- } else {
- relevance ??= DART_RELEVANCE_DEFAULT;
- if (relevance == DART_RELEVANCE_DEFAULT && identifier != null) {
+ String identifier = accessor.displayName;
+ if (identifier != null && identifier.startsWith(r'$')) {
// Decrease relevance of suggestions starting with $
// https://github.com/dart-lang/sdk/issues/27303
- if (identifier.startsWith(r'$')) {
- relevance = DART_RELEVANCE_LOW;
- }
+ return DART_RELEVANCE_LOW;
}
+ return DART_RELEVANCE_DEFAULT;
}
+ if (!accessor.isAccessibleIn(request.libraryElement)) {
+ // Don't suggest private members from imported libraries.
+ return null;
+ }
+ if (accessor.isSynthetic) {
+ // Avoid visiting a field twice. All fields induce a getter, but only
+ // non-final fields induce a setter, so we don't add a suggestion for a
+ // synthetic setter.
+ if (accessor.isGetter) {
+ var variable = accessor.variable;
+ int relevance;
+ var useNewRelevance = request.useNewRelevance;
+ if (useNewRelevance) {
+ var featureComputer = request.featureComputer;
+ var contextType = featureComputer.contextTypeFeature(
+ request.contextType, variable.type);
+ var hasDeprecated = featureComputer.hasDeprecatedFeature(accessor);
+ var startsWithDollar =
+ featureComputer.startsWithDollarFeature(accessor.name);
+ var superMatches = featureComputer.superMatchesFeature(
+ containingMethodName, accessor.name);
+ relevance = _computeRelevance(
+ contextType: contextType,
+ hasDeprecated: hasDeprecated,
+ inheritanceDistance: inheritanceDistance,
+ startsWithDollar: startsWithDollar,
+ superMatches: superMatches);
+ } else {
+ relevance = oldRelevance();
+ }
+ return _addSuggestion(variable, relevance, useNewRelevance);
+ }
+ } else {
+ var type =
+ accessor.isGetter ? accessor.returnType : accessor.parameters[0].type;
+ int relevance;
+ var useNewRelevance = request.useNewRelevance;
+ if (useNewRelevance) {
+ var featureComputer = request.featureComputer;
+ var contextType =
+ featureComputer.contextTypeFeature(request.contextType, type);
+ var hasDeprecated = featureComputer.hasDeprecatedFeature(accessor);
+ var startsWithDollar =
+ featureComputer.startsWithDollarFeature(accessor.name);
+ var superMatches = featureComputer.superMatchesFeature(
+ containingMethodName, accessor.name);
+ relevance = _computeRelevance(
+ contextType: contextType,
+ hasDeprecated: hasDeprecated,
+ inheritanceDistance: inheritanceDistance,
+ startsWithDollar: startsWithDollar,
+ superMatches: superMatches);
+ } else {
+ relevance = oldRelevance();
+ }
+ return _addSuggestion(accessor, relevance, useNewRelevance);
+ }
+ return null;
+ }
+
+ /// Add a suggestion for the given [method].
+ CompletionSuggestion addSuggestionForMethod(
+ {@required MethodElement method,
+ String containingMethodName,
+ CompletionSuggestionKind kind,
+ @required double inheritanceDistance}) {
+ int oldRelevance() {
+ if (method.hasDeprecated) {
+ return DART_RELEVANCE_LOW;
+ } else if (method.name == containingMethodName) {
+ // Boost the relevance of a super expression calling a method of the
+ // same name as the containing method.
+ return DART_RELEVANCE_HIGH;
+ }
+ String identifier = method.displayName;
+ if (identifier != null && identifier.startsWith(r'$')) {
+ // Decrease relevance of suggestions starting with $
+ // https://github.com/dart-lang/sdk/issues/27303
+ return DART_RELEVANCE_LOW;
+ }
+ return DART_RELEVANCE_DEFAULT;
+ }
+
+ if (!method.isAccessibleIn(request.libraryElement)) {
+ // Don't suggest private members from imported libraries.
+ return null;
+ }
+ int relevance;
+ var useNewRelevance = request.useNewRelevance;
+ if (useNewRelevance) {
+ var featureComputer = request.featureComputer;
+ var contextType = featureComputer.contextTypeFeature(
+ request.contextType, method.returnType);
+ var hasDeprecated = featureComputer.hasDeprecatedFeature(method);
+ var startsWithDollar =
+ featureComputer.startsWithDollarFeature(method.name);
+ var superMatches = featureComputer.superMatchesFeature(
+ containingMethodName, method.name);
+ relevance = _computeRelevance(
+ contextType: contextType,
+ hasDeprecated: hasDeprecated,
+ inheritanceDistance: inheritanceDistance,
+ startsWithDollar: startsWithDollar,
+ superMatches: superMatches);
+ } else {
+ relevance = oldRelevance();
+ }
+ return _addSuggestion(method, relevance, useNewRelevance, kind: kind);
+ }
+
+ /// Add a suggestion for the given [element] with the given [relevance],
+ /// provided that it is not shadowed by a previously added suggestion.
+ CompletionSuggestion _addSuggestion(
+ Element element, int relevance, bool useNewRelevance,
+ {CompletionSuggestionKind kind}) {
+ String identifier = element.displayName;
+
int alreadyGenerated = _completionTypesGenerated.putIfAbsent(
identifier, () => _COMPLETION_TYPE_NONE);
if (element is MethodElement) {
// Anything shadows a method.
if (alreadyGenerated != _COMPLETION_TYPE_NONE) {
- return;
+ return null;
}
_completionTypesGenerated[identifier] =
_COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET;
@@ -316,13 +431,13 @@
if (element.isGetter) {
// Getters, fields, and methods shadow a getter.
if ((alreadyGenerated & _COMPLETION_TYPE_GETTER) != 0) {
- return;
+ return null;
}
_completionTypesGenerated[identifier] |= _COMPLETION_TYPE_GETTER;
} else {
// Setters, fields, and methods shadow a setter.
if ((alreadyGenerated & _COMPLETION_TYPE_SETTER) != 0) {
- return;
+ return null;
}
_completionTypesGenerated[identifier] |= _COMPLETION_TYPE_SETTER;
}
@@ -330,19 +445,52 @@
// Fields and methods shadow a field. A getter/setter pair shadows a
// field, but a getter or setter by itself doesn't.
if (alreadyGenerated == _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET) {
- return;
+ return null;
}
_completionTypesGenerated[identifier] =
_COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET;
} else {
// Unexpected element type; skip it.
assert(false);
- return;
+ return null;
}
- CompletionSuggestion suggestion =
- createSuggestion(element, relevance: relevance);
+ CompletionSuggestion suggestion = createSuggestion(element,
+ kind: kind, relevance: relevance, useNewRelevance: useNewRelevance);
if (suggestion != null) {
addCompletionSuggestion(suggestion);
}
+ return suggestion;
+ }
+
+ /// Compute a relevance value from the given feature scores:
+ /// - [contextType] is higher if the type of the element matches the context
+ /// type,
+ /// - [hasDeprecated] is higher if the element is not deprecated,
+ /// - [inheritanceDistance] is higher if the element is defined closer to the
+ /// target type,
+ /// - [startsWithDollar] is higher if the element's name doe _not_ start with
+ /// a dollar sign, and
+ /// - [superMatches] is higher if the element is being invoked through `super`
+ /// and the element's name matches the name of the enclosing method.
+ int _computeRelevance(
+ {@required double contextType,
+ @required double hasDeprecated,
+ @required double inheritanceDistance,
+ @required double startsWithDollar,
+ @required double superMatches}) {
+ var score = weightedAverage([
+ contextType,
+ hasDeprecated,
+ inheritanceDistance,
+ startsWithDollar,
+ superMatches
+ ], [
+ 1.0,
+ 0.5,
+ 1.0,
+ 0.5,
+ 1.0
+ ]);
+ return toRelevance(score, Relevance.member);
}
}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index 096051b..f65db45 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -8,14 +8,12 @@
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion, CompletionSuggestionKind;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
import 'package:analyzer_plugin/src/utilities/visitors/local_declaration_visitor.dart';
-import 'package:meta/meta.dart';
/// A contributor that produces suggestions based on the instance members of a
/// given type, whether declared by that type directly or inherited from a
@@ -27,13 +25,13 @@
Future<List<CompletionSuggestion>> computeSuggestions(
DartCompletionRequest request) async {
LibraryElement containingLibrary = request.libraryElement;
- // Gracefully degrade if the library element is not resolved
- // e.g. detached part file or source change
+ // Gracefully degrade if the library could not be determined, such as with a
+ // detached part file or source change.
if (containingLibrary == null) {
return const <CompletionSuggestion>[];
}
- // Recompute the target since resolution may have changed it
+ // Recompute the target because resolution might have changed it.
Expression expression = request.dotTarget;
if (expression == null ||
expression.isSynthetic ||
@@ -43,20 +41,20 @@
if (expression is Identifier) {
Element elem = expression.staticElement;
if (elem is ClassElement) {
- // Suggestions provided by StaticMemberContributor
+ // Suggestions provided by StaticMemberContributor.
return const <CompletionSuggestion>[];
}
if (elem is PrefixElement) {
- // Suggestions provided by LibraryMemberContributor
+ // Suggestions provided by LibraryMemberContributor.
return const <CompletionSuggestion>[];
}
}
- // Determine the target expression's type
+ // Determine the target expression's type.
DartType type = expression.staticType;
if (type == null || type.isDynamic) {
- // If the expression does not provide a good type
- // then attempt to get a better type from the element
+ // If the expression does not provide a good type, then attempt to get a
+ // better type from the element.
if (expression is Identifier) {
Element elem = expression.staticElement;
if (elem is FunctionTypedElement) {
@@ -68,8 +66,8 @@
}
if ((type == null || type.isDynamic) &&
expression is SimpleIdentifier) {
- // If the element does not provide a good type
- // then attempt to get a better type from a local declaration
+ // If the element does not provide a good type, then attempt to get a
+ // better type from a local declaration.
_LocalBestTypeVisitor visitor =
_LocalBestTypeVisitor(expression.name, request.offset);
if (visitor.visit(expression) && visitor.typeFound != null) {
@@ -82,12 +80,12 @@
List<InterfaceType> mixins;
List<InterfaceType> superclassConstraints;
if (expression is SuperExpression && type is InterfaceType) {
- // Suggest members from superclass if target is "super"
+ // Suggest members from superclass if target is "super".
mixins = (type as InterfaceType).mixins;
superclassConstraints = (type as InterfaceType).superclassConstraints;
type = (type as InterfaceType).superclass;
- // Determine the name of the containing method because
- // the most likely completion is a super expression with same name
+ // Determine the name of the containing method because the most likely
+ // completion is a super expression with same name.
MethodDeclaration containingMethod =
expression.thisOrAncestorOfType<MethodDeclaration>();
if (containingMethod != null) {
@@ -98,11 +96,11 @@
}
}
if (type == null || type.isDynamic) {
- // Suggest members from object if target is "dynamic"
+ // Suggest members from object if target is "dynamic".
type = request.objectType;
}
- // Build the suggestions
+ // Build the suggestions.
if (type is InterfaceType) {
_SuggestionBuilder builder = _SuggestionBuilder(request);
builder.buildSuggestions(type, containingMethodName,
@@ -110,24 +108,25 @@
return builder.suggestions.toList();
}
if (type is FunctionType) {
- return [_SuggestionBuilder._createFunctionCallSuggestion()];
+ _SuggestionBuilder builder = _SuggestionBuilder(request);
+ return [builder._createFunctionCallSuggestion()];
}
return const <CompletionSuggestion>[];
}
}
-/// An [AstVisitor] which looks for a declaration with the given name
-/// and if found, tries to determine a type for that declaration.
+/// An [AstVisitor] which looks for a declaration with the given name and if
+/// found, tries to determine a type for that declaration.
class _LocalBestTypeVisitor extends LocalDeclarationVisitor {
/// The name for the declaration to be found.
final String targetName;
- /// The best type for the found declaration,
- /// or `null` if no declaration found or failed to determine a type.
+ /// The best type for the found declaration, or `null` if no declaration found
+ /// or failed to determine a type.
DartType typeFound;
- /// Construct a new instance to search for a declaration
+ /// Construct a new instance to search for a declaration.
_LocalBestTypeVisitor(this.targetName, int offset) : super(offset);
@override
@@ -221,7 +220,7 @@
@override
void declaredParam(SimpleIdentifier name, TypeAnnotation type) {
if (name.name == targetName) {
- // Type provided by the element in computeFull above
+ // Type provided by the element in computeFull above.
finished();
}
}
@@ -230,7 +229,7 @@
void declaredTopLevelVar(
VariableDeclarationList varList, VariableDeclaration varDecl) {
if (varDecl.name.name == targetName) {
- // Type provided by the element in computeFull above
+ // Type provided by the element in computeFull above.
finished();
}
}
@@ -239,9 +238,8 @@
/// This class provides suggestions based upon the visible instance members in
/// an interface type.
class _SuggestionBuilder extends MemberSuggestionBuilder {
- final DartCompletionRequest request;
-
- _SuggestionBuilder(this.request) : super(request.libraryElement);
+ /// Initialize a newly created suggestion builder.
+ _SuggestionBuilder(DartCompletionRequest request) : super(request);
/// Return completion suggestions for 'dot' completions on the given [type].
/// If the 'dot' completion is a super expression, then [containingMethodName]
@@ -259,78 +257,27 @@
if (superclassConstraints != null) {
types.addAll(superclassConstraints);
}
- var featureComputer = request.featureComputer;
- for (InterfaceType targetType in types) {
- var inheritanceDistance = featureComputer.inheritanceDistanceFeature(
- type.element, targetType.element);
- for (MethodElement method in targetType.methods) {
- // Exclude static methods when completion on an instance
+ for (var targetType in types) {
+ double inheritanceDistance;
+ if (request.useNewRelevance) {
+ inheritanceDistance = request.featureComputer
+ .inheritanceDistanceFeature(type.element, targetType.element);
+ }
+ for (var method in targetType.methods) {
+ // Exclude static methods when completion on an instance.
if (!method.isStatic) {
- // Boost the relevance of a super expression
- // calling a method of the same name as the containing method
- int relevance;
- if (request.useNewRelevance) {
- var contextType = featureComputer.contextTypeFeature(
- request.contextType, method.returnType);
- var startsWithDollar =
- featureComputer.startsWithDollarFeature(method.name);
- var superMatches = featureComputer.superMatchesFeature(
- containingMethodName, method.name);
- relevance = _computeRelevance(
- contextType: contextType,
- inheritanceDistance: inheritanceDistance,
- startsWithDollar: startsWithDollar,
- superMatches: superMatches);
- } else {
- relevance = method.name == containingMethodName
- ? DART_RELEVANCE_HIGH
- : DART_RELEVANCE_DEFAULT;
- }
- addSuggestion(method, relevance: relevance);
+ addSuggestionForMethod(
+ method: method,
+ containingMethodName: containingMethodName,
+ inheritanceDistance: inheritanceDistance);
}
}
- for (PropertyAccessorElement propertyAccessor in targetType.accessors) {
- if (!propertyAccessor.isStatic) {
- if (propertyAccessor.isSynthetic) {
- // Avoid visiting a field twice
- if (propertyAccessor.isGetter) {
- var variable = propertyAccessor.variable;
- int relevance;
- if (request.useNewRelevance) {
- var contextType = featureComputer.contextTypeFeature(
- request.contextType, variable.type);
- var startsWithDollar = featureComputer
- .startsWithDollarFeature(propertyAccessor.name);
- var superMatches = featureComputer.superMatchesFeature(
- containingMethodName, propertyAccessor.name);
- relevance = _computeRelevance(
- contextType: contextType,
- inheritanceDistance: inheritanceDistance,
- startsWithDollar: startsWithDollar,
- superMatches: superMatches);
- }
- addSuggestion(variable, relevance: relevance);
- }
- } else {
- var type = propertyAccessor.isGetter
- ? propertyAccessor.returnType
- : propertyAccessor.parameters[0].type;
- int relevance;
- if (request.useNewRelevance) {
- var contextType =
- featureComputer.contextTypeFeature(request.contextType, type);
- var startsWithDollar = featureComputer
- .startsWithDollarFeature(propertyAccessor.name);
- var superMatches = featureComputer.superMatchesFeature(
- containingMethodName, propertyAccessor.name);
- relevance = _computeRelevance(
- contextType: contextType,
- inheritanceDistance: inheritanceDistance,
- startsWithDollar: startsWithDollar,
- superMatches: superMatches);
- }
- addSuggestion(propertyAccessor, relevance: relevance);
- }
+ for (var accessor in targetType.accessors) {
+ if (!accessor.isStatic) {
+ addSuggestionForAccessor(
+ accessor: accessor,
+ containingMethodName: containingMethodName,
+ inheritanceDistance: inheritanceDistance);
}
}
if (targetType.isDartCoreFunction) {
@@ -339,24 +286,26 @@
}
}
- /// Compute a relevance value from the given feature scores:
- /// - [contextType] is higher if the type of the element matches the context
- /// type,
- /// - [inheritanceDistance] is higher if the element is defined closer to the
- /// target type,
- /// - [startsWithDollar] is higher if the element's name doe _not_ start with
- /// a dollar sign, and
- /// - [superMatches] is higher if the element is being invoked through `super`
- /// and the element's name matches the name of the enclosing method.
- int _computeRelevance(
- {@required double contextType,
- @required double inheritanceDistance,
- @required double startsWithDollar,
- @required double superMatches}) {
- var score = weightedAverage(
- [contextType, inheritanceDistance, startsWithDollar, superMatches],
- [1.0, 1.0, 0.5, 1.0]);
- return toRelevance(score, 500);
+ CompletionSuggestion _createFunctionCallSuggestion() {
+ const callString = 'call()';
+ final element = protocol.Element(
+ protocol.ElementKind.METHOD, callString, protocol.Element.makeFlags(),
+ location: null,
+ typeParameters: null,
+ parameters: null,
+ returnType: 'void');
+ return CompletionSuggestion(
+ CompletionSuggestionKind.INVOCATION,
+ request.useNewRelevance ? Relevance.callFunction : DART_RELEVANCE_HIGH,
+ callString,
+ callString.length,
+ 0,
+ false,
+ false,
+ displayText: callString,
+ element: element,
+ returnType: 'void',
+ );
}
/// Get a list of [InterfaceType]s that should be searched to find the
@@ -394,26 +343,4 @@
}
return result;
}
-
- static CompletionSuggestion _createFunctionCallSuggestion() {
- const callString = 'call()';
- final element = protocol.Element(
- protocol.ElementKind.METHOD, callString, protocol.Element.makeFlags(),
- location: null,
- typeParameters: null,
- parameters: null,
- returnType: 'void');
- return CompletionSuggestion(
- CompletionSuggestionKind.INVOCATION,
- DART_RELEVANCE_HIGH,
- callString,
- callString.length,
- 0,
- false,
- false,
- displayText: callString,
- element: element,
- returnType: 'void',
- );
- }
}
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 785aec6..c4c3ff7 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -1985,7 +1985,10 @@
_SimpleIdentifierRecursiveAstVisitor visitor =
_SimpleIdentifierRecursiveAstVisitor((SimpleIdentifier node) {
Element element = node.staticElement;
- if (element != null && namespace[node.name] == element) {
+ if (element != null &&
+ (namespace[node.name] == element ||
+ (node.name != element.name &&
+ namespace[element.name] == element))) {
referencedNames.add(element.displayName);
}
});
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 906e521..cc2d77c 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -706,6 +706,9 @@
await _addFix_addConst();
await _addFix_replaceNewWithConst();
}
+ if (errorCode.name == LintNames.prefer_const_constructors_in_immutables) {
+ await _addFix_addConstToConstructor();
+ }
if (errorCode.name == LintNames.prefer_if_null_operators) {
await _addFix_convertToIfNullOperator();
}
@@ -804,6 +807,23 @@
}
}
+ Future<void> _addFix_addConstToConstructor() async {
+ var node = coveredNode;
+ if (node is SimpleIdentifier) {
+ node = node.parent;
+ }
+ if (node is ConstructorDeclaration) {
+ final changeBuilder = _newDartChangeBuilder();
+ await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+ final offset = (node as ConstructorDeclaration)
+ .firstTokenAfterCommentAndMetadata
+ .offset;
+ builder.addSimpleInsertion(offset, 'const ');
+ });
+ _addFixFromBuilder(changeBuilder, DartFixKind.ADD_CONST);
+ }
+ }
+
Future<void> _addFix_addCurlyBraces() async {
final changeBuilder = await createBuilder_useCurlyBraces();
_addFixFromBuilder(changeBuilder, DartFixKind.ADD_CURLY_BRACES);
@@ -3519,7 +3539,10 @@
if (combinators.length == 1) {
Token previousToken =
combinator.parent.findPrevious(combinator.beginToken);
- return range.endEnd(previousToken, combinator);
+ if (previousToken != null) {
+ return range.endEnd(previousToken, combinator);
+ }
+ return null;
}
int index = combinators.indexOf(combinator);
if (index < 0) {
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index 549d182..6a91795 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -45,6 +45,8 @@
static const String prefer_conditional_assignment =
'prefer_conditional_assignment';
static const String prefer_const_constructors = 'prefer_const_constructors';
+ static const String prefer_const_constructors_in_immutables =
+ 'prefer_const_constructors_in_immutables';
static const String prefer_const_declarations = 'prefer_const_declarations';
static const String prefer_contains = 'prefer_contains';
static const String prefer_equal_for_default_values =
diff --git a/pkg/analysis_server/test/client/relevance/test_all.dart b/pkg/analysis_server/test/client/relevance/test_all.dart
deleted file mode 100644
index 26af7cd..0000000
--- a/pkg/analysis_server/test/client/relevance/test_all.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// 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:test_reflective_loader/test_reflective_loader.dart';
-
-import 'type_member_relevance_test.dart' as type_member_relevance_test;
-
-void main() {
- defineReflectiveSuite(() {
- type_member_relevance_test.main();
- });
-}
diff --git a/pkg/analysis_server/test/client/test_all.dart b/pkg/analysis_server/test/client/test_all.dart
index 1d2a312..417c4d3 100644
--- a/pkg/analysis_server/test/client/test_all.dart
+++ b/pkg/analysis_server/test/client/test_all.dart
@@ -5,11 +5,9 @@
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion_driver_test.dart' as completion_driver;
-import 'relevance/test_all.dart' as relevance_tests;
void main() {
defineReflectiveSuite(() {
completion_driver.main();
- relevance_tests.main();
});
}
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 14b27ab..1827123 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -859,6 +859,27 @@
assertSuggestKeywords(classBodyKeywords);
}
+ Future<void> test_class_body_return_no_whitespace() async {
+ addTestSource('class A { ^foo() {}}');
+ await computeSuggestions();
+ expect(suggestions, isNotEmpty);
+ assertSuggestKeywords(classBodyKeywords);
+ }
+
+ Future<void> test_class_body_return_prefix() async {
+ addTestSource('class A { d^ foo() {}}');
+ await computeSuggestions();
+ expect(suggestions, isNotEmpty);
+ assertSuggestKeywords(classBodyKeywords);
+ }
+
+ Future<void> test_class_body_return_whitespace() async {
+ addTestSource('class A { ^ foo() {}}');
+ await computeSuggestions();
+ expect(suggestions, isNotEmpty);
+ assertSuggestKeywords(classBodyKeywords);
+ }
+
Future<void> test_class_extends() async {
addTestSource('class A extends foo ^');
await computeSuggestions();
@@ -1891,6 +1912,20 @@
assertSuggestKeywords(EXPRESSION_START_INSTANCE);
}
+ Future<void> test_method_body_return_with_header() async {
+ addTestSource('class A { @override ^ foo() {}}');
+ await computeSuggestions();
+ expect(suggestions, isNotEmpty);
+ assertSuggestKeywords(classBodyKeywords);
+ }
+
+ Future<void> test_method_body_return_with_header_prefix() async {
+ addTestSource('class A { @override d^ foo() {}}');
+ await computeSuggestions();
+ expect(suggestions, isNotEmpty);
+ assertSuggestKeywords(classBodyKeywords);
+ }
+
Future<void> test_method_invocation() async {
addTestSource('class A { foo() {bar.^}}');
await computeSuggestions();
@@ -1939,7 +1974,7 @@
}
Future<void> test_method_param_prefix() async {
- addTestSource('class A { foo(t^) {});}');
+ addTestSource('class A { foo(t^) {}}');
await computeSuggestions();
expect(suggestions, isNotEmpty);
assertSuggestKeywords(methodParameter);
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart b/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart
new file mode 100644
index 0000000..79a5bbf
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart
@@ -0,0 +1,34 @@
+// 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:analysis_server/src/analysis_server.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../client/completion_driver_test.dart';
+
+@reflectiveTest
+class CompletionRelevanceTest extends AbstractCompletionDriverTest {
+ @override
+ AnalysisServerOptions get serverOptions =>
+ AnalysisServerOptions()..useNewRelevance = true;
+
+ @override
+ bool get supportsAvailableSuggestions => true;
+
+ /// Assert that all of the given completions were produced and that the
+ /// suggestions are ordered in decreasing order based on relevance scores.
+ void assertOrder(List<CompletionSuggestion> suggestions) {
+ var length = suggestions.length;
+ expect(length, greaterThan(1),
+ reason: 'Test must specify more than one suggestion');
+ var previous = suggestions[0];
+ for (int i = 1; i < length; i++) {
+ var current = suggestions[i];
+ expect(current.relevance, lessThan(previous.relevance));
+ previous = current;
+ }
+ }
+}
diff --git a/pkg/analysis_server/test/client/relevance/type_member_relevance_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart
similarity index 84%
rename from pkg/analysis_server/test/client/relevance/type_member_relevance_test.dart
rename to pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart
index 7d1c53e..9558d8d 100644
--- a/pkg/analysis_server/test/client/relevance/type_member_relevance_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart
@@ -7,16 +7,16 @@
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import '../completion_driver_test.dart';
+import '../../../../client/completion_driver_test.dart';
void main() {
defineReflectiveSuite(() {
- defineReflectiveTests(TypeMemberRelevanceTest);
+ defineReflectiveTests(InstanceMemberRelevanceTest);
});
}
@reflectiveTest
-class TypeMemberRelevanceTest extends AbstractCompletionDriverTest {
+class InstanceMemberRelevanceTest extends AbstractCompletionDriverTest {
@override
AnalysisServerOptions get serverOptions =>
AnalysisServerOptions()..useNewRelevance = true;
@@ -65,6 +65,24 @@
]);
}
+ Future<void> test_hasDeprecated() async {
+ await addTestFile('''
+class C {
+ void a() {}
+ @deprecated
+ void b() {}
+}
+
+void f(C c) {
+ c.^
+}
+''');
+ assertOrder([
+ suggestionWith(completion: 'a'),
+ suggestionWith(completion: 'b'),
+ ]);
+ }
+
Future<void> test_inheritanceDepth() async {
await addTestFile('''
class A {
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_test.dart
new file mode 100644
index 0000000..e16d539
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_test.dart
@@ -0,0 +1,61 @@
+// 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:test_reflective_loader/test_reflective_loader.dart';
+
+import 'completion_relevance.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(StaticMemberRelevanceTest);
+ });
+}
+
+@reflectiveTest
+class StaticMemberRelevanceTest extends CompletionRelevanceTest {
+ Future<void> test_contextType() async {
+ await addTestFile(r'''
+class A {}
+class B extends A {}
+class C extends B {}
+class D {}
+
+class E {
+ static A a() {}
+ static B b() {}
+ static C c() {}
+ static D d() {}
+}
+
+void f(B b) {}
+void g() {
+ f(E.^);
+}
+''');
+ assertOrder([
+ suggestionWith(completion: 'b'), // same
+ suggestionWith(completion: 'c'), // subtype
+ suggestionWith(completion: 'd'), // unrelated
+ suggestionWith(completion: 'a'), // supertype
+ ]);
+ }
+
+ Future<void> test_hasDeprecated() async {
+ await addTestFile('''
+class C {
+ static void a() {}
+ @deprecated
+ static void b() {}
+}
+
+void f() {
+ C.^
+}
+''');
+ assertOrder([
+ suggestionWith(completion: 'a'),
+ suggestionWith(completion: 'b'),
+ ]);
+ }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart b/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart
index c0f3240..c0235e1 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart
@@ -7,11 +7,15 @@
import 'arglist_parameter_relevance_test.dart' as arglist_parameters;
import 'bool_assignment_relevance_test.dart' as bool_assignments;
import 'deprecated_member_relevance_test.dart' as deprecated_members;
+import 'instance_member_relevance_test.dart' as instance_member_relevance;
+import 'static_member_relevance_test.dart' as static_member_relevance;
void main() {
defineReflectiveSuite(() {
arglist_parameters.main();
bool_assignments.main();
deprecated_members.main();
+ instance_member_relevance.main();
+ static_member_relevance.main();
});
}
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index b75fd7e..7dd7a0d 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -2271,12 +2271,7 @@
''');
await computeSuggestions();
- assertSuggest(
- 'call()',
- selectionOffset: 6,
- elemKind: ElementKind.METHOD,
- isSynthetic: true,
- );
+ assertNotSuggested('call');
}
Future<void> test_InterfaceType_Function_implemented_call() async {
@@ -2289,12 +2284,7 @@
''');
await computeSuggestions();
- assertSuggest(
- 'call()',
- selectionOffset: 6,
- elemKind: ElementKind.METHOD,
- isSynthetic: true,
- );
+ assertNotSuggested('call');
}
Future<void> test_InterpolationExpression() async {
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
index 544d429..af7a168 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
@@ -292,6 +292,7 @@
void assertTraceEntry(
UnitInfo unit, TraceEntryInfo entryInfo, String function, int offset) {
+ assert(offset >= 0);
var lineInfo = LineInfo.fromContent(unit.content);
var expectedLocation = lineInfo.getLocation(offset);
expect(entryInfo.target.filePath, unit.path);
@@ -398,7 +399,7 @@
}
''', migratedContent: '''
class C<T extends Object?> {
- C(T/*!*/ t);
+ C(T /*!*/ t);
}
void main() {
@@ -442,7 +443,7 @@
f(null);
}
''', migratedContent: '''
-f<T extends Object?>(T/*!*/ t) {}
+f<T extends Object?>(T /*!*/ t) {}
void main() {
f(null);
@@ -462,15 +463,15 @@
if (i != null) print('NULL');
}
''', migratedContent: '''
-void g(int i) {
+void g(int i) {
print(i.isEven);
/* if (i != null) */ print('NULL');
}
''');
List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(2));
- assertRegion(region: regions[0], offset: 37, length: 3);
- assertRegion(region: regions[1], offset: 55, length: 3);
+ assertRegion(region: regions[0], offset: 38, length: 3);
+ assertRegion(region: regions[1], offset: 56, length: 3);
}
Future<void> test_discardElse() async {
@@ -481,7 +482,7 @@
else print('NOT NULL');
}
''', migratedContent: '''
-void g(int i) {
+void g(int i) {
print(i.isEven);
/* if (i != null) */ print('NULL'); /*
else print('NOT NULL'); */
@@ -489,10 +490,10 @@
''');
List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(4));
- assertRegion(region: regions[0], offset: 37, length: 3);
- assertRegion(region: regions[1], offset: 55, length: 3);
- assertRegion(region: regions[2], offset: 72, length: 3);
- assertRegion(region: regions[3], offset: 101, length: 3);
+ assertRegion(region: regions[0], offset: 38, length: 3);
+ assertRegion(region: regions[1], offset: 56, length: 3);
+ assertRegion(region: regions[2], offset: 73, length: 3);
+ assertRegion(region: regions[3], offset: 102, length: 3);
}
Future<void> test_dynamicValueIsUsed() async {
@@ -506,7 +507,7 @@
f(i);
}
''', migratedContent: '''
-bool f(int? i) {
+bool f(int? i) {
if (i == null) return true;
else return false;
}
@@ -515,11 +516,11 @@
f(i);
}
''');
- List<RegionInfo> regions = unit.regions;
+ List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(1));
var region = regions[0];
var edits = region.edits;
- assertRegion(region: region, offset: 10, details: [
+ assertRegion(region: region, offset: 11, details: [
'A dynamic value, which is nullable is passed as an argument'
]);
assertDetail(detail: region.details[0], offset: 104, length: 1);
@@ -537,7 +538,7 @@
f(<int>[]);
}
''', migratedContent: '''
-void f(List<int?> list) {
+void f(List<int?> list) {
list[0] = null;
}
@@ -547,13 +548,13 @@
''');
List<RegionInfo> regions = unit.regions;
expect(regions, hasLength(3));
- // regions[0] is the hard edge that f's parameter is non-nullable.
- assertRegion(region: regions[1], offset: 15, details: [
+ assertRegion(region: regions[0], offset: 15, details: [
"An explicit 'null' is assigned in the function 'f'",
]);
+ // regions[1] is the hard edge that f's parameter is non-nullable.
assertRegion(
region: regions[2],
- offset: 66,
+ offset: 67,
details: ['This is later required to accept null.']);
}
@@ -729,8 +730,8 @@
}
''', migratedContent: '''
class C {
- f(void Function(int)? cb1) {}
- g(void Function(int) cb2) {
+ f(void Function(int )? cb1) {}
+ g(void Function(int ) cb2) {
f(cb2);
}
h() => f(null);
@@ -740,7 +741,7 @@
expect(regions, hasLength(1));
assertRegion(
region: regions[0],
- offset: 32,
+ offset: 33,
details: ["An explicit 'null' is passed as an argument"]);
assertDetail(detail: regions[0].details[0], offset: 98, length: 4);
}
@@ -757,10 +758,10 @@
}
''', migratedContent: '''
class C {
- f(void Function(int?) cb1) {
+ f(void Function(int?) cb1) {
cb1(null);
}
- g(void Function(int?) cb2) {
+ g(void Function(int?) cb2) {
f(cb2);
}
}
@@ -771,7 +772,7 @@
region: regions[0],
offset: 31,
details: ["An explicit 'null' is passed as an argument"]);
- assertRegion(region: regions[1], offset: 81, details: [
+ assertRegion(region: regions[1], offset: 82, details: [
'The function-typed element in which this parameter is declared is '
'assigned to a function whose matching parameter is nullable'
]);
@@ -789,8 +790,8 @@
}
''', migratedContent: '''
class C {
- void Function(int?) _cb = (x) {};
- f(void Function(int?) cb) {
+ void Function(int?) _cb = (x) {};
+ f(void Function(int?) cb) {
_cb = cb;
}
g() => _cb(null);
@@ -799,7 +800,7 @@
List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(2));
// regions[0] is `void Function(int?) _cb`.
- assertRegion(region: regions[1], offset: 67, details: [
+ assertRegion(region: regions[1], offset: 68, details: [
'The function-typed element in which this parameter is declared is '
'assigned to a function whose matching parameter is nullable'
]);
@@ -815,8 +816,8 @@
}
''', migratedContent: '''
class C {
- void Function(int?) _cb;
- C(void Function(int?) cb): _cb = cb;
+ void Function(int?) _cb;
+ C(void Function(int?) cb): _cb = cb;
f() => _cb(null);
}
''');
@@ -826,7 +827,7 @@
region: regions[0],
offset: 29,
details: ["An explicit 'null' is passed as an argument"]);
- assertRegion(region: regions[1], offset: 58, details: [
+ assertRegion(region: regions[1], offset: 59, details: [
'The function-typed element in which this parameter is declared is '
'assigned to a function whose matching parameter is nullable'
]);
@@ -873,8 +874,8 @@
}
''', migratedContent: '''
class C {
- int? Function() _cb = () => 7;
- f(int? Function() cb) {
+ int? Function() _cb = () => 7;
+ f(int? Function() cb) {
_cb = cb;
}
g() {
@@ -899,8 +900,8 @@
}
''', migratedContent: '''
class C {
- int level;
- int level2;
+ int level;
+ int level2;
C({required this.level}) : this.level2 = level + 1;
}
''');
@@ -908,7 +909,7 @@
expect(regions, hasLength(1));
var region = regions[0];
var edits = region.edits;
- assertRegion(region: region, offset: 42, length: 9, details: [
+ assertRegion(region: region, offset: 44, length: 9, details: [
'This parameter is non-nullable, so cannot have an implicit default '
"value of 'null'"
]);
@@ -924,15 +925,15 @@
}
''', migratedContent: '''
class C {
- int level = 0;
- bool f({required int lvl}) => lvl >= level;
+ int level = 0;
+ bool f({required int lvl}) => lvl >= level;
}
''');
List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(1));
var region = regions[0];
var edits = region.edits;
- assertRegion(region: region, offset: 37, length: 9, details: [
+ assertRegion(region: region, offset: 39, length: 9, details: [
'This parameter is non-nullable, so cannot have an implicit default '
"value of 'null'"
]);
@@ -949,9 +950,9 @@
''';
var migratedContent = '''
class C {
- C? operator+(C c) => null;
+ C? operator+(C c) => null;
}
-C/*!*/ _f(C c) => (c + c)!;
+C /*!*/ _f(C c) => (c + c)!;
''';
UnitInfo unit = await buildInfoForSingleTestFile(originalContent,
migratedContent: migratedContent);
@@ -1005,13 +1006,13 @@
}
''', migratedContent: '''
void f() {
- List<int?> list = List<int?>(10);
+ List<int?> list = List<int?>(10);
}
''');
- List<RegionInfo> regions = unit.regions;
+ List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(2));
// regions[0] is `num? a`.
- assertRegion(region: regions[1], offset: 39, details: [
+ assertRegion(region: regions[1], offset: 40, details: [
'A length is specified in the "List()" constructor and the list items '
'are initialized to null'
]);
@@ -1099,8 +1100,8 @@
''', migratedContent: '''
void f() {
String? s = null;
- var x = <String?, bool>{"hello": false, s: true};
- var y = <bool, String?>{false: "hello", true: s};
+ var x = <String?, bool >{"hello": false, s: true};
+ var y = <bool , String?>{false: "hello", true: s};
}
''');
List<RegionInfo> regions = unit.fixRegions;
@@ -1113,7 +1114,7 @@
assertDetail(detail: regions[1].details[0], offset: 71, length: 1);
assertRegion(
region: regions[2],
- offset: 106,
+ offset: 108,
details: ['This map is initialized with a nullable value on line 4']);
assertDetail(detail: regions[2].details[0], offset: 128, length: 1);
}
@@ -1136,7 +1137,7 @@
class B extends A {
void m({num? p = 0}) {}
}
-void f(A a) {
+void f(A a) {
a.m(p: null);
}
''');
@@ -1155,30 +1156,24 @@
assert(s != null);
}
''', migratedContent: '''
-void f(String s) {
+void f(String s) {
assert(s != null);
}
''');
- List<RegionInfo> regions = unit.nonNullableTypeRegions;
+ List<RegionInfo> regions = unit.informativeRegions;
expect(regions, hasLength(1));
- assertRegion(
- region: regions[0],
- offset: 7,
- length: 6,
- details: ['This value is asserted to be non-null']);
+ assertRegion(region: regions[0], offset: 13, length: 1, details: []);
}
Future<void> test_nonNullableType_exclamationComment() async {
UnitInfo unit = await buildInfoForSingleTestFile('''
void f(String /*!*/ s) {}
''', migratedContent: '''
-void f(String /*!*/ s) {}
+void f(String /*!*/ s) {}
''');
- List<RegionInfo> regions = unit.nonNullableTypeRegions;
+ List<RegionInfo> regions = unit.informativeRegions;
expect(regions, hasLength(1));
- assertRegion(region: regions[0], offset: 7, length: 6, details: [
- 'This type is annotated with a non-nullability comment ("/*!*/")'
- ]);
+ assertRegion(region: regions[0], offset: 13, length: 1, details: []);
}
Future<void> test_nonNullableType_unconditionalFieldAccess() async {
@@ -1187,15 +1182,13 @@
print(s.length);
}
''', migratedContent: '''
-void f(String s) {
+void f(String s) {
print(s.length);
}
''');
- List<RegionInfo> regions = unit.nonNullableTypeRegions;
+ List<RegionInfo> regions = unit.informativeRegions;
expect(regions, hasLength(1));
- assertRegion(region: regions[0], offset: 7, length: 6, details: [
- 'This value is unconditionally used in a non-nullable context'
- ]);
+ assertRegion(region: regions[0], offset: 13, length: 1, details: []);
}
Future<void> test_nullCheck_onMemberAccess() async {
@@ -1318,7 +1311,7 @@
class C extends B {
void m(Object? p) {}
}
-void f(A a) {
+void f(A a) {
a.m(null);
}
''');
@@ -1359,7 +1352,7 @@
class C extends B {
void m(Object? p) {}
}
-void f(A a) {
+void f(A a) {
a.m(null);
}
''');
@@ -1371,8 +1364,7 @@
]);
}
- @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/39378')
- Future<void> test_parameter_fromOverridden_implicit() async {
+ Future<void> test_parameter_fromOverridden_implicitDynamic() async {
UnitInfo unit = await buildInfoForSingleTestFile('''
class A {
void m(p) {}
@@ -1385,17 +1377,12 @@
void m(p) {}
}
class B extends A {
- void m(Object? p) {}
+ void m(Object p) {}
}
''');
- List<RegionInfo> regions = unit.fixRegions;
+ List<RegionInfo> regions = unit.informativeRegions;
expect(regions, hasLength(1));
- // TODO(brianwilkerson) The detail should read something like
- // "The overridden method accepts a nullable type"
- assertRegion(
- region: regions[0],
- offset: 62,
- details: ['A nullable value is assigned']);
+ assertRegion(region: regions[0], offset: 62, details: []);
}
Future<void> test_parameter_fromOverriddenField_explicit() async {
@@ -1414,7 +1401,7 @@
class B extends A {
void set m(Object? p) {}
}
-void f(A a) => a.m = null;
+void f(A a) => a.m = null;
''');
List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(2));
@@ -1428,6 +1415,15 @@
]);
assertDetail(detail: regions[0].details[1], offset: 90, length: 4);
assertDetail(detail: regions[1].details[0], offset: 12, length: 3);
+
+ expect(regions[0].traces, hasLength(1));
+ var trace = regions[0].traces.single;
+ expect(trace.description, 'Nullability reason');
+ var entries = trace.entries;
+ expect(entries, hasLength(1));
+ // Entry 0 is the nullability of the type of A.m.
+ // TODO(srawlins): "A" is probably incorrect here. Should be "A.m".
+ assertTraceEntry(unit, entries[0], 'A', unit.content.indexOf('int?'));
}
Future<void> test_parameter_named_omittedInCall() async {
@@ -1457,15 +1453,15 @@
}
void h(int x) {}
''', migratedContent: '''
-int f({int? compare}) => 7
+int f({int? compare}) => 7
void g() {
h(f());
}
-void h(int x) {}
+void h(int x) {}
''');
List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(1));
- assertRegion(region: regions[0], offset: 10, details: [
+ assertRegion(region: regions[0], offset: 11, details: [
"This parameter has an implicit default value of 'null'",
'This named parameter is omitted in a call to this function'
]);
@@ -1540,15 +1536,15 @@
// Note: even though `as int` is removed, it still shows up in the
// preview, since we show deleted text.
var migratedContent = '''
-void f(num n, int?/*?*/ i) {
- if (n is! int) return;
+void f(num n, int?/*?*/ i) {
+ if (n is! int ) return;
print((n as int).isEven);
print(i! + 1);
}
''';
UnitInfo unit = await buildInfoForSingleTestFile(originalContent,
migratedContent: migratedContent, removeViaComments: false);
- List<RegionInfo> regions = unit.regions;
+ List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(3));
// regions[0] is the addition of `?` to the type of `i`.
assertRegion(
@@ -1596,7 +1592,7 @@
}
''', migratedContent: '''
String? g() {
- int x = 1;
+ int x = 1;
if (x == 2) return x == 3 ? "Hello" : null;
return "Hello";
}
@@ -1733,7 +1729,7 @@
''', migratedContent: '''
void f() {
String? s = null;
- var x = <List<String?>>{
+ var x = <List<String?> >{
["hello"],
if (1 == 2) [s]
};
@@ -1777,7 +1773,7 @@
if (i == null) return;
}
''', migratedContent: '''
-void f(int/*!*/ i) {
+void f(int /*!*/ i) {
/* if (i == null) return; */
}
''');
@@ -1785,9 +1781,15 @@
.where(
(regionInfo) => regionInfo.offset == unit.content.indexOf('/* if'))
.single;
- // The reason data associated with dead code removal is a non-nullable node,
- // and we don't currently generate a trace for non-nullable nodes.
- expect(region.traces, isEmpty);
+ expect(region.traces, hasLength(1));
+ var trace = region.traces.single;
+ expect(trace.description, 'Non-nullability reason');
+ var entries = trace.entries;
+ expect(entries, hasLength(2));
+ // Entry 0 is the nullability of f's argument
+ assertTraceEntry(unit, entries[0], 'f', unit.content.indexOf('int'));
+ // Entry 1 is the edge from f's argument to never, due to the `/*!*/` hint.
+ assertTraceEntry(unit, entries[1], 'f', unit.content.indexOf('int'));
}
Future<void> test_trace_nullableType() async {
@@ -1816,7 +1818,7 @@
var trace = region.traces.single;
expect(trace.description, 'Nullability reason');
var entries = trace.entries;
- expect(entries, hasLength(6));
+ expect(entries, hasLength(5));
// Entry 0 is the nullability of f's argument
assertTraceEntry(
unit, entries[0], 'f', unit.content.indexOf('int? i) {} // f'));
@@ -1830,16 +1832,12 @@
assertTraceEntry(unit, entries[3], 'h', unit.content.indexOf('null'));
// Entry 4 is the nullability of the null literal.
assertTraceEntry(unit, entries[4], 'h', unit.content.indexOf('null'));
- // Entry 5 is the edge from always to null.
- // TODO(paulberry): this edge provides no additional useful information and
- // shouldn't be included in the trace.
- assertTraceEntry(unit, entries[5], 'h', unit.content.indexOf('null'));
}
Future<void> test_trace_nullCheck() async {
UnitInfo unit = await buildInfoForSingleTestFile(
'int f(int/*?*/ i) => i + 1;',
- migratedContent: 'int f(int?/*?*/ i) => i! + 1;');
+ migratedContent: 'int f(int?/*?*/ i) => i! + 1;');
var region = unit.regions
.where((regionInfo) => regionInfo.offset == unit.content.indexOf('! +'))
.single;
@@ -1847,13 +1845,11 @@
var trace = region.traces.single;
expect(trace.description, 'Nullability reason');
var entries = trace.entries;
- expect(entries, hasLength(2));
+ expect(entries, hasLength(1));
// Entry 0 is the nullability of the type of i.
- assertTraceEntry(unit, entries[0], 'f', unit.content.indexOf('int?'));
+ // TODO(paulberry): -1 is a bug.
+ assertTraceEntry(unit, entries[0], 'f', unit.content.indexOf('int?') - 1);
// Entry 1 is the edge from always to the type of i.
- // TODO(paulberry): this edge provides no additional useful information and
- // shouldn't be included in the trace.
- assertTraceEntry(unit, entries[1], 'f', unit.content.indexOf('int?'));
}
Future<void> test_trace_nullCheck_notNullableReason() async {
@@ -1868,10 +1864,10 @@
g(i);
}
''', migratedContent: '''
-void f(int i) { // f
+void f(int i) { // f
assert(i != null);
}
-void g(int i) { // g
+void g(int i) { // g
f(i); // call f
}
void h(int?/*?*/ i) {
@@ -1887,25 +1883,19 @@
var trace = region.traces[1];
expect(trace.description, 'Non-nullability reason');
var entries = trace.entries;
- expect(entries, hasLength(5));
+ expect(entries, hasLength(4));
// Entry 0 is the nullability of g's argument
assertTraceEntry(
- unit, entries[0], 'g', unit.content.indexOf('int i) { // g'));
+ unit, entries[0], 'g', unit.content.indexOf('int i) { // g'));
// Entry 1 is the edge from g's argument to f's argument, due to g's call to
// f.
assertTraceEntry(
unit, entries[1], 'g', unit.content.indexOf('i); // call f'));
// Entry 2 is the nullability of f's argument
assertTraceEntry(
- unit, entries[2], 'f', unit.content.indexOf('int i) { // f'));
+ unit, entries[2], 'f', unit.content.indexOf('int i) { // f'));
// Entry 3 is the edge f's argument to never, due to the assert.
assertTraceEntry(unit, entries[3], 'f', unit.content.indexOf('assert'));
- // Entry 4 is the "never" node.
- // TODO(paulberry): this node provides no additional useful information and
- // shouldn't be included in the trace.
- expect(entries[4].description, 'never');
- expect(entries[4].function, null);
- expect(entries[4].target, null);
}
Future<void> test_trace_substitutionNode() async {
@@ -1917,12 +1907,12 @@
Map<int, String> x = {};
String/*!*/ y = x[0];
''', migratedContent: '''
-class C<T extends Object/*!*/> {}
+class C<T extends Object /*!*/> {}
C<int? /*?*/ >? c;
-Map<int, String> x = {};
-String/*!*/ y = x[0]!;
+Map<int , String > x = {};
+String /*!*/ y = x[0]!;
''');
var region = unit.regions
.where((regionInfo) => regionInfo.offset == unit.content.indexOf('!;'))
@@ -1935,6 +1925,21 @@
expect(region.traces[0].description, 'Non-nullability reason');
}
+ Future<void> test_type_not_made_nullable() async {
+ UnitInfo unit = await buildInfoForSingleTestFile('int i = 0;',
+ migratedContent: 'int i = 0;');
+ var region = unit.regions
+ .where((regionInfo) => regionInfo.offset == unit.content.indexOf(' i'))
+ .single;
+ expect(region.length, 1);
+ expect(region.lineNumber, 1);
+ expect(region.explanation, "Type 'int' was not made nullable");
+ expect(region.details, isEmpty);
+ expect(region.edits.map((edit) => edit.description).toSet(),
+ {'Force type to be non-nullable.', 'Force type to be nullable.'});
+ expect(region.traces, isEmpty);
+ }
+
Future<void> test_uninitializedField() async {
UnitInfo unit = await buildInfoForSingleTestFile('''
class C {
@@ -2006,7 +2011,7 @@
if (1 == 2) v1 = 7;
g(v1!);
}
-void g(int i) => print(i.isEven);
+void g(int i) => print(i.isEven);
''');
List<RegionInfo> regions = unit.fixRegions;
expect(regions, hasLength(2));
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart
index 0412601..427e00e 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart
@@ -101,8 +101,7 @@
// Build the migration info.
InstrumentationInformation info = instrumentationListener.data;
InfoBuilder builder = InfoBuilder(
- resourceProvider, includedRoot, info, listener, adapter, migration,
- explainNonNullableTypes: true);
+ resourceProvider, includedRoot, info, listener, adapter, migration);
infos = await builder.explainMigration();
}
}
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart
index c004b7e..3f1d5ea 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart
@@ -59,34 +59,34 @@
expect(response.line, equals(1));
}
+ @FailingTest(reason: "Unmodified output reason doesn't contain detail")
Future<void> test_unmodifiedOutput_containsDetail() async {
await buildInfoForSingleTestFile('f(int a) => a.isEven;',
- migratedContent: 'f(int a) => a.isEven;');
- var response = renderRegion(2);
- expect(response.details, hasLength(1));
- var detail = response.details.single;
- expect(
- detail.description,
- equals('This value is unconditionally used in a '
- 'non-nullable context'));
- expect(detail.link.path, equals('test.dart'));
- expect(detail.link.href, equals('test.dart?offset=12&line=1'));
+ migratedContent: 'f(int a) => a.isEven;');
+ var response = renderRegion(5);
+ expect(response.details, isNotEmpty);
+ // TODO(paulberry): fix and re-enable.
+// expect(response.details, hasLength(1));
+// var detail = response.details.single;
+// expect(
+// detail.description,
+// equals('This value is unconditionally used in a '
+// 'non-nullable context'));
+// expect(detail.link.path, equals('test.dart'));
+// expect(detail.link.href, equals('test.dart?offset=12&line=1'));
}
Future<void> test_unmodifiedOutput_containsExplanation() async {
await buildInfoForSingleTestFile('f(int a) => a.isEven;',
- migratedContent: 'f(int a) => a.isEven;');
- var response = renderRegion(2);
- expect(
- response.explanation,
- equals(
- 'This type is not changed; it is determined to be non-nullable'));
+ migratedContent: 'f(int a) => a.isEven;');
+ var response = renderRegion(5);
+ expect(response.explanation, equals("Type 'int' was not made nullable"));
}
Future<void> test_unmodifiedOutput_containsPath() async {
await buildInfoForSingleTestFile('f(int a) => a.isEven;',
- migratedContent: 'f(int a) => a.isEven;');
- var response = renderRegion(2);
+ migratedContent: 'f(int a) => a.isEven;');
+ var response = renderRegion(5);
expect(response.path, equals(convertPath('/project/bin/test.dart')));
expect(response.line, equals(1));
}
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart
index b719f79..c0ac125 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart
@@ -41,7 +41,7 @@
bool b = a.isEven;
''', migratedContent: '''
int? a = null;
-bool b = a!.isEven;
+bool b = a!.isEven;
''');
var output = renderUnits()[0];
var editList = output.edits;
@@ -54,7 +54,7 @@
bool b = a.isEven;
''', migratedContent: '''
int? a = null;
-bool b = a!.isEven;
+bool b = a!.isEven;
''');
var output = renderUnits()[0];
expect(output.edits, hasLength(2));
@@ -63,7 +63,7 @@
expect(output.edits[0].explanation,
equals("Changed type 'int' to be nullable"));
expect(output.edits[1].line, equals(2));
- expect(output.edits[1].offset, equals(25));
+ expect(output.edits[1].offset, equals(26));
expect(output.edits[1].explanation,
equals('Added a non-null assertion to nullable expression'));
}
@@ -82,7 +82,7 @@
List<int> x = [null];
''', migratedContent: '''
class C {
- int hash(Iterable<int> elements) {
+ int hash(Iterable<int > elements) {
if (elements == null) {
return null.hashCode;
}
@@ -90,7 +90,7 @@
}
}
-List<int?> x = [null];
+List<int?> x = [null];
''', removeViaComments: false);
renderUnits();
// No assertions necessary; we are checking to make sure there is no crash.
@@ -110,7 +110,7 @@
List<int> x = [null];
''', migratedContent: '''
class C {
- int hash(Iterable<int> elements) {
+ int hash(Iterable<int > elements) {
if (elements == null) {
return null.hashCode;
}
@@ -118,7 +118,7 @@
}
}
-List<int?> x = [null];
+List<int?> x = [null];
''', removeViaComments: false);
var output = renderUnits()[0];
// Strip out URLs and span IDs; they're not being tested here.
@@ -127,7 +127,7 @@
.replaceAll(RegExp('id="[^"]*"'), 'id="..."');
expect(navContent, '''
class <span id="...">C</span> {
- <a href="..." class="nav-link">int</a> <span id="...">hash</span>(<a href="..." class="nav-link">Iterable</a><<a href="..." class="nav-link">int</a>> <span id="...">elements</span>) {
+ <a href="..." class="nav-link">int</a> <span id="...">hash</span>(<a href="..." class="nav-link">Iterable</a><<a href="..." class="nav-link">int</a> > <span id="...">elements</span>) {
if (<a href="..." class="nav-link">elements</a> <a href="..." class="nav-link">==</a> null) {
return null.<a href="..." class="nav-link">hashCode</a>;
}
@@ -135,13 +135,13 @@
}
}
-<a href="..." class="nav-link">List</a><<a href="..." class="nav-link">int</a>?> <span id="...">x</span> = <span id="...">[null]</span>;
+<a href="..." class="nav-link">List</a><<a href="..." class="nav-link">int</a>?> <span id="...">x</span> = <span id="...">[null]</span>;
''');
}
Future<void> test_navContentContainsEscapedHtml() async {
await buildInfoForSingleTestFile('List<String> a = null;',
- migratedContent: 'List<String>? a = null;');
+ migratedContent: 'List<String >? a = null;');
var output = renderUnits()[0];
// Strip out URLs which will change; not being tested here.
var navContent =
@@ -149,7 +149,7 @@
expect(
navContent,
contains(r'<a href="..." class="nav-link">List</a>'
- r'<<a href="..." class="nav-link">String</a>>? '
+ r'<<a href="..." class="nav-link">String</a> >? '
r'<span id="o13">a</span> = <span id="o17">null</span>;'));
}
@@ -193,7 +193,7 @@
}
''', migratedContent: '''
import 'dart:async';
-Future<int> f(Future<int> x) {
+Future<int > f(Future<int > x) {
return x.whenComplete(() {});
}
''');
@@ -203,31 +203,36 @@
Future<void> test_regionsContainsEscapedHtml_ampersand() async {
await buildInfoForSingleTestFile('bool a = true && false;',
- migratedContent: 'bool a = true && false;');
+ migratedContent: 'bool a = true && false;');
var output = renderUnits()[0];
- expect(output.regions, contains('bool a = true && false;'));
+ expect(
+ output.regions,
+ contains('bool<span class="region informative-region" data-offset="4" '
+ 'data-line="1"> </span> a = true && false;'));
}
Future<void> test_regionsContainsEscapedHtml_betweenRegions() async {
await buildInfoForSingleTestFile('List<String> a = null;',
- migratedContent: 'List<String>? a = null;');
- var output = renderUnits()[0];
- var regions = _stripDataAttributes(output.regions);
- expect(
- regions,
- contains('List<String>'
- '<span class="region added-region">?</span> a = null;'));
- }
-
- Future<void> test_regionsContainsEscapedHtml_region() async {
- await buildInfoForSingleTestFile('f(List<String> a) => a.join(",");',
- migratedContent: 'f(List<String> a) => a.join(",");');
+ migratedContent: 'List<String >? a = null;');
var output = renderUnits()[0];
var regions = _stripDataAttributes(output.regions);
expect(
regions,
contains(
- '<span class="region unchanged-region">List<String></span>'));
+ 'List<String<span class="region informative-region"> </span>>'
+ '<span class="region added-region">?</span> a = null;'));
+ }
+
+ Future<void> test_regionsContainsEscapedHtml_region() async {
+ await buildInfoForSingleTestFile('f(List<String> a) => a.join(",");',
+ migratedContent: 'f(List<String > a) => a.join(",");');
+ var output = renderUnits()[0];
+ var regions = _stripDataAttributes(output.regions);
+ expect(
+ regions,
+ contains(
+ 'List<String<span class="region informative-region"> </span>'
+ '><span class="region informative-region"> </span>'));
}
UnitInfo unit(String path, String content, {List<RegionInfo> regions}) {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
index 13c325b..b315f25 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
@@ -65,6 +65,26 @@
''');
}
+ Future<void> test_setterOnDirective() async {
+ addSource('/home/test/lib/a.dart', r'''
+void set setter(int i) {}
+''');
+ await resolveTestUnit('''
+import 'a.dart';
+
+main() {
+ setter = 42;
+}
+''');
+ await assertHasAssistAt('import ', '''
+import 'a.dart' show setter;
+
+main() {
+ setter = 42;
+}
+''');
+ }
+
Future<void> test_onUri() async {
await resolveTestUnit('''
import 'dart:math';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart
index f384b72..99c530f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart
@@ -12,6 +12,7 @@
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(AddConstTest);
+ defineReflectiveTests(AddConstToImmutableConstructorTest);
});
}
@@ -58,3 +59,54 @@
''');
}
}
+
+@reflectiveTest
+class AddConstToImmutableConstructorTest extends FixProcessorLintTest {
+ @override
+ FixKind get kind => DartFixKind.ADD_CONST;
+
+ @override
+ String get lintCode => LintNames.prefer_const_constructors_in_immutables;
+
+ Future<void> test_constConstructor() async {
+ addMetaPackage();
+ await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+@immutable
+class A {
+ A();
+}
+''');
+ await assertHasFix('''
+import 'package:meta/meta.dart';
+
+@immutable
+class A {
+ const A();
+}
+''');
+ }
+
+ Future<void> test_constConstructorWithComment() async {
+ addMetaPackage();
+ await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+@immutable
+class A {
+ /// Comment.
+ A();
+}
+''');
+ await assertHasFix('''
+import 'package:meta/meta.dart';
+
+@immutable
+class A {
+ /// Comment.
+ const A();
+}
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart b/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
index fb4c0c5..2826928 100644
--- a/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
+++ b/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
@@ -79,20 +79,21 @@
group('MeanReciprocalRankComputer', () {
test('empty', () {
var mrrc = MeanReciprocalRankComputer('');
- expect(mrrc.rankCount, equals(0));
- expect(mrrc.ranks, isEmpty);
- expect(mrrc.getMRR(), equals(0));
+ expect(mrrc.count, equals(0));
+ expect(mrrc.mrr, equals(0));
});
test('clear', () {
var mrrc = MeanReciprocalRankComputer('');
mrrc.addRank(2);
- expect(mrrc.rankCount, equals(1));
- expect(mrrc.ranks, isNotEmpty);
+ expect(mrrc.count, equals(1));
+ expect(mrrc.mrr, equals(1 / 2));
+ expect(mrrc.mrr_5, equals(1 / 2));
mrrc.clear();
- expect(mrrc.rankCount, equals(0));
- expect(mrrc.ranks, isEmpty);
+ expect(mrrc.count, equals(0));
+ expect(mrrc.mrr, equals(0));
+ expect(mrrc.mrr_5, equals(0));
});
test('mmr- single value', () {
@@ -102,9 +103,9 @@
mrrc.addRank(3);
mrrc.addRank(3);
mrrc.addRank(3);
- expect(mrrc.rankCount, equals(5));
- expect(mrrc.ranks, equals([3, 3, 3, 3, 3]));
- expect(mrrc.getMRR(), doubleEquals(1 / 3));
+ expect(mrrc.count, equals(5));
+ expect(mrrc.mrr, doubleEquals(1 / 3));
+ expect(mrrc.mrr_5, doubleEquals(1 / 3));
});
test('mmr- example', () {
@@ -112,19 +113,21 @@
mrrc.addRank(3);
mrrc.addRank(2);
mrrc.addRank(1);
- expect(mrrc.rankCount, equals(3));
- expect(mrrc.ranks, equals([3, 2, 1]));
- expect(mrrc.getMRR(), doubleEquals(11 / 18));
+ expect(mrrc.count, equals(3));
+ expect(mrrc.mrr, doubleEquals(11 / 18));
+ expect(mrrc.mrr_5, doubleEquals(11 / 18));
});
test('mmr- max rank', () {
var mrrc = MeanReciprocalRankComputer('');
+ mrrc.addRank(6);
+ mrrc.addRank(5);
+ mrrc.addRank(4);
mrrc.addRank(3);
mrrc.addRank(2);
mrrc.addRank(1);
- expect(mrrc.rankCount, equals(3));
- expect(mrrc.ranks, equals([3, 2, 1]));
- expect(mrrc.getMRR(2), doubleEquals(1 / 2));
+ expect(mrrc.count, equals(6));
+ expect(mrrc.mrr, greaterThan(mrrc.mrr_5));
});
});
diff --git a/pkg/analysis_server/test/utils/package_root.dart b/pkg/analysis_server/test/utils/package_root.dart
index 1957a61..ab5cdac 100644
--- a/pkg/analysis_server/test/utils/package_root.dart
+++ b/pkg/analysis_server/test/utils/package_root.dart
@@ -11,7 +11,8 @@
String get packageRoot {
// If the package root directory is specified on the command line using
// -DpkgRoot=..., use it.
- String pkgRootVar = const String.fromEnvironment('pkgRoot');
+ const String pkgRootVar =
+ bool.hasEnvironment('pkgRoot') ? String.fromEnvironment('pkgRoot') : null;
if (pkgRootVar != null) {
String path = pathos.join(Directory.current.path, pkgRootVar);
if (!path.endsWith(pathos.separator)) path += pathos.separator;
diff --git a/pkg/analysis_server/tool/completion_metrics/metrics_util.dart b/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
index 2a75fee..b9bca81 100644
--- a/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
+++ b/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
@@ -84,49 +84,59 @@
}
}
-/// A computer for the mean reciprocal rank,
+/// A computer for the mean reciprocal rank. The MRR as well as the MRR only
+/// if the item was in the top 5 in the list see [MAX_RANK], is computed.
/// https://en.wikipedia.org/wiki/Mean_reciprocal_rank.
class MeanReciprocalRankComputer {
+ static final int MAX_RANK = 5;
final String name;
- final List<int> ranks = [];
- MeanReciprocalRankComputer(this.name);
+ double _sum = 0;
+ double _sum_5 = 0;
+ int _count = 0;
- int get rankCount => ranks.length;
+ MeanReciprocalRankComputer(
+ this.name,
+ );
+
+ int get count => _count;
void addRank(int rank) {
- ranks.add(rank);
+ if (rank != 0) {
+ _sum += 1 / rank;
+ if (rank <= MAX_RANK) {
+ _sum_5 += 1 / rank;
+ }
+ }
+ _count++;
}
- void clear() => ranks.clear();
+ void clear() {
+ _sum = 0;
+ _sum_5 = 0;
+ _count = 0;
+ }
- double getMRR([int maxRank = 0]) {
- if (ranks.isEmpty || maxRank < 0) {
+ double get mrr {
+ if (count == 0) {
return 0;
}
- double sum = 0;
- ranks.forEach((rank) {
- if (maxRank == 0) {
- if (rank != 0) {
- sum += 1 / rank;
- }
- } else {
- if (rank != 0 && rank <= maxRank) {
- sum += 1 / rank;
- }
- }
- });
- return sum / rankCount;
+ return _sum / count;
+ }
+
+ double get mrr_5 {
+ if (count == 0) {
+ return 0;
+ }
+ return _sum_5 / count;
}
void printMean() {
- var mrrVal = getMRR();
- print('Mean Reciprocal Rank \'$name\' (total = $rankCount)');
- print('mmr = ${mrrVal.toStringAsFixed(6)} '
- '(inverse = ${(1 / mrrVal).toStringAsFixed(3)})');
+ print('Mean Reciprocal Rank \'$name\' (total = $count)');
+ print('mmr = ${mrr.toStringAsFixed(6)} '
+ '(inverse = ${(1 / mrr).toStringAsFixed(3)})');
- var mrrVal5 = getMRR(5);
- print('mmr_5 = ${mrrVal5.toStringAsFixed(6)} '
- '(inverse = ${(1 / mrrVal5).toStringAsFixed(3)})');
+ print('mmr_5 = ${mrr_5.toStringAsFixed(6)} '
+ '(inverse = ${(1 / mrr_5).toStringAsFixed(3)})');
}
}
diff --git a/pkg/analysis_server_client/lib/server.dart b/pkg/analysis_server_client/lib/server.dart
index 7dde935..f02c204 100644
--- a/pkg/analysis_server_client/lib/server.dart
+++ b/pkg/analysis_server_client/lib/server.dart
@@ -6,39 +6,22 @@
import 'dart:convert';
import 'dart:io';
+import 'package:analysis_server_client/src/server_base.dart';
import 'package:analysis_server_client/listener/server_listener.dart';
import 'package:analysis_server_client/protocol.dart';
import 'package:path/path.dart';
-
-/// Type of callbacks used to process notifications.
-typedef NotificationProcessor = void Function(Notification notification);
+export 'package:analysis_server_client/src/server_base.dart'
+ show NotificationProcessor;
/// Instances of the class [Server] manage a server process,
/// and facilitate communication to and from the server.
///
/// Clients may not extend, implement or mix-in this class.
-class Server {
- /// If not `null`, [_listener] will be sent information
- /// about interactions with the server.
- final ServerListener _listener;
-
+class Server extends ServerBase {
/// Server process object, or `null` if server hasn't been started yet
/// or if the server has already been stopped.
Process _process;
- /// Replicate all stdout/stderr data from the server process to stdout/stderr,
- /// when true.
- final bool _stdioPassthrough;
-
- /// Commands that have been sent to the server but not yet acknowledged,
- /// and the [Completer] objects which should be completed
- /// when acknowledgement is received.
- final _pendingCommands = <String, Completer<Map<String, dynamic>>>{};
-
- /// Number which should be used to compute the 'id'
- /// to send in the next command sent to the server.
- int _nextId = 0;
-
/// The stderr subscription or `null` if either
/// [listenToOutput] has not been called or [stop] has been called.
StreamSubscription<String> _stderrSubscription;
@@ -49,13 +32,13 @@
Server(
{ServerListener listener, Process process, bool stdioPassthrough = false})
- : _listener = listener,
- _process = process,
- _stdioPassthrough = stdioPassthrough;
+ : _process = process,
+ super(listener: listener, stdioPassthrough: stdioPassthrough);
/// Force kill the server. Returns exit code future.
+ @override
Future<int> kill({String reason = 'none'}) {
- _listener?.killingServerProcess(reason);
+ listener?.killingServerProcess(reason);
final process = _process;
_process = null;
process.kill();
@@ -64,69 +47,16 @@
/// Start listening to output from the server,
/// and deliver notifications to [notificationProcessor].
+ @override
void listenToOutput({NotificationProcessor notificationProcessor}) {
_stdoutSubscription = _process.stdout
.transform(utf8.decoder)
.transform(LineSplitter())
- .listen((String line) {
- if (_stdioPassthrough) stdout.writeln(line);
- String trimmedLine = line.trim();
-
- // Guard against lines like:
- // {"event":"server.connected","params":{...}}Observatory listening on ...
- const observatoryMessage = 'Observatory listening on ';
- if (trimmedLine.contains(observatoryMessage)) {
- trimmedLine = trimmedLine
- .substring(0, trimmedLine.indexOf(observatoryMessage))
- .trim();
- }
- if (trimmedLine.isEmpty) {
- return;
- }
-
- _listener?.messageReceived(trimmedLine);
- Map<String, dynamic> message;
- try {
- message = json.decoder.convert(trimmedLine);
- } catch (exception) {
- _listener?.badMessage(trimmedLine, exception);
- return;
- }
-
- final id = message[Response.ID];
- if (id != null) {
- // Handle response
- final completer = _pendingCommands.remove(id);
- if (completer == null) {
- _listener?.unexpectedResponse(message, id);
- }
- if (message.containsKey(Response.ERROR)) {
- completer.completeError(RequestError.fromJson(
- ResponseDecoder(null), '.error', message[Response.ERROR]));
- } else {
- completer.complete(message[Response.RESULT]);
- }
- } else {
- // Handle notification
- final String event = message[Notification.EVENT];
- if (event != null) {
- if (notificationProcessor != null) {
- notificationProcessor(
- Notification(event, message[Notification.PARAMS]));
- }
- } else {
- _listener?.unexpectedMessage(message);
- }
- }
- });
+ .listen((line) => outputProcessor(line, notificationProcessor));
_stderrSubscription = _process.stderr
.transform(utf8.decoder)
.transform(LineSplitter())
- .listen((String line) {
- if (_stdioPassthrough) stderr.writeln(line);
- String trimmedLine = line.trim();
- _listener?.errorMessage(trimmedLine);
- });
+ .listen((line) => errorProcessor(line, notificationProcessor));
}
/// Send a command to the server. An 'id' will be automatically assigned.
@@ -136,23 +66,10 @@
/// the future will be completed with the 'result' field from the response.
/// If the server acknowledges the command with an error response,
/// the future will be completed with an error.
+ @override
Future<Map<String, dynamic>> send(
- String method, Map<String, dynamic> params) {
- String id = '${_nextId++}';
- Map<String, dynamic> command = <String, dynamic>{
- Request.ID: id,
- Request.METHOD: method
- };
- if (params != null) {
- command[Request.PARAMS] = params;
- }
- final completer = Completer<Map<String, dynamic>>();
- _pendingCommands[id] = completer;
- String line = json.encode(command);
- _listener?.requestSent(line);
- _process.stdin.add(utf8.encoder.convert('$line\n'));
- return completer.future;
- }
+ String method, Map<String, dynamic> params) =>
+ sendCommandWith(method, params, _process.stdin.add);
/// Start the server.
///
@@ -166,6 +83,7 @@
/// If [enableAsserts] is specified, then asserts will be enabled in the new
/// dart process for that server. This is typically just useful to enable
/// locally for debugging.
+ @override
Future start({
String clientId,
String clientVersion,
@@ -222,48 +140,30 @@
// Add the server executable.
//
arguments.add(serverPath);
- //
- // Add server arguments.
- //
- // TODO(danrubel): Consider moving all cmdline argument consts
- // out of analysis_server and into analysis_server_client
- if (clientId != null) {
- arguments.add('--client-id');
- arguments.add(clientId);
- }
- if (clientVersion != null) {
- arguments.add('--client-version');
- arguments.add(clientVersion);
- }
- if (suppressAnalytics) {
- arguments.add('--suppress-analytics');
- }
- if (diagnosticPort != null) {
- arguments.add('--port');
- arguments.add(diagnosticPort.toString());
- }
- if (instrumentationLogFile != null) {
- arguments.add('--instrumentation-log-file=$instrumentationLogFile');
- }
- if (sdkPath != null) {
- arguments.add('--sdk=$sdkPath');
- }
- if (useAnalysisHighlight2) {
- arguments.add('--useAnalysisHighlight2');
- }
- _listener?.startingServer(dartBinary, arguments);
+
+ arguments.addAll(getServerArguments(
+ clientId: clientId,
+ clientVersion: clientVersion,
+ suppressAnalytics: suppressAnalytics,
+ diagnosticPort: diagnosticPort,
+ instrumentationLogFile: instrumentationLogFile,
+ sdkPath: sdkPath,
+ useAnalysisHighlight2: useAnalysisHighlight2));
+
+ listener?.startingServer(dartBinary, arguments);
_process = await Process.start(dartBinary, arguments);
// ignore: unawaited_futures
_process.exitCode.then((int code) {
if (code != 0 && _process != null) {
// Report an error if server abruptly terminated
- _listener?.unexpectedStop(code);
+ listener?.unexpectedStop(code);
}
});
}
/// Attempt to gracefully shutdown the server.
/// If that fails, then kill the process.
+ @override
Future<int> stop({Duration timeLimit}) async {
timeLimit ??= const Duration(seconds: 5);
if (_process == null) {
@@ -286,7 +186,7 @@
return process.exitCode.timeout(
timeLimit,
onTimeout: () {
- _listener?.killingServerProcess('server failed to exit');
+ listener?.killingServerProcess('server failed to exit');
process.kill();
return process.exitCode;
},
diff --git a/pkg/analysis_server_client/lib/src/server_base.dart b/pkg/analysis_server_client/lib/src/server_base.dart
new file mode 100644
index 0000000..bb1e02e
--- /dev/null
+++ b/pkg/analysis_server_client/lib/src/server_base.dart
@@ -0,0 +1,207 @@
+// 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 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:analysis_server_client/listener/server_listener.dart';
+import 'package:analysis_server_client/protocol.dart';
+
+/// Type of callbacks used to process notifications.
+typedef NotificationProcessor = void Function(Notification notification);
+
+/// A function via which data can be sent to a started server.
+typedef CommandSender = void Function(List<int> utf8bytes);
+
+///
+/// Add server arguments.
+///
+/// TODO(danrubel): Consider moving all cmdline argument consts
+/// out of analysis_server and into analysis_server_client.
+List<String> getServerArguments({
+ String clientId,
+ String clientVersion,
+ int diagnosticPort,
+ String instrumentationLogFile,
+ String sdkPath,
+ bool suppressAnalytics,
+ bool useAnalysisHighlight2 = false,
+}) {
+ List<String> arguments = [];
+
+ if (clientId != null) {
+ arguments.add('--client-id');
+ arguments.add(clientId);
+ }
+ if (clientVersion != null) {
+ arguments.add('--client-version');
+ arguments.add(clientVersion);
+ }
+ if (suppressAnalytics) {
+ arguments.add('--suppress-analytics');
+ }
+ if (diagnosticPort != null) {
+ arguments.add('--port');
+ arguments.add(diagnosticPort.toString());
+ }
+ if (instrumentationLogFile != null) {
+ arguments.add('--instrumentation-log-file=$instrumentationLogFile');
+ }
+ if (sdkPath != null) {
+ arguments.add('--sdk=$sdkPath');
+ }
+ if (useAnalysisHighlight2) {
+ arguments.add('--useAnalysisHighlight2');
+ }
+ return arguments;
+}
+
+/// Implementations of the class [ServerBase] manage an analysis server,
+/// and facilitate communication to and from the server.
+///
+/// Clients outside of this package may not extend or implement this class.
+abstract class ServerBase {
+ /// Replicate all data from the server process to stdout/stderr, when true.
+ final bool _stdioPassthrough;
+
+ /// Number which should be used to compute the 'id'
+ /// to send in the next command sent to the server.
+ int _nextId = 0;
+
+ /// If not `null`, [_listener] will be sent information
+ /// about interactions with the server.
+ final ServerListener _listener;
+
+ ServerListener get listener => _listener;
+
+ ServerBase({ServerListener listener, bool stdioPassthrough = false})
+ : _listener = listener,
+ _stdioPassthrough = stdioPassthrough;
+
+ /// Commands that have been sent to the server but not yet acknowledged,
+ /// and the [Completer] objects which should be completed
+ /// when acknowledgement is received.
+ final _pendingCommands = <String, Completer<Map<String, dynamic>>>{};
+
+ /// Force kill the server. Returns a future that completes when the server
+ /// stops.
+ Future kill({String reason = 'none'});
+
+ /// Start listening to output from the server,
+ /// and deliver notifications to [notificationProcessor].
+ void listenToOutput({NotificationProcessor notificationProcessor});
+
+ /// Send a command to the server. An 'id' will be automatically assigned.
+ /// The returned [Future] will be completed when the server acknowledges
+ /// the command with a response.
+ /// If the server acknowledges the command with a normal (non-error) response,
+ /// the future will be completed with the 'result' field from the response.
+ /// If the server acknowledges the command with an error response,
+ /// the future will be completed with an error.
+ Future<Map<String, dynamic>> send(String method, Map<String, dynamic> params);
+
+ /// Encodes a request for transmission and sends it as a utf8 encoded byte
+ /// string with [sendWith].
+ Future<Map<String, dynamic>> sendCommandWith(
+ String method, Map<String, dynamic> params, CommandSender sendWith) {
+ String id = '${_nextId++}';
+ Map<String, dynamic> command = <String, dynamic>{
+ Request.ID: id,
+ Request.METHOD: method
+ };
+ if (params != null) {
+ command[Request.PARAMS] = params;
+ }
+ final completer = Completer<Map<String, dynamic>>();
+ _pendingCommands[id] = completer;
+ String line = json.encode(command);
+ listener?.requestSent(line);
+ sendWith(utf8.encoder.convert('$line\n'));
+ return completer.future;
+ }
+
+ /// If the implementation of [ServerBase] captures an error stream,
+ /// it can use this to forward the errors to [listener] and [stderr] if
+ /// appropriate.
+ void errorProcessor(
+ String line, NotificationProcessor notificationProcessor) {
+ if (_stdioPassthrough) stderr.writeln(line);
+ String trimmedLine = line.trim();
+ listener?.errorMessage(trimmedLine);
+ }
+
+ /// Handle a (possibly) json encoded object, completing the [Completer] in
+ /// [_pendingCommands] corresponding to the response. Reports problems in
+ /// decoding or message synchronization using [listener], and replicates
+ /// raw data to [stdout] as appropriate.
+ void outputProcessor(
+ String line, NotificationProcessor notificationProcessor) {
+ if (_stdioPassthrough) stdout.writeln(line);
+ String trimmedLine = line.trim();
+
+ // Guard against lines like:
+ // {"event":"server.connected","params":{...}}Observatory listening on ...
+ const observatoryMessage = 'Observatory listening on ';
+ if (trimmedLine.contains(observatoryMessage)) {
+ trimmedLine = trimmedLine
+ .substring(0, trimmedLine.indexOf(observatoryMessage))
+ .trim();
+ }
+ if (trimmedLine.isEmpty) {
+ return;
+ }
+
+ listener?.messageReceived(trimmedLine);
+ Map<String, dynamic> message;
+ try {
+ message = json.decoder.convert(trimmedLine);
+ } catch (exception) {
+ listener?.badMessage(trimmedLine, exception);
+ return;
+ }
+
+ final id = message[Response.ID];
+ if (id != null) {
+ // Handle response
+ final completer = _pendingCommands.remove(id);
+ if (completer == null) {
+ listener?.unexpectedResponse(message, id);
+ }
+ if (message.containsKey(Response.ERROR)) {
+ completer.completeError(RequestError.fromJson(
+ ResponseDecoder(null), '.error', message[Response.ERROR]));
+ } else {
+ completer.complete(message[Response.RESULT]);
+ }
+ } else {
+ // Handle notification
+ final String event = message[Notification.EVENT];
+ if (event != null) {
+ if (notificationProcessor != null) {
+ notificationProcessor(
+ Notification(event, message[Notification.PARAMS]));
+ }
+ } else {
+ listener?.unexpectedMessage(message);
+ }
+ }
+ }
+
+ /// Start the server. The returned future completes when the server
+ /// is started and it is valid to call [listenToOutput].
+ Future start({
+ String clientId,
+ String clientVersion,
+ int diagnosticPort,
+ String instrumentationLogFile,
+ String sdkPath,
+ bool suppressAnalytics,
+ bool useAnalysisHighlight2,
+ });
+
+ /// Attempt to gracefully shutdown the server.
+ /// If that fails, then force it to shut down.
+ Future stop({Duration timeLimit});
+}
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index bb65367..47f3f08 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -126,7 +126,7 @@
CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
CompileTimeErrorCode.CONTINUE_LABEL_ON_SWITCH,
- CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH,
+ CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR,
CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 6376a63..5a3f02a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -91,7 +91,7 @@
/// TODO(scheglov) Clean up the list of implicitly analyzed files.
class AnalysisDriver implements AnalysisDriverGeneric {
/// The version of data format, should be incremented on every format change.
- static const int DATA_VERSION = 98;
+ static const int DATA_VERSION = 99;
/// The length of the list returned by [_computeDeclaredVariablesSignature].
static const int _declaredVariablesSignatureLength = 4;
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 7c6cc1c..4ab24f0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -89,13 +89,6 @@
final List<UsedImportedElements> _usedImportedElementsList = [];
final List<UsedLocalElements> _usedLocalElementsList = [];
- /**
- * Constants in the current library.
- *
- * TODO(scheglov) Remove after https://github.com/dart-lang/sdk/issues/31925
- */
- final Set<ConstantEvaluationTarget> _libraryConstants = {};
-
final Set<ConstantEvaluationTarget> _constants = {};
LibraryAnalyzer(
@@ -158,7 +151,6 @@
timerLibraryAnalyzerConst.start();
units.values.forEach(_findConstants);
- _clearConstantEvaluationResults();
_computeConstants();
timerLibraryAnalyzerConst.stop();
@@ -215,24 +207,6 @@
return results;
}
- /**
- * Clear evaluation results for all constants before computing them again.
- * The reason is described in https://github.com/dart-lang/sdk/issues/35940
- *
- * Otherwise, we reuse results, including errors are recorded only when
- * we evaluate constants resynthesized from summaries.
- *
- * TODO(scheglov) Remove after https://github.com/dart-lang/sdk/issues/31925
- */
- void _clearConstantEvaluationResults() {
- for (var constant in _libraryConstants) {
- if (constant is ConstFieldElementImpl_ofEnum) continue;
- if (constant is ConstVariableElement) {
- constant.evaluationResult = null;
- }
- }
- }
-
void _computeConstantErrors(
ErrorReporter errorReporter, CompilationUnit unit) {
ConstantVerifier constantVerifier = ConstantVerifier(
@@ -450,7 +424,6 @@
void _findConstants(CompilationUnit unit) {
ConstantFinder constantFinder = ConstantFinder();
unit.accept(constantFinder);
- _libraryConstants.addAll(constantFinder.constantsToCompute);
_constants.addAll(constantFinder.constantsToCompute);
var dependenciesFinder = ConstantExpressionsDependenciesFinder();
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 47f0cde..148a0ab 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -14,6 +14,7 @@
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/analysis/driver.dart' as driver;
import 'package:analyzer/src/dart/analysis/uri_converter.dart';
+import 'package:analyzer/src/dart/element/class_hierarchy.dart';
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
import 'package:analyzer/src/dart/element/type_provider.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
@@ -38,6 +39,7 @@
/// The cache of libraries for URIs.
final Map<String, LibraryElement> _uriToLibraryCache = {};
+ final ClassHierarchy classHierarchy = ClassHierarchy();
final InheritanceManager3 inheritanceManager = InheritanceManager3();
/// Initialize a newly created analysis session.
diff --git a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
new file mode 100644
index 0000000..a02599d
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
@@ -0,0 +1,110 @@
+// 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:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+class ClassHierarchy {
+ final Map<ClassElement, _Hierarchy> _map = {};
+
+ List<InterfaceType> implementedInterfaces(ClassElement element) {
+ var hierarchy = _map[element];
+
+ if (hierarchy != null) {
+ return hierarchy.interfaces;
+ }
+
+ hierarchy = _Hierarchy(
+ interfaces: const <InterfaceType>[],
+ );
+ _map[element] = hierarchy;
+
+ var library = element.library as LibraryElementImpl;
+ var typeSystem = library.typeSystem;
+ var map = <ClassElement, _ClassInterfaceType>{};
+
+ void appendOne(InterfaceType type) {
+ var element = type.element;
+ if (library.isNonNullableByDefault) {
+ var classResult = map[element];
+ if (classResult == null) {
+ classResult = _ClassInterfaceType(typeSystem);
+ map[element] = classResult;
+ }
+ classResult.update(type);
+ } else {
+ map[element] ??= _ClassInterfaceType(typeSystem)..update(type);
+ }
+ }
+
+ void append(InterfaceType type) {
+ if (type == null) {
+ return;
+ }
+
+ appendOne(type);
+
+ var substitution = Substitution.fromInterfaceType(type);
+ var rawInterfaces = implementedInterfaces(type.element);
+ for (var rawInterface in rawInterfaces) {
+ var newInterface = substitution.substituteType(rawInterface);
+ newInterface = library.toLegacyTypeIfOptOut(newInterface);
+ appendOne(newInterface);
+ }
+ }
+
+ append(element.supertype);
+ for (var type in element.superclassConstraints) {
+ append(type);
+ }
+ for (var type in element.interfaces) {
+ append(type);
+ }
+ for (var type in element.mixins) {
+ append(type);
+ }
+
+ var result = map.values.map((e) => e.type).toList(growable: false);
+ hierarchy.interfaces = result;
+ return result;
+ }
+}
+
+class _ClassInterfaceType {
+ final TypeSystemImpl _typeSystem;
+
+ InterfaceType _notNormalized;
+ InterfaceType _currentMerge;
+
+ _ClassInterfaceType(this._typeSystem);
+
+ InterfaceType get type => _currentMerge ?? _notNormalized;
+
+ void update(InterfaceType type) {
+ if (_currentMerge == null) {
+ if (_notNormalized == null) {
+ _notNormalized = type;
+ return;
+ } else {
+ _currentMerge = _typeSystem.normalize(_notNormalized);
+ }
+ }
+
+ var normType = _typeSystem.normalize(type);
+ try {
+ _currentMerge = _typeSystem.topMerge(_currentMerge, normType);
+ } catch (e) {
+ // ignored
+ }
+ }
+}
+
+class _Hierarchy {
+ List<InterfaceType> interfaces;
+
+ _Hierarchy({this.interfaces});
+}
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index ff2cdda..332fbe9 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -12,6 +12,7 @@
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/dart/analysis/session.dart';
import 'package:analyzer/src/dart/constant/compute.dart';
import 'package:analyzer/src/dart/constant/evaluation.dart';
import 'package:analyzer/src/dart/constant/value.dart';
@@ -519,9 +520,8 @@
@override
List<InterfaceType> get allSupertypes {
- List<InterfaceType> list = <InterfaceType>[];
- collectAllSupertypes(list, thisType, thisType);
- return list;
+ var sessionImpl = library.session as AnalysisSessionImpl;
+ return sessionImpl.classHierarchy.implementedInterfaces(this);
}
@override
@@ -1164,7 +1164,13 @@
bool _isInterfaceTypeClass(DartType type) {
if (type is InterfaceType) {
var element = type.element;
- return !element.isEnum && !element.isMixin;
+ if (element.isEnum || element.isMixin) {
+ return false;
+ }
+ if (type.isDartCoreFunction) {
+ return false;
+ }
+ return true;
}
return false;
}
@@ -1172,7 +1178,9 @@
/// Return `true` if the given [type] is an [InterfaceType] that can be used
/// as an interface or a mixin.
bool _isInterfaceTypeInterface(DartType type) {
- return type is InterfaceType && !type.element.isEnum;
+ return type is InterfaceType &&
+ !type.element.isEnum &&
+ !type.isDartCoreFunction;
}
bool _safeIsOrInheritsProxy(
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 6736d8d..9c45ee3 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -85,13 +85,6 @@
String name = nameNode.name;
_currentName = Name(_definingLibraryUri, name);
- //
- // Synthetic identifiers have been already reported during parsing.
- //
- if (nameNode.isSynthetic) {
- return;
- }
-
Expression receiver = node.realTarget;
if (receiver == null) {
@@ -670,11 +663,14 @@
} else if (receiverType is FunctionType) {
receiverClassName = 'Function';
}
- _resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_METHOD,
- nameNode,
- [name, receiverClassName],
- );
+
+ if (!nameNode.isSynthetic) {
+ _resolver.errorReporter.reportErrorForNode(
+ StaticTypeWarningCode.UNDEFINED_METHOD,
+ nameNode,
+ [name, receiverClassName],
+ );
+ }
}
void _resolveReceiverTypeLiteral(MethodInvocation node, ClassElement receiver,
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 6ec81e3..b857c95 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1348,15 +1348,12 @@
"A continue label resolves to switch, must be loop or switch member");
/**
- * It is an error to call the default List constructor with a length argument
- * and a type argument which is potentially non-nullable.
+ * It is an error to call the default `List` constructor.
*/
- static const CompileTimeErrorCode DEFAULT_LIST_CONSTRUCTOR_MISMATCH =
- CompileTimeErrorCode(
- 'DEFAULT_LIST_CONSTRUCTOR_MISMATCH',
- "A list whose values can't be 'null' can't be given an initial "
- "length because the initial values would all be 'null'.",
- correction: "Try removing the argument or using 'List.filled'.");
+ static const CompileTimeErrorCode DEFAULT_LIST_CONSTRUCTOR =
+ CompileTimeErrorCode('DEFAULT_LIST_CONSTRUCTOR',
+ "It is an error to call the default List constructor.",
+ correction: "Try using 'List.filled' or 'List.generate'.");
/**
* 6.2.1 Required Formals: By means of a function signature that names the
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 3242a16..a67b61e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1789,9 +1789,8 @@
}
if (extendsClause != null) {
- InterfaceType superclassType = _enclosingClass.supertype;
- ClassElement superclassElement = superclassType?.element;
- if (superclassElement != null && superclassElement.name == "Function") {
+ Element superElement = extendsClause.superclass.name.staticElement;
+ if (superElement != null && superElement.name == "Function") {
_errorReporter.reportErrorForNode(
HintCode.DEPRECATED_EXTENDS_FUNCTION, extendsClause.superclass);
}
@@ -3300,13 +3299,11 @@
InstanceCreationExpression node, InterfaceType type) {
if (!_isNonNullableByDefault) return;
- if (node.constructorName.name == null &&
- node.argumentList.arguments.length == 1 &&
- type.isDartCoreList &&
- _typeSystem.isPotentiallyNonNullable(type.typeArguments[0])) {
+ if (node.constructorName.name == null && type.isDartCoreList) {
_errorReporter.reportErrorForNode(
- CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH,
- node.constructorName);
+ CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR,
+ node.constructorName,
+ );
}
}
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 60443f8..3a57819 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -1285,7 +1285,19 @@
TypeProvider get typeProvider;
@override
- DartType flatten(DartType type) {
+ TypeImpl flatten(DartType type) {
+ if (identical(type, UnknownInferredType.instance)) {
+ return type;
+ }
+
+ // if T is S? then flatten(T) = flatten(S)?
+ // if T is S* then flatten(T) = flatten(S)*
+ NullabilitySuffix nullabilitySuffix = type.nullabilitySuffix;
+ if (nullabilitySuffix != NullabilitySuffix.none) {
+ var S = (type as TypeImpl).withNullability(NullabilitySuffix.none);
+ return flatten(S).withNullability(nullabilitySuffix);
+ }
+
if (type is InterfaceType) {
// Implement the cases:
// - "If T = FutureOr<S> then flatten(T) = S."
@@ -2970,12 +2982,14 @@
var T0 = _T0 as TypeImpl;
var T1 = _T1 as TypeImpl;
+ var T1_nullability = T1.nullabilitySuffix;
+ var T0_nullability = T0.nullabilitySuffix;
+
// Right Top: if `T1` is a top type (i.e. `dynamic`, or `void`, or
// `Object?`) then `T0 <: T1`.
if (identical(T1, DynamicTypeImpl.instance) ||
identical(T1, VoidTypeImpl.instance) ||
- T1.nullabilitySuffix == NullabilitySuffix.question &&
- T1.isDartCoreObject) {
+ T1_nullability == NullabilitySuffix.question && T1.isDartCoreObject) {
return true;
}
@@ -2994,9 +3008,7 @@
}
// Right Object: if `T1` is `Object` then:
- var T1_nullability = T1.nullabilitySuffix;
if (T1_nullability == NullabilitySuffix.none && T1.isDartCoreObject) {
- var T0_nullability = T0.nullabilitySuffix;
// * if `T0` is an unpromoted type variable with bound `B`,
// then `T0 <: T1` iff `B <: Object`.
// * if `T0` is a promoted type variable `X & S`,
@@ -3039,7 +3051,6 @@
}
// Left Null: if `T0` is `Null` then:
- var T0_nullability = T0.nullabilitySuffix;
if (T0_nullability == NullabilitySuffix.none && T0.isDartCoreNull) {
// * If `T1` is `FutureOr<S>` for some `S`, then the query is true iff
// `Null <: S`.
@@ -3073,6 +3084,9 @@
// Right Legacy `T1` is `S1*` then:
// * `T0 <: T1` iff `T0 <: S1?`.
if (T1_nullability == NullabilitySuffix.star) {
+ if (T1 is FunctionType && _isFunctionTypeWithNamedRequired(T0)) {
+ T1 = _functionTypeWithNamedRequired(T1 as FunctionType);
+ }
var S1 = T1.withNullability(NullabilitySuffix.question);
return isSubtypeOf2(T0, S1);
}
@@ -3737,7 +3751,9 @@
if (gParameter.isNamed) {
var compareNames = fParameter.name.compareTo(gParameter.name);
if (compareNames == 0) {
- if (fParameter.isRequiredNamed && !gParameter.isRequiredNamed) {
+ var gIsRequiredOrLegacy = gParameter.isRequiredNamed ||
+ g.nullabilitySuffix == NullabilitySuffix.star;
+ if (fParameter.isRequiredNamed && !gIsRequiredOrLegacy) {
return false;
} else if (isSubtypeOf2(gParameter.type, fParameter.type)) {
fIndex++;
@@ -3876,6 +3892,32 @@
return Substitution.fromMap({element: typeProvider.objectType})
.substituteType(type);
}
+
+ static FunctionTypeImpl _functionTypeWithNamedRequired(FunctionType type) {
+ return FunctionTypeImpl(
+ typeFormals: type.typeFormals,
+ parameters: type.parameters.map((e) {
+ if (e.isNamed) {
+ return ParameterElementImpl.synthetic(
+ e.name,
+ e.type,
+ ParameterKind.NAMED_REQUIRED,
+ );
+ } else {
+ return e;
+ }
+ }).toList(growable: false),
+ returnType: type.returnType,
+ nullabilitySuffix: type.nullabilitySuffix,
+ );
+ }
+
+ static bool _isFunctionTypeWithNamedRequired(DartType type) {
+ if (type is FunctionType) {
+ return type.parameters.any((e) => e.isRequiredNamed);
+ }
+ return false;
+ }
}
/// A type that is being inferred but is not currently known.
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index c53961a..1b70ef0 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -31,6 +31,10 @@
return _node(search, (n) => n is AssignmentExpression);
}
+ AwaitExpression awaitExpression(String search) {
+ return _node(search, (n) => n is AwaitExpression);
+ }
+
BinaryExpression binary(String search) {
return _node(search, (n) => n is BinaryExpression);
}
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 9d1f9f9..4566120 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -222,6 +222,8 @@
abstract class Converter<S, T> implements StreamTransformer {}
+abstract class Encoding {}
+
class JsonDecoder extends Converter<String, Object> {}
''',
)
@@ -840,6 +842,8 @@
'''
library dart.io;
+import 'dart:convert';
+
abstract class Directory implements FileSystemEntity {
factory Directory(String path) {
throw 0;
@@ -882,11 +886,68 @@
static FileSystemEntityType typeSync(
String path, {bool followLinks: true}) => throw 0;
}
+
+enum ProcessStartMode {
+ normal,
+}
+
+abstract class Process {
+ external static Future<Process> start(
+ String executable,
+ List<String> arguments, {
+ String? workingDirectory,
+ Map<String, String>? environment,
+ bool includeParentEnvironment: true,
+ bool runInShell: false,
+ ProcessStartMode mode: ProcessStartMode.normal,
+ });
+
+ external static Future<ProcessResult> run(
+ String executable,
+ List<String> arguments, {
+ String? workingDirectory,
+ Map<String, String>? environment,
+ bool includeParentEnvironment: true,
+ bool runInShell: false,
+ Encoding? stdoutEncoding,
+ Encoding? stderrEncoding,
+ });
+}
''',
)
],
);
+final MockSdkLibrary _LIB_ISOLATE = MockSdkLibrary([
+ MockSdkLibraryUnit(
+ 'dart:isolate',
+ '$sdkRoot/lib/isolate/isolate.dart',
+ '''
+library dart.isolate;
+
+abstract class SendPort {}
+
+class Isolate {
+ external static Future<Isolate> spawnUri(
+ Uri uri,
+ List<String> args,
+ var message, {
+ bool paused = false,
+ SendPort? onExit,
+ SendPort? onError,
+ bool errorsAreFatal = true,
+ bool? checked,
+ Map<String, String>? environment,
+ @deprecated Uri? packageRoot,
+ Uri? packageConfig,
+ bool automaticPackageResolution = false,
+ String? debugName,
+ });
+}
+''',
+ )
+]);
+
final MockSdkLibrary _LIB_MATH = MockSdkLibrary(
[
MockSdkLibraryUnit(
@@ -927,6 +988,7 @@
_LIB_CONVERT,
_LIB_FFI,
_LIB_IO,
+ _LIB_ISOLATE,
_LIB_MATH,
_LIB_HTML_DART2JS,
_LIB_INTERCEPTORS,
@@ -941,6 +1003,7 @@
'ffi': 'const LibraryInfo("ffi/ffi.dart")',
'html': 'const LibraryInfo("html/dart2js/html_dart2js.dart")',
'io': 'const LibraryInfo("io/io.dart")',
+ 'isolate': 'const LibraryInfo("io/isolate.dart")',
'math': 'const LibraryInfo("math/math.dart")',
};
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 3486a85..2e0b1b2 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -52,53 +52,6 @@
@reflectiveTest
class ClassElementImplTest extends AbstractTypeTest {
- void test_getAllSupertypes_interface() {
- ClassElement classA = class_(name: 'A');
- ClassElement classB =
- ElementFactory.classElement("B", interfaceTypeStar(classA));
- ClassElementImpl elementC = ElementFactory.classElement2("C");
- InterfaceType typeObject = classA.supertype;
- InterfaceType typeA = interfaceTypeStar(classA);
- InterfaceType typeB = interfaceTypeStar(classB);
- InterfaceType typeC = interfaceTypeStar(elementC);
- elementC.interfaces = <InterfaceType>[typeB];
- List<InterfaceType> supers = elementC.allSupertypes;
- List<InterfaceType> types = <InterfaceType>[];
- types.addAll(supers);
- expect(types.contains(typeA), isTrue);
- expect(types.contains(typeB), isTrue);
- expect(types.contains(typeObject), isTrue);
- expect(types.contains(typeC), isFalse);
- }
-
- void test_getAllSupertypes_mixins() {
- ClassElement classA = class_(name: 'A');
- ClassElement classB =
- ElementFactory.classElement("B", interfaceTypeStar(classA));
- var classC = ElementFactory.classElement2("C");
- InterfaceType typeObject = classA.supertype;
- InterfaceType typeA = interfaceTypeStar(classA);
- InterfaceType typeB = interfaceTypeStar(classB);
- InterfaceType typeC = interfaceTypeStar(classC);
- classC.mixins = <InterfaceType>[typeB];
- List<InterfaceType> supers = classC.allSupertypes;
- List<InterfaceType> types = <InterfaceType>[];
- types.addAll(supers);
- expect(types.contains(typeA), isTrue);
- expect(types.contains(typeB), isTrue);
- expect(types.contains(typeObject), isTrue);
- expect(types.contains(typeC), isFalse);
- }
-
- void test_getAllSupertypes_recursive() {
- var classA = class_(name: 'A');
- ClassElementImpl classB =
- ElementFactory.classElement("B", interfaceTypeStar(classA));
- classA.supertype = interfaceTypeStar(classB);
- List<InterfaceType> supers = classB.allSupertypes;
- expect(supers, hasLength(1));
- }
-
void test_getField() {
var classA = class_(name: 'A');
String fieldName = "f";
diff --git a/pkg/analyzer/test/src/dart/element/flatten_type_test.dart b/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
new file mode 100644
index 0000000..a27da75
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
@@ -0,0 +1,98 @@
+// 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:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/type_provider.dart';
+import 'package:analyzer/src/generated/resolver.dart' show TypeSystemImpl;
+import 'package:analyzer/src/generated/type_system.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../generated/elements_types_mixin.dart';
+import '../../../generated/test_analysis_context.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(FlattenTypeTest);
+ });
+}
+
+@reflectiveTest
+class FlattenTypeTest with ElementsTypesMixin {
+ @override
+ TypeProvider typeProvider;
+
+ TypeSystemImpl typeSystem;
+
+ FeatureSet get testFeatureSet {
+ return FeatureSet.forTesting(
+ additionalFeatures: [Feature.non_nullable],
+ );
+ }
+
+ void setUp() {
+ var analysisContext = TestAnalysisContext(
+ featureSet: testFeatureSet,
+ );
+ typeProvider = analysisContext.typeProviderNonNullableByDefault;
+ typeSystem = analysisContext.typeSystemNonNullableByDefault;
+ }
+
+ test_dynamic() {
+ _check(dynamicNone, 'dynamic');
+ }
+
+ test_interfaceType_none() {
+ _check(futureNone(intNone), 'int');
+ _check(futureNone(intQuestion), 'int?');
+ _check(futureNone(intStar), 'int*');
+
+ // otherwise if T is FutureOr<S> then flatten(T) = S
+ _check(futureOrNone(intNone), 'int');
+ _check(futureOrNone(intQuestion), 'int?');
+ _check(futureOrNone(intStar), 'int*');
+ }
+
+ test_interfaceType_question() {
+ _check(futureQuestion(intNone), 'int?');
+ _check(futureQuestion(intQuestion), 'int?');
+ _check(futureQuestion(intStar), 'int?');
+
+ _check(futureQuestion(listNone(intNone)), 'List<int>?');
+ _check(futureQuestion(listQuestion(intNone)), 'List<int>?');
+ _check(futureQuestion(listStar(intNone)), 'List<int>?');
+
+ _check(futureOrQuestion(intNone), 'int?');
+ _check(futureOrQuestion(intQuestion), 'int?');
+ _check(futureOrQuestion(intStar), 'int?');
+ }
+
+ test_interfaceType_star() {
+ _check(futureStar(intNone), 'int*');
+ _check(futureStar(intQuestion), 'int*');
+ _check(futureStar(intStar), 'int*');
+
+ _check(futureStar(listNone(intNone)), 'List<int>*');
+ _check(futureStar(listQuestion(intNone)), 'List<int>*');
+ _check(futureStar(listStar(intNone)), 'List<int>*');
+
+ _check(futureOrStar(intNone), 'int*');
+ _check(futureOrStar(intQuestion), 'int*');
+ _check(futureOrStar(intStar), 'int*');
+ }
+
+ test_unknownInferredType() {
+ var type = UnknownInferredType.instance;
+ expect(typeSystem.flatten(type), same(type));
+ }
+
+ void _check(DartType T, String expected) {
+ var result = typeSystem.flatten(T);
+ expect(
+ result.getDisplayString(withNullability: true),
+ expected,
+ );
+ }
+}
diff --git a/pkg/analyzer/test/src/dart/element/subtype_test.dart b/pkg/analyzer/test/src/dart/element/subtype_test.dart
index 21a9c25..66d8fb5 100644
--- a/pkg/analyzer/test/src/dart/element/subtype_test.dart
+++ b/pkg/analyzer/test/src/dart/element/subtype_test.dart
@@ -2220,6 +2220,36 @@
);
}
+ test_functionType_requiredNamedParameter_03() {
+ var F0 = functionTypeStar(
+ returnType: voidNone,
+ parameters: [
+ namedParameter(name: 'a', type: intStar),
+ ],
+ );
+
+ var F1 = functionTypeNone(
+ returnType: voidNone,
+ parameters: [
+ namedRequiredParameter(name: 'a', type: intNone),
+ ],
+ );
+
+ isSubtype(
+ F0,
+ F1,
+ strT0: 'void Function({int* a})*',
+ strT1: 'void Function({required int a})',
+ );
+
+ isSubtype(
+ F1,
+ F0,
+ strT0: 'void Function({required int a})',
+ strT1: 'void Function({int* a})*',
+ );
+ }
+
test_futureOr_01() {
isSubtype(
intStar,
diff --git a/pkg/analyzer/test/src/dart/element/test_all.dart b/pkg/analyzer/test/src/dart/element/test_all.dart
index 8a98bd6..43eab7c 100644
--- a/pkg/analyzer/test/src/dart/element/test_all.dart
+++ b/pkg/analyzer/test/src/dart/element/test_all.dart
@@ -6,6 +6,7 @@
import 'element_test.dart' as element;
import 'factor_type_test.dart' as factor_type;
+import 'flatten_type_test.dart' as flatten_type;
import 'function_type_test.dart' as function_type;
import 'inheritance_manager3_test.dart' as inheritance_manager3;
import 'least_upper_bound_helper_test.dart' as least_upper_bound_helper;
@@ -25,6 +26,7 @@
defineReflectiveSuite(() {
element.main();
factor_type.main();
+ flatten_type.main();
function_type.main();
inheritance_manager3.main();
least_upper_bound_helper.main();
diff --git a/pkg/analyzer/test/src/dart/resolution/await_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/await_expression_test.dart
new file mode 100644
index 0000000..74b5b02
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/await_expression_test.dart
@@ -0,0 +1,80 @@
+// 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:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(AwaitExpressionResolutionTest);
+ defineReflectiveTests(AwaitExpressionResolutionWithNullSafetyTest);
+ });
+}
+
+@reflectiveTest
+class AwaitExpressionResolutionTest extends DriverResolutionTest {
+ test_future() async {
+ await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+f(Future<int> a) async {
+ await a;
+}
+''');
+
+ assertType(findNode.awaitExpression('await a'), 'int');
+ }
+
+ test_futureOr() async {
+ await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+f(FutureOr<int> a) async {
+ await a;
+}
+''');
+
+ assertType(findNode.awaitExpression('await a'), 'int');
+ }
+}
+
+@reflectiveTest
+class AwaitExpressionResolutionWithNullSafetyTest extends DriverResolutionTest {
+ @override
+ AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+ ..contextFeatures = FeatureSet.fromEnableFlags(
+ [EnableString.non_nullable],
+ );
+
+ @override
+ bool get typeToStringWithNullability => true;
+
+ test_futureOrQ() async {
+ await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+f(FutureOr<int>? a) async {
+ await a;
+}
+''');
+
+ assertType(findNode.awaitExpression('await a'), 'int?');
+ }
+
+ test_futureQ() async {
+ await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+f(Future<int>? a) async {
+ await a;
+}
+''');
+
+ assertType(findNode.awaitExpression('await a'), 'int?');
+ }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
index b077ff5..da98f88 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
@@ -4,6 +4,7 @@
import 'package:test_reflective_loader/test_reflective_loader.dart';
+import '../../../generated/elements_types_mixin.dart';
import 'driver_resolution.dart';
main() {
@@ -13,7 +14,8 @@
}
@reflectiveTest
-class ClassAliasDriverResolutionTest extends DriverResolutionTest {
+class ClassAliasDriverResolutionTest extends DriverResolutionTest
+ with ElementsTypesMixin {
test_defaultConstructor() async {
await assertNoErrorsInCode(r'''
class A {}
@@ -43,6 +45,51 @@
assertElementTypeStrings(x.interfaces, ['C']);
}
+ test_element_typeFunction_extends() async {
+ await assertNoErrorsInCode(r'''
+class A {}
+class X = Function with A;
+''');
+ var x = findElement.class_('X');
+ assertType(x.supertype, 'Object');
+ }
+
+ test_element_typeFunction_implements() async {
+ await assertNoErrorsInCode(r'''
+class A {}
+class B {}
+class X = Object with A implements A, Function, B;
+''');
+ var a = findElement.class_('A');
+ var b = findElement.class_('B');
+ var x = findElement.class_('X');
+ assertElementTypes(
+ x.interfaces,
+ [
+ interfaceTypeStar(a),
+ interfaceTypeStar(b),
+ ],
+ );
+ }
+
+ test_element_typeFunction_with() async {
+ await assertNoErrorsInCode(r'''
+class A {}
+class B {}
+class X = Object with A, Function, B;
+''');
+ var a = findElement.class_('A');
+ var b = findElement.class_('B');
+ var x = findElement.class_('X');
+ assertElementTypes(
+ x.mixins,
+ [
+ interfaceTypeStar(a),
+ interfaceTypeStar(b),
+ ],
+ );
+ }
+
@failingTest
test_implicitConstructors_const() async {
await assertNoErrorsInCode(r'''
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index 953b08a..9d2f341 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -130,6 +130,54 @@
);
}
+ test_element_typeFunction_extends() async {
+ await assertErrorsInCode(r'''
+class A extends Function {}
+''', [
+ error(HintCode.DEPRECATED_EXTENDS_FUNCTION, 16, 8),
+ ]);
+ var a = findElement.class_('A');
+ assertType(a.supertype, 'Object');
+ }
+
+ test_element_typeFunction_implements() async {
+ await assertNoErrorsInCode(r'''
+class A {}
+class B {}
+class C implements A, Function, B {}
+''');
+ var a = findElement.class_('A');
+ var b = findElement.class_('B');
+ var c = findElement.class_('C');
+ assertElementTypes(
+ c.interfaces,
+ [
+ interfaceTypeStar(a),
+ interfaceTypeStar(b),
+ ],
+ );
+ }
+
+ test_element_typeFunction_with() async {
+ await assertErrorsInCode(r'''
+class A {}
+class B {}
+class C extends Object with A, Function, B {}
+''', [
+ error(HintCode.DEPRECATED_MIXIN_FUNCTION, 53, 8),
+ ]);
+ var a = findElement.class_('A');
+ var b = findElement.class_('B');
+ var c = findElement.class_('C');
+ assertElementTypes(
+ c.mixins,
+ [
+ interfaceTypeStar(a),
+ interfaceTypeStar(b),
+ ],
+ );
+ }
+
test_error_conflictingConstructorAndStaticField_field() async {
await assertErrorsInCode(r'''
class C {
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
index ecd3b1d..2ad2114 100644
--- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -6,9 +6,11 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/constant/value.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/test_utilities/find_element.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -191,6 +193,37 @@
expect(a.computeConstantValue().toIntValue(), 42);
}
+ test_imported_super_defaultFieldFormalParameter() async {
+ newFile('/test/lib/a.dart', content: r'''
+import 'test.dart';
+
+class A {
+ static const B b = const B();
+
+ final bool f1;
+ final bool f2;
+
+ const A({this.f1: false}) : this.f2 = f1 && true;
+}
+''');
+
+ await assertNoErrorsInCode(r'''
+import 'a.dart';
+
+class B extends A {
+ const B() : super();
+}
+''');
+
+ result = await resolveFile(convertPath('/test/lib/a.dart'));
+ assertErrorsInResolvedUnit(result, []);
+
+ var bElement = FindElement(result.unit).field('b') as ConstVariableElement;
+ var bValue = bElement.evaluationResult.value;
+ var superFields = bValue.getField(GenericState.SUPERCLASS_FIELD);
+ expect(superFields.getField('f1').toBoolValue(), false);
+ }
+
test_local_prefixedIdentifier_staticField_extension() async {
await assertNoErrorsInCode(r'''
const a = E.f;
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index 9e13317..c6ce42f 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -6,6 +6,7 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -1580,6 +1581,31 @@
);
}
+ test_syntheticName() async {
+ // This code is invalid, and the constructor initializer has a method
+ // invocation with a synthetic name. But we should still resolve the
+ // invocation, and resolve all its arguments.
+ await assertErrorsInCode(r'''
+class A {
+ A() : B(1 + 2, [0]);
+}
+''', [
+ error(ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER, 18, 1),
+ error(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, 18, 13),
+ ]);
+
+ assertMethodInvocation2(
+ findNode.methodInvocation(');'),
+ element: null,
+ typeArgumentTypes: [],
+ invokeType: 'dynamic',
+ type: 'dynamic',
+ );
+
+ assertType(findNode.binary('1 + 2'), 'int');
+ assertType(findNode.listLiteral('[0]'), 'List<int>');
+ }
+
test_typeArgumentTypes_generic_inferred() async {
await assertErrorsInCode(r'''
U foo<T, U>(T a) => null;
@@ -1794,66 +1820,6 @@
);
}
- test_nullShorting_cascade_firstMethodInvocation() async {
- await assertNoErrorsInCode(r'''
-class A {
- int foo() => 0;
- int bar() => 0;
-}
-
-main(A? a) {
- a?..foo()..bar();
-}
-''');
-
- assertMethodInvocation2(
- findNode.methodInvocation('..foo()'),
- element: findElement.method('foo'),
- typeArgumentTypes: [],
- invokeType: 'int Function()',
- type: 'int',
- );
-
- assertMethodInvocation2(
- findNode.methodInvocation('..bar()'),
- element: findElement.method('bar'),
- typeArgumentTypes: [],
- invokeType: 'int Function()',
- type: 'int',
- );
-
- assertType(findNode.cascade('a?'), 'A?');
- }
-
- test_nullShorting_cascade_firstPropertyAccess() async {
- await assertNoErrorsInCode(r'''
-class A {
- int get foo => 0;
- int bar() => 0;
-}
-
-main(A? a) {
- a?..foo..bar();
-}
-''');
-
- assertPropertyAccess2(
- findNode.propertyAccess('..foo'),
- element: findElement.getter('foo'),
- type: 'int',
- );
-
- assertMethodInvocation2(
- findNode.methodInvocation('..bar()'),
- element: findElement.method('bar'),
- typeArgumentTypes: [],
- invokeType: 'int Function()',
- type: 'int',
- );
-
- assertType(findNode.cascade('a?'), 'A?');
- }
-
test_hasReceiver_interfaceTypeQ_defined() async {
await assertErrorsInCode(r'''
class A {
@@ -2016,4 +1982,64 @@
type: 'void',
);
}
+
+ test_nullShorting_cascade_firstMethodInvocation() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ int foo() => 0;
+ int bar() => 0;
+}
+
+main(A? a) {
+ a?..foo()..bar();
+}
+''');
+
+ assertMethodInvocation2(
+ findNode.methodInvocation('..foo()'),
+ element: findElement.method('foo'),
+ typeArgumentTypes: [],
+ invokeType: 'int Function()',
+ type: 'int',
+ );
+
+ assertMethodInvocation2(
+ findNode.methodInvocation('..bar()'),
+ element: findElement.method('bar'),
+ typeArgumentTypes: [],
+ invokeType: 'int Function()',
+ type: 'int',
+ );
+
+ assertType(findNode.cascade('a?'), 'A?');
+ }
+
+ test_nullShorting_cascade_firstPropertyAccess() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ int get foo => 0;
+ int bar() => 0;
+}
+
+main(A? a) {
+ a?..foo..bar();
+}
+''');
+
+ assertPropertyAccess2(
+ findNode.propertyAccess('..foo'),
+ element: findElement.getter('foo'),
+ type: 'int',
+ );
+
+ assertMethodInvocation2(
+ findNode.methodInvocation('..bar()'),
+ element: findElement.method('bar'),
+ typeArgumentTypes: [],
+ invokeType: 'int Function()',
+ type: 'int',
+ );
+
+ assertType(findNode.cascade('a?'), 'A?');
+ }
}
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index 91f8c97..cc7c7b9 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -6,6 +6,7 @@
import 'assignment_test.dart' as assignment;
import 'ast_rewrite_test.dart' as ast_rewrite;
+import 'await_expression_test.dart' as await_expression;
import 'binary_expression_test.dart' as binary_expression;
import 'class_alias_test.dart' as class_alias;
import 'class_test.dart' as class_resolution;
@@ -56,6 +57,7 @@
defineReflectiveSuite(() {
assignment.main();
ast_rewrite.main();
+ await_expression.main();
binary_expression.main();
class_alias.main();
class_resolution.main();
diff --git a/pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/default_list_constructor_test.dart
similarity index 79%
rename from pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart
rename to pkg/analyzer/test/src/diagnostics/default_list_constructor_test.dart
index 64b11f1..5609204d 100644
--- a/pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/default_list_constructor_test.dart
@@ -24,10 +24,9 @@
test_inferredType() async {
await assertErrorsInCode('''
-class C {}
-List<C> v = List(5);
+List<int> v = List(5);
''', [
- error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH, 23, 4),
+ error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR, 14, 4),
]);
}
@@ -35,7 +34,7 @@
await assertErrorsInCode('''
var l = new List<int>(3);
''', [
- error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH, 12, 9),
+ error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR, 12, 9),
]);
}
@@ -46,9 +45,11 @@
}
test_nullableType() async {
- await assertNoErrorsInCode('''
-var l = new List<String?>(3);
-''');
+ await assertErrorsInCode('''
+var l = new List<int?>(3);
+''', [
+ error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR, 12, 10),
+ ]);
}
test_optOut() async {
@@ -64,7 +65,7 @@
var l = new List<T>(3);
}
''', [
- error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH, 27, 7),
+ error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR, 27, 7),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 523f762..67486e1 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -58,8 +58,7 @@
import 'const_spread_expected_map_test.dart' as const_spread_expected_map;
import 'dead_code_test.dart' as dead_code;
import 'dead_null_aware_expression_test.dart' as dead_null_aware_expression;
-import 'default_list_constructor_mismatch_test.dart'
- as default_list_constructor_mismatch;
+import 'default_list_constructor_test.dart' as default_list_constructor;
import 'default_value_in_function_type_test.dart'
as default_value_in_function_type;
import 'default_value_in_function_typed_parameter_test.dart'
@@ -543,7 +542,7 @@
const_spread_expected_map.main();
dead_code.main();
dead_null_aware_expression.main();
- default_list_constructor_mismatch.main();
+ default_list_constructor.main();
default_value_in_function_type.main();
default_value_in_function_typed_parameter.main();
default_value_in_redirecting_factory_constructor.main();
diff --git a/pkg/analyzer/test/utils/package_root.dart b/pkg/analyzer/test/utils/package_root.dart
index 1957a61..8055970 100644
--- a/pkg/analyzer/test/utils/package_root.dart
+++ b/pkg/analyzer/test/utils/package_root.dart
@@ -11,7 +11,9 @@
String get packageRoot {
// If the package root directory is specified on the command line using
// -DpkgRoot=..., use it.
- String pkgRootVar = const String.fromEnvironment('pkgRoot');
+ String pkgRootVar = const bool.hasEnvironment('pkgRoot')
+ ? const String.fromEnvironment('pkgRoot')
+ : null;
if (pkgRootVar != null) {
String path = pathos.join(Directory.current.path, pkgRootVar);
if (!path.endsWith(pathos.separator)) path += pathos.separator;
diff --git a/pkg/analyzer_cli/analysis_options.yaml b/pkg/analyzer_cli/analysis_options.yaml
index 7a3c1f2..ff9fb29 100644
--- a/pkg/analyzer_cli/analysis_options.yaml
+++ b/pkg/analyzer_cli/analysis_options.yaml
@@ -31,7 +31,7 @@
- library_prefixes
- no_duplicate_case_values
- null_closures
- #- omit_local_variable_types # 273
+ - omit_local_variable_types
- prefer_adjacent_string_concatenation
- prefer_collection_literals
- prefer_conditional_assignment
diff --git a/pkg/analyzer_cli/bin/analyzer.dart b/pkg/analyzer_cli/bin/analyzer.dart
index 3568e65..4381de7 100644
--- a/pkg/analyzer_cli/bin/analyzer.dart
+++ b/pkg/analyzer_cli/bin/analyzer.dart
@@ -12,7 +12,7 @@
/// [sendPort] may be passed in when started in an isolate. If provided, it is
/// used for bazel worker communication instead of stdin/stdout.
void main(List<String> args, [SendPort sendPort]) async {
- CommandLineStarter starter = CommandLineStarter();
+ var starter = CommandLineStarter();
// Wait for the starter to complete.
await starter.start(args, sendPort: sendPort);
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 0f45e9f..7bb46af 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -63,7 +63,7 @@
if (unit == null || !units.add(unit)) {
return;
}
- Source source = unit.source;
+ var source = unit.source;
if (source != null) {
files.add(source.fullName);
}
@@ -80,14 +80,14 @@
}
// Add compilation units.
addCompilationUnitSource(library.definingCompilationUnit, units);
- for (CompilationUnitElement child in library.parts) {
+ for (var child in library.parts) {
addCompilationUnitSource(child, units);
}
// Add referenced libraries.
- for (LibraryElement child in library.importedLibraries) {
+ for (var child in library.importedLibraries) {
addLibrarySources(child, libraries, units);
}
- for (LibraryElement child in library.exportedLibraries) {
+ for (var child in library.exportedLibraries) {
addLibrarySources(child, libraries, units);
}
}
@@ -107,9 +107,9 @@
/// Returns the maximal [ErrorSeverity] of the recorded errors.
ErrorSeverity computeMaxErrorSeverity() {
- ErrorSeverity status = ErrorSeverity.NONE;
- for (ErrorsResult result in errorsResults) {
- for (AnalysisError error in result.errors) {
+ var status = ErrorSeverity.NONE;
+ for (var result in errorsResults) {
+ for (var error in result.errors) {
if (_defaultSeverityProcessor(error) == null) {
continue;
}
@@ -123,10 +123,10 @@
Future<void> prepareErrors() async {
// TODO(brianwilkerson) Determine whether this await is necessary.
await null;
- PerformanceTag previous = _prepareErrorsTag.makeCurrent();
+ var previous = _prepareErrorsTag.makeCurrent();
try {
- for (String path in files) {
- ErrorsResult errorsResult = await analysisDriver.getErrors(path);
+ for (var path in files) {
+ var errorsResult = await analysisDriver.getErrors(path);
errorsResults.add(errorsResult);
}
} finally {
@@ -145,7 +145,7 @@
void setupForAnalysis() {
files.clear();
errorsResults.clear();
- Uri libraryUri = libraryFile.uri;
+ var libraryUri = libraryFile.uri;
if (libraryUri.scheme == 'package' && libraryUri.pathSegments.isNotEmpty) {
_selfPackageName = libraryUri.pathSegments[0];
}
@@ -157,13 +157,13 @@
await null;
// Don't try to analyze parts.
if (libraryFile.isPart) {
- String libraryPath = libraryFile.path;
+ var libraryPath = libraryFile.path;
stderr.writeln('Only libraries can be analyzed.');
stderr.writeln('$libraryPath is a part and cannot be analyzed.');
return ErrorSeverity.ERROR;
}
- LibraryElement libraryElement = await _resolveLibrary();
+ var libraryElement = await _resolveLibrary();
prepareSources(libraryElement);
await prepareErrors();
@@ -183,7 +183,7 @@
/// Returns true if we want to report diagnostics for this library.
bool _isAnalyzedLibrary(LibraryElement library) {
- Source source = library.source;
+ var source = library.source;
switch (source.uriKind) {
case UriKind.DART_URI:
return options.showSdkWarnings;
@@ -202,7 +202,7 @@
if (uri.scheme != 'package' || uri.pathSegments.isEmpty) {
return false;
}
- String packageName = uri.pathSegments.first;
+ var packageName = uri.pathSegments.first;
if (packageName == _selfPackageName) {
return true;
} else if (!options.showPackageWarnings) {
@@ -217,11 +217,11 @@
// TODO(devoncarew): This is never called.
void _printColdPerf() {
// Print cold VM performance numbers.
- int totalTime = currentTimeMillis - startTime;
- int otherTime = totalTime;
- for (PerformanceTag tag in PerformanceTag.all) {
+ var totalTime = currentTimeMillis - startTime;
+ var otherTime = totalTime;
+ for (var tag in PerformanceTag.all) {
if (tag != PerformanceTag.unknown) {
- int tagTime = tag.elapsedMs;
+ var tagTime = tag.elapsedMs;
outSink.writeln('${tag.label}-cold:$tagTime');
otherTime -= tagTime;
}
@@ -233,12 +233,11 @@
Future<LibraryElement> _resolveLibrary() async {
// TODO(brianwilkerson) Determine whether this await is necessary.
await null;
- PerformanceTag previous = _resolveLibraryTag.makeCurrent();
+ var previous = _resolveLibraryTag.makeCurrent();
try {
- String libraryPath = libraryFile.path;
+ var libraryPath = libraryFile.path;
analysisDriver.priorityFiles = [libraryPath];
- UnitElementResult elementResult =
- await analysisDriver.getUnitElement(libraryPath);
+ var elementResult = await analysisDriver.getUnitElement(libraryPath);
return elementResult.element.library;
} finally {
previous.makeCurrent();
@@ -247,11 +246,11 @@
/// Return `true` if the given [pathName] is in the Pub cache.
static bool _isPathInPubCache(String pathName) {
- List<String> parts = path.split(pathName);
+ var parts = path.split(pathName);
if (parts.contains('.pub-cache')) {
return true;
}
- for (int i = 0; i < parts.length - 2; i++) {
+ for (var i = 0; i < parts.length - 2; i++) {
if (parts[i] == 'Pub' && parts[i + 1] == 'Cache') {
return true;
}
diff --git a/pkg/analyzer_cli/lib/src/batch_mode.dart b/pkg/analyzer_cli/lib/src/batch_mode.dart
index e0c8731..f147d64 100644
--- a/pkg/analyzer_cli/lib/src/batch_mode.dart
+++ b/pkg/analyzer_cli/lib/src/batch_mode.dart
@@ -23,14 +23,13 @@
/// use in unit testing.
void runAsBatch(List<String> sharedArgs, BatchRunnerHandler handler) {
outSink.writeln('>>> BATCH START');
- Stopwatch stopwatch = Stopwatch();
+ var stopwatch = Stopwatch();
stopwatch.start();
- int testsFailed = 0;
- int totalTests = 0;
- ErrorSeverity batchResult = ErrorSeverity.NONE;
+ var testsFailed = 0;
+ var totalTests = 0;
+ var batchResult = ErrorSeverity.NONE;
// Read line from stdin.
- Stream<String> cmdLine =
- stdin.transform(utf8.decoder).transform(LineSplitter());
+ var cmdLine = stdin.transform(utf8.decoder).transform(LineSplitter());
cmdLine.listen((String line) async {
// TODO(brianwilkerson) Determine whether this await is necessary.
await null;
@@ -51,15 +50,15 @@
// Analyze single set of arguments.
try {
totalTests++;
- ErrorSeverity result = await handler(args);
- bool resultPass = result != ErrorSeverity.ERROR;
+ var result = await handler(args);
+ var resultPass = result != ErrorSeverity.ERROR;
if (!resultPass) {
testsFailed++;
}
batchResult = batchResult.max(result);
// Write stderr end token and flush.
errorSink.writeln('>>> EOF STDERR');
- String resultPassString = resultPass ? 'PASS' : 'FAIL';
+ var resultPassString = resultPass ? 'PASS' : 'FAIL';
outSink.writeln(
'>>> TEST $resultPassString ${stopwatch.elapsedMilliseconds}ms');
} catch (e, stackTrace) {
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index 6ad947b..58e8c1a 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -26,7 +26,6 @@
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/source_io.dart';
import 'package:analyzer/src/source/source_resource.dart';
-import 'package:analyzer/src/summary/format.dart';
import 'package:analyzer/src/summary/idl.dart';
import 'package:analyzer/src/summary/package_bundle_reader.dart';
import 'package:analyzer/src/summary/summarize_elements.dart';
@@ -98,7 +97,7 @@
outBuffer.clear();
try {
// Prepare inputs with their digests.
- Map<String, WorkerInput> inputs = {};
+ var inputs = <String, WorkerInput>{};
for (var input in request.inputs) {
inputs[input.path] = WorkerInput(input.path, input.digest);
}
@@ -112,19 +111,19 @@
}
// Prepare options.
- CommandLineOptions options =
+ var options =
CommandLineOptions.parse(arguments, printAndFail: (String msg) {
throw ArgumentError(msg);
});
// Analyze and respond.
await analyze(options, inputs);
- String msg = _getErrorOutputBuffersText();
+ var msg = _getErrorOutputBuffersText();
return WorkResponse()
..exitCode = EXIT_CODE_OK
..output = msg;
} catch (e, st) {
- String msg = _getErrorOutputBuffersText();
+ var msg = _getErrorOutputBuffersText();
msg += '$e\n$st';
return WorkResponse()
..exitCode = EXIT_CODE_ERROR
@@ -145,7 +144,7 @@
}
String _getErrorOutputBuffersText() {
- String msg = '';
+ var msg = '';
if (errorBuffer.isNotEmpty) {
msg += errorBuffer.toString() + '\n';
}
@@ -235,8 +234,8 @@
}
// Add sources.
- for (Uri uri in uriToFileMap.keys) {
- File file = uriToFileMap[uri];
+ for (var uri in uriToFileMap.keys) {
+ var file = uriToFileMap[uri];
if (!file.exists) {
errorSink.writeln('File not found: ${file.path}');
io.exitCode = ErrorSeverity.ERROR.ordinal;
@@ -261,15 +260,15 @@
_computeLinkedLibraries2();
// Write the whole package bundle.
- PackageBundleBuilder bundle = assembler.assemble();
+ var bundle = assembler.assemble();
if (options.buildSummaryOutput != null) {
- io.File file = io.File(options.buildSummaryOutput);
+ var file = io.File(options.buildSummaryOutput);
file.writeAsBytesSync(bundle.toBuffer(),
mode: io.FileMode.writeOnly);
}
if (options.buildSummaryOutputSemantic != null) {
bundle.flushInformative();
- io.File file = io.File(options.buildSummaryOutputSemantic);
+ var file = io.File(options.buildSummaryOutputSemantic);
file.writeAsBytesSync(bundle.toBuffer(),
mode: io.FileMode.writeOnly);
}
@@ -291,7 +290,7 @@
}
if (dependencyTracker != null) {
- io.File file = io.File(dependencyTracker.outputPath);
+ var file = io.File(dependencyTracker.outputPath);
file.writeAsStringSync(dependencyTracker.dependencies.join('\n'));
}
@@ -365,12 +364,12 @@
}
Future<ErrorSeverity> _computeMaxSeverity() async {
- ErrorSeverity maxSeverity = ErrorSeverity.NONE;
+ var maxSeverity = ErrorSeverity.NONE;
if (!options.buildSuppressExitCode) {
- for (Source source in explicitSources) {
- ErrorsResult result = await analysisDriver.getErrors(source.fullName);
- for (AnalysisError error in result.errors) {
- ErrorSeverity processedSeverity = determineProcessedSeverity(
+ for (var source in explicitSources) {
+ var result = await analysisDriver.getErrors(source.fullName);
+ for (var error in result.errors) {
+ var processedSeverity = determineProcessedSeverity(
error, options, analysisDriver.analysisOptions);
if (processedSeverity != null) {
maxSeverity = maxSeverity.max(processedSeverity);
@@ -387,30 +386,29 @@
// Adds a bundle at `path` to `summaryDataStore`.
PackageBundle addBundle(String path) {
- PackageBundle bundle = packageBundleProvider.get(path);
+ var bundle = packageBundleProvider.get(path);
summaryDataStore.addBundle(path, bundle);
return bundle;
}
- int numInputs = options.buildSummaryInputs.length;
+ var numInputs = options.buildSummaryInputs.length;
logger.run('Add $numInputs input summaries', () {
for (var path in options.buildSummaryInputs) {
addBundle(path);
}
});
- String rootPath =
+ var rootPath =
options.sourceFiles.isEmpty ? null : options.sourceFiles.first;
DartSdk sdk;
logger.run('Add SDK bundle', () {
PackageBundle sdkBundle;
if (options.dartSdkSummaryPath != null) {
- SummaryBasedDartSdk summarySdk =
- SummaryBasedDartSdk(options.dartSdkSummaryPath, true);
+ var summarySdk = SummaryBasedDartSdk(options.dartSdkSummaryPath, true);
sdk = summarySdk;
sdkBundle = summarySdk.bundle;
} else {
- FolderBasedDartSdk dartSdk = FolderBasedDartSdk(
+ var dartSdk = FolderBasedDartSdk(
resourceProvider, resourceProvider.getFolder(options.dartSdkPath));
dartSdk.analysisOptions =
createAnalysisOptionsForCommandLineOptions(options, rootPath);
@@ -436,7 +434,7 @@
analysisOptions =
createAnalysisOptionsForCommandLineOptions(options, rootPath);
- AnalysisDriverScheduler scheduler = AnalysisDriverScheduler(logger);
+ var scheduler = AnalysisDriverScheduler(logger);
analysisDriver = AnalysisDriver(
scheduler,
logger,
@@ -481,17 +479,17 @@
/// "$uri|$path") to a map from URI to path. If an error occurs, report the
/// error and return null.
Map<Uri, File> _createUriToFileMap(List<String> sourceEntities) {
- Map<Uri, File> uriToFileMap = <Uri, File>{};
- for (String sourceFile in sourceEntities) {
- int pipeIndex = sourceFile.indexOf('|');
+ var uriToFileMap = <Uri, File>{};
+ for (var sourceFile in sourceEntities) {
+ var pipeIndex = sourceFile.indexOf('|');
if (pipeIndex == -1) {
// TODO(paulberry): add the ability to guess the URI from the path.
errorSink.writeln(
'Illegal input file (must be "\$uri|\$path"): $sourceFile');
return null;
}
- Uri uri = Uri.parse(sourceFile.substring(0, pipeIndex));
- String path = sourceFile.substring(pipeIndex + 1);
+ var uri = Uri.parse(sourceFile.substring(0, pipeIndex));
+ var path = sourceFile.substring(pipeIndex + 1);
path = resourceProvider.pathContext.absolute(path);
path = resourceProvider.pathContext.normalize(path);
uriToFileMap[uri] = resourceProvider.getFile(path);
@@ -512,8 +510,8 @@
/// If the unit is in the input [summaryDataStore], do nothing.
Future<void> _prepareUnit(String absoluteUri) async {
// Parse the source and serialize its AST.
- Uri uri = Uri.parse(absoluteUri);
- Source source = sourceFactory.forUri2(uri);
+ var uri = Uri.parse(absoluteUri);
+ var source = sourceFactory.forUri2(uri);
if (!source.exists()) {
// TODO(paulberry): we should report a warning/error because DDC
// compilations are unlikely to work.
@@ -527,15 +525,15 @@
/// is sent to a new file at that path.
Future<void> _printErrors({String outputPath}) async {
await logger.runAsync('Compute and print analysis errors', () async {
- StringBuffer buffer = StringBuffer();
+ var buffer = StringBuffer();
var severityProcessor = (AnalysisError error) =>
determineProcessedSeverity(error, options, analysisOptions);
- ErrorFormatter formatter = options.machineFormat
+ var formatter = options.machineFormat
? MachineErrorFormatter(buffer, options, stats,
severityProcessor: severityProcessor)
: HumanErrorFormatter(buffer, options, stats,
severityProcessor: severityProcessor);
- for (Source source in explicitSources) {
+ for (var source in explicitSources) {
var result = await analysisDriver.getErrors(source.fullName);
formatter.formatErrors([result]);
}
@@ -544,7 +542,7 @@
stats.print(buffer);
}
if (outputPath == null) {
- StringSink sink = options.machineFormat ? errorSink : outSink;
+ var sink = options.machineFormat ? errorSink : outSink;
sink.write(buffer);
} else {
io.File(outputPath).writeAsStringSync(buffer.toString());
@@ -593,7 +591,7 @@
@override
Source resolveAbsolute(Uri uri, [Uri actualUri]) {
- File file = uriToFileMap[uri];
+ var file = uriToFileMap[uri];
actualUri ??= uri;
if (file == null) {
return null;
@@ -609,7 +607,7 @@
/// Build the inverse mapping of [uriToSourceMap].
static Map<String, Uri> _computePathToUriMap(Map<Uri, File> uriToSourceMap) {
- Map<String, Uri> pathToUriMap = <String, Uri>{};
+ var pathToUriMap = <String, Uri>{};
uriToSourceMap.forEach((Uri uri, File file) {
pathToUriMap[file.path] = uri;
});
@@ -695,7 +693,7 @@
/// Get the [PackageBundle] from the file with the given [path] in the context
/// of the given worker [inputs].
PackageBundle get(Map<String, WorkerInput> inputs, String path) {
- WorkerInput input = inputs[path];
+ var input = inputs[path];
// The input must be not null, otherwise we're not expected to read
// this file, but we check anyway to be safe.
diff --git a/pkg/analyzer_cli/lib/src/context_cache.dart b/pkg/analyzer_cli/lib/src/context_cache.dart
index ffe7752..b3af37d 100644
--- a/pkg/analyzer_cli/lib/src/context_cache.dart
+++ b/pkg/analyzer_cli/lib/src/context_cache.dart
@@ -102,8 +102,7 @@
/// This should not be used except behind the getter which caches this result
/// automatically.
AnalysisOptionsImpl _getAnalysisOptions() {
- AnalysisOptionsImpl contextOptions = builder.getAnalysisOptions(
- requestedSourceDirectory,
+ var contextOptions = builder.getAnalysisOptions(requestedSourceDirectory,
verbosePrint: clOptions.verbose ? verbosePrint : null)
as AnalysisOptionsImpl;
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index e97abae..42342cf 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -31,7 +31,6 @@
import 'package:analyzer/src/pubspec/pubspec_validator.dart';
import 'package:analyzer/src/source/package_map_resolver.dart';
import 'package:analyzer/src/source/path_filter.dart';
-import 'package:analyzer/src/summary/idl.dart';
import 'package:analyzer/src/summary/package_bundle_reader.dart';
import 'package:analyzer/src/summary/summary_file_builder.dart';
import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk;
@@ -62,7 +61,7 @@
/// Test this option map to see if it specifies lint rules.
bool containsLintRuleEntry(YamlMap options) {
- YamlNode linterNode = getValue(options, 'linter');
+ var linterNode = getValue(options, 'linter');
return linterNode is YamlMap && getValue(linterNode, 'rules') != null;
}
@@ -118,32 +117,32 @@
if (analysisDriver != null) {
throw StateError('start() can only be called once');
}
- int startTime = DateTime.now().millisecondsSinceEpoch;
+ var startTime = DateTime.now().millisecondsSinceEpoch;
StringUtilities.INTERNER = MappedInterner();
linter.registerLintRules();
// Parse commandline options.
- CommandLineOptions options = CommandLineOptions.parse(args);
+ var options = CommandLineOptions.parse(args);
// Do analysis.
if (options.buildMode) {
- ErrorSeverity severity = await _buildModeAnalyze(options, sendPort);
+ var severity = await _buildModeAnalyze(options, sendPort);
// Propagate issues to the exit code.
if (_shouldBeFatal(severity, options)) {
io.exitCode = severity.ordinal;
}
} else if (options.batchMode) {
- BatchRunner batchRunner = BatchRunner(outSink, errorSink);
+ var batchRunner = BatchRunner(outSink, errorSink);
batchRunner.runAsBatch(args, (List<String> args) async {
// TODO(brianwilkerson) Determine whether this await is necessary.
await null;
- CommandLineOptions options = CommandLineOptions.parse(args);
+ var options = CommandLineOptions.parse(args);
return await _analyzeAll(options);
});
} else {
- ErrorSeverity severity = await _analyzeAll(options);
+ var severity = await _analyzeAll(options);
// Propagate issues to the exit code.
if (_shouldBeFatal(severity, options)) {
io.exitCode = severity.ordinal;
@@ -157,7 +156,7 @@
// representative of what we see internally; call into _buildModeAnalyze()
// with some appropriate options.
print('\nGenerating strong mode summary...');
- final Stopwatch stopwatch = Stopwatch()..start();
+ final stopwatch = Stopwatch()..start();
for (var i = 0; i < 3; i++) {
var featureSet = FeatureSet.fromEnableFlags([]);
@@ -174,7 +173,7 @@
}
if (options.perfReport != null) {
- String json = makePerfReport(
+ var json = makePerfReport(
startTime, currentTimeMillis, options, _analyzedFileCount, stats);
io.File(options.perfReport).writeAsStringSync(json);
}
@@ -183,7 +182,7 @@
Future<ErrorSeverity> _analyzeAll(CommandLineOptions options) async {
// TODO(brianwilkerson) Determine whether this await is necessary.
await null;
- PerformanceTag previous = _analyzeAllTag.makeCurrent();
+ var previous = _analyzeAllTag.makeCurrent();
try {
return await _analyzeAllImpl(options);
} finally {
@@ -196,7 +195,7 @@
// TODO(brianwilkerson) Determine whether this await is necessary.
await null;
if (!options.machineFormat) {
- List<String> fileNames = options.sourceFiles.map((String file) {
+ var fileNames = options.sourceFiles.map((String file) {
file = path.normalize(file);
if (file == '.') {
file = path.basename(path.current);
@@ -210,13 +209,13 @@
}
// These are used to do part file analysis across sources.
- Set<String> dartFiles = <String>{};
- Set<FileState> libraryFiles = <FileState>{};
- Set<FileState> danglingParts = <FileState>{};
+ var dartFiles = <String>{};
+ var libraryFiles = <FileState>{};
+ var danglingParts = <FileState>{};
// Note: This references analysisDriver via closure, so it will change over
// time during the following analysis.
- SeverityProcessor defaultSeverityProcessor = (AnalysisError error) {
+ var defaultSeverityProcessor = (AnalysisError error) {
return determineProcessedSeverity(
error, options, analysisDriver.analysisOptions);
};
@@ -236,7 +235,7 @@
severityProcessor: defaultSeverityProcessor);
}
- ErrorSeverity allResult = ErrorSeverity.NONE;
+ var allResult = ErrorSeverity.NONE;
void reportPartError(String partPath) {
errorSink.writeln('$partPath is a part and cannot be analyzed.');
@@ -245,7 +244,7 @@
allResult = allResult.max(ErrorSeverity.ERROR);
}
- for (String sourcePath in options.sourceFiles) {
+ for (var sourcePath in options.sourceFiles) {
sourcePath = normalizePath(sourcePath);
// Create a context, or re-use the previous one.
@@ -259,39 +258,38 @@
// Add all the files to be analyzed en masse to the context. Skip any
// files that were added earlier (whether explicitly or implicitly) to
// avoid causing those files to be unnecessarily re-read.
- Set<String> filesToAnalyze = <String>{};
+ var filesToAnalyze = <String>{};
// Collect files for analysis.
// Note that these files will all be analyzed in the same context.
// This should be updated when the ContextManager re-work is complete
// (See: https://github.com/dart-lang/sdk/issues/24133)
- Iterable<io.File> files =
- _collectFiles(sourcePath, analysisDriver.analysisOptions);
+ var files = _collectFiles(sourcePath, analysisDriver.analysisOptions);
if (files.isEmpty) {
errorSink.writeln('No dart files found at: $sourcePath');
io.exitCode = ErrorSeverity.ERROR.ordinal;
return ErrorSeverity.ERROR;
}
- for (io.File file in files) {
+ for (var file in files) {
filesToAnalyze.add(file.absolute.path);
}
// Analyze the libraries.
- for (String path in filesToAnalyze) {
+ for (var path in filesToAnalyze) {
var shortName = resourceProvider.pathContext.basename(path);
if (shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE) {
- File file = resourceProvider.getFile(path);
- String content = file.readAsStringSync();
- LineInfo lineInfo = LineInfo.fromContent(content);
- List<AnalysisError> errors = analyzeAnalysisOptions(
+ var file = resourceProvider.getFile(path);
+ var content = file.readAsStringSync();
+ var lineInfo = LineInfo.fromContent(content);
+ var errors = analyzeAnalysisOptions(
file.createSource(), content, analysisDriver.sourceFactory);
formatter.formatErrors([
ErrorsResultImpl(analysisDriver.currentSession, path, null,
lineInfo, false, errors)
]);
- for (AnalysisError error in errors) {
- ErrorSeverity severity = determineProcessedSeverity(
+ for (var error in errors) {
+ var severity = determineProcessedSeverity(
error, options, analysisDriver.analysisOptions);
if (severity != null) {
allResult = allResult.max(severity);
@@ -299,20 +297,20 @@
}
} else if (shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
try {
- File file = resourceProvider.getFile(path);
- String content = file.readAsStringSync();
- YamlNode node = loadYamlNode(content);
+ var file = resourceProvider.getFile(path);
+ var content = file.readAsStringSync();
+ var node = loadYamlNode(content);
if (node is YamlMap) {
- PubspecValidator validator =
+ var validator =
PubspecValidator(resourceProvider, file.createSource());
- LineInfo lineInfo = LineInfo.fromContent(content);
- List<AnalysisError> errors = validator.validate(node.nodes);
+ var lineInfo = LineInfo.fromContent(content);
+ var errors = validator.validate(node.nodes);
formatter.formatErrors([
ErrorsResultImpl(analysisDriver.currentSession, path, null,
lineInfo, false, errors)
]);
- for (AnalysisError error in errors) {
- ErrorSeverity severity = determineProcessedSeverity(
+ for (var error in errors) {
+ var severity = determineProcessedSeverity(
error, options, analysisDriver.analysisOptions);
allResult = allResult.max(severity);
}
@@ -322,19 +320,18 @@
}
} else if (shortName == AnalysisEngine.ANDROID_MANIFEST_FILE) {
try {
- File file = resourceProvider.getFile(path);
- String content = file.readAsStringSync();
- ManifestValidator validator =
- ManifestValidator(file.createSource());
- LineInfo lineInfo = LineInfo.fromContent(content);
- List<AnalysisError> errors = validator.validate(
+ var file = resourceProvider.getFile(path);
+ var content = file.readAsStringSync();
+ var validator = ManifestValidator(file.createSource());
+ var lineInfo = LineInfo.fromContent(content);
+ var errors = validator.validate(
content, analysisDriver.analysisOptions.chromeOsManifestChecks);
formatter.formatErrors([
ErrorsResultImpl(analysisDriver.currentSession, path, null,
lineInfo, false, errors)
]);
- for (AnalysisError error in errors) {
- ErrorSeverity severity = determineProcessedSeverity(
+ for (var error in errors) {
+ var severity = determineProcessedSeverity(
error, options, analysisDriver.analysisOptions);
allResult = allResult.max(severity);
}
@@ -353,11 +350,11 @@
}
libraryFiles.add(file);
- ErrorSeverity status = await _runAnalyzer(file, options, formatter);
+ var status = await _runAnalyzer(file, options, formatter);
allResult = allResult.max(status);
// Mark previously dangling parts as no longer dangling.
- for (FileState part in file.partedFiles) {
+ for (var part in file.partedFiles) {
danglingParts.remove(part);
}
}
@@ -372,7 +369,7 @@
}
// Any dangling parts still in this list were definitely dangling.
- for (FileState partFile in danglingParts) {
+ for (var partFile in danglingParts) {
reportPartError(partFile.path);
}
@@ -393,7 +390,7 @@
CommandLineOptions options, SendPort sendPort) async {
// TODO(brianwilkerson) Determine whether this await is necessary.
await null;
- PerformanceTag previous = _analyzeAllTag.makeCurrent();
+ var previous = _analyzeAllTag.makeCurrent();
try {
if (options.buildModePersistentWorker) {
var workerLoop = sendPort == null
@@ -436,13 +433,13 @@
}
// Now, build our resolver list.
- List<UriResolver> resolvers = [];
+ var resolvers = <UriResolver>[];
// 'dart:' URIs come first.
// Setup embedding.
if (includeSdkResolver) {
- EmbedderSdk embedderSdk = EmbedderSdk(resourceProvider, embedderMap);
+ var embedderSdk = EmbedderSdk(resourceProvider, embedderMap);
if (embedderSdk.libraryMap.size() == 0) {
// The embedder uri resolver has no mappings. Use the default Dart SDK
// uri resolver.
@@ -472,16 +469,16 @@
/// Collect all analyzable files at [filePath], recursively if it's a
/// directory, ignoring links.
Iterable<io.File> _collectFiles(String filePath, AnalysisOptions options) {
- List<io.File> files = <io.File>[];
- io.File file = io.File(filePath);
+ var files = <io.File>[];
+ var file = io.File(filePath);
if (file.existsSync() && !pathFilter.ignored(filePath)) {
files.add(file);
} else {
- io.Directory directory = io.Directory(filePath);
+ var directory = io.Directory(filePath);
if (directory.existsSync()) {
- for (io.FileSystemEntity entry
+ for (var entry
in directory.listSync(recursive: true, followLinks: false)) {
- String relative = path.relative(entry.path, from: directory.path);
+ var relative = path.relative(entry.path, from: directory.path);
if ((AnalysisEngine.isDartFileName(entry.path) ||
AnalysisEngine.isManifestFileName(entry.path)) &&
entry is io.File &&
@@ -505,7 +502,7 @@
analysisDriver = null;
}
- AnalysisOptionsImpl analysisOptions =
+ var analysisOptions =
createAnalysisOptionsForCommandLineOptions(options, source);
// Store the [PathFilter] for this context to properly exclude files
@@ -532,45 +529,44 @@
}
// Find package info.
- _PackageInfo packageInfo = _findPackages(options);
+ var packageInfo = _findPackages(options);
// Process embedders.
- Map<Folder, YamlMap> embedderMap = {};
+ var embedderMap = <Folder, YamlMap>{};
if (packageInfo.packageMap != null) {
var libFolder = packageInfo.packageMap['sky_engine']?.first;
if (libFolder != null) {
- EmbedderYamlLocator locator =
- EmbedderYamlLocator.forLibFolder(libFolder);
+ var locator = EmbedderYamlLocator.forLibFolder(libFolder);
embedderMap = locator.embedderYamls;
}
}
// No summaries in the presence of embedders.
- bool useSummaries = embedderMap.isEmpty;
+ var useSummaries = embedderMap.isEmpty;
if (!useSummaries && options.buildSummaryInputs.isNotEmpty) {
throw _DriverError('Summaries are not yet supported when using Flutter.');
}
// Read any input summaries.
- SummaryDataStore summaryDataStore = SummaryDataStore(
+ var summaryDataStore = SummaryDataStore(
useSummaries ? options.buildSummaryInputs : <String>[]);
// Once options and embedders are processed, setup the SDK.
_setupSdk(options, useSummaries, analysisOptions);
- PackageBundle sdkBundle = sdk.getLinkedBundle();
+ var sdkBundle = sdk.getLinkedBundle();
if (sdkBundle != null) {
summaryDataStore.addBundle(null, sdkBundle);
}
// Choose a package resolution policy and a diet parsing policy based on
// the command-line options.
- SourceFactory sourceFactory = _chooseUriResolutionPolicy(options,
- embedderMap, packageInfo, summaryDataStore, true, analysisOptions);
+ var sourceFactory = _chooseUriResolutionPolicy(options, embedderMap,
+ packageInfo, summaryDataStore, true, analysisOptions);
- PerformanceLog log = PerformanceLog(null);
- AnalysisDriverScheduler scheduler = AnalysisDriverScheduler(log);
+ var log = PerformanceLog(null);
+ var scheduler = AnalysisDriverScheduler(log);
analysisDriver = AnalysisDriver(
scheduler,
@@ -592,7 +588,7 @@
Map<String, List<Folder>> packageMap;
if (options.packageConfigPath != null) {
- String path = normalizePath(options.packageConfigPath);
+ var path = normalizePath(options.packageConfigPath);
try {
packages = parsePackagesFile(
resourceProvider,
@@ -606,7 +602,7 @@
var path = normalizePath(options.packageRootPath);
packageMap = _PackageRootPackageMapBuilder.buildPackageMap(path);
} else {
- Resource cwd = resourceProvider.getResource(path.current);
+ var cwd = resourceProvider.getResource(path.current);
// Look for .packages.
packages = findPackagesFrom(resourceProvider, cwd);
packageMap = _getPackageMap(packages);
@@ -634,9 +630,9 @@
/// Analyze a single source.
Future<ErrorSeverity> _runAnalyzer(
FileState file, CommandLineOptions options, ErrorFormatter formatter) {
- int startTime = currentTimeMillis;
- AnalyzerImpl analyzer = AnalyzerImpl(analysisDriver.analysisOptions,
- analysisDriver, file, options, stats, startTime);
+ var startTime = currentTimeMillis;
+ var analyzer = AnalyzerImpl(analysisDriver.analysisOptions, analysisDriver,
+ file, options, stats, startTime);
return analyzer.analyze(formatter);
}
@@ -646,8 +642,8 @@
if (options.dartSdkSummaryPath != null) {
sdk = SummaryBasedDartSdk(options.dartSdkSummaryPath, true);
} else {
- String dartSdkPath = options.dartSdkPath;
- FolderBasedDartSdk dartSdk = FolderBasedDartSdk(
+ var dartSdkPath = options.dartSdkPath;
+ var dartSdk = FolderBasedDartSdk(
resourceProvider, resourceProvider.getFolder(dartSdkPath));
dartSdk.useSummary = useSummaries &&
options.sourceFiles.every((String sourcePath) {
@@ -705,7 +701,7 @@
if (l1.length != l2.length) {
return false;
}
- for (int i = 0; i < l1.length; i++) {
+ for (var i = 0; i < l1.length; i++) {
if (l1[i] != l2[i]) {
return false;
}
@@ -718,7 +714,7 @@
if (m1.length != m2.length) {
return false;
}
- for (String key in m1.keys) {
+ for (var key in m1.keys) {
if (!m2.containsKey(key) || m1[key] != m2[key]) {
return false;
}
diff --git a/pkg/analyzer_cli/lib/src/error_formatter.dart b/pkg/analyzer_cli/lib/src/error_formatter.dart
index 84e09b2..e7a39af 100644
--- a/pkg/analyzer_cli/lib/src/error_formatter.dart
+++ b/pkg/analyzer_cli/lib/src/error_formatter.dart
@@ -4,7 +4,6 @@
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/error/error.dart';
-import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_cli/src/ansi.dart';
@@ -52,11 +51,11 @@
/// Print statistics to [out].
void print(StringSink out) {
- bool hasErrors = errorCount != 0;
- bool hasWarns = warnCount != 0;
- bool hasHints = hintCount != 0;
- bool hasLints = lintCount != 0;
- bool hasContent = false;
+ var hasErrors = errorCount != 0;
+ var hasWarns = warnCount != 0;
+ var hasHints = hintCount != 0;
+ var hasLints = lintCount != 0;
+ var hasContent = false;
if (hasErrors) {
out.write(errorCount);
out.write(' ');
@@ -150,7 +149,7 @@
@override
int compareTo(CLIError other) {
// severity
- int compare = _severityCompare[other.severity] - _severityCompare[severity];
+ var compare = _severityCompare[other.severity] - _severityCompare[severity];
if (compare != 0) return compare;
// path
@@ -195,10 +194,10 @@
void formatErrors(List<ErrorsResult> results) {
stats.unfilteredCount += results.length;
- List<AnalysisError> errors = <AnalysisError>[];
- Map<AnalysisError, ErrorsResult> errorToLine = {};
- for (ErrorsResult result in results) {
- for (AnalysisError error in result.errors) {
+ var errors = <AnalysisError>[];
+ var errorToLine = <AnalysisError, ErrorsResult>{};
+ for (var result in results) {
+ for (var error in result.errors) {
if (_computeSeverity(error) != null) {
errors.add(error);
errorToLine[error] = result;
@@ -206,7 +205,7 @@
}
}
- for (AnalysisError error in errors) {
+ for (var error in errors) {
formatError(errorToLine, error);
}
}
@@ -233,10 +232,10 @@
@override
void flush() {
// sort
- List<CLIError> sortedErrors = batchedErrors.toList()..sort();
+ var sortedErrors = batchedErrors.toList()..sort();
// print
- for (CLIError error in sortedErrors) {
+ for (var error in sortedErrors) {
if (error.isError) {
stats.errorCount++;
} else if (error.isWarning) {
@@ -248,7 +247,7 @@
}
// warning • 'foo' is not a bar. • lib/foo.dart:1:2 • foo_warning
- String issueColor = (error.isError || error.isWarning) ? ansi.red : '';
+ var issueColor = (error.isError || error.isWarning) ? ansi.red : '';
out.write(' $issueColor${error.severity}${ansi.none} '
'${ansi.bullet} ${ansi.bold}${error.message}${ansi.none} ');
out.write('${ansi.bullet} ${error.sourcePath}');
@@ -258,7 +257,7 @@
// If verbose, also print any associated correction and URL.
if (options.verbose) {
- String padding = ' '.padLeft(error.severity.length + 2);
+ var padding = ' '.padLeft(error.severity.length + 2);
for (var message in error.contextMessages) {
out.write('$padding${message.message} ');
out.write('at ${message.filePath}');
@@ -280,14 +279,14 @@
@override
void formatError(
Map<AnalysisError, ErrorsResult> errorToLine, AnalysisError error) {
- Source source = error.source;
+ var source = error.source;
var result = errorToLine[error];
var location = result.lineInfo.getLocation(error.offset);
- ErrorSeverity severity = _severityProcessor(error);
+ var severity = _severityProcessor(error);
// Get display name; translate INFOs into LINTS and HINTS.
- String errorType = severity.displayName;
+ var errorType = severity.displayName;
if (severity == ErrorSeverity.INFO) {
if (error.errorCode.type == ErrorType.HINT ||
error.errorCode.type == ErrorType.LINT) {
@@ -308,12 +307,11 @@
} else {
sourcePath = _relative(source.fullName);
}
- List<ContextMessage> contextMessages = [];
+ var contextMessages = <ContextMessage>[];
for (var message in error.contextMessages) {
var session = result.session.analysisContext;
if (session is DriverBasedAnalysisContext) {
- LineInfo lineInfo =
- session.driver.getFileSync(message.filePath)?.lineInfo;
+ var lineInfo = session.driver.getFileSync(message.filePath)?.lineInfo;
var location = lineInfo.getLocation(message.offset);
contextMessages.add(ContextMessage(message.filePath, message.message,
location.lineNumber, location.columnNumber));
@@ -357,11 +355,11 @@
if (!_seenErrors.add(error)) {
return;
}
- Source source = error.source;
+ var source = error.source;
var location = errorToLine[error].lineInfo.getLocation(error.offset);
- int length = error.length;
+ var length = error.length;
- ErrorSeverity severity = _severityProcessor(error);
+ var severity = _severityProcessor(error);
if (severity == ErrorSeverity.ERROR) {
stats.errorCount++;
@@ -392,8 +390,8 @@
}
static String _escapeForMachineMode(String input) {
- StringBuffer result = StringBuffer();
- for (int c in input.codeUnits) {
+ var result = StringBuffer();
+ for (var c in input.codeUnits) {
if (c == _newline) {
result.write(r'\n');
} else if (c == _return) {
diff --git a/pkg/analyzer_cli/lib/src/error_severity.dart b/pkg/analyzer_cli/lib/src/error_severity.dart
index 198ff9a..dc7e4ec 100644
--- a/pkg/analyzer_cli/lib/src/error_severity.dart
+++ b/pkg/analyzer_cli/lib/src/error_severity.dart
@@ -18,8 +18,7 @@
AnalysisOptions analysisOptions,
) {
if (analysisOptions != null) {
- ErrorProcessor processor =
- ErrorProcessor.getProcessor(analysisOptions, error);
+ var processor = ErrorProcessor.getProcessor(analysisOptions, error);
// If there is a processor for this error, defer to it.
if (processor != null) {
return processor.severity;
@@ -37,8 +36,7 @@
/// [error] (or `null` if it's to be suppressed).
ErrorSeverity determineProcessedSeverity(AnalysisError error,
CommandLineOptions commandLineOptions, AnalysisOptions analysisOptions) {
- ErrorSeverity severity =
- computeSeverity(error, commandLineOptions, analysisOptions);
+ var severity = computeSeverity(error, commandLineOptions, analysisOptions);
// Skip TODOs categorically unless escalated to ERROR or HINT (#26215).
if (error.errorCode.type == ErrorType.TODO &&
severity == ErrorSeverity.INFO) {
diff --git a/pkg/analyzer_cli/lib/src/has_context_mixin.dart b/pkg/analyzer_cli/lib/src/has_context_mixin.dart
index 1159f56..554deca 100644
--- a/pkg/analyzer_cli/lib/src/has_context_mixin.dart
+++ b/pkg/analyzer_cli/lib/src/has_context_mixin.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/file_system.dart' as file_system;
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer_cli/src/context_cache.dart';
@@ -18,8 +17,7 @@
AnalysisOptionsImpl createAnalysisOptionsForCommandLineOptions(
CommandLineOptions options, String source) {
if (options.analysisOptionsFile != null) {
- file_system.File file =
- resourceProvider.getFile(options.analysisOptionsFile);
+ var file = resourceProvider.getFile(options.analysisOptionsFile);
if (!file.exists) {
printAndFail('Options file not found: ${options.analysisOptionsFile}',
exitCode: ErrorSeverity.ERROR.ordinal);
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index fee0614..27bf56d 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -220,7 +220,7 @@
/// by default prints an error message to stderr and exits.
static CommandLineOptions parse(List<String> args,
{Function(String msg) printAndFail = printAndFail}) {
- CommandLineOptions options = _parse(args);
+ var options = _parse(args);
/// Only happens in testing.
if (options == null) {
@@ -232,7 +232,7 @@
// Infer if unspecified.
options.dartSdkPath ??= getSdkPath(args);
- String sdkPath = options.dartSdkPath;
+ var sdkPath = options.dartSdkPath;
// Check that SDK is specified.
if (sdkPath == null) {
@@ -268,9 +268,8 @@
static String _getVersion() {
try {
// This is relative to bin/snapshot, so ../..
- String versionPath =
- Platform.script.resolve('../../version').toFilePath();
- File versionFile = File(versionPath);
+ var versionPath = Platform.script.resolve('../../version').toFilePath();
+ var versionFile = File(versionPath);
return versionFile.readAsStringSync().trim();
} catch (_) {
// This happens when the script is not running in the context of an SDK.
@@ -281,10 +280,10 @@
static CommandLineOptions _parse(List<String> args) {
args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args);
- bool verbose = args.contains('-v') || args.contains('--verbose');
- bool hide = !verbose;
+ var verbose = args.contains('-v') || args.contains('--verbose');
+ var hide = !verbose;
- ArgParser parser = ArgParser(allowTrailingOptions: true);
+ var parser = ArgParser(allowTrailingOptions: true);
if (!hide) {
parser.addSeparator('General options:');
@@ -488,12 +487,12 @@
if (args.contains('--$ignoreUnrecognizedFlagsFlag')) {
args = filterUnknownArguments(args, parser);
}
- ArgResults results = parser.parse(args);
+ var results = parser.parse(args);
// Persistent worker.
if (args.contains('--persistent_worker')) {
- bool hasBuildMode = args.contains('--build-mode');
- bool onlyDartSdkArg = args.length == 2 ||
+ var hasBuildMode = args.contains('--build-mode');
+ var onlyDartSdkArg = args.length == 2 ||
(args.length == 3 && args.any((a) => a.startsWith('--dart-sdk'))) ||
(args.length == 4 && args.contains('--dart-sdk'));
if (!(hasBuildMode && onlyDartSdkArg)) {
@@ -546,9 +545,9 @@
'future release.\n');
}
if (results.wasParsed('enable-experiment')) {
- List<String> names =
+ var names =
(results['enable-experiment'] as List).cast<String>().toList();
- bool errorFound = false;
+ var errorFound = false;
for (var validationResult in validateFlags(names)) {
if (validationResult.isError) {
errorFound = true;
diff --git a/pkg/analyzer_cli/lib/src/perf_report.dart b/pkg/analyzer_cli/lib/src/perf_report.dart
index 287f68a..4c6aa87 100644
--- a/pkg/analyzer_cli/lib/src/perf_report.dart
+++ b/pkg/analyzer_cli/lib/src/perf_report.dart
@@ -28,8 +28,8 @@
String makePerfReport(int startTime, int endTime, CommandLineOptions options,
int analyzedFileCount, AnalysisStats stats) {
- int totalTime = endTime - startTime;
- int otherTime = totalTime;
+ var totalTime = endTime - startTime;
+ var otherTime = totalTime;
var platformJson = <String, dynamic>{
'osType': _osType,
@@ -50,9 +50,9 @@
// Convert performance tags to JSON representation.
var perfTagsJson = <String, dynamic>{};
- for (PerformanceTag tag in PerformanceTag.all) {
+ for (var tag in PerformanceTag.all) {
if (tag != PerformanceTag.unknown) {
- int tagTime = tag.elapsedMs;
+ var tagTime = tag.elapsedMs;
perfTagsJson[tag.label] = tagTime;
otherTime -= tagTime;
}
diff --git a/pkg/analyzer_cli/test/all.dart b/pkg/analyzer_cli/test/all.dart
index 329bd32..7ea963e 100644
--- a/pkg/analyzer_cli/test/all.dart
+++ b/pkg/analyzer_cli/test/all.dart
@@ -2,28 +2,30 @@
// 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 'analysis_options_test.dart' as analysis_options_test;
-import 'build_mode_test.dart' as build_mode_test;
-import 'driver_test.dart' as driver_test;
-import 'embedder_test.dart' as embedder_test;
-import 'errors_reported_once_test.dart' as errors_reported_once_test;
-import 'errors_upgrade_fails_cli_test.dart' as errors_upgrade_fails_cli_test;
-import 'options_test.dart' as options_test;
-import 'package_prefix_test.dart' as package_prefix_test;
-import 'perf_report_test.dart' as perf_report_test;
-import 'reporter_test.dart' as reporter_test;
-import 'strong_mode_test.dart' as strong_mode_test;
+import 'analysis_options_test.dart' as analysis_options;
+import 'build_mode_test.dart' as build_mode;
+import 'driver_test.dart' as driver;
+import 'embedder_test.dart' as embedder;
+import 'errors_reported_once_test.dart' as errors_reported_once;
+import 'errors_upgrade_fails_cli_test.dart' as errors_upgrade_fails_cli;
+import 'options_test.dart' as options;
+import 'package_prefix_test.dart' as package_prefix;
+import 'perf_report_test.dart' as perf_report;
+import 'reporter_test.dart' as reporter;
+import 'strong_mode_test.dart' as strong_mode;
+import 'verify_sorted_test.dart' as verify_sorted;
void main() {
- analysis_options_test.main();
- build_mode_test.main();
- driver_test.main();
- embedder_test.main();
- errors_reported_once_test.main();
- errors_upgrade_fails_cli_test.main();
- options_test.main();
- package_prefix_test.main();
- perf_report_test.main();
- reporter_test.main();
- strong_mode_test.main();
+ analysis_options.main();
+ build_mode.main();
+ driver.main();
+ embedder.main();
+ errors_reported_once.main();
+ errors_upgrade_fails_cli.main();
+ options.main();
+ package_prefix.main();
+ perf_report.main();
+ reporter.main();
+ strong_mode.main();
+ verify_sorted.main();
}
diff --git a/pkg/analyzer_cli/test/build_mode_test.dart b/pkg/analyzer_cli/test/build_mode_test.dart
index fece8a0..c2db753 100644
--- a/pkg/analyzer_cli/test/build_mode_test.dart
+++ b/pkg/analyzer_cli/test/build_mode_test.dart
@@ -132,7 +132,7 @@
var writer = CodedBufferWriter();
writer.writeInt32NoTag(buffer.length);
- List<int> result = [];
+ var result = <int>[];
result.addAll(writer.toBuffer());
result.addAll(buffer);
return result;
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 805f5d9..43e9d62 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -47,12 +47,12 @@
var optionsFileName = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
var options = _p('data/options_tests_project/' + optionsFileName);
- List<String> args = <String>[];
+ var args = <String>[];
if (dartSdkSummaryPath != null) {
args.add('--dart-sdk-summary');
args.add(dartSdkSummaryPath);
} else {
- String sdkPath = _findSdkDirForSummaries();
+ var sdkPath = _findSdkDirForSummaries();
args.add('--dart-sdk');
args.add(sdkPath);
}
@@ -61,7 +61,7 @@
args.addAll(additionalArgs);
uri ??= 'file:///test_file.dart';
- String source = '$uri|$path';
+ var source = '$uri|$path';
await drive(source, args: args, options: options);
}
@@ -69,7 +69,7 @@
/// Try to find a appropriate directory to pass to "--dart-sdk" that will
/// allow summaries to be found.
String _findSdkDirForSummaries() {
- Set<String> triedDirectories = <String>{};
+ var triedDirectories = <String>{};
bool isSuitable(String sdkDir) {
triedDirectories.add(sdkDir);
return File(path.join(sdkDir, 'lib', '_internal', 'strong.sum'))
@@ -84,8 +84,8 @@
// Usually the sdk directory is the parent of the parent of the "dart"
// executable.
- Directory executableParent = File(Platform.executable).parent;
- Directory executableGrandparent = executableParent.parent;
+ var executableParent = File(Platform.executable).parent;
+ var executableGrandparent = executableParent.parent;
if (isSuitable(executableGrandparent.path)) {
return makeAbsoluteAndNormalized(executableGrandparent.path);
}
@@ -97,14 +97,14 @@
// If neither of those are suitable, assume we are running locally within the
// SDK project (e.g. within an IDE). Find the build output directory and
// search all built configurations.
- Directory sdkRootDir =
+ var sdkRootDir =
File(Platform.script.toFilePath()).parent.parent.parent.parent;
- for (String outDirName in ['out', 'xcodebuild']) {
- Directory outDir = Directory(path.join(sdkRootDir.path, outDirName));
+ for (var outDirName in ['out', 'xcodebuild']) {
+ var outDir = Directory(path.join(sdkRootDir.path, outDirName));
if (outDir.existsSync()) {
- for (FileSystemEntity subdir in outDir.listSync()) {
+ for (var subdir in outDir.listSync()) {
if (subdir is Directory) {
- String candidateSdkDir = path.join(subdir.path, 'dart-sdk');
+ var candidateSdkDir = path.join(subdir.path, 'dart-sdk');
if (isSuitable(candidateSdkDir)) {
return makeAbsoluteAndNormalized(candidateSdkDir);
}
@@ -191,9 +191,9 @@
/// Convert a file specification from a relative path to an absolute path.
/// Handles the case where the file specification is of the form "$uri|$path".
String _adjustFileSpec(String fileSpec) {
- int uriPrefixLength = fileSpec.indexOf('|') + 1;
- String uriPrefix = fileSpec.substring(0, uriPrefixLength);
- String relativePath = fileSpec.substring(uriPrefixLength);
+ var uriPrefixLength = fileSpec.indexOf('|') + 1;
+ var uriPrefix = fileSpec.substring(0, uriPrefixLength);
+ var relativePath = fileSpec.substring(uriPrefixLength);
return '$uriPrefix${path.join(testDirectory, relativePath)}';
}
@@ -483,8 +483,7 @@
]);
var output = File(outputPath);
expect(output.existsSync(), isTrue);
- PackageBundle bundle =
- PackageBundle.fromBuffer(await output.readAsBytes());
+ var bundle = PackageBundle.fromBuffer(await output.readAsBytes());
var testFileUri = 'file:///test_file.dart';
var bundle2 = bundle.bundle2;
@@ -602,8 +601,8 @@
Future<void> test_dartSdkSummaryPath_strong() async {
await withTempDirAsync((tempDir) async {
- String sdkPath = _findSdkDirForSummaries();
- String strongSummaryPath =
+ var sdkPath = _findSdkDirForSummaries();
+ var strongSummaryPath =
path.join(sdkPath, 'lib', '_internal', 'strong.sum');
var testDart = path.join(tempDir, 'test.dart');
@@ -694,13 +693,13 @@
// Copy to temp dir so that existing analysis options
// in the test directory hierarchy do not interfere
await withTempDirAsync((String tempDirPath) async {
- String dartSdkPath = path.absolute(getSdkPath());
+ var dartSdkPath = path.absolute(getSdkPath());
await recursiveCopy(
Directory(path.join(testDirectory, 'data', 'bazel')), tempDirPath);
- Directory origWorkingDir = Directory.current;
+ var origWorkingDir = Directory.current;
try {
Directory.current = path.join(tempDirPath, 'proj');
- Driver driver = Driver(isTesting: true);
+ var driver = Driver(isTesting: true);
try {
await driver.start([
path.join('lib', 'file.dart'),
@@ -776,7 +775,7 @@
}
Future<void> test_partFile_reversed() async {
- Driver driver = Driver(isTesting: true);
+ var driver = Driver(isTesting: true);
await driver.start([
path.join(testDirectory, 'data/library_and_parts/part1.dart'),
path.join(testDirectory, 'data/library_and_parts/lib.dart')
@@ -796,7 +795,7 @@
String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
Future<void> test_containsLintRuleEntry() async {
- YamlMap options = _parseOptions('''
+ var options = _parseOptions('''
linter:
rules:
- foo
@@ -897,7 +896,7 @@
class NonDartFilesTest extends BaseTest {
Future<void> test_analysisOptionsYaml() async {
await withTempDirAsync((tempDir) async {
- String filePath =
+ var filePath =
path.join(tempDir, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
File(filePath).writeAsStringSync('''
analyzer:
@@ -914,14 +913,14 @@
Future<void> test_manifestFileChecks() async {
await withTempDirAsync((tempDir) async {
- String filePath =
+ var filePath =
path.join(tempDir, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
File(filePath).writeAsStringSync('''
analyzer:
optional-checks:
chrome-os-manifest-checks: true
''');
- String manifestPath =
+ var manifestPath =
path.join(tempDir, AnalysisEngine.ANDROID_MANIFEST_FILE);
File(manifestPath).writeAsStringSync('''
<manifest
@@ -941,7 +940,7 @@
Future<void> test_pubspecYaml() async {
await withTempDirAsync((tempDir) async {
- String filePath = path.join(tempDir, AnalysisEngine.PUBSPEC_YAML_FILE);
+ var filePath = path.join(tempDir, AnalysisEngine.PUBSPEC_YAML_FILE);
File(filePath).writeAsStringSync('''
name: foo
flutter:
@@ -1029,7 +1028,7 @@
}
Future<void> test_includeDirective() async {
- String testDir = path.join(
+ var testDir = path.join(
testDirectory, 'data', 'options_include_directive_tests_project');
await drive(
path.join(testDir, 'lib', 'test_file.dart'),
diff --git a/pkg/analyzer_cli/test/embedder_test.dart b/pkg/analyzer_cli/test/embedder_test.dart
index a088c8e..c855d21 100644
--- a/pkg/analyzer_cli/test/embedder_test.dart
+++ b/pkg/analyzer_cli/test/embedder_test.dart
@@ -5,7 +5,6 @@
import 'dart:io';
import 'package:analyzer/src/dart/sdk/sdk.dart';
-import 'package:analyzer/src/generated/sdk.dart';
import 'package:analyzer_cli/src/driver.dart' show Driver, errorSink, outSink;
import 'package:path/path.dart' as path;
import 'package:test/test.dart';
@@ -45,14 +44,14 @@
test('sdk setup', wrap(() async {
var testDir = path.join(testDirectory, 'data', 'embedder_client');
- Driver driver = Driver(isTesting: true);
+ var driver = Driver(isTesting: true);
await driver.start([
'--packages',
path.join(testDir, '_packages'),
path.join(testDir, 'embedder_yaml_user.dart')
]);
- DartSdk sdk = driver.sdk;
+ var sdk = driver.sdk;
expect(sdk, const TypeMatcher<FolderBasedDartSdk>());
expect((sdk as FolderBasedDartSdk).useSummary, isFalse);
}));
diff --git a/pkg/analyzer_cli/test/errors_reported_once_test.dart b/pkg/analyzer_cli/test/errors_reported_once_test.dart
index d110077..cb5ba53 100644
--- a/pkg/analyzer_cli/test/errors_reported_once_test.dart
+++ b/pkg/analyzer_cli/test/errors_reported_once_test.dart
@@ -40,23 +40,23 @@
}
Future<void> test_once() async {
- String testDir = path.join(testDirectory, 'data', 'errors_reported_once');
- Driver driver = Driver(isTesting: true);
+ var testDir = path.join(testDirectory, 'data', 'errors_reported_once');
+ var driver = Driver(isTesting: true);
await driver.start(
[path.join(testDir, 'foo.dart'), path.join(testDir, 'bar.dart')]);
expect(exitCode, 0);
// Ensure that we only have one copy of the error.
- final String unusedWarning = 'Unused import';
- String output = outSink.toString();
+ final unusedWarning = 'Unused import';
+ var output = outSink.toString();
expect(output, contains(unusedWarning));
expect(unusedWarning.allMatches(output).toList(), hasLength(1));
}
Future<void> test_once_machine() async {
- String testDir = path.join(testDirectory, 'data', 'errors_reported_once');
- Driver driver = Driver(isTesting: true);
+ var testDir = path.join(testDirectory, 'data', 'errors_reported_once');
+ var driver = Driver(isTesting: true);
await driver.start([
'--format',
'machine',
@@ -67,8 +67,8 @@
expect(exitCode, 0);
// Ensure that we only have one copy of the error.
- final String unusedWarning = 'Unused import';
- String output = errorSink.toString();
+ final unusedWarning = 'Unused import';
+ var output = errorSink.toString();
expect(output, contains(unusedWarning));
expect(unusedWarning.allMatches(output).toList(), hasLength(1));
}
diff --git a/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart b/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
index 1be1384..81e671d 100644
--- a/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
+++ b/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
@@ -40,9 +40,8 @@
}
Future<void> test_once() async {
- String testDir =
- path.join(testDirectory, 'data', 'error_upgrade_fails_cli');
- Driver driver = Driver(isTesting: true);
+ var testDir = path.join(testDirectory, 'data', 'error_upgrade_fails_cli');
+ var driver = Driver(isTesting: true);
await driver.start([path.join(testDir, 'foo.dart')]);
expect(exitCode, 3);
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 807b70f..8e5ce94 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -15,8 +15,8 @@
void main() {
group('CommandLineOptions', () {
group('parse', () {
- StringBuffer outStringBuffer = StringBuffer();
- StringBuffer errorStringBuffer = StringBuffer();
+ var outStringBuffer = StringBuffer();
+ var errorStringBuffer = StringBuffer();
StringSink savedOutSink, savedErrorSink;
int savedExitCode;
@@ -40,8 +40,7 @@
});
test('defaults', () {
- CommandLineOptions options =
- CommandLineOptions.parse(['--dart-sdk', '.', 'foo.dart']);
+ var options = CommandLineOptions.parse(['--dart-sdk', '.', 'foo.dart']);
expect(options, isNotNull);
expect(options.buildMode, isFalse);
expect(options.buildAnalysisOutput, isNull);
@@ -72,20 +71,19 @@
});
test('batch', () {
- CommandLineOptions options =
- CommandLineOptions.parse(['--dart-sdk', '.', '--batch']);
+ var options = CommandLineOptions.parse(['--dart-sdk', '.', '--batch']);
expect(options.batchMode, isTrue);
});
test('defined variables', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '-Dfoo=bar', 'foo.dart']);
expect(options.definedVariables['foo'], equals('bar'));
expect(options.definedVariables['bar'], isNull);
});
test('disable cache flushing', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--disable-cache-flushing', 'foo.dart']);
expect(options.disableCacheFlushing, isTrue);
});
@@ -98,13 +96,13 @@
};
test('no values', () {
- CommandLineOptions options = overrideKnownFeatures(
+ var options = overrideKnownFeatures(
knownFeatures, () => CommandLineOptions.parse(['foo.dart']));
expect(options.enabledExperiments, isEmpty);
});
test('single value', () {
- CommandLineOptions options = overrideKnownFeatures(
+ var options = overrideKnownFeatures(
knownFeatures,
() => CommandLineOptions.parse(
['--enable-experiment', 'a', 'foo.dart']));
@@ -113,7 +111,7 @@
group('multiple values', () {
test('single flag', () {
- CommandLineOptions options = overrideKnownFeatures(
+ var options = overrideKnownFeatures(
knownFeatures,
() => CommandLineOptions.parse(
['--enable-experiment', 'a,b', 'foo.dart']));
@@ -121,7 +119,7 @@
});
test('mixed single and multiple flags', () {
- CommandLineOptions options = overrideKnownFeatures(
+ var options = overrideKnownFeatures(
knownFeatures,
() => CommandLineOptions.parse([
'--enable-experiment',
@@ -134,7 +132,7 @@
});
test('multiple flags', () {
- CommandLineOptions options = overrideKnownFeatures(
+ var options = overrideKnownFeatures(
knownFeatures,
() => CommandLineOptions.parse([
'--enable-experiment',
@@ -149,80 +147,80 @@
});
test('hintsAreFatal', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--fatal-hints', 'foo.dart']);
expect(options.infosAreFatal, isTrue);
});
test('infosAreFatal', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--fatal-infos', 'foo.dart']);
expect(options.infosAreFatal, isTrue);
});
test('log', () {
- CommandLineOptions options =
+ var options =
CommandLineOptions.parse(['--dart-sdk', '.', '--log', 'foo.dart']);
expect(options.log, isTrue);
});
test('machine format', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--format=machine', 'foo.dart']);
expect(options.machineFormat, isTrue);
});
test('no-hints', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--no-hints', 'foo.dart']);
expect(options.disableHints, isTrue);
});
test('options', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--options', 'options.yaml', 'foo.dart']);
expect(options.analysisOptionsFile, equals('options.yaml'));
});
test('lints', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--lints', 'foo.dart']);
expect(options.lints, isTrue);
});
test('package root', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--package-root', 'bar', 'foo.dart']);
expect(options.packageRootPath, equals('bar'));
});
test('package warnings', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--package-warnings', 'foo.dart']);
expect(options.showPackageWarnings, isTrue);
});
test('sdk warnings', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--sdk-warnings', 'foo.dart']);
expect(options.showSdkWarnings, isTrue);
});
test('sourceFiles', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--log', 'foo.dart', 'foo2.dart', 'foo3.dart']);
expect(options.sourceFiles,
equals(['foo.dart', 'foo2.dart', 'foo3.dart']));
});
test('warningsAreFatal', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--fatal-warnings', 'foo.dart']);
expect(options.warningsAreFatal, isTrue);
});
test('ignore unrecognized flags', () {
- CommandLineOptions options = CommandLineOptions.parse([
+ var options = CommandLineOptions.parse([
'--ignore-unrecognized-flags',
'--bar',
'--baz',
@@ -235,7 +233,7 @@
});
test('hintsAreFatal', () {
- CommandLineOptions options = CommandLineOptions.parse(
+ var options = CommandLineOptions.parse(
['--dart-sdk', '.', '--fatal-lints', 'foo.dart']);
expect(options.lintsAreFatal, isTrue);
});
@@ -257,13 +255,13 @@
});
test('--use-fasta-parser', () {
- CommandLineOptions options =
+ var options =
CommandLineOptions.parse(['--use-fasta-parser', 'foo.dart']);
expect(options.useFastaParser, isTrue);
});
test('--train-snapshot', () {
- CommandLineOptions options =
+ var options =
CommandLineOptions.parse(['--train-snapshot', 'foo.dart']);
expect(options.trainSnapshot, isTrue);
});
diff --git a/pkg/analyzer_cli/test/reporter_test.dart b/pkg/analyzer_cli/test/reporter_test.dart
index 6976b5f..de8e15c 100644
--- a/pkg/analyzer_cli/test/reporter_test.dart
+++ b/pkg/analyzer_cli/test/reporter_test.dart
@@ -39,8 +39,7 @@
});
test('error', () {
- ErrorsResultImpl error =
- mockResult(ErrorType.SYNTACTIC_ERROR, ErrorSeverity.ERROR);
+ var error = mockResult(ErrorType.SYNTACTIC_ERROR, ErrorSeverity.ERROR);
reporter.formatErrors([error]);
reporter.flush();
@@ -49,7 +48,7 @@
});
test('hint', () {
- ErrorsResultImpl error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
+ var error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
reporter.formatErrors([error]);
reporter.flush();
@@ -58,7 +57,7 @@
});
test('stats', () {
- ErrorsResultImpl error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
+ var error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
reporter.formatErrors([error]);
reporter.flush();
stats.print(out);
diff --git a/pkg/analyzer_cli/test/utils.dart b/pkg/analyzer_cli/test/utils.dart
index 08ad8bd..778e42f 100644
--- a/pkg/analyzer_cli/test/utils.dart
+++ b/pkg/analyzer_cli/test/utils.dart
@@ -13,12 +13,33 @@
final String testDirectory = pathos.dirname(
pathos.fromUri((reflectClass(_TestUtils).owner as LibraryMirror).uri));
+/// Returns a path to the directory containing source code for packages such as
+/// kernel, front_end, and analyzer.
+String get packageRoot {
+ // If the package root directory is specified on the command line using
+ // -DpkgRoot=..., use it.
+ var pkgRootVar = const String.fromEnvironment('pkgRoot');
+ if (pkgRootVar != null) {
+ var path = pathos.join(Directory.current.path, pkgRootVar);
+ if (!path.endsWith(pathos.separator)) path += pathos.separator;
+ return path;
+ }
+ // Otherwise try to guess based on the script path.
+ var scriptPath = pathos.fromUri(Platform.script);
+ var parts = pathos.split(scriptPath);
+ var pkgIndex = parts.indexOf('pkg');
+ if (pkgIndex != -1) {
+ return pathos.joinAll(parts.sublist(0, pkgIndex + 1)) + pathos.separator;
+ }
+ throw StateError('Unable to find sdk/pkg/ in $scriptPath');
+}
+
/// Recursively copy the specified [src] directory (or file)
/// to the specified destination path.
Future<void> recursiveCopy(FileSystemEntity src, String dstPath) async {
if (src is Directory) {
await (Directory(dstPath)).create(recursive: true);
- for (FileSystemEntity entity in src.listSync()) {
+ for (var entity in src.listSync()) {
await recursiveCopy(
entity, pathos.join(dstPath, pathos.basename(entity.path)));
}
diff --git a/pkg/analyzer_cli/test/verify_sorted_test.dart b/pkg/analyzer_cli/test/verify_sorted_test.dart
new file mode 100644
index 0000000..57030b6
--- /dev/null
+++ b/pkg/analyzer_cli/test/verify_sorted_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2019, 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 'dart:io';
+
+import 'package:analysis_server/src/services/correction/sort_members.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+ var provider = PhysicalResourceProvider.INSTANCE;
+ var normalizedRoot = provider.pathContext.normalize(packageRoot);
+ var packagePath = provider.pathContext.join(normalizedRoot, 'analyzer_cli');
+ var testDataPath = provider.pathContext.join(packagePath, 'test', 'data');
+
+ var collection = AnalysisContextCollection(
+ includedPaths: <String>[packagePath],
+ excludedPaths: [testDataPath],
+ resourceProvider: provider);
+ var contexts = collection.contexts;
+ if (contexts.length != 1) {
+ fail('The directory $packagePath contains multiple analysis contexts.');
+ }
+
+ buildTestsIn(contexts[0].currentSession, packagePath, testDataPath,
+ provider.getFolder(packagePath));
+}
+
+void buildTestsIn(AnalysisSession session, String testDirPath,
+ String testDataPath, Folder directory) {
+ var pathContext = session.resourceProvider.pathContext;
+ var children = directory.getChildren();
+ children.sort((first, second) => first.shortName.compareTo(second.shortName));
+ for (var child in children) {
+ if (child is Folder) {
+ if (child.path != testDataPath) {
+ buildTestsIn(session, testDirPath, testDataPath, child);
+ }
+ } else if (child is File && child.shortName.endsWith('.dart')) {
+ var path = child.path;
+ var relativePath = pathContext.relative(path, from: testDirPath);
+ test(relativePath, () {
+ var result = session.getParsedUnit(path);
+ if (result.state != ResultState.VALID) {
+ fail('Could not parse $path');
+ }
+ var code = result.content;
+ var unit = result.unit;
+ var errors = result.errors;
+ if (errors.isNotEmpty) {
+ fail('Errors found when parsing $path');
+ }
+ var sorter = MemberSorter(code, unit);
+ var edits = sorter.sort();
+ if (edits.isNotEmpty) {
+ fail('Unsorted file $path');
+ }
+ });
+ }
+ }
+}
diff --git a/pkg/analyzer_cli/tool/perf.dart b/pkg/analyzer_cli/tool/perf.dart
index a480e85..5685be8 100644
--- a/pkg/analyzer_cli/tool/perf.dart
+++ b/pkg/analyzer_cli/tool/perf.dart
@@ -38,15 +38,15 @@
await setup(args[1]);
if (bench == 'scan') {
- Set<Source> files = scanReachableFiles(entryUri);
+ var files = scanReachableFiles(entryUri);
// TODO(sigmund): consider replacing the warmup with instrumented snapshots.
- for (int i = 0; i < 10; i++) {
+ for (var i = 0; i < 10; i++) {
scanFiles(files);
}
} else if (bench == 'parse') {
- Set<Source> files = scanReachableFiles(entryUri);
+ var files = scanReachableFiles(entryUri);
// TODO(sigmund): consider replacing the warmup with instrumented snapshots.
- for (int i = 0; i < 10; i++) {
+ for (var i = 0; i < 10; i++) {
parseFiles(files);
}
} else {
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart b/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart
index eca6b97..0c585f9 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart
@@ -35,3 +35,18 @@
const int DART_RELEVANCE_NAMED_PARAMETER_REQUIRED = 1065;
const int DART_RELEVANCE_PARAMETER = 1059;
const int DART_RELEVANCE_TYPE_PARAMETER = 1058;
+
+/// A name scope for constants that are related to the relevance of completion
+/// suggestions. The values are required to be in the range [0, 1000].
+abstract class Relevance {
+ /// The relevance used when suggesting a `call` method that is implied by a
+ /// type but isn't explicitly implemented in the type hierarchy.
+ static const int callFunction = 200;
+
+ /// The relevance used when suggesting a member of a class or extension and
+ /// there are no features that can be used to provide a relevance score.
+ static const int member = 500;
+
+ /// The relevance used when suggesting an override of an inherited member.
+ static const int override = 750;
+}
diff --git a/pkg/analyzer_plugin/test/utils/package_root.dart b/pkg/analyzer_plugin/test/utils/package_root.dart
index 47d0e31..98c24ba 100644
--- a/pkg/analyzer_plugin/test/utils/package_root.dart
+++ b/pkg/analyzer_plugin/test/utils/package_root.dart
@@ -11,7 +11,9 @@
String get packageRoot {
// If the package root directory is specified on the command line using
// -DpkgRoot=..., use it.
- String pkgRootVar = const String.fromEnvironment('pkgRoot');
+ String pkgRootVar = bool.hasEnvironment('pkgRoot')
+ ? const String.fromEnvironment('pkgRoot')
+ : null;
if (pkgRootVar != null) {
String path = pathos.join(Directory.current.path, pkgRootVar);
if (!path.endsWith(pathos.separator)) path += pathos.separator;
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 8d56df5..80362a4 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -55,6 +55,8 @@
static const String omitImplicitChecks = '--omit-implicit-checks';
static const String omitAsCasts = '--omit-as-casts';
static const String laxRuntimeTypeToString = '--lax-runtime-type-to-string';
+ static const String legacyJavaScript = '--legacy-javascript';
+ static const String noLegacyJavaScript = '--no-legacy-javascript';
static const String platformBinaries = '--platform-binaries=.+';
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 65ac11c..980e484 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -499,7 +499,6 @@
FunctionEntity get typeLiteralMaker;
FunctionEntity get checkTypeBound;
FieldEntity get rtiAsField;
- FieldEntity get rtiCheckField;
FieldEntity get rtiIsField;
FieldEntity get rtiRestField;
FieldEntity get rtiPrecomputed1Field;
@@ -511,27 +510,20 @@
FunctionEntity get generalIsTestImplementation;
FunctionEntity get generalAsCheckImplementation;
- FunctionEntity get generalTypeCheckImplementation;
FunctionEntity get specializedIsObject;
FunctionEntity get specializedAsObject;
- FunctionEntity get specializedCheckObject;
FunctionEntity get specializedIsTop;
FunctionEntity get specializedAsTop;
FunctionEntity get specializedIsBool;
FunctionEntity get specializedAsBoolNullable;
- FunctionEntity get specializedCheckBoolNullable;
FunctionEntity get specializedAsDoubleNullable;
- FunctionEntity get specializedCheckDoubleNullable;
FunctionEntity get specializedIsInt;
FunctionEntity get specializedAsIntNullable;
- FunctionEntity get specializedCheckIntNullable;
FunctionEntity get specializedIsNum;
FunctionEntity get specializedAsNumNullable;
- FunctionEntity get specializedCheckNumNullable;
FunctionEntity get specializedIsString;
FunctionEntity get specializedAsStringNullable;
- FunctionEntity get specializedCheckStringNullable;
FunctionEntity get instantiatedGenericFunctionTypeNewRti;
FunctionEntity get closureFunctionType;
@@ -1921,11 +1913,6 @@
@override
FieldEntity get rtiIsField => _rtiIsField ??= _findRtiClassField('_is');
- FieldEntity _rtiCheckField;
- @override
- FieldEntity get rtiCheckField =>
- _rtiCheckField ??= _findRtiClassField('_check');
-
FieldEntity _rtiRestField;
@override
FieldEntity get rtiRestField => _rtiRestField ??= _findRtiClassField('_rest');
@@ -1973,12 +1960,6 @@
_generalAsCheckImplementation ??=
_findRtiFunction('_generalAsCheckImplementation');
- FunctionEntity _generalTypeCheckImplementation;
- @override
- FunctionEntity get generalTypeCheckImplementation =>
- _generalTypeCheckImplementation ??=
- _findRtiFunction('_generalTypeCheckImplementation');
-
FunctionEntity _specializedIsObject;
@override
FunctionEntity get specializedIsObject =>
@@ -1989,11 +1970,6 @@
FunctionEntity get specializedAsObject =>
_specializedAsObject ??= _findRtiFunction('_asObject');
- FunctionEntity _specializedCheckObject;
- @override
- FunctionEntity get specializedCheckObject =>
- _specializedCheckObject ??= _findRtiFunction('_checkObject');
-
@override
FunctionEntity get specializedIsTop => _findRtiFunction('_isTop');
@@ -2008,18 +1984,10 @@
_findRtiFunction('_asBoolNullable');
@override
- FunctionEntity get specializedCheckBoolNullable =>
- _findRtiFunction('_checkBoolNullable');
-
- @override
FunctionEntity get specializedAsDoubleNullable =>
_findRtiFunction('_asDoubleNullable');
@override
- FunctionEntity get specializedCheckDoubleNullable =>
- _findRtiFunction('_checkDoubleNullable');
-
- @override
FunctionEntity get specializedIsInt => _findRtiFunction('_isInt');
@override
@@ -2027,10 +1995,6 @@
_findRtiFunction('_asIntNullable');
@override
- FunctionEntity get specializedCheckIntNullable =>
- _findRtiFunction('_checkIntNullable');
-
- @override
FunctionEntity get specializedIsNum => _findRtiFunction('_isNum');
@override
@@ -2038,10 +2002,6 @@
_findRtiFunction('_asNumNullable');
@override
- FunctionEntity get specializedCheckNumNullable =>
- _findRtiFunction('_checkNumNullable');
-
- @override
FunctionEntity get specializedIsString => _findRtiFunction('_isString');
@override
@@ -2049,10 +2009,6 @@
_findRtiFunction('_asStringNullable');
@override
- FunctionEntity get specializedCheckStringNullable =>
- _findRtiFunction('_checkStringNullable');
-
- @override
FunctionEntity get instantiatedGenericFunctionTypeNewRti =>
_findRtiFunction('instantiatedGenericFunctionType');
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 0fab620..e4953b3 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -463,6 +463,8 @@
new OptionHandler(Flags.omitImplicitChecks, passThrough),
new OptionHandler(Flags.omitAsCasts, passThrough),
new OptionHandler(Flags.laxRuntimeTypeToString, passThrough),
+ new OptionHandler(Flags.legacyJavaScript, passThrough),
+ new OptionHandler(Flags.noLegacyJavaScript, passThrough),
new OptionHandler(Flags.benchmarkingProduction, passThrough),
new OptionHandler(Flags.benchmarkingExperiment, passThrough),
new OptionHandler(Flags.nullSafety, setNullSafetyMode),
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index 6e0ebab..9cf992b 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -5,7 +5,7 @@
import '../common/names.dart';
import '../common_elements.dart';
import '../serialization/serialization.dart';
-import '../util/util.dart' show equalElements;
+import '../util/util.dart' show equalElements, identicalElements;
import 'entities.dart';
/// Hierarchy to describe types in Dart.
@@ -987,6 +987,115 @@
visitType(type, argument);
}
+class _LegacyErasureVisitor extends DartTypeVisitor<DartType, Null> {
+ final DartTypes _dartTypes;
+
+ _LegacyErasureVisitor(this._dartTypes);
+
+ DartType erase(DartType type) => visit(type, null);
+
+ List<DartType> eraseList(List<DartType> types) {
+ List<DartType> erasedTypes = types.map(erase).toList();
+ return identicalElements(erasedTypes, types) ? types : erasedTypes;
+ }
+
+ @override
+ DartType visit(DartType type, Null _) => type.accept(this, _);
+
+ @override
+ DartType visitLegacyType(LegacyType type, Null _) => erase(type.baseType);
+
+ @override
+ DartType visitNullableType(NullableType type, Null _) {
+ var baseType = erase(type.baseType);
+ if (identical(baseType, type.baseType)) return type;
+ return _dartTypes.nullableType(baseType);
+ }
+
+ @override
+ NeverType visitNeverType(NeverType type, Null _) => type;
+
+ @override
+ VoidType visitVoidType(VoidType type, Null _) => type;
+
+ @override
+ TypeVariableType visitTypeVariableType(TypeVariableType type, Null _) => type;
+
+ @override
+ FunctionTypeVariable visitFunctionTypeVariable(
+ FunctionTypeVariable type, Null _) =>
+ type;
+
+ @override
+ FunctionType visitFunctionType(FunctionType type, Null _) {
+ var returnType = erase(type.returnType);
+ var parameterTypes = eraseList(type.parameterTypes);
+ var optionalParameterTypes = eraseList(type.optionalParameterTypes);
+ var namedParameterTypes = eraseList(type.namedParameterTypes);
+
+ var oldTypeVariables = type.typeVariables;
+ var length = oldTypeVariables.length;
+
+ List<FunctionTypeVariable> typeVariables =
+ List<FunctionTypeVariable>(length);
+ List<FunctionTypeVariable> erasableTypeVariables = [];
+ List<FunctionTypeVariable> erasedTypeVariables = [];
+ for (int i = 0; i < length; i++) {
+ var oldTypeVariable = oldTypeVariables[i];
+ var oldBound = oldTypeVariable.bound;
+ var bound = erase(oldBound);
+ if (identical(bound, oldBound)) {
+ typeVariables[i] = oldTypeVariable;
+ } else {
+ var typeVariable = _dartTypes.functionTypeVariable(i)..bound = bound;
+ typeVariables[i] = typeVariable;
+ erasableTypeVariables.add(oldTypeVariable);
+ erasedTypeVariables.add(typeVariable);
+ }
+ }
+
+ if (identical(returnType, type.returnType) &&
+ identical(parameterTypes, type.parameterTypes) &&
+ identical(optionalParameterTypes, type.optionalParameterTypes) &&
+ identical(namedParameterTypes, type.namedParameterTypes) &&
+ erasableTypeVariables.isEmpty) return type;
+
+ return _dartTypes.subst(
+ erasedTypeVariables,
+ erasableTypeVariables,
+ _dartTypes.functionType(
+ returnType,
+ parameterTypes,
+ optionalParameterTypes,
+ type.namedParameters,
+ namedParameterTypes,
+ typeVariables));
+ }
+
+ @override
+ InterfaceType visitInterfaceType(InterfaceType type, Null _) {
+ var typeArguments = eraseList(type.typeArguments);
+ if (identical(typeArguments, type.typeArguments)) return type;
+ return _dartTypes.interfaceType(type.element, typeArguments);
+ }
+
+ @override
+ DynamicType visitDynamicType(DynamicType type, Null _) => type;
+
+ @override
+ ErasedType visitErasedType(ErasedType type, Null _) => type;
+
+ @override
+ AnyType visitAnyType(AnyType type, Null _) => type;
+
+ @override
+ DartType visitFutureOrType(FutureOrType type, Null _) {
+ var typeArgument = erase(type.typeArgument);
+ if (identical(typeArgument, type.typeArgument)) return type;
+ return _dartTypes.futureOrType(typeArgument);
+ }
+}
+
abstract class DartTypeSubstitutionVisitor<A>
extends DartTypeVisitor<DartType, A> {
DartTypes get dartTypes;
@@ -1649,10 +1758,10 @@
t is NullableType ||
t is LegacyType && _isNullable(t.baseType) ||
t is FutureOrType && _isNullable(t.typeArgument) ||
- _isStrongTopType(t);
+ isStrongTopType(t);
DartType result;
- if (_isStrongTopType(baseType) ||
+ if (isStrongTopType(baseType) ||
baseType.isNull ||
baseType is NullableType ||
baseType is FutureOrType && _isNullable(baseType.typeArgument)) {
@@ -1665,7 +1774,7 @@
result = commonElements.nullType;
} else if (legacyBaseType is FutureOrType &&
_isNullable(legacyBaseType.typeArgument)) {
- result = legacyBaseType.typeArgument;
+ result = legacyBaseType;
} else {
result = nullableType(legacyBaseType);
}
@@ -1675,7 +1784,8 @@
return result;
}
- DartType interfaceType(ClassEntity element, List<DartType> typeArguments) =>
+ InterfaceType interfaceType(
+ ClassEntity element, List<DartType> typeArguments) =>
InterfaceType._(element, typeArguments);
// TODO(fishythefish): Normalize `T extends Never` to `Never`.
@@ -1683,9 +1793,10 @@
TypeVariableType._(element);
// See [functionType] for normalization.
- DartType functionTypeVariable(int index) => FunctionTypeVariable._(index);
+ FunctionTypeVariable functionTypeVariable(int index) =>
+ FunctionTypeVariable._(index);
- DartType neverType() => const NeverType._();
+ NeverType neverType() => const NeverType._();
VoidType voidType() => const VoidType._();
@@ -1736,6 +1847,9 @@
return result;
}
+ DartType eraseLegacy(DartType type) =>
+ _LegacyErasureVisitor(this).erase(type);
+
/// Performs the substitution `[arguments[i]/parameters[i]]t`.
///
/// The notation is known from this lambda calculus rule:
@@ -1775,7 +1889,7 @@
/// Returns `true` if [t] is a top type, that is, a supertype of every type.
bool isTopType(DartType t) => t._isTop(useNullSafety);
- bool _isStrongTopType(DartType t) => t._isStrongTop(useNullSafety);
+ bool isStrongTopType(DartType t) => t._isStrongTop(useNullSafety);
/// Returns `true` if [s] is a subtype of [t].
bool isSubtype(DartType s, DartType t) => _subtypeHelper(s, t);
@@ -1818,7 +1932,7 @@
if (isTopType(t)) return true;
// Left Top:
- if (_isStrongTopType(s)) return false;
+ if (isStrongTopType(s)) return false;
// Left Bottom:
if (useLegacySubtyping) {
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index fdfb99e..c3683c5 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -273,6 +273,13 @@
nullable ? value : value.nonNullable(), isPrecise);
}
+ if (type is NullableType) {
+ return createFromStaticType(type.baseType,
+ classRelation: classRelation, nullable: true);
+ }
+
+ // TODO(sra): Handle LegacyType more precisely.
+
bool isPrecise = true;
while (type is TypeVariableType) {
TypeVariableType typeVariable = type;
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index dbe085e..75ec907 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -184,8 +184,7 @@
/// If this is not the case the raw type of [superclass] is returned.
///
/// This method is derived from `ir.Expression.getStaticTypeAsInstanceOf`.
- ir.InterfaceType getTypeAsInstanceOf(
- ir.DartType type, ir.Class superclass, ir.Library clientLibrary) {
+ ir.InterfaceType getTypeAsInstanceOf(ir.DartType type, ir.Class superclass) {
// This method assumes the program is correctly typed, so if the superclass
// is not generic, we can just return its raw type without computing the
// type of this expression. It also ensures that all types are considered
@@ -193,25 +192,26 @@
// considered subtypes of Function.
if (superclass.typeParameters.isEmpty) {
return typeEnvironment.coreTypes
- .rawType(superclass, ir.Nullability.legacy);
+ .rawType(superclass, currentLibrary.nonNullable);
}
while (type is ir.TypeParameterType) {
type = (type as ir.TypeParameterType).parameter.bound;
}
if (type == typeEnvironment.nullType) {
return typeEnvironment.coreTypes
- .bottomInterfaceType(superclass, clientLibrary.nullable);
+ .bottomInterfaceType(superclass, currentLibrary.nullable);
}
if (type is ir.InterfaceType) {
ir.InterfaceType upcastType = typeEnvironment.getTypeAsInstanceOf(
- type, superclass, clientLibrary, typeEnvironment.coreTypes);
+ type, superclass, currentLibrary, typeEnvironment.coreTypes);
if (upcastType != null) return upcastType;
} else if (type is ir.BottomType) {
return typeEnvironment.coreTypes
- .bottomInterfaceType(superclass, clientLibrary.nonNullable);
+ .bottomInterfaceType(superclass, currentLibrary.nonNullable);
}
// TODO(johnniwinther): Should we assert that this doesn't happen?
- return typeEnvironment.coreTypes.rawType(superclass, type.nullability);
+ return typeEnvironment.coreTypes
+ .rawType(superclass, currentLibrary.nonNullable);
}
/// Computes the result type of the property access [node] on a receiver of
@@ -228,8 +228,7 @@
}
if (interfaceTarget != null) {
ir.Class superclass = interfaceTarget.enclosingClass;
- receiverType =
- getTypeAsInstanceOf(receiverType, superclass, currentLibrary);
+ receiverType = getTypeAsInstanceOf(receiverType, superclass);
return ir.Substitution.fromInterfaceType(receiverType)
.substituteType(interfaceTarget.getterType);
}
@@ -299,7 +298,7 @@
ir.Class superclass = interfaceTarget.enclosingClass;
ir.Substitution receiverSubstitution =
ir.Substitution.fromInterfaceType(
- getTypeAsInstanceOf(receiverType, superclass, currentLibrary));
+ getTypeAsInstanceOf(receiverType, superclass));
ir.DartType setterType =
receiverSubstitution.substituteType(interfaceTarget.setterType);
if (!typeEnvironment.isSubtypeOf(
@@ -332,8 +331,7 @@
ir.DartType visitDirectPropertyGet(ir.DirectPropertyGet node) {
ir.DartType receiverType = visitNode(node.receiver);
ir.Class superclass = node.target.enclosingClass;
- receiverType =
- getTypeAsInstanceOf(receiverType, superclass, currentLibrary);
+ receiverType = getTypeAsInstanceOf(receiverType, superclass);
ir.DartType resultType = ir.Substitution.fromInterfaceType(receiverType)
.substituteType(node.target.getterType);
_expressionTypeCache[node] = resultType;
@@ -358,8 +356,7 @@
receiverType, argumentType);
} else {
ir.Class superclass = node.target.enclosingClass;
- receiverType =
- getTypeAsInstanceOf(receiverType, superclass, currentLibrary);
+ receiverType = getTypeAsInstanceOf(receiverType, superclass);
ir.DartType returnType = ir.Substitution.fromInterfaceType(receiverType)
.substituteType(node.target.function.returnType);
returnType = ir.Substitution.fromPairs(
@@ -618,7 +615,7 @@
if (interfaceTarget != null) {
ir.Class superclass = interfaceTarget.enclosingClass;
ir.Substitution receiverSubstitution = ir.Substitution.fromInterfaceType(
- getTypeAsInstanceOf(receiverType, superclass, currentLibrary));
+ getTypeAsInstanceOf(receiverType, superclass));
ir.DartType getterType =
receiverSubstitution.substituteType(interfaceTarget.getterType);
if (getterType is ir.FunctionType) {
diff --git a/pkg/compiler/lib/src/ir/visitors.dart b/pkg/compiler/lib/src/ir/visitors.dart
index c3afdfa..cd46b51 100644
--- a/pkg/compiler/lib/src/ir/visitors.dart
+++ b/pkg/compiler/lib/src/ir/visitors.dart
@@ -186,6 +186,8 @@
ConstantValuefier(this.elementMap);
+ DartTypes get _dartTypes => elementMap.commonElements.dartTypes;
+
@override
ConstantValue defaultConstant(ir.Constant node) {
throw new UnsupportedError(
@@ -199,7 +201,7 @@
@override
ConstantValue visitTypeLiteralConstant(ir.TypeLiteralConstant node) {
- DartType type = elementMap.getDartType(node.type);
+ DartType type = _dartTypes.eraseLegacy(elementMap.getDartType(node.type));
return constant_system.createType(elementMap.commonElements, type);
}
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 42fea65..ffa56a2 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -812,29 +812,21 @@
_commonElements.rtiBindMethod,
_commonElements.generalIsTestImplementation,
_commonElements.generalAsCheckImplementation,
- _commonElements.generalTypeCheckImplementation,
// Specialized checks.
_commonElements.specializedIsBool,
_commonElements.specializedAsBoolNullable,
- _commonElements.specializedCheckBoolNullable,
// no specializedIsDouble.
_commonElements.specializedAsDoubleNullable,
- _commonElements.specializedCheckDoubleNullable,
_commonElements.specializedIsInt,
_commonElements.specializedAsIntNullable,
- _commonElements.specializedCheckIntNullable,
_commonElements.specializedIsNum,
_commonElements.specializedAsNumNullable,
- _commonElements.specializedCheckNumNullable,
_commonElements.specializedIsString,
_commonElements.specializedAsStringNullable,
- _commonElements.specializedCheckStringNullable,
_commonElements.specializedIsTop,
_commonElements.specializedAsTop,
- // no specializedCheckTop
_commonElements.specializedIsObject,
_commonElements.specializedAsObject,
- _commonElements.specializedCheckObject,
], globalClasses: [
_commonElements.closureClass, // instanceOrFunctionType uses this.
])
diff --git a/pkg/compiler/lib/src/js_backend/specialized_checks.dart b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
index afb4661..9df9562 100644
--- a/pkg/compiler/lib/src/js_backend/specialized_checks.dart
+++ b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
@@ -85,24 +85,21 @@
}
static MemberEntity findAsCheck(
- DartType dartType, bool isTypeError, JCommonElements commonElements) {
+ DartType dartType, JCommonElements commonElements) {
if (dartType is InterfaceType) {
if (dartType.typeArguments.isNotEmpty) return null;
- return _findAsCheck(dartType.element, commonElements,
- isTypeError: isTypeError, isNullable: true);
+ return _findAsCheck(dartType.element, commonElements, isNullable: true);
}
return null;
}
static MemberEntity _findAsCheck(
ClassEntity element, JCommonElements commonElements,
- {bool isTypeError, bool isNullable}) {
+ {bool isNullable}) {
if (element == commonElements.jsStringClass ||
element == commonElements.stringClass) {
if (isNullable) {
- return isTypeError
- ? commonElements.specializedCheckStringNullable
- : commonElements.specializedAsStringNullable;
+ return commonElements.specializedAsStringNullable;
}
return null;
}
@@ -110,9 +107,7 @@
if (element == commonElements.jsBoolClass ||
element == commonElements.boolClass) {
if (isNullable) {
- return isTypeError
- ? commonElements.specializedCheckBoolNullable
- : commonElements.specializedAsBoolNullable;
+ return commonElements.specializedAsBoolNullable;
}
return null;
}
@@ -120,9 +115,7 @@
if (element == commonElements.jsDoubleClass ||
element == commonElements.doubleClass) {
if (isNullable) {
- return isTypeError
- ? commonElements.specializedCheckDoubleNullable
- : commonElements.specializedAsDoubleNullable;
+ return commonElements.specializedAsDoubleNullable;
}
return null;
}
@@ -130,9 +123,7 @@
if (element == commonElements.jsNumberClass ||
element == commonElements.numClass) {
if (isNullable) {
- return isTypeError
- ? commonElements.specializedCheckNumNullable
- : commonElements.specializedAsNumNullable;
+ return commonElements.specializedAsNumNullable;
}
return null;
}
@@ -143,9 +134,7 @@
element == commonElements.jsUInt31Class ||
element == commonElements.jsPositiveIntClass) {
if (isNullable) {
- return isTypeError
- ? commonElements.specializedCheckIntNullable
- : commonElements.specializedAsIntNullable;
+ return commonElements.specializedAsIntNullable;
}
return null;
}
diff --git a/pkg/compiler/lib/src/js_backend/type_reference.dart b/pkg/compiler/lib/src/js_backend/type_reference.dart
index ac15b8e..e6b39a4 100644
--- a/pkg/compiler/lib/src/js_backend/type_reference.dart
+++ b/pkg/compiler/lib/src/js_backend/type_reference.dart
@@ -744,7 +744,7 @@
if (arguments.isEmpty) return;
if (arguments.length == 1) {
// e.g. "List_of_int_Function"
- if (arguments.first is FunctionType) {
+ if (arguments.first.withoutNullability is FunctionType) {
_add('of');
}
// e.g. "List_int"
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 c0c4dff..b8767b2 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
@@ -1944,9 +1944,12 @@
globals.add(js.Property(
js.string(ARRAY_RTI_PROPERTY),
- js.js(r'typeof Symbol == "function" && typeof Symbol() == "symbol"'
- r' ? Symbol("$ti")'
- r' : "$ti"')));
+ _options.legacyJavaScript
+ ? js.js(
+ r'typeof Symbol == "function" && typeof Symbol() == "symbol"'
+ r' ? Symbol("$ti")'
+ r' : "$ti"')
+ : js.js(r'Symbol("$ti")')));
js.ObjectInitializer globalsObject = js.ObjectInitializer(globals);
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index 5e5fdd6..78e93d5 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -682,7 +682,9 @@
data.instantiationToBounds = data.thisType;
} else {
data.instantiationToBounds = getInterfaceType(ir.instantiateToBounds(
- coreTypes.legacyRawType(node), coreTypes.objectClass));
+ coreTypes.legacyRawType(node),
+ coreTypes.objectClass,
+ node.enclosingLibrary));
}
}
}
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index ce1b97f..b0c227b 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -302,7 +302,9 @@
data.instantiationToBounds = data.thisType;
} else {
data.instantiationToBounds = getInterfaceType(ir.instantiateToBounds(
- coreTypes.legacyRawType(node), coreTypes.objectClass));
+ coreTypes.legacyRawType(node),
+ coreTypes.objectClass,
+ node.enclosingLibrary));
}
}
}
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 7355060..aa2af76 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -264,6 +264,14 @@
/// `Object.runtimeType`.
bool laxRuntimeTypeToString = false;
+ /// Whether to restrict the generated JavaScript to features that work on the
+ /// oldest supported versions of JavaScript. This currently means IE11. If
+ /// `true`, the generated code runs on the legacy JavaScript platform. If
+ /// `false`, the code will fail on the legacy JavaScript platform.
+ bool legacyJavaScript = true; // default value.
+ bool _legacyJavaScript = false;
+ bool _noLegacyJavaScript = false;
+
/// What should the compiler do with parameter type assertions.
///
/// This is an internal configuration option derived from other flags.
@@ -446,6 +454,8 @@
..omitAsCasts = _hasOption(options, Flags.omitAsCasts)
..laxRuntimeTypeToString =
_hasOption(options, Flags.laxRuntimeTypeToString)
+ .._legacyJavaScript = _hasOption(options, Flags.legacyJavaScript)
+ .._noLegacyJavaScript = _hasOption(options, Flags.noLegacyJavaScript)
..testMode = _hasOption(options, Flags.testMode)
..trustJSInteropTypeAnnotations =
_hasOption(options, Flags.trustJSInteropTypeAnnotations)
@@ -493,6 +503,10 @@
equalMaps(languageExperiments, fe.defaultExperimentalFlags)) {
throw new ArgumentError("Missing required ${Flags.platformBinaries}");
}
+ if (_legacyJavaScript && _noLegacyJavaScript) {
+ throw ArgumentError("'${Flags.legacyJavaScript}' incompatible with "
+ "'${Flags.noLegacyJavaScript}'");
+ }
}
void deriveOptions() {
@@ -508,6 +522,9 @@
useNewRti = false;
}
+ if (_noLegacyJavaScript) legacyJavaScript = false;
+ if (_legacyJavaScript) legacyJavaScript = true;
+
if (optimizationLevel != null) {
if (optimizationLevel == 0) {
disableInlining = true;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index f3c8578..ffc588d 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -391,6 +391,8 @@
return options.useNullSafety;
case 'LEGACY':
return options.useLegacySubtyping;
+ case 'LEGACY_JAVASCRIPT':
+ return options.legacyJavaScript;
case 'PRINT_LEGACY_STARS':
return options.printLegacyStars;
default:
@@ -3104,14 +3106,14 @@
/// Set the runtime type information if necessary.
HInstruction _setListRuntimeTypeInfoIfNeeded(HInstruction object,
InterfaceType type, SourceInformation sourceInformation) {
+ // [type] could be `List<T>`, so ensure it is `JSArray<T>`.
+ InterfaceType arrayType = dartTypes.interfaceType(
+ _commonElements.jsArrayClass, type.typeArguments);
if (!_rtiNeed.classNeedsTypeArguments(type.element) ||
- dartTypes.treatAsRawType(type)) {
+ _equivalentToMissingRti(arrayType)) {
return object;
}
if (options.useNewRti) {
- // [type] could be `List<T>`, so ensure it is `JSArray<T>`.
- InterfaceType arrayType = dartTypes.interfaceType(
- _commonElements.jsArrayClass, type.typeArguments);
HInstruction rti =
_typeBuilder.analyzeTypeArgumentNewRti(arrayType, sourceElement);
@@ -4729,6 +4731,15 @@
push(rti);
}
+ bool _equivalentToMissingRti(InterfaceType type) {
+ assert(type.element == _commonElements.jsArrayClass);
+ if (dartTypes.useNullSafety) {
+ return dartTypes.isStrongTopType(type.typeArguments.single);
+ } else {
+ return dartTypes.treatAsRawType(type);
+ }
+ }
+
void _handleForeignJs(ir.StaticInvocation invocation) {
if (_unexpectedForeignArguments(invocation,
minPositional: 2, maxPositional: null, typeArgumentCount: 1)) {
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 6727238..b5848269 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -3535,9 +3535,7 @@
_registry.registerTypeUse(TypeUse.isCheck(node.checkedTypeExpression));
- FieldEntity field = node.isTypeError
- ? _commonElements.rtiCheckField
- : _commonElements.rtiAsField;
+ FieldEntity field = _commonElements.rtiAsField;
js.Name name = _namer.instanceFieldPropertyName(field);
push(js.js('#.#(#)', [first, name, second]).withSourceInformation(
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 5c12d0b..4f2dfa8 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -2133,8 +2133,8 @@
if (typeInput is HLoadType) {
TypeExpressionRecipe recipe = typeInput.typeExpression;
DartType dartType = recipe.type;
- MemberEntity specializedCheck = SpecializedChecks.findAsCheck(
- dartType, node.isTypeError, _closedWorld.commonElements);
+ MemberEntity specializedCheck =
+ SpecializedChecks.findAsCheck(dartType, _closedWorld.commonElements);
if (specializedCheck != null) {
AbstractValueWithPrecision checkedType =
_abstractValueDomain.createFromStaticType(dartType, nullable: true);
diff --git a/pkg/compiler/lib/src/tracer.dart b/pkg/compiler/lib/src/tracer.dart
index e42352b..66564af 100644
--- a/pkg/compiler/lib/src/tracer.dart
+++ b/pkg/compiler/lib/src/tracer.dart
@@ -17,8 +17,7 @@
: TRACE_FILTER_PATTERN_FOR_TEST;
const String TRACE_FILTER_PATTERN_FROM_ENVIRONMENT =
- // TODO(sigmund): remove `?? ''` once #40678 is backported.
- const String.fromEnvironment("DUMP_IR") ?? '';
+ String.fromEnvironment("DUMP_IR", defaultValue: "");
String TRACE_FILTER_PATTERN_FOR_TEST;
/// Dumps the intermediate representation after each phase in a format
diff --git a/pkg/compiler/lib/src/util/util.dart b/pkg/compiler/lib/src/util/util.dart
index 1174c10..a4e0f16 100644
--- a/pkg/compiler/lib/src/util/util.dart
+++ b/pkg/compiler/lib/src/util/util.dart
@@ -103,6 +103,18 @@
}
}
+bool identicalElements<E>(List<E> a, List<E> b) {
+ if (identical(a, b)) return true;
+ if (a == null || b == null) return false;
+ if (a.length != b.length) return false;
+ for (int index = 0; index < a.length; index++) {
+ if (!identical(a[index], b[index])) {
+ return false;
+ }
+ }
+ return true;
+}
+
bool equalElements<E>(List<E> a, List<E> b) {
if (identical(a, b)) return true;
if (a == null || b == null) return false;
diff --git a/pkg/dartdev/lib/src/commands/pub.dart b/pkg/dartdev/lib/src/commands/pub.dart
index acc8e39..1b24c65 100644
--- a/pkg/dartdev/lib/src/commands/pub.dart
+++ b/pkg/dartdev/lib/src/commands/pub.dart
@@ -15,6 +15,25 @@
final ArgParser argParser = ArgParser.allowAnything();
+ /// Override [printUsage] for invocations of 'dart help pub' which won't
+ /// execute [run] below. Without this, the 'dart help pub' reports the
+ /// command pub with no commands or flags.
+ @override
+ void printUsage() {
+ final command = sdk.pub;
+ final args = ['help'];
+
+ log.trace('$command ${args.first}');
+
+ // Call 'pub help'
+ // Process.runSync(..) is used since [printUsage] is not an async method,
+ // and we want to guarantee that the result (the help text for the console)
+ // is printed before command exits.
+ final result = Process.runSync(command, args);
+ stderr.write(result.stderr);
+ stdout.write(result.stdout);
+ }
+
@override
FutureOr<int> run() async {
final command = sdk.pub;
diff --git a/pkg/dartdev/test/commands/help_test.dart b/pkg/dartdev/test/commands/help_test.dart
new file mode 100644
index 0000000..cfc6e77
--- /dev/null
+++ b/pkg/dartdev/test/commands/help_test.dart
@@ -0,0 +1,58 @@
+// 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:args/command_runner.dart';
+import 'package:dartdev/dartdev.dart';
+import 'package:test/test.dart';
+
+import '../utils.dart';
+
+void main() {
+ group('help', help);
+}
+
+void help() {
+ TestProject p;
+
+ tearDown(() => p?.dispose());
+
+ /// Commands not tested by the following loop.
+ List<String> _commandsNotTested = <String>[
+ 'help', // `dart help help` is redundant
+ 'test' // TODO(jwren) not yet implemented, dartbug.com/41041
+ ];
+ DartdevRunner([]).commands.forEach((String commandKey, Command command) {
+ if (!_commandsNotTested.contains(commandKey)) {
+ test('(help $commandKey == $commandKey --help)', () {
+ p = project();
+ var result = p.runSync('help', [commandKey]);
+
+ var verbHelpResult = p.runSync(commandKey, ['--help']);
+ expect(result.stdout, contains(verbHelpResult.stdout));
+ expect(result.stderr, contains(verbHelpResult.stderr));
+ });
+ }
+ });
+
+ test('(help pub == pub help)', () {
+ p = project();
+ var result = p.runSync('help', ['pub']);
+
+ var pubHelpResult = p.runSync('pub', ['help']);
+ expect(result.stdout, contains(pubHelpResult.stdout));
+ expect(result.stderr, contains(pubHelpResult.stderr));
+ });
+
+ test('(--help flags also have -h abbr)', () {
+ DartdevRunner([]).commands.forEach((String commandKey, Command command) {
+ var helpOption = command.argParser.options['help'];
+ // Some commands (like pub which use
+ // "argParser = ArgParser.allowAnything()") may not have the help Option
+ // accessible with the API used above:
+ if (helpOption != null) {
+ expect(helpOption.abbr, 'h', reason: '');
+ }
+ });
+ });
+}
diff --git a/pkg/dartdev/test/test_all.dart b/pkg/dartdev/test/test_all.dart
index 552691c..4b9ccaa 100644
--- a/pkg/dartdev/test/test_all.dart
+++ b/pkg/dartdev/test/test_all.dart
@@ -8,6 +8,7 @@
import 'commands/create_test.dart' as create;
import 'commands/flag_test.dart' as flag;
import 'commands/format_test.dart' as format;
+import 'commands/help_test.dart' as help;
import 'commands/migrate_test.dart' as migrate;
import 'commands/pub_test.dart' as pub;
import 'commands/test_test.dart' as test;
@@ -16,11 +17,12 @@
import 'utils_test.dart' as utils;
main() {
- group('dartdev', () {
+ group('dart', () {
analyze.main();
create.main();
flag.main();
format.main();
+ help.main();
migrate.main();
pub.main();
test.main();
diff --git a/pkg/dds/.gitignore b/pkg/dds/.gitignore
new file mode 100644
index 0000000..e308da7
--- /dev/null
+++ b/pkg/dds/.gitignore
@@ -0,0 +1,5 @@
+# See https://dart.dev/guides/libraries/private-files
+.dart_tool/
+.packages
+build/
+pubspec.lock
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
new file mode 100644
index 0000000..1f3d60f
--- /dev/null
+++ b/pkg/dds/CHANGELOG.md
@@ -0,0 +1,3 @@
+# 0.1.0-dev
+
+- Initial release.
diff --git a/pkg/dds/LICENSE b/pkg/dds/LICENSE
new file mode 100644
index 0000000..18daf2b
--- /dev/null
+++ b/pkg/dds/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2020, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/dds/README.md b/pkg/dds/README.md
new file mode 100644
index 0000000..ab9067c
--- /dev/null
+++ b/pkg/dds/README.md
@@ -0,0 +1,10 @@
+_This package is a work in-progress and the API may not be stable. Stay tuned for updates._
+
+A package used to spawn the Dart Developer Service (DDS), which is used to communicate with a Dart VM Service instance and provide extended functionality to the core VM Service Protocol.
+
+# Functionality
+
+Existing VM Service clients can issue both HTTP and websocket requests to a running DDS instance as if it were an instance of the VM Service itself. If a request corresponds to an RPC defined in the [VM Service Protocol][service-protocol], DDS will forward the request and return the response from the VM Service. Requests corresponding to an RPC defined in the [DDS Protocol][dds-protocol] will be handled directly by the DDS instance.
+
+[dds-protocol]: dds_protocol.md
+[service-protocol]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md
diff --git a/pkg/dds/analysis_options.yaml b/pkg/dds/analysis_options.yaml
new file mode 100644
index 0000000..b5e3320
--- /dev/null
+++ b/pkg/dds/analysis_options.yaml
@@ -0,0 +1,6 @@
+include: package:pedantic/analysis_options.1.7.0.yaml
+
+linter:
+ rules:
+ - directives_ordering
+ - prefer_generic_function_type_aliases
diff --git a/pkg/dds/dds_protocol.md b/pkg/dds/dds_protocol.md
new file mode 100644
index 0000000..fb6fd82
--- /dev/null
+++ b/pkg/dds/dds_protocol.md
@@ -0,0 +1,56 @@
+# Dart Development Service Protocol 0.x
+
+This document describes _version 0.x_ of the Dart Development Service Protocol.
+This protocol is an extension of the Dart VM Service Protocol and implements it
+in it's entirety. For details on the VM Service Protocol, see the [Dart VM Service Protocol Specification][service-protocol].
+
+The Service Protocol uses [JSON-RPC 2.0][].
+
+[JSON-RPC 2.0]: http://www.jsonrpc.org/specification
+
+
+**Table of Contents**
+
+- [RPCs, Requests, and Responses](#rpcs-requests-and-responses)
+- [Events](#events)
+- [Types](#types)
+- [IDs and Names](#ids-and-names)
+- [Revision History](#revision-history)
+
+## RPCs, Requests, and Responses
+
+See the corresponding section in the VM Service protocol [here][service-protocol-rpcs-requests-and-responses].
+
+## Events
+
+See the corresponding section in the VM Service protocol [here][service-protocol-events].
+
+## Binary Events
+
+See the corresponding section in the VM Service protocol [here][service-protocol-binary-events].
+
+## Types
+
+See the corresponding section in the VM Service protocol [here][service-protocol-types].
+
+## IDs and Names
+
+See the corresponding section in the VM Service protocol [here][service-protocol-ids-and-names].
+
+## Public RPCs
+
+The DDS Protocol supports all [public RPCs defined in the VM Service protocol][service-protocol-public-rpcs].
+
+## Revision History
+
+version | comments
+------- | --------
+0.x | Initial revision
+
+[service-protocol]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md
+[service-protocol-rpcs-requests-and-responses]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#rpcs-requests-and-responses
+[service-protocol-events]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#events
+[service-protocol-binary-events]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#binary-events
+[service-protocol-types]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#types
+[service-protocol-ids-and-names]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#ids-and-names
+[service-protocol-public-rpcs]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#public-rpcs
\ No newline at end of file
diff --git a/pkg/dds/lib/dds.dart b/pkg/dds/lib/dds.dart
new file mode 100644
index 0000000..d2bb5ea
--- /dev/null
+++ b/pkg/dds/lib/dds.dart
@@ -0,0 +1,87 @@
+// 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.
+
+/// A library used to spawn the Dart Developer Service, used to communicate
+/// with a Dart VM Service instance.
+library dds;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:shelf/shelf.dart';
+import 'package:shelf/shelf_io.dart' as io;
+import 'package:shelf_proxy/shelf_proxy.dart';
+import 'package:shelf_web_socket/shelf_web_socket.dart';
+import 'package:web_socket_channel/web_socket_channel.dart';
+
+part 'src/dds_impl.dart';
+
+/// An intermediary between a Dart VM service and its clients that offers
+/// additional functionality on top of the standard VM service protocol.
+///
+/// See the [Dart Development Service Protocol](https://github.com/dart-lang/sdk/blob/master/pkg/dds/dds_protocol.md)
+/// for details.
+abstract class DartDevelopmentService {
+ /// Creates a [DartDevelopmentService] instance which will communicate with a
+ /// VM service.
+ ///
+ /// [remoteVmServiceUri] is the address of the VM service that this
+ /// development service will communicate with.
+ ///
+ /// If provided, [serviceUri] will determine the address and port of the
+ /// spawned Dart Development Service.
+ static Future<DartDevelopmentService> startDartDevelopmentService(
+ Uri remoteVmServiceUri, {
+ Uri serviceUri,
+ }) async {
+ if (remoteVmServiceUri == null) {
+ throw ArgumentError.notNull('remoteVmServiceUri');
+ }
+ if (remoteVmServiceUri.scheme != 'http') {
+ throw ArgumentError(
+ 'remoteVmServiceUri must have an HTTP scheme. Actual: ${remoteVmServiceUri.scheme}',
+ );
+ }
+ if (serviceUri != null && serviceUri.scheme != 'http') {
+ throw ArgumentError(
+ 'serviceUri must have an HTTP scheme. Actual: ${serviceUri.scheme}',
+ );
+ }
+
+ final service = _DartDevelopmentService(remoteVmServiceUri, serviceUri);
+ await service.startService();
+ return service;
+ }
+
+ DartDevelopmentService._();
+
+ /// Stop accepting requests after gracefully handling existing requests.
+ Future<void> shutdown();
+
+ /// The HTTP [Uri] of the remote VM service instance that this service will
+ /// forward requests to.
+ Uri get remoteVmServiceUri;
+
+ /// The web socket [Uri] of the remote VM service instance that this service
+ /// will forward requests to.
+ ///
+ /// Can be used with [WebSocket] to communicate directly with the VM service.
+ Uri get remoteVmServiceWsUri;
+
+ /// The [Uri] VM service clients can use to communicate with this
+ /// [DartDevelopmentService] via HTTP.
+ ///
+ /// Returns `null` if the service is not running.
+ Uri get uri;
+
+ /// The [Uri] VM service clients can use to communicate with this
+ /// [DartDevelopmentService] via a [WebSocket].
+ ///
+ /// Returns `null` if the service is not running.
+ Uri get wsUri;
+
+ /// Set to `true` if this instance of [DartDevelopmentService] is accepting
+ /// requests.
+ bool get isRunning;
+}
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart
new file mode 100644
index 0000000..37f019a
--- /dev/null
+++ b/pkg/dds/lib/src/dds_impl.dart
@@ -0,0 +1,85 @@
+// 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.
+
+part of dds;
+
+class _DartDevelopmentService implements DartDevelopmentService {
+ _DartDevelopmentService(this._remoteVmServiceUri, this._uri);
+
+ Future<void> startService() async {
+ // Establish the connection to the VM service.
+ _vmServiceSocket = await WebSocket.connect(remoteVmServiceWsUri.toString());
+ _vmServiceStream = _vmServiceSocket.asBroadcastStream();
+ // Once we have a connection to the VM service, we're ready to spawn the intermediary.
+ await _startDDSServer();
+ }
+
+ Future<void> _startDDSServer() async {
+ // No provided address, bind to an available port on localhost.
+ // TODO(bkonyi): handle case where there's no IPv4 loopback.
+ final host = uri?.host ?? InternetAddress.loopbackIPv4.host;
+ final port = uri?.port ?? 0;
+
+ // Start the DDS server.
+ _server = await io.serve(_handlers().handler, host, port);
+ _uri = Uri(scheme: 'http', host: host, port: _server.port);
+ }
+
+ /// Stop accepting requests after gracefully handling existing requests.
+ Future<void> shutdown() async {
+ await _server.close();
+ await _vmServiceSocket.close();
+ }
+
+ // Attempt to upgrade HTTP requests to a websocket before processing them as
+ // standard HTTP requests. The websocket handler will fail quickly if the
+ // request doesn't appear to be a websocket upgrade request.
+ Cascade _handlers() => Cascade().add(_webSocketHandler()).add(_httpHandler());
+
+ Handler _webSocketHandler() => webSocketHandler((WebSocketChannel ws) {
+ // TODO(bkonyi): actually process requests instead of blindly forwarding them.
+ _vmServiceStream.listen(
+ (event) => ws.sink.add(event),
+ onDone: () => ws.sink.close(),
+ );
+ ws.stream.listen((event) => _vmServiceSocket.add(event));
+ });
+
+ Handler _httpHandler() {
+ // TODO(bkonyi): actually process requests instead of blindly forwarding them.
+ final cascade = Cascade().add(proxyHandler(remoteVmServiceUri));
+ return cascade.handler;
+ }
+
+ Uri _toWebSocket(Uri uri) {
+ if (uri == null) {
+ return null;
+ }
+ final pathSegments = <String>[];
+ if (uri.pathSegments.isNotEmpty) {
+ pathSegments.addAll(uri.pathSegments.where(
+ // Strip out the empty string that appears at the end of path segments.
+ // Empty string elements will result in an extra '/' being added to the
+ // URI.
+ (s) => s.isNotEmpty,
+ ));
+ }
+ pathSegments.add('ws');
+ return uri.replace(scheme: 'ws', pathSegments: pathSegments);
+ }
+
+ Uri get remoteVmServiceUri => _remoteVmServiceUri;
+ Uri get remoteVmServiceWsUri => _toWebSocket(_remoteVmServiceUri);
+ Uri _remoteVmServiceUri;
+
+ Uri get uri => _uri;
+ Uri get wsUri => _toWebSocket(_uri);
+ Uri _uri;
+
+ bool get isRunning => _uri != null;
+
+ WebSocket _vmServiceSocket;
+ Stream _vmServiceStream;
+ HttpServer _server;
+}
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
new file mode 100644
index 0000000..8734df5
--- /dev/null
+++ b/pkg/dds/pubspec.yaml
@@ -0,0 +1,23 @@
+name: dds
+description: >-
+ A library used to spawn the Dart Developer Service, used to communicate with
+ a Dart VM Service instance.
+
+version: 0.1.0-dev
+
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
+
+environment:
+ sdk: '>=2.6.0 <3.0.0'
+
+dependencies:
+ json_rpc_2: ^2.1.0
+ shelf: ^0.7.5
+ shelf_proxy: ^0.1.0+7
+ shelf_web_socket: ^0.2.3
+ web_socket_channel: ^1.1.0
+
+dev_dependencies:
+ pedantic: ^1.7.0
+ test: ^1.0.0
+ vm_service: ^4.0.0
diff --git a/pkg/dds/test/smoke.dart b/pkg/dds/test/smoke.dart
new file mode 100644
index 0000000..f4c4774
--- /dev/null
+++ b/pkg/dds/test/smoke.dart
@@ -0,0 +1,3 @@
+void main() {
+ print('Hello world!');
+}
diff --git a/pkg/dds/test/smoke_test.dart b/pkg/dds/test/smoke_test.dart
new file mode 100644
index 0000000..cc266fc
--- /dev/null
+++ b/pkg/dds/test/smoke_test.dart
@@ -0,0 +1,90 @@
+// 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 'dart:convert';
+import 'dart:io';
+
+import 'package:dds/dds.dart';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service_io.dart';
+
+Uri remoteVmServiceUri;
+
+Future<Process> spawnDartProcess(String script) async {
+ final executable = Platform.executable;
+ final tmpDir = await Directory.systemTemp.createTemp('dart_service');
+ final serviceInfoUri = tmpDir.uri.resolve('service_info.json');
+ final serviceInfoFile = await File.fromUri(serviceInfoUri).create();
+
+ final arguments = [
+ '--observe=0',
+ '--pause-isolates-on-start',
+ '--write-service-info=$serviceInfoUri',
+ script,
+ ];
+ final process = await Process.start(executable, arguments);
+ while ((await serviceInfoFile.length()) <= 5) {
+ await Future.delayed(const Duration(milliseconds: 50));
+ }
+ final content = await serviceInfoFile.readAsString();
+ final infoJson = json.decode(content);
+ remoteVmServiceUri = Uri.parse(infoJson['uri']);
+ return process;
+}
+
+void main() {
+ test('DDS Smoke Test', () async {
+ final process = await spawnDartProcess('smoke.dart');
+ final dds = await DartDevelopmentService.startDartDevelopmentService(
+ remoteVmServiceUri,
+ );
+ expect(dds.isRunning, true);
+
+ // Ensure basic websocket requests are forwarded correctly to the VM service.
+ final service = await vmServiceConnectUri(dds.wsUri.toString());
+ final version = await service.getVersion();
+ expect(version.major > 0, true);
+ expect(version.minor > 0, true);
+
+ // Ensure we can still make requests of the VM service via HTTP.
+ HttpClient client = HttpClient();
+ final request = await client.getUrl(remoteVmServiceUri.replace(
+ pathSegments: [
+ remoteVmServiceUri.pathSegments.first,
+ 'getVersion',
+ ],
+ ));
+ final response = await request.close();
+ final Map<String, dynamic> jsonResponse =
+ (await response.transform(utf8.decoder).transform(json.decoder).single);
+ expect(jsonResponse['result']['type'], 'Version');
+ expect(jsonResponse['result']['major'] > 0, true);
+ expect(jsonResponse['result']['minor'] > 0, true);
+ await dds.shutdown();
+ process.kill();
+ });
+
+ test('Invalid args test', () async {
+ // null VM Service URI
+ expect(
+ () async =>
+ await DartDevelopmentService.startDartDevelopmentService(null),
+ throwsA(TypeMatcher<ArgumentError>()));
+
+ // Non-HTTP VM Service URI scheme
+ expect(
+ () async => await DartDevelopmentService.startDartDevelopmentService(
+ Uri.parse('dart-lang://localhost:1234'),
+ ),
+ throwsA(TypeMatcher<ArgumentError>()));
+
+ // Non-HTTP VM Service URI scheme
+ expect(
+ () async => await DartDevelopmentService.startDartDevelopmentService(
+ Uri.parse('http://localhost:1234'),
+ serviceUri: Uri.parse('dart-lang://localhost:2345'),
+ ),
+ throwsA(TypeMatcher<ArgumentError>()));
+ });
+}
diff --git a/pkg/dev_compiler/lib/src/compiler/module_builder.dart b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
index 41c74b3..842287d 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_builder.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:args/args.dart' show ArgParser, ArgResults;
+import 'package:dev_compiler/src/compiler/shared_compiler.dart';
import 'package:path/path.dart' as p;
import '../js_ast/js_ast.dart';
@@ -71,6 +72,7 @@
Program transformModuleFormat(ModuleFormat format, Program module) {
switch (format) {
case ModuleFormat.ddc:
+ // Legacy format always generates output compatible with single file mode.
return DdcModuleBuilder().build(module);
case ModuleFormat.common:
return CommonJSModuleBuilder().build(module);
@@ -185,12 +187,13 @@
js.fun("function(#) { 'use strict'; #; }", [parameters, statements]),
true);
- var moduleDef = js.statement('dart_library.library(#, #, #, #)', [
+ var moduleDef = js.statement('dart_library.library(#, #, #, #, #)', [
js.string(module.name, "'"),
LiteralNull(),
js.commentExpression(
'Imports', ArrayInitializer(importNames, multiline: true)),
- resultModule
+ resultModule,
+ SharedCompiler.metricsLocationID
]);
return Program(<ModuleItem>[moduleDef]);
}
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index b0f5da7..542552a 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -594,13 +594,17 @@
@protected
js_ast.LiteralString propertyName(String name) => js.string(name, "'");
- /// Unique identifier indicating the location to inline the source map.
+ /// Unique identifiers indicating the locations to inline the corresponding
+ /// information.
///
/// We cannot generate the source map before the script it is for is
/// generated so we have generate the script including this identifier in the
- /// JS AST, and then replace it once the source map is generated.
+ /// JS AST, and then replace it once the source map is generated. Similarly,
+ /// metrics include the size of the source map.
static const String sourceMapLocationID =
'SourceMap3G5a8h6JVhHfdGuDxZr1EF9GQC8y0e6u';
+ static const String metricsLocationID =
+ 'MetricsJ7xFWBfSv6ZjrW9yLb21GNzisZr3anSf5h';
}
/// Whether a variable with [name] is referenced in the [node].
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 04b3e86..fd7c675 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -415,7 +415,8 @@
jsUrl: p.toUri(output).toString(),
mapUrl: p.toUri(output + '.map').toString(),
customScheme: multiRootScheme,
- multiRootOutputPath: multiRootOutputPath);
+ multiRootOutputPath: multiRootOutputPath,
+ component: compiledLibraries);
outFiles.add(file.writeAsString(jsCode.code));
if (jsCode.sourceMap != null) {
@@ -514,7 +515,8 @@
jsUrl: p.toUri(output).toString(),
mapUrl: p.toUri(output + '.map').toString(),
customScheme: multiRootScheme,
- multiRootOutputPath: multiRootOutputPath);
+ multiRootOutputPath: multiRootOutputPath,
+ component: component);
outFiles.add(file.writeAsString(jsCode.code));
if (jsCode.sourceMap != null) {
@@ -525,6 +527,33 @@
return CompilerResult(0);
}
+// Compute code size to embed in the generated JavaScript
+// for this module. Return `null` to indicate when size could not be properly
+// computed for this module.
+int _computeDartSize(Component component) {
+ var dartSize = 0;
+ var uriToSource = component.uriToSource;
+ for (var lib in component.libraries) {
+ var libUri = lib.fileUri;
+ var importUri = lib.importUri;
+ var source = uriToSource[libUri];
+ if (source == null) return null;
+ dartSize += source.source.length;
+ for (var part in lib.parts) {
+ var partUri = part.partUri;
+ if (partUri.startsWith(importUri.scheme)) {
+ // Convert to a relative-to-library uri in order to compute a file uri.
+ partUri = p.relative(partUri, from: p.dirname('${lib.importUri}'));
+ }
+ var fileUri = libUri.resolve(partUri);
+ var partSource = uriToSource[fileUri];
+ if (partSource == null) return null;
+ dartSize += partSource.source.length;
+ }
+ }
+ return dartSize;
+}
+
/// The output of compiling a JavaScript module in a particular format.
/// This was copied from module_compiler.dart class "JSModuleCode".
class JSCode {
@@ -554,7 +583,8 @@
String mapUrl,
String sourceMapBase,
String customScheme,
- String multiRootOutputPath}) {
+ String multiRootOutputPath,
+ Component component}) {
var opts = js_ast.JavaScriptPrintingOptions(
allowKeywordsInProperties: true, allowSingleLineIfStatements: true);
js_ast.SimpleJavaScriptPrintingContext printer;
@@ -585,11 +615,28 @@
}
var text = printer.getText();
- var rawSourceMap = inlineSourceMap
- ? js.escapedString(json.encode(builtMap), "'").value
- : 'null';
+ var encodedMap = json.encode(builtMap);
+ var rawSourceMap =
+ inlineSourceMap ? js.escapedString(encodedMap, "'").value : 'null';
text = text.replaceFirst(SharedCompiler.sourceMapLocationID, rawSourceMap);
+ // This is intended to be used by our build/debug tools to gather metrics.
+ // See pkg/dev_compiler/lib/js/legacy/dart_library.js for runtime code that
+ // reads this.
+ //
+ // These keys (see corresponding logic in dart_library.js) include:
+ // - dartSize: <size of Dart input code in bytes>
+ // - sourceMapSize: <size of JS source map in bytes>
+ //
+ // TODO(vsm): Ideally, this information is never sent to the browser. I.e.,
+ // our runtime metrics gathering would obtain this information from the
+ // compilation server, not the browser. We don't yet have the infra for that.
+ var compileTimeStatistics = {
+ 'dartSize': component != null ? _computeDartSize(component) : null,
+ 'sourceMapSize': encodedMap.length
+ };
+ text = text.replaceFirst(
+ SharedCompiler.metricsLocationID, '$compileTimeStatistics');
return JSCode(text, builtMap);
}
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 7317c59..99d4bc6 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -1055,13 +1055,7 @@
body.add(js.statement('''
#.as = function as_FutureOr(o) {
if (#.is(o) || #.is(o)) return o;
- return #.as(o, this, false);
- }
- ''', [className, typeT, futureOfT, runtimeModule]));
- body.add(js.statement('''
- #._check = function check_FutureOr(o) {
- if (#.is(o) || #.is(o)) return o;
- return #.as(o, this, true);
+ return #.as(o, this);
}
''', [className, typeT, futureOfT, runtimeModule]));
return null;
@@ -1079,13 +1073,7 @@
body.add(js.statement('''
#.as = function as_FutureOr(o) {
if (o == null || #.is(o) || #.is(o)) return o;
- #.castError(o, this, false);
- }
- ''', [className, typeT, futureOfT, runtimeModule]));
- body.add(js.statement('''
- #._check = function check_FutureOr(o) {
- if (o == null || #.is(o) || #.is(o)) return o;
- #.castError(o, this, true);
+ #.castError(o, this);
}
''', [className, typeT, futureOfT, runtimeModule]));
return null;
@@ -2296,8 +2284,6 @@
switch (name) {
// Reserved for the compiler to do `x as T`.
case 'as':
- // Reserved for the compiler to do implicit cast `T x = y`.
- case '_check':
// Reserved for the SDK to compute `Type.toString()`.
case 'name':
// Reserved by JS, not a valid static member name.
@@ -5258,8 +5244,7 @@
from.withNullability(Nullability.nonNullable) == to &&
_mustBeNonNullable(to)) {
// If the underlying type is the same, we only need a null check.
- return runtimeCall('nullCast(#, #, #)',
- [jsFrom, _emitType(to), js.boolean(isTypeError)]);
+ return runtimeCall('nullCast(#, #)', [jsFrom, _emitType(to)]);
}
// All Dart number types map to a JS double. We can specialize these
@@ -5278,8 +5263,7 @@
if (from.nullability == Nullability.nonNullable) {
return jsFrom;
}
- return runtimeCall('nullCast(#, #, #)',
- [jsFrom, _emitType(to), js.boolean(isTypeError)]);
+ return runtimeCall('nullCast(#, #)', [jsFrom, _emitType(to)]);
}
// * -> int : asInt check
@@ -5294,16 +5278,11 @@
}
}
- return _emitCast(jsFrom, to, implicit: isTypeError);
+ return _emitCast(jsFrom, to);
}
- js_ast.Expression _emitCast(js_ast.Expression expr, DartType type,
- {bool implicit = true}) {
- if (_types.isTop(type)) return expr;
-
- var code = implicit ? '#._check(#)' : '#.as(#)';
- return js.call(code, [_emitType(type), expr]);
- }
+ js_ast.Expression _emitCast(js_ast.Expression expr, DartType type) =>
+ _types.isTop(type) ? expr : js.call('#.as(#)', [_emitType(type), expr]);
@override
js_ast.Expression visitSymbolLiteral(SymbolLiteral node) =>
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index 683a872..67f259f 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -507,7 +507,7 @@
}
return c.toString();
}
- return e.toString();
+ return e.leakingDebugToString();
})
// Filter out our own NotNull annotations. The library prefix changes
// per test, so just filter on the suffix.
diff --git a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
index 1a63f96..93731df 100644
--- a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
@@ -1,19 +1,8 @@
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|2689|17|17|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|3629|5|11|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|3657|5|6|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '&': int.& (int Function(int)), JSNumber.& (num Function(num)).
ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '<<': int.<< (int Function(int)), JSNumber.<< (num Function(num)).
ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '>>': int.>> (int Function(int)), JSNumber.>> (num Function(num)).
ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '\|': int.\| (int Function(int)), JSNumber.\| (num Function(num)).
ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '^': int.^ (int Function(int)), JSNumber.^ (num Function(num)).
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1004|10|5|Non-nullable instance field 'value' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1030|8|6|Non-nullable instance field 'secure' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1036|8|8|Non-nullable instance field 'httpOnly' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1493|12|11|Non-nullable instance field 'idleTimeout' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1543|8|14|Non-nullable instance field 'autoUncompress' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|172|8|12|Non-nullable instance field 'autoCompress' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|991|10|4|Non-nullable instance field 'name' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/io/io.dart|5589|12|8|Non-nullable instance field 'encoding' must be initialized.
ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1654|28|1|The operator '&' isn't defined for the type 'JSInt'.
ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1656|27|1|The operator '&' isn't defined for the type 'JSInt'.
ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1659|17|1|The operator '&' isn't defined for the type 'JSInt'.
diff --git a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
index 6dad26d..8b13789 100644
--- a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
@@ -1,25 +1 @@
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|109|3|2|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|162|8|21|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|167|8|21|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|170|8|20|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|173|8|18|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|176|8|22|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|182|8|26|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|185|8|17|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|188|8|14|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|191|8|20|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|197|8|32|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|203|8|32|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|209|8|40|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|215|8|40|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|221|8|37|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|224|8|11|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|228|6|11|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1004|10|5|Non-nullable instance field 'value' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1030|8|6|Non-nullable instance field 'secure' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1036|8|8|Non-nullable instance field 'httpOnly' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1493|12|11|Non-nullable instance field 'idleTimeout' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1543|8|14|Non-nullable instance field 'autoUncompress' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|172|8|12|Non-nullable instance field 'autoCompress' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|991|10|4|Non-nullable instance field 'name' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/io/io.dart|5589|12|8|Non-nullable instance field 'encoding' must be initialized.
+
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index 3708675..dda7022 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -116,7 +116,8 @@
jsUrl: jsPath,
mapUrl: mapPath,
buildSourceMap: true,
- customScheme: customScheme);
+ customScheme: customScheme,
+ component: component);
await File(jsPath).writeAsString(jsCode.code);
await File(mapPath).writeAsString(json.encode(jsCode.sourceMap));
}
diff --git a/pkg/front_end/lib/src/base/instrumentation.dart b/pkg/front_end/lib/src/base/instrumentation.dart
index 7846749..a1e2443 100644
--- a/pkg/front_end/lib/src/base/instrumentation.dart
+++ b/pkg/front_end/lib/src/base/instrumentation.dart
@@ -52,7 +52,8 @@
InstrumentationValueForType(this.type);
@override
- String toString() => _shortenInstrumentationString(type.toString());
+ String toString() =>
+ _shortenInstrumentationString(type.leakingDebugToString());
}
/// Instance of [InstrumentationValue] describing a list of [DartType]s.
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 263bfc1..f591155 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -21,6 +21,7 @@
Member,
MethodInvocation,
Name,
+ NeverType,
Nullability,
Procedure,
ProcedureKind,
@@ -55,8 +56,6 @@
import 'package:kernel/type_environment.dart'
show SubtypeCheckMode, TypeEnvironment;
-import '../../base/nnbd_mode.dart';
-
import '../dill/dill_member_builder.dart' show DillMemberBuilder;
import '../fasta_codes.dart';
@@ -110,10 +109,10 @@
///
/// Currently this also holds the synthesized super class for a mixin
/// declaration.
- TypeBuilder supertype;
+ TypeBuilder supertypeBuilder;
/// The type in the `implements` clause of a class or mixin declaration.
- List<TypeBuilder> interfaces;
+ List<TypeBuilder> interfaceBuilders;
/// The types in the `on` clause of an extension or mixin declaration.
List<TypeBuilder> onTypes;
@@ -138,9 +137,9 @@
bool get isAnonymousMixinApplication;
- TypeBuilder get mixedInType;
+ TypeBuilder get mixedInTypeBuilder;
- void set mixedInType(TypeBuilder mixin);
+ void set mixedInTypeBuilder(TypeBuilder mixin);
List<ConstructorReferenceBuilder> get constructorReferences;
@@ -307,10 +306,10 @@
List<TypeVariableBuilder> typeVariables;
@override
- TypeBuilder supertype;
+ TypeBuilder supertypeBuilder;
@override
- List<TypeBuilder> interfaces;
+ List<TypeBuilder> interfaceBuilders;
@override
List<TypeBuilder> onTypes;
@@ -344,8 +343,8 @@
int modifiers,
String name,
this.typeVariables,
- this.supertype,
- this.interfaces,
+ this.supertypeBuilder,
+ this.interfaceBuilders,
this.onTypes,
Scope scope,
this.constructors,
@@ -363,7 +362,7 @@
bool get isMixin => (modifiers & mixinDeclarationMask) != 0;
@override
- bool get isMixinApplication => mixedInType != null;
+ bool get isMixinApplication => mixedInTypeBuilder != null;
@override
bool get isNamedMixinApplication {
@@ -675,7 +674,7 @@
// Extract and check superclass (if it exists).
ClassBuilder superClass;
- TypeBuilder superClassType = supertype;
+ TypeBuilder superClassType = supertypeBuilder;
if (superClassType is NamedTypeBuilder) {
TypeDeclarationBuilder decl = superClassType.declaration;
if (decl is TypeAliasBuilder) {
@@ -695,13 +694,13 @@
superClass = decl;
}
}
- if (interfaces == null) return;
+ if (interfaceBuilders == null) return;
// Validate interfaces.
Map<ClassBuilder, int> problems;
Map<ClassBuilder, int> problemsOffsets;
Set<ClassBuilder> implemented = new Set<ClassBuilder>();
- for (TypeBuilder type in interfaces) {
+ for (TypeBuilder type in interfaceBuilders) {
if (type is NamedTypeBuilder) {
int charOffset = -1; // TODO(ahe): Get offset from type.
TypeDeclarationBuilder typeDeclaration = type.declaration;
@@ -753,88 +752,72 @@
void checkBoundsInSupertype(
Supertype supertype, TypeEnvironment typeEnvironment) {
SourceLibraryBuilder library = this.library;
+ final DartType bottomType = library.isNonNullableByDefault
+ ? const NeverType(Nullability.nonNullable)
+ : typeEnvironment.nullType;
- Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssues(
+ Set<TypeArgumentIssue> issues = {};
+ issues.addAll(findTypeArgumentIssues(
new InterfaceType(supertype.classNode, library.nonNullable,
supertype.typeArguments),
typeEnvironment,
SubtypeCheckMode.ignoringNullabilities,
- allowSuperBounded: false)
- ?.toSet();
- Set<TypeArgumentIssue> nnbdIssues = library.isNonNullableByDefault
- ? findTypeArgumentIssues(
- new InterfaceType(supertype.classNode, library.nonNullable,
- supertype.typeArguments),
- typeEnvironment,
- SubtypeCheckMode.withNullabilities,
- allowSuperBounded: false)
- ?.toSet()
- : null;
- if (legacyIssues != null || nnbdIssues != null) {
- Set<TypeArgumentIssue> mergedIssues = legacyIssues ?? {};
- if (nnbdIssues != null) {
- nnbdIssues = nnbdIssues
- .where((issue) =>
- legacyIssues == null || !legacyIssues.contains(issue))
- .toSet();
- mergedIssues.addAll(nnbdIssues);
- }
- for (TypeArgumentIssue issue in mergedIssues) {
- DartType argument = issue.argument;
- TypeParameter typeParameter = issue.typeParameter;
- bool inferred = library.inferredTypes.contains(argument);
- if (argument is FunctionType && argument.typeParameters.length > 0) {
- if (inferred) {
- library.reportTypeArgumentIssue(
- templateGenericFunctionTypeInferredAsActualTypeArgument
- .withArguments(argument, library.isNonNullableByDefault),
- fileUri,
- charOffset,
- null);
- } else {
- library.reportTypeArgumentIssue(
- messageGenericFunctionTypeUsedAsActualTypeArgument,
- fileUri,
- charOffset,
- null);
- }
+ bottomType,
+ allowSuperBounded: false) ??
+ const []);
+ if (library.isNonNullableByDefault) {
+ issues.addAll(findTypeArgumentIssues(
+ new InterfaceType(supertype.classNode, library.nonNullable,
+ supertype.typeArguments),
+ typeEnvironment,
+ SubtypeCheckMode.withNullabilities,
+ bottomType,
+ allowSuperBounded: false) ??
+ const []);
+ }
+ for (TypeArgumentIssue issue in issues) {
+ DartType argument = issue.argument;
+ TypeParameter typeParameter = issue.typeParameter;
+ bool inferred = library.inferredTypes.contains(argument);
+ if (argument is FunctionType && argument.typeParameters.length > 0) {
+ if (inferred) {
+ library.reportTypeArgumentIssue(
+ templateGenericFunctionTypeInferredAsActualTypeArgument
+ .withArguments(argument, library.isNonNullableByDefault),
+ fileUri,
+ charOffset,
+ null);
} else {
- void reportProblem(
- Template<
- Message Function(DartType, DartType, String, String,
- String, String, bool)>
- template) {
- library.reportTypeArgumentIssue(
- template.withArguments(
- argument,
- typeParameter.bound,
- typeParameter.name,
- getGenericTypeName(issue.enclosingType),
- supertype.classNode.name,
- name,
- library.isNonNullableByDefault),
- fileUri,
- charOffset,
- typeParameter);
- }
+ library.reportTypeArgumentIssue(
+ messageGenericFunctionTypeUsedAsActualTypeArgument,
+ fileUri,
+ charOffset,
+ null);
+ }
+ } else {
+ void reportProblem(
+ Template<
+ Message Function(DartType, DartType, String, String, String,
+ String, bool)>
+ template) {
+ library.reportTypeArgumentIssue(
+ template.withArguments(
+ argument,
+ typeParameter.bound,
+ typeParameter.name,
+ getGenericTypeName(issue.enclosingType),
+ supertype.classNode.name,
+ name,
+ library.isNonNullableByDefault),
+ fileUri,
+ charOffset,
+ typeParameter);
+ }
- nnbdIssues ??= const {};
- if (inferred) {
- if (nnbdIssues.contains(issue) &&
- library.loader.nnbdMode == NnbdMode.Weak) {
- reportProblem(
- templateIncorrectTypeArgumentInSupertypeInferredWarning);
- } else {
- reportProblem(templateIncorrectTypeArgumentInSupertypeInferred);
- }
- } else {
- if (nnbdIssues.contains(issue) &&
- library.loader.nnbdMode == NnbdMode.Weak) {
- reportProblem(templateIncorrectTypeArgumentInSupertypeWarning);
- } else {
- reportProblem(templateIncorrectTypeArgumentInSupertype);
- }
- }
+ if (inferred) {
+ reportProblem(templateIncorrectTypeArgumentInSupertypeInferred);
+ } else {
+ reportProblem(templateIncorrectTypeArgumentInSupertype);
}
}
}
@@ -843,74 +826,52 @@
@override
void checkTypesInOutline(TypeEnvironment typeEnvironment) {
SourceLibraryBuilder library = this.library;
+ final DartType bottomType = library.isNonNullableByDefault
+ ? const NeverType(Nullability.nonNullable)
+ : typeEnvironment.nullType;
// Check in bounds of own type variables.
for (TypeParameter parameter in cls.typeParameters) {
- Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssues(
- parameter.bound,
- typeEnvironment,
- SubtypeCheckMode.ignoringNullabilities,
- allowSuperBounded: true)
- ?.toSet();
- Set<TypeArgumentIssue> nnbdIssues = library.isNonNullableByDefault
- ? findTypeArgumentIssues(parameter.bound, typeEnvironment,
- SubtypeCheckMode.withNullabilities,
- allowSuperBounded: true)
- ?.toSet()
- : null;
- if (legacyIssues != null || nnbdIssues != null) {
- Set<TypeArgumentIssue> mergedIssues = legacyIssues ?? {};
- if (nnbdIssues != null) {
- nnbdIssues = nnbdIssues
- .where((issue) =>
- legacyIssues == null || !legacyIssues.contains(issue))
- .toSet();
- mergedIssues.addAll(nnbdIssues);
+ Set<TypeArgumentIssue> issues = {};
+ issues.addAll(findTypeArgumentIssues(parameter.bound, typeEnvironment,
+ SubtypeCheckMode.ignoringNullabilities, bottomType,
+ allowSuperBounded: true) ??
+ const []);
+ if (library.isNonNullableByDefault) {
+ issues.addAll(findTypeArgumentIssues(parameter.bound, typeEnvironment,
+ SubtypeCheckMode.withNullabilities, bottomType,
+ allowSuperBounded: true) ??
+ const []);
+ }
+ for (TypeArgumentIssue issue in issues) {
+ DartType argument = issue.argument;
+ TypeParameter typeParameter = issue.typeParameter;
+ if (library.inferredTypes.contains(argument)) {
+ // Inference in type expressions in the supertypes boils down to
+ // instantiate-to-bound which shouldn't produce anything that breaks
+ // the bounds after the non-simplicity checks are done. So, any
+ // violation here is the result of non-simple bounds, and the error
+ // is reported elsewhere.
+ continue;
}
- for (TypeArgumentIssue issue in mergedIssues) {
- DartType argument = issue.argument;
- TypeParameter typeParameter = issue.typeParameter;
- if (library.inferredTypes.contains(argument)) {
- // Inference in type expressions in the supertypes boils down to
- // instantiate-to-bound which shouldn't produce anything that breaks
- // the bounds after the non-simplicity checks are done. So, any
- // violation here is the result of non-simple bounds, and the error
- // is reported elsewhere.
- continue;
- }
- if (argument is FunctionType && argument.typeParameters.length > 0) {
- library.reportTypeArgumentIssue(
- messageGenericFunctionTypeUsedAsActualTypeArgument,
- fileUri,
- parameter.fileOffset,
- null);
- } else {
- void reportProblem(
- Template<
- Message Function(
- DartType, DartType, String, String, bool)>
- template) {
- library.reportTypeArgumentIssue(
- template.withArguments(
- argument,
- typeParameter.bound,
- typeParameter.name,
- getGenericTypeName(issue.enclosingType),
- library.isNonNullableByDefault),
- fileUri,
- parameter.fileOffset,
- typeParameter);
- }
-
- nnbdIssues ??= const {};
- if (nnbdIssues.contains(issue) &&
- library.loader.nnbdMode == NnbdMode.Weak) {
- reportProblem(templateIncorrectTypeArgumentWarning);
- } else {
- reportProblem(templateIncorrectTypeArgument);
- }
- }
+ if (argument is FunctionType && argument.typeParameters.length > 0) {
+ library.reportTypeArgumentIssue(
+ messageGenericFunctionTypeUsedAsActualTypeArgument,
+ fileUri,
+ parameter.fileOffset,
+ null);
+ } else {
+ library.reportTypeArgumentIssue(
+ templateIncorrectTypeArgument.withArguments(
+ argument,
+ typeParameter.bound,
+ typeParameter.name,
+ getGenericTypeName(issue.enclosingType),
+ library.isNonNullableByDefault),
+ fileUri,
+ parameter.fileOffset,
+ typeParameter);
}
}
}
@@ -1333,16 +1294,7 @@
(!isCovariant ||
!types.isSubtypeOfKernel(
supertype, subtype, SubtypeCheckMode.ignoringNullabilities));
- Loader loader = library.loader;
- bool nnbdWeakMode =
- loader is SourceLoader && loader.nnbdMode == NnbdMode.Weak;
- bool isError = isErrorInNnbdOptedOutMode || !nnbdWeakMode;
- bool isWarning = !isErrorInNnbdOptedOutMode && nnbdWeakMode;
- assert(
- !isError || !isWarning,
- "A compile-time problem can't be an error and a warning "
- "at the same time.");
- if (isError || isWarning) {
+ if (isErrorInNnbdOptedOutMode || library.isNonNullableByDefault) {
String declaredMemberName = '${declaredMember.enclosingClass.name}'
'.${declaredMember.name.name}';
String interfaceMemberName = '${interfaceMember.enclosingClass.name}'
@@ -1352,22 +1304,14 @@
if (declaredParameter == null) {
if (asIfDeclaredParameter) {
// Setter overridden by field
- Template<Message Function(String, DartType, DartType, String, bool)>
- template = isError
- ? templateOverrideTypeMismatchSetter
- : templateOverrideTypeMismatchSetterWarning;
- message = template.withArguments(
+ message = templateOverrideTypeMismatchSetter.withArguments(
declaredMemberName,
declaredType,
interfaceType,
interfaceMemberName,
library.isNonNullableByDefault);
} else {
- Template<Message Function(String, DartType, DartType, String, bool)>
- template = isError
- ? templateOverrideTypeMismatchReturnType
- : templateOverrideTypeMismatchReturnTypeWarning;
- message = template.withArguments(
+ message = templateOverrideTypeMismatchReturnType.withArguments(
declaredMemberName,
declaredType,
interfaceType,
@@ -1376,13 +1320,7 @@
}
fileOffset = declaredMember.fileOffset;
} else {
- Template<
- Message Function(
- String, String, DartType, DartType, String, bool)>
- template = isError
- ? templateOverrideTypeMismatchParameter
- : templateOverrideTypeMismatchParameterWarning;
- message = template.withArguments(
+ message = templateOverrideTypeMismatchParameter.withArguments(
declaredParameter.name,
declaredMemberName,
declaredType,
@@ -1568,6 +1506,26 @@
declaredParameter.isCovariant,
declaredParameter,
isInterfaceCheck);
+ if (declaredParameter.isRequired &&
+ !interfaceNamedParameters.current.isRequired) {
+ reportInvalidOverride(
+ isInterfaceCheck,
+ declaredMember,
+ templateOverrideMismatchRequiredNamedParameter.withArguments(
+ declaredParameter.name,
+ "${declaredMember.enclosingClass.name}."
+ "${declaredMember.name.name}",
+ "${interfaceMember.enclosingClass.name}."
+ "${interfaceMember.name.name}"),
+ declaredParameter.fileOffset,
+ noLength,
+ context: [
+ templateOverriddenMethodCause
+ .withArguments(interfaceMember.name.name)
+ .withLocation(_getMemberUri(interfaceMember),
+ interfaceMember.fileOffset, noLength)
+ ]);
+ }
if (declaredParameter.isCovariant) seenCovariant = true;
}
return seenCovariant;
@@ -1679,7 +1637,8 @@
@override
String get fullNameForErrors {
return isMixinApplication && !isNamedMixinApplication
- ? "${supertype.fullNameForErrors} with ${mixedInType.fullNameForErrors}"
+ ? "${supertypeBuilder.fullNameForErrors} with "
+ "${mixedInTypeBuilder.fullNameForErrors}"
: name;
}
@@ -1832,23 +1791,13 @@
} else if (library.isNonNullableByDefault && loader is SourceLoader) {
if (!typeEnvironment.isSubtypeOf(typeArgument, typeParameterBound,
SubtypeCheckMode.withNullabilities)) {
- if (loader.nnbdMode == NnbdMode.Weak) {
- addProblem(
- templateRedirectingFactoryIncompatibleTypeArgumentWarning
- .withArguments(typeArgument, typeParameterBound,
- library.isNonNullableByDefault),
- redirectionTarget.charOffset,
- noLength);
- hasProblem = false;
- } else {
- addProblem(
- templateRedirectingFactoryIncompatibleTypeArgument
- .withArguments(typeArgument, typeParameterBound,
- library.isNonNullableByDefault),
- redirectionTarget.charOffset,
- noLength);
- hasProblem = true;
- }
+ addProblem(
+ templateRedirectingFactoryIncompatibleTypeArgument
+ .withArguments(typeArgument, typeParameterBound,
+ library.isNonNullableByDefault),
+ redirectionTarget.charOffset,
+ noLength);
+ hasProblem = true;
}
}
}
@@ -1915,19 +1864,11 @@
} else if (library.isNonNullableByDefault && loader is SourceLoader) {
if (!typeEnvironment.isSubtypeOf(
redirecteeType, factoryType, SubtypeCheckMode.withNullabilities)) {
- if (loader.nnbdMode == NnbdMode.Weak) {
- addProblem(
- templateIncompatibleRedirecteeFunctionTypeWarning.withArguments(
- redirecteeType, factoryType, library.isNonNullableByDefault),
- factory.redirectionTarget.charOffset,
- noLength);
- } else {
- addProblem(
- templateIncompatibleRedirecteeFunctionType.withArguments(
- redirecteeType, factoryType, library.isNonNullableByDefault),
- factory.redirectionTarget.charOffset,
- noLength);
- }
+ addProblem(
+ templateIncompatibleRedirecteeFunctionType.withArguments(
+ redirecteeType, factoryType, library.isNonNullableByDefault),
+ factory.redirectionTarget.charOffset,
+ noLength);
}
}
}
@@ -2042,7 +1983,7 @@
ClassBuilder getSuperclass(ClassBuilder builder) {
// This way of computing the superclass is slower than using the kernel
// objects directly.
- Object supertype = builder.supertype;
+ Object supertype = builder.supertypeBuilder;
if (supertype is NamedTypeBuilder) {
Object builder = supertype.declaration;
if (builder is ClassBuilder) return builder;
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index ae18cd7..bc32b18d 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -334,7 +334,7 @@
return enumBuilder;
}
- TypeBuilder get mixedInType => null;
+ TypeBuilder get mixedInTypeBuilder => null;
InterfaceType buildType(LibraryBuilder library,
NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 7211b30..9a69677 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -49,8 +49,6 @@
Token get constInitializerToken;
- bool hadTypesInferred;
-
bool get isCovariant;
bool get isLate;
@@ -645,20 +643,6 @@
@override
bool get isFunction => false;
-
- TypeBuilder get type => memberBuilder.type;
-
- bool get hadTypesInferred => memberBuilder.hadTypesInferred;
-
- void set hadTypesInferred(bool value) {
- memberBuilder.hadTypesInferred = value;
- }
-
- DartType get fieldType => memberBuilder.fieldType;
-
- void set fieldType(DartType value) {
- memberBuilder.fieldType = value;
- }
}
abstract class AbstractLateFieldEncoding implements FieldEncoding {
@@ -1221,19 +1205,6 @@
bool get isAbstract => _member.isAbstract;
@override
- bool get hasExplicitReturnType {
- // The return type of the getter is explicit if the field type is explicit.
- return fieldBuilder.type != null;
- }
-
- @override
- bool hasExplicitlyTypedFormalParameter(int index) {
- // The type of the setter parameter is explicit if the field type is
- // explicit.
- return fieldBuilder.type != null;
- }
-
- @override
bool get needsComputation => false;
@override
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index ece6278..9aed09d 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -11,8 +11,6 @@
import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute;
-import '../../base/nnbd_mode.dart';
-
import '../identifiers.dart';
import '../scope.dart';
@@ -28,8 +26,7 @@
messagePatchDeclarationOrigin,
messagePatchNonExternal,
noLength,
- templateRequiredNamedParameterHasDefaultValueError,
- templateRequiredNamedParameterHasDefaultValueWarning;
+ templateRequiredNamedParameterHasDefaultValueError;
import '../modifier.dart';
@@ -393,21 +390,12 @@
if (library.isNonNullableByDefault) {
// Required named parameters can't have default values.
if (formal.isNamedRequired && formal.initializerToken != null) {
- if (library.loader.nnbdMode == NnbdMode.Weak) {
- library.addProblem(
- templateRequiredNamedParameterHasDefaultValueWarning
- .withArguments(formal.name),
- formal.charOffset,
- formal.name.length,
- formal.fileUri);
- } else {
- library.addProblem(
- templateRequiredNamedParameterHasDefaultValueError
- .withArguments(formal.name),
- formal.charOffset,
- formal.name.length,
- formal.fileUri);
- }
+ library.addProblem(
+ templateRequiredNamedParameterHasDefaultValueError
+ .withArguments(formal.name),
+ formal.charOffset,
+ formal.name.length,
+ formal.fileUri);
}
}
}
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index 995d801..a9c325a 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -148,8 +148,8 @@
/// where they were omitted by the programmer and not provided by the type
/// inference. The method returns the number of distinct type variables
/// that were instantiated in this library.
- int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
- ClassBuilder objectClass);
+ int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
+ TypeBuilder bottomType, ClassBuilder objectClass);
void becomeCoreLibrary();
@@ -368,8 +368,8 @@
int computeVariances() => 0;
@override
- int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
- ClassBuilder objectClass) {
+ int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
+ TypeBuilder bottomType, ClassBuilder objectClass) {
return 0;
}
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index 6761a6d..edeb46b 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -243,17 +243,6 @@
bool get isAbstract => memberBuilder.member.isAbstract;
@override
- bool get hasExplicitReturnType {
- throw new UnsupportedError("${runtimeType}.hasExplicitReturnType");
- }
-
- @override
- bool hasExplicitlyTypedFormalParameter(int index) {
- throw new UnsupportedError(
- "${runtimeType}.hasExplicitlyTypedFormalParameter");
- }
-
- @override
bool get needsComputation => false;
@override
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index f2ad0cd..765aebb 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -565,23 +565,6 @@
List<ClassMember> get localSetters => isSetter
? <ClassMember>[new SourceProcedureMember(this)]
: const <ClassMember>[];
-
- static const int inferredTypesFromMethod = 3;
- static const int inferredTypesFromField = 3;
- static const int inferredTypesFromGetter = 1;
- static const int inferredTypesFromSetter = 2;
-
- /// Bit mask showing where types have been inferred from.
- ///
- /// The mask uses the values [inferredTypesFromMethod],
- /// [inferredTypesFromField], [inferredTypesFromGetter],
- /// [inferredTypesFromSetter].
- ///
- /// It is used to detect whether types have already been inferred and in
- /// getter type inference to favor types from getters over types from
- /// setters, and in setter type inference to favor types from setters over
- /// types from getters.
- int hadTypesInferredFrom = 0;
}
class SourceProcedureMember extends BuilderClassMember {
@@ -593,12 +576,6 @@
@override
bool get isSourceDeclaration => true;
- int get hadTypesInferredFrom => memberBuilder.hadTypesInferredFrom;
-
- void set hadTypesInferredFrom(int value) {
- memberBuilder.hadTypesInferredFrom = value;
- }
-
@override
void inferType(ClassHierarchyBuilder hierarchy) {
memberBuilder._ensureTypes(hierarchy);
@@ -625,20 +602,6 @@
@override
bool get isFunction => !isProperty;
-
- List<FormalParameterBuilder> get formals => memberBuilder.formals;
-
- TypeBuilder get returnType => memberBuilder.returnType;
-
- @override
- bool get hasExplicitReturnType {
- return memberBuilder.returnType != null;
- }
-
- @override
- bool hasExplicitlyTypedFormalParameter(int index) {
- return memberBuilder.formals[index].type != null;
- }
}
class RedirectingFactoryBuilder extends ProcedureBuilderImpl {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 23ca352..73003a2 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -57,12 +57,12 @@
Uri get fileUri => cls.fileUri;
- TypeBuilder get supertype {
- TypeBuilder supertype = super.supertype;
+ TypeBuilder get supertypeBuilder {
+ TypeBuilder supertype = super.supertypeBuilder;
if (supertype == null) {
Supertype targetSupertype = cls.supertype;
if (targetSupertype == null) return null;
- super.supertype =
+ super.supertypeBuilder =
supertype = computeTypeBuilder(library, targetSupertype);
}
return supertype;
@@ -119,30 +119,30 @@
@override
bool get declaresConstConstructor => cls.hasConstConstructor;
- TypeBuilder get mixedInType {
+ TypeBuilder get mixedInTypeBuilder {
return computeTypeBuilder(library, cls.mixedInType);
}
- List<TypeBuilder> get interfaces {
+ List<TypeBuilder> get interfaceBuilders {
if (cls.implementedTypes.isEmpty) return null;
- if (super.interfaces == null) {
+ if (super.interfaceBuilders == null) {
List<TypeBuilder> result =
new List<TypeBuilder>(cls.implementedTypes.length);
for (int i = 0; i < result.length; i++) {
result[i] = computeTypeBuilder(library, cls.implementedTypes[i]);
}
- super.interfaces = result;
+ super.interfaceBuilders = result;
}
- return super.interfaces;
+ return super.interfaceBuilders;
}
- void set mixedInType(TypeBuilder mixin) {
+ void set mixedInTypeBuilder(TypeBuilder mixin) {
unimplemented("mixedInType=", -1, null);
}
void clearCachedValues() {
- supertype = null;
- interfaces = null;
+ supertypeBuilder = null;
+ interfaceBuilders = null;
}
}
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index bd23030..8afca33 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -165,12 +165,6 @@
bool get isFunction => !isProperty;
@override
- bool get hasExplicitReturnType => true;
-
- @override
- bool hasExplicitlyTypedFormalParameter(int index) => true;
-
- @override
void inferType(ClassHierarchyBuilder hierarchy) {
// Do nothing; this is only for source members.
}
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
index 9e88644..b4d3941 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
@@ -13,6 +13,126 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
+ Message Function(
+ String name,
+ DartType _type,
+ bool
+ isNonNullableByDefault)> templateAmbiguousExtensionMethod = const Template<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>(
+ messageTemplate:
+ r"""The method '#name' is defined in multiple extensions for '#type' and neither is more specific.""",
+ tipTemplate:
+ r"""Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+ withArguments: _withArgumentsAmbiguousExtensionMethod);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+ Message Function(String name, DartType _type,
+ bool isNonNullableByDefault)> codeAmbiguousExtensionMethod = const Code<
+ Message Function(String name, DartType _type, bool isNonNullableByDefault)>(
+ "AmbiguousExtensionMethod",
+ templateAmbiguousExtensionMethod,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsAmbiguousExtensionMethod(
+ String name, DartType _type, bool isNonNullableByDefault) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+ List<Object> typeParts = labeler.labelType(_type);
+ String type = typeParts.join();
+ return new Message(codeAmbiguousExtensionMethod,
+ message:
+ """The method '${name}' is defined in multiple extensions for '${type}' and neither is more specific.""" +
+ labeler.originMessages,
+ tip: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+ arguments: {'name': name, 'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>
+ templateAmbiguousExtensionOperator = const Template<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>(
+ messageTemplate:
+ r"""The operator '#name' is defined in multiple extensions for '#type' and neither is more specific.""",
+ tipTemplate:
+ r"""Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+ withArguments: _withArgumentsAmbiguousExtensionOperator);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>
+ codeAmbiguousExtensionOperator = const Code<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>(
+ "AmbiguousExtensionOperator",
+ templateAmbiguousExtensionOperator,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsAmbiguousExtensionOperator(
+ String name, DartType _type, bool isNonNullableByDefault) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+ List<Object> typeParts = labeler.labelType(_type);
+ String type = typeParts.join();
+ return new Message(codeAmbiguousExtensionOperator,
+ message:
+ """The operator '${name}' is defined in multiple extensions for '${type}' and neither is more specific.""" +
+ labeler.originMessages,
+ tip: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+ arguments: {'name': name, 'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>
+ templateAmbiguousExtensionProperty = const Template<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>(
+ messageTemplate:
+ r"""The property '#name' is defined in multiple extensions for '#type' and neither is more specific.""",
+ tipTemplate:
+ r"""Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+ withArguments: _withArgumentsAmbiguousExtensionProperty);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>
+ codeAmbiguousExtensionProperty = const Code<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>(
+ "AmbiguousExtensionProperty",
+ templateAmbiguousExtensionProperty,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsAmbiguousExtensionProperty(
+ String name, DartType _type, bool isNonNullableByDefault) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+ List<Object> typeParts = labeler.labelType(_type);
+ String type = typeParts.join();
+ return new Message(codeAmbiguousExtensionProperty,
+ message:
+ """The property '${name}' is defined in multiple extensions for '${type}' and neither is more specific.""" +
+ labeler.originMessages,
+ tip: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+ arguments: {'name': name, 'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
Message Function(String name, DartType _type, DartType _type2,
bool isNonNullableByDefault)> templateAmbiguousSupertypes =
const Template<
@@ -771,44 +891,6 @@
const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>
- templateFieldNonNullableNotInitializedByConstructorWarning = const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""This constructor doesn't initialize field '#name' and its type '#type' doesn't allow null.""",
- withArguments:
- _withArgumentsFieldNonNullableNotInitializedByConstructorWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
- codeFieldNonNullableNotInitializedByConstructorWarning = const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- "FieldNonNullableNotInitializedByConstructorWarning",
- templateFieldNonNullableNotInitializedByConstructorWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFieldNonNullableNotInitializedByConstructorWarning(
- String name, DartType _type, bool isNonNullableByDefault) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- String type = typeParts.join();
- return new Message(codeFieldNonNullableNotInitializedByConstructorWarning,
- message:
- """This constructor doesn't initialize field '${name}' and its type '${type}' doesn't allow null.""" +
- labeler.originMessages,
- arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
templateFieldNonNullableWithoutInitializerError = const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>(
@@ -845,43 +927,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
- templateFieldNonNullableWithoutInitializerWarning = const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Field '#name' isn't initialized and its type '#type' doesn't allow null.""",
- withArguments: _withArgumentsFieldNonNullableWithoutInitializerWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
- codeFieldNonNullableWithoutInitializerWarning = const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- "FieldNonNullableWithoutInitializerWarning",
- templateFieldNonNullableWithoutInitializerWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFieldNonNullableWithoutInitializerWarning(
- String name, DartType _type, bool isNonNullableByDefault) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- String type = typeParts.join();
- return new Message(codeFieldNonNullableWithoutInitializerWarning,
- message:
- """Field '${name}' isn't initialized and its type '${type}' doesn't allow null.""" +
- labeler.originMessages,
- arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
DartType _type, DartType _type2, bool isNonNullableByDefault)>
templateForInLoopElementTypeNotAssignable = const Template<
Message Function(
@@ -1046,6 +1091,38 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
+ Message Function(
+ DartType _type,
+ bool
+ isNonNullableByDefault)> templateImplicitReturnNull = const Template<
+ Message Function(DartType _type, bool isNonNullableByDefault)>(
+ messageTemplate:
+ r"""A non-null value must be returned since the return type '#type' doesn't allow null.""",
+ withArguments: _withArgumentsImplicitReturnNull);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
+ codeImplicitReturnNull =
+ const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
+ "ImplicitReturnNull",
+ templateImplicitReturnNull,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsImplicitReturnNull(
+ DartType _type, bool isNonNullableByDefault) {
+ TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+ List<Object> typeParts = labeler.labelType(_type);
+ String type = typeParts.join();
+ return new Message(codeImplicitReturnNull,
+ message:
+ """A non-null value must be returned since the return type '${type}' doesn't allow null.""" +
+ labeler.originMessages,
+ arguments: {'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
Message Function(
DartType _type, DartType _type2, bool isNonNullableByDefault)>
templateIncompatibleRedirecteeFunctionType = const Template<
@@ -1083,44 +1160,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>
- templateIncompatibleRedirecteeFunctionTypeWarning = const Template<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""The constructor function type '#type' isn't a subtype of '#type2'.""",
- withArguments: _withArgumentsIncompatibleRedirecteeFunctionTypeWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>
- codeIncompatibleRedirecteeFunctionTypeWarning = const Code<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>(
- "IncompatibleRedirecteeFunctionTypeWarning",
- templateIncompatibleRedirecteeFunctionTypeWarning,
- analyzerCodes: <String>["REDIRECT_TO_INVALID_TYPE"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncompatibleRedirecteeFunctionTypeWarning(
- DartType _type, DartType _type2, bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeIncompatibleRedirecteeFunctionTypeWarning,
- message:
- """The constructor function type '${type}' isn't a subtype of '${type2}'.""" +
- labeler.originMessages,
- arguments: {'type': _type, 'type2': _type2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
Message Function(DartType _type, DartType _type2, String name,
String name2, bool isNonNullableByDefault)>
templateIncorrectTypeArgument = const Template<
@@ -1218,56 +1257,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>
- templateIncorrectTypeArgumentInReturnTypeWarning = const Template<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type.""",
- tipTemplate:
- r"""Try changing type arguments so that they conform to the bounds.""",
- withArguments: _withArgumentsIncorrectTypeArgumentInReturnTypeWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>
- codeIncorrectTypeArgumentInReturnTypeWarning = const Code<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>(
- "IncorrectTypeArgumentInReturnTypeWarning",
- templateIncorrectTypeArgumentInReturnTypeWarning,
- analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInReturnTypeWarning(DartType _type,
- DartType _type2, String name, String name2, bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeIncorrectTypeArgumentInReturnTypeWarning,
- message:
- """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the return type.""" +
- labeler.originMessages,
- tip: """Try changing type arguments so that they conform to the bounds.""",
- arguments: {
- 'type': _type,
- 'type2': _type2,
- 'name': name,
- 'name2': name2
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
Message Function(
DartType _type,
DartType _type2,
@@ -1438,181 +1427,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
- Message Function(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault)>
- templateIncorrectTypeArgumentInSupertypeInferredWarning = const Template<
- Message Function(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
- tipTemplate:
- r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
- withArguments:
- _withArgumentsIncorrectTypeArgumentInSupertypeInferredWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault)>
- codeIncorrectTypeArgumentInSupertypeInferredWarning = const Code<
- Message Function(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault)>(
- "IncorrectTypeArgumentInSupertypeInferredWarning",
- templateIncorrectTypeArgumentInSupertypeInferredWarning,
- analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInSupertypeInferredWarning(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- if (name3.isEmpty) throw 'No name provided';
- name3 = demangleMixinApplicationName(name3);
- if (name4.isEmpty) throw 'No name provided';
- name4 = demangleMixinApplicationName(name4);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeIncorrectTypeArgumentInSupertypeInferredWarning,
- message:
- """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
- labeler.originMessages,
- tip:
- """Try specifying type arguments explicitly so that they conform to the bounds.""",
- arguments: {
- 'type': _type,
- 'type2': _type2,
- 'name': name,
- 'name2': name2,
- 'name3': name3,
- 'name4': name4
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault)>
- templateIncorrectTypeArgumentInSupertypeWarning = const Template<
- Message Function(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
- tipTemplate:
- r"""Try changing type arguments so that they conform to the bounds.""",
- withArguments: _withArgumentsIncorrectTypeArgumentInSupertypeWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault)>
- codeIncorrectTypeArgumentInSupertypeWarning = const Code<
- Message Function(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault)>(
- "IncorrectTypeArgumentInSupertypeWarning",
- templateIncorrectTypeArgumentInSupertypeWarning,
- analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInSupertypeWarning(
- DartType _type,
- DartType _type2,
- String name,
- String name2,
- String name3,
- String name4,
- bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- if (name3.isEmpty) throw 'No name provided';
- name3 = demangleMixinApplicationName(name3);
- if (name4.isEmpty) throw 'No name provided';
- name4 = demangleMixinApplicationName(name4);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeIncorrectTypeArgumentInSupertypeWarning,
- message:
- """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
- labeler.originMessages,
- tip:
- """Try changing type arguments so that they conform to the bounds.""",
- arguments: {
- 'type': _type,
- 'type2': _type2,
- 'name': name,
- 'name2': name2,
- 'name3': name3,
- 'name4': name4
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
Message Function(DartType _type, DartType _type2, String name,
String name2, bool isNonNullableByDefault)>
templateIncorrectTypeArgumentInferred = const Template<
@@ -1662,56 +1476,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>
- templateIncorrectTypeArgumentInferredWarning = const Template<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'.""",
- tipTemplate:
- r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
- withArguments: _withArgumentsIncorrectTypeArgumentInferredWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>
- codeIncorrectTypeArgumentInferredWarning = const Code<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>(
- "IncorrectTypeArgumentInferredWarning",
- templateIncorrectTypeArgumentInferredWarning,
- analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInferredWarning(DartType _type,
- DartType _type2, String name, String name2, bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeIncorrectTypeArgumentInferredWarning,
- message:
- """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}'.""" +
- labeler.originMessages,
- tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
- arguments: {
- 'type': _type,
- 'type2': _type2,
- 'name': name,
- 'name2': name2
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(DartType _type, DartType _type2, String name,
DartType _type3, String name2, bool isNonNullableByDefault)>
templateIncorrectTypeArgumentQualified = const Template<
Message Function(DartType _type, DartType _type2, String name,
@@ -1824,172 +1588,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
- Message Function(DartType _type, DartType _type2, String name,
- DartType _type3, String name2, bool isNonNullableByDefault)>
- templateIncorrectTypeArgumentQualifiedInferredWarning = const Template<
- Message Function(DartType _type, DartType _type2, String name,
- DartType _type3, String name2, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'.""",
- tipTemplate:
- r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
- withArguments:
- _withArgumentsIncorrectTypeArgumentQualifiedInferredWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(DartType _type, DartType _type2, String name,
- DartType _type3, String name2, bool isNonNullableByDefault)>
- codeIncorrectTypeArgumentQualifiedInferredWarning = const Code<
- Message Function(DartType _type, DartType _type2, String name,
- DartType _type3, String name2, bool isNonNullableByDefault)>(
- "IncorrectTypeArgumentQualifiedInferredWarning",
- templateIncorrectTypeArgumentQualifiedInferredWarning,
- analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentQualifiedInferredWarning(
- DartType _type,
- DartType _type2,
- String name,
- DartType _type3,
- String name2,
- bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- List<Object> type3Parts = labeler.labelType(_type3);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- String type3 = type3Parts.join();
- return new Message(codeIncorrectTypeArgumentQualifiedInferredWarning,
- message:
- """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}.${name2}'.""" +
- labeler.originMessages,
- tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
- arguments: {
- 'type': _type,
- 'type2': _type2,
- 'name': name,
- 'type3': _type3,
- 'name2': name2
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(DartType _type, DartType _type2, String name,
- DartType _type3, String name2, bool isNonNullableByDefault)>
- templateIncorrectTypeArgumentQualifiedWarning = const Template<
- Message Function(DartType _type, DartType _type2, String name,
- DartType _type3, String name2, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'.""",
- tipTemplate:
- r"""Try changing type arguments so that they conform to the bounds.""",
- withArguments: _withArgumentsIncorrectTypeArgumentQualifiedWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(DartType _type, DartType _type2, String name,
- DartType _type3, String name2, bool isNonNullableByDefault)>
- codeIncorrectTypeArgumentQualifiedWarning = const Code<
- Message Function(DartType _type, DartType _type2, String name,
- DartType _type3, String name2, bool isNonNullableByDefault)>(
- "IncorrectTypeArgumentQualifiedWarning",
- templateIncorrectTypeArgumentQualifiedWarning,
- analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentQualifiedWarning(
- DartType _type,
- DartType _type2,
- String name,
- DartType _type3,
- String name2,
- bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- List<Object> type3Parts = labeler.labelType(_type3);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- String type3 = type3Parts.join();
- return new Message(codeIncorrectTypeArgumentQualifiedWarning,
- message:
- """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}.${name2}'.""" +
- labeler.originMessages,
- tip: """Try changing type arguments so that they conform to the bounds.""",
- arguments: {
- 'type': _type,
- 'type2': _type2,
- 'name': name,
- 'type3': _type3,
- 'name2': name2
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>
- templateIncorrectTypeArgumentWarning = const Template<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'.""",
- tipTemplate:
- r"""Try changing type arguments so that they conform to the bounds.""",
- withArguments: _withArgumentsIncorrectTypeArgumentWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>
- codeIncorrectTypeArgumentWarning = const Code<
- Message Function(DartType _type, DartType _type2, String name,
- String name2, bool isNonNullableByDefault)>(
- "IncorrectTypeArgumentWarning", templateIncorrectTypeArgumentWarning,
- analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentWarning(DartType _type,
- DartType _type2, String name, String name2, bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeIncorrectTypeArgumentWarning,
- message:
- """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}'.""" +
- labeler.originMessages,
- tip: """Try changing type arguments so that they conform to the bounds.""",
- arguments: {
- 'type': _type,
- 'type2': _type2,
- 'name': name,
- 'name2': name2
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
Message Function(String name, DartType _type, DartType _type2,
bool isNonNullableByDefault)>
templateInitializingFormalTypeMismatch = const Template<
@@ -2103,42 +1701,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>
- templateInvalidAssignmentWarning = const Template<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Assigning value of type '#type' to a variable of type '#type2'.""",
- withArguments: _withArgumentsInvalidAssignmentWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>
- codeInvalidAssignmentWarning = const Code<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>(
- "InvalidAssignmentWarning", templateInvalidAssignmentWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsInvalidAssignmentWarning(
- DartType _type, DartType _type2, bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeInvalidAssignmentWarning,
- message:
- """Assigning value of type '${type}' to a variable of type '${type2}'.""" +
- labeler.originMessages,
- arguments: {'type': _type, 'type2': _type2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
Message Function(
DartType _type,
DartType _type2,
@@ -2624,36 +2186,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
- templateNullableExpressionCallWarning = const Template<
- Message Function(DartType _type, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Expression of type '#type' is used as a function, but it's potentially null.""",
- tipTemplate: r"""Try calling using ?.call instead.""",
- withArguments: _withArgumentsNullableExpressionCallWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
- codeNullableExpressionCallWarning =
- const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
- "NullableExpressionCallWarning", templateNullableExpressionCallWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableExpressionCallWarning(
- DartType _type, bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- String type = typeParts.join();
- return new Message(codeNullableExpressionCallWarning,
- message:
- """Expression of type '${type}' is used as a function, but it's potentially null.""" +
- labeler.originMessages,
- tip: """Try calling using ?.call instead.""",
- arguments: {'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>
@@ -2694,44 +2226,6 @@
const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>
- templateNullableMethodCallWarning = const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Method '#name' is called on '#type' which is potentially null.""",
- tipTemplate: r"""Try calling using ?. instead.""",
- withArguments: _withArgumentsNullableMethodCallWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
- codeNullableMethodCallWarning = const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- "NullableMethodCallWarning", templateNullableMethodCallWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableMethodCallWarning(
- String name, DartType _type, bool isNonNullableByDefault) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- String type = typeParts.join();
- return new Message(codeNullableMethodCallWarning,
- message:
- """Method '${name}' is called on '${type}' which is potentially null.""" +
- labeler.originMessages,
- tip: """Try calling using ?. instead.""",
- arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
templateNullableOperatorCallError = const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>(
@@ -2769,42 +2263,6 @@
const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>
- templateNullableOperatorCallWarning = const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Operator '#name' is called on '#type' which is potentially null.""",
- withArguments: _withArgumentsNullableOperatorCallWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
- codeNullableOperatorCallWarning = const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- "NullableOperatorCallWarning", templateNullableOperatorCallWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableOperatorCallWarning(
- String name, DartType _type, bool isNonNullableByDefault) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- String type = typeParts.join();
- return new Message(codeNullableOperatorCallWarning,
- message:
- """Operator '${name}' is called on '${type}' which is potentially null.""" +
- labeler.originMessages,
- arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
templateNullablePropertyAccessError = const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>(
@@ -2844,44 +2302,6 @@
const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>
- templateNullablePropertyAccessWarning = const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Property '#name' is accessed on '#type' which is potentially null.""",
- tipTemplate: r"""Try accessing using ?. instead.""",
- withArguments: _withArgumentsNullablePropertyAccessWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
- codeNullablePropertyAccessWarning = const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- "NullablePropertyAccessWarning", templateNullablePropertyAccessWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullablePropertyAccessWarning(
- String name, DartType _type, bool isNonNullableByDefault) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- String type = typeParts.join();
- return new Message(codeNullablePropertyAccessWarning,
- message:
- """Property '${name}' is accessed on '${type}' which is potentially null.""" +
- labeler.originMessages,
- tip: """Try accessing using ?. instead.""",
- arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
templateOptionalNonNullableWithoutInitializerError = const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>(
@@ -2918,44 +2338,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
- templateOptionalNonNullableWithoutInitializerWarning = const Template<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Optional parameter '#name' doesn't have a default value and its type '#type' doesn't allow null.""",
- withArguments:
- _withArgumentsOptionalNonNullableWithoutInitializerWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>
- codeOptionalNonNullableWithoutInitializerWarning = const Code<
- Message Function(
- String name, DartType _type, bool isNonNullableByDefault)>(
- "OptionalNonNullableWithoutInitializerWarning",
- templateOptionalNonNullableWithoutInitializerWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsOptionalNonNullableWithoutInitializerWarning(
- String name, DartType _type, bool isNonNullableByDefault) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- String type = typeParts.join();
- return new Message(codeOptionalNonNullableWithoutInitializerWarning,
- message:
- """Optional parameter '${name}' doesn't have a default value and its type '${type}' doesn't allow null.""" +
- labeler.originMessages,
- arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
Message Function(String name, String name2, DartType _type,
DartType _type2, String name3, bool isNonNullableByDefault)>
templateOverrideTypeMismatchParameter = const Template<
@@ -3012,64 +2394,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
- Message Function(String name, String name2, DartType _type,
- DartType _type2, String name3, bool isNonNullableByDefault)>
- templateOverrideTypeMismatchParameterWarning = const Template<
- Message Function(String name, String name2, DartType _type,
- DartType _type2, String name3, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""The parameter '#name' of the method '#name2' has type '#type', which does not match the corresponding type, '#type2', in the overridden method, '#name3'.""",
- tipTemplate:
- r"""Change to a supertype of '#type2', or, for a covariant parameter, a subtype.""",
- withArguments: _withArgumentsOverrideTypeMismatchParameterWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(String name, String name2, DartType _type,
- DartType _type2, String name3, bool isNonNullableByDefault)>
- codeOverrideTypeMismatchParameterWarning = const Code<
- Message Function(String name, String name2, DartType _type,
- DartType _type2, String name3, bool isNonNullableByDefault)>(
- "OverrideTypeMismatchParameterWarning",
- templateOverrideTypeMismatchParameterWarning,
- analyzerCodes: <String>["INVALID_METHOD_OVERRIDE"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsOverrideTypeMismatchParameterWarning(
- String name,
- String name2,
- DartType _type,
- DartType _type2,
- String name3,
- bool isNonNullableByDefault) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name3.isEmpty) throw 'No name provided';
- name3 = demangleMixinApplicationName(name3);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeOverrideTypeMismatchParameterWarning,
- message:
- """The parameter '${name}' of the method '${name2}' has type '${type}', which does not match the corresponding type, '${type2}', in the overridden method, '${name3}'.""" +
- labeler.originMessages,
- tip: """Change to a supertype of '${type2}', or, for a covariant parameter, a subtype.""",
- arguments: {
- 'name': name,
- 'name2': name2,
- 'type': _type,
- 'type2': _type2,
- 'name3': name3
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
Message Function(String name, DartType _type, DartType _type2,
String name2, bool isNonNullableByDefault)>
templateOverrideTypeMismatchReturnType = const Template<
@@ -3124,59 +2448,6 @@
const Template<
Message Function(String name, DartType _type, DartType _type2,
String name2, bool isNonNullableByDefault)>
- templateOverrideTypeMismatchReturnTypeWarning = const Template<
- Message Function(String name, DartType _type, DartType _type2,
- String name2, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""The return type of the method '#name' is '#type', which does not match the return type, '#type2', of the overridden method, '#name2'.""",
- tipTemplate: r"""Change to a subtype of '#type2'.""",
- withArguments: _withArgumentsOverrideTypeMismatchReturnTypeWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(String name, DartType _type, DartType _type2,
- String name2, bool isNonNullableByDefault)>
- codeOverrideTypeMismatchReturnTypeWarning = const Code<
- Message Function(String name, DartType _type, DartType _type2,
- String name2, bool isNonNullableByDefault)>(
- "OverrideTypeMismatchReturnTypeWarning",
- templateOverrideTypeMismatchReturnTypeWarning,
- analyzerCodes: <String>["INVALID_METHOD_OVERRIDE"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsOverrideTypeMismatchReturnTypeWarning(
- String name,
- DartType _type,
- DartType _type2,
- String name2,
- bool isNonNullableByDefault) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeOverrideTypeMismatchReturnTypeWarning,
- message:
- """The return type of the method '${name}' is '${type}', which does not match the return type, '${type2}', of the overridden method, '${name2}'.""" +
- labeler.originMessages,
- tip: """Change to a subtype of '${type2}'.""",
- arguments: {
- 'name': name,
- 'type': _type,
- 'type2': _type2,
- 'name2': name2
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(String name, DartType _type, DartType _type2,
- String name2, bool isNonNullableByDefault)>
templateOverrideTypeMismatchSetter = const Template<
Message Function(String name, DartType _type, DartType _type2,
String name2, bool isNonNullableByDefault)>(
@@ -3220,57 +2491,6 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
- Message Function(String name, DartType _type, DartType _type2,
- String name2, bool isNonNullableByDefault)>
- templateOverrideTypeMismatchSetterWarning = const Template<
- Message Function(String name, DartType _type, DartType _type2,
- String name2, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""The field '#name' has type '#type', which does not match the corresponding type, '#type2', in the overridden setter, '#name2'.""",
- withArguments: _withArgumentsOverrideTypeMismatchSetterWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(String name, DartType _type, DartType _type2,
- String name2, bool isNonNullableByDefault)>
- codeOverrideTypeMismatchSetterWarning = const Code<
- Message Function(String name, DartType _type, DartType _type2,
- String name2, bool isNonNullableByDefault)>(
- "OverrideTypeMismatchSetterWarning",
- templateOverrideTypeMismatchSetterWarning,
- analyzerCodes: <String>["INVALID_METHOD_OVERRIDE"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsOverrideTypeMismatchSetterWarning(
- String name,
- DartType _type,
- DartType _type2,
- String name2,
- bool isNonNullableByDefault) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- if (name2.isEmpty) throw 'No name provided';
- name2 = demangleMixinApplicationName(name2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeOverrideTypeMismatchSetterWarning,
- message:
- """The field '${name}' has type '${type}', which does not match the corresponding type, '${type2}', in the overridden setter, '${name2}'.""" +
- labeler.originMessages,
- arguments: {
- 'name': name,
- 'type': _type,
- 'type2': _type2,
- 'name2': name2
- });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
Message Function(DartType _type, String name, String name2,
DartType _type2, String name3, bool isNonNullableByDefault)>
templateOverrideTypeVariablesBoundMismatch = const Template<
@@ -3365,45 +2585,6 @@
const Template<
Message Function(
DartType _type, DartType _type2, bool isNonNullableByDefault)>
- templateRedirectingFactoryIncompatibleTypeArgumentWarning = const Template<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>(
- messageTemplate: r"""The type '#type' doesn't extend '#type2'.""",
- tipTemplate: r"""Try using a different type as argument.""",
- withArguments:
- _withArgumentsRedirectingFactoryIncompatibleTypeArgumentWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>
- codeRedirectingFactoryIncompatibleTypeArgumentWarning = const Code<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>(
- "RedirectingFactoryIncompatibleTypeArgumentWarning",
- templateRedirectingFactoryIncompatibleTypeArgumentWarning,
- analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsRedirectingFactoryIncompatibleTypeArgumentWarning(
- DartType _type, DartType _type2, bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- List<Object> type2Parts = labeler.labelType(_type2);
- String type = typeParts.join();
- String type2 = type2Parts.join();
- return new Message(codeRedirectingFactoryIncompatibleTypeArgumentWarning,
- message: """The type '${type}' doesn't extend '${type2}'.""" +
- labeler.originMessages,
- tip: """Try using a different type as argument.""",
- arguments: {'type': _type, 'type2': _type2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- DartType _type, DartType _type2, bool isNonNullableByDefault)>
templateSpreadElementTypeMismatch = const Template<
Message Function(
DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -3674,35 +2855,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
- templateThrowingNotAssignableToObjectWarning = const Template<
- Message Function(DartType _type, bool isNonNullableByDefault)>(
- messageTemplate:
- r"""Throwing a value of '#type' that is neither dynamic nor non-nullable.""",
- withArguments: _withArgumentsThrowingNotAssignableToObjectWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
- codeThrowingNotAssignableToObjectWarning =
- const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
- "ThrowingNotAssignableToObjectWarning",
- templateThrowingNotAssignableToObjectWarning,
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsThrowingNotAssignableToObjectWarning(
- DartType _type, bool isNonNullableByDefault) {
- TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
- List<Object> typeParts = labeler.labelType(_type);
- String type = typeParts.join();
- return new Message(codeThrowingNotAssignableToObjectWarning,
- message:
- """Throwing a value of '${type}' that is neither dynamic nor non-nullable.""" +
- labeler.originMessages,
- arguments: {'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String name,
@@ -3792,6 +2944,48 @@
String name,
DartType _type,
bool
+ isNonNullableByDefault)> templateUndefinedOperator = const Template<
+ Message Function(String name, DartType _type,
+ bool isNonNullableByDefault)>(
+ messageTemplate:
+ r"""The operator '#name' isn't defined for the class '#type'.""",
+ tipTemplate:
+ r"""Try correcting the operator to an existing operator, or defining a '#name' operator.""",
+ withArguments: _withArgumentsUndefinedOperator);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>
+ codeUndefinedOperator = const Code<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>(
+ "UndefinedOperator", templateUndefinedOperator,
+ analyzerCodes: <String>["UNDEFINED_METHOD"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsUndefinedOperator(
+ String name, DartType _type, bool isNonNullableByDefault) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+ List<Object> typeParts = labeler.labelType(_type);
+ String type = typeParts.join();
+ return new Message(codeUndefinedOperator,
+ message:
+ """The operator '${name}' isn't defined for the class '${type}'.""" +
+ labeler.originMessages,
+ tip:
+ """Try correcting the operator to an existing operator, or defining a '${name}' operator.""",
+ arguments: {'name': name, 'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String name,
+ DartType _type,
+ bool
isNonNullableByDefault)> templateUndefinedSetter = const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>(
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 074cc5b..e0a4b57 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -640,10 +640,10 @@
while (iterator.moveNext()) {
Builder childBuilder = iterator.current;
if (childBuilder is SourceClassBuilder) {
- TypeBuilder typeBuilder = childBuilder.supertype;
+ TypeBuilder typeBuilder = childBuilder.supertypeBuilder;
replaceTypeBuilder(
replacementMap, replacementSettersMap, typeBuilder);
- typeBuilder = childBuilder.mixedInType;
+ typeBuilder = childBuilder.mixedInTypeBuilder;
replaceTypeBuilder(
replacementMap, replacementSettersMap, typeBuilder);
if (childBuilder.onTypes != null) {
@@ -652,8 +652,8 @@
replacementMap, replacementSettersMap, typeBuilder);
}
}
- if (childBuilder.interfaces != null) {
- for (typeBuilder in childBuilder.interfaces) {
+ if (childBuilder.interfaceBuilders != null) {
+ for (typeBuilder in childBuilder.interfaceBuilders) {
replaceTypeBuilder(
replacementMap, replacementSettersMap, typeBuilder);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index ec3c6e9..580753b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -43,8 +43,6 @@
import 'package:kernel/ast.dart';
import 'package:kernel/type_environment.dart';
-import '../../base/nnbd_mode.dart';
-
import '../builder/builder.dart';
import '../builder/class_builder.dart';
import '../builder/constructor_builder.dart';
@@ -955,8 +953,8 @@
}
if (body != null) {
- body = typeInferrer?.inferFunctionBody(
- this, _computeReturnTypeContext(member), asyncModifier, body);
+ body = typeInferrer?.inferFunctionBody(this, member.charOffset,
+ _computeReturnTypeContext(member), asyncModifier, body);
libraryBuilder.loader.transformPostInference(body, transformSetLiterals,
transformCollections, libraryBuilder.library);
}
@@ -1290,6 +1288,7 @@
@override
Expression parseSingleExpression(
Parser parser, Token token, FunctionNode parameters) {
+ int fileOffset = offsetForToken(token);
List<TypeVariableBuilder> typeParameterBuilders;
for (TypeParameter typeParameter in parameters.typeParameters) {
typeParameterBuilders ??= <TypeVariableBuilder>[];
@@ -1311,7 +1310,7 @@
}
enterLocalScope(
null,
- new FormalParameters(formals, offsetForToken(token), noLength, uri)
+ new FormalParameters(formals, fileOffset, noLength, uri)
.computeFormalParameterScope(scope, member, this));
token = parser.parseExpression(parser.syntheticPreviousToken(token));
@@ -1329,7 +1328,7 @@
ReturnStatementImpl fakeReturn = new ReturnStatementImpl(true, expression);
typeInferrer?.inferFunctionBody(
- this, const DynamicType(), AsyncMarker.Sync, fakeReturn);
+ this, fileOffset, const DynamicType(), AsyncMarker.Sync, fakeReturn);
return fakeReturn.expression;
}
@@ -1402,7 +1401,7 @@
checkArgumentsForFunction(superTarget.function, arguments,
builder.charOffset, const <TypeParameter>[]) !=
null) {
- String superclass = classBuilder.supertype.fullNameForErrors;
+ String superclass = classBuilder.supertypeBuilder.fullNameForErrors;
int length = constructor.name.name.length;
if (length == 0) {
length = (constructor.parent as Class).name.length;
@@ -2820,7 +2819,8 @@
typeArgument = const InvalidType();
} else {
typeArgument = buildDartType(typeArguments.single);
- typeArgument = instantiateToBounds(typeArgument, coreTypes.objectClass);
+ typeArgument = instantiateToBounds(
+ typeArgument, coreTypes.objectClass, libraryBuilder.library);
}
} else {
typeArgument = implicitTypeArgument;
@@ -2843,7 +2843,8 @@
DartType typeArgument;
if (typeArguments != null) {
typeArgument = buildDartType(typeArguments.single);
- typeArgument = instantiateToBounds(typeArgument, coreTypes.objectClass);
+ typeArgument = instantiateToBounds(
+ typeArgument, coreTypes.objectClass, libraryBuilder.library);
} else {
typeArgument = implicitTypeArgument;
}
@@ -2978,8 +2979,10 @@
} else {
keyType = buildDartType(typeArguments[0]);
valueType = buildDartType(typeArguments[1]);
- keyType = instantiateToBounds(keyType, coreTypes.objectClass);
- valueType = instantiateToBounds(valueType, coreTypes.objectClass);
+ keyType = instantiateToBounds(
+ keyType, coreTypes.objectClass, libraryBuilder.library);
+ valueType = instantiateToBounds(
+ valueType, coreTypes.objectClass, libraryBuilder.library);
}
} else {
DartType implicitTypeArgument = this.implicitTypeArgument;
@@ -3924,17 +3927,9 @@
Set<String> argumentNames = new Set.from(named.map((a) => a.name));
for (VariableDeclaration parameter in function.namedParameters) {
if (parameter.isRequired && !argumentNames.contains(parameter.name)) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- addProblem(
- fasta.templateValueForRequiredParameterNotProvidedWarning
- .withArguments(parameter.name),
- arguments.fileOffset,
- fasta.noLength);
- } else {
- return fasta.templateValueForRequiredParameterNotProvidedError
- .withArguments(parameter.name)
- .withLocation(uri, arguments.fileOffset, fasta.noLength);
- }
+ return fasta.templateValueForRequiredParameterNotProvidedError
+ .withArguments(parameter.name)
+ .withLocation(uri, arguments.fileOffset, fasta.noLength);
}
}
}
@@ -3991,17 +3986,9 @@
Set<String> argumentNames = new Set.from(named.map((a) => a.name));
for (NamedType parameter in function.namedParameters) {
if (parameter.isRequired && !argumentNames.contains(parameter.name)) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- addProblem(
- fasta.templateValueForRequiredParameterNotProvidedWarning
- .withArguments(parameter.name),
- arguments.fileOffset,
- fasta.noLength);
- } else {
- return fasta.templateValueForRequiredParameterNotProvidedError
- .withArguments(parameter.name)
- .withLocation(uri, arguments.fileOffset, fasta.noLength);
- }
+ return fasta.templateValueForRequiredParameterNotProvidedError
+ .withArguments(parameter.name)
+ .withLocation(uri, arguments.fileOffset, fasta.noLength);
}
}
}
@@ -5369,7 +5356,7 @@
List<TypeBuilder> calculatedBounds = calculateBounds(
typeVariables,
libraryBuilder.loader.target.dynamicType,
- libraryBuilder.loader.target.bottomType,
+ libraryBuilder.loader.target.nullType,
libraryBuilder.loader.target.objectClassBuilder);
for (int i = 0; i < typeVariables.length; ++i) {
typeVariables[i].defaultType = calculatedBounds[i];
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 773fff0..a3df7ab 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -41,6 +41,7 @@
Message,
messageDeclaredMemberConflictsWithInheritedMember,
messageDeclaredMemberConflictsWithInheritedMemberCause,
+ messageDeclaredMemberConflictsWithInheritedMembersCause,
messageInheritedMembersConflict,
messageInheritedMembersConflictCause1,
messageInheritedMembersConflictCause2,
@@ -218,8 +219,6 @@
Uri get fileUri;
int get charOffset;
bool get isAbstract;
- bool get hasExplicitReturnType;
- bool hasExplicitlyTypedFormalParameter(int index);
bool get needsComputation;
bool get isSynthesized;
@@ -671,61 +670,68 @@
SourceProcedureBuilder declaredMember,
Iterable<ClassMember> overriddenMembers) {
assert(!declaredMember.isGetter && !declaredMember.isSetter);
- Procedure declaredProcedure = declaredMember.member;
- FunctionNode declaredFunction = declaredProcedure.function;
- List<TypeParameter> declaredTypeParameters =
- declaredFunction.typeParameters;
- List<VariableDeclaration> declaredPositional =
- declaredFunction.positionalParameters;
- List<VariableDeclaration> declaredNamed = declaredFunction.namedParameters;
if (declaredMember.classBuilder == classBuilder &&
(declaredMember.returnType == null ||
declaredMember.formals != null &&
declaredMember.formals
.any((parameter) => parameter.type == null))) {
- for (ClassMember overriddenMember
+ Procedure declaredProcedure = declaredMember.member;
+ FunctionNode declaredFunction = declaredProcedure.function;
+ List<TypeParameter> declaredTypeParameters =
+ declaredFunction.typeParameters;
+ List<VariableDeclaration> declaredPositional =
+ declaredFunction.positionalParameters;
+ List<VariableDeclaration> declaredNamed =
+ declaredFunction.namedParameters;
+ declaredNamed = declaredNamed.toList()..sort(compareNamedParameters);
+
+ DartType inferredReturnType;
+ Map<FormalParameterBuilder, DartType> inferredParameterTypes = {};
+
+ for (ClassMember classMember
in toSet(declaredMember.classBuilder, overriddenMembers)) {
- assert(useConsolidated || !overriddenMember.hasDeclarations);
- int hadTypesInferredFrom = declaredMember.hadTypesInferredFrom;
- Member bMember = overriddenMember.getMember(hierarchy);
- Substitution bSubstitution;
- if (classBuilder.cls != bMember.enclosingClass) {
+ assert(useConsolidated || !classMember.hasDeclarations);
+ Member overriddenMember = classMember.getMember(hierarchy);
+ Substitution classSubstitution;
+ if (classBuilder.cls != overriddenMember.enclosingClass) {
assert(
- substitutions.containsKey(bMember.enclosingClass),
+ substitutions.containsKey(overriddenMember.enclosingClass),
"No substitution found for '${classBuilder.fullNameForErrors}' "
- "as instance of '${bMember.enclosingClass.name}'. Substitutions "
- "available for: ${substitutions.keys}");
- bSubstitution = substitutions[bMember.enclosingClass];
+ "as instance of '${overriddenMember.enclosingClass.name}'. "
+ "Substitutions available for: ${substitutions.keys}");
+ classSubstitution = substitutions[overriddenMember.enclosingClass];
debug?.log("${classBuilder.fullNameForErrors} -> "
- "${bMember.enclosingClass.name} $bSubstitution");
+ "${overriddenMember.enclosingClass.name} $classSubstitution");
}
- if (bMember is! Procedure) {
+ if (overriddenMember is! Procedure) {
debug?.log("Giving up 1");
continue;
}
- Procedure bProcedure = bMember;
- FunctionNode bFunction = bProcedure.function;
+ Procedure overriddenProcedure = overriddenMember;
+ FunctionNode overriddenFunction = overriddenProcedure.function;
- List<TypeParameter> bTypeParameters = bFunction.typeParameters;
+ List<TypeParameter> overriddenTypeParameters =
+ overriddenFunction.typeParameters;
int typeParameterCount = declaredTypeParameters.length;
- if (typeParameterCount != bTypeParameters.length) {
+ if (typeParameterCount != overriddenTypeParameters.length) {
debug?.log("Giving up 2");
continue;
}
- Substitution substitution;
+ Substitution methodSubstitution;
if (typeParameterCount != 0) {
List<DartType> types = new List<DartType>(typeParameterCount);
for (int i = 0; i < typeParameterCount; i++) {
types[i] = new TypeParameterType.forAlphaRenaming(
- bTypeParameters[i], declaredTypeParameters[i]);
+ overriddenTypeParameters[i], declaredTypeParameters[i]);
}
- substitution = Substitution.fromPairs(bTypeParameters, types);
+ methodSubstitution =
+ Substitution.fromPairs(overriddenTypeParameters, types);
for (int i = 0; i < typeParameterCount; i++) {
- DartType aBound = declaredTypeParameters[i].bound;
- DartType bBound =
- substitution.substituteType(bTypeParameters[i].bound);
+ DartType declaredBound = declaredTypeParameters[i].bound;
+ DartType overriddenBound = methodSubstitution
+ .substituteType(overriddenTypeParameters[i].bound);
if (!hierarchy.types
- .isSameTypeKernel(aBound, bBound)
+ .isSameTypeKernel(declaredBound, overriddenBound)
.isSubtypeWhenUsingNullabilities()) {
debug?.log("Giving up 3");
continue;
@@ -733,126 +739,149 @@
}
}
- DartType bReturnType = bFunction.returnType;
- if (bSubstitution != null) {
- bReturnType = bSubstitution.substituteType(bReturnType);
+ DartType inheritedReturnType = overriddenFunction.returnType;
+ if (classSubstitution != null) {
+ inheritedReturnType =
+ classSubstitution.substituteType(inheritedReturnType);
}
- if (substitution != null) {
- bReturnType = substitution.substituteType(bReturnType);
+ if (methodSubstitution != null) {
+ inheritedReturnType =
+ methodSubstitution.substituteType(inheritedReturnType);
+ }
+ if (declaredMember.returnType == null &&
+ inferredReturnType is! InvalidType) {
+ inferredReturnType = mergeTypeInLibrary(
+ hierarchy, classBuilder, inferredReturnType, inheritedReturnType);
+ if (inferredReturnType == null) {
+ // A different type has already been inferred.
+ inferredReturnType = const InvalidType();
+ reportCantInferReturnType(
+ classBuilder, declaredMember, hierarchy, overriddenMembers);
+ }
}
if (declaredFunction.requiredParameterCount >
- bFunction.requiredParameterCount) {
+ overriddenFunction.requiredParameterCount) {
debug?.log("Giving up 4");
continue;
}
- List<VariableDeclaration> bPositional = bFunction.positionalParameters;
- if (declaredPositional.length < bPositional.length) {
+ List<VariableDeclaration> overriddenPositional =
+ overriddenFunction.positionalParameters;
+ if (declaredPositional.length < overriddenPositional.length) {
debug?.log("Giving up 5");
continue;
}
- if (declaredMember.classBuilder == classBuilder &&
- declaredMember.returnType == null) {
- inferReturnType(
- classBuilder,
- declaredMember,
- declaredMember.member.function,
- bReturnType,
- hadTypesInferredFrom,
- SourceProcedureBuilder.inferredTypesFromMethod,
- hierarchy);
- } else {
- debug?.log("Giving up 6");
- }
+ for (int i = 0; i < overriddenPositional.length; i++) {
+ FormalParameterBuilder declaredParameter = declaredMember.formals[i];
+ if (declaredParameter.type != null) continue;
- for (int i = 0; i < bPositional.length; i++) {
- VariableDeclaration bParameter = bPositional[i];
- if (declaredMember.classBuilder == classBuilder &&
- declaredMember.formals[i].type == null) {
- DartType bType = bParameter.type;
- if (bSubstitution != null) {
- bType = bSubstitution.substituteType(bType);
- }
- if (substitution != null) {
- bType = substitution.substituteType(bType);
- }
- if (hierarchy.coreTypes.objectClass.enclosingLibrary
- .isNonNullableByDefault &&
- !declaredMember.classBuilder.library.isNonNullableByDefault &&
- bProcedure == hierarchy.coreTypes.objectEquals) {
- // In legacy code we special case `Object.==` to infer `dynamic`
- // instead `Object!`.
- bType = const DynamicType();
- }
- inferParameterType(
- classBuilder,
- declaredMember,
- declaredMember.formals[i],
- bType,
- hadTypesInferredFrom,
- SourceProcedureBuilder.inferredTypesFromMethod,
- hierarchy);
- } else {
- debug?.log("Giving up 8");
+ VariableDeclaration overriddenParameter = overriddenPositional[i];
+ DartType inheritedParameterType = overriddenParameter.type;
+ if (classSubstitution != null) {
+ inheritedParameterType =
+ classSubstitution.substituteType(inheritedParameterType);
}
+ if (methodSubstitution != null) {
+ inheritedParameterType =
+ methodSubstitution.substituteType(inheritedParameterType);
+ }
+ if (hierarchy.coreTypes.objectClass.enclosingLibrary
+ .isNonNullableByDefault &&
+ !declaredMember.classBuilder.library.isNonNullableByDefault &&
+ overriddenProcedure == hierarchy.coreTypes.objectEquals) {
+ // In legacy code we special case `Object.==` to infer `dynamic`
+ // instead `Object!`.
+ inheritedParameterType = const DynamicType();
+ }
+ DartType inferredParameterType =
+ inferredParameterTypes[declaredParameter];
+ inferredParameterType = mergeTypeInLibrary(hierarchy, classBuilder,
+ inferredParameterType, inheritedParameterType);
+ if (inferredParameterType == null) {
+ // A different type has already been inferred.
+ inferredParameterType = const InvalidType();
+ reportCantInferParameterType(
+ classBuilder, declaredParameter, hierarchy, overriddenMembers);
+ }
+ inferredParameterTypes[declaredParameter] = inferredParameterType;
}
- List<VariableDeclaration> bNamed = bFunction.namedParameters;
+ List<VariableDeclaration> overriddenNamed =
+ overriddenFunction.namedParameters;
named:
- if (declaredNamed.isNotEmpty || bNamed.isNotEmpty) {
- if (declaredPositional.length != bPositional.length) {
+ if (declaredNamed.isNotEmpty || overriddenNamed.isNotEmpty) {
+ if (declaredPositional.length != overriddenPositional.length) {
debug?.log("Giving up 9");
break named;
}
if (declaredFunction.requiredParameterCount !=
- bFunction.requiredParameterCount) {
+ overriddenFunction.requiredParameterCount) {
debug?.log("Giving up 10");
break named;
}
- declaredNamed = declaredNamed.toList()..sort(compareNamedParameters);
- bNamed = bNamed.toList()..sort(compareNamedParameters);
- int aCount = 0;
- for (int bCount = 0; bCount < bNamed.length; bCount++) {
- String name = bNamed[bCount].name;
- for (; aCount < declaredNamed.length; aCount++) {
- if (declaredNamed[aCount].name == name) break;
+ overriddenNamed = overriddenNamed.toList()
+ ..sort(compareNamedParameters);
+ int declaredIndex = 0;
+ for (int overriddenIndex = 0;
+ overriddenIndex < overriddenNamed.length;
+ overriddenIndex++) {
+ String name = overriddenNamed[overriddenIndex].name;
+ for (; declaredIndex < declaredNamed.length; declaredIndex++) {
+ if (declaredNamed[declaredIndex].name == name) break;
}
- if (aCount == declaredNamed.length) {
+ if (declaredIndex == declaredNamed.length) {
debug?.log("Giving up 11");
break named;
}
- FormalParameterBuilder parameter;
+ FormalParameterBuilder declaredParameter;
for (int i = declaredPositional.length;
i < declaredMember.formals.length;
++i) {
if (declaredMember.formals[i].name == name) {
- parameter = declaredMember.formals[i];
+ declaredParameter = declaredMember.formals[i];
break;
}
}
- VariableDeclaration bParameter = bNamed[bCount];
+ if (declaredParameter.type != null) continue;
+ VariableDeclaration overriddenParameter =
+ overriddenNamed[overriddenIndex];
- if (declaredMember.classBuilder == classBuilder &&
- parameter.type == null) {
- DartType bType = bParameter.type;
- if (bSubstitution != null) {
- bType = bSubstitution.substituteType(bType);
- }
- if (substitution != null) {
- bType = substitution.substituteType(bType);
- }
- inferParameterType(
- classBuilder,
- declaredMember,
- parameter,
- bType,
- hadTypesInferredFrom,
- SourceProcedureBuilder.inferredTypesFromMethod,
- hierarchy);
- } else {
- debug?.log("Giving up 12");
+ DartType inheritedParameterType = overriddenParameter.type;
+ if (classSubstitution != null) {
+ inheritedParameterType =
+ classSubstitution.substituteType(inheritedParameterType);
}
+ if (methodSubstitution != null) {
+ inheritedParameterType =
+ methodSubstitution.substituteType(inheritedParameterType);
+ }
+ DartType inferredParameterType =
+ inferredParameterTypes[declaredParameter];
+ inferredParameterType = mergeTypeInLibrary(hierarchy, classBuilder,
+ inferredParameterType, inheritedParameterType);
+ if (inferredParameterType == null) {
+ // A different type has already been inferred.
+ inferredParameterType = const InvalidType();
+ reportCantInferParameterType(classBuilder, declaredParameter,
+ hierarchy, overriddenMembers);
+ }
+ inferredParameterTypes[declaredParameter] = inferredParameterType;
+ }
+ }
+ }
+ if (declaredMember.returnType == null) {
+ inferredReturnType ??= const DynamicType();
+ declaredFunction.returnType = inferredReturnType;
+ }
+ if (declaredMember.formals != null) {
+ for (FormalParameterBuilder declaredParameter
+ in declaredMember.formals) {
+ if (declaredParameter.type == null) {
+ DartType inferredParameterType =
+ inferredParameterTypes[declaredParameter] ??
+ const DynamicType();
+ declaredParameter.variable.type = inferredParameterType;
}
}
}
@@ -995,54 +1024,74 @@
assert(declaredMember.isGetter);
if (declaredMember.classBuilder == classBuilder &&
declaredMember.returnType == null) {
- for (ClassMember overriddenMember
- in toSet(declaredMember.classBuilder, overriddenMembers)) {
- int hadTypesInferredFrom = declaredMember.hadTypesInferredFrom;
- Member bTarget = overriddenMember.getMember(hierarchy);
- Substitution bSubstitution;
- if (classBuilder.cls != bTarget.enclosingClass) {
+ DartType inferredType;
+
+ void inferFrom(ClassMember classMember) {
+ if (inferredType is InvalidType) return;
+
+ Member overriddenMember = classMember.getMember(hierarchy);
+ Substitution substitution;
+ if (classBuilder.cls != overriddenMember.enclosingClass) {
assert(
- substitutions.containsKey(bTarget.enclosingClass),
+ substitutions.containsKey(overriddenMember.enclosingClass),
"No substitution found for '${classBuilder.fullNameForErrors}' "
- "as instance of '${bTarget.enclosingClass.name}'. Substitutions "
- "available for: ${substitutions.keys}");
- bSubstitution = substitutions[bTarget.enclosingClass];
+ "as instance of '${overriddenMember.enclosingClass.name}'. "
+ "Substitutions available for: ${substitutions.keys}");
+ substitution = substitutions[overriddenMember.enclosingClass];
}
- DartType bType;
- int inferTypesFrom;
- if (bTarget is Field) {
- bType = bTarget.type;
- assert(bType is! ImplicitFieldType);
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromField;
- } else if (bTarget is Procedure) {
- if (bTarget.kind == ProcedureKind.Setter) {
+ DartType inheritedType;
+ if (overriddenMember is Field) {
+ inheritedType = overriddenMember.type;
+ assert(inheritedType is! ImplicitFieldType);
+ } else if (overriddenMember is Procedure) {
+ if (overriddenMember.kind == ProcedureKind.Setter) {
VariableDeclaration bParameter =
- bTarget.function.positionalParameters.single;
- bType = bParameter.type;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromSetter;
- } else if (bTarget.kind == ProcedureKind.Getter) {
- bType = bTarget.function.returnType;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromGetter;
+ overriddenMember.function.positionalParameters.single;
+ inheritedType = bParameter.type;
+ } else if (overriddenMember.kind == ProcedureKind.Getter) {
+ inheritedType = overriddenMember.function.returnType;
} else {
- debug?.log("Giving up (not accessor: ${bTarget.kind})");
- continue;
+ debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+ return;
}
} else {
- debug?.log("Giving up (not field/procedure: ${bTarget.runtimeType})");
- continue;
+ debug?.log(
+ "Giving up (not field/procedure: ${overriddenMember.runtimeType})");
+ return;
}
- if (bSubstitution != null) {
- bType = bSubstitution.substituteType(bType);
+ if (substitution != null) {
+ inheritedType = substitution.substituteType(inheritedType);
}
- inferReturnType(
- classBuilder,
- declaredMember,
- declaredMember.member.function,
- bType,
- hadTypesInferredFrom,
- inferTypesFrom,
- hierarchy);
+ inferredType = mergeTypeInLibrary(
+ hierarchy, classBuilder, inferredType, inheritedType);
+
+ if (inferredType == null) {
+ // A different type has already been inferred.
+ inferredType = const InvalidType();
+ reportCantInferReturnType(
+ classBuilder, declaredMember, hierarchy, overriddenMembers);
+ }
}
+
+ overriddenMembers = toSet(classBuilder, overriddenMembers);
+ // The getter type must be inferred from getters first.
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (!overriddenMember.forSetter) {
+ inferFrom(overriddenMember);
+ }
+ }
+ if (inferredType == null) {
+ // The getter type must be inferred from setters if no type was
+ // inferred from getters.
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (overriddenMember.forSetter) {
+ inferFrom(overriddenMember);
+ }
+ }
+ }
+
+ inferredType ??= const DynamicType();
+ declaredMember.procedure.function.returnType = inferredType;
}
}
@@ -1055,47 +1104,110 @@
assert(declaredMember.isSetter);
FormalParameterBuilder parameter = declaredMember.formals.first;
if (declaredMember.classBuilder == classBuilder && parameter.type == null) {
- for (ClassMember overriddenMember
- in toSet(declaredMember.classBuilder, overriddenMembers)) {
- int hadTypesInferredFrom = declaredMember.hadTypesInferredFrom;
- Member bTarget = overriddenMember.getMember(hierarchy);
- Substitution bSubstitution;
- if (classBuilder.cls != bTarget.enclosingClass) {
+ DartType inferredType;
+
+ void inferFrom(ClassMember classMember) {
+ if (inferredType is InvalidType) return;
+
+ Member overriddenMember = classMember.getMember(hierarchy);
+ Substitution substitution;
+ if (classBuilder.cls != overriddenMember.enclosingClass) {
assert(
- substitutions.containsKey(bTarget.enclosingClass),
+ substitutions.containsKey(overriddenMember.enclosingClass),
"No substitution found for '${classBuilder.fullNameForErrors}' "
- "as instance of '${bTarget.enclosingClass.name}'. Substitutions "
- "available for: ${substitutions.keys}");
- bSubstitution = substitutions[bTarget.enclosingClass];
+ "as instance of '${overriddenMember.enclosingClass.name}'. "
+ "Substitutions available for: ${substitutions.keys}");
+ substitution = substitutions[overriddenMember.enclosingClass];
}
- DartType bType;
- int inferTypesFrom;
- if (bTarget is Field) {
- bType = bTarget.type;
- assert(bType is! ImplicitFieldType);
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromField;
- } else if (bTarget is Procedure) {
- if (overriddenMember.isSetter) {
+ DartType inheritedType;
+ if (overriddenMember is Field) {
+ inheritedType = overriddenMember.type;
+ assert(inheritedType is! ImplicitFieldType);
+ } else if (overriddenMember is Procedure) {
+ if (classMember.isSetter) {
VariableDeclaration bParameter =
- bTarget.function.positionalParameters.single;
- bType = bParameter.type;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromSetter;
- } else if (overriddenMember.isGetter) {
- bType = bTarget.function.returnType;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromGetter;
+ overriddenMember.function.positionalParameters.single;
+ inheritedType = bParameter.type;
+ } else if (classMember.isGetter) {
+ inheritedType = overriddenMember.function.returnType;
} else {
- debug?.log("Giving up (not accessor: ${bTarget.kind})");
- continue;
+ debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+ return;
}
} else {
- debug?.log("Giving up (not field/procedure: ${bTarget.runtimeType})");
- continue;
+ debug?.log(
+ "Giving up (not field/procedure: ${overriddenMember.runtimeType})");
+ return;
}
- if (bSubstitution != null) {
- bType = bSubstitution.substituteType(bType);
+ if (substitution != null) {
+ inheritedType = substitution.substituteType(inheritedType);
}
- inferParameterType(classBuilder, declaredMember, parameter, bType,
- hadTypesInferredFrom, inferTypesFrom, hierarchy);
+ inferredType = mergeTypeInLibrary(
+ hierarchy, classBuilder, inferredType, inheritedType);
+ if (inferredType == null) {
+ // A different type has already been inferred.
+ inferredType = const InvalidType();
+ reportCantInferParameterType(
+ classBuilder, parameter, hierarchy, overriddenMembers);
+ }
+ }
+
+ overriddenMembers = toSet(classBuilder, overriddenMembers);
+ // The setter type must be inferred from setters first.
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (overriddenMember.forSetter) {
+ inferFrom(overriddenMember);
+ }
+ }
+ if (inferredType == null) {
+ // The setter type must be inferred from getters if no type was
+ // inferred from setters.
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (!overriddenMember.forSetter) {
+ inferFrom(overriddenMember);
+ }
+ }
+ }
+
+ inferredType ??= const DynamicType();
+ parameter.variable.type = inferredType;
+ }
+ }
+
+ /// Merge the [inheritedType] with the currently [inferredType] using
+ /// nnbd-top-merge or legacy-top-merge depending on whether [classBuilder] is
+ /// defined in an opt-in or opt-out library. If the types could not be merged
+ /// `null` is returned and an error should be reported by the caller.
+ static DartType mergeTypeInLibrary(
+ ClassHierarchyBuilder hierarchy,
+ ClassBuilder classBuilder,
+ DartType inferredType,
+ DartType inheritedType) {
+ if (classBuilder.library.isNonNullableByDefault) {
+ if (inferredType == null) {
+ return inheritedType;
+ } else {
+ return nnbdTopMerge(
+ hierarchy.coreTypes,
+ norm(hierarchy.coreTypes, inferredType),
+ norm(hierarchy.coreTypes, inheritedType));
+ }
+ } else {
+ inheritedType = legacyErasure(hierarchy.coreTypes, inheritedType);
+ if (inferredType == null) {
+ return inheritedType;
+ } else {
+ if (inferredType is DynamicType &&
+ inheritedType == hierarchy.coreTypes.objectLegacyRawType) {
+ return inferredType;
+ } else if (inheritedType is DynamicType &&
+ inferredType == hierarchy.coreTypes.objectLegacyRawType) {
+ return inheritedType;
+ }
+ if (inferredType != inheritedType) {
+ return null;
+ }
+ return inferredType;
}
}
}
@@ -1111,62 +1223,49 @@
fieldBuilder.type == null) {
DartType inferredType;
- void inferFrom(ClassMember overriddenMember) {
+ void inferFrom(ClassMember classMember) {
if (inferredType is InvalidType) return;
- assert(useConsolidated || !overriddenMember.hasDeclarations);
- Member bTarget = overriddenMember.getMember(hierarchy);
+ assert(useConsolidated || !classMember.hasDeclarations);
+ Member overriddenMember = classMember.getMember(hierarchy);
DartType inheritedType;
- if (bTarget is Procedure) {
- if (bTarget.isSetter) {
+ if (overriddenMember is Procedure) {
+ if (overriddenMember.isSetter) {
VariableDeclaration parameter =
- bTarget.function.positionalParameters.single;
+ overriddenMember.function.positionalParameters.single;
inheritedType = parameter.type;
- } else if (bTarget.isGetter) {
- inheritedType = bTarget.function.returnType;
+ } else if (overriddenMember.isGetter) {
+ inheritedType = overriddenMember.function.returnType;
}
- } else if (bTarget is Field) {
- inheritedType = bTarget.type;
+ } else if (overriddenMember is Field) {
+ inheritedType = overriddenMember.type;
}
if (inheritedType == null) {
debug
?.log("Giving up (inheritedType == null)\n${StackTrace.current}");
return;
}
- Substitution bSubstitution;
- if (classBuilder.cls != bTarget.enclosingClass) {
+ Substitution substitution;
+ if (classBuilder.cls != overriddenMember.enclosingClass) {
assert(
- substitutions.containsKey(bTarget.enclosingClass),
+ substitutions.containsKey(overriddenMember.enclosingClass),
"${classBuilder.fullNameForErrors} "
- "${bTarget.enclosingClass.name}");
- bSubstitution = substitutions[bTarget.enclosingClass];
+ "${overriddenMember.enclosingClass.name}");
+ substitution = substitutions[overriddenMember.enclosingClass];
debug?.log("${classBuilder.fullNameForErrors} -> "
- "${bTarget.enclosingClass.name} $bSubstitution");
+ "${overriddenMember.enclosingClass.name} $substitution");
}
assert(inheritedType is! ImplicitFieldType);
- if (bSubstitution != null) {
- inheritedType = bSubstitution.substituteType(inheritedType);
+ if (substitution != null) {
+ inheritedType = substitution.substituteType(inheritedType);
}
- if (!classBuilder.library.isNonNullableByDefault) {
- inheritedType = legacyErasure(hierarchy.coreTypes, inheritedType);
- }
-
+ inferredType = mergeTypeInLibrary(
+ hierarchy, classBuilder, inferredType, inheritedType);
if (inferredType == null) {
- inferredType = inheritedType;
- } else {
- if (classBuilder.library.isNonNullableByDefault) {
- DartType topMerge =
- nnbdTopMerge(hierarchy.coreTypes, inferredType, inheritedType);
- if (topMerge != null) {
- inferredType = topMerge;
- return;
- }
- }
- if (inferredType != inheritedType) {
- inferredType = const InvalidType();
- // A different type has already been inferred.
- reportCantInferFieldType(classBuilder, fieldBuilder);
- }
+ // A different type has already been inferred.
+ inferredType = const InvalidType();
+ reportCantInferFieldType(
+ classBuilder, fieldBuilder, overriddenMembers);
}
}
@@ -1353,7 +1452,8 @@
assert(!classBuilder.isPatch);
ClassHierarchyNode supernode;
if (objectClass != classBuilder.origin) {
- supernode = hierarchy.getNodeFromTypeBuilder(classBuilder.supertype);
+ supernode =
+ hierarchy.getNodeFromTypeBuilder(classBuilder.supertypeBuilder);
if (supernode == null) {
supernode = hierarchy.getNodeFromClassBuilder(objectClass);
}
@@ -1362,13 +1462,12 @@
Scope scope = classBuilder.scope;
if (classBuilder.isMixinApplication) {
- TypeDeclarationBuilder mixin = classBuilder.mixedInType.declaration;
+ TypeDeclarationBuilder mixin =
+ classBuilder.mixedInTypeBuilder.declaration;
inferMixinApplication();
- // recordSupertype(cls.mixedInType);
while (mixin.isNamedMixinApplication) {
ClassBuilder named = mixin;
- // recordSupertype(named.mixedInType);
- mixin = named.mixedInType.declaration;
+ mixin = named.mixedInTypeBuilder.declaration;
}
if (mixin is TypeAliasBuilder) {
TypeAliasBuilder aliasBuilder = mixin;
@@ -1481,7 +1580,7 @@
maxInheritancePath = supernode.maxInheritancePath + 1;
superclasses = new List<Supertype>(supernode.superclasses.length + 1);
- Supertype supertype = classBuilder.supertype.buildSupertype(
+ Supertype supertype = classBuilder.supertypeBuilder.buildSupertype(
classBuilder.library, classBuilder.charOffset, classBuilder.fileUri);
if (supertype == null) {
// If the superclass is not an interface type we use Object instead.
@@ -1491,27 +1590,29 @@
}
superclasses.setRange(0, superclasses.length - 1,
substSupertypes(supertype, supernode.superclasses));
- superclasses[superclasses.length - 1] = recordSupertype(supertype);
+ superclasses[superclasses.length - 1] = supertype;
+ if (!classBuilder.library.isNonNullableByDefault &&
+ supernode.classBuilder.library.isNonNullableByDefault) {
+ for (int i = 0; i < superclasses.length; i++) {
+ superclasses[i] =
+ legacyErasureSupertype(hierarchy.coreTypes, superclasses[i]);
+ }
+ }
List<TypeBuilder> directInterfaceBuilders =
- ignoreFunction(classBuilder.interfaces);
+ ignoreFunction(classBuilder.interfaceBuilders);
if (classBuilder.isMixinApplication) {
if (directInterfaceBuilders == null) {
- directInterfaceBuilders = <TypeBuilder>[classBuilder.mixedInType];
+ directInterfaceBuilders = <TypeBuilder>[
+ classBuilder.mixedInTypeBuilder
+ ];
} else {
- directInterfaceBuilders = <TypeBuilder>[classBuilder.mixedInType]
- ..addAll(directInterfaceBuilders);
+ directInterfaceBuilders = <TypeBuilder>[
+ classBuilder.mixedInTypeBuilder
+ ]..addAll(directInterfaceBuilders);
}
}
- if (directInterfaceBuilders != null) {
- for (int i = 0; i < directInterfaceBuilders.length; i++) {
- Supertype interface = directInterfaceBuilders[i].buildSupertype(
- classBuilder.library,
- classBuilder.charOffset,
- classBuilder.fileUri);
- if (interface != null) recordSupertype(interface);
- }
- }
+
List<Supertype> superclassInterfaces = supernode.interfaces;
if (superclassInterfaces != null) {
superclassInterfaces = substSupertypes(supertype, superclassInterfaces);
@@ -1578,11 +1679,27 @@
}
}
}
+ } else if (superclassInterfaces != null &&
+ !classBuilder.library.isNonNullableByDefault &&
+ supernode.classBuilder.library.isNonNullableByDefault) {
+ interfaces = <Supertype>[];
+ for (int i = 0; i < superclassInterfaces.length; i++) {
+ addInterface(interfaces, superclasses, superclassInterfaces[i]);
+ }
} else {
interfaces = superclassInterfaces;
}
}
+ for (Supertype superclass in superclasses) {
+ recordSupertype(superclass);
+ }
+ if (interfaces != null) {
+ for (Supertype superinterface in interfaces) {
+ recordSupertype(superinterface);
+ }
+ }
+
/// Members (excluding setters) declared in [cls] or its superclasses. This
/// includes static methods of [cls], but not its superclasses.
Map<Name, ClassMember> classMemberMap = {};
@@ -1967,20 +2084,16 @@
debug?.log("In ${this.classBuilder.fullNameForErrors} "
"recordSupertype(${supertype})");
Class cls = supertype.classNode;
- if (cls.isMixinApplication) {
- recordSupertype(cls.mixedInType);
- }
- List<TypeParameter> typeVariableBuilders = cls.typeParameters;
- if (typeVariableBuilders == null) {
+ List<TypeParameter> supertypeTypeParameters = cls.typeParameters;
+ if (supertypeTypeParameters.isEmpty) {
substitutions[cls] = Substitution.empty;
- assert(cls.typeParameters.isEmpty);
} else {
List<DartType> arguments = supertype.typeArguments;
List<DartType> typeArguments = new List<DartType>(arguments.length);
List<TypeParameter> typeParameters =
new List<TypeParameter>(arguments.length);
for (int i = 0; i < arguments.length; i++) {
- typeParameters[i] = typeVariableBuilders[i];
+ typeParameters[i] = supertypeTypeParameters[i];
typeArguments[i] = arguments[i];
}
substitutions[cls] =
@@ -1995,9 +2108,6 @@
if (typeVariables.isEmpty) {
debug?.log("In ${this.classBuilder.fullNameForErrors} "
"$supertypes aren't substed");
- for (int i = 0; i < supertypes.length; i++) {
- recordSupertype(supertypes[i]);
- }
return supertypes;
}
Map<TypeParameter, DartType> map = <TypeParameter, DartType>{};
@@ -2009,8 +2119,7 @@
List<Supertype> result;
for (int i = 0; i < supertypes.length; i++) {
Supertype supertype = supertypes[i];
- Supertype substituted =
- recordSupertype(substitution.substituteSupertype(supertype));
+ Supertype substituted = substitution.substituteSupertype(supertype);
if (supertype != substituted) {
debug?.log("In ${this.classBuilder.fullNameForErrors} $supertype"
" -> $substituted");
@@ -2045,8 +2154,8 @@
}
}
- Supertype addInterface(List<Supertype> interfaces,
- List<Supertype> superclasses, Supertype type) {
+ void addInterface(List<Supertype> interfaces, List<Supertype> superclasses,
+ Supertype type) {
if (type == null) return null;
if (!classBuilder.library.isNonNullableByDefault) {
type = legacyErasureSupertype(hierarchy.coreTypes, type);
@@ -2072,7 +2181,7 @@
superclasses[depth] = superclass;
}
}
- return superclass;
+ return;
} else {
for (int i = 0; i < interfaces.length; i++) {
// This is a quadratic algorithm, but normally, the number of
@@ -2094,12 +2203,11 @@
interfaces[i] = interface;
}
}
- return interface;
+ return;
}
}
}
interfaces.add(type);
- return null;
}
void reportMissingMembers() {
@@ -2153,7 +2261,7 @@
inferredArguments[i] =
hierarchy.loader.computeTypeBuilder(typeArguments[i]);
}
- NamedTypeBuilder mixedInTypeBuilder = classBuilder.mixedInType;
+ NamedTypeBuilder mixedInTypeBuilder = classBuilder.mixedInTypeBuilder;
mixedInTypeBuilder.arguments = inferredArguments;
}
@@ -2473,10 +2581,11 @@
class DelayedOverrideCheck {
final ClassBuilder classBuilder;
- final ClassMember a;
- final ClassMember b;
+ final ClassMember declaredMember;
+ final ClassMember overriddenMember;
- const DelayedOverrideCheck(this.classBuilder, this.a, this.b);
+ const DelayedOverrideCheck(
+ this.classBuilder, this.declaredMember, this.overriddenMember);
void check(ClassHierarchyBuilder hierarchy) {
void callback(
@@ -2486,75 +2595,10 @@
isInterfaceCheck: !classBuilder.isMixinApplication);
}
- ClassMember a = this.a;
- debug?.log("Delayed override check of ${a.fullName} "
- "${b.fullName} wrt. ${classBuilder.fullNameForErrors}");
- Member bMember = b.getMember(hierarchy);
- if (classBuilder == a.classBuilder) {
- if (a is SourceProcedureMember) {
- if (a.isGetter && !a.hasExplicitReturnType) {
- int inferTypesFrom;
- DartType type;
- if (bMember is Field) {
- type = bMember.type;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromField;
- } else if (bMember is Procedure) {
- if (bMember.kind == ProcedureKind.Getter) {
- type = bMember.function.returnType;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromGetter;
- } else if (bMember.kind == ProcedureKind.Setter) {
- type = bMember.function.positionalParameters.single.type;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromSetter;
- }
- }
- if (type != null) {
- type = Substitution.fromInterfaceType(
- hierarchy.getKernelTypeAsInstanceOf(
- hierarchy.coreTypes.thisInterfaceType(
- classBuilder.cls, classBuilder.library.nonNullable),
- bMember.enclosingClass,
- classBuilder.library.library))
- .substituteType(type);
- inferReturnType(
- classBuilder,
- a.memberBuilder,
- a.memberBuilder.member.function,
- type,
- a.hadTypesInferredFrom,
- inferTypesFrom,
- hierarchy);
- }
- } else if (a.isSetter && !a.hasExplicitlyTypedFormalParameter(0)) {
- int inferTypesFrom;
- DartType type;
- if (bMember is Field) {
- type = bMember.type;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromField;
- } else if (bMember is Procedure) {
- if (bMember.kind == ProcedureKind.Getter) {
- type = bMember.function.returnType;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromGetter;
- } else if (bMember.kind == ProcedureKind.Setter) {
- type = bMember.function.positionalParameters.single.type;
- inferTypesFrom = SourceProcedureBuilder.inferredTypesFromSetter;
- }
- }
- if (type != null) {
- type = Substitution.fromInterfaceType(
- hierarchy.getKernelTypeAsInstanceOf(
- hierarchy.coreTypes.thisInterfaceType(
- classBuilder.cls, classBuilder.library.nonNullable),
- bMember.enclosingClass,
- classBuilder.library.library))
- .substituteType(type);
- inferParameterType(classBuilder, a.memberBuilder, a.formals.single,
- type, a.hadTypesInferredFrom, inferTypesFrom, hierarchy);
- }
- }
- }
- }
-
- callback(a.getMember(hierarchy), bMember, a.isSetter);
+ debug?.log("Delayed override check of ${declaredMember.fullName} "
+ "${overriddenMember.fullName} wrt. ${classBuilder.fullNameForErrors}");
+ callback(declaredMember.getMember(hierarchy),
+ overriddenMember.getMember(hierarchy), declaredMember.isSetter);
}
}
@@ -2667,16 +2711,6 @@
}
@override
- bool get hasExplicitReturnType {
- return true;
- }
-
- @override
- bool hasExplicitlyTypedFormalParameter(int index) {
- return true;
- }
-
- @override
void inferType(ClassHierarchyBuilder hierarchy) {
// Do nothing; this is only for declared members.
}
@@ -3000,7 +3034,7 @@
String name = classBuilder.fullNameForErrors;
int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
List<LocatedMessage> context = declarations.map((ClassMember d) {
- return messageDeclaredMemberConflictsWithInheritedMemberCause
+ return messageDeclaredMemberConflictsWithInheritedMembersCause
.withLocation(d.fileUri, d.charOffset, d.fullNameForErrors.length);
}).toList();
@@ -3209,135 +3243,43 @@
return a.name.compareTo(b.name);
}
-bool inferParameterType(
- ClassBuilder classBuilder,
- SourceProcedureBuilder memberBuilder,
- FormalParameterBuilder parameterBuilder,
- DartType type,
- int hadTypesInferredFrom,
- int inferTypesFrom,
- ClassHierarchyBuilder hierarchy) {
- if ((hadTypesInferredFrom & SourceProcedureBuilder.inferredTypesFromSetter) !=
- 0 &&
- (inferTypesFrom & SourceProcedureBuilder.inferredTypesFromSetter) == 0) {
- // Parameter type already inferred from setter; disregard getters.
- return false;
- }
-
- debug?.log("Inferred type ${type} for ${parameterBuilder}");
-
- if (classBuilder.library.isNonNullableByDefault) {
- if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
- type = nnbdTopMerge(
- hierarchy.coreTypes,
- norm(hierarchy.coreTypes, parameterBuilder.variable.type),
- norm(hierarchy.coreTypes, type));
- if (type != null) {
- // The nnbd top merge exists so [type] is the inferred type.
- parameterBuilder.variable.type = type;
- return false;
- }
- // The nnbd top merge doesn't exist. An error will be reported below.
- }
- } else {
- type = legacyErasure(hierarchy.coreTypes, type);
- if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
- if (parameterBuilder.variable.type is DynamicType &&
- type == hierarchy.coreTypes.objectLegacyRawType) {
- return false;
- } else if (type is DynamicType &&
- parameterBuilder.variable.type ==
- hierarchy.coreTypes.objectLegacyRawType) {
- parameterBuilder.variable.type = const DynamicType();
- return false;
- }
- }
- }
-
- if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
- if (type == parameterBuilder.variable.type) {
- return true;
- }
- reportCantInferParameterType(classBuilder, parameterBuilder, hierarchy);
- parameterBuilder.variable.type = const InvalidType();
- return false;
- } else {
- parameterBuilder.variable.type = type;
- memberBuilder.hadTypesInferredFrom |= inferTypesFrom;
- return true;
- }
-}
-
-void reportCantInferParameterType(ClassBuilder cls,
- FormalParameterBuilder parameter, ClassHierarchyBuilder hierarchy) {
+void reportCantInferParameterType(
+ ClassBuilder cls,
+ FormalParameterBuilder parameter,
+ ClassHierarchyBuilder hierarchy,
+ Iterable<ClassMember> overriddenMembers) {
String name = parameter.name;
+ List<LocatedMessage> context = overriddenMembers
+ .map((ClassMember overriddenMember) {
+ return messageDeclaredMemberConflictsWithInheritedMembersCause
+ .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+ overriddenMember.fullNameForErrors.length);
+ })
+ // Call toSet to avoid duplicate context for instance of fields that are
+ // overridden both as getters and setters.
+ .toSet()
+ .toList();
cls.addProblem(
templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
parameter.charOffset,
name.length,
- wasHandled: true);
-}
-
-bool inferReturnType(
- ClassBuilder classBuilder,
- SourceProcedureBuilder procedureBuilder,
- FunctionNode function,
- DartType type,
- int hadTypesInferredFrom,
- int inferTypesFrom,
- ClassHierarchyBuilder hierarchy) {
- if ((hadTypesInferredFrom & SourceProcedureBuilder.inferredTypesFromGetter) !=
- 0 &&
- (inferTypesFrom & SourceProcedureBuilder.inferredTypesFromGetter) == 0) {
- // Return type already inferred from getter; disregard setters.
- return false;
- }
-
- if (classBuilder.library.isNonNullableByDefault) {
- if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
- type = nnbdTopMerge(
- hierarchy.coreTypes,
- norm(hierarchy.coreTypes, function.returnType),
- norm(hierarchy.coreTypes, type));
- if (type != null) {
- // The nnbd top merge exists so [type] is the inferred type.
- function.returnType = type;
- return false;
- }
- // The nnbd top merge doesn't exist. An error will be reported below.
- }
- } else {
- type = legacyErasure(hierarchy.coreTypes, type);
- if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
- if (function.returnType is DynamicType &&
- type == hierarchy.coreTypes.objectLegacyRawType) {
- return false;
- } else if (type is DynamicType &&
- function.returnType == hierarchy.coreTypes.objectLegacyRawType) {
- function.returnType = const DynamicType();
- return false;
- }
- }
- }
-
- if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
- if (type == function.returnType) {
- return true;
- }
- reportCantInferReturnType(classBuilder, procedureBuilder, hierarchy);
- function.returnType = const InvalidType();
- return false;
- } else {
- procedureBuilder.hadTypesInferredFrom |= inferTypesFrom;
- function.returnType = type;
- return true;
- }
+ wasHandled: true,
+ context: context);
}
void reportCantInferReturnType(ClassBuilder cls, SourceProcedureBuilder member,
- ClassHierarchyBuilder hierarchy) {
+ ClassHierarchyBuilder hierarchy, Iterable<ClassMember> overriddenMembers) {
String name = member.fullNameForErrors;
- List<LocatedMessage> context;
+ List<LocatedMessage> context = overriddenMembers
+ .map((ClassMember overriddenMember) {
+ return messageDeclaredMemberConflictsWithInheritedMembersCause
+ .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+ overriddenMember.fullNameForErrors.length);
+ })
+ // Call toSet to avoid duplicate context for instance of fields that are
+ // overridden both as getters and setters.
+ .toSet()
+ .toList();
// // TODO(ahe): The following is for debugging, but could be cleaned up and
// // used to improve this error message in general.
//
@@ -3393,13 +3335,25 @@
context: context);
}
-void reportCantInferFieldType(ClassBuilder cls, SourceFieldBuilder member) {
+void reportCantInferFieldType(ClassBuilder cls, SourceFieldBuilder member,
+ Iterable<ClassMember> overriddenMembers) {
+ List<LocatedMessage> context = overriddenMembers
+ .map((ClassMember overriddenMember) {
+ return messageDeclaredMemberConflictsWithInheritedMembersCause
+ .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+ overriddenMember.fullNameForErrors.length);
+ })
+ // Call toSet to avoid duplicate context for instance of fields that are
+ // overridden both as getters and setters.
+ .toSet()
+ .toList();
String name = member.fullNameForErrors;
cls.addProblem(
templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
member.charOffset,
name.length,
- wasHandled: true);
+ wasHandled: true,
+ context: context);
}
ClassBuilder getClass(TypeBuilder type) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/collections.dart b/pkg/front_end/lib/src/fasta/kernel/collections.dart
index 6c4f9ca..5f142ad 100644
--- a/pkg/front_end/lib/src/fasta/kernel/collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/collections.dart
@@ -99,6 +99,11 @@
void onConvertForElement(TreeNode from, TreeNode to)) {
return new SpreadMapEntry(expression, isNullAware)..fileOffset = fileOffset;
}
+
+ @override
+ String toString() {
+ return "SpreadElement()";
+ }
}
/// An 'if' element in a list or set literal.
@@ -155,6 +160,11 @@
return new IfMapEntry(condition, thenEntry, otherwiseEntry)
..fileOffset = fileOffset;
}
+
+ @override
+ String toString() {
+ return "IfElement()";
+ }
}
/// A 'for' element in a list or set literal.
@@ -207,6 +217,11 @@
onConvertForElement(this, result);
return result;
}
+
+ @override
+ String toString() {
+ return "ForElement()";
+ }
}
/// A 'for-in' element in a list or set literal.
@@ -286,6 +301,11 @@
onConvertForElement(this, result);
return result;
}
+
+ @override
+ String toString() {
+ return "ForInElement()";
+ }
}
mixin ControlFlowMapEntry implements MapEntry {
@@ -340,6 +360,11 @@
expression?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "SpreadMapEntry()";
+ }
}
/// An 'if' element in a map literal.
@@ -376,6 +401,11 @@
otherwise?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IfMapEntry()";
+ }
}
/// A 'for' element in a map literal.
@@ -413,6 +443,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ForMapEntry()";
+ }
}
/// A 'for-in' element in a map literal.
@@ -477,6 +512,11 @@
problem?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ForInMapEntry()";
+ }
}
/// Convert [entry] to an [Expression], if possible. If [entry] cannot be
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index c1104f7..51a5f21 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -754,4 +754,9 @@
transformChildren(v) {
throw unsupported("transformChildren", fileOffset, uri);
}
+
+ @override
+ String toString() {
+ return "_VariablesDeclaration()";
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
index 36edb1b..1f0d6cc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
@@ -43,4 +43,9 @@
@override
bool equals(Object other, Assumptions assumptions) => this == other;
+
+ @override
+ String toString() {
+ return "ImplicitTypeArgument()";
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 5082f41..b053237 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -20,8 +20,6 @@
InstrumentationValueForType,
InstrumentationValueForTypeArgs;
-import '../../base/nnbd_mode.dart';
-
import '../fasta_codes.dart';
import '../names.dart';
@@ -734,13 +732,8 @@
node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
inferred: true);
}
- }
- if (inferrer.isNonNullableByDefault) {
- if (node.target == inferrer.coreTypes.listDefaultConstructor) {
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.library.addProblem(messageDefaultListConstructorWarning,
- node.fileOffset, noLength, inferrer.helper.uri);
- } else {
+ if (inferrer.isNonNullableByDefault) {
+ if (node.target == inferrer.coreTypes.listDefaultConstructor) {
resultNode = inferrer.helper.wrapInProblem(node,
messageDefaultListConstructorError, node.fileOffset, noLength);
}
@@ -2317,7 +2310,7 @@
}
return inferrer.inferMethodInvocation(node.fileOffset, nullAwareGuards,
receiver, receiverType, node.name, node.arguments, typeContext,
- isExpressionInvocation: false);
+ isExpressionInvocation: false, isImplicitCall: false);
}
ExpressionInferenceResult visitExpressionInvocation(
@@ -2335,39 +2328,9 @@
receiver = result.expression;
receiverType = result.inferredType;
}
- ExpressionInferenceResult invocationResult = inferrer.inferMethodInvocation(
- node.fileOffset,
- nullAwareGuards,
- receiver,
- receiverType,
- callName,
- node.arguments,
- typeContext,
- isExpressionInvocation: true);
- if (inferrer.isNonNullableByDefault) {
- if (receiverType is! DynamicType &&
- receiverType is! InvalidType &&
- isPotentiallyNullable(
- receiverType, inferrer.coreTypes.futureOrClass)) {
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.helper.addProblem(
- templateNullableExpressionCallWarning.withArguments(
- receiverType, inferrer.isNonNullableByDefault),
- node.fileOffset,
- noLength);
- } else {
- return new ExpressionInferenceResult(
- invocationResult.inferredType,
- inferrer.helper.wrapInProblem(
- invocationResult.expression..fileOffset = node.fileOffset,
- templateNullableExpressionCallError.withArguments(
- receiverType, inferrer.isNonNullableByDefault),
- node.fileOffset,
- noLength));
- }
- }
- }
- return invocationResult;
+ return inferrer.inferMethodInvocation(node.fileOffset, nullAwareGuards,
+ receiver, receiverType, callName, node.arguments, typeContext,
+ isExpressionInvocation: true, isImplicitCall: true);
}
ExpressionInferenceResult visitNamedFunctionExpressionJudgment(
@@ -3539,76 +3502,82 @@
}
Expression binary;
- if (binaryTarget.isMissing) {
- binary = inferrer.createMissingBinary(
- fileOffset, left, leftType, binaryName, right);
- } else if (binaryTarget.isExtensionMember) {
- assert(binaryTarget.extensionMethodKind != ProcedureKind.Setter);
- binary = new StaticInvocation(
- binaryTarget.member,
- new Arguments(<Expression>[
- left,
- right,
- ], types: binaryTarget.inferredExtensionTypeArguments)
- ..fileOffset = fileOffset)
- ..fileOffset = fileOffset;
- } else {
- if (binaryTarget.isInstanceMember &&
- inferrer.instrumentation != null &&
- leftType == const DynamicType()) {
- inferrer.instrumentation.record(
- inferrer.uriForInstrumentation,
- fileOffset,
- 'target',
- new InstrumentationValueForMember(binaryTarget.member));
- }
-
- binary = new MethodInvocation(
- left,
- binaryName,
- new Arguments(<Expression>[
- right,
- ])
- ..fileOffset = fileOffset,
- binaryTarget.member)
- ..fileOffset = fileOffset;
-
- if (binaryCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
- if (inferrer.instrumentation != null) {
+ switch (binaryTarget.kind) {
+ case ObjectAccessTargetKind.missing:
+ binary = inferrer.createMissingBinary(
+ fileOffset, left, leftType, binaryName, right);
+ break;
+ case ObjectAccessTargetKind.ambiguous:
+ binary = inferrer.createMissingBinary(
+ fileOffset, left, leftType, binaryName, right,
+ extensionAccessCandidates: binaryTarget.candidates);
+ break;
+ case ObjectAccessTargetKind.extensionMember:
+ assert(binaryTarget.extensionMethodKind != ProcedureKind.Setter);
+ binary = new StaticInvocation(
+ binaryTarget.member,
+ new Arguments(<Expression>[
+ left,
+ right,
+ ], types: binaryTarget.inferredExtensionTypeArguments)
+ ..fileOffset = fileOffset)
+ ..fileOffset = fileOffset;
+ break;
+ case ObjectAccessTargetKind.instanceMember:
+ case ObjectAccessTargetKind.invalid:
+ case ObjectAccessTargetKind.unresolved:
+ case ObjectAccessTargetKind.callFunction:
+ case ObjectAccessTargetKind.dynamic:
+ case ObjectAccessTargetKind.never:
+ if (binaryTarget.isInstanceMember &&
+ inferrer.instrumentation != null &&
+ leftType == const DynamicType()) {
inferrer.instrumentation.record(
inferrer.uriForInstrumentation,
fileOffset,
- 'checkReturn',
- new InstrumentationValueForType(binaryType));
+ 'target',
+ new InstrumentationValueForMember(binaryTarget.member));
}
- binary = new AsExpression(binary, binaryType)
- ..isTypeError = true
- ..isCovarianceCheck = true
- ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+
+ binary = new MethodInvocation(
+ left,
+ binaryName,
+ new Arguments(<Expression>[
+ right,
+ ])
+ ..fileOffset = fileOffset,
+ binaryTarget.member)
..fileOffset = fileOffset;
- }
- }
- if (inferrer.isNonNullableByDefault) {
- if (leftType is! DynamicType &&
- isPotentiallyNullable(leftType, inferrer.coreTypes.futureOrClass)) {
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.helper.addProblem(
- templateNullableOperatorCallWarning.withArguments(
- binaryName.name, leftType, inferrer.isNonNullableByDefault),
- binary.fileOffset,
- binaryName.name.length);
- } else {
- return new ExpressionInferenceResult(
- binaryType,
- inferrer.helper.wrapInProblem(
- binary,
- templateNullableOperatorCallError.withArguments(
- binaryName.name,
- leftType,
- inferrer.isNonNullableByDefault),
- binary.fileOffset,
- binaryName.name.length));
+
+ if (binaryCheckKind ==
+ MethodContravarianceCheckKind.checkMethodReturn) {
+ if (inferrer.instrumentation != null) {
+ inferrer.instrumentation.record(
+ inferrer.uriForInstrumentation,
+ fileOffset,
+ 'checkReturn',
+ new InstrumentationValueForType(binaryType));
+ }
+ binary = new AsExpression(binary, binaryType)
+ ..isTypeError = true
+ ..isCovarianceCheck = true
+ ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+ ..fileOffset = fileOffset;
}
+ break;
+ }
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
+ if (leftType is! InvalidType &&
+ leftType is! DynamicType &&
+ isPotentiallyNullable(leftType, inferrer.coreTypes.futureOrClass)) {
+ return new ExpressionInferenceResult(
+ binaryType,
+ inferrer.helper.wrapInProblem(
+ binary,
+ templateNullableOperatorCallError.withArguments(
+ binaryName.name, leftType, inferrer.isNonNullableByDefault),
+ binary.fileOffset,
+ binaryName.name.length));
}
}
return new ExpressionInferenceResult(binaryType, binary);
@@ -3632,75 +3601,80 @@
DartType unaryType = inferrer.getReturnType(unaryTarget, expressionType);
Expression unary;
- if (unaryTarget.isMissing) {
- unary = inferrer.createMissingUnary(
- fileOffset, expression, expressionType, unaryName);
- } else if (unaryTarget.isExtensionMember) {
- assert(unaryTarget.extensionMethodKind != ProcedureKind.Setter);
- unary = new StaticInvocation(
- unaryTarget.member,
- new Arguments(<Expression>[
- expression,
- ], types: unaryTarget.inferredExtensionTypeArguments)
- ..fileOffset = fileOffset)
- ..fileOffset = fileOffset;
- } else {
- if (unaryTarget.isInstanceMember &&
- inferrer.instrumentation != null &&
- expressionType == const DynamicType()) {
- inferrer.instrumentation.record(
- inferrer.uriForInstrumentation,
- fileOffset,
- 'target',
- new InstrumentationValueForMember(unaryTarget.member));
- }
-
- unary = new MethodInvocation(
- expression,
- unaryName,
- new Arguments(<Expression>[])..fileOffset = fileOffset,
- unaryTarget.member)
- ..fileOffset = fileOffset;
-
- if (unaryCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
- if (inferrer.instrumentation != null) {
+ switch (unaryTarget.kind) {
+ case ObjectAccessTargetKind.missing:
+ unary = inferrer.createMissingUnary(
+ fileOffset, expression, expressionType, unaryName);
+ break;
+ case ObjectAccessTargetKind.ambiguous:
+ unary = inferrer.createMissingUnary(
+ fileOffset, expression, expressionType, unaryName,
+ extensionAccessCandidates: unaryTarget.candidates);
+ break;
+ case ObjectAccessTargetKind.extensionMember:
+ assert(unaryTarget.extensionMethodKind != ProcedureKind.Setter);
+ unary = new StaticInvocation(
+ unaryTarget.member,
+ new Arguments(<Expression>[
+ expression,
+ ], types: unaryTarget.inferredExtensionTypeArguments)
+ ..fileOffset = fileOffset)
+ ..fileOffset = fileOffset;
+ break;
+ case ObjectAccessTargetKind.instanceMember:
+ case ObjectAccessTargetKind.invalid:
+ case ObjectAccessTargetKind.unresolved:
+ case ObjectAccessTargetKind.callFunction:
+ case ObjectAccessTargetKind.dynamic:
+ case ObjectAccessTargetKind.never:
+ if (unaryTarget.isInstanceMember &&
+ inferrer.instrumentation != null &&
+ expressionType == const DynamicType()) {
inferrer.instrumentation.record(
inferrer.uriForInstrumentation,
fileOffset,
- 'checkReturn',
- new InstrumentationValueForType(expressionType));
+ 'target',
+ new InstrumentationValueForMember(unaryTarget.member));
}
- unary = new AsExpression(unary, unaryType)
- ..isTypeError = true
- ..isCovarianceCheck = true
- ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+
+ unary = new MethodInvocation(
+ expression,
+ unaryName,
+ new Arguments(<Expression>[])..fileOffset = fileOffset,
+ unaryTarget.member)
..fileOffset = fileOffset;
- }
+
+ if (unaryCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
+ if (inferrer.instrumentation != null) {
+ inferrer.instrumentation.record(
+ inferrer.uriForInstrumentation,
+ fileOffset,
+ 'checkReturn',
+ new InstrumentationValueForType(expressionType));
+ }
+ unary = new AsExpression(unary, unaryType)
+ ..isTypeError = true
+ ..isCovarianceCheck = true
+ ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+ ..fileOffset = fileOffset;
+ }
+ break;
}
- if (inferrer.isNonNullableByDefault) {
- if (expressionType is! DynamicType &&
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
+ if (expressionType is! InvalidType &&
+ expressionType is! DynamicType &&
isPotentiallyNullable(
expressionType, inferrer.coreTypes.futureOrClass)) {
// TODO(johnniwinther): Special case 'unary-' in messages. It should
// probably be referred to as "Unary operator '-' ...".
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.helper.addProblem(
- templateNullableOperatorCallWarning.withArguments(unaryName.name,
- expressionType, inferrer.isNonNullableByDefault),
- unary.fileOffset,
- unaryName == unaryMinusName ? 1 : unaryName.name.length);
- } else {
- return new ExpressionInferenceResult(
- unaryType,
- inferrer.helper.wrapInProblem(
- unary,
- templateNullableOperatorCallError.withArguments(
- unaryName.name,
- expressionType,
- inferrer.isNonNullableByDefault),
- unary.fileOffset,
- unaryName == unaryMinusName ? 1 : unaryName.name.length));
- }
+ return new ExpressionInferenceResult(
+ unaryType,
+ inferrer.helper.wrapInProblem(
+ unary,
+ templateNullableOperatorCallError.withArguments(unaryName.name,
+ expressionType, inferrer.isNonNullableByDefault),
+ unary.fileOffset,
+ unaryName == unaryMinusName ? 1 : unaryName.name.length));
}
}
return new ExpressionInferenceResult(unaryType, unary);
@@ -3721,68 +3695,72 @@
MethodContravarianceCheckKind readCheckKind) {
Expression read;
DartType readType = inferrer.getReturnType(readTarget, receiverType);
- if (readTarget.isMissing) {
- read = inferrer.createMissingIndexGet(
- fileOffset, readReceiver, receiverType, readIndex);
- } else if (readTarget.isExtensionMember) {
- read = new StaticInvocation(
- readTarget.member,
- new Arguments(<Expression>[
- readReceiver,
- readIndex,
- ], types: readTarget.inferredExtensionTypeArguments)
- ..fileOffset = fileOffset)
- ..fileOffset = fileOffset;
- } else {
- read = new MethodInvocation(
- readReceiver,
- indexGetName,
- new Arguments(<Expression>[
- readIndex,
- ])
- ..fileOffset = fileOffset,
- readTarget.member)
- ..fileOffset = fileOffset;
- if (readCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
- if (inferrer.instrumentation != null) {
- inferrer.instrumentation.record(
- inferrer.uriForInstrumentation,
- fileOffset,
- 'checkReturn',
- new InstrumentationValueForType(readType));
- }
- read = new AsExpression(read, readType)
- ..isTypeError = true
- ..isCovarianceCheck = true
- ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+ switch (readTarget.kind) {
+ case ObjectAccessTargetKind.missing:
+ read = inferrer.createMissingIndexGet(
+ fileOffset, readReceiver, receiverType, readIndex);
+ break;
+ case ObjectAccessTargetKind.ambiguous:
+ read = inferrer.createMissingIndexGet(
+ fileOffset, readReceiver, receiverType, readIndex,
+ extensionAccessCandidates: readTarget.candidates);
+ break;
+ case ObjectAccessTargetKind.extensionMember:
+ read = new StaticInvocation(
+ readTarget.member,
+ new Arguments(<Expression>[
+ readReceiver,
+ readIndex,
+ ], types: readTarget.inferredExtensionTypeArguments)
+ ..fileOffset = fileOffset)
..fileOffset = fileOffset;
- }
+ break;
+ case ObjectAccessTargetKind.instanceMember:
+ case ObjectAccessTargetKind.invalid:
+ case ObjectAccessTargetKind.unresolved:
+ case ObjectAccessTargetKind.callFunction:
+ case ObjectAccessTargetKind.dynamic:
+ case ObjectAccessTargetKind.never:
+ read = new MethodInvocation(
+ readReceiver,
+ indexGetName,
+ new Arguments(<Expression>[
+ readIndex,
+ ])
+ ..fileOffset = fileOffset,
+ readTarget.member)
+ ..fileOffset = fileOffset;
+ if (readCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
+ if (inferrer.instrumentation != null) {
+ inferrer.instrumentation.record(
+ inferrer.uriForInstrumentation,
+ fileOffset,
+ 'checkReturn',
+ new InstrumentationValueForType(readType));
+ }
+ read = new AsExpression(read, readType)
+ ..isTypeError = true
+ ..isCovarianceCheck = true
+ ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+ ..fileOffset = fileOffset;
+ }
+ break;
}
- if (inferrer.isNonNullableByDefault) {
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
if (receiverType is! DynamicType &&
receiverType is! InvalidType &&
isPotentiallyNullable(
receiverType, inferrer.coreTypes.futureOrClass)) {
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.helper.addProblem(
- templateNullableOperatorCallWarning.withArguments(
- indexGetName.name,
- receiverType,
- inferrer.isNonNullableByDefault),
- read.fileOffset,
- noLength);
- } else {
- return new ExpressionInferenceResult(
- readType,
- inferrer.helper.wrapInProblem(
- read,
- templateNullableOperatorCallError.withArguments(
- indexGetName.name,
- receiverType,
- inferrer.isNonNullableByDefault),
- read.fileOffset,
- noLength));
- }
+ return new ExpressionInferenceResult(
+ readType,
+ inferrer.helper.wrapInProblem(
+ read,
+ templateNullableOperatorCallError.withArguments(
+ indexGetName.name,
+ receiverType,
+ inferrer.isNonNullableByDefault),
+ read.fileOffset,
+ noLength));
}
}
return new ExpressionInferenceResult(readType, read);
@@ -3802,46 +3780,53 @@
Expression index,
Expression value) {
Expression write;
- if (writeTarget.isMissing) {
- write = inferrer.createMissingIndexSet(
- fileOffset, receiver, receiverType, index, value,
- forEffect: true, readOnlyReceiver: true);
- } else if (writeTarget.isExtensionMember) {
- assert(writeTarget.extensionMethodKind != ProcedureKind.Setter);
- write = new StaticInvocation(
- writeTarget.member,
- new Arguments(<Expression>[receiver, index, value],
- types: writeTarget.inferredExtensionTypeArguments)
- ..fileOffset = fileOffset)
- ..fileOffset = fileOffset;
- } else {
- write = new MethodInvocation(
- receiver,
- indexSetName,
- new Arguments(<Expression>[index, value])..fileOffset = fileOffset,
- writeTarget.member)
- ..fileOffset = fileOffset;
+ switch (writeTarget.kind) {
+ case ObjectAccessTargetKind.missing:
+ write = inferrer.createMissingIndexSet(
+ fileOffset, receiver, receiverType, index, value,
+ forEffect: true, readOnlyReceiver: true);
+ break;
+ case ObjectAccessTargetKind.ambiguous:
+ write = inferrer.createMissingIndexSet(
+ fileOffset, receiver, receiverType, index, value,
+ forEffect: true,
+ readOnlyReceiver: true,
+ extensionAccessCandidates: writeTarget.candidates);
+ break;
+ case ObjectAccessTargetKind.extensionMember:
+ assert(writeTarget.extensionMethodKind != ProcedureKind.Setter);
+ write = new StaticInvocation(
+ writeTarget.member,
+ new Arguments(<Expression>[receiver, index, value],
+ types: writeTarget.inferredExtensionTypeArguments)
+ ..fileOffset = fileOffset)
+ ..fileOffset = fileOffset;
+ break;
+ case ObjectAccessTargetKind.instanceMember:
+ case ObjectAccessTargetKind.invalid:
+ case ObjectAccessTargetKind.unresolved:
+ case ObjectAccessTargetKind.callFunction:
+ case ObjectAccessTargetKind.dynamic:
+ case ObjectAccessTargetKind.never:
+ write = new MethodInvocation(
+ receiver,
+ indexSetName,
+ new Arguments(<Expression>[index, value])..fileOffset = fileOffset,
+ writeTarget.member)
+ ..fileOffset = fileOffset;
+ break;
}
- if (inferrer.isNonNullableByDefault) {
- if (receiverType is! DynamicType &&
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
+ if (receiverType is! InvalidType &&
+ receiverType is! DynamicType &&
isPotentiallyNullable(
receiverType, inferrer.coreTypes.futureOrClass)) {
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.helper.addProblem(
- templateNullableOperatorCallWarning.withArguments(
- indexSetName.name,
- receiverType,
- inferrer.isNonNullableByDefault),
- write.fileOffset,
- noLength);
- } else {
- return inferrer.helper.wrapInProblem(
- write,
- templateNullableOperatorCallError.withArguments(indexSetName.name,
- receiverType, inferrer.isNonNullableByDefault),
- write.fileOffset,
- noLength);
- }
+ return inferrer.helper.wrapInProblem(
+ write,
+ templateNullableOperatorCallError.withArguments(indexSetName.name,
+ receiverType, inferrer.isNonNullableByDefault),
+ write.fileOffset,
+ noLength);
}
}
return write;
@@ -3871,107 +3856,111 @@
DartType readType = inferrer.getGetterType(readTarget, receiverType);
Expression read;
- if (readTarget.isMissing) {
- read = inferrer.createMissingPropertyGet(
- fileOffset, receiver, receiverType, propertyName);
- } else if (readTarget.isExtensionMember) {
- switch (readTarget.extensionMethodKind) {
- case ProcedureKind.Getter:
- read = new StaticInvocation(
- readTarget.member,
- new Arguments(<Expression>[
- receiver,
- ], types: readTarget.inferredExtensionTypeArguments)
- ..fileOffset = fileOffset)
- ..fileOffset = fileOffset;
- break;
- case ProcedureKind.Method:
- read = new StaticInvocation(
- readTarget.tearoffTarget,
- new Arguments(<Expression>[
- receiver,
- ], types: readTarget.inferredExtensionTypeArguments)
- ..fileOffset = fileOffset)
- ..fileOffset = fileOffset;
- return inferrer.instantiateTearOff(readType, typeContext, read);
- case ProcedureKind.Setter:
- case ProcedureKind.Factory:
- case ProcedureKind.Operator:
- unhandled('$readTarget', "inferPropertyGet", null, null);
- break;
- }
- } else {
- if (readTarget.isInstanceMember &&
- inferrer.instrumentation != null &&
- receiverType == const DynamicType()) {
- inferrer.instrumentation.record(
- inferrer.uriForInstrumentation,
- fileOffset,
- 'target',
- new InstrumentationValueForMember(readTarget.member));
- }
- read = new PropertyGet(receiver, propertyName, readTarget.member)
- ..fileOffset = fileOffset;
- bool checkReturn = false;
- if (readTarget.isInstanceMember && !isThisReceiver) {
- Member interfaceMember = readTarget.member;
- if (interfaceMember is Procedure) {
- checkReturn =
- TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
- interfaceMember.enclosingClass,
- interfaceMember.function.returnType);
- } else if (interfaceMember is Field) {
- checkReturn =
- TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
- interfaceMember.enclosingClass, interfaceMember.type);
+ switch (readTarget.kind) {
+ case ObjectAccessTargetKind.missing:
+ read = inferrer.createMissingPropertyGet(
+ fileOffset, receiver, receiverType, propertyName);
+ break;
+ case ObjectAccessTargetKind.ambiguous:
+ read = inferrer.createMissingPropertyGet(
+ fileOffset, receiver, receiverType, propertyName,
+ extensionAccessCandidates: readTarget.candidates);
+ break;
+ case ObjectAccessTargetKind.extensionMember:
+ switch (readTarget.extensionMethodKind) {
+ case ProcedureKind.Getter:
+ read = new StaticInvocation(
+ readTarget.member,
+ new Arguments(<Expression>[
+ receiver,
+ ], types: readTarget.inferredExtensionTypeArguments)
+ ..fileOffset = fileOffset)
+ ..fileOffset = fileOffset;
+ break;
+ case ProcedureKind.Method:
+ read = new StaticInvocation(
+ readTarget.tearoffTarget,
+ new Arguments(<Expression>[
+ receiver,
+ ], types: readTarget.inferredExtensionTypeArguments)
+ ..fileOffset = fileOffset)
+ ..fileOffset = fileOffset;
+ return inferrer.instantiateTearOff(readType, typeContext, read);
+ case ProcedureKind.Setter:
+ case ProcedureKind.Factory:
+ case ProcedureKind.Operator:
+ unhandled('$readTarget', "inferPropertyGet", null, null);
+ break;
}
- }
- if (checkReturn) {
- if (inferrer.instrumentation != null) {
+ break;
+ case ObjectAccessTargetKind.instanceMember:
+ case ObjectAccessTargetKind.invalid:
+ case ObjectAccessTargetKind.unresolved:
+ case ObjectAccessTargetKind.callFunction:
+ case ObjectAccessTargetKind.dynamic:
+ case ObjectAccessTargetKind.never:
+ if (readTarget.isInstanceMember &&
+ inferrer.instrumentation != null &&
+ receiverType == const DynamicType()) {
inferrer.instrumentation.record(
inferrer.uriForInstrumentation,
fileOffset,
- 'checkReturn',
- new InstrumentationValueForType(readType));
+ 'target',
+ new InstrumentationValueForMember(readTarget.member));
}
- read = new AsExpression(read, readType)
- ..isTypeError = true
- ..isCovarianceCheck = true
- ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+ read = new PropertyGet(receiver, propertyName, readTarget.member)
..fileOffset = fileOffset;
- }
- Member member = readTarget.member;
- if (member is Procedure && member.kind == ProcedureKind.Method) {
- return inferrer.instantiateTearOff(readType, typeContext, read);
- }
+ bool checkReturn = false;
+ if (readTarget.isInstanceMember && !isThisReceiver) {
+ Member interfaceMember = readTarget.member;
+ if (interfaceMember is Procedure) {
+ checkReturn =
+ TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
+ interfaceMember.enclosingClass,
+ interfaceMember.function.returnType);
+ } else if (interfaceMember is Field) {
+ checkReturn =
+ TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
+ interfaceMember.enclosingClass, interfaceMember.type);
+ }
+ }
+ if (checkReturn) {
+ if (inferrer.instrumentation != null) {
+ inferrer.instrumentation.record(
+ inferrer.uriForInstrumentation,
+ fileOffset,
+ 'checkReturn',
+ new InstrumentationValueForType(readType));
+ }
+ read = new AsExpression(read, readType)
+ ..isTypeError = true
+ ..isCovarianceCheck = true
+ ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+ ..fileOffset = fileOffset;
+ }
+ Member member = readTarget.member;
+ if (member is Procedure && member.kind == ProcedureKind.Method) {
+ return inferrer.instantiateTearOff(readType, typeContext, read);
+ }
+ break;
}
- if (inferrer.isNonNullableByDefault) {
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
if (receiverType is! DynamicType &&
receiverType is! InvalidType &&
isPotentiallyNullable(
receiverType, inferrer.coreTypes.futureOrClass) &&
!inferrer.matchesObjectMemberCall(
propertyName, const [], const [], const [])) {
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.helper.addProblem(
- templateNullablePropertyAccessWarning.withArguments(
- propertyName.name,
- receiverType,
- inferrer.isNonNullableByDefault),
- read.fileOffset,
- propertyName.name.length);
- } else {
- return new ExpressionInferenceResult(
- readType,
- inferrer.helper.wrapInProblem(
- read,
- templateNullablePropertyAccessError.withArguments(
- propertyName.name,
- receiverType,
- inferrer.isNonNullableByDefault),
- read.fileOffset,
- propertyName.name.length));
- }
+ return new ExpressionInferenceResult(
+ readType,
+ inferrer.helper.wrapInProblem(
+ read,
+ templateNullablePropertyAccessError.withArguments(
+ propertyName.name,
+ receiverType,
+ inferrer.isNonNullableByDefault),
+ read.fileOffset,
+ propertyName.name.length));
}
}
return new ExpressionInferenceResult(readType, read);
@@ -4001,59 +3990,63 @@
assert(forEffect || valueType != null,
"No value type provided for property set needed for value.");
Expression write;
- if (writeTarget.isMissing) {
- write = inferrer.createMissingPropertySet(
- fileOffset, receiver, receiverType, propertyName, value,
- forEffect: forEffect);
- } else if (writeTarget.isExtensionMember) {
- if (forEffect) {
- write = new StaticInvocation(
- writeTarget.member,
- new Arguments(<Expression>[receiver, value],
- types: writeTarget.inferredExtensionTypeArguments)
- ..fileOffset = fileOffset)
- ..fileOffset = fileOffset;
- } else {
- VariableDeclaration valueVariable = createVariable(value, valueType);
- VariableDeclaration assignmentVariable = createVariable(
- new StaticInvocation(
- writeTarget.member,
- new Arguments(
- <Expression>[receiver, createVariableGet(valueVariable)],
- types: writeTarget.inferredExtensionTypeArguments)
- ..fileOffset = fileOffset)
- ..fileOffset = fileOffset,
- const VoidType());
- write = createLet(valueVariable,
- createLet(assignmentVariable, createVariableGet(valueVariable)))
- ..fileOffset = fileOffset;
- }
- } else {
- write = new PropertySet(receiver, propertyName, value, writeTarget.member)
- ..fileOffset = fileOffset;
+ switch (writeTarget.kind) {
+ case ObjectAccessTargetKind.missing:
+ write = inferrer.createMissingPropertySet(
+ fileOffset, receiver, receiverType, propertyName, value,
+ forEffect: forEffect);
+ break;
+ case ObjectAccessTargetKind.ambiguous:
+ write = inferrer.createMissingPropertySet(
+ fileOffset, receiver, receiverType, propertyName, value,
+ forEffect: forEffect,
+ extensionAccessCandidates: writeTarget.candidates);
+ break;
+ case ObjectAccessTargetKind.extensionMember:
+ if (forEffect) {
+ write = new StaticInvocation(
+ writeTarget.member,
+ new Arguments(<Expression>[receiver, value],
+ types: writeTarget.inferredExtensionTypeArguments)
+ ..fileOffset = fileOffset)
+ ..fileOffset = fileOffset;
+ } else {
+ VariableDeclaration valueVariable = createVariable(value, valueType);
+ VariableDeclaration assignmentVariable = createVariable(
+ new StaticInvocation(
+ writeTarget.member,
+ new Arguments(
+ <Expression>[receiver, createVariableGet(valueVariable)],
+ types: writeTarget.inferredExtensionTypeArguments)
+ ..fileOffset = fileOffset)
+ ..fileOffset = fileOffset,
+ const VoidType());
+ write = createLet(valueVariable,
+ createLet(assignmentVariable, createVariableGet(valueVariable)))
+ ..fileOffset = fileOffset;
+ }
+ break;
+ case ObjectAccessTargetKind.instanceMember:
+ case ObjectAccessTargetKind.invalid:
+ case ObjectAccessTargetKind.unresolved:
+ case ObjectAccessTargetKind.callFunction:
+ case ObjectAccessTargetKind.dynamic:
+ case ObjectAccessTargetKind.never:
+ write =
+ new PropertySet(receiver, propertyName, value, writeTarget.member)
+ ..fileOffset = fileOffset;
+ break;
}
- if (inferrer.isNonNullableByDefault) {
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
if (receiverType is! DynamicType &&
isPotentiallyNullable(
receiverType, inferrer.coreTypes.futureOrClass)) {
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.helper.addProblem(
- templateNullablePropertyAccessWarning.withArguments(
- propertyName.name,
- receiverType,
- inferrer.isNonNullableByDefault),
- write.fileOffset,
- propertyName.name.length);
- } else {
- return inferrer.helper.wrapInProblem(
- write,
- templateNullablePropertyAccessError.withArguments(
- propertyName.name,
- receiverType,
- inferrer.isNonNullableByDefault),
- write.fileOffset,
- propertyName.name.length);
- }
+ return inferrer.helper.wrapInProblem(
+ write,
+ templateNullablePropertyAccessError.withArguments(propertyName.name,
+ receiverType, inferrer.isNonNullableByDefault),
+ write.fileOffset,
+ propertyName.name.length);
}
}
@@ -4430,7 +4423,6 @@
}
Expression write;
-
if (writeTarget.isMissing) {
write = inferrer.createMissingSuperIndexSet(
node.writeOffset, writeIndex, valueExpression);
@@ -4572,7 +4564,7 @@
: const ObjectAccessTarget.missing();
DartType writeIndexType =
- inferrer.getIndexSetValueType(writeTarget, receiverType);
+ inferrer.getIndexKeyType(writeTarget, receiverType);
Expression writeIndex = createVariableGet(indexVariable);
writeIndex = inferrer.ensureAssignable(
writeIndexType, indexResult.inferredType, writeIndex);
@@ -5159,6 +5151,14 @@
isVoidAllowed: false);
node.expression = expressionResult.expression..parent = node;
DartType expressionType = expressionResult.inferredType;
+
+ Set<Field> enumFields;
+ if (expressionType is InterfaceType && expressionType.classNode.isEnum) {
+ enumFields = expressionType.classNode.fields
+ .where((Field field) => field.isConst && field.type == expressionType)
+ .toSet();
+ }
+
inferrer.flowAnalysis.switchStatement_expressionEnd(node);
bool hasDefault = false;
@@ -5175,41 +5175,46 @@
Expression caseExpression = caseExpressionResult.expression;
switchCase.expressions[index] = caseExpression..parent = switchCase;
DartType caseExpressionType = caseExpressionResult.inferredType;
+ if (enumFields != null && caseExpression is StaticGet) {
+ enumFields.remove(caseExpression.target);
+ }
- if (inferrer.library.isNonNullableByDefault) {
- if (!inferrer.typeSchemaEnvironment.isSubtypeOf(caseExpressionType,
- expressionType, SubtypeCheckMode.withNullabilities)) {
- inferrer.helper.addProblem(
- templateSwitchExpressionNotSubtype.withArguments(
- caseExpressionType,
- expressionType,
- inferrer.isNonNullableByDefault),
- caseExpression.fileOffset,
- noLength,
- context: [
- messageSwitchExpressionNotAssignableCause.withLocation(
- inferrer.uriForInstrumentation,
- node.expression.fileOffset,
- noLength)
- ]);
- }
- } else {
- // Check whether the expression type is assignable to the case
- // expression type.
- if (!inferrer.isAssignable(expressionType, caseExpressionType)) {
- inferrer.helper.addProblem(
- templateSwitchExpressionNotAssignable.withArguments(
- expressionType,
- caseExpressionType,
- inferrer.isNonNullableByDefault),
- caseExpression.fileOffset,
- noLength,
- context: [
- messageSwitchExpressionNotAssignableCause.withLocation(
- inferrer.uriForInstrumentation,
- node.expression.fileOffset,
- noLength)
- ]);
+ if (!inferrer.isTopLevel) {
+ if (inferrer.library.isNonNullableByDefault) {
+ if (!inferrer.typeSchemaEnvironment.isSubtypeOf(caseExpressionType,
+ expressionType, SubtypeCheckMode.withNullabilities)) {
+ inferrer.helper.addProblem(
+ templateSwitchExpressionNotSubtype.withArguments(
+ caseExpressionType,
+ expressionType,
+ inferrer.isNonNullableByDefault),
+ caseExpression.fileOffset,
+ noLength,
+ context: [
+ messageSwitchExpressionNotAssignableCause.withLocation(
+ inferrer.uriForInstrumentation,
+ node.expression.fileOffset,
+ noLength)
+ ]);
+ }
+ } else {
+ // Check whether the expression type is assignable to the case
+ // expression type.
+ if (!inferrer.isAssignable(expressionType, caseExpressionType)) {
+ inferrer.helper.addProblem(
+ templateSwitchExpressionNotAssignable.withArguments(
+ expressionType,
+ caseExpressionType,
+ inferrer.isNonNullableByDefault),
+ caseExpression.fileOffset,
+ noLength,
+ context: [
+ messageSwitchExpressionNotAssignableCause.withLocation(
+ inferrer.uriForInstrumentation,
+ node.expression.fileOffset,
+ noLength)
+ ]);
+ }
}
}
}
@@ -5219,7 +5224,7 @@
switchCase.body = bodyResult.statement..parent = switchCase;
}
- if (inferrer.isNonNullableByDefault) {
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
// The last case block is allowed to complete normally.
if (caseIndex < node.cases.length - 1 &&
inferrer.flowAnalysis.isReachable) {
@@ -5228,7 +5233,9 @@
}
}
}
- inferrer.flowAnalysis.switchStatement_end(hasDefault);
+ bool isExhaustive =
+ hasDefault || (enumFields != null && enumFields.isEmpty);
+ inferrer.flowAnalysis.switchStatement_end(isExhaustive);
return const StatementInferenceResult();
}
@@ -5252,26 +5259,18 @@
isVoidAllowed: false);
node.expression = expressionResult.expression..parent = node;
inferrer.flowAnalysis.handleExit();
- if (inferrer.isNonNullableByDefault) {
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
if (!inferrer.isAssignable(
inferrer.typeSchemaEnvironment.objectNonNullableRawType,
expressionResult.inferredType,
isStrongNullabilityMode: true)) {
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.helper.addProblem(
- templateThrowingNotAssignableToObjectWarning.withArguments(
- expressionResult.inferredType, true),
- node.expression.fileOffset,
- noLength);
- } else {
- return new ExpressionInferenceResult(
- const DynamicType(),
- inferrer.helper.buildProblem(
- templateThrowingNotAssignableToObjectError.withArguments(
- expressionResult.inferredType, true),
- node.expression.fileOffset,
- noLength));
- }
+ return new ExpressionInferenceResult(
+ const DynamicType(),
+ inferrer.helper.buildProblem(
+ templateThrowingNotAssignableToObjectError.withArguments(
+ expressionResult.inferredType, true),
+ node.expression.fileOffset,
+ noLength));
}
}
// Return BottomType in legacy mode for compatibility.
@@ -5352,26 +5351,54 @@
ExpressionInferenceResult visitVariableSet(
VariableSet node, DartType typeContext) {
VariableDeclarationImpl variable = node.variable;
- DartType writeContext = variable.type;
+ bool isDefinitelyAssigned = false;
+ if (inferrer.isNonNullableByDefault) {
+ isDefinitelyAssigned = inferrer.flowAnalysis.isAssigned(variable);
+ }
+ DartType declaredOrInferredType = variable.lateType ?? variable.type;
+ DartType writeContext = declaredOrInferredType;
ExpressionInferenceResult rhsResult = inferrer.inferExpression(
node.value, writeContext ?? const UnknownType(), true,
isVoidAllowed: true);
Expression rhs = inferrer.ensureAssignableResult(writeContext, rhsResult,
fileOffset: node.fileOffset, isVoidAllowed: writeContext is VoidType);
inferrer.flowAnalysis.write(variable, rhsResult.inferredType);
+ DartType resultType = rhsResult.inferredType;
+ Expression resultExpression;
if (variable.lateSetter != null) {
- return new ExpressionInferenceResult(
- rhsResult.inferredType,
- new MethodInvocation(
- new VariableGet(variable.lateSetter)
- ..fileOffset = node.fileOffset,
- callName,
- new Arguments(<Expression>[rhs])..fileOffset = node.fileOffset)
- ..fileOffset = node.fileOffset);
+ resultExpression = new MethodInvocation(
+ new VariableGet(variable.lateSetter)..fileOffset = node.fileOffset,
+ callName,
+ new Arguments(<Expression>[rhs])..fileOffset = node.fileOffset)
+ ..fileOffset = node.fileOffset;
} else {
node.value = rhs..parent = node;
- return new ExpressionInferenceResult(rhsResult.inferredType, node);
+ resultExpression = node;
}
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
+ // Synthetic variables, local functions, and variables with
+ // invalid types aren't checked.
+ if (variable.name != null &&
+ !variable.isLocalFunction &&
+ declaredOrInferredType is! InvalidType) {
+ if ((variable.isLate && variable.isFinal) ||
+ variable.isLateFinalWithoutInitializer) {
+ if (isDefinitelyAssigned &&
+ isPotentiallyNonNullable(
+ declaredOrInferredType, inferrer.coreTypes.futureOrClass)) {
+ return new ExpressionInferenceResult(
+ resultType,
+ inferrer.helper.wrapInProblem(
+ resultExpression,
+ templateNonNullableLateDefinitelyAssignedError
+ .withArguments(node.variable.name),
+ node.fileOffset,
+ node.variable.name.length));
+ }
+ }
+ }
+ }
+ return new ExpressionInferenceResult(resultType, resultExpression);
}
@override
@@ -5477,6 +5504,8 @@
result.add(getter);
if (!node.isFinal || node.initializer == null) {
+ node.isLateFinalWithoutInitializer =
+ node.isFinal && node.initializer == null;
VariableDeclaration setVariable =
new VariableDeclaration('#${node.name}#set')
..fileOffset = fileOffset;
@@ -5530,46 +5559,6 @@
ExpressionInferenceResult visitVariableGet(
covariant VariableGetImpl node, DartType typeContext) {
VariableDeclarationImpl variable = node.variable;
- bool isUnassigned = !inferrer.flowAnalysis.isAssigned(variable);
- if (isUnassigned) {
- inferrer.dataForTesting?.flowAnalysisResult?.unassignedNodes?.add(node);
- if (inferrer.isNonNullableByDefault) {
- // Synthetic variables, local functions, and variables with
- // invalid types aren't checked.
- // TODO(dmitryas): Report errors on definitely unassigned late
- // local variables with potentially non-nullable types.
- if (variable.name != null &&
- !variable.isLocalFunction &&
- variable.type is! InvalidType &&
- isPotentiallyNonNullable(
- variable.type, inferrer.coreTypes.futureOrClass) &&
- !variable.isLate) {
- if (inferrer.nnbdMode == NnbdMode.Weak) {
- inferrer.library.addProblem(
- templateNonNullableNotAssignedWarning
- .withArguments(node.variable.name),
- node.fileOffset,
- node.variable.name.length,
- inferrer.helper.uri);
- } else {
- return new ExpressionInferenceResult(
- new InvalidType(),
- inferrer.helper.wrapInProblem(
- node,
- templateNonNullableNotAssignedError
- .withArguments(node.variable.name),
- node.fileOffset,
- node.variable.name.length));
- }
- }
- }
- }
-
- if (inferrer.flowAnalysis.isUnassigned(variable)) {
- inferrer.dataForTesting?.flowAnalysisResult?.definitelyUnassignedNodes
- ?.add(node);
- }
-
DartType promotedType;
DartType declaredOrInferredType = variable.lateType ?? variable.type;
if (inferrer.isNonNullableByDefault) {
@@ -5595,21 +5584,67 @@
new InstrumentationValueForType(promotedType));
}
node.promotedType = promotedType;
- DartType type = promotedType ?? declaredOrInferredType;
+ DartType resultType = promotedType ?? declaredOrInferredType;
+ Expression resultExpression;
if (variable.isLocalFunction) {
- return inferrer.instantiateTearOff(type, typeContext, node);
+ return inferrer.instantiateTearOff(resultType, typeContext, node);
} else if (variable.lateGetter != null) {
- return new ExpressionInferenceResult(
- type,
- new MethodInvocation(
- new VariableGet(variable.lateGetter)
- ..fileOffset = node.fileOffset,
- callName,
- new Arguments(<Expression>[])..fileOffset = node.fileOffset)
- ..fileOffset = node.fileOffset);
+ resultExpression = new MethodInvocation(
+ new VariableGet(variable.lateGetter)..fileOffset = node.fileOffset,
+ callName,
+ new Arguments(<Expression>[])..fileOffset = node.fileOffset)
+ ..fileOffset = node.fileOffset;
} else {
- return new ExpressionInferenceResult(type, node);
+ resultExpression = node;
}
+ if (!inferrer.isTopLevel) {
+ bool isUnassigned = !inferrer.flowAnalysis.isAssigned(variable);
+ if (isUnassigned) {
+ inferrer.dataForTesting?.flowAnalysisResult?.unassignedNodes?.add(node);
+ }
+ bool isDefinitelyUnassigned =
+ inferrer.flowAnalysis.isUnassigned(variable);
+ if (isDefinitelyUnassigned) {
+ inferrer.dataForTesting?.flowAnalysisResult?.definitelyUnassignedNodes
+ ?.add(node);
+ }
+ if (inferrer.isNonNullableByDefault) {
+ // Synthetic variables, local functions, and variables with
+ // invalid types aren't checked.
+ if (variable.name != null &&
+ !variable.isLocalFunction &&
+ declaredOrInferredType is! InvalidType) {
+ if (variable.isLate || variable.lateGetter != null) {
+ if (isDefinitelyUnassigned &&
+ isPotentiallyNonNullable(
+ declaredOrInferredType, inferrer.coreTypes.futureOrClass)) {
+ return new ExpressionInferenceResult(
+ resultType,
+ inferrer.helper.wrapInProblem(
+ resultExpression,
+ templateNonNullableLateDefinitelyUnassignedError
+ .withArguments(node.variable.name),
+ node.fileOffset,
+ node.variable.name.length));
+ }
+ } else {
+ if (isUnassigned &&
+ isPotentiallyNonNullable(
+ declaredOrInferredType, inferrer.coreTypes.futureOrClass)) {
+ return new ExpressionInferenceResult(
+ resultType,
+ inferrer.helper.wrapInProblem(
+ resultExpression,
+ templateNonNullableNotAssignedError
+ .withArguments(node.variable.name),
+ node.fileOffset,
+ node.variable.name.length));
+ }
+ }
+ }
+ }
+ }
+ return new ExpressionInferenceResult(resultType, resultExpression);
}
@override
@@ -5662,7 +5697,7 @@
ExpressionInferenceResult visitLoadLibrary(
covariant LoadLibraryImpl node, DartType typeContext) {
DartType inferredType = inferrer.typeSchemaEnvironment
- .futureType(const DynamicType(), inferrer.library.nullable);
+ .futureType(const DynamicType(), inferrer.library.nonNullable);
if (node.arguments != null) {
FunctionType calleeType =
new FunctionType([], inferredType, inferrer.library.nonNullable);
@@ -5677,7 +5712,7 @@
DartType inferredType = new FunctionType(
[],
inferrer.typeSchemaEnvironment
- .futureType(const DynamicType(), inferrer.library.nullable),
+ .futureType(const DynamicType(), inferrer.library.nonNullable),
inferrer.library.nonNullable);
Expression replacement = new StaticGet(node.target)
..fileOffset = node.fileOffset;
@@ -5794,7 +5829,7 @@
void reportNonNullableInNullAwareWarningIfNeeded(
DartType operandType, String operationName, int offset) {
- if (inferrer.isNonNullableByDefault) {
+ if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
if (operandType is! InvalidType &&
!isPotentiallyNullable(
operandType, inferrer.coreTypes.futureOrClass)) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 2272377..f74b9ed 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -21,7 +21,7 @@
import 'dart:core' hide MapEntry;
import 'package:kernel/ast.dart';
-import 'package:kernel/text/ast_to_text.dart';
+import 'package:kernel/text/ast_to_text.dart' show Precedence, Printer;
import 'package:kernel/core_types.dart';
import '../fasta_codes.dart'
@@ -272,6 +272,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ForInStatementWithSynthesizedVariable()";
+ }
}
class TryStatement extends InternalStatement {
@@ -309,6 +314,11 @@
finallyBlock?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "TryStatement()";
+ }
}
class SwitchCaseImpl extends SwitchCase {
@@ -319,6 +329,11 @@
{bool isDefault: false, this.hasLabel})
: assert(hasLabel != null),
super(expressions, expressionOffsets, body, isDefault: isDefault);
+
+ @override
+ String toString() {
+ return "SwitchCaseImpl()";
+ }
}
class BreakStatementImpl extends BreakStatement {
@@ -328,6 +343,11 @@
BreakStatementImpl({this.isContinue})
: assert(isContinue != null),
super(null);
+
+ @override
+ String toString() {
+ return "BreakStatementImpl()";
+ }
}
enum InternalExpressionKind {
@@ -455,6 +475,11 @@
arguments.types.clear();
arguments._explicitTypeArgumentCount = 0;
}
+
+ @override
+ String toString() {
+ return "ArgumentsImpl()";
+ }
}
/// Internal expression representing a cascade expression.
@@ -517,6 +542,11 @@
}
transformList(expressions, v, this);
}
+
+ @override
+ String toString() {
+ return "Cascade()";
+ }
}
/// Internal expression representing a deferred check.
@@ -556,6 +586,11 @@
expression?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "DeferredCheck()";
+ }
}
/// Common base class for shadow objects representing expressions in kernel
@@ -583,6 +618,11 @@
InferenceVisitor visitor, DartType typeContext) {
return visitor.visitFactoryConstructorInvocationJudgment(this, typeContext);
}
+
+ @override
+ String toString() {
+ return "FactoryConstructorInvocationJudgment()";
+ }
}
/// Front end specific implementation of [FunctionDeclaration].
@@ -597,6 +637,11 @@
FunctionDeclarationImpl declaration, bool hasImplicitReturnType) {
declaration.hasImplicitReturnType = hasImplicitReturnType;
}
+
+ @override
+ String toString() {
+ return "FunctionDeclarationImpl()";
+ }
}
/// Concrete shadow object representing a super initializer in kernel form.
@@ -613,6 +658,11 @@
void acceptInference(InferenceVisitor visitor) {
return visitor.visitInvalidSuperInitializerJudgment(this);
}
+
+ @override
+ String toString() {
+ return "InvalidSuperInitializerJudgment()";
+ }
}
/// Internal expression representing an if-null expression.
@@ -656,6 +706,11 @@
right?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IfNullExpression()";
+ }
}
/// Common base class for shadow objects representing initializers in kernel
@@ -704,6 +759,11 @@
InferenceVisitor visitor, DartType typeContext) {
return visitor.visitIntJudgment(this, typeContext);
}
+
+ @override
+ String toString() {
+ return "IntJudgment()";
+ }
}
class ShadowLargeIntLiteral extends IntLiteral implements ExpressionJudgment {
@@ -733,6 +793,11 @@
InferenceVisitor visitor, DartType typeContext) {
return visitor.visitShadowLargeIntLiteral(this, typeContext);
}
+
+ @override
+ String toString() {
+ return "ShadowLargeIntLiteral()";
+ }
}
/// Concrete shadow object representing an invalid initializer in kernel form.
@@ -744,6 +809,11 @@
void acceptInference(InferenceVisitor visitor) {
return visitor.visitShadowInvalidInitializer(this);
}
+
+ @override
+ String toString() {
+ return "ShadowInvalidInitializer()";
+ }
}
/// Concrete shadow object representing an invalid initializer in kernel form.
@@ -762,6 +832,11 @@
void acceptInference(InferenceVisitor visitor) {
return visitor.visitShadowInvalidFieldInitializer(this);
}
+
+ @override
+ String toString() {
+ return "ShadowInvalidFieldInitializer()";
+ }
}
class ExpressionInvocation extends InternalExpression {
@@ -800,6 +875,11 @@
arguments?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ExpressionInvocation()";
+ }
}
/// Concrete shadow object representing a named function expression.
@@ -821,6 +901,11 @@
InferenceVisitor visitor, DartType typeContext) {
return visitor.visitNamedFunctionExpressionJudgment(this, typeContext);
}
+
+ @override
+ String toString() {
+ return "NamedFunctionExpressionJudgment()";
+ }
}
/// Internal expression representing a null-aware method invocation.
@@ -868,6 +953,11 @@
invocation?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "NullAwareMethodInvocation()";
+ }
}
/// Internal expression representing a null-aware read from a property.
@@ -915,6 +1005,11 @@
read?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "NullAwarePropertyGet()";
+ }
}
/// Internal expression representing a null-aware read from a property.
@@ -962,6 +1057,11 @@
write?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "NullAwarePropertySet()";
+ }
}
/// Front end specific implementation of [ReturnStatement].
@@ -970,6 +1070,11 @@
ReturnStatementImpl(this.isArrow, [Expression expression])
: super(expression);
+
+ @override
+ String toString() {
+ return "ReturnStatementImpl()";
+ }
}
/// Concrete implementation of [TypePromoter] specialized to work with kernel
@@ -1129,6 +1234,12 @@
// lowering is enabled.
VariableDeclaration lateSetter;
+ // Is `true` if this a lowered late final variable without an initializer.
+ //
+ // This is set in `InferenceVisitor.visitVariableDeclaration` when late
+ // lowering is enabled.
+ bool isLateFinalWithoutInitializer = false;
+
// The original type (declared or inferred) of a lowered late variable.
//
// This is set in `InferenceVisitor.visitVariableDeclaration` when late
@@ -1150,6 +1261,11 @@
{this.forNullGuardedAccess})
: assert(forNullGuardedAccess != null),
super(variable);
+
+ @override
+ String toString() {
+ return "VariableGetImpl()";
+ }
}
/// Front end specific implementation of [LoadLibrary].
@@ -1157,6 +1273,11 @@
final Arguments arguments;
LoadLibraryImpl(LibraryDependency import, this.arguments) : super(import);
+
+ @override
+ String toString() {
+ return "LoadLibraryImpl()";
+ }
}
/// Internal expression representing a tear-off of a `loadLibrary` function.
@@ -1190,6 +1311,11 @@
target = target.accept<TreeNode>(v);
}
}
+
+ @override
+ String toString() {
+ return "LoadLibraryTearOff()";
+ }
}
/// Internal expression representing an if-null property set.
@@ -1254,6 +1380,11 @@
write?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IfNullPropertySet()";
+ }
}
/// Internal expression representing an if-null assignment.
@@ -1309,6 +1440,11 @@
write?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IfNullSet()";
+ }
}
/// Internal expression representing an compound extension assignment.
@@ -1426,6 +1562,11 @@
rhs?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "CompoundExtensionSet()";
+ }
}
/// Internal expression representing an compound property assignment.
@@ -1510,6 +1651,11 @@
rhs?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "CompoundPropertySet()";
+ }
}
/// Internal expression representing an compound property assignment.
@@ -1570,6 +1716,11 @@
write?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "PropertyPostIncDec()";
+ }
}
/// Internal expression representing an local variable post inc/dec expression.
@@ -1618,6 +1769,11 @@
write?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "LocalPostIncDec()";
+ }
}
/// Internal expression representing an static member post inc/dec expression.
@@ -1666,6 +1822,11 @@
write?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "StaticPostIncDec()";
+ }
}
/// Internal expression representing an static member post inc/dec expression.
@@ -1714,6 +1875,11 @@
write?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "SuperPostIncDec()";
+ }
}
/// Internal expression representing an index get expression.
@@ -1755,6 +1921,11 @@
index?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IndexGet()";
+ }
}
/// Internal expression representing an index set expression.
@@ -1824,6 +1995,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IndexSet()";
+ }
}
/// Internal expression representing a super index set expression.
@@ -1880,6 +2056,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "SuperIndexSet()";
+ }
}
/// Internal expression representing an extension index set expression.
@@ -1960,6 +2141,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ExtensionIndexSet()";
+ }
}
/// Internal expression representing an if-null index assignment.
@@ -2057,6 +2243,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IfNullIndexSet()";
+ }
}
/// Internal expression representing an if-null super index set expression.
@@ -2139,6 +2330,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IfNullSuperIndexSet()";
+ }
}
/// Internal expression representing an if-null super index set expression.
@@ -2247,6 +2443,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IfNullExtensionIndexSet()";
+ }
}
/// Internal expression representing a compound index assignment.
@@ -2340,6 +2541,11 @@
rhs?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "CompoundIndexSet()";
+ }
}
/// Internal expression representing a null-aware compound assignment.
@@ -2447,6 +2653,11 @@
rhs?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "NullAwareCompoundSet()";
+ }
}
/// Internal expression representing an null-aware if-null property set.
@@ -2529,6 +2740,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "NullAwareIfNullSet()";
+ }
}
/// Internal expression representing a compound super index assignment.
@@ -2615,6 +2831,11 @@
rhs?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "CompoundSuperIndexSet()";
+ }
}
/// Internal expression representing a compound extension index assignment.
@@ -2738,6 +2959,11 @@
rhs?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "CompoundExtensionIndexSet()";
+ }
}
/// Internal expression representing an assignment to an extension setter.
@@ -2820,6 +3046,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ExtensionSet()";
+ }
}
/// Internal expression representing an null-aware extension expression.
@@ -2866,6 +3097,11 @@
expression?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "NullAwareExtension()";
+ }
}
/// Front end specific implementation of [PropertySet].
@@ -2881,6 +3117,11 @@
{Member interfaceTarget, this.forEffect, this.readOnlyReceiver})
: assert(forEffect != null),
super(receiver, name, value, interfaceTarget);
+
+ @override
+ String toString() {
+ return "PropertySetImpl()";
+ }
}
/// Internal representation of a read of an extension instance member.
@@ -2927,6 +3168,11 @@
arguments?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ExtensionTearOff()";
+ }
}
/// Internal expression for an equals or not-equals expression.
@@ -2967,6 +3213,11 @@
right?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "EqualsExpression()";
+ }
}
/// Internal expression for a binary expression.
@@ -3006,6 +3257,11 @@
right?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "BinaryExpression()";
+ }
}
/// Internal expression for a unary expression.
@@ -3038,6 +3294,11 @@
expression?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "UnaryExpression()";
+ }
}
/// Internal expression for a parenthesized expression.
@@ -3069,6 +3330,11 @@
expression?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ParenthesizedExpression()";
+ }
}
/// Creates a [Let] of [variable] with the given [body] using
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index b8f1156..4544f76 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -92,15 +92,12 @@
FormattedMessage,
messageConstConstructorLateFinalFieldCause,
messageConstConstructorLateFinalFieldError,
- messageConstConstructorLateFinalFieldWarning,
messageConstConstructorNonFinalField,
messageConstConstructorNonFinalFieldCause,
messageConstConstructorRedirectionToNonConst,
noLength,
templateFieldNonNullableNotInitializedByConstructorError,
- templateFieldNonNullableNotInitializedByConstructorWarning,
templateFieldNonNullableWithoutInitializerError,
- templateFieldNonNullableWithoutInitializerWarning,
templateFinalFieldNotInitialized,
templateFinalFieldNotInitializedByConstructor,
templateInferredPackageUri,
@@ -154,9 +151,12 @@
new NamedTypeBuilder("Object", const NullabilityBuilder.omitted(), null);
// Null is always nullable.
- final TypeBuilder bottomType =
+ final TypeBuilder nullType =
new NamedTypeBuilder("Null", const NullabilityBuilder.nullable(), null);
+ final TypeBuilder bottomType =
+ new NamedTypeBuilder("Never", const NullabilityBuilder.omitted(), null);
+
final bool excludeSource = !CompilerContext.current.options.embedSourceText;
final Map<String, String> environmentDefines =
@@ -278,11 +278,11 @@
cls.implementedTypes.clear();
cls.supertype = null;
cls.mixedInType = null;
- builder.supertype =
+ builder.supertypeBuilder =
new NamedTypeBuilder("Object", const NullabilityBuilder.omitted(), null)
..bind(objectClassBuilder);
- builder.interfaces = null;
- builder.mixedInType = null;
+ builder.interfaceBuilders = null;
+ builder.mixedInTypeBuilder = null;
}
@override
@@ -294,12 +294,15 @@
loader.coreLibrary.becomeCoreLibrary();
dynamicType.bind(
loader.coreLibrary.lookupLocalMember("dynamic", required: true));
+ bottomType
+ .bind(loader.coreLibrary.lookupLocalMember("Never", required: true));
loader.resolveParts();
loader.computeLibraryScopes();
setupTopAndBottomTypes();
loader.resolveTypes();
loader.computeVariances();
- loader.computeDefaultTypes(dynamicType, bottomType, objectClassBuilder);
+ loader.computeDefaultTypes(
+ dynamicType, nullType, bottomType, objectClassBuilder);
List<SourceClassBuilder> myClasses =
loader.checkSemantics(objectClassBuilder);
loader.finishTypeVariables(objectClassBuilder, dynamicType);
@@ -420,12 +423,12 @@
Class cls = declaration.cls;
if (cls != objectClass) {
cls.supertype ??= objectClass.asRawSupertype;
- declaration.supertype ??= new NamedTypeBuilder(
+ declaration.supertypeBuilder ??= new NamedTypeBuilder(
"Object", const NullabilityBuilder.omitted(), null)
..bind(objectClassBuilder);
}
if (declaration.isMixinApplication) {
- cls.mixedInType = declaration.mixedInType.buildMixedInType(
+ cls.mixedInType = declaration.mixedInTypeBuilder.buildMixedInType(
library, declaration.charOffset, declaration.fileUri);
}
}
@@ -514,7 +517,7 @@
/// >that is accessible to LM , C has an implicitly declared constructor
/// >named q'i = [C/S]qi of the form q'i(ai1,...,aiki) :
/// >super(ai1,...,aiki);.
- TypeBuilder type = builder.supertype;
+ TypeBuilder type = builder.supertypeBuilder;
TypeDeclarationBuilder supertype;
if (type is NamedTypeBuilder) {
supertype = type.declaration;
@@ -671,7 +674,7 @@
ClassBuilder nullClassBuilder =
loader.coreLibrary.lookupLocalMember("Null", required: true);
nullClassBuilder.isNullClass = true;
- bottomType.bind(nullClassBuilder);
+ nullType.bind(nullClassBuilder);
}
void computeCoreTypes() {
@@ -864,23 +867,13 @@
SourceLibraryBuilder library = builder.library;
if (library.isNonNullableByDefault) {
if (constructor.isConst && lateFinalFields.isNotEmpty) {
- if (library.loader.nnbdMode == NnbdMode.Weak) {
- builder.addProblem(messageConstConstructorLateFinalFieldWarning,
- constructor.fileOffset, noLength,
- context: lateFinalFields
- .map((field) => messageConstConstructorLateFinalFieldCause
- .withLocation(
- field.fileUri, field.charOffset, noLength))
- .toList());
- } else {
- builder.addProblem(messageConstConstructorLateFinalFieldError,
- constructor.fileOffset, noLength,
- context: lateFinalFields
- .map((field) => messageConstConstructorLateFinalFieldCause
- .withLocation(
- field.fileUri, field.charOffset, noLength))
- .toList());
- }
+ builder.addProblem(messageConstConstructorLateFinalFieldError,
+ constructor.fileOffset, noLength,
+ context: lateFinalFields
+ .map((field) =>
+ messageConstConstructorLateFinalFieldCause.withLocation(
+ field.fileUri, field.charOffset, noLength))
+ .toList());
lateFinalFields.clear();
}
}
@@ -950,27 +943,14 @@
(cls.constructors.isNotEmpty || cls.isMixinDeclaration)) {
SourceLibraryBuilder library = builder.library;
if (library.isNonNullableByDefault) {
- if (library.loader.nnbdMode == NnbdMode.Weak) {
- library.addProblem(
- templateFieldNonNullableWithoutInitializerWarning
- .withArguments(
- fieldBuilder.name,
- fieldBuilder.field.type,
- library.isNonNullableByDefault),
- fieldBuilder.charOffset,
- fieldBuilder.name.length,
- fieldBuilder.fileUri);
- } else {
- library.addProblem(
- templateFieldNonNullableWithoutInitializerError
- .withArguments(
- fieldBuilder.name,
- fieldBuilder.field.type,
- library.isNonNullableByDefault),
- fieldBuilder.charOffset,
- fieldBuilder.name.length,
- fieldBuilder.fileUri);
- }
+ library.addProblem(
+ templateFieldNonNullableWithoutInitializerError.withArguments(
+ fieldBuilder.name,
+ fieldBuilder.field.type,
+ library.isNonNullableByDefault),
+ fieldBuilder.charOffset,
+ fieldBuilder.name.length,
+ fieldBuilder.fileUri);
}
}
}
@@ -1008,27 +988,13 @@
fieldBuilder.field.type, loader.coreTypes.futureOrClass)) {
SourceLibraryBuilder library = builder.library;
if (library.isNonNullableByDefault) {
- if (library.loader.nnbdMode == NnbdMode.Weak) {
- library.addProblem(
- templateFieldNonNullableNotInitializedByConstructorWarning
- .withArguments(
- fieldBuilder.name,
- fieldBuilder.field.type,
- library.isNonNullableByDefault),
- fieldBuilder.charOffset,
- fieldBuilder.name.length,
- fieldBuilder.fileUri);
- } else {
- library.addProblem(
- templateFieldNonNullableNotInitializedByConstructorError
- .withArguments(
- fieldBuilder.name,
- fieldBuilder.field.type,
- library.isNonNullableByDefault),
- fieldBuilder.charOffset,
- fieldBuilder.name.length,
- fieldBuilder.fileUri);
- }
+ library.addProblem(
+ templateFieldNonNullableNotInitializedByConstructorError
+ .withArguments(fieldBuilder.name, fieldBuilder.field.type,
+ library.isNonNullableByDefault),
+ fieldBuilder.charOffset,
+ fieldBuilder.name.length,
+ fieldBuilder.fileUri);
}
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index 6b88bcd..ed0ca4a9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -129,6 +129,11 @@
}
return result;
}
+
+ @override
+ String toString() {
+ return "RedirectingFactoryBody()";
+ }
}
bool isRedirectingFactory(Member member, {EnsureLoaded helper}) {
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 43d78d8..90341d9 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -26,8 +26,6 @@
import 'package:kernel/ast.dart'
show InvalidType, Nullability, ProcedureKind, Variance;
-import '../../base/nnbd_mode.dart';
-
import '../builder/constructor_reference_builder.dart';
import '../builder/enum_builder.dart';
import '../builder/fixed_type_builder.dart';
@@ -585,42 +583,24 @@
if (supertypeForErrors != null) {
if (supertypeForErrors.nullabilityBuilder.build(libraryBuilder) ==
Nullability.nullable) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- libraryBuilder.addProblem(
- templateNullableSuperclassWarning
- .withArguments(supertypeForErrors.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- } else {
- libraryBuilder.addProblem(
- templateNullableSuperclassError
- .withArguments(supertypeForErrors.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- }
+ libraryBuilder.addProblem(
+ templateNullableSuperclassError
+ .withArguments(supertypeForErrors.fullNameForErrors),
+ nameOffset,
+ classNameForErrors.length,
+ uri);
}
}
if (mixins != null) {
for (TypeBuilder mixin in mixins) {
if (mixin.nullabilityBuilder.build(libraryBuilder) ==
Nullability.nullable) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- libraryBuilder.addProblem(
- templateNullableMixinWarning
- .withArguments(mixin.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- } else {
- libraryBuilder.addProblem(
- templateNullableMixinError
- .withArguments(mixin.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- }
+ libraryBuilder.addProblem(
+ templateNullableMixinError
+ .withArguments(mixin.fullNameForErrors),
+ nameOffset,
+ classNameForErrors.length,
+ uri);
}
}
}
@@ -628,21 +608,12 @@
for (TypeBuilder interface in interfaces) {
if (interface.nullabilityBuilder.build(libraryBuilder) ==
Nullability.nullable) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- libraryBuilder.addProblem(
- templateNullableInterfaceWarning
- .withArguments(interface.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- } else {
- libraryBuilder.addProblem(
- templateNullableInterfaceError
- .withArguments(interface.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- }
+ libraryBuilder.addProblem(
+ templateNullableInterfaceError
+ .withArguments(interface.fullNameForErrors),
+ nameOffset,
+ classNameForErrors.length,
+ uri);
}
}
}
@@ -702,21 +673,12 @@
for (TypeBuilder supertype in supertypeConstraints) {
if (supertype.nullabilityBuilder.build(libraryBuilder) ==
Nullability.nullable) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- libraryBuilder.addProblem(
- templateNullableSuperclassWarning
- .withArguments(supertype.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- } else {
- libraryBuilder.addProblem(
- templateNullableSuperclassError
- .withArguments(supertype.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- }
+ libraryBuilder.addProblem(
+ templateNullableSuperclassError
+ .withArguments(supertype.fullNameForErrors),
+ nameOffset,
+ classNameForErrors.length,
+ uri);
}
}
}
@@ -724,21 +686,12 @@
for (TypeBuilder interface in interfaces) {
if (interface.nullabilityBuilder.build(libraryBuilder) ==
Nullability.nullable) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- libraryBuilder.addProblem(
- templateNullableInterfaceWarning
- .withArguments(interface.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- } else {
- libraryBuilder.addProblem(
- templateNullableInterfaceError
- .withArguments(interface.fullNameForErrors),
- nameOffset,
- classNameForErrors.length,
- uri);
- }
+ libraryBuilder.addProblem(
+ templateNullableInterfaceError
+ .withArguments(interface.fullNameForErrors),
+ nameOffset,
+ classNameForErrors.length,
+ uri);
}
}
}
@@ -1241,62 +1194,34 @@
if (supertype != null && supertype is! MixinApplicationBuilder) {
if (supertype.nullabilityBuilder.build(libraryBuilder) ==
Nullability.nullable) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- libraryBuilder.addProblem(
- templateNullableSuperclassWarning
- .withArguments(supertype.fullNameForErrors),
- charOffset,
- classNameForErrors.length,
- uri);
- } else {
- libraryBuilder.addProblem(
- templateNullableSuperclassError
- .withArguments(supertype.fullNameForErrors),
- charOffset,
- classNameForErrors.length,
- uri);
- }
+ libraryBuilder.addProblem(
+ templateNullableSuperclassError
+ .withArguments(supertype.fullNameForErrors),
+ charOffset,
+ classNameForErrors.length,
+ uri);
}
}
for (TypeBuilder mixin in mixins) {
if (mixin.nullabilityBuilder.build(libraryBuilder) ==
Nullability.nullable) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- libraryBuilder.addProblem(
- templateNullableMixinWarning
- .withArguments(mixin.fullNameForErrors),
- charOffset,
- classNameForErrors.length,
- uri);
- } else {
- libraryBuilder.addProblem(
- templateNullableMixinError
- .withArguments(mixin.fullNameForErrors),
- charOffset,
- classNameForErrors.length,
- uri);
- }
+ libraryBuilder.addProblem(
+ templateNullableMixinError.withArguments(mixin.fullNameForErrors),
+ charOffset,
+ classNameForErrors.length,
+ uri);
}
}
if (interfaces != null) {
for (TypeBuilder interface in interfaces) {
if (interface.nullabilityBuilder.build(libraryBuilder) ==
Nullability.nullable) {
- if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
- libraryBuilder.addProblem(
- templateNullableInterfaceWarning
- .withArguments(interface.fullNameForErrors),
- charOffset,
- classNameForErrors.length,
- uri);
- } else {
- libraryBuilder.addProblem(
- templateNullableInterfaceError
- .withArguments(interface.fullNameForErrors),
- charOffset,
- classNameForErrors.length,
- uri);
- }
+ libraryBuilder.addProblem(
+ templateNullableInterfaceError
+ .withArguments(interface.fullNameForErrors),
+ charOffset,
+ classNameForErrors.length,
+ uri);
}
}
}
@@ -1675,13 +1600,24 @@
TypeParameterScopeKind.functionType, "<syntax-error>");
return;
}
- if (type is FunctionTypeBuilder) {
- // TODO(ahe): We need to start a nested declaration when parsing the
- // formals and return type so we can correctly bind
- // `type.typeVariables`. A typedef can have type variables, and a new
- // function type can also have type variables (representing the type of
- // a generic function).
- aliasedType = type;
+ if (type is FunctionTypeBuilder &&
+ !libraryBuilder.loader.target.enableNonfunctionTypeAliases) {
+ if (type.nullabilityBuilder.build(libraryBuilder) ==
+ Nullability.nullable &&
+ libraryBuilder.loader.target.enableNonNullable) {
+ // The error is reported when the non-nullable experiment is enabled.
+ // Otherwise, the attempt to use a nullable type will be reported
+ // elsewhere.
+ addProblem(
+ messageTypedefNullableType, equals.charOffset, equals.length);
+ } else {
+ // TODO(ahe): We need to start a nested declaration when parsing the
+ // formals and return type so we can correctly bind
+ // `type.typeVariables`. A typedef can have type variables, and a new
+ // function type can also have type variables (representing the type
+ // of a generic function).
+ aliasedType = type;
+ }
} else if (libraryBuilder.loader.target.enableNonfunctionTypeAliases) {
if (type is TypeBuilder) {
aliasedType = type;
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index a3b5e82..a2f46e2 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -75,6 +75,9 @@
show
Message,
noLength,
+ messageExtendFunction,
+ messageImplementFunction,
+ messageMixinFunction,
templateConflictsWithConstructor,
templateConflictsWithFactory,
templateConflictsWithMember,
@@ -138,7 +141,7 @@
final List<ConstructorReferenceBuilder> constructorReferences;
- TypeBuilder mixedInType;
+ TypeBuilder mixedInTypeBuilder;
bool isMixinDeclaration;
@@ -163,7 +166,7 @@
Class referencesFrom,
IndexedClass referencesFromIndexed, {
Class cls,
- this.mixedInType,
+ this.mixedInTypeBuilder,
this.isMixinDeclaration = false,
}) : actualCls = initializeClass(cls, typeVariables, name, parent,
startCharOffset, nameOffset, charEndOffset, referencesFrom),
@@ -210,9 +213,19 @@
scope.forEach(buildBuilders);
constructors.forEach(buildBuilders);
- supertype = checkSupertype(supertype);
- actualCls.supertype =
- supertype?.buildSupertype(library, charOffset, fileUri);
+ supertypeBuilder = checkSupertype(supertypeBuilder);
+ Supertype supertype =
+ supertypeBuilder?.buildSupertype(library, charOffset, fileUri);
+ if (supertype != null) {
+ Class superclass = supertype.classNode;
+ if (superclass.name == 'Function' &&
+ superclass.enclosingLibrary == coreLibrary.library) {
+ library.addProblem(
+ messageExtendFunction, charOffset, noLength, fileUri);
+ supertype = null;
+ supertypeBuilder = null;
+ }
+ }
if (!isMixinDeclaration &&
actualCls.supertype != null &&
actualCls.superclass.isMixinDeclaration) {
@@ -225,27 +238,49 @@
charOffset,
noLength,
fileUri);
- actualCls.supertype = null;
- }
- if (actualCls.supertype == null && supertype is! NamedTypeBuilder) {
supertype = null;
}
- mixedInType = checkSupertype(mixedInType);
- actualCls.mixedInType =
- mixedInType?.buildMixedInType(library, charOffset, fileUri);
- if (actualCls.mixedInType == null && mixedInType is! NamedTypeBuilder) {
- mixedInType = null;
+ if (supertype == null && supertypeBuilder is! NamedTypeBuilder) {
+ supertypeBuilder = null;
+ }
+ actualCls.supertype = supertype;
+
+ mixedInTypeBuilder = checkSupertype(mixedInTypeBuilder);
+ Supertype mixedInType =
+ mixedInTypeBuilder?.buildMixedInType(library, charOffset, fileUri);
+ if (mixedInType != null) {
+ Class superclass = mixedInType.classNode;
+ if (superclass.name == 'Function' &&
+ superclass.enclosingLibrary == coreLibrary.library) {
+ library.addProblem(messageMixinFunction, charOffset, noLength, fileUri);
+ mixedInType = null;
+ mixedInTypeBuilder = null;
+ actualCls.isAnonymousMixin = false;
+ isMixinDeclaration = false;
+ }
+ }
+ if (mixedInType == null && mixedInTypeBuilder is! NamedTypeBuilder) {
+ mixedInTypeBuilder = null;
}
actualCls.isMixinDeclaration = isMixinDeclaration;
+ actualCls.mixedInType = mixedInType;
+
// TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
// compile-time error.
cls.isAbstract = isAbstract;
- if (interfaces != null) {
- for (int i = 0; i < interfaces.length; ++i) {
- interfaces[i] = checkSupertype(interfaces[i]);
+ if (interfaceBuilders != null) {
+ for (int i = 0; i < interfaceBuilders.length; ++i) {
+ interfaceBuilders[i] = checkSupertype(interfaceBuilders[i]);
Supertype supertype =
- interfaces[i].buildSupertype(library, charOffset, fileUri);
+ interfaceBuilders[i].buildSupertype(library, charOffset, fileUri);
if (supertype != null) {
+ Class superclass = supertype.classNode;
+ if (superclass.name == 'Function' &&
+ superclass.enclosingLibrary == coreLibrary.library) {
+ library.addProblem(
+ messageImplementFunction, charOffset, noLength, fileUri);
+ continue;
+ }
// TODO(ahe): Report an error if supertype is null.
actualCls.implementedTypes.add(supertype);
}
@@ -364,7 +399,7 @@
List<Builder> computeDirectSupertypes(ClassBuilder objectClass) {
final List<Builder> result = <Builder>[];
- final TypeBuilder supertype = this.supertype;
+ final TypeBuilder supertype = this.supertypeBuilder;
if (supertype != null) {
TypeDeclarationBuilder declarationBuilder = supertype.declaration;
if (declarationBuilder is TypeAliasBuilder) {
@@ -375,7 +410,7 @@
} else if (objectClass != this) {
result.add(objectClass);
}
- final List<TypeBuilder> interfaces = this.interfaces;
+ final List<TypeBuilder> interfaces = this.interfaceBuilders;
if (interfaces != null) {
for (int i = 0; i < interfaces.length; i++) {
TypeBuilder interface = interfaces[i];
@@ -387,7 +422,7 @@
result.add(declarationBuilder);
}
}
- final TypeBuilder mixedInType = this.mixedInType;
+ final TypeBuilder mixedInType = this.mixedInTypeBuilder;
if (mixedInType != null) {
TypeDeclarationBuilder declarationBuilder = mixedInType.declaration;
if (declarationBuilder is TypeAliasBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index d355d3e..78381f8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -394,25 +394,23 @@
for (String testDir in ['/tests/', '/generated_tests/']) {
int start = path.indexOf(testDir);
if (start == -1) continue;
- int end = path.indexOf('/', start + testDir.length + 1);
- if (end == -1) continue;
- return optOutTestPaths.contains(path.substring(start, end));
+ String rest = path.substring(start + testDir.length);
+ return optOutTestPaths.any(rest.startsWith);
}
return false;
}
- static final Set<String> optOutTestPaths = {
- '/tests/co19_2',
- '/tests/corelib_2',
- '/tests/language_2',
- '/tests/lib_2',
- '/tests/standalone_2',
- '/generated_tests/co19_2',
- '/generated_tests/corelib_2',
- '/generated_tests/language_2',
- '/generated_tests/lib_2',
- '/generated_tests/standalone_2',
- };
+ static const List<String> optOutTestPaths = [
+ 'co19_2/',
+ 'compiler/dart2js/',
+ 'compiler/dart2js_extra/',
+ 'compiler/dart2js_native/',
+ 'corelib_2/',
+ 'ffi_2',
+ 'language_2/',
+ 'lib_2/',
+ 'standalone_2/',
+ ];
LanguageVersion get languageVersion => _languageVersion;
@@ -1827,7 +1825,7 @@
charEndOffset,
referencesFromClass,
referencesFromIndexedClass,
- mixedInType: isMixinDeclaration ? null : mixin,
+ mixedInTypeBuilder: isMixinDeclaration ? null : mixin,
);
if (isNamedMixinApplication) {
loader.target.metadataCollector
@@ -2729,8 +2727,8 @@
return count;
}
- int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
- ClassBuilder objectClass) {
+ int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
+ TypeBuilder bottomType, ClassBuilder objectClass) {
int count = 0;
int computeDefaultTypesForVariables(List<TypeVariableBuilder> variables,
@@ -2752,8 +2750,11 @@
}
if (!haveErroneousBounds) {
- List<TypeBuilder> calculatedBounds =
- calculateBounds(variables, dynamicType, bottomType, objectClass);
+ List<TypeBuilder> calculatedBounds = calculateBounds(
+ variables,
+ dynamicType,
+ isNonNullableByDefault ? bottomType : nullType,
+ objectClass);
for (int i = 0; i < variables.length; ++i) {
variables[i].defaultType = calculatedBounds[i];
}
@@ -2926,8 +2927,7 @@
{bool inferred,
TypeArgumentsInfo typeArgumentsInfo,
DartType targetReceiver,
- String targetName,
- bool areWarnings = false}) {
+ String targetName}) {
for (TypeArgumentIssue issue in issues) {
DartType argument = issue.argument;
TypeParameter typeParameter = issue.typeParameter;
@@ -2949,27 +2949,16 @@
} else {
if (issue.enclosingType == null && targetReceiver != null) {
if (issueInferred) {
- Template<
- Message Function(
- DartType, DartType, String, DartType, String, bool)>
- template = areWarnings
- ? templateIncorrectTypeArgumentQualifiedInferredWarning
- : templateIncorrectTypeArgumentQualifiedInferred;
- message = template.withArguments(
- argument,
- typeParameter.bound,
- typeParameter.name,
- targetReceiver,
- targetName,
- isNonNullableByDefault);
+ message =
+ templateIncorrectTypeArgumentQualifiedInferred.withArguments(
+ argument,
+ typeParameter.bound,
+ typeParameter.name,
+ targetReceiver,
+ targetName,
+ isNonNullableByDefault);
} else {
- Template<
- Message Function(
- DartType, DartType, String, DartType, String, bool)>
- template = areWarnings
- ? templateIncorrectTypeArgumentQualifiedWarning
- : templateIncorrectTypeArgumentQualified;
- message = template.withArguments(
+ message = templateIncorrectTypeArgumentQualified.withArguments(
argument,
typeParameter.bound,
typeParameter.name,
@@ -2983,19 +2972,19 @@
: getGenericTypeName(issue.enclosingType);
assert(enclosingName != null);
if (issueInferred) {
- Template<Message Function(DartType, DartType, String, String, bool)>
- template = areWarnings
- ? templateIncorrectTypeArgumentInferredWarning
- : templateIncorrectTypeArgumentInferred;
- message = template.withArguments(argument, typeParameter.bound,
- typeParameter.name, enclosingName, isNonNullableByDefault);
+ message = templateIncorrectTypeArgumentInferred.withArguments(
+ argument,
+ typeParameter.bound,
+ typeParameter.name,
+ enclosingName,
+ isNonNullableByDefault);
} else {
- Template<Message Function(DartType, DartType, String, String, bool)>
- template = areWarnings
- ? templateIncorrectTypeArgumentWarning
- : templateIncorrectTypeArgument;
- message = template.withArguments(argument, typeParameter.bound,
- typeParameter.name, enclosingName, isNonNullableByDefault);
+ message = templateIncorrectTypeArgument.withArguments(
+ argument,
+ typeParameter.bound,
+ typeParameter.name,
+ enclosingName,
+ isNonNullableByDefault);
}
}
}
@@ -3036,25 +3025,14 @@
fieldType is! InvalidType &&
isPotentiallyNonNullable(fieldType, typeEnvironment.futureOrClass) &&
!fieldBuilder.hasInitializer) {
- if (loader.nnbdMode == NnbdMode.Weak) {
- addProblem(
- templateFieldNonNullableWithoutInitializerWarning.withArguments(
- fieldBuilder.name,
- fieldBuilder.field.type,
- isNonNullableByDefault),
- fieldBuilder.charOffset,
- fieldBuilder.name.length,
- fileUri);
- } else {
- addProblem(
- templateFieldNonNullableWithoutInitializerError.withArguments(
- fieldBuilder.name,
- fieldBuilder.field.type,
- isNonNullableByDefault),
- fieldBuilder.charOffset,
- fieldBuilder.name.length,
- fileUri);
- }
+ addProblem(
+ templateFieldNonNullableWithoutInitializerError.withArguments(
+ fieldBuilder.name,
+ fieldBuilder.field.type,
+ isNonNullableByDefault),
+ fieldBuilder.charOffset,
+ fieldBuilder.name.length,
+ fileUri);
}
}
}
@@ -3071,22 +3049,12 @@
isPotentiallyNonNullable(
formal.variable.type, typeEnvironment.futureOrClass) &&
!formal.hasDeclaredInitializer) {
- if (loader.nnbdMode == NnbdMode.Weak) {
- addProblem(
- templateOptionalNonNullableWithoutInitializerWarning
- .withArguments(formal.name, formal.variable.type,
- isNonNullableByDefault),
- formal.charOffset,
- formal.name.length,
- formal.fileUri);
- } else {
- addProblem(
- templateOptionalNonNullableWithoutInitializerError.withArguments(
- formal.name, formal.variable.type, isNonNullableByDefault),
- formal.charOffset,
- formal.name.length,
- formal.fileUri);
- }
+ addProblem(
+ templateOptionalNonNullableWithoutInitializerError.withArguments(
+ formal.name, formal.variable.type, isNonNullableByDefault),
+ formal.charOffset,
+ formal.name.length,
+ formal.fileUri);
}
}
}
@@ -3122,64 +3090,44 @@
}
}
if (returnType != null) {
- Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssues(returnType,
- typeEnvironment, SubtypeCheckMode.ignoringNullabilities,
- allowSuperBounded: true)
- ?.toSet();
- Set<TypeArgumentIssue> nnbdIssues = isNonNullableByDefault
- ? findTypeArgumentIssues(returnType, typeEnvironment,
- SubtypeCheckMode.withNullabilities)
- ?.toSet()
- : null;
- if (legacyIssues != null || nnbdIssues != null) {
- Set<TypeArgumentIssue> mergedIssues = legacyIssues ?? {};
- if (nnbdIssues != null) {
- nnbdIssues = nnbdIssues
- .where((issue) =>
- legacyIssues == null || !legacyIssues.contains(issue))
- .toSet();
- mergedIssues.addAll(nnbdIssues);
- }
- int offset = fileOffset;
- for (TypeArgumentIssue issue in mergedIssues) {
- DartType argument = issue.argument;
- TypeParameter typeParameter = issue.typeParameter;
+ final DartType bottomType = isNonNullableByDefault
+ ? const NeverType(Nullability.nonNullable)
+ : typeEnvironment.nullType;
+ Set<TypeArgumentIssue> issues = {};
+ issues.addAll(findTypeArgumentIssues(returnType, typeEnvironment,
+ SubtypeCheckMode.ignoringNullabilities, bottomType,
+ allowSuperBounded: true) ??
+ const []);
+ if (isNonNullableByDefault) {
+ issues.addAll(findTypeArgumentIssues(returnType, typeEnvironment,
+ SubtypeCheckMode.withNullabilities, bottomType,
+ allowSuperBounded: true) ??
+ const []);
+ }
+ for (TypeArgumentIssue issue in issues) {
+ DartType argument = issue.argument;
+ TypeParameter typeParameter = issue.typeParameter;
- // We don't need to check if [argument] was inferred or specified
- // here, because inference in return types boils down to instantiate-
- // -to-bound, and it can't provide a type that violates the bound.
- if (argument is FunctionType && argument.typeParameters.length > 0) {
- reportTypeArgumentIssue(
- messageGenericFunctionTypeUsedAsActualTypeArgument,
- fileUri,
- offset,
- null);
- } else {
- void reportProblem(
- Template<
- Message Function(
- DartType, DartType, String, String, bool)>
- template) {
- reportTypeArgumentIssue(
- template.withArguments(
- argument,
- typeParameter.bound,
- typeParameter.name,
- getGenericTypeName(issue.enclosingType),
- isNonNullableByDefault),
- fileUri,
- offset,
- typeParameter);
- }
-
- nnbdIssues ??= const {};
- if (nnbdIssues.contains(issue) &&
- loader.nnbdMode == NnbdMode.Weak) {
- reportProblem(templateIncorrectTypeArgumentInReturnTypeWarning);
- } else {
- reportProblem(templateIncorrectTypeArgumentInReturnType);
- }
- }
+ // We don't need to check if [argument] was inferred or specified
+ // here, because inference in return types boils down to instantiate-
+ // -to-bound, and it can't provide a type that violates the bound.
+ if (argument is FunctionType && argument.typeParameters.length > 0) {
+ reportTypeArgumentIssue(
+ messageGenericFunctionTypeUsedAsActualTypeArgument,
+ fileUri,
+ fileOffset,
+ null);
+ } else {
+ reportTypeArgumentIssue(
+ templateIncorrectTypeArgumentInReturnType.withArguments(
+ argument,
+ typeParameter.bound,
+ typeParameter.name,
+ getGenericTypeName(issue.enclosingType),
+ isNonNullableByDefault),
+ fileUri,
+ fileOffset,
+ typeParameter);
}
}
}
@@ -3224,28 +3172,21 @@
void checkBoundsInType(
DartType type, TypeEnvironment typeEnvironment, Uri fileUri, int offset,
{bool inferred, bool allowSuperBounded = true}) {
- Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssues(
- type, typeEnvironment, SubtypeCheckMode.ignoringNullabilities,
- allowSuperBounded: allowSuperBounded)
- ?.toSet();
- Set<TypeArgumentIssue> nnbdIssues = isNonNullableByDefault
- ? findTypeArgumentIssues(
- type, typeEnvironment, SubtypeCheckMode.withNullabilities,
- allowSuperBounded: allowSuperBounded)
- ?.toSet()
- : null;
- if (legacyIssues != null) {
- reportTypeArgumentIssues(legacyIssues, fileUri, offset,
- inferred: inferred);
+ final DartType bottomType = isNonNullableByDefault
+ ? const NeverType(Nullability.nonNullable)
+ : typeEnvironment.nullType;
+ Set<TypeArgumentIssue> issues = {};
+ issues.addAll(findTypeArgumentIssues(type, typeEnvironment,
+ SubtypeCheckMode.ignoringNullabilities, bottomType,
+ allowSuperBounded: allowSuperBounded) ??
+ const []);
+ if (isNonNullableByDefault) {
+ issues.addAll(findTypeArgumentIssues(type, typeEnvironment,
+ SubtypeCheckMode.withNullabilities, bottomType,
+ allowSuperBounded: allowSuperBounded) ??
+ const []);
}
- if (nnbdIssues != null) {
- if (legacyIssues != null) {
- nnbdIssues =
- nnbdIssues.where((issue) => !legacyIssues.contains(issue)).toSet();
- }
- reportTypeArgumentIssues(nnbdIssues, fileUri, offset,
- inferred: inferred, areWarnings: loader.nnbdMode == NnbdMode.Weak);
- }
+ reportTypeArgumentIssues(issues, fileUri, offset, inferred: inferred);
}
void checkBoundsInVariableDeclaration(
@@ -3297,46 +3238,39 @@
List<DartType> arguments = node.arguments.types;
// The following error is to be reported elsewhere.
if (parameters.length != arguments.length) return;
- Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssuesForInvocation(
+
+ final DartType bottomType = isNonNullableByDefault
+ ? const NeverType(Nullability.nonNullable)
+ : typeEnvironment.nullType;
+ Set<TypeArgumentIssue> issues = {};
+ issues.addAll(findTypeArgumentIssuesForInvocation(
parameters,
arguments,
typeEnvironment,
- SubtypeCheckMode.ignoringNullabilities)
- ?.toSet();
- Set<TypeArgumentIssue> nnbdIssues = isNonNullableByDefault
- ? findTypeArgumentIssuesForInvocation(parameters, arguments,
- typeEnvironment, SubtypeCheckMode.withNullabilities)
- ?.toSet()
- : null;
- if (legacyIssues != null) {
+ SubtypeCheckMode.ignoringNullabilities,
+ bottomType) ??
+ const []);
+ if (isNonNullableByDefault) {
+ issues.addAll(findTypeArgumentIssuesForInvocation(
+ parameters,
+ arguments,
+ typeEnvironment,
+ SubtypeCheckMode.withNullabilities,
+ bottomType) ??
+ const []);
+ }
+ if (issues.isNotEmpty) {
DartType targetReceiver;
if (klass != null) {
targetReceiver =
new InterfaceType(klass, klass.enclosingLibrary.nonNullable);
}
String targetName = node.target.name.name;
- reportTypeArgumentIssues(legacyIssues, fileUri, node.fileOffset,
+ reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
typeArgumentsInfo: typeArgumentsInfo,
targetReceiver: targetReceiver,
targetName: targetName);
}
- if (nnbdIssues != null) {
- DartType targetReceiver;
- if (klass != null) {
- targetReceiver =
- new InterfaceType(klass, klass.enclosingLibrary.nonNullable);
- }
- String targetName = node.target.name.name;
- if (legacyIssues != null) {
- nnbdIssues =
- nnbdIssues.where((issue) => !legacyIssues.contains(issue)).toSet();
- }
- reportTypeArgumentIssues(nnbdIssues, fileUri, node.fileOffset,
- typeArgumentsInfo: typeArgumentsInfo,
- targetReceiver: targetReceiver,
- targetName: targetName,
- areWarnings: loader.nnbdMode == NnbdMode.Weak);
- }
}
void checkBoundsInMethodInvocation(
@@ -3389,37 +3323,31 @@
instantiatedMethodParameters[i].bound =
substitute(methodParameters[i].bound, substitutionMap);
}
- Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssuesForInvocation(
+
+ final DartType bottomType = isNonNullableByDefault
+ ? const NeverType(Nullability.nonNullable)
+ : typeEnvironment.nullType;
+ Set<TypeArgumentIssue> issues = {};
+ issues.addAll(findTypeArgumentIssuesForInvocation(
instantiatedMethodParameters,
arguments.types,
typeEnvironment,
- SubtypeCheckMode.ignoringNullabilities)
- ?.toSet();
- Set<TypeArgumentIssue> nnbdIssues = isNonNullableByDefault
- ? findTypeArgumentIssuesForInvocation(
- instantiatedMethodParameters,
- arguments.types,
- typeEnvironment,
- SubtypeCheckMode.withNullabilities)
- ?.toSet()
- : null;
- if (legacyIssues != null) {
- reportTypeArgumentIssues(legacyIssues, fileUri, offset,
- typeArgumentsInfo: getTypeArgumentsInfo(arguments),
- targetReceiver: receiverType,
- targetName: name.name);
+ SubtypeCheckMode.ignoringNullabilities,
+ bottomType) ??
+ const []);
+ if (isNonNullableByDefault) {
+ issues.addAll(findTypeArgumentIssuesForInvocation(
+ instantiatedMethodParameters,
+ arguments.types,
+ typeEnvironment,
+ SubtypeCheckMode.withNullabilities,
+ bottomType) ??
+ const []);
}
- if (nnbdIssues != null) {
- if (legacyIssues != null) {
- nnbdIssues =
- nnbdIssues.where((issue) => !legacyIssues.contains(issue)).toSet();
- }
- reportTypeArgumentIssues(nnbdIssues, fileUri, offset,
- typeArgumentsInfo: getTypeArgumentsInfo(arguments),
- targetReceiver: receiverType,
- targetName: name.name,
- areWarnings: loader.nnbdMode == NnbdMode.Weak);
- }
+ reportTypeArgumentIssues(issues, fileUri, offset,
+ typeArgumentsInfo: getTypeArgumentsInfo(arguments),
+ targetReceiver: receiverType,
+ targetName: name.name);
}
void checkTypesInOutline(TypeEnvironment typeEnvironment) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index de1fdb5..3c85eb6 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -585,13 +585,13 @@
ticker.logMs("Computed variances of $count type variables");
}
- void computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
- ClassBuilder objectClass) {
+ void computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
+ TypeBuilder bottomType, ClassBuilder objectClass) {
int count = 0;
builders.forEach((Uri uri, LibraryBuilder library) {
if (library.loader == this) {
- count +=
- library.computeDefaultTypes(dynamicType, bottomType, objectClass);
+ count += library.computeDefaultTypes(
+ dynamicType, nullType, bottomType, objectClass);
}
});
ticker.logMs("Computed default types for $count type variables");
@@ -622,20 +622,20 @@
void checkObjectClassHierarchy(ClassBuilder objectClass) {
if (objectClass is SourceClassBuilder &&
objectClass.library.loader == this) {
- if (objectClass.supertype != null) {
- objectClass.supertype = null;
+ if (objectClass.supertypeBuilder != null) {
+ objectClass.supertypeBuilder = null;
objectClass.addProblem(
messageObjectExtends, objectClass.charOffset, noLength);
}
- if (objectClass.interfaces != null) {
+ if (objectClass.interfaceBuilders != null) {
objectClass.addProblem(
messageObjectImplements, objectClass.charOffset, noLength);
- objectClass.interfaces = null;
+ objectClass.interfaceBuilders = null;
}
- if (objectClass.mixedInType != null) {
+ if (objectClass.mixedInTypeBuilder != null) {
objectClass.addProblem(
messageObjectMixesIn, objectClass.charOffset, noLength);
- objectClass.mixedInType = null;
+ objectClass.mixedInTypeBuilder = null;
}
}
}
@@ -763,7 +763,7 @@
}
// Check that the mixed-in type can be used as a mixin.
- final TypeBuilder mixedInType = cls.mixedInType;
+ final TypeBuilder mixedInType = cls.mixedInTypeBuilder;
if (mixedInType != null) {
bool isClassBuilder = false;
if (mixedInType is NamedTypeBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
index bb85651..8a94bac 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
@@ -271,6 +271,9 @@
/// additionally handles the unknown type that appears during type inference.
DartType getStandardLowerBound(
DartType type1, DartType type2, Library clientLibrary) {
+ if (type1 is InvalidType || type2 is InvalidType) {
+ return const InvalidType();
+ }
if (clientLibrary.isNonNullableByDefault) {
return _getNullabilityAwareStandardLowerBound(
type1, type2, clientLibrary);
@@ -555,6 +558,9 @@
/// additionally handles the unknown type that appears during type inference.
DartType getStandardUpperBound(
DartType type1, DartType type2, Library clientLibrary) {
+ if (type1 is InvalidType || type2 is InvalidType) {
+ return const InvalidType();
+ }
if (clientLibrary.isNonNullableByDefault) {
return _getNullabilityAwareStandardUpperBound(
type1, type2, clientLibrary);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index b0271ce..2970f25 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -125,6 +125,8 @@
final bool _needToInferReturnType;
+ DartType _inferredReturnType;
+
/// The type that actually appeared as the subexpression of `return` or
/// `yield` statements inside the function.
///
@@ -364,7 +366,56 @@
returnExpressionTypes[i]);
}
- return demoteTypeInLibrary(inferredType, inferrer.library.library);
+ return _inferredReturnType =
+ demoteTypeInLibrary(inferredType, inferrer.library.library);
+ }
+
+ StatementInferenceResult handleImplicitReturn(
+ TypeInferrerImpl inferrer,
+ Statement body,
+ StatementInferenceResult inferenceResult,
+ int fileOffset) {
+ if (isGenerator) {
+ // There is no implicit return.
+ return inferenceResult;
+ }
+
+ DartType returnType;
+ if (_needToInferReturnType) {
+ assert(_inferredReturnType != null,
+ "Return type has not yet been inferred.");
+ returnType = _inferredReturnType;
+ } else {
+ returnType = declaredReturnType;
+ }
+ if (isAsync) {
+ returnType = inferrer.typeSchemaEnvironment.unfutureType(returnType);
+ }
+ if (inferrer.library.isNonNullableByDefault &&
+ isPotentiallyNonNullable(
+ returnType, inferrer.coreTypes.futureOrClass) &&
+ inferrer.flowAnalysis.isReachable) {
+ Statement resultStatement =
+ inferenceResult.hasChanged ? inferenceResult.statement : body;
+ // Create a synthetic return statement with the error.
+ Statement returnStatement = new ReturnStatement(inferrer.helper
+ .wrapInProblem(
+ new NullLiteral()..fileOffset = fileOffset,
+ templateImplicitReturnNull.withArguments(
+ returnType, inferrer.library.isNonNullableByDefault),
+ fileOffset,
+ noLength))
+ ..fileOffset = fileOffset;
+ if (resultStatement is Block) {
+ resultStatement.statements.add(returnStatement);
+ } else {
+ resultStatement =
+ new Block(<Statement>[resultStatement, returnStatement])
+ ..fileOffset = fileOffset;
+ }
+ return new StatementInferenceResult.single(resultStatement);
+ }
+ return inferenceResult;
}
DartType _wrapAsyncOrGenerator(
@@ -429,8 +480,8 @@
InferenceHelper helper, DartType declaredType, Expression initializer);
/// Performs type inference on the given function body.
- Statement inferFunctionBody(InferenceHelper helper, DartType returnType,
- AsyncMarker asyncMarker, Statement body);
+ Statement inferFunctionBody(InferenceHelper helper, int fileOffset,
+ DartType returnType, AsyncMarker asyncMarker, Statement body);
/// Performs type inference on the given constructor initializer.
void inferInitializer(InferenceHelper helper, Initializer initializer);
@@ -663,8 +714,7 @@
{int fileOffset,
bool isReturnFromAsync: false,
bool isVoidAllowed: false,
- Template<Message Function(DartType, DartType, bool)> errorTemplate,
- Template<Message Function(DartType, DartType, bool)> warningTemplate}) {
+ Template<Message Function(DartType, DartType, bool)> errorTemplate}) {
assert(contextType != null);
// We don't need to insert assignability checks when doing top level type
@@ -696,8 +746,7 @@
preciseTypeErrorTemplate = _getPreciseTypeErrorTemplate(expression);
AssignabilityKind kind = _computeAssignabilityKind(
contextType, expressionType,
- isStrongNullabilityMode:
- isNonNullableByDefault && nnbdMode != NnbdMode.Weak,
+ isNonNullableByDefault: isNonNullableByDefault,
isVoidAllowed: isVoidAllowed,
isExpressionTypePrecise: preciseTypeErrorTemplate != null);
@@ -752,12 +801,6 @@
typedTearoff.tearoffType, contextType, errorTemplate);
break;
case AssignabilityKind.unassignableCantTearoff:
- // The first call to _computeAssignabilityKind is done for the purpose
- // of code generation, and the inability to tear off from a
- // potentially nullable receiver shouldn't arise as an issue in any
- // mode other than the strong mode.
- assert(isNonNullableByDefault && nnbdMode != NnbdMode.Weak);
-
result = _wrapTearoffErrorExpression(
expression, contextType, templateNullableTearoffError);
break;
@@ -765,84 +808,6 @@
return unhandled("${kind}", "ensureAssignable", fileOffset, helper.uri);
}
- // Report warnings in weak mode.
- if (isNonNullableByDefault && nnbdMode == NnbdMode.Weak) {
- AssignabilityKind weakKind = _computeAssignabilityKind(
- contextType, expressionType,
- isStrongNullabilityMode: true,
- isVoidAllowed: isVoidAllowed,
- isExpressionTypePrecise: preciseTypeErrorTemplate != null);
- switch (weakKind) {
- case AssignabilityKind.assignable:
- // Do nothing if an error wouldn't be reported in the strong mode.
- break;
- case AssignabilityKind.assignableCast:
- // Do nothing if an error wouldn't be reported in the strong mode.
- break;
- case AssignabilityKind.assignableTearoff:
- // Do nothing if an error wouldn't be reported in the strong mode.
- break;
- case AssignabilityKind.assignableTearoffCast:
- // Do nothing if an error wouldn't be reported in the strong mode.
- break;
- case AssignabilityKind.unassignable:
- // Don't report the same problem twice.
- if (kind == AssignabilityKind.unassignable) break;
- if (contextType is! InvalidType && expressionType is! InvalidType) {
- helper.addProblem(
- (warningTemplate ?? templateInvalidAssignmentWarning)
- .withArguments(
- expressionType, contextType, isNonNullableByDefault),
- fileOffset,
- noLength);
- }
- break;
- case AssignabilityKind.unassignableVoid:
- // The NNBD feature can't cause this case..
- return unhandled(
- "${kind}", "ensureAssignable:weak", fileOffset, helper.uri);
- case AssignabilityKind.unassignablePrecise:
- // The NNBD feature can't cause this case..
- return unhandled(
- "${kind}", "ensureAssignable:weak", fileOffset, helper.uri);
- case AssignabilityKind.unassignableTearoff:
- // Don't report the same problem twice.
- if (kind == AssignabilityKind.unassignableTearoff) break;
-
- // The first handling of the error should have happened in the strong
- // mode.
- assert(nnbdMode == NnbdMode.Weak);
-
- if (contextType is! InvalidType && expressionType is! InvalidType) {
- TypedTearoff typedTearoff =
- _tearOffCall(expression, expressionType, fileOffset);
- helper.addProblem(
- (warningTemplate ?? templateInvalidAssignmentWarning)
- .withArguments(typedTearoff.tearoffType, contextType,
- isNonNullableByDefault),
- fileOffset,
- noLength);
- }
- break;
- case AssignabilityKind.unassignableCantTearoff:
- // Don't report the same problem twice.
- if (kind == AssignabilityKind.unassignableCantTearoff) break;
-
- // The first handling of the error should have happened in the strong
- // mode.
- assert(nnbdMode == NnbdMode.Weak);
-
- if (isNonNullableByDefault) {
- result = _wrapTearoffErrorExpression(
- expression, contextType, templateNullableTearoffWarning);
- }
- break;
- default:
- return unhandled(
- "${kind}", "ensureAssignable:weak", fileOffset, helper.uri);
- }
- }
-
return result;
}
@@ -925,10 +890,10 @@
/// The computation is side-effect free.
AssignabilityKind _computeAssignabilityKind(
DartType contextType, DartType expressionType,
- {bool isStrongNullabilityMode,
+ {bool isNonNullableByDefault,
bool isVoidAllowed,
bool isExpressionTypePrecise}) {
- assert(isStrongNullabilityMode != null);
+ assert(isNonNullableByDefault != null);
assert(isVoidAllowed != null);
assert(isExpressionTypePrecise != null);
@@ -943,7 +908,7 @@
if (callMember is Procedure && callMember.kind == ProcedureKind.Method) {
if (_shouldTearOffCall(contextType, expressionType)) {
needsTearoff = true;
- if (isStrongNullabilityMode &&
+ if (isNonNullableByDefault &&
isPotentiallyNullable(expressionType, coreTypes.futureOrClass)) {
return AssignabilityKind.unassignableCantTearoff;
}
@@ -961,7 +926,7 @@
{
IsSubtypeOf result = typeSchemaEnvironment
.performNullabilityAwareSubtypeCheck(expressionType, contextType);
- bool isDirectlyAssignable = isStrongNullabilityMode
+ bool isDirectlyAssignable = isNonNullableByDefault
? result.isSubtypeWhenUsingNullabilities()
: result.isSubtypeWhenIgnoringNullabilities();
if (isDirectlyAssignable) {
@@ -971,7 +936,7 @@
}
}
- bool isIndirectlyAssignable = isStrongNullabilityMode
+ bool isIndirectlyAssignable = isNonNullableByDefault
? expressionType is DynamicType
: typeSchemaEnvironment
.performNullabilityAwareSubtypeCheck(contextType, expressionType)
@@ -1156,8 +1121,8 @@
}
onType = inferredSubstitution
.substituteType(extensionBuilder.extension.onType);
- List<DartType> instantiateToBoundTypeArguments =
- calculateBounds(typeParameters, coreTypes.objectClass);
+ List<DartType> instantiateToBoundTypeArguments = calculateBounds(
+ typeParameters, coreTypes.objectClass, library.library);
Substitution instantiateToBoundsSubstitution =
Substitution.fromPairs(
typeParameters, instantiateToBoundTypeArguments);
@@ -1168,6 +1133,7 @@
if (typeSchemaEnvironment.isSubtypeOf(
receiverType, onType, SubtypeCheckMode.ignoringNullabilities)) {
ExtensionAccessCandidate candidate = new ExtensionAccessCandidate(
+ thisBuilder ?? otherBuilder,
onType,
onTypeInstantiateToBounds,
thisBuilder != null &&
@@ -1218,8 +1184,9 @@
if (bestSoFar != null) {
target = bestSoFar.target;
} else {
- // TODO(johnniwinther): Report a better error message when more than
- // one potential targets were found.
+ if (noneMoreSpecific.isNotEmpty) {
+ target = new AmbiguousExtensionAccessTarget(noneMoreSpecific);
+ }
}
}
return target;
@@ -1378,10 +1345,12 @@
switch (target.kind) {
case ObjectAccessTargetKind.callFunction:
return receiverType;
+ case ObjectAccessTargetKind.invalid:
+ return const InvalidType();
case ObjectAccessTargetKind.unresolved:
case ObjectAccessTargetKind.dynamic:
- case ObjectAccessTargetKind.invalid:
case ObjectAccessTargetKind.missing:
+ case ObjectAccessTargetKind.ambiguous:
return const DynamicType();
case ObjectAccessTargetKind.never:
return const NeverType(Nullability.nonNullable);
@@ -1488,6 +1457,7 @@
case ObjectAccessTargetKind.never:
case ObjectAccessTargetKind.invalid:
case ObjectAccessTargetKind.missing:
+ case ObjectAccessTargetKind.ambiguous:
return unknownFunction;
case ObjectAccessTargetKind.instanceMember:
return _getFunctionType(
@@ -1551,11 +1521,13 @@
break;
case ObjectAccessTargetKind.never:
return const NeverType(Nullability.nonNullable);
+ case ObjectAccessTargetKind.invalid:
+ return const InvalidType();
case ObjectAccessTargetKind.callFunction:
case ObjectAccessTargetKind.unresolved:
case ObjectAccessTargetKind.dynamic:
- case ObjectAccessTargetKind.invalid:
case ObjectAccessTargetKind.missing:
+ case ObjectAccessTargetKind.ambiguous:
break;
}
return const DynamicType();
@@ -1585,12 +1557,14 @@
return keyType;
}
break;
+ case ObjectAccessTargetKind.invalid:
+ return const InvalidType();
case ObjectAccessTargetKind.callFunction:
case ObjectAccessTargetKind.unresolved:
case ObjectAccessTargetKind.dynamic:
case ObjectAccessTargetKind.never:
- case ObjectAccessTargetKind.invalid:
case ObjectAccessTargetKind.missing:
+ case ObjectAccessTargetKind.ambiguous:
break;
}
return const DynamicType();
@@ -1644,12 +1618,14 @@
throw unhandled('$target', 'getFunctionType', null, null);
}
break;
+ case ObjectAccessTargetKind.invalid:
+ return const InvalidType();
case ObjectAccessTargetKind.callFunction:
case ObjectAccessTargetKind.unresolved:
case ObjectAccessTargetKind.dynamic:
case ObjectAccessTargetKind.never:
- case ObjectAccessTargetKind.invalid:
case ObjectAccessTargetKind.missing:
+ case ObjectAccessTargetKind.ambiguous:
break;
}
return const DynamicType();
@@ -1700,12 +1676,14 @@
throw unhandled('$target', 'getFunctionType', null, null);
}
break;
+ case ObjectAccessTargetKind.invalid:
+ return const InvalidType();
case ObjectAccessTargetKind.callFunction:
case ObjectAccessTargetKind.unresolved:
case ObjectAccessTargetKind.dynamic:
case ObjectAccessTargetKind.never:
- case ObjectAccessTargetKind.invalid:
case ObjectAccessTargetKind.missing:
+ case ObjectAccessTargetKind.ambiguous:
break;
}
return const DynamicType();
@@ -1759,9 +1737,11 @@
case ObjectAccessTargetKind.unresolved:
case ObjectAccessTargetKind.dynamic:
case ObjectAccessTargetKind.never:
- case ObjectAccessTargetKind.invalid:
case ObjectAccessTargetKind.missing:
+ case ObjectAccessTargetKind.ambiguous:
return const DynamicType();
+ case ObjectAccessTargetKind.invalid:
+ return const InvalidType();
case ObjectAccessTargetKind.instanceMember:
Member interfaceMember = target.member;
Class memberClass = interfaceMember.enclosingClass;
@@ -1825,61 +1805,6 @@
}
}
- /// Adds an "as" check to a [MethodInvocation] if necessary due to
- /// contravariance.
- ///
- /// The returned expression is the [AsExpression], if one was added; otherwise
- /// it is the [MethodInvocation].
- Expression handleInvocationContravariance(
- MethodContravarianceCheckKind checkKind,
- MethodInvocation desugaredInvocation,
- Arguments arguments,
- Expression expression,
- DartType inferredType,
- FunctionType functionType,
- int fileOffset) {
- switch (checkKind) {
- case MethodContravarianceCheckKind.checkMethodReturn:
- AsExpression replacement = new AsExpression(expression, inferredType)
- ..isTypeError = true
- ..isCovarianceCheck = true
- ..isForNonNullableByDefault = isNonNullableByDefault
- ..fileOffset = fileOffset;
- if (instrumentation != null) {
- int offset = arguments.fileOffset == -1
- ? expression.fileOffset
- : arguments.fileOffset;
- instrumentation.record(uriForInstrumentation, offset, 'checkReturn',
- new InstrumentationValueForType(inferredType));
- }
- return replacement;
- case MethodContravarianceCheckKind.checkGetterReturn:
- PropertyGet propertyGet = new PropertyGet(desugaredInvocation.receiver,
- desugaredInvocation.name, desugaredInvocation.interfaceTarget);
- AsExpression asExpression = new AsExpression(propertyGet, functionType)
- ..isTypeError = true
- ..isCovarianceCheck = true
- ..isForNonNullableByDefault = isNonNullableByDefault
- ..fileOffset = fileOffset;
- MethodInvocation replacement = new MethodInvocation(
- asExpression, callName, desugaredInvocation.arguments);
- if (instrumentation != null) {
- int offset = arguments.fileOffset == -1
- ? expression.fileOffset
- : arguments.fileOffset;
- instrumentation.record(
- uriForInstrumentation,
- offset,
- 'checkGetterReturn',
- new InstrumentationValueForType(functionType));
- }
- return replacement;
- case MethodContravarianceCheckKind.none:
- break;
- }
- return expression;
- }
-
/// Modifies a type as appropriate when inferring a declared variable's type.
DartType inferDeclarationType(DartType initializerType,
{bool forSyntheticVariable: false}) {
@@ -2033,21 +1958,23 @@
}
@override
- Statement inferFunctionBody(InferenceHelper helper, DartType returnType,
- AsyncMarker asyncMarker, Statement body) {
+ Statement inferFunctionBody(InferenceHelper helper, int fileOffset,
+ DartType returnType, AsyncMarker asyncMarker, Statement body) {
assert(body != null);
assert(closureContext == null);
this.helper = helper;
closureContext = new ClosureContext(this, asyncMarker, returnType, false);
StatementInferenceResult result = inferStatement(body);
- closureContext = null;
- this.helper = null;
if (dataForTesting != null) {
if (!flowAnalysis.isReachable) {
dataForTesting.flowAnalysisResult.functionBodiesThatDontComplete
.add(body);
}
}
+ result =
+ closureContext.handleImplicitReturn(this, body, result, fileOffset);
+ closureContext = null;
+ this.helper = null;
flowAnalysis.finish();
return result.hasChanged ? result.statement : body;
}
@@ -2060,7 +1987,8 @@
DartType receiverType,
bool skipTypeArgumentInference: false,
bool isConst: false,
- bool isImplicitExtensionMember: false}) {
+ bool isImplicitExtensionMember: false,
+ bool isImplicitCall: false}) {
assert(
returnType == null || !containsFreeFunctionTypeVariables(returnType),
"Return type $returnType contains free variables."
@@ -2090,7 +2018,8 @@
returnType: returnType,
skipTypeArgumentInference: skipTypeArgumentInference,
isConst: isConst,
- isImplicitExtensionMember: isImplicitExtensionMember);
+ isImplicitExtensionMember: isImplicitExtensionMember,
+ isImplicitCall: isImplicitCall);
}
InvocationInferenceResult _inferGenericExtensionMethodInvocation(
@@ -2099,13 +2028,14 @@
int offset,
FunctionType calleeType,
Arguments arguments,
- Node targetName,
+ Name targetName,
List<VariableDeclaration> hoistedExpressions,
{bool isOverloadedArithmeticOperator: false,
DartType receiverType,
bool skipTypeArgumentInference: false,
bool isConst: false,
- bool isImplicitExtensionMember: false}) {
+ bool isImplicitExtensionMember: false,
+ bool isImplicitCall: false}) {
FunctionType extensionFunctionType = new FunctionType(
[calleeType.positionalParameters.first],
const DynamicType(),
@@ -2121,7 +2051,8 @@
extensionArguments, targetName, hoistedExpressions,
skipTypeArgumentInference: skipTypeArgumentInference,
receiverType: receiverType,
- isImplicitExtensionMember: isImplicitExtensionMember);
+ isImplicitExtensionMember: isImplicitExtensionMember,
+ isImplicitCall: isImplicitCall);
Substitution extensionSubstitution = Substitution.fromPairs(
extensionFunctionType.typeParameters, extensionArguments.types);
@@ -2146,7 +2077,8 @@
targetFunctionType, targetArguments, targetName, hoistedExpressions,
isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
skipTypeArgumentInference: skipTypeArgumentInference,
- isConst: isConst);
+ isConst: isConst,
+ isImplicitCall: isImplicitCall);
arguments.positional.clear();
arguments.positional.addAll(extensionArguments.positional);
arguments.positional.addAll(targetArguments.positional);
@@ -2175,7 +2107,8 @@
DartType returnType,
bool skipTypeArgumentInference: false,
bool isConst: false,
- bool isImplicitExtensionMember: false}) {
+ bool isImplicitExtensionMember: false,
+ bool isImplicitCall}) {
assert(
returnType == null || !containsFreeFunctionTypeVariables(returnType),
"Return type $returnType contains free variables."
@@ -2424,28 +2357,27 @@
"Inferred return type $inferredType contains free variables."
"Inferred function type: $calleeType.");
- if (isNonNullableByDefault) {
+ if (!isTopLevel && isNonNullableByDefault) {
if (receiverType != null &&
receiverType is! DynamicType &&
isPotentiallyNullable(receiverType, coreTypes.futureOrClass) &&
!matchesObjectMemberCall(targetName, inferredTypes,
positionalArgumentTypes, namedArgumentTypes)) {
- // Use length 1 for .call -- in most cases its name is skipped.
- int errorSpanLength =
- targetName == callName ? noLength : targetName.name.length;
- if (nnbdMode == NnbdMode.Weak) {
- helper.addProblem(
- templateNullableMethodCallWarning.withArguments(
- targetName.name, receiverType, isNonNullableByDefault),
+ if (isImplicitCall) {
+ return new WrapInProblemInferenceResult(
+ inferredType,
+ templateNullableExpressionCallError.withArguments(
+ receiverType, isNonNullableByDefault),
offset,
- errorSpanLength);
+ noLength,
+ helper);
} else {
return new WrapInProblemInferenceResult(
inferredType,
templateNullableMethodCallError.withArguments(
targetName.name, receiverType, isNonNullableByDefault),
offset,
- errorSpanLength,
+ targetName.name.length,
helper);
}
}
@@ -2571,23 +2503,12 @@
if ((isOptionalPositional || isOptionalNamed) &&
isPotentiallyNonNullable(formal.type, coreTypes.futureOrClass) &&
!formal.hasDeclaredInitializer) {
- if (nnbdMode == NnbdMode.Weak) {
- library.addProblem(
- templateOptionalNonNullableWithoutInitializerWarning
- .withArguments(
- formal.name, formal.type, isNonNullableByDefault),
- formal.fileOffset,
- formal.name.length,
- library.importUri);
- } else {
- library.addProblem(
- templateOptionalNonNullableWithoutInitializerError
- .withArguments(
- formal.name, formal.type, isNonNullableByDefault),
- formal.fileOffset,
- formal.name.length,
- library.importUri);
- }
+ library.addProblem(
+ templateOptionalNonNullableWithoutInitializerError.withArguments(
+ formal.name, formal.type, isNonNullableByDefault),
+ formal.fileOffset,
+ formal.name.length,
+ library.importUri);
}
}
}
@@ -2596,21 +2517,12 @@
for (VariableDeclarationImpl formal in function.namedParameters) {
// Required named parameters shouldn't have initializers.
if (formal.isRequired && formal.hasDeclaredInitializer) {
- if (nnbdMode == NnbdMode.Weak) {
- library.addProblem(
- templateRequiredNamedParameterHasDefaultValueWarning
- .withArguments(formal.name),
- formal.fileOffset,
- formal.name.length,
- library.importUri);
- } else {
- library.addProblem(
- templateRequiredNamedParameterHasDefaultValueError
- .withArguments(formal.name),
- formal.fileOffset,
- formal.name.length,
- library.importUri);
- }
+ library.addProblem(
+ templateRequiredNamedParameterHasDefaultValueError
+ .withArguments(formal.name),
+ formal.fileOffset,
+ formal.name.length,
+ library.importUri);
}
}
}
@@ -2630,9 +2542,6 @@
this, function.asyncMarker, returnContext, needToSetReturnType);
this.closureContext = closureContext;
StatementInferenceResult bodyResult = inferStatement(function.body);
- if (bodyResult.hasChanged) {
- function.body = bodyResult.statement..parent = function;
- }
// If the closure is declared with `async*` or `sync*`, let `M` be the
// least upper bound of the types of the `yield` expressions in `B’`, or
@@ -2652,6 +2561,12 @@
new InstrumentationValueForType(inferredReturnType));
function.returnType = inferredReturnType;
}
+ bodyResult = closureContext.handleImplicitReturn(
+ this, function.body, bodyResult, fileOffset);
+
+ if (bodyResult.hasChanged) {
+ function.body = bodyResult.statement..parent = function;
+ }
this.closureContext = oldClosureContext;
return function.computeFunctionType(library.nonNullable);
}
@@ -2704,11 +2619,14 @@
Name name,
Arguments arguments,
DartType typeContext,
- List<VariableDeclaration> hoistedExpressions) {
+ List<VariableDeclaration> hoistedExpressions,
+ {bool isImplicitCall}) {
+ assert(isImplicitCall != null);
InvocationInferenceResult result = inferInvocation(
typeContext, fileOffset, unknownFunction, arguments, name,
hoistedExpressions: hoistedExpressions,
- receiverType: const DynamicType());
+ receiverType: const DynamicType(),
+ isImplicitCall: isImplicitCall);
assert(name != equalsName);
return createNullAwareExpressionInferenceResult(
result.inferredType,
@@ -2725,10 +2643,14 @@
Name name,
Arguments arguments,
DartType typeContext,
- List<VariableDeclaration> hoistedExpressions) {
+ List<VariableDeclaration> hoistedExpressions,
+ {bool isImplicitCall}) {
+ assert(isImplicitCall != null);
InvocationInferenceResult result = inferInvocation(
typeContext, fileOffset, unknownFunction, arguments, name,
- hoistedExpressions: hoistedExpressions, receiverType: receiverType);
+ hoistedExpressions: hoistedExpressions,
+ receiverType: receiverType,
+ isImplicitCall: isImplicitCall);
assert(name != equalsName);
return createNullAwareExpressionInferenceResult(
result.inferredType,
@@ -2748,14 +2670,21 @@
DartType typeContext,
List<VariableDeclaration> hoistedExpressions,
{bool isExpressionInvocation,
+ bool isImplicitCall,
Name implicitInvocationPropertyName}) {
+ assert(target.isMissing || target.isAmbiguous);
assert(isExpressionInvocation != null);
+ assert(isImplicitCall != null);
Expression error = createMissingMethodInvocation(
fileOffset, receiver, receiverType, name, arguments,
isExpressionInvocation: isExpressionInvocation,
- implicitInvocationPropertyName: implicitInvocationPropertyName);
+ implicitInvocationPropertyName: implicitInvocationPropertyName,
+ extensionAccessCandidates:
+ target.isAmbiguous ? target.candidates : null);
inferInvocation(typeContext, fileOffset, unknownFunction, arguments, name,
- hoistedExpressions: hoistedExpressions, receiverType: receiverType);
+ hoistedExpressions: hoistedExpressions,
+ receiverType: receiverType,
+ isImplicitCall: isExpressionInvocation || isImplicitCall);
assert(name != equalsName);
// TODO(johnniwinther): Use InvalidType instead.
return createNullAwareExpressionInferenceResult(
@@ -2771,7 +2700,9 @@
Name name,
Arguments arguments,
DartType typeContext,
- List<VariableDeclaration> hoistedExpressions) {
+ List<VariableDeclaration> hoistedExpressions,
+ {bool isImplicitCall}) {
+ assert(isImplicitCall != null);
assert(target.isExtensionMember);
DartType calleeType = getGetterType(target, receiverType);
FunctionType functionType = getFunctionType(target, receiverType);
@@ -2783,6 +2714,7 @@
staticInvocation, calleeType, callName, arguments, typeContext,
hoistedExpressions: hoistedExpressions,
isExpressionInvocation: false,
+ isImplicitCall: true,
implicitInvocationPropertyName: name);
} else {
StaticInvocation staticInvocation = transformExtensionMethodInvocation(
@@ -2791,7 +2723,8 @@
fileOffset, functionType, staticInvocation.arguments, name,
hoistedExpressions: hoistedExpressions,
receiverType: receiverType,
- isImplicitExtensionMember: true);
+ isImplicitExtensionMember: true,
+ isImplicitCall: isImplicitCall);
if (!isTopLevel) {
library.checkBoundsInStaticInvocation(staticInvocation,
typeSchemaEnvironment, helper.uri, getTypeArgumentsInfo(arguments));
@@ -2809,12 +2742,16 @@
ObjectAccessTarget target,
Arguments arguments,
DartType typeContext,
- List<VariableDeclaration> hoistedExpressions) {
+ List<VariableDeclaration> hoistedExpressions,
+ {bool isImplicitCall}) {
+ assert(isImplicitCall != null);
assert(target.isCallFunction);
FunctionType functionType = getFunctionType(target, receiverType);
InvocationInferenceResult result = inferInvocation(
typeContext, fileOffset, functionType, arguments, callName,
- hoistedExpressions: hoistedExpressions, receiverType: receiverType);
+ hoistedExpressions: hoistedExpressions,
+ receiverType: receiverType,
+ isImplicitCall: isImplicitCall);
// TODO(johnniwinther): Check that type arguments against the bounds.
return createNullAwareExpressionInferenceResult(
result.inferredType,
@@ -2831,7 +2768,9 @@
ObjectAccessTarget target,
Arguments arguments,
DartType typeContext,
- List<VariableDeclaration> hoistedExpressions) {
+ List<VariableDeclaration> hoistedExpressions,
+ {bool isImplicitCall}) {
+ assert(isImplicitCall != null);
assert(target.isInstanceMember);
Procedure method = target.member;
assert(method.kind == ProcedureKind.Method,
@@ -2870,7 +2809,9 @@
}
InvocationInferenceResult result = inferInvocation(
typeContext, fileOffset, functionType, arguments, target.member?.name,
- hoistedExpressions: hoistedExpressions, receiverType: receiverType);
+ hoistedExpressions: hoistedExpressions,
+ receiverType: receiverType,
+ isImplicitCall: isImplicitCall);
Expression replacement;
if (contravariantCheck) {
@@ -2968,7 +2909,7 @@
}
}
ExpressionInferenceResult invocationResult = inferMethodInvocation(
- fileOffset,
+ arguments.fileOffset,
const Link<NullAwareGuard>(),
propertyGet,
calleeType,
@@ -2977,6 +2918,7 @@
typeContext,
hoistedExpressions: hoistedExpressions,
isExpressionInvocation: false,
+ isImplicitCall: true,
implicitInvocationPropertyName: getter.name);
if (isExpressionInvocation) {
@@ -3081,7 +3023,7 @@
}
ExpressionInferenceResult invocationResult = inferMethodInvocation(
- fileOffset,
+ arguments.fileOffset,
const Link<NullAwareGuard>(),
propertyGet,
calleeType,
@@ -3089,6 +3031,7 @@
arguments,
typeContext,
isExpressionInvocation: false,
+ isImplicitCall: true,
hoistedExpressions: hoistedExpressions,
implicitInvocationPropertyName: field.name);
@@ -3134,9 +3077,11 @@
Arguments arguments,
DartType typeContext,
{bool isExpressionInvocation,
+ bool isImplicitCall,
Name implicitInvocationPropertyName,
List<VariableDeclaration> hoistedExpressions}) {
assert(isExpressionInvocation != null);
+ assert(isImplicitCall != null);
ObjectAccessTarget target = findInterfaceMember(
receiverType, name, fileOffset,
instrumented: true, includeExtensionMethods: true);
@@ -3164,7 +3109,8 @@
target,
arguments,
typeContext,
- hoistedExpressions);
+ hoistedExpressions,
+ isImplicitCall: isImplicitCall);
}
} else {
return _inferInstanceFieldInvocation(
@@ -3181,7 +3127,8 @@
break;
case ObjectAccessTargetKind.callFunction:
return _inferFunctionInvocation(fileOffset, nullAwareGuards, receiver,
- receiverType, target, arguments, typeContext, hoistedExpressions);
+ receiverType, target, arguments, typeContext, hoistedExpressions,
+ isImplicitCall: isImplicitCall);
case ObjectAccessTargetKind.extensionMember:
return _inferExtensionInvocation(
fileOffset,
@@ -3192,7 +3139,9 @@
name,
arguments,
typeContext,
- hoistedExpressions);
+ hoistedExpressions,
+ isImplicitCall: isImplicitCall);
+ case ObjectAccessTargetKind.ambiguous:
case ObjectAccessTargetKind.missing:
return _inferMissingInvocation(
fileOffset,
@@ -3205,15 +3154,18 @@
typeContext,
hoistedExpressions,
isExpressionInvocation: isExpressionInvocation,
+ isImplicitCall: isImplicitCall,
implicitInvocationPropertyName: implicitInvocationPropertyName);
case ObjectAccessTargetKind.dynamic:
case ObjectAccessTargetKind.invalid:
case ObjectAccessTargetKind.unresolved:
return _inferDynamicInvocation(fileOffset, nullAwareGuards, receiver,
- name, arguments, typeContext, hoistedExpressions);
+ name, arguments, typeContext, hoistedExpressions,
+ isImplicitCall: isExpressionInvocation || isImplicitCall);
case ObjectAccessTargetKind.never:
return _inferNeverInvocation(fileOffset, nullAwareGuards, receiver,
- receiverType, name, arguments, typeContext, hoistedExpressions);
+ receiverType, name, arguments, typeContext, hoistedExpressions,
+ isImplicitCall: isImplicitCall);
}
return unhandled(
'$target', 'inferMethodInvocation', fileOffset, uriForInstrumentation);
@@ -3604,115 +3556,175 @@
}
}
+ Expression _reportMissingOrAmbiguousMember(
+ int fileOffset,
+ int length,
+ DartType receiverType,
+ Name name,
+ List<ExtensionAccessCandidate> extensionAccessCandidates,
+ Template<Message Function(String, DartType, bool)> missingTemplate,
+ Template<Message Function(String, DartType, bool)> ambiguousTemplate) {
+ List<LocatedMessage> context;
+ Template<Message Function(String, DartType, bool)> template =
+ missingTemplate;
+ if (extensionAccessCandidates != null) {
+ context = extensionAccessCandidates
+ .map((ExtensionAccessCandidate c) =>
+ messageAmbiguousExtensionCause.withLocation(
+ c.memberBuilder.fileUri,
+ c.memberBuilder.charOffset,
+ name == unaryMinusName ? 1 : c.memberBuilder.name.length))
+ .toList();
+ template = ambiguousTemplate;
+ }
+ return helper.buildProblem(
+ template.withArguments(name.name, resolveTypeParameter(receiverType),
+ isNonNullableByDefault),
+ fileOffset,
+ length,
+ context: context);
+ }
+
Expression createMissingMethodInvocation(int fileOffset, Expression receiver,
DartType receiverType, Name name, Arguments arguments,
- {bool isExpressionInvocation, Name implicitInvocationPropertyName}) {
+ {bool isExpressionInvocation,
+ Name implicitInvocationPropertyName,
+ List<ExtensionAccessCandidate> extensionAccessCandidates}) {
assert(isExpressionInvocation != null);
if (isTopLevel) {
return engine.forest
.createMethodInvocation(fileOffset, receiver, name, arguments);
} else if (implicitInvocationPropertyName != null) {
+ assert(extensionAccessCandidates == null);
return helper.buildProblem(
templateInvokeNonFunction
.withArguments(implicitInvocationPropertyName.name),
fileOffset,
implicitInvocationPropertyName.name.length);
} else {
- return helper.buildProblem(
- templateUndefinedMethod.withArguments(name.name,
- resolveTypeParameter(receiverType), isNonNullableByDefault),
+ return _reportMissingOrAmbiguousMember(
fileOffset,
- isExpressionInvocation ? noLength : name.name.length);
+ isExpressionInvocation ? noLength : name.name.length,
+ receiverType,
+ name,
+ extensionAccessCandidates,
+ templateUndefinedMethod,
+ templateAmbiguousExtensionMethod);
}
}
Expression createMissingPropertyGet(int fileOffset, Expression receiver,
- DartType receiverType, Name propertyName) {
+ DartType receiverType, Name propertyName,
+ {List<ExtensionAccessCandidate> extensionAccessCandidates}) {
if (isTopLevel) {
return engine.forest
.createPropertyGet(fileOffset, receiver, propertyName);
} else {
- return helper.buildProblem(
- templateUndefinedGetter.withArguments(propertyName.name,
- resolveTypeParameter(receiverType), isNonNullableByDefault),
+ return _reportMissingOrAmbiguousMember(
fileOffset,
- propertyName.name.length);
+ propertyName.name.length,
+ receiverType,
+ propertyName,
+ extensionAccessCandidates,
+ templateUndefinedGetter,
+ templateAmbiguousExtensionProperty);
}
}
Expression createMissingPropertySet(int fileOffset, Expression receiver,
DartType receiverType, Name propertyName, Expression value,
- {bool forEffect}) {
+ {bool forEffect,
+ List<ExtensionAccessCandidate> extensionAccessCandidates}) {
assert(forEffect != null);
if (isTopLevel) {
return engine.forest.createPropertySet(
fileOffset, receiver, propertyName, value,
forEffect: forEffect);
} else {
- return helper.buildProblem(
- templateUndefinedSetter.withArguments(propertyName.name,
- resolveTypeParameter(receiverType), isNonNullableByDefault),
+ return _reportMissingOrAmbiguousMember(
fileOffset,
- propertyName.name.length);
+ propertyName.name.length,
+ receiverType,
+ propertyName,
+ extensionAccessCandidates,
+ templateUndefinedSetter,
+ templateAmbiguousExtensionProperty);
}
}
Expression createMissingIndexGet(int fileOffset, Expression receiver,
- DartType receiverType, Expression index) {
+ DartType receiverType, Expression index,
+ {List<ExtensionAccessCandidate> extensionAccessCandidates}) {
if (isTopLevel) {
return engine.forest.createIndexGet(fileOffset, receiver, index);
} else {
- return helper.buildProblem(
- templateUndefinedMethod.withArguments(indexGetName.name,
- resolveTypeParameter(receiverType), isNonNullableByDefault),
+ return _reportMissingOrAmbiguousMember(
fileOffset,
- noLength);
+ noLength,
+ receiverType,
+ indexGetName,
+ extensionAccessCandidates,
+ templateUndefinedOperator,
+ templateAmbiguousExtensionOperator);
}
}
Expression createMissingIndexSet(int fileOffset, Expression receiver,
DartType receiverType, Expression index, Expression value,
- {bool forEffect, bool readOnlyReceiver}) {
+ {bool forEffect,
+ bool readOnlyReceiver,
+ List<ExtensionAccessCandidate> extensionAccessCandidates}) {
assert(forEffect != null);
assert(readOnlyReceiver != null);
if (isTopLevel) {
return engine.forest.createIndexSet(fileOffset, receiver, index, value,
forEffect: forEffect, readOnlyReceiver: readOnlyReceiver);
} else {
- return helper.buildProblem(
- templateUndefinedMethod.withArguments(indexSetName.name,
- resolveTypeParameter(receiverType), isNonNullableByDefault),
+ return _reportMissingOrAmbiguousMember(
fileOffset,
- noLength);
+ noLength,
+ receiverType,
+ indexSetName,
+ extensionAccessCandidates,
+ templateUndefinedOperator,
+ templateAmbiguousExtensionOperator);
}
}
Expression createMissingBinary(int fileOffset, Expression left,
- DartType leftType, Name binaryName, Expression right) {
+ DartType leftType, Name binaryName, Expression right,
+ {List<ExtensionAccessCandidate> extensionAccessCandidates}) {
assert(binaryName != equalsName);
if (isTopLevel) {
return engine.forest.createMethodInvocation(fileOffset, left, binaryName,
engine.forest.createArguments(fileOffset, <Expression>[right]));
} else {
- return helper.buildProblem(
- templateUndefinedMethod.withArguments(binaryName.name,
- resolveTypeParameter(leftType), isNonNullableByDefault),
+ return _reportMissingOrAmbiguousMember(
fileOffset,
- binaryName.name.length);
+ binaryName.name.length,
+ leftType,
+ binaryName,
+ extensionAccessCandidates,
+ templateUndefinedOperator,
+ templateAmbiguousExtensionOperator);
}
}
Expression createMissingUnary(int fileOffset, Expression expression,
- DartType expressionType, Name unaryName) {
+ DartType expressionType, Name unaryName,
+ {List<ExtensionAccessCandidate> extensionAccessCandidates}) {
if (isTopLevel) {
return new UnaryExpression(unaryName, expression)
..fileOffset = fileOffset;
} else {
- return helper.buildProblem(
- templateUndefinedMethod.withArguments(unaryName.name,
- resolveTypeParameter(expressionType), isNonNullableByDefault),
+ return _reportMissingOrAmbiguousMember(
fileOffset,
- unaryName == unaryMinusName ? 1 : unaryName.name.length);
+ unaryName == unaryMinusName ? 1 : unaryName.name.length,
+ expressionType,
+ unaryName,
+ extensionAccessCandidates,
+ templateUndefinedOperator,
+ templateAmbiguousExtensionOperator);
}
}
}
@@ -3863,7 +3875,8 @@
p.bound = substitution.substituteType(p.bound);
}
// Use instantiate to bounds.
- List<DartType> bounds = calculateBounds(parameters, coreTypes.objectClass);
+ List<DartType> bounds = calculateBounds(
+ parameters, coreTypes.objectClass, classNode.enclosingLibrary);
for (int i = 0; i < mixedInType.typeArguments.length; ++i) {
mixedInType.typeArguments[i] = bounds[i];
}
@@ -4101,6 +4114,7 @@
never,
invalid,
missing,
+ ambiguous,
// TODO(johnniwinther): Remove this.
unresolved,
}
@@ -4181,6 +4195,14 @@
/// Returns `true` if this is an access with no target.
bool get isMissing => kind == ObjectAccessTargetKind.missing;
+ /// Returns `true` if this is an access with no unambiguous target. This
+ /// occurs when an implicit extension access is ambiguous.
+ bool get isAmbiguous => kind == ObjectAccessTargetKind.ambiguous;
+
+ /// Returns the candidates for an ambiguous extension access.
+ List<ExtensionAccessCandidate> get candidates =>
+ throw new UnsupportedError('ObjectAccessTarget.candidates');
+
/// Returns the original procedure kind, if this is an extension method
/// target.
///
@@ -4223,14 +4245,26 @@
'$inferredExtensionTypeArguments)';
}
+class AmbiguousExtensionAccessTarget extends ObjectAccessTarget {
+ @override
+ final List<ExtensionAccessCandidate> candidates;
+
+ AmbiguousExtensionAccessTarget(this.candidates)
+ : super.internal(ObjectAccessTargetKind.ambiguous, null);
+
+ @override
+ String toString() => 'AmbiguousExtensionAccessTarget($kind,$candidates)';
+}
+
class ExtensionAccessCandidate {
+ final MemberBuilder memberBuilder;
final bool isPlatform;
final DartType onType;
final DartType onTypeInstantiateToBounds;
final ObjectAccessTarget target;
- ExtensionAccessCandidate(
- this.onType, this.onTypeInstantiateToBounds, this.target,
+ ExtensionAccessCandidate(this.memberBuilder, this.onType,
+ this.onTypeInstantiateToBounds, this.target,
{this.isPlatform})
: assert(isPlatform != null);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
index a632f1a..48410b5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
@@ -86,6 +86,11 @@
@override
UnknownType withNullability(Nullability nullability) => this;
+
+ @override
+ String toString() {
+ return "UnknownType()";
+ }
}
/// Visitor that computes [isKnown].
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index adb3a6e..c88c6a6 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -14,6 +14,9 @@
AbstractRedirectedClassInstantiation/example: Fail
AccessError/analyzerCode: Fail
AccessError/example: Fail
+AmbiguousExtensionMethod/analyzerCode: Fail
+AmbiguousExtensionOperator/analyzerCode: Fail
+AmbiguousExtensionProperty/analyzerCode: Fail
AmbiguousSupertypes/example: Fail
AnnotationOnEnumConstant/example: Fail
AnnotationOnFunctionTypeTypeVariable/analyzerCode: Fail
@@ -223,6 +226,8 @@
ExportOptOutFromOptIn/part_wrapped_script: Fail
ExpressionNotMetadata/analyzerCode: Fail
ExpressionNotMetadata/example: Fail
+ExtendFunction/part_wrapped_script: Fail
+ExtendFunction/script: Fail # TODO(johnniwinther): This message is currently ignored.
ExtendingEnum/example: Fail
ExtendingRestricted/example: Fail
ExtendsDynamic/analyzerCode: Fail # Feature not yet in analyzer.
@@ -340,6 +345,8 @@
IllegalRecursiveType/part_wrapped_script: Fail
IllegalRecursiveType/script: Fail
IllegalSyncGeneratorVoidReturnType/analyzerCode: Fail # The analyzer doesn't report this error.
+ImplementFunction/part_wrapped_script: Fail
+ImplementFunction/script: Fail # TODO(johnniwinther): This message is currently ignored.
ImplementsBeforeExtends/part_wrapped_script: Fail
ImplementsBeforeExtends/script: Fail
ImplementsBeforeOn/part_wrapped_script: Fail
@@ -360,6 +367,7 @@
ImplicitCallOfNonMethod/example: Fail
ImplicitMixinOverride/analyzerCode: Fail
ImplicitMixinOverride/example: Fail
+ImplicitReturnNull/analyzerCode: Fail
ImportAfterPart/part_wrapped_script1: Fail
ImportAfterPart/script1: Fail
IncompatibleRedirecteeFunctionType/part_wrapped_script6: Fail
@@ -451,6 +459,8 @@
MissingPartOf/part_wrapped_script: Fail # Using 'part' in the (now) part.
MissingPrefixInDeferredImport/example: Fail
MixinDeclaresConstructor/example: Fail
+MixinFunction/part_wrapped_script: Fail
+MixinFunction/script: Fail # TODO(johnniwinther): This message is currently ignored.
MixinInferenceNoMatchingClass/example: Fail
ModifierOutOfOrder/part_wrapped_script1: Fail
ModifierOutOfOrder/script1: Fail
@@ -482,8 +492,9 @@
NonNullAwareSpreadIsNull/analyzerCode: Fail # There's no analyzer code for that error yet.
NonNullableInNullAware/analyzerCode: Fail
NonNullableInNullAware/example: Fail
+NonNullableLateDefinitelyAssignedError/analyzerCode: Fail
+NonNullableLateDefinitelyUnassignedError/analyzerCode: Fail
NonNullableNotAssignedError/analyzerCode: Fail
-NonNullableNotAssignedError/example: Fail
NonNullableNotAssignedWarning/analyzerCode: Fail
NonNullableNotAssignedWarning/example: Fail
NonNullableOptOut/analyzerCode: Fail
@@ -540,6 +551,7 @@
OverrideFewerNamedArguments/example: Fail
OverrideFewerPositionalArguments/example: Fail
OverrideMismatchNamedParameter/example: Fail
+OverrideMismatchRequiredNamedParameter/analyzerCode: Fail
OverrideMoreRequiredArguments/example: Fail
OverrideTypeMismatchParameter/example: Fail
OverrideTypeMismatchParameterWarning/example: Fail
@@ -651,6 +663,7 @@
TypeVariableSameNameAsEnclosing/example: Fail
TypedefNotFunction/example: Fail
TypedefNotType/example: Fail # Feature not yet enabled by default.
+TypedefNullableType/analyzerCode: Fail
UnexpectedToken/part_wrapped_script1: Fail
UnexpectedToken/script1: Fail
UnmatchedToken/part_wrapped_script1: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 12dc0e6..a2740b1 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -2007,6 +2007,10 @@
template: "This is the inherited member."
severity: CONTEXT
+DeclaredMemberConflictsWithInheritedMembersCause:
+ template: "This is one of the inherited members."
+ severity: CONTEXT
+
InheritedMembersConflict:
template: "Can't inherit members that conflict with each other."
analyzerCode: CONFLICTS_WITH_INHERITED_MEMBER
@@ -2080,31 +2084,25 @@
tip: "Change to a supertype of '#type2', or, for a covariant parameter, a subtype."
analyzerCode: INVALID_METHOD_OVERRIDE
-OverrideTypeMismatchParameterWarning:
- template: "The parameter '#name' of the method '#name2' has type '#type', which does not match the corresponding type, '#type2', in the overridden method, '#name3'."
- tip: "Change to a supertype of '#type2', or, for a covariant parameter, a subtype."
- severity: WARNING
- analyzerCode: INVALID_METHOD_OVERRIDE
-
OverrideTypeMismatchReturnType:
template: "The return type of the method '#name' is '#type', which does not match the return type, '#type2', of the overridden method, '#name2'."
tip: "Change to a subtype of '#type2'."
analyzerCode: INVALID_METHOD_OVERRIDE
-OverrideTypeMismatchReturnTypeWarning:
- template: "The return type of the method '#name' is '#type', which does not match the return type, '#type2', of the overridden method, '#name2'."
- tip: "Change to a subtype of '#type2'."
- severity: WARNING
- analyzerCode: INVALID_METHOD_OVERRIDE
-
OverrideTypeMismatchSetter:
template: "The field '#name' has type '#type', which does not match the corresponding type, '#type2', in the overridden setter, '#name2'."
analyzerCode: INVALID_METHOD_OVERRIDE
-OverrideTypeMismatchSetterWarning:
- template: "The field '#name' has type '#type', which does not match the corresponding type, '#type2', in the overridden setter, '#name2'."
- severity: WARNING
- analyzerCode: INVALID_METHOD_OVERRIDE
+OverrideMismatchRequiredNamedParameter:
+ template: "The required named parameter '#name' in method '#name2' is not required in overridden method '#name3'."
+ configuration: nnbd-strong
+ script: |
+ abstract class A {
+ method({int? a});
+ }
+ abstract class B implements A {
+ method({required int? a});
+ }
PartOfSelf:
template: "A file can't be a part of itself."
@@ -2198,6 +2196,11 @@
template: "Can't create typedef from non-type."
analyzerCode: INVALID_TYPE_IN_TYPEDEF
+TypedefNullableType:
+ template: "Can't create typedef from nullable type."
+ configuration: nnbd-strong
+ script: typedef F = void Function()?;
+
LibraryDirectiveNotFirst:
index: 37
template: "The library directive must appear before all other directives."
@@ -2781,10 +2784,6 @@
ConstConstructorLateFinalFieldError:
template: "Constructor is marked 'const' so fields can't be late."
-ConstConstructorLateFinalFieldWarning:
- template: "Constructor is marked 'const' and some fields are late."
- severity: WARNING
-
ConstConstructorLateFinalFieldCause:
template: "Field is late, but constructor is 'const'."
severity: CONTEXT
@@ -2923,10 +2922,6 @@
i = 1.5;
}
-InvalidAssignmentWarning:
- template: "Assigning value of type '#type' to a variable of type '#type2'."
- severity: WARNING
-
PatchClassTypeVariablesMismatch:
template: "A patch class must have the same number of type variables as its origin class."
@@ -3031,6 +3026,57 @@
c.foo();
}
+UndefinedOperator:
+ template: "The operator '#name' isn't defined for the class '#type'."
+ tip: "Try correcting the operator to an existing operator, or defining a '#name' operator."
+ analyzerCode: UNDEFINED_METHOD
+ script: >
+ class C {}
+ main() {
+ C c;
+ c + 0;
+ }
+
+AmbiguousExtensionMethod:
+ template: "The method '#name' is defined in multiple extensions for '#type' and neither is more specific."
+ tip: "Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope."
+ script: |
+ class C {}
+ extension A on C { method() {} }
+ extension B on C { method() {} }
+ main() {
+ C c = new C();
+ c.method();
+ }
+
+AmbiguousExtensionProperty:
+ template: "The property '#name' is defined in multiple extensions for '#type' and neither is more specific."
+ tip: "Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope."
+ script: |
+ class C {}
+ extension A on C { get property => null; }
+ extension B on C { set property(_) {} }
+ main() {
+ C c = new C();
+ c.property;
+ }
+
+AmbiguousExtensionOperator:
+ template: "The operator '#name' is defined in multiple extensions for '#type' and neither is more specific."
+ tip: "Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope."
+ script: |
+ class C {}
+ extension A on C { operator +(int i) {} }
+ extension B on C { operator +(int i) {} }
+ main() {
+ C c = new C();
+ c + 0;
+ }
+
+AmbiguousExtensionCause:
+ template: "This is one of the extension members."
+ severity: CONTEXT
+
SourceOutlineSummary:
template: |
Built outlines for #count compilation units (#count2 bytes) in #num1%.3ms, that is,
@@ -3301,6 +3347,12 @@
analyzerCode: RETURN_WITHOUT_VALUE
declaration: "int foo() { return; }"
+ImplicitReturnNull:
+ template: "A non-null value must be returned since the return type '#type' doesn't allow null."
+ configuration: nnbd-strong
+ script: |
+ String method() {}
+
RethrowNotCatch:
template: "'rethrow' can only be used in catch clauses."
analyzerCode: RETHROW_OUTSIDE_CATCH
@@ -3395,11 +3447,6 @@
}
class B<T extends int, S extends String> implements A<T> {}
-IncompatibleRedirecteeFunctionTypeWarning:
- template: "The constructor function type '#type' isn't a subtype of '#type2'."
- severity: WARNING
- analyzerCode: REDIRECT_TO_INVALID_TYPE
-
RedirectingFactoryIncompatibleTypeArgument:
template: "The type '#type' doesn't extend '#type2'."
tip: "Try using a different type as argument."
@@ -3411,12 +3458,6 @@
}
class B<T extends int, S extends String> implements A<T> {}
-RedirectingFactoryIncompatibleTypeArgumentWarning:
- template: "The type '#type' doesn't extend '#type2'."
- tip: "Try using a different type as argument."
- severity: WARNING
- analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
SyntheticToken:
template: "This couldn't be parsed."
frontendInternal: true
@@ -3429,12 +3470,6 @@
class C<T extends num> {}
main() { new C<String>(); }
-IncorrectTypeArgumentWarning:
- template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
- tip: "Try changing type arguments so that they conform to the bounds."
- severity: WARNING
- analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
IncorrectTypeArgumentQualified:
template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
tip: "Try changing type arguments so that they conform to the bounds."
@@ -3443,12 +3478,6 @@
class C<T> { foo<U extends num>() {} }
main() { new C<String>().foo<String>(); }
-IncorrectTypeArgumentQualifiedWarning:
- template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
- tip: "Try changing type arguments so that they conform to the bounds."
- severity: WARNING
- analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
IncorrectTypeArgumentInSupertype:
template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
tip: "Try changing type arguments so that they conform to the bounds."
@@ -3457,12 +3486,6 @@
class A<T extends num> {}
class B extends A<String> {}
-IncorrectTypeArgumentInSupertypeWarning:
- template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
- tip: "Try changing type arguments so that they conform to the bounds."
- severity: WARNING
- analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
IncorrectTypeArgumentInReturnType:
template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type."
tip: "Try changing type arguments so that they conform to the bounds."
@@ -3471,12 +3494,6 @@
class A<T extends num> {}
A<String> foo() => null;
-IncorrectTypeArgumentInReturnTypeWarning:
- template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type."
- tip: "Try changing type arguments so that they conform to the bounds."
- severity: WARNING
- analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
IncorrectTypeArgumentInferred:
template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
tip: "Try specifying type arguments explicitly so that they conform to the bounds."
@@ -3485,12 +3502,6 @@
void foo<T extends num>(T t) {}
main() { foo("bar"); }
-IncorrectTypeArgumentInferredWarning:
- template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
- tip: "Try specifying type arguments explicitly so that they conform to the bounds."
- severity: WARNING
- analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
IncorrectTypeArgumentQualifiedInferred:
template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
tip: "Try specifying type arguments explicitly so that they conform to the bounds."
@@ -3499,12 +3510,6 @@
class C<T> { foo<U extends num>(U u) {} }
main() { new C<String>().foo(""); }
-IncorrectTypeArgumentQualifiedInferredWarning:
- template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
- tip: "Try specifying type arguments explicitly so that they conform to the bounds."
- severity: WARNING
- analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
IncorrectTypeArgumentInSupertypeInferred:
template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
tip: "Try specifying type arguments explicitly so that they conform to the bounds."
@@ -3513,12 +3518,6 @@
class A<T extends A<T>> {}
class B extends A {}
-IncorrectTypeArgumentInSupertypeInferredWarning:
- template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
- tip: "Try specifying type arguments explicitly so that they conform to the bounds."
- severity: WARNING
- analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
IncorrectTypeArgumentVariable:
template: "This is the type variable whose bound isn't conformed to."
severity: CONTEXT
@@ -3894,64 +3893,29 @@
template: "Property '#name' cannot be accessed on '#type' because it is potentially null."
tip: "Try accessing using ?. instead."
-NullablePropertyAccessWarning:
- template: "Property '#name' is accessed on '#type' which is potentially null."
- tip: "Try accessing using ?. instead."
- severity: WARNING
-
NullableMethodCallError:
template: "Method '#name' cannot be called on '#type' because it is potentially null."
tip: "Try calling using ?. instead."
-NullableMethodCallWarning:
- template: "Method '#name' is called on '#type' which is potentially null."
- tip: "Try calling using ?. instead."
- severity: WARNING
-
NullableExpressionCallError:
template: "Can't use an expression of type '#type' as a function because it's potentially null."
tip: "Try calling using ?.call instead."
-NullableExpressionCallWarning:
- template: "Expression of type '#type' is used as a function, but it's potentially null."
- tip: "Try calling using ?.call instead."
- severity: WARNING
-
NullableOperatorCallError:
template: "Operator '#name' cannot be called on '#type' because it is potentially null."
-NullableOperatorCallWarning:
- template: "Operator '#name' is called on '#type' which is potentially null."
- severity: WARNING
-
NullableTearoffError:
template: "Can't tear off method '#name' from a potentially null value."
-NullableTearoffWarning:
- template: "Tearing off method '#name' from a potentially null value."
- severity: WARNING
-
ThrowingNotAssignableToObjectError:
template: "Can't throw a value of '#type' since it is neither dynamic nor non-nullable."
-ThrowingNotAssignableToObjectWarning:
- template: "Throwing a value of '#type' that is neither dynamic nor non-nullable."
- severity: WARNING
-
RequiredNamedParameterHasDefaultValueError:
template: "Named parameter '#name' is required and can't have a default value."
-RequiredNamedParameterHasDefaultValueWarning:
- template: "Named parameter '#name' is required and has a default value."
- severity: WARNING
-
ValueForRequiredParameterNotProvidedError:
template: "Required named parameter '#name' must be provided."
-ValueForRequiredParameterNotProvidedWarning:
- template: "Missing required named parameter '#name'."
- severity: WARNING
-
OptionalNonNullableWithoutInitializerError:
template: "Optional parameter '#name' should have a default value because its type '#type' doesn't allow null."
configuration: nnbd-strong
@@ -3959,28 +3923,12 @@
- method1({int a}) {}
- method2([int a]) {}
-OptionalNonNullableWithoutInitializerWarning:
- template: "Optional parameter '#name' doesn't have a default value and its type '#type' doesn't allow null."
- configuration: nnbd-weak
- severity: WARNING
- script:
- - method1({int a}) {}
- - method2([int a]) {}
-
FieldNonNullableWithoutInitializerError:
template: "Field '#name' should be initialized because its type '#type' doesn't allow null."
-FieldNonNullableWithoutInitializerWarning:
- template: "Field '#name' isn't initialized and its type '#type' doesn't allow null."
- severity: WARNING
-
FieldNonNullableNotInitializedByConstructorError:
template: "This constructor should initialize field '#name' because its type '#type' doesn't allow null."
-FieldNonNullableNotInitializedByConstructorWarning:
- template: "This constructor doesn't initialize field '#name' and its type '#type' doesn't allow null."
- severity: WARNING
-
NonNullableOptOut:
template: "Null safety features are disabled for this library."
# Used to be this:
@@ -3998,24 +3946,12 @@
NullableSuperclassError:
template: "Can't extend '#name' because it's marked with '?'."
-NullableSuperclassWarning:
- template: "Extending '#name' marked with '?'."
- severity: WARNING
-
NullableInterfaceError:
template: "Can't implement '#name' because it's marked with '?'."
-NullableInterfaceWarning:
- template: "Implementing '#name' marked with '?'."
- severity: WARNING
-
NullableMixinError:
template: "Can't mix '#name' in because it's marked with '?'."
-NullableMixinWarning:
- template: "Mixing in '#name' marked with '?'."
- severity: WARNING
-
JsInteropIndexNotSupported:
template: "JS interop classes do not support [] and []= operator methods."
tip: "Try replacing with a normal method."
@@ -4028,21 +3964,35 @@
template: "Can't use the default List constructor."
tip: "Try using List.filled instead."
-DefaultListConstructorWarning:
- template: "Using the default List constructor."
- tip: "Try using List.filled instead."
- severity: WARNING
-
NonNullableInNullAware:
template: "Operand of null-aware operation '#name' has type '#type' which excludes null."
severity: WARNING
NonNullableNotAssignedError:
template: "Non-nullable variable '#name' must be assigned before it can be used."
+ configuration: nnbd-strong
+ script: |
+ method<T>() {
+ T t; t;
+ }
-NonNullableNotAssignedWarning:
- template: "Non-nullable variable '#name' is used before it's assigned."
- severity: WARNING
+NonNullableLateDefinitelyUnassignedError:
+ template: "Non-nullable late variable '#name' without initializer is definitely unassigned."
+ configuration: nnbd-strong
+ script: |
+ method<T>() {
+ late T t; t;
+ }
+
+NonNullableLateDefinitelyAssignedError:
+ template: "Non-nullable late final variable '#name' definitely assigned."
+ configuration: nnbd-strong
+ script: |
+ method() {
+ late final int t;
+ t = 0;
+ t = 0;
+ }
NonAgnosticConstant:
template: "Constant value is not strong/weak mode agnostic."
@@ -4056,3 +4006,25 @@
lib.dart: |
// @dart=2.5
class A {}
+
+ExtendFunction:
+ template: "Extending 'Function' is deprecated."
+ tip: "Try removing 'Function' from the 'extends' clause."
+ severity: IGNORED
+ script: |
+ class A extends Function {}
+
+ImplementFunction:
+ template: "Implementing 'Function' is deprecated."
+ tip: "Try removing 'Function' from the 'implements' clause."
+ severity: IGNORED
+ script: |
+ class A implements Function {}
+
+MixinFunction:
+ template: "Mixing in 'Function' is deprecated."
+ tip: "Try removing 'Function' from the 'with' clause."
+ severity: IGNORED
+ script: |
+ class A extends Object with Function {}
+
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 27e21fc..fdb1fc7 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -168,9 +168,9 @@
}
}
- features[Tags.builderSupertype] = clsBuilder.supertype?.name;
- if (clsBuilder.interfaces != null) {
- for (TypeBuilder superinterface in clsBuilder.interfaces) {
+ features[Tags.builderSupertype] = clsBuilder.supertypeBuilder?.name;
+ if (clsBuilder.interfaceBuilders != null) {
+ for (TypeBuilder superinterface in clsBuilder.interfaceBuilders) {
features.addElement(Tags.builderInterfaces, superinterface.name);
}
}
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
index 11792bc..d08c6e5 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
@@ -38,11 +38,12 @@
expect(
greatestClosure(new FunctionType(
[unknownType], dynamicType, Nullability.legacy))
- .toString(),
+ .leakingDebugToString(),
'(dart.core::Null?) →* dynamic');
expect(
greatestClosure(new FunctionType([], dynamicType, Nullability.legacy,
- namedParameters: [new NamedType('foo', unknownType)])).toString(),
+ namedParameters: [new NamedType('foo', unknownType)]))
+ .leakingDebugToString(),
'({foo: dart.core::Null?}) →* dynamic');
}
@@ -51,18 +52,19 @@
greatestClosure(new FunctionType([
new FunctionType([unknownType], dynamicType, Nullability.legacy)
], dynamicType, Nullability.legacy))
- .toString(),
+ .leakingDebugToString(),
'((dynamic) →* dynamic) →* dynamic');
}
void test_greatestClosure_covariant() {
expect(
greatestClosure(new FunctionType([], unknownType, Nullability.legacy))
- .toString(),
+ .leakingDebugToString(),
'() →* dynamic');
expect(
greatestClosure(new InterfaceType(
- coreTypes.listClass, Nullability.legacy, [unknownType])).toString(),
+ coreTypes.listClass, Nullability.legacy, [unknownType]))
+ .leakingDebugToString(),
'dart.core::List<dynamic>*');
}
@@ -73,24 +75,25 @@
namedParameters: [
new NamedType('a', unknownType),
new NamedType('b', unknownType)
- ])).toString(),
+ ])).leakingDebugToString(),
'(dart.core::Null?, dart.core::Null?, {a: dart.core::Null?, '
'b: dart.core::Null?}) →* dynamic');
}
void test_greatestClosure_simple() {
- expect(greatestClosure(unknownType).toString(), 'dynamic');
+ expect(greatestClosure(unknownType).leakingDebugToString(), 'dynamic');
}
void test_leastClosure_contravariant() {
expect(
leastClosure(new FunctionType(
[unknownType], dynamicType, Nullability.legacy))
- .toString(),
+ .leakingDebugToString(),
'(dynamic) →* dynamic');
expect(
leastClosure(new FunctionType([], dynamicType, Nullability.legacy,
- namedParameters: [new NamedType('foo', unknownType)])).toString(),
+ namedParameters: [new NamedType('foo', unknownType)]))
+ .leakingDebugToString(),
'({foo: dynamic}) →* dynamic');
}
@@ -99,18 +102,19 @@
leastClosure(new FunctionType([
new FunctionType([unknownType], dynamicType, Nullability.legacy)
], dynamicType, Nullability.legacy))
- .toString(),
+ .leakingDebugToString(),
'((dart.core::Null?) →* dynamic) →* dynamic');
}
void test_leastClosure_covariant() {
expect(
leastClosure(new FunctionType([], unknownType, Nullability.legacy))
- .toString(),
+ .leakingDebugToString(),
'() →* dart.core::Null?');
expect(
leastClosure(new InterfaceType(
- coreTypes.listClass, Nullability.legacy, [unknownType])).toString(),
+ coreTypes.listClass, Nullability.legacy, [unknownType]))
+ .leakingDebugToString(),
'dart.core::List<dart.core::Null?>*');
}
@@ -121,12 +125,13 @@
namedParameters: [
new NamedType('a', unknownType),
new NamedType('b', unknownType)
- ])).toString(),
+ ])).leakingDebugToString(),
'(dynamic, dynamic, {a: dynamic, b: dynamic}) →* dart.core::Null?');
}
void test_leastClosure_simple() {
- expect(leastClosure(unknownType).toString(), 'dart.core::Null?');
+ expect(
+ leastClosure(unknownType).leakingDebugToString(), 'dart.core::Null?');
}
}
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index 997eb27..fef974e 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
@@ -40,7 +40,7 @@
typedef Typedef<T extends self::Object? = dynamic> = <S extends self::Object? = dynamic>(T%) → S%;
typedef VoidFunction = () → void;
-typedef TestDefaultTypes = () → self::DefaultTypes<dynamic, self::Object, self::List<dynamic>, self::List<self::Object>, self::Comparable<dynamic>, (<BottomType>) → void, () → self::Comparable<dynamic>>;
+typedef TestDefaultTypes = () → self::DefaultTypes<dynamic, self::Object, self::List<dynamic>, self::List<self::Object>, self::Comparable<dynamic>, (Never) → void, () → self::Comparable<dynamic>>;
typedef Id<T extends self::Object? = dynamic> = T%;
typedef TestSorting = ({a: self::int, b: self::int, c: self::int}) → void;
class Object {
@@ -69,7 +69,7 @@
}
class bool extends self::Object {
}
-class DefaultTypes<S extends self::Object? = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S%> = self::List<dynamic>, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>, X extends (self::DefaultTypes::W) → void = (<BottomType>) → void, Y extends () → self::DefaultTypes::W = () → self::Comparable<dynamic>> extends self::Object {
+class DefaultTypes<S extends self::Object? = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S%> = self::List<dynamic>, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>, X extends (self::DefaultTypes::W) → void = (Never) → void, Y extends () → self::DefaultTypes::W = () → self::Comparable<dynamic>> extends self::Object {
}
class Super extends self::Object implements self::Comparable<self::Sub> {
}
diff --git a/pkg/front_end/test/id_tests/definite_assignment_test.dart b/pkg/front_end/test/id_tests/definite_assignment_test.dart
index 02067af..cb48f84 100644
--- a/pkg/front_end/test/id_tests/definite_assignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_assignment_test.dart
@@ -46,6 +46,11 @@
member.accept(new DefiniteAssignmentDataExtractor(compilerResult, actualMap,
memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
}
+
+ /// Errors are supported for testing erroneous code. The reported errors are
+ /// not tested.
+ @override
+ bool get supportsErrors => true;
}
class DefiniteAssignmentDataExtractor extends CfeDataExtractor<String> {
diff --git a/pkg/front_end/test/id_tests/definite_unassignment_test.dart b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
index 06b8c7e..b22affb 100644
--- a/pkg/front_end/test/id_tests/definite_unassignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
@@ -48,6 +48,11 @@
actualMap,
memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
}
+
+ /// Errors are supported for testing erroneous code. The reported errors are
+ /// not tested.
+ @override
+ bool get supportsErrors => true;
}
class DefiniteUnassignmentDataExtractor extends CfeDataExtractor<String> {
diff --git a/pkg/front_end/test/id_tests/reachability_test.dart b/pkg/front_end/test/id_tests/reachability_test.dart
index 6c469fa..e0cb2cd 100644
--- a/pkg/front_end/test/id_tests/reachability_test.dart
+++ b/pkg/front_end/test/id_tests/reachability_test.dart
@@ -47,6 +47,11 @@
member.accept(new ReachabilityDataExtractor(compilerResult, actualMap,
memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
}
+
+ /// Errors are supported for testing erroneous code. The reported errors are
+ /// not tested.
+ @override
+ bool get supportsErrors => true;
}
class ReachabilityDataExtractor
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index d83c19d..a604ce3 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -109,8 +109,10 @@
body's
bof
bom
+bones
boolean
bother
+boundness
breadcrumbs
brianwilkerson
bs
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 00036f4..2e71a8a 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -564,6 +564,7 @@
conflicts
conform
conformed
+confuse
confused
connect
connected
@@ -1112,6 +1113,7 @@
fall
fallback
falls
+fallthrough
false
far
fashion
@@ -1327,6 +1329,7 @@
hidden
hide
hides
+hiding
hierarchies
hierarchy
high
@@ -3025,6 +3028,7 @@
unambiguous
unary
unassignable
+unassigned
unbalanced
unbind
uncertain
@@ -3095,6 +3099,7 @@
untranslatable
untyped
unused
+unwanted
unwrap
unwrapped
up
@@ -3175,6 +3180,7 @@
walk
walked
want
+wanted
warn
warning
warnings
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 46fbd01..1f0db0c 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -197,6 +197,7 @@
finder
fisk
five
+flagged
floor
fluctuate
foo1
@@ -345,6 +346,7 @@
newest
newworld
ninja
+nondefault
nonexisting
noo
numerator
diff --git a/pkg/front_end/test/static_types/data/class_call.dart b/pkg/front_end/test/static_types/data/class_call.dart
index 134c441..6575688 100644
--- a/pkg/front_end/test/static_types/data/class_call.dart
+++ b/pkg/front_end/test/static_types/data/class_call.dart
@@ -11,14 +11,17 @@
}
class Class {
- ClassWithCall classWithCall;
+ ClassWithCall get classWithCall =>
+ /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+ throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
int method() =>
- /*cfe.invoke: ClassWithCall*/
- /*cfe:nnbd.invoke: ClassWithCall!*/
/*cfe.ClassWithCall*/
/*cfe:nnbd.ClassWithCall!*/
- classWithCall()
+ classWithCall
+ /*cfe.invoke: ClassWithCall*/
+ /*cfe:nnbd.invoke: ClassWithCall!*/
+ ()
. /*cfe.invoke: int*/
/*cfe:nnbd.invoke: int!*/
method();
@@ -30,14 +33,15 @@
}
class GenericClass<S, T extends GenericClassWithCall<S>> {
- GenericClassWithCall<T> classWithCall;
+ GenericClassWithCall<T> get classWithCall =>
+ /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+ throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
S method() =>
- /*cfe.invoke: T*/
- /*cfe:nnbd.invoke: T!*/
/*cfe.GenericClassWithCall<T>*/
/*cfe:nnbd.GenericClassWithCall<T!>!*/
- classWithCall(). /*cfe.invoke: S*/ /*cfe:nnbd.invoke: S%*/ method();
+ classWithCall /*cfe.invoke: T*/ /*cfe:nnbd.invoke: T!*/ ()
+ . /*cfe.invoke: S*/ /*cfe:nnbd.invoke: S%*/ method();
}
main() {
@@ -46,10 +50,11 @@
GenericClass<String, GenericClassWithCall<String>>
/*cfe.<String,GenericClassWithCall<String>>*/
/*cfe:nnbd.<String!,GenericClassWithCall<String!>!>*/ ()
- . /*cfe.invoke: GenericClassWithCall<String>*/
- /*cfe:nnbd.invoke: GenericClassWithCall<String!>!*/
- /*cfe.GenericClassWithCall<GenericClassWithCall<String>>*/
+ . /*cfe.GenericClassWithCall<GenericClassWithCall<String>>*/
/*cfe:nnbd.GenericClassWithCall<GenericClassWithCall<String!>!>!*/
- classWithCall()
+ classWithCall
+ /*cfe.invoke: GenericClassWithCall<String>*/
+ /*cfe:nnbd.invoke: GenericClassWithCall<String!>!*/
+ ()
. /*cfe.invoke: String*/ /*cfe:nnbd.invoke: String!*/ method();
}
diff --git a/pkg/front_end/test/static_types/data/constraint_gatherer_for_future_or.dart b/pkg/front_end/test/static_types/data/constraint_gatherer_for_future_or.dart
index 3eb10fc..32a491a 100644
--- a/pkg/front_end/test/static_types/data/constraint_gatherer_for_future_or.dart
+++ b/pkg/front_end/test/static_types/data/constraint_gatherer_for_future_or.dart
@@ -21,11 +21,13 @@
// -----------------------------------------------------------------------------
-// Gathering constraints for S from comparison Null <: Future<S>.
+// Gathering constraints for S from comparison bot <: Future<S>.
void func2() {
void foo<S>(Future<S> bar) {}
- /*invoke: void*/ foo/*<dynamic>*/(/*Null*/ null);
+ /*invoke: void*/ foo/*<dynamic>*/(
+ /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+ throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42);
}
// -----------------------------------------------------------------------------
diff --git a/pkg/front_end/test/static_types/data/greatest_lower_bound_for_future_or.dart b/pkg/front_end/test/static_types/data/greatest_lower_bound_for_future_or.dart
index ccbc88b..28d998d 100644
--- a/pkg/front_end/test/static_types/data/greatest_lower_bound_for_future_or.dart
+++ b/pkg/front_end/test/static_types/data/greatest_lower_bound_for_future_or.dart
@@ -22,7 +22,9 @@
// inserted as both the type argument and the return type of 'expr' by the
// type inference.
void context(FutureOr<T> x) {}
- S expr<S extends Foo>() => /*Null*/ null;
+ S expr<S extends Foo>() =>
+ /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+ throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
// Type of the expression is GLB(FutureOr<T>, Foo) = T.
/*invoke: void*/ context(
@@ -36,7 +38,9 @@
// Tests rule GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>.
void func2<T extends Foo>() {
void context(FutureOr<T> x) {}
- S expr<S extends Future<Foo>>() => /*Null*/ null;
+ S expr<S extends Future<Foo>>() =>
+ /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+ throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
// Type of the expression is GLB(FutureOr<T>, Future<Foo>) = Future<T>.
/*invoke: void*/ context(
@@ -51,7 +55,9 @@
// Tests rule GLB(A, FutureOr<B>) == GLB(B, A).
void func3<T extends Foo>() {
void context(T x) {}
- S expr<S extends FutureOr<Foo>>() => /*Null*/ null;
+ S expr<S extends FutureOr<Foo>>() =>
+ /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+ throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
// Type of the expression is GLB(T, FutureOr<Foo>) = T.
/*invoke: void*/ context(
@@ -65,7 +71,9 @@
// Tests rule GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>.
void func4<T extends Foo>() {
void context(Future<T> x) {}
- S expr<S extends FutureOr<Foo>>() => /*Null*/ null;
+ S expr<S extends FutureOr<Foo>>() =>
+ /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+ throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
// Type of the expression is GLB(Future<T>, FutureOr<Foo>) = Future<T>.
/*invoke: void*/ context(
@@ -81,7 +89,9 @@
// non-trivial case when neither A <: B, nor B <: A.
void func5<T extends Foo>() {
void context(FutureOr<FutureOr<T>> x) {}
- S expr<S extends FutureOr<Future<Foo>>>() => /*Null*/ null;
+ S expr<S extends FutureOr<Future<Foo>>>() =>
+ /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+ throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
// Type of the expression is GLB(FutureOr<FutureOr<T>>, FutureOr<Future<Foo>>)
// = FutureOr<Future<T>>.
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart b/pkg/front_end/testcases/extensions/ambiguous.dart
new file mode 100644
index 0000000..df66ba8
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart
@@ -0,0 +1,42 @@
+// 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.
+
+extension A on C {
+ void method() {}
+ int get getter => 42;
+ void set setter(int value) {}
+ int get property => 42;
+ int operator +(int i) => i;
+ int operator -() => 0;
+ int operator [](int i) => i;
+}
+
+extension B on C {
+ void method() {}
+ int get getter => 42;
+ void set setter(int value) {}
+ void set property(int value) {}
+ int operator +(int i) => i;
+ int operator -() => 0;
+ void operator []=(int i, int j) {}
+}
+
+class C {}
+
+errors(C c) {
+ c.method();
+ c.method;
+ c.getter;
+ c.setter;
+ c.getter = 42;
+ c.setter = 42;
+ c.property;
+ c.property = 42;
+ c + 0;
+ -c;
+ c[42];
+ c[42] = 0;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.outline.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.outline.expect
new file mode 100644
index 0000000..ecc48e2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.outline.expect
@@ -0,0 +1,64 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → self::C*
+ ;
+}
+extension A on self::C* {
+ method method = self::A|method;
+ tearoff method = self::A|get#method;
+ get getter = self::A|get#getter;
+ get property = self::A|get#property;
+ operator + = self::A|+;
+ operator unary- = self::A|unary-;
+ operator [] = self::A|[];
+ set setter = self::A|set#setter;
+}
+extension B on self::C* {
+ method method = self::B|method;
+ tearoff method = self::B|get#method;
+ get getter = self::B|get#getter;
+ operator + = self::B|+;
+ operator unary- = self::B|unary-;
+ operator []= = self::B|[]=;
+ set setter = self::B|set#setter;
+ set property = self::B|set#property;
+}
+static method A|method(final self::C* #this) → void
+ ;
+static method A|get#method(final self::C* #this) → () →* void
+ return () → void => self::A|method(#this);
+static method A|get#getter(final self::C* #this) → core::int*
+ ;
+static method A|set#setter(final self::C* #this, core::int* value) → void
+ ;
+static method A|get#property(final self::C* #this) → core::int*
+ ;
+static method A|+(final self::C* #this, core::int* i) → core::int*
+ ;
+static method A|unary-(final self::C* #this) → core::int*
+ ;
+static method A|[](final self::C* #this, core::int* i) → core::int*
+ ;
+static method B|method(final self::C* #this) → void
+ ;
+static method B|get#method(final self::C* #this) → () →* void
+ return () → void => self::B|method(#this);
+static method B|get#getter(final self::C* #this) → core::int*
+ ;
+static method B|set#setter(final self::C* #this, core::int* value) → void
+ ;
+static method B|set#property(final self::C* #this, core::int* value) → void
+ ;
+static method B|+(final self::C* #this, core::int* i) → core::int*
+ ;
+static method B|unary-(final self::C* #this) → core::int*
+ ;
+static method B|[]=(final self::C* #this, core::int* i, core::int* j) → void
+ ;
+static method errors(self::C* c) → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.strong.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.strong.expect
new file mode 100644
index 0000000..8573677
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.strong.expect
@@ -0,0 +1,265 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.method();
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+// void method() {}
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+// void method() {}
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.method;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+// void method() {}
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+// void method() {}
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.getter;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+// int get getter => 42;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+// int get getter => 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.setter;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+// void set setter(int value) {}
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+// void set setter(int value) {}
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.getter = 42;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+// int get getter => 42;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+// int get getter => 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.setter = 42;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+// void set setter(int value) {}
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+// void set setter(int value) {}
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.property;
+// ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+// int get property => 42;
+// ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+// void set property(int value) {}
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.property = 42;
+// ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+// int get property => 42;
+// ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+// void set property(int value) {}
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c + 0;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:10:16: Context: This is one of the extension members.
+// int operator +(int i) => i;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:20:16: Context: This is one of the extension members.
+// int operator +(int i) => i;
+// ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// -c;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:11:16: Context: This is one of the extension members.
+// int operator -() => 0;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:21:16: Context: This is one of the extension members.
+// int operator -() => 0;
+// ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c[42];
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+// int operator [](int i) => i;
+// ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+// void operator []=(int i, int j) {}
+// ^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c[42] = 0;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+// int operator [](int i) => i;
+// ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+// void operator []=(int i, int j) {}
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → self::C*
+ : super core::Object::•()
+ ;
+}
+extension A on self::C* {
+ method method = self::A|method;
+ tearoff method = self::A|get#method;
+ get getter = self::A|get#getter;
+ get property = self::A|get#property;
+ operator + = self::A|+;
+ operator unary- = self::A|unary-;
+ operator [] = self::A|[];
+ set setter = self::A|set#setter;
+}
+extension B on self::C* {
+ method method = self::B|method;
+ tearoff method = self::B|get#method;
+ get getter = self::B|get#getter;
+ operator + = self::B|+;
+ operator unary- = self::B|unary-;
+ operator []= = self::B|[]=;
+ set setter = self::B|set#setter;
+ set property = self::B|set#property;
+}
+static method A|method(final self::C* #this) → void {}
+static method A|get#method(final self::C* #this) → () →* void
+ return () → void => self::A|method(#this);
+static method A|get#getter(final self::C* #this) → core::int*
+ return 42;
+static method A|set#setter(final self::C* #this, core::int* value) → void {}
+static method A|get#property(final self::C* #this) → core::int*
+ return 42;
+static method A|+(final self::C* #this, core::int* i) → core::int*
+ return i;
+static method A|unary-(final self::C* #this) → core::int*
+ return 0;
+static method A|[](final self::C* #this, core::int* i) → core::int*
+ return i;
+static method B|method(final self::C* #this) → void {}
+static method B|get#method(final self::C* #this) → () →* void
+ return () → void => self::B|method(#this);
+static method B|get#getter(final self::C* #this) → core::int*
+ return 42;
+static method B|set#setter(final self::C* #this, core::int* value) → void {}
+static method B|set#property(final self::C* #this, core::int* value) → void {}
+static method B|+(final self::C* #this, core::int* i) → core::int*
+ return i;
+static method B|unary-(final self::C* #this) → core::int*
+ return 0;
+static method B|[]=(final self::C* #this, core::int* i, core::int* j) → void {}
+static method errors(self::C* c) → dynamic {
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.method();
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.method;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.getter;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.setter;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.getter = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.setter = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.property;
+ ^^^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.property = 42;
+ ^^^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c + 0;
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ -c;
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c[42];
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c[42] = 0;
+ ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.strong.transformed.expect
new file mode 100644
index 0000000..8573677
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.strong.transformed.expect
@@ -0,0 +1,265 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.method();
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+// void method() {}
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+// void method() {}
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.method;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+// void method() {}
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+// void method() {}
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.getter;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+// int get getter => 42;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+// int get getter => 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.setter;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+// void set setter(int value) {}
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+// void set setter(int value) {}
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.getter = 42;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+// int get getter => 42;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+// int get getter => 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.setter = 42;
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+// void set setter(int value) {}
+// ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+// void set setter(int value) {}
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.property;
+// ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+// int get property => 42;
+// ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+// void set property(int value) {}
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c.property = 42;
+// ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+// int get property => 42;
+// ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+// void set property(int value) {}
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c + 0;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:10:16: Context: This is one of the extension members.
+// int operator +(int i) => i;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:20:16: Context: This is one of the extension members.
+// int operator +(int i) => i;
+// ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// -c;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:11:16: Context: This is one of the extension members.
+// int operator -() => 0;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:21:16: Context: This is one of the extension members.
+// int operator -() => 0;
+// ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c[42];
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+// int operator [](int i) => i;
+// ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+// void operator []=(int i, int j) {}
+// ^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+// - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+// c[42] = 0;
+// ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+// int operator [](int i) => i;
+// ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+// void operator []=(int i, int j) {}
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → self::C*
+ : super core::Object::•()
+ ;
+}
+extension A on self::C* {
+ method method = self::A|method;
+ tearoff method = self::A|get#method;
+ get getter = self::A|get#getter;
+ get property = self::A|get#property;
+ operator + = self::A|+;
+ operator unary- = self::A|unary-;
+ operator [] = self::A|[];
+ set setter = self::A|set#setter;
+}
+extension B on self::C* {
+ method method = self::B|method;
+ tearoff method = self::B|get#method;
+ get getter = self::B|get#getter;
+ operator + = self::B|+;
+ operator unary- = self::B|unary-;
+ operator []= = self::B|[]=;
+ set setter = self::B|set#setter;
+ set property = self::B|set#property;
+}
+static method A|method(final self::C* #this) → void {}
+static method A|get#method(final self::C* #this) → () →* void
+ return () → void => self::A|method(#this);
+static method A|get#getter(final self::C* #this) → core::int*
+ return 42;
+static method A|set#setter(final self::C* #this, core::int* value) → void {}
+static method A|get#property(final self::C* #this) → core::int*
+ return 42;
+static method A|+(final self::C* #this, core::int* i) → core::int*
+ return i;
+static method A|unary-(final self::C* #this) → core::int*
+ return 0;
+static method A|[](final self::C* #this, core::int* i) → core::int*
+ return i;
+static method B|method(final self::C* #this) → void {}
+static method B|get#method(final self::C* #this) → () →* void
+ return () → void => self::B|method(#this);
+static method B|get#getter(final self::C* #this) → core::int*
+ return 42;
+static method B|set#setter(final self::C* #this, core::int* value) → void {}
+static method B|set#property(final self::C* #this, core::int* value) → void {}
+static method B|+(final self::C* #this, core::int* i) → core::int*
+ return i;
+static method B|unary-(final self::C* #this) → core::int*
+ return 0;
+static method B|[]=(final self::C* #this, core::int* i, core::int* j) → void {}
+static method errors(self::C* c) → dynamic {
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.method();
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.method;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.getter;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.setter;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.getter = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.setter = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.property;
+ ^^^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c.property = 42;
+ ^^^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c + 0;
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ -c;
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c[42];
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+ c[42] = 0;
+ ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.expect
index f432ee9..f5de7af 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.expect
@@ -14,29 +14,53 @@
// c.m1 = 2;
// ^^
//
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The getter 'm3' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
// - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm3'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
// c.m3;
// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+// void set m3(int x) {}
+// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+// int get m3 => 0;
+// ^^
//
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The setter 'm3' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
// - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'm3'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
// c.m3 = 2;
// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+// void set m3(int x) {}
+// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+// int get m3 => 0;
+// ^^
//
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The getter 'm4' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
// - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm4'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
// c.m4;
// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+// int get m4 => 0;
+// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+// void set m4(int x) {}
+// ^^
//
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The setter 'm4' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
// - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'm4'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
// c.m4 = 2;
// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+// int get m4 => 0;
+// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+// void set m4(int x) {}
+// ^^
//
import self as self;
import "dart:core" as core;
@@ -85,24 +109,24 @@
Try correcting the name to the name of an existing setter, or defining a setter or field named 'm1'.
c.m1 = 2;
^^";
- invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The getter 'm3' isn't defined for the class 'Class'.
+ invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
- 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'm3'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
c.m3;
^^";
- invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The setter 'm3' isn't defined for the class 'Class'.
+ invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
- 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'm3'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
c.m3 = 2;
^^";
- invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The getter 'm4' isn't defined for the class 'Class'.
+ invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
- 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'm4'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
c.m4;
^^";
- invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The setter 'm4' isn't defined for the class 'Class'.
+ invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
- 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'm4'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
c.m4 = 2;
^^";
}
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.transformed.expect
index f432ee9..f5de7af 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.transformed.expect
@@ -14,29 +14,53 @@
// c.m1 = 2;
// ^^
//
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The getter 'm3' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
// - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm3'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
// c.m3;
// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+// void set m3(int x) {}
+// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+// int get m3 => 0;
+// ^^
//
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The setter 'm3' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
// - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'm3'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
// c.m3 = 2;
// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+// void set m3(int x) {}
+// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+// int get m3 => 0;
+// ^^
//
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The getter 'm4' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
// - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm4'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
// c.m4;
// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+// int get m4 => 0;
+// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+// void set m4(int x) {}
+// ^^
//
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The setter 'm4' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
// - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'm4'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
// c.m4 = 2;
// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+// int get m4 => 0;
+// ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+// void set m4(int x) {}
+// ^^
//
import self as self;
import "dart:core" as core;
@@ -85,24 +109,24 @@
Try correcting the name to the name of an existing setter, or defining a setter or field named 'm1'.
c.m1 = 2;
^^";
- invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The getter 'm3' isn't defined for the class 'Class'.
+ invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
- 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'm3'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
c.m3;
^^";
- invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The setter 'm3' isn't defined for the class 'Class'.
+ invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
- 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'm3'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
c.m3 = 2;
^^";
- invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The getter 'm4' isn't defined for the class 'Class'.
+ invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
- 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'm4'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
c.m4;
^^";
- invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The setter 'm4' isn't defined for the class 'Class'.
+ invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
- 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'm4'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
c.m4 = 2;
^^";
}
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart b/pkg/front_end/testcases/extensions/issue39527.dart
new file mode 100644
index 0000000..7990741
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39527.dart
@@ -0,0 +1,26 @@
+// 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.
+
+class C {
+ int value = 0;
+}
+
+extension Extension1 on C {
+ C operator [](int index) => this..value += index + 1;
+ void operator []=(int index, C other) =>
+ this.value += other.value + index + 1;
+ C operator -(int val) => this;
+}
+
+main() {
+ C c = C();
+ // Original term that produces an unexpected error.
+ --Extension1(c)[42];
+
+ // The pre-decrement desugars as follows, which is also flagged as an error.
+ Extension1(c)[42] -= 1;
+
+ // The compound assignment desugars as follows, which is accepted.
+ Extension1(c)[42] = Extension1(c)[42] - 1;
+}
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.outline.expect b/pkg/front_end/testcases/extensions/issue39527.dart.outline.expect
new file mode 100644
index 0000000..a9e1f18
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ field core::int* value;
+ synthetic constructor •() → self::C*
+ ;
+}
+extension Extension1 on self::C* {
+ operator [] = self::Extension1|[];
+ operator []= = self::Extension1|[]=;
+ operator - = self::Extension1|-;
+}
+static method Extension1|[](final self::C* #this, core::int* index) → self::C*
+ ;
+static method Extension1|[]=(final self::C* #this, core::int* index, self::C* other) → void
+ ;
+static method Extension1|-(final self::C* #this, core::int* val) → self::C*
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect b/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect
new file mode 100644
index 0000000..56f3831
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ field core::int* value = 0;
+ synthetic constructor •() → self::C*
+ : super core::Object::•()
+ ;
+}
+extension Extension1 on self::C* {
+ operator [] = self::Extension1|[];
+ operator []= = self::Extension1|[]=;
+ operator - = self::Extension1|-;
+}
+static method Extension1|[](final self::C* #this, core::int* index) → self::C*
+ return let final self::C* #t1 = #this in let final void #t2 = let final self::C* #t3 = #t1 in #t3.{self::C::value} = #t3.{self::C::value}.{core::num::+}(index.{core::num::+}(1)) in #t1;
+static method Extension1|[]=(final self::C* #this, core::int* index, self::C* other) → void
+ return let final self::C* #t4 = #this in #t4.{self::C::value} = #t4.{self::C::value}.{core::num::+}(other.{self::C::value}.{core::num::+}(index).{core::num::+}(1));
+static method Extension1|-(final self::C* #this, core::int* val) → self::C*
+ return #this;
+static method main() → dynamic {
+ self::C* c = new self::C::•();
+ let final self::C* #t5 = c in let final core::int* #t6 = 42 in let final self::C* #t7 = self::Extension1|-(self::Extension1|[](#t5, #t6), 1) in let final void #t8 = self::Extension1|[]=(#t5, #t6, #t7) in #t7;
+ let final self::C* #t9 = c in let final core::int* #t10 = 42 in self::Extension1|[]=(#t9, #t10, self::Extension1|-(self::Extension1|[](#t9, #t10), 1));
+ self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
+}
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
new file mode 100644
index 0000000..56f3831
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ field core::int* value = 0;
+ synthetic constructor •() → self::C*
+ : super core::Object::•()
+ ;
+}
+extension Extension1 on self::C* {
+ operator [] = self::Extension1|[];
+ operator []= = self::Extension1|[]=;
+ operator - = self::Extension1|-;
+}
+static method Extension1|[](final self::C* #this, core::int* index) → self::C*
+ return let final self::C* #t1 = #this in let final void #t2 = let final self::C* #t3 = #t1 in #t3.{self::C::value} = #t3.{self::C::value}.{core::num::+}(index.{core::num::+}(1)) in #t1;
+static method Extension1|[]=(final self::C* #this, core::int* index, self::C* other) → void
+ return let final self::C* #t4 = #this in #t4.{self::C::value} = #t4.{self::C::value}.{core::num::+}(other.{self::C::value}.{core::num::+}(index).{core::num::+}(1));
+static method Extension1|-(final self::C* #this, core::int* val) → self::C*
+ return #this;
+static method main() → dynamic {
+ self::C* c = new self::C::•();
+ let final self::C* #t5 = c in let final core::int* #t6 = 42 in let final self::C* #t7 = self::Extension1|-(self::Extension1|[](#t5, #t6), 1) in let final void #t8 = self::Extension1|[]=(#t5, #t6, #t7) in #t7;
+ let final self::C* #t9 = c in let final core::int* #t10 = 42 in self::Extension1|[]=(#t9, #t10, self::Extension1|-(self::Extension1|[](#t9, #t10), 1));
+ self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
+}
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.expect b/pkg/front_end/testcases/general/cascade.dart.strong.expect
index ed144d6..70120f9 100644
--- a/pkg/front_end/testcases/general/cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.expect
@@ -12,8 +12,8 @@
// ..first.last.toString()
// ^^^^
//
-// pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// ..first[0].toString()
// ^
//
@@ -38,8 +38,8 @@
^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
..first.last.toString()
- ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
..first[0].toString()
^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
index ed144d6..70120f9 100644
--- a/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
@@ -12,8 +12,8 @@
// ..first.last.toString()
// ^^^^
//
-// pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// ..first[0].toString()
// ^
//
@@ -38,8 +38,8 @@
^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
..first.last.toString()
- ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
..first[0].toString()
^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.outline.expect b/pkg/front_end/testcases/general/ignore_function.dart.outline.expect
index 777f40b..6172453 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart.outline.expect
+++ b/pkg/front_end/testcases/general/ignore_function.dart.outline.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
-class A extends core::Object implements core::Function {
+class A extends core::Object {
synthetic constructor •() → self::A*
;
operator ==(dynamic other) → core::bool*
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.strong.expect b/pkg/front_end/testcases/general/ignore_function.dart.strong.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart.strong.expect
+++ b/pkg/front_end/testcases/general/ignore_function.dart.strong.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
-class A extends core::Object implements core::Function {
+class A extends core::Object {
synthetic constructor •() → self::A*
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general/ignore_function.dart.strong.transformed.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/ignore_function.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
-class A extends core::Object implements core::Function {
+class A extends core::Object {
synthetic constructor •() → self::A*
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
index 71c3fc8..8738863 100644
--- a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
+++ b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
@@ -6,66 +6,144 @@
// Try adding an explicit type.
// var field2; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// var field2 = 0;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// var field2 = '';
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
// Try adding an explicit type.
// var field4 = 0; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// var field4 = 0;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// var field4 = '';
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
// Try adding an explicit type.
// var field6; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// int field6;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// String field6;
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
// Try adding an explicit type.
// var field8 = 0; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// int field8;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// String field8;
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the inherited members have different types.
// Try adding an explicit type.
// var field11; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the inherited members.
+// T field11;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the inherited members.
+// S field11;
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
// Try adding an explicit type.
// var field17; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// var field17 = 0;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// String field17;
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
// Try adding an explicit type.
// var field18; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// int field18;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// var field18 = '';
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
// Try adding an explicit type.
// var field2; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// var field2 = 0;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// var field2 = '';
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
// Try adding an explicit type.
// var field4 = 0; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// var field4 = 0;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// var field4 = '';
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
// Try adding an explicit type.
// var field6; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// int field6;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// String field6;
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
// Try adding an explicit type.
// var field8 = 0; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// int field8;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// String field8;
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
// Try adding an explicit type.
// var field17; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// var field17 = 0;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// String field17;
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
// Try adding an explicit type.
// var field18; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// int field18;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// var field18 = '';
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:61:7: Error: The return type of the method 'C.field14' is 'int', which does not match the return type, 'String', of the overridden method, 'B.field14'.
// Change to a subtype of 'String'.
diff --git a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
index 811dec5..4b93926 100644
--- a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
@@ -6,66 +6,144 @@
// Try adding an explicit type.
// var field2; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// var field2 = 0;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// var field2 = '';
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
// Try adding an explicit type.
// var field4 = 0; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// var field4 = 0;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// var field4 = '';
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
// Try adding an explicit type.
// var field6; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// int field6;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// String field6;
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
// Try adding an explicit type.
// var field8 = 0; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// int field8;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// String field8;
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the inherited members have different types.
// Try adding an explicit type.
// var field11; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the inherited members.
+// T field11;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the inherited members.
+// S field11;
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
// Try adding an explicit type.
// var field17; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// var field17 = 0;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// String field17;
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
// Try adding an explicit type.
// var field18; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// int field18;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// var field18 = '';
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
// Try adding an explicit type.
// var field2; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// var field2 = 0;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// var field2 = '';
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
// Try adding an explicit type.
// var field4 = 0; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// var field4 = 0;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// var field4 = '';
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
// Try adding an explicit type.
// var field6; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// int field6;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// String field6;
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
// Try adding an explicit type.
// var field8 = 0; // error
// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// int field8;
+// ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// String field8;
+// ^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
// Try adding an explicit type.
// var field17; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// var field17 = 0;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// String field17;
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
// Try adding an explicit type.
// var field18; // error
// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// int field18;
+// ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// var field18 = '';
+// ^^^^^^^
//
// pkg/front_end/testcases/general/infer_field_from_multiple.dart:61:7: Error: The return type of the method 'C.field14' is 'int', which does not match the return type, 'String', of the overridden method, 'B.field14'.
// Change to a subtype of 'String'.
diff --git a/pkg/front_end/testcases/general/inherit_function.dart b/pkg/front_end/testcases/general/inherit_function.dart
new file mode 100644
index 0000000..c670d37
--- /dev/null
+++ b/pkg/front_end/testcases/general/inherit_function.dart
@@ -0,0 +1,13 @@
+// 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.
+
+class A implements Function {}
+
+class B extends Function {}
+
+class C extends Object with Function {}
+
+class D = Object with Function;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/inherit_function.dart.outline.expect b/pkg/front_end/testcases/general/inherit_function.dart.outline.expect
new file mode 100644
index 0000000..76b247c
--- /dev/null
+++ b/pkg/front_end/testcases/general/inherit_function.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A*
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B*
+ ;
+}
+abstract class _C&Object&Function extends core::Object {
+ synthetic constructor •() → self::_C&Object&Function*
+ ;
+}
+class C extends self::_C&Object&Function {
+ synthetic constructor •() → self::C*
+ ;
+}
+class D extends core::Object {
+ synthetic constructor •() → self::D*
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/general/inherit_function.dart.strong.expect b/pkg/front_end/testcases/general/inherit_function.dart.strong.expect
new file mode 100644
index 0000000..3167f12
--- /dev/null
+++ b/pkg/front_end/testcases/general/inherit_function.dart.strong.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A*
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B*
+ : super core::Object::•()
+ ;
+}
+abstract class _C&Object&Function extends core::Object {
+ synthetic constructor •() → self::_C&Object&Function*
+ : super core::Object::•()
+ ;
+}
+class C extends self::_C&Object&Function {
+ synthetic constructor •() → self::C*
+ : super self::_C&Object&Function::•()
+ ;
+}
+class D extends core::Object {
+ synthetic constructor •() → self::D*
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/inherit_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general/inherit_function.dart.strong.transformed.expect
new file mode 100644
index 0000000..3167f12
--- /dev/null
+++ b/pkg/front_end/testcases/general/inherit_function.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A*
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B*
+ : super core::Object::•()
+ ;
+}
+abstract class _C&Object&Function extends core::Object {
+ synthetic constructor •() → self::_C&Object&Function*
+ : super core::Object::•()
+ ;
+}
+class C extends self::_C&Object&Function {
+ synthetic constructor •() → self::C*
+ : super self::_C&Object&Function::•()
+ ;
+}
+class D extends core::Object {
+ synthetic constructor •() → self::D*
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect b/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
index 3ccf348..4c1f615 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'C'.
// abstract class C implements A, B {}
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect b/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
index af83801..12165b4 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'C'.
// abstract class C implements A, B {}
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
index af83801..12165b4 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'C'.
// abstract class C implements A, B {}
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect b/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect
index fc36801..eeef39a 100644
--- a/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect
+++ b/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect
@@ -566,7 +566,7 @@
class Operators1 extends core::Object {
synthetic constructor •() → self::Operators1*
;
- operator ==() → dynamic
+ operator ==() → core::bool*
;
operator <() → dynamic
;
@@ -606,7 +606,7 @@
class Operators2 extends core::Object {
synthetic constructor •() → self::Operators2*
;
- operator ==(dynamic a, dynamic b) → dynamic
+ operator ==(dynamic a, dynamic b) → core::bool*
;
operator <(dynamic a, dynamic b) → dynamic
;
@@ -690,7 +690,7 @@
class Operators4 extends core::Object {
synthetic constructor •() → self::Operators4*
;
- operator ==({dynamic a}) → dynamic
+ operator ==({dynamic a}) → core::bool*
;
operator <({dynamic a}) → dynamic
;
diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect b/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect
index e36b062..9580fe8 100644
--- a/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect
+++ b/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect
@@ -567,7 +567,7 @@
synthetic constructor •() → self::Operators1*
: super core::Object::•()
;
- operator ==() → dynamic
+ operator ==() → core::bool*
return true;
operator <() → dynamic
return true;
@@ -608,7 +608,7 @@
synthetic constructor •() → self::Operators2*
: super core::Object::•()
;
- operator ==(dynamic a, dynamic b) → dynamic
+ operator ==(dynamic a, dynamic b) → core::bool*
return true;
operator <(dynamic a, dynamic b) → dynamic
return true;
@@ -694,7 +694,7 @@
synthetic constructor •() → self::Operators4*
: super core::Object::•()
;
- operator ==({dynamic a = #C1}) → dynamic
+ operator ==({dynamic a = #C1}) → core::bool*
return true;
operator <({dynamic a = #C1}) → dynamic
return true;
diff --git a/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..b405807
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
+// this.bar();
+// ^^^^
+//
+// pkg/front_end/testcases/general/invalid_type.dart:12:12: Error: 'Missing' isn't a type.
+// (null as Missing).bar();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/general/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'Null'.
+// Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+// null.bar();
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → self::C*
+ : super core::Object::•()
+ ;
+ static method foo() → dynamic {
+ invalid-expression "pkg/front_end/testcases/general/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
+ this.bar();
+ ^^^^".bar();
+ }
+}
+static method test() → dynamic {
+ (null as invalid-type).bar();
+ invalid-expression "pkg/front_end/testcases/general/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'Null'.
+Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+ null.bar();
+ ^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.expect b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.expect
index 51f556d..921e9cd 100644
--- a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.expect
+++ b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.expect
@@ -2,21 +2,21 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
// - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// var missingBinary = classWithProperty.property += 2;
// ^
//
-// pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
// - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// var missingIndexGet = classWithIndexSet[0] ??= 2;
// ^
//
-// pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
// - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// var missingIndexSet = classWithIndexGet[0] ??= 2;
// ^
//
@@ -63,19 +63,19 @@
static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
- 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
var missingBinary = classWithProperty.property += 2;
^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
- 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
var missingIndexGet = classWithIndexSet[0] ??= 2;
^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
- 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
var missingIndexSet = classWithIndexGet[0] ??= 2;
^" in #t10 : #t9;
static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:30:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
index 51f556d..921e9cd 100644
--- a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
// - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// var missingBinary = classWithProperty.property += 2;
// ^
//
-// pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
// - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// var missingIndexGet = classWithIndexSet[0] ??= 2;
// ^
//
-// pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
// - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// var missingIndexSet = classWithIndexGet[0] ??= 2;
// ^
//
@@ -63,19 +63,19 @@
static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
- 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
var missingBinary = classWithProperty.property += 2;
^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
- 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
var missingIndexGet = classWithIndexSet[0] ??= 2;
^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
- 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
var missingIndexSet = classWithIndexGet[0] ??= 2;
^" in #t10 : #t9;
static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:30:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect
index 153bb13..483d84d 100644
--- a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect
@@ -59,6 +59,6 @@
constants {
#C1 = 0
- #C2 = TypeLiteralConstant(dart.core::String*)
- #C3 = TypeLiteralConstant(dart.core::int*)
+ #C2 = TypeLiteralConstant(core::String*)
+ #C3 = TypeLiteralConstant(core::int*)
}
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect
index b2dbf88..fe66274 100644
--- a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect
@@ -59,6 +59,6 @@
constants {
#C1 = 0
- #C2 = TypeLiteralConstant(dart.core::String*)
- #C3 = TypeLiteralConstant(dart.core::int*)
+ #C2 = TypeLiteralConstant(core::String*)
+ #C3 = TypeLiteralConstant(core::int*)
}
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
index 695123b..c48e36c 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'B with C'.
// mixin M on B, C {}
// ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
index a66d785..57da879 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'B with C'.
// mixin M on B, C {}
// ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
index a66d785..57da879 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'B with C'.
// mixin M on B, C {}
// ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect
index 4bcc6e9..be431dd 100644
--- a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect
@@ -75,117 +75,117 @@
// print(foo ~ 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// print(foo < 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
// print(foo > 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
// print(foo <= 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
// print(foo >= 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// print(foo - 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// print(foo + 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
// print(foo / 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
// print(foo ~/ 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
// print(foo * 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
// print(foo % 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
// print(foo | 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
// print(foo ^ 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
// print(foo & 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
// print(foo << 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
// print(foo >> 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// print(foo[2] = 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// print(foo[2]);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
// print(~foo);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
// print(-foo);
// ^
//
@@ -199,100 +199,100 @@
}
static method main() → dynamic {
self::Foo* foo = new self::Foo::•();
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
print(foo < 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
print(foo > 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
print(foo <= 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
print(foo >= 2);
^^");
core::print(foo.{core::Object::==}(2));
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
print(foo - 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
print(foo + 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
print(foo / 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
print(foo ~/ 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
print(foo * 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
print(foo % 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
print(foo | 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
print(foo ^ 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
print(foo & 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
print(foo << 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
print(foo >> 2);
^^");
- core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
print(foo[2] = 2);
^" in #t3);
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
print(foo[2]);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
print(~foo);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
print(-foo);
^");
core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
index 4bcc6e9..be431dd 100644
--- a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
@@ -75,117 +75,117 @@
// print(foo ~ 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// print(foo < 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
// print(foo > 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
// print(foo <= 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
// print(foo >= 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// print(foo - 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// print(foo + 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
// print(foo / 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
// print(foo ~/ 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
// print(foo * 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
// print(foo % 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
// print(foo | 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
// print(foo ^ 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
// print(foo & 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
// print(foo << 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
// print(foo >> 2);
// ^^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// print(foo[2] = 2);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// print(foo[2]);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
// print(~foo);
// ^
//
-// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
// print(-foo);
// ^
//
@@ -199,100 +199,100 @@
}
static method main() → dynamic {
self::Foo* foo = new self::Foo::•();
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
print(foo < 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
print(foo > 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
print(foo <= 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
print(foo >= 2);
^^");
core::print(foo.{core::Object::==}(2));
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
print(foo - 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
print(foo + 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
print(foo / 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
print(foo ~/ 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
print(foo * 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
print(foo % 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
print(foo | 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
print(foo ^ 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
print(foo & 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
print(foo << 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
print(foo >> 2);
^^");
- core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
print(foo[2] = 2);
^" in #t3);
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
print(foo[2]);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
print(~foo);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
print(-foo);
^");
core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
index 7e0964d..e8ff6d1 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
@@ -6,21 +6,45 @@
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// num get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// int get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// set setterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// set setterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// num get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// int get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// set setterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// set setterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
index b88ee41..4c57e56 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
@@ -6,21 +6,45 @@
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// num get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// int get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// set setterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// set setterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// num get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// int get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// set setterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// set setterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
index b88ee41..4c57e56 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
@@ -6,21 +6,45 @@
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// num get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// int get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// set setterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// set setterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// num get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// int get getterFromGetter;
+// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// set setterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// set setterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.expect
index 9051dbd..d0a33ce 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.expect
@@ -12,8 +12,8 @@
// ..first.last.toString()
// ^^^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// ..first[0].toString()
// ^
//
@@ -38,8 +38,8 @@
^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
..first.last.toString()
- ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
..first[0].toString()
^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.transformed.expect
index 9051dbd..d0a33ce 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.transformed.expect
@@ -12,8 +12,8 @@
// ..first.last.toString()
// ^^^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// ..first[0].toString()
// ^
//
@@ -38,8 +38,8 @@
^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
..first.last.toString()
- ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
..first[0].toString()
^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect
index 9051dbd..d0a33ce 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect
@@ -12,8 +12,8 @@
// ..first.last.toString()
// ^^^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// ..first[0].toString()
// ^
//
@@ -38,8 +38,8 @@
^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
..first.last.toString()
- ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
..first[0].toString()
^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect
index 9051dbd..d0a33ce 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect
@@ -12,8 +12,8 @@
// ..first.last.toString()
// ^^^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// ..first[0].toString()
// ^
//
@@ -38,8 +38,8 @@
^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
..first.last.toString()
- ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
..first[0].toString()
^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.outline.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.outline.expect
index 777f40b..6172453 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.outline.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.outline.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
-class A extends core::Object implements core::Function {
+class A extends core::Object {
synthetic constructor •() → self::A*
;
operator ==(dynamic other) → core::bool*
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
-class A extends core::Object implements core::Function {
+class A extends core::Object {
synthetic constructor •() → self::A*
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.transformed.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
-class A extends core::Object implements core::Function {
+class A extends core::Object {
synthetic constructor •() → self::A*
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
-class A extends core::Object implements core::Function {
+class A extends core::Object {
synthetic constructor •() → self::A*
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.transformed.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
-class A extends core::Object implements core::Function {
+class A extends core::Object {
synthetic constructor •() → self::A*
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..3be894f
--- /dev/null
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.strong.transformed.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:9:5: Error: Expected identifier, but got 'this'.
+// this.bar();
+// ^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:14:12: Error: 'Missing' isn't a type.
+// (null as Missing).bar();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:15:8: Error: The method 'bar' isn't defined for the class 'Null'.
+// Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+// null.bar();
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → self::C*
+ : super core::Object::•()
+ ;
+ static method foo() → dynamic {
+ invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:9:5: Error: Expected identifier, but got 'this'.
+ this.bar();
+ ^^^^".bar();
+ }
+}
+static method test() → dynamic {
+ (null as invalid-type).bar();
+ invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:15:8: Error: The method 'bar' isn't defined for the class 'Null'.
+Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+ null.bar();
+ ^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
new file mode 100644
index 0000000..3be894f
--- /dev/null
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:9:5: Error: Expected identifier, but got 'this'.
+// this.bar();
+// ^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:14:12: Error: 'Missing' isn't a type.
+// (null as Missing).bar();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:15:8: Error: The method 'bar' isn't defined for the class 'Null'.
+// Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+// null.bar();
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → self::C*
+ : super core::Object::•()
+ ;
+ static method foo() → dynamic {
+ invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:9:5: Error: Expected identifier, but got 'this'.
+ this.bar();
+ ^^^^".bar();
+ }
+}
+static method test() → dynamic {
+ (null as invalid-type).bar();
+ invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:15:8: Error: The method 'bar' isn't defined for the class 'Null'.
+Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+ null.bar();
+ ^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.expect
index 98ba00e..fec45f5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.expect
@@ -2,21 +2,21 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
// - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// var missingBinary = classWithProperty.property += 2;
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
// - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// var missingIndexGet = classWithIndexSet[0] ??= 2;
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
// - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// var missingIndexSet = classWithIndexGet[0] ??= 2;
// ^
//
@@ -63,19 +63,19 @@
static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
- 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
var missingBinary = classWithProperty.property += 2;
^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
- 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
var missingIndexGet = classWithIndexSet[0] ??= 2;
^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
- 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
var missingIndexSet = classWithIndexGet[0] ??= 2;
^" in #t10 : #t9;
static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:32:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.transformed.expect
index 98ba00e..fec45f5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
// - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// var missingBinary = classWithProperty.property += 2;
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
// - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// var missingIndexGet = classWithIndexSet[0] ??= 2;
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
// - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// var missingIndexSet = classWithIndexGet[0] ??= 2;
// ^
//
@@ -63,19 +63,19 @@
static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
- 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
var missingBinary = classWithProperty.property += 2;
^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
- 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
var missingIndexGet = classWithIndexSet[0] ??= 2;
^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
- 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
var missingIndexSet = classWithIndexGet[0] ??= 2;
^" in #t10 : #t9;
static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:32:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.expect
index 98ba00e..fec45f5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.expect
@@ -2,21 +2,21 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
// - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// var missingBinary = classWithProperty.property += 2;
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
// - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// var missingIndexGet = classWithIndexSet[0] ??= 2;
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
// - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// var missingIndexSet = classWithIndexGet[0] ??= 2;
// ^
//
@@ -63,19 +63,19 @@
static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
- 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
var missingBinary = classWithProperty.property += 2;
^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
- 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
var missingIndexGet = classWithIndexSet[0] ??= 2;
^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
- 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
var missingIndexSet = classWithIndexGet[0] ??= 2;
^" in #t10 : #t9;
static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:32:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
index 98ba00e..fec45f5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
@@ -2,21 +2,21 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
// - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// var missingBinary = classWithProperty.property += 2;
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
// - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// var missingIndexGet = classWithIndexSet[0] ??= 2;
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
// - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// var missingIndexSet = classWithIndexGet[0] ??= 2;
// ^
//
@@ -63,19 +63,19 @@
static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
- 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
var missingBinary = classWithProperty.property += 2;
^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
- 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
var missingIndexGet = classWithIndexSet[0] ??= 2;
^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
- 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
var missingIndexSet = classWithIndexGet[0] ??= 2;
^" in #t10 : #t9;
static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:32:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.expect
index 500a9d3..37d2479 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.expect
@@ -59,6 +59,6 @@
constants {
#C1 = 0
- #C2 = TypeLiteralConstant(dart.core::String*)
- #C3 = TypeLiteralConstant(dart.core::int*)
+ #C2 = TypeLiteralConstant(core::String*)
+ #C3 = TypeLiteralConstant(core::int*)
}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.transformed.expect
index 9c19e86..a3cedca 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.transformed.expect
@@ -59,6 +59,6 @@
constants {
#C1 = 0
- #C2 = TypeLiteralConstant(dart.core::String*)
- #C3 = TypeLiteralConstant(dart.core::int*)
+ #C2 = TypeLiteralConstant(core::String*)
+ #C3 = TypeLiteralConstant(core::int*)
}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.expect
index 500a9d3..37d2479 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.expect
@@ -59,6 +59,6 @@
constants {
#C1 = 0
- #C2 = TypeLiteralConstant(dart.core::String*)
- #C3 = TypeLiteralConstant(dart.core::int*)
+ #C2 = TypeLiteralConstant(core::String*)
+ #C3 = TypeLiteralConstant(core::int*)
}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.transformed.expect
index 9c19e86..a3cedca 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.transformed.expect
@@ -59,6 +59,6 @@
constants {
#C1 = 0
- #C2 = TypeLiteralConstant(dart.core::String*)
- #C3 = TypeLiteralConstant(dart.core::int*)
+ #C2 = TypeLiteralConstant(core::String*)
+ #C3 = TypeLiteralConstant(core::int*)
}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.expect
index 21ad1af..e25cec2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.expect
@@ -75,117 +75,117 @@
// print(foo ~ 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// print(foo < 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
// print(foo > 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
// print(foo <= 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
// print(foo >= 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// print(foo - 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// print(foo + 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
// print(foo / 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
// print(foo ~/ 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
// print(foo * 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
// print(foo % 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
// print(foo | 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
// print(foo ^ 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
// print(foo & 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
// print(foo << 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
// print(foo >> 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// print(foo[2] = 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// print(foo[2]);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
// print(~foo);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
// print(-foo);
// ^
//
@@ -199,100 +199,100 @@
}
static method main() → dynamic {
self::Foo* foo = new self::Foo::•();
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
print(foo < 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
print(foo > 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
print(foo <= 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
print(foo >= 2);
^^");
core::print(foo.{core::Object::==}(2));
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
print(foo - 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
print(foo + 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
print(foo / 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
print(foo ~/ 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
print(foo * 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
print(foo % 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
print(foo | 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
print(foo ^ 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
print(foo & 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
print(foo << 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
print(foo >> 2);
^^");
- core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
print(foo[2] = 2);
^" in #t3);
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
print(foo[2]);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
print(~foo);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
print(-foo);
^");
core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.transformed.expect
index 21ad1af..e25cec2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.transformed.expect
@@ -75,117 +75,117 @@
// print(foo ~ 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// print(foo < 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
// print(foo > 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
// print(foo <= 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
// print(foo >= 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// print(foo - 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// print(foo + 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
// print(foo / 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
// print(foo ~/ 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
// print(foo * 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
// print(foo % 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
// print(foo | 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
// print(foo ^ 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
// print(foo & 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
// print(foo << 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
// print(foo >> 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// print(foo[2] = 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// print(foo[2]);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
// print(~foo);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
// print(-foo);
// ^
//
@@ -199,100 +199,100 @@
}
static method main() → dynamic {
self::Foo* foo = new self::Foo::•();
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
print(foo < 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
print(foo > 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
print(foo <= 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
print(foo >= 2);
^^");
core::print(foo.{core::Object::==}(2));
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
print(foo - 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
print(foo + 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
print(foo / 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
print(foo ~/ 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
print(foo * 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
print(foo % 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
print(foo | 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
print(foo ^ 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
print(foo & 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
print(foo << 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
print(foo >> 2);
^^");
- core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
print(foo[2] = 2);
^" in #t3);
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
print(foo[2]);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
print(~foo);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
print(-foo);
^");
core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.expect
index 21ad1af..e25cec2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.expect
@@ -75,117 +75,117 @@
// print(foo ~ 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// print(foo < 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
// print(foo > 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
// print(foo <= 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
// print(foo >= 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// print(foo - 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// print(foo + 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
// print(foo / 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
// print(foo ~/ 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
// print(foo * 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
// print(foo % 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
// print(foo | 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
// print(foo ^ 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
// print(foo & 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
// print(foo << 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
// print(foo >> 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// print(foo[2] = 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// print(foo[2]);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
// print(~foo);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
// print(-foo);
// ^
//
@@ -199,100 +199,100 @@
}
static method main() → dynamic {
self::Foo* foo = new self::Foo::•();
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
print(foo < 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
print(foo > 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
print(foo <= 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
print(foo >= 2);
^^");
core::print(foo.{core::Object::==}(2));
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
print(foo - 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
print(foo + 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
print(foo / 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
print(foo ~/ 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
print(foo * 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
print(foo % 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
print(foo | 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
print(foo ^ 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
print(foo & 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
print(foo << 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
print(foo >> 2);
^^");
- core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
print(foo[2] = 2);
^" in #t3);
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
print(foo[2]);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
print(~foo);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
print(-foo);
^");
core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
index 21ad1af..e25cec2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
@@ -75,117 +75,117 @@
// print(foo ~ 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// print(foo < 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
// print(foo > 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
// print(foo <= 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
// print(foo >= 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// print(foo - 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// print(foo + 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
// print(foo / 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
// print(foo ~/ 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
// print(foo * 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
// print(foo % 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
// print(foo | 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
// print(foo ^ 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
// print(foo & 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
// print(foo << 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
// print(foo >> 2);
// ^^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// print(foo[2] = 2);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// print(foo[2]);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
// print(~foo);
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
// - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
// print(-foo);
// ^
//
@@ -199,100 +199,100 @@
}
static method main() → dynamic {
self::Foo* foo = new self::Foo::•();
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
print(foo < 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
print(foo > 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
print(foo <= 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
print(foo >= 2);
^^");
core::print(foo.{core::Object::==}(2));
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
print(foo - 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
print(foo + 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
print(foo / 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
print(foo ~/ 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
print(foo * 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
print(foo % 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
print(foo | 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
print(foo ^ 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
print(foo & 2);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
print(foo << 2);
^^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
print(foo >> 2);
^^");
- core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
print(foo[2] = 2);
^" in #t3);
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
print(foo[2]);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
print(~foo);
^");
- core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
- 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
print(-foo);
^");
core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
index a20d4ff..4a9ec12 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
@@ -423,7 +423,7 @@
return 1.{dart.core::int::unary-}();
}
method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ insert(dart.core::int* index, generic-covariant-impl dart.core::int* element) → void {
- dart.core::ArgumentError::checkNotNull(index, "index");
+ dart.core::ArgumentError::checkNotNull<dart.core::int*>(index, "index");
dart.core::RangeError::checkValueInInterval(index, 0, this.{dart.core::List::length}, "index");
if(index.{dart.core::num::==}(this.{dart.core::List::length})) {
this.{dart.collection::ListMixin::add}(element);
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
index a20d4ff..4a9ec12 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
@@ -423,7 +423,7 @@
return 1.{dart.core::int::unary-}();
}
method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ insert(dart.core::int* index, generic-covariant-impl dart.core::int* element) → void {
- dart.core::ArgumentError::checkNotNull(index, "index");
+ dart.core::ArgumentError::checkNotNull<dart.core::int*>(index, "index");
dart.core::RangeError::checkValueInInterval(index, 0, this.{dart.core::List::length}, "index");
if(index.{dart.core::num::==}(this.{dart.core::List::length})) {
this.{dart.collection::ListMixin::add}(element);
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart b/pkg/front_end/testcases/inference/call_corner_cases.dart
index 998d8a7..42ed206 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart
@@ -23,13 +23,13 @@
test() {
var /*@ type=int* */ callA = new A() /*@target=A::call*/ ();
var /*@ type=int* */ callFieldA =
- new D(). /*@target=D::fieldA*/ /*@target=A::call*/ fieldA();
+ new D(). /*@target=D::fieldA*/ fieldA /*@target=A::call*/ ();
var /*@ type=int* */ callGetA =
- new D(). /*@target=D::getA*/ /*@target=A::call*/ getA();
+ new D(). /*@target=D::getA*/ getA /*@target=A::call*/ ();
var /*@type=int**/ callFieldB = new D()
- . /*@target=D::fieldB*/ /*@target=B::call*/ /*@target=A::call*/ fieldB();
+ . /*@target=D::fieldB*/ fieldB /*@target=B::call*/ /*@target=A::call*/ ();
var /*@type=int**/ callGetB = new D()
- . /*@target=D::getB*/ /*@target=B::call*/ /*@target=A::call*/ getB();
+ . /*@target=D::getB*/ getB /*@target=B::call*/ /*@target=A::call*/ ();
}
main() {}
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart b/pkg/front_end/testcases/inference/callable_generic_class.dart
index 57f1e5e..fd64d35 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart
@@ -17,7 +17,7 @@
void main() {
new FooActions()
- . /*@target=FooActions::foo*/ /*@target=ActionDispatcher::call*/ foo(
+ . /*@target=FooActions::foo*/ foo /*@target=ActionDispatcher::call*/ (
new Bar());
new FooActions()
. /*@target=FooActions::foo*/ foo
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
index 36d9d8f..ecc609d 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
@@ -6,21 +6,45 @@
// Try adding an explicit type.
// get field1 => null;
// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// dynamic field1;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// int field1;
+// ^^^^^^
//
// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set field1(value) {}
// ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// dynamic field1;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// int field1;
+// ^^^^^^
//
// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
// Try adding an explicit type.
// get field2 => null;
// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// int field2;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// dynamic field2;
+// ^^^^^^
//
// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set field2(value) {}
// ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// int field2;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// dynamic field2;
+// ^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
index cdd0b47..c539ecb 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
@@ -6,21 +6,45 @@
// Try adding an explicit type.
// get field1 => null;
// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// dynamic field1;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// int field1;
+// ^^^^^^
//
// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set field1(value) {}
// ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// dynamic field1;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// int field1;
+// ^^^^^^
//
// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
// Try adding an explicit type.
// get field2 => null;
// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// int field2;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// dynamic field2;
+// ^^^^^^
//
// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set field2(value) {}
// ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// int field2;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// dynamic field2;
+// ^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
index cdd0b47..c539ecb 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
@@ -6,21 +6,45 @@
// Try adding an explicit type.
// get field1 => null;
// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// dynamic field1;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// int field1;
+// ^^^^^^
//
// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set field1(value) {}
// ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// dynamic field1;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// int field1;
+// ^^^^^^
//
// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
// Try adding an explicit type.
// get field2 => null;
// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// int field2;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// dynamic field2;
+// ^^^^^^
//
// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
// set field2(value) {}
// ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// int field2;
+// ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// dynamic field2;
+// ^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
index 10031dd..94b60b3 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
@@ -6,11 +6,23 @@
// Try adding an explicit type.
// get a => null;
// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// final I1 a = null;
+// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// final I2 a = null;
+// ^
//
// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
// Try adding an explicit type.
// get a => null;
// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// final I2 a = null;
+// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// final I1 a = null;
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
index f362386..2f9c0a9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
@@ -6,11 +6,23 @@
// Try adding an explicit type.
// get a => null;
// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// final I1 a = null;
+// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// final I2 a = null;
+// ^
//
// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
// Try adding an explicit type.
// get a => null;
// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// final I2 a = null;
+// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// final I1 a = null;
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
index f362386..2f9c0a9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
@@ -6,11 +6,23 @@
// Try adding an explicit type.
// get a => null;
// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// final I1 a = null;
+// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// final I2 a = null;
+// ^
//
// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
// Try adding an explicit type.
// get a => null;
// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// final I2 a = null;
+// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// final I1 a = null;
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
index f509791..6dec14e 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// get a => null;
// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+// final I1 a = null;
+// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+// final I2 a = null;
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
index 5ca29a6..82780a7 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// get a => null;
// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+// final I1 a = null;
+// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+// final I2 a = null;
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
index 5ca29a6..82780a7 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// get a => null;
// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+// final I1 a = null;
+// ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+// final I2 a = null;
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
index 1f6a002..bab54ce 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
@@ -2,9 +2,9 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
+// pkg/front_end/testcases/inference/dynamic_methods.dart:16:47: Error: 'hashCode' isn't a function or method and can't be invoked.
// d. /*@target=Object::hashCode*/ hashCode();
-// ^^^^^^^^
+// ^^^^...
//
import self as self;
import "dart:core" as core;
@@ -19,9 +19,9 @@
static method test() → dynamic {
dynamic d = new self::Foo::•();
core::int* get_hashCode = d.{core::Object::hashCode};
- dynamic call_hashCode = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
+ dynamic call_hashCode = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:47: Error: 'hashCode' isn't a function or method and can't be invoked.
d. /*@target=Object::hashCode*/ hashCode();
- ^^^^^^^^";
+ ^^^^...";
core::String* call_toString = d.{core::Object::toString}();
dynamic call_toStringArg = d.toString(color: "pink");
dynamic call_foo0 = d.foo();
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect
index 1f6a002..bab54ce 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
+// pkg/front_end/testcases/inference/dynamic_methods.dart:16:47: Error: 'hashCode' isn't a function or method and can't be invoked.
// d. /*@target=Object::hashCode*/ hashCode();
-// ^^^^^^^^
+// ^^^^...
//
import self as self;
import "dart:core" as core;
@@ -19,9 +19,9 @@
static method test() → dynamic {
dynamic d = new self::Foo::•();
core::int* get_hashCode = d.{core::Object::hashCode};
- dynamic call_hashCode = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
+ dynamic call_hashCode = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:47: Error: 'hashCode' isn't a function or method and can't be invoked.
d. /*@target=Object::hashCode*/ hashCode();
- ^^^^^^^^";
+ ^^^^...";
core::String* call_toString = d.{core::Object::toString}();
dynamic call_toStringArg = d.toString(color: "pink");
dynamic call_foo0 = d.foo();
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
index 05abfab..66a26bf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
@@ -2,9 +2,9 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
// - 'FutureOr' is from 'dart:async'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
// ^
//
@@ -24,9 +24,9 @@
static method test() → dynamic {
core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int*>*>(#C1);
asy::Future<core::List<core::int*>*>* results = asy::Future::wait<core::int*>(list);
- asy::Future<core::String*>* results2 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+ asy::Future<core::String*>* results2 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
- 'FutureOr' is from 'dart:async'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
/*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
^" as{TypeError,ForDynamic} asy::FutureOr<core::String*>*));
asy::Future<core::String*>* results3 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
index 05abfab..66a26bf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
// - 'FutureOr' is from 'dart:async'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
// ^
//
@@ -24,9 +24,9 @@
static method test() → dynamic {
core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int*>*>(#C1);
asy::Future<core::List<core::int*>*>* results = asy::Future::wait<core::int*>(list);
- asy::Future<core::String*>* results2 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+ asy::Future<core::String*>* results2 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
- 'FutureOr' is from 'dart:async'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
/*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
^" as{TypeError,ForDynamic} asy::FutureOr<core::String*>*));
asy::Future<core::String*>* results3 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
index 4287368..eaaeebe 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
@@ -6,31 +6,67 @@
// Try adding an explicit type.
// f(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// A f(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// I f(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// A f(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// I f(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// A f(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// I f(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// A g(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// A g(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// A g(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// A g(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// h(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+// A h(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+// A h(A x, {I y}) {}
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
index 490cc37..76b9569 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
@@ -6,31 +6,67 @@
// Try adding an explicit type.
// f(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// A f(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// I f(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// A f(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// I f(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// A f(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// I f(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// A g(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// A g(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// A g(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// A g(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// h(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+// A h(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+// A h(A x, {I y}) {}
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
index 490cc37..76b9569 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
@@ -6,31 +6,67 @@
// Try adding an explicit type.
// f(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// A f(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// I f(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// A f(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// I f(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// A f(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// I f(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// A g(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// A g(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// A g(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// A g(I x, {I y}) {}
+// ^
//
// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// h(x, {y}) {}
// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+// A h(A x, {A y}) {}
+// ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+// A h(A x, {I y}) {}
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
index d186b99..483a945 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
@@ -6,16 +6,34 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// num get x;
+// ^
//
// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// double get x;
+// ^
//
// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// num get x;
+// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// double get x;
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
index 863160b..141243b 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
@@ -6,16 +6,34 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// num get x;
+// ^
//
// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// double get x;
+// ^
//
// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// num get x;
+// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// double get x;
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
index 863160b..141243b 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
@@ -6,16 +6,34 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// num get x;
+// ^
//
// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// double get x;
+// ^
//
// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// num get x;
+// ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// double get x;
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index 5aa60b1..3376c0d 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -10,9 +10,9 @@
// /*error:UNDEFINED_IDENTIFIER*/ x
// ^
//
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
// - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
// var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
// ^
//
@@ -103,9 +103,9 @@
static field core::int* f = 2.{core::num::+}(3);
static field core::int* g = 3.{core::int::unary-}();
static field self::B* h = new self::A::•().{self::A::+}(3);
-static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
+static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
- 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
^";
static field self::B* j = null as self::B*;
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 5aa60b1..3376c0d 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -10,9 +10,9 @@
// /*error:UNDEFINED_IDENTIFIER*/ x
// ^
//
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
// - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
// var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
// ^
//
@@ -103,9 +103,9 @@
static field core::int* f = 2.{core::num::+}(3);
static field core::int* g = 3.{core::int::unary-}();
static field self::B* h = new self::A::•().{self::A::+}(3);
-static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
+static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
- 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
^";
static field self::B* j = null as self::B*;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
index 0c50386..b7726db 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
@@ -6,11 +6,6 @@
// class A extends Object with M0, M1<int> {}
// ^
//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
-// - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class A extends Object with M0, M1<int> {}
-// ^
-//
library;
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
index 440e0b2..e4415d8 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
@@ -6,11 +6,6 @@
// class A extends Object with M0, M1<int> {}
// ^
//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
-// - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class A extends Object with M0, M1<int> {}
-// ^
-//
library;
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
index b00323d..012864a 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
@@ -6,11 +6,6 @@
// class A extends Object with M0, M1 {}
// ^
//
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
-// - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class A extends Object with M0, M1 {}
-// ^
-//
library;
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
index 7d11e0c..4a017f6 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
@@ -6,11 +6,6 @@
// class A extends Object with M0, M1 {}
// ^
//
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
-// - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class A extends Object with M0, M1 {}
-// ^
-//
library;
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
index 73edc70..a0d028e 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
@@ -7,12 +7,6 @@
// class A extends Object with M0, M1 {}
// ^
//
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
-// - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
-// - 'List' is from 'dart:core'.
-// class A extends Object with M0, M1 {}
-// ^
-//
library;
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
index af62b10..e061e87 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
@@ -7,12 +7,6 @@
// class A extends Object with M0, M1 {}
// ^
//
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
-// - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
-// - 'List' is from 'dart:core'.
-// class A extends Object with M0, M1 {}
-// ^
-//
library;
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
index 6d183c0c..2620e6d 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
@@ -2,34 +2,21 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:72: Error: Can't infer the type of 'b': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:5: Error: Can't infer the type of 'a': circularity found during type inference.
// Specify the type explicitly.
-// var /*@error=CantInferTypeDueToCircularity*/ b = a/*@error=UndefinedMethod*/();
-// ^
-//
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:72: Error: Can't infer the type of 'a': circularity found during type inference.
-// Specify the type explicitly.
-// var /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
-// ^
-//
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:77: Error: The method 'call' isn't defined for the class 'invalid-type'.
-// Try correcting the name to the name of an existing method, or defining a method named 'call'.
-// var /*@error=CantInferTypeDueToCircularity*/ b = a/*@error=UndefinedMethod*/();
-// ^
+// var a = /*@ returnType=num* */ () => intValue /*@target=num::+*/ + b;
+// ^
//
import self as self;
import "dart:core" as core;
-static field core::int intValue = 0;
-static field core::num numValue = 0;
-static field core::double doubleValue = 0.0;
-static field invalid-type a = (() → core::num => self::intValue.{core::num::+}(self::b as{TypeError} core::num)) as{TypeError} invalid-type;
-static field invalid-type b = invalid-expression "pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:77: Error: The method 'call' isn't defined for the class 'invalid-type'.
-Try correcting the name to the name of an existing method, or defining a method named 'call'.
-var /*@error=CantInferTypeDueToCircularity*/ b = a/*@error=UndefinedMethod*/();
- ^";
-static field () → core::num c = () → core::num => self::numValue.{core::num::+}(self::d);
-static field core::num d = self::c.call();
-static field () → core::double e = () → core::double => self::doubleValue.{core::double::+}(self::f);
-static field core::double f = self::e.call();
+static field core::int* intValue = 0;
+static field core::num* numValue = 0;
+static field core::double* doubleValue = 0.0;
+static field invalid-type a = (() → core::num* => self::intValue.{core::num::+}(self::b as{TypeError,ForDynamic} core::num*)) as{TypeError} invalid-type;
+static field dynamic b = self::a.call();
+static field () →* core::num* c = () → core::num* => self::numValue.{core::num::+}(self::d);
+static field core::num* d = self::c.call();
+static field () →* core::double* e = () → core::double* => self::doubleValue.{core::double::+}(self::f);
+static field core::double* f = self::e.call();
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
index 21e5e15..bbf0793 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+// void set x(double value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
index 4b59c09..3fa7212 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+// void set x(double value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
index 4b59c09..3fa7212 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+// void set x(double value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
index f373c67..4f2a8df 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
@@ -6,11 +6,23 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+// A get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+// void set x(B value);
+// ^
//
// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// var y;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+// B get y;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+// void set y(A value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
index b5ca7dd..66a001b 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
@@ -6,11 +6,23 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+// A get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+// void set x(B value);
+// ^
//
// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// var y;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+// B get y;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+// void set y(A value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
index b5ca7dd..66a001b 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
@@ -6,11 +6,23 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+// A get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+// void set x(B value);
+// ^
//
// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
// Try adding an explicit type.
// var y;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+// B get y;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+// void set y(A value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
index b8c0502..020678b 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+// void set x(num value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
index cbb9102..b69c292 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+// void set x(num value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
index cbb9102..b69c292 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+// int get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+// void set x(num value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
index ac573d6..593040e 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+// num get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+// void set x(int value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
index 0d0b140..c02f37f1 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+// num get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+// void set x(int value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
index 0d0b140..c02f37f1 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
@@ -6,6 +6,12 @@
// Try adding an explicit type.
// var x;
// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+// num get x;
+// ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+// void set x(int value);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart b/pkg/front_end/testcases/late_lowering/compound.dart
new file mode 100644
index 0000000..1f29a5a
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart
@@ -0,0 +1,25 @@
+// 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.
+
+main() {
+ late int local1;
+ local1 = 0;
+ expect(0, local1);
+ local1 += 2;
+ expect(2, local1);
+
+ late int local2 = 1;
+ expect(1, local2);
+ local2 += 2;
+ expect(3, local2);
+}
+
+error() {
+ late final int local;
+ local += 0;
+}
+
+expect(expected, actual) {
+ if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.outline.expect b/pkg/front_end/testcases/late_lowering/compound.dart.outline.expect
new file mode 100644
index 0000000..afd7d44
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.outline.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method main() → dynamic
+ ;
+static method error() → dynamic
+ ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+ ;
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect b/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect
new file mode 100644
index 0000000..c4340c5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+// local += 0;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+ core::int? local1;
+ function #local1#get() → core::int
+ return let final core::int? #t1 = local1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.") : #t1{core::int};
+ function #local1#set(core::int #t2) → dynamic
+ return local1 = #t2;
+ #local1#set.call(0);
+ self::expect(0, #local1#get.call());
+ #local1#set.call(#local1#get.call().{core::num::+}(2));
+ self::expect(2, #local1#get.call());
+ core::int? local2;
+ function #local2#get() → core::int
+ return let final core::int? #t3 = local2 in #t3.==(null) ?{core::int} local2 = 1 : #t3{core::int};
+ function #local2#set(core::int #t4) → dynamic
+ return local2 = #t4;
+ self::expect(1, #local2#get.call());
+ #local2#set.call(#local2#get.call().{core::num::+}(2));
+ self::expect(3, #local2#get.call());
+}
+static method error() → dynamic {
+ final core::int? local;
+ function #local#get() → core::int
+ return let final core::int? #t5 = local in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t5{core::int};
+ function #local#set(core::int #t6) → dynamic
+ if(local.==(null))
+ return local = #t6;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+ #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+ local += 0;
+ ^^^^^" in #local#get.call()).{core::num::+}(0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!expected.{core::Object::==}(actual))
+ throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/compound.dart.strong.transformed.expect
new file mode 100644
index 0000000..c4340c5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.strong.transformed.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+// local += 0;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+ core::int? local1;
+ function #local1#get() → core::int
+ return let final core::int? #t1 = local1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.") : #t1{core::int};
+ function #local1#set(core::int #t2) → dynamic
+ return local1 = #t2;
+ #local1#set.call(0);
+ self::expect(0, #local1#get.call());
+ #local1#set.call(#local1#get.call().{core::num::+}(2));
+ self::expect(2, #local1#get.call());
+ core::int? local2;
+ function #local2#get() → core::int
+ return let final core::int? #t3 = local2 in #t3.==(null) ?{core::int} local2 = 1 : #t3{core::int};
+ function #local2#set(core::int #t4) → dynamic
+ return local2 = #t4;
+ self::expect(1, #local2#get.call());
+ #local2#set.call(#local2#get.call().{core::num::+}(2));
+ self::expect(3, #local2#get.call());
+}
+static method error() → dynamic {
+ final core::int? local;
+ function #local#get() → core::int
+ return let final core::int? #t5 = local in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t5{core::int};
+ function #local#set(core::int #t6) → dynamic
+ if(local.==(null))
+ return local = #t6;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+ #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+ local += 0;
+ ^^^^^" in #local#get.call()).{core::num::+}(0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!expected.{core::Object::==}(actual))
+ throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect b/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect
new file mode 100644
index 0000000..c4340c5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+// local += 0;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+ core::int? local1;
+ function #local1#get() → core::int
+ return let final core::int? #t1 = local1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.") : #t1{core::int};
+ function #local1#set(core::int #t2) → dynamic
+ return local1 = #t2;
+ #local1#set.call(0);
+ self::expect(0, #local1#get.call());
+ #local1#set.call(#local1#get.call().{core::num::+}(2));
+ self::expect(2, #local1#get.call());
+ core::int? local2;
+ function #local2#get() → core::int
+ return let final core::int? #t3 = local2 in #t3.==(null) ?{core::int} local2 = 1 : #t3{core::int};
+ function #local2#set(core::int #t4) → dynamic
+ return local2 = #t4;
+ self::expect(1, #local2#get.call());
+ #local2#set.call(#local2#get.call().{core::num::+}(2));
+ self::expect(3, #local2#get.call());
+}
+static method error() → dynamic {
+ final core::int? local;
+ function #local#get() → core::int
+ return let final core::int? #t5 = local in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t5{core::int};
+ function #local#set(core::int #t6) → dynamic
+ if(local.==(null))
+ return local = #t6;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+ #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+ local += 0;
+ ^^^^^" in #local#get.call()).{core::num::+}(0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!expected.{core::Object::==}(actual))
+ throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/compound.dart.weak.transformed.expect
new file mode 100644
index 0000000..c4340c5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.weak.transformed.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+// local += 0;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+ core::int? local1;
+ function #local1#get() → core::int
+ return let final core::int? #t1 = local1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.") : #t1{core::int};
+ function #local1#set(core::int #t2) → dynamic
+ return local1 = #t2;
+ #local1#set.call(0);
+ self::expect(0, #local1#get.call());
+ #local1#set.call(#local1#get.call().{core::num::+}(2));
+ self::expect(2, #local1#get.call());
+ core::int? local2;
+ function #local2#get() → core::int
+ return let final core::int? #t3 = local2 in #t3.==(null) ?{core::int} local2 = 1 : #t3{core::int};
+ function #local2#set(core::int #t4) → dynamic
+ return local2 = #t4;
+ self::expect(1, #local2#get.call());
+ #local2#set.call(#local2#get.call().{core::num::+}(2));
+ self::expect(3, #local2#get.call());
+}
+static method error() → dynamic {
+ final core::int? local;
+ function #local#get() → core::int
+ return let final core::int? #t5 = local in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t5{core::int};
+ function #local#set(core::int #t6) → dynamic
+ if(local.==(null))
+ return local = #t6;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+ #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+ local += 0;
+ ^^^^^" in #local#get.call()).{core::num::+}(0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!expected.{core::Object::==}(actual))
+ throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart
new file mode 100644
index 0000000..12241c7
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart
@@ -0,0 +1,91 @@
+// 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 'dart:async';
+
+methodDirect<T>(T value) {
+ late final T local2;
+ late final int local4;
+ late final FutureOr<int> local6;
+
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+
+ local2 = value; // error
+ local4 = 0; // error
+ local6 = 0; // error
+}
+
+var fieldDirect = <T>(T value) {
+ late final T local2;
+ late final int local4;
+ late final FutureOr<int> local6;
+
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+
+ local2 = value; // error
+ local4 = 0; // error
+ local6 = 0; // error
+};
+
+methodConditional<T>(bool b, T value) {
+ late final T local2;
+ late final int local4;
+ late final FutureOr<int> local6;
+
+ if (b) {
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+ }
+
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+
+ local2 = value; // error
+ local4 = 0; // error
+ local6 = 0; // error
+}
+
+var fieldConditional = <T>(bool b, T value) {
+ late final T local2;
+ late final int local4;
+ late final FutureOr<int> local6;
+
+ if (b) {
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+ }
+
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+
+ local2 = value; // error
+ local4 = 0; // error
+ local6 = 0; // error
+};
+
+methodCompound() {
+ late final int local4;
+
+ local4 = 0; // ok
+
+ local4 += 0; // error
+}
+
+var fieldCompound = () {
+ late final int local4;
+
+ local4 = 0; // ok
+
+ local4 += 0; // error
+};
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect
new file mode 100644
index 0000000..1a5e8e7
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
+static field () → core::Null? fieldCompound;
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
+ ;
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
+ ;
+static method methodCompound() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
new file mode 100644
index 0000000..0f62abd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ final T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t1) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t1;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+ function #local4#set(core::int #t3) → dynamic
+ if(local4.==(null))
+ return local4 = #t3;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+ if(local6.==(null))
+ return local6 = #t5;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ final T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t9) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t9;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t10 = local4 in #t10.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t10{core::int};
+ function #local4#set(core::int #t11) → dynamic
+ if(local4.==(null))
+ return local4 = #t11;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t13) → dynamic
+ if(local6.==(null))
+ return local6 = #t13;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ if(b) {
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ }
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t17{core::int};
+ function #local4#set(core::int #t18) → dynamic
+ if(local4.==(null))
+ return local4 = #t18;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ #local4#set.call(0);
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ final self::methodDirect::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodDirect::T%
+ return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodDirect::T% #t20) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t20;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t21 = local4 in #t21.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t21{core::int};
+ function #local4#set(core::int #t22) → dynamic
+ if(local4.==(null))
+ return local4 = #t22;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t24) → dynamic
+ if(local6.==(null))
+ return local6 = #t24;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ final self::methodConditional::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodConditional::T%
+ return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodConditional::T% #t28) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t28;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t29 = local4 in #t29.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t29{core::int};
+ function #local4#set(core::int #t30) → dynamic
+ if(local4.==(null))
+ return local4 = #t30;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t32) → dynamic
+ if(local6.==(null))
+ return local6 = #t32;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ if(b) {
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ }
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+}
+static method methodCompound() → dynamic {
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t36 = local4 in #t36.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t36{core::int};
+ function #local4#set(core::int #t37) → dynamic
+ if(local4.==(null))
+ return local4 = #t37;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ #local4#set.call(0);
+ let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
new file mode 100644
index 0000000..0f62abd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ final T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t1) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t1;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+ function #local4#set(core::int #t3) → dynamic
+ if(local4.==(null))
+ return local4 = #t3;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+ if(local6.==(null))
+ return local6 = #t5;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ final T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t9) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t9;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t10 = local4 in #t10.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t10{core::int};
+ function #local4#set(core::int #t11) → dynamic
+ if(local4.==(null))
+ return local4 = #t11;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t13) → dynamic
+ if(local6.==(null))
+ return local6 = #t13;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ if(b) {
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ }
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t17{core::int};
+ function #local4#set(core::int #t18) → dynamic
+ if(local4.==(null))
+ return local4 = #t18;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ #local4#set.call(0);
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ final self::methodDirect::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodDirect::T%
+ return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodDirect::T% #t20) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t20;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t21 = local4 in #t21.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t21{core::int};
+ function #local4#set(core::int #t22) → dynamic
+ if(local4.==(null))
+ return local4 = #t22;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t24) → dynamic
+ if(local6.==(null))
+ return local6 = #t24;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ final self::methodConditional::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodConditional::T%
+ return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodConditional::T% #t28) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t28;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t29 = local4 in #t29.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t29{core::int};
+ function #local4#set(core::int #t30) → dynamic
+ if(local4.==(null))
+ return local4 = #t30;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t32) → dynamic
+ if(local6.==(null))
+ return local6 = #t32;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ if(b) {
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ }
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+}
+static method methodCompound() → dynamic {
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t36 = local4 in #t36.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t36{core::int};
+ function #local4#set(core::int #t37) → dynamic
+ if(local4.==(null))
+ return local4 = #t37;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ #local4#set.call(0);
+ let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
new file mode 100644
index 0000000..0f62abd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ final T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t1) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t1;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+ function #local4#set(core::int #t3) → dynamic
+ if(local4.==(null))
+ return local4 = #t3;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+ if(local6.==(null))
+ return local6 = #t5;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ final T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t9) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t9;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t10 = local4 in #t10.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t10{core::int};
+ function #local4#set(core::int #t11) → dynamic
+ if(local4.==(null))
+ return local4 = #t11;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t13) → dynamic
+ if(local6.==(null))
+ return local6 = #t13;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ if(b) {
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ }
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t17{core::int};
+ function #local4#set(core::int #t18) → dynamic
+ if(local4.==(null))
+ return local4 = #t18;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ #local4#set.call(0);
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ final self::methodDirect::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodDirect::T%
+ return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodDirect::T% #t20) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t20;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t21 = local4 in #t21.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t21{core::int};
+ function #local4#set(core::int #t22) → dynamic
+ if(local4.==(null))
+ return local4 = #t22;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t24) → dynamic
+ if(local6.==(null))
+ return local6 = #t24;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ final self::methodConditional::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodConditional::T%
+ return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodConditional::T% #t28) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t28;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t29 = local4 in #t29.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t29{core::int};
+ function #local4#set(core::int #t30) → dynamic
+ if(local4.==(null))
+ return local4 = #t30;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t32) → dynamic
+ if(local6.==(null))
+ return local6 = #t32;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ if(b) {
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ }
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+}
+static method methodCompound() → dynamic {
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t36 = local4 in #t36.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t36{core::int};
+ function #local4#set(core::int #t37) → dynamic
+ if(local4.==(null))
+ return local4 = #t37;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ #local4#set.call(0);
+ let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
new file mode 100644
index 0000000..0f62abd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ final T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t1) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t1;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+ function #local4#set(core::int #t3) → dynamic
+ if(local4.==(null))
+ return local4 = #t3;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+ if(local6.==(null))
+ return local6 = #t5;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ final T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t9) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t9;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t10 = local4 in #t10.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t10{core::int};
+ function #local4#set(core::int #t11) → dynamic
+ if(local4.==(null))
+ return local4 = #t11;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t13) → dynamic
+ if(local6.==(null))
+ return local6 = #t13;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ if(b) {
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ }
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t17{core::int};
+ function #local4#set(core::int #t18) → dynamic
+ if(local4.==(null))
+ return local4 = #t18;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ #local4#set.call(0);
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ final self::methodDirect::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodDirect::T%
+ return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodDirect::T% #t20) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t20;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t21 = local4 in #t21.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t21{core::int};
+ function #local4#set(core::int #t22) → dynamic
+ if(local4.==(null))
+ return local4 = #t22;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t24) → dynamic
+ if(local6.==(null))
+ return local6 = #t24;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ final self::methodConditional::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodConditional::T%
+ return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodConditional::T% #t28) → dynamic
+ if(#local2#isSet)
+ throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+ else {
+ #local2#isSet = true;
+ return local2 = #t28;
+ }
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t29 = local4 in #t29.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t29{core::int};
+ function #local4#set(core::int #t30) → dynamic
+ if(local4.==(null))
+ return local4 = #t30;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ final asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t32) → dynamic
+ if(local6.==(null))
+ return local6 = #t32;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+ if(b) {
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ }
+ #local2#set.call(value);
+ #local4#set.call(0);
+ #local6#set.call(0);
+ let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in #local2#set.call(value);
+ let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in #local4#set.call(0);
+ let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in #local6#set.call(0);
+}
+static method methodCompound() → dynamic {
+ final core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t36 = local4 in #t36.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t36{core::int};
+ function #local4#set(core::int #t37) → dynamic
+ if(local4.==(null))
+ return local4 = #t37;
+ else
+ throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+ #local4#set.call(0);
+ let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart
new file mode 100644
index 0000000..5843b75
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart
@@ -0,0 +1,115 @@
+// 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 'dart:async';
+
+methodDirect<T>(T value) {
+ T local1;
+ late T local2;
+ int local3;
+ late int local4;
+ FutureOr<int> local5;
+ late FutureOr<int> local6;
+ late T local7 = value;
+
+ local1; // error
+ local2; // error
+ local3; // error
+ local4; // error
+ local5; // error
+ local6; // error
+ local7; // ok
+}
+
+var fieldDirect = <T>(T value) {
+ T local1;
+ late T local2;
+ int local3;
+ late int local4;
+ FutureOr<int> local5;
+ late FutureOr<int> local6;
+ late T local7 = value;
+
+ local1; // error
+ local2; // error
+ local3; // error
+ local4; // error
+ local5; // error
+ local6; // error
+ local7; // ok
+};
+
+methodConditional<T>(bool b, T value) {
+ T local1;
+ late T local2;
+ int local3;
+ late int local4;
+ FutureOr<int> local5;
+ late FutureOr<int> local6;
+ late T local7 = value;
+
+ if (b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7 = value;
+ }
+
+ local1; // error
+ local2; // ok
+ local3; // error
+ local4; // ok
+ local5; // error
+ local6; // ok
+ local7; // ok
+}
+
+var fieldConditional = <T>(bool b, T value) {
+ T local1;
+ late T local2;
+ int local3;
+ late int local4;
+ FutureOr<int> local5;
+ late FutureOr<int> local6;
+ late T local7 = value;
+
+ if (b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7; // ok
+ }
+
+ local1; // error
+ local2; // ok
+ local3; // error
+ local4; // ok
+ local5; // error
+ local6; // ok
+ local7; // ok
+};
+
+methodCompound() {
+ int local3;
+ late int local4;
+
+ local3 += 0; // error
+ local4 += 0; // error
+}
+
+var fieldCompound = () {
+ int local3;
+ late int local4;
+
+ local3 += 0; // error
+ local4 += 0; // error
+};
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect
new file mode 100644
index 0000000..1a5e8e7
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
+static field () → core::Null? fieldCompound;
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
+ ;
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
+ ;
+static method methodCompound() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
new file mode 100644
index 0000000..759a7c9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
@@ -0,0 +1,354 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ T% local1;
+ T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t1) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t1;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+ function #local4#set(core::int #t3) → dynamic
+ return local4 = #t3;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+ return local6 = #t5;
+ T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{T%};
+ }
+ function #local7#set(T% #t6) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t6;
+ }
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in #local2#get.call();
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in #local4#get.call();
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in #local6#get.call();
+ #local7#get.call();
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ T% local1;
+ T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t13) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t13;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t14 = local4 in #t14.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t14{core::int};
+ function #local4#set(core::int #t15) → dynamic
+ return local4 = #t15;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t17) → dynamic
+ return local6 = #t17;
+ T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{T%};
+ }
+ function #local7#set(T% #t18) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t18;
+ }
+ if(b) {
+ local1 = value;
+ #local2#set.call(value);
+ local3 = 0;
+ #local4#set.call(0);
+ local5 = 0;
+ #local6#set.call(0);
+ #local7#get.call();
+ }
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ #local2#get.call();
+ let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ #local4#get.call();
+ let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ #local6#get.call();
+ #local7#get.call();
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t22 = local4 in #t22.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t22{core::int};
+ function #local4#set(core::int #t23) → dynamic
+ return local4 = #t23;
+ local3 = (let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ #local4#set.call((let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ self::methodDirect::T% local1;
+ self::methodDirect::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodDirect::T%
+ return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodDirect::T% #t26) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t26;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t27 = local4 in #t27.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t27{core::int};
+ function #local4#set(core::int #t28) → dynamic
+ return local4 = #t28;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t30) → dynamic
+ return local6 = #t30;
+ self::methodDirect::T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → self::methodDirect::T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{self::methodDirect::T%};
+ }
+ function #local7#set(self::methodDirect::T% #t31) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t31;
+ }
+ let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in #local2#get.call();
+ let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in #local4#get.call();
+ let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in #local6#get.call();
+ #local7#get.call();
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ self::methodConditional::T% local1;
+ self::methodConditional::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodConditional::T%
+ return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodConditional::T% #t38) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t38;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t39 = local4 in #t39.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t39{core::int};
+ function #local4#set(core::int #t40) → dynamic
+ return local4 = #t40;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t42) → dynamic
+ return local6 = #t42;
+ self::methodConditional::T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → self::methodConditional::T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{self::methodConditional::T%};
+ }
+ function #local7#set(self::methodConditional::T% #t43) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t43;
+ }
+ if(b) {
+ local1 = value;
+ #local2#set.call(value);
+ local3 = 0;
+ #local4#set.call(0);
+ local5 = 0;
+ #local6#set.call(0);
+ #local7#set.call(value);
+ }
+ let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ #local2#get.call();
+ let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ #local4#get.call();
+ let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ #local6#get.call();
+ #local7#get.call();
+}
+static method methodCompound() → dynamic {
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t47 = local4 in #t47.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t47{core::int};
+ function #local4#set(core::int #t48) → dynamic
+ return local4 = #t48;
+ local3 = (let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ #local4#set.call((let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
new file mode 100644
index 0000000..759a7c9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
@@ -0,0 +1,354 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ T% local1;
+ T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t1) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t1;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+ function #local4#set(core::int #t3) → dynamic
+ return local4 = #t3;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+ return local6 = #t5;
+ T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{T%};
+ }
+ function #local7#set(T% #t6) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t6;
+ }
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in #local2#get.call();
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in #local4#get.call();
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in #local6#get.call();
+ #local7#get.call();
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ T% local1;
+ T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t13) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t13;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t14 = local4 in #t14.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t14{core::int};
+ function #local4#set(core::int #t15) → dynamic
+ return local4 = #t15;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t17) → dynamic
+ return local6 = #t17;
+ T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{T%};
+ }
+ function #local7#set(T% #t18) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t18;
+ }
+ if(b) {
+ local1 = value;
+ #local2#set.call(value);
+ local3 = 0;
+ #local4#set.call(0);
+ local5 = 0;
+ #local6#set.call(0);
+ #local7#get.call();
+ }
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ #local2#get.call();
+ let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ #local4#get.call();
+ let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ #local6#get.call();
+ #local7#get.call();
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t22 = local4 in #t22.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t22{core::int};
+ function #local4#set(core::int #t23) → dynamic
+ return local4 = #t23;
+ local3 = (let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ #local4#set.call((let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ self::methodDirect::T% local1;
+ self::methodDirect::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodDirect::T%
+ return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodDirect::T% #t26) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t26;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t27 = local4 in #t27.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t27{core::int};
+ function #local4#set(core::int #t28) → dynamic
+ return local4 = #t28;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t30) → dynamic
+ return local6 = #t30;
+ self::methodDirect::T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → self::methodDirect::T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{self::methodDirect::T%};
+ }
+ function #local7#set(self::methodDirect::T% #t31) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t31;
+ }
+ let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in #local2#get.call();
+ let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in #local4#get.call();
+ let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in #local6#get.call();
+ #local7#get.call();
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ self::methodConditional::T% local1;
+ self::methodConditional::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodConditional::T%
+ return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodConditional::T% #t38) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t38;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t39 = local4 in #t39.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t39{core::int};
+ function #local4#set(core::int #t40) → dynamic
+ return local4 = #t40;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t42) → dynamic
+ return local6 = #t42;
+ self::methodConditional::T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → self::methodConditional::T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{self::methodConditional::T%};
+ }
+ function #local7#set(self::methodConditional::T% #t43) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t43;
+ }
+ if(b) {
+ local1 = value;
+ #local2#set.call(value);
+ local3 = 0;
+ #local4#set.call(0);
+ local5 = 0;
+ #local6#set.call(0);
+ #local7#set.call(value);
+ }
+ let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ #local2#get.call();
+ let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ #local4#get.call();
+ let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ #local6#get.call();
+ #local7#get.call();
+}
+static method methodCompound() → dynamic {
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t47 = local4 in #t47.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t47{core::int};
+ function #local4#set(core::int #t48) → dynamic
+ return local4 = #t48;
+ local3 = (let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ #local4#set.call((let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
new file mode 100644
index 0000000..759a7c9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
@@ -0,0 +1,354 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ T% local1;
+ T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t1) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t1;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+ function #local4#set(core::int #t3) → dynamic
+ return local4 = #t3;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+ return local6 = #t5;
+ T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{T%};
+ }
+ function #local7#set(T% #t6) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t6;
+ }
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in #local2#get.call();
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in #local4#get.call();
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in #local6#get.call();
+ #local7#get.call();
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ T% local1;
+ T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t13) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t13;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t14 = local4 in #t14.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t14{core::int};
+ function #local4#set(core::int #t15) → dynamic
+ return local4 = #t15;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t17) → dynamic
+ return local6 = #t17;
+ T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{T%};
+ }
+ function #local7#set(T% #t18) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t18;
+ }
+ if(b) {
+ local1 = value;
+ #local2#set.call(value);
+ local3 = 0;
+ #local4#set.call(0);
+ local5 = 0;
+ #local6#set.call(0);
+ #local7#get.call();
+ }
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ #local2#get.call();
+ let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ #local4#get.call();
+ let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ #local6#get.call();
+ #local7#get.call();
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t22 = local4 in #t22.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t22{core::int};
+ function #local4#set(core::int #t23) → dynamic
+ return local4 = #t23;
+ local3 = (let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ #local4#set.call((let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ self::methodDirect::T% local1;
+ self::methodDirect::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodDirect::T%
+ return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodDirect::T% #t26) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t26;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t27 = local4 in #t27.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t27{core::int};
+ function #local4#set(core::int #t28) → dynamic
+ return local4 = #t28;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t30) → dynamic
+ return local6 = #t30;
+ self::methodDirect::T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → self::methodDirect::T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{self::methodDirect::T%};
+ }
+ function #local7#set(self::methodDirect::T% #t31) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t31;
+ }
+ let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in #local2#get.call();
+ let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in #local4#get.call();
+ let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in #local6#get.call();
+ #local7#get.call();
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ self::methodConditional::T% local1;
+ self::methodConditional::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodConditional::T%
+ return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodConditional::T% #t38) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t38;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t39 = local4 in #t39.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t39{core::int};
+ function #local4#set(core::int #t40) → dynamic
+ return local4 = #t40;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t42) → dynamic
+ return local6 = #t42;
+ self::methodConditional::T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → self::methodConditional::T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{self::methodConditional::T%};
+ }
+ function #local7#set(self::methodConditional::T% #t43) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t43;
+ }
+ if(b) {
+ local1 = value;
+ #local2#set.call(value);
+ local3 = 0;
+ #local4#set.call(0);
+ local5 = 0;
+ #local6#set.call(0);
+ #local7#set.call(value);
+ }
+ let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ #local2#get.call();
+ let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ #local4#get.call();
+ let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ #local6#get.call();
+ #local7#get.call();
+}
+static method methodCompound() → dynamic {
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t47 = local4 in #t47.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t47{core::int};
+ function #local4#set(core::int #t48) → dynamic
+ return local4 = #t48;
+ local3 = (let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ #local4#set.call((let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
new file mode 100644
index 0000000..759a7c9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
@@ -0,0 +1,354 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ T% local1;
+ T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t1) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t1;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+ function #local4#set(core::int #t3) → dynamic
+ return local4 = #t3;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+ return local6 = #t5;
+ T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{T%};
+ }
+ function #local7#set(T% #t6) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t6;
+ }
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in #local2#get.call();
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in #local4#get.call();
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in #local6#get.call();
+ #local7#get.call();
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ T% local1;
+ T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → T%
+ return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(T% #t13) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t13;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t14 = local4 in #t14.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t14{core::int};
+ function #local4#set(core::int #t15) → dynamic
+ return local4 = #t15;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t17) → dynamic
+ return local6 = #t17;
+ T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{T%};
+ }
+ function #local7#set(T% #t18) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t18;
+ }
+ if(b) {
+ local1 = value;
+ #local2#set.call(value);
+ local3 = 0;
+ #local4#set.call(0);
+ local5 = 0;
+ #local6#set.call(0);
+ #local7#get.call();
+ }
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ #local2#get.call();
+ let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ #local4#get.call();
+ let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ #local6#get.call();
+ #local7#get.call();
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t22 = local4 in #t22.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t22{core::int};
+ function #local4#set(core::int #t23) → dynamic
+ return local4 = #t23;
+ local3 = (let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ #local4#set.call((let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ self::methodDirect::T% local1;
+ self::methodDirect::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodDirect::T%
+ return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodDirect::T% #t26) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t26;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t27 = local4 in #t27.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t27{core::int};
+ function #local4#set(core::int #t28) → dynamic
+ return local4 = #t28;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t30) → dynamic
+ return local6 = #t30;
+ self::methodDirect::T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → self::methodDirect::T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{self::methodDirect::T%};
+ }
+ function #local7#set(self::methodDirect::T% #t31) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t31;
+ }
+ let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in #local2#get.call();
+ let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in #local4#get.call();
+ let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in #local6#get.call();
+ #local7#get.call();
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ self::methodConditional::T% local1;
+ self::methodConditional::T? local2;
+ core::bool #local2#isSet = false;
+ function #local2#get() → self::methodConditional::T%
+ return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+ function #local2#set(self::methodConditional::T% #t38) → dynamic {
+ #local2#isSet = true;
+ return local2 = #t38;
+ }
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t39 = local4 in #t39.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t39{core::int};
+ function #local4#set(core::int #t40) → dynamic
+ return local4 = #t40;
+ asy::FutureOr<core::int> local5;
+ asy::FutureOr<core::int>? local6;
+ function #local6#get() → asy::FutureOr<core::int>
+ return let final asy::FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{asy::FutureOr<core::int>};
+ function #local6#set(asy::FutureOr<core::int> #t42) → dynamic
+ return local6 = #t42;
+ self::methodConditional::T? local7;
+ core::bool #local7#isSet = false;
+ function #local7#get() → self::methodConditional::T% {
+ if(!#local7#isSet) {
+ #local7#isSet = true;
+ local7 = value;
+ }
+ return local7{self::methodConditional::T%};
+ }
+ function #local7#set(self::methodConditional::T% #t43) → dynamic {
+ #local7#isSet = true;
+ return local7 = #t43;
+ }
+ if(b) {
+ local1 = value;
+ #local2#set.call(value);
+ local3 = 0;
+ #local4#set.call(0);
+ local5 = 0;
+ #local6#set.call(0);
+ #local7#set.call(value);
+ }
+ let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ #local2#get.call();
+ let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ #local4#get.call();
+ let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ #local6#get.call();
+ #local7#get.call();
+}
+static method methodCompound() → dynamic {
+ core::int local3;
+ core::int? local4;
+ function #local4#get() → core::int
+ return let final core::int? #t47 = local4 in #t47.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t47{core::int};
+ function #local4#set(core::int #t48) → dynamic
+ return local4 = #t48;
+ local3 = (let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ #local4#set.call((let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart
new file mode 100644
index 0000000..99b6bc0
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart
@@ -0,0 +1,10 @@
+// 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.
+
+T f<T>(T t) => t;
+
+main() {
+ late int local;
+ local = f(0);
+}
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.outline.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.outline.expect
new file mode 100644
index 0000000..b6346e7
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.outline.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.expect
new file mode 100644
index 0000000..4c0d317
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ return t;
+static method main() → dynamic {
+ core::int? local;
+ function #local#get() → core::int
+ return let final core::int? #t1 = local in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t1{core::int};
+ function #local#set(core::int #t2) → dynamic
+ return local = #t2;
+ #local#set.call(self::f<core::int>(0));
+}
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.transformed.expect
new file mode 100644
index 0000000..4c0d317
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ return t;
+static method main() → dynamic {
+ core::int? local;
+ function #local#get() → core::int
+ return let final core::int? #t1 = local in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t1{core::int};
+ function #local#set(core::int #t2) → dynamic
+ return local = #t2;
+ #local#set.call(self::f<core::int>(0));
+}
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.expect
new file mode 100644
index 0000000..4c0d317
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ return t;
+static method main() → dynamic {
+ core::int? local;
+ function #local#get() → core::int
+ return let final core::int? #t1 = local in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t1{core::int};
+ function #local#set(core::int #t2) → dynamic
+ return local = #t2;
+ #local#set.call(self::f<core::int>(0));
+}
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.transformed.expect
new file mode 100644
index 0000000..4c0d317
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.transformed.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ return t;
+static method main() → dynamic {
+ core::int? local;
+ function #local#get() → core::int
+ return let final core::int? #t1 = local in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t1{core::int};
+ function #local#set(core::int #t2) → dynamic
+ return local = #t2;
+ #local#set.call(self::f<core::int>(0));
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart b/pkg/front_end/testcases/late_lowering/issue40601.dart
new file mode 100644
index 0000000..56ae989
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart
@@ -0,0 +1,18 @@
+// 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.
+
+abstract class A<T> {
+ T baz();
+ bar(T value) {}
+ foo() {
+ late T value;
+ var result = () => bar(value);
+ (() {
+ value = baz();
+ })();
+ return result;
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.outline.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.outline.expect
new file mode 100644
index 0000000..f2c5efd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.outline.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic
+ ;
+ method foo() → dynamic
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
new file mode 100644
index 0000000..b339c0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ : super core::Object::•()
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+ method foo() → dynamic {
+ self::A::T? value;
+ core::bool #value#isSet = false;
+ function #value#get() → self::A::T%
+ return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'value' has not been initialized.");
+ function #value#set(self::A::T% #t1) → dynamic {
+ #value#isSet = true;
+ return value = #t1;
+ }
+ () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
+ (() → core::Null? {
+ #value#set.call(this.{self::A::baz}());
+ }).call();
+ return result;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect
new file mode 100644
index 0000000..b339c0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ : super core::Object::•()
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+ method foo() → dynamic {
+ self::A::T? value;
+ core::bool #value#isSet = false;
+ function #value#get() → self::A::T%
+ return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'value' has not been initialized.");
+ function #value#set(self::A::T% #t1) → dynamic {
+ #value#isSet = true;
+ return value = #t1;
+ }
+ () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
+ (() → core::Null? {
+ #value#set.call(this.{self::A::baz}());
+ }).call();
+ return result;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
new file mode 100644
index 0000000..b339c0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ : super core::Object::•()
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+ method foo() → dynamic {
+ self::A::T? value;
+ core::bool #value#isSet = false;
+ function #value#get() → self::A::T%
+ return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'value' has not been initialized.");
+ function #value#set(self::A::T% #t1) → dynamic {
+ #value#isSet = true;
+ return value = #t1;
+ }
+ () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
+ (() → core::Null? {
+ #value#set.call(this.{self::A::baz}());
+ }).call();
+ return result;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect
new file mode 100644
index 0000000..b339c0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ : super core::Object::•()
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+ method foo() → dynamic {
+ self::A::T? value;
+ core::bool #value#isSet = false;
+ function #value#get() → self::A::T%
+ return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'value' has not been initialized.");
+ function #value#set(self::A::T% #t1) → dynamic {
+ #value#isSet = true;
+ return value = #t1;
+ }
+ () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
+ (() → core::Null? {
+ #value#set.call(this.{self::A::baz}());
+ }).call();
+ return result;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart
index b06d748..31db7ec 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart
@@ -3,20 +3,36 @@
// BSD-style license that can be found in the LICENSE file.
main() {
+ bool b = false;
late final int lateLocal;
+ if (b) {
+ // Pretend to assign to confuse flow analysis for the read below.
+ lateLocal = 123;
+ }
throws(() => lateLocal, 'Read value from uninitialized lateLocal');
- expect(123, lateLocal = 123);
- expect(123, lateLocal);
+ if (!b) {
+ // Pretend to not assign to confuse flow analysis for the write below.
+ expect(123, lateLocal = 123);
+ expect(123, lateLocal);
+ }
throws(() => lateLocal = 124, 'Write value to initialized lateLocal');
local<T>(T value) {
late final T lateGenericLocal;
+ if (b) {
+ // Pretend to assign to confuse flow analysis for the read below.
+ lateGenericLocal = value;
+ }
throws(() => lateGenericLocal,
'Read value from uninitialized lateGenericLocal');
- expect(value, lateGenericLocal = value);
- expect(value, lateGenericLocal);
+
+ if (!b) {
+ // Pretend to not assign to confuse flow analysis for the write below.
+ expect(value, lateGenericLocal = value);
+ expect(value, lateGenericLocal);
+ }
throws(() => lateGenericLocal = value,
'Write value to initialized lateGenericLocal');
}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect
index bb8676d..3476c20 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect
@@ -4,6 +4,7 @@
import "dart:_internal" as _in;
static method main() → dynamic {
+ core::bool b = false;
final core::int? lateLocal;
function #lateLocal#get() → core::int
return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.") : #t1{core::int};
@@ -12,9 +13,14 @@
return lateLocal = #t2;
else
throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+ if(b) {
+ #lateLocal#set.call(123);
+ }
self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
- self::expect(123, #lateLocal#set.call(123));
- self::expect(123, #lateLocal#get.call());
+ if(!b) {
+ self::expect(123, #lateLocal#set.call(123));
+ self::expect(123, #lateLocal#get.call());
+ }
self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
final T? lateGenericLocal;
@@ -28,9 +34,14 @@
#lateGenericLocal#isSet = true;
return lateGenericLocal = #t3;
}
+ if(b) {
+ #lateGenericLocal#set.call(value);
+ }
self::throws(() → T% => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
- self::expect(value, #lateGenericLocal#set.call(value));
- self::expect(value, #lateGenericLocal#get.call());
+ if(!b) {
+ self::expect(value, #lateGenericLocal#set.call(value));
+ self::expect(value, #lateGenericLocal#get.call());
+ }
self::throws(() → T% => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
}
local.call<core::int?>(null);
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect
index bb8676d..3476c20 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect
@@ -4,6 +4,7 @@
import "dart:_internal" as _in;
static method main() → dynamic {
+ core::bool b = false;
final core::int? lateLocal;
function #lateLocal#get() → core::int
return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.") : #t1{core::int};
@@ -12,9 +13,14 @@
return lateLocal = #t2;
else
throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+ if(b) {
+ #lateLocal#set.call(123);
+ }
self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
- self::expect(123, #lateLocal#set.call(123));
- self::expect(123, #lateLocal#get.call());
+ if(!b) {
+ self::expect(123, #lateLocal#set.call(123));
+ self::expect(123, #lateLocal#get.call());
+ }
self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
final T? lateGenericLocal;
@@ -28,9 +34,14 @@
#lateGenericLocal#isSet = true;
return lateGenericLocal = #t3;
}
+ if(b) {
+ #lateGenericLocal#set.call(value);
+ }
self::throws(() → T% => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
- self::expect(value, #lateGenericLocal#set.call(value));
- self::expect(value, #lateGenericLocal#get.call());
+ if(!b) {
+ self::expect(value, #lateGenericLocal#set.call(value));
+ self::expect(value, #lateGenericLocal#get.call());
+ }
self::throws(() → T% => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
}
local.call<core::int?>(null);
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect
index bb8676d..3476c20 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect
@@ -4,6 +4,7 @@
import "dart:_internal" as _in;
static method main() → dynamic {
+ core::bool b = false;
final core::int? lateLocal;
function #lateLocal#get() → core::int
return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.") : #t1{core::int};
@@ -12,9 +13,14 @@
return lateLocal = #t2;
else
throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+ if(b) {
+ #lateLocal#set.call(123);
+ }
self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
- self::expect(123, #lateLocal#set.call(123));
- self::expect(123, #lateLocal#get.call());
+ if(!b) {
+ self::expect(123, #lateLocal#set.call(123));
+ self::expect(123, #lateLocal#get.call());
+ }
self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
final T? lateGenericLocal;
@@ -28,9 +34,14 @@
#lateGenericLocal#isSet = true;
return lateGenericLocal = #t3;
}
+ if(b) {
+ #lateGenericLocal#set.call(value);
+ }
self::throws(() → T% => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
- self::expect(value, #lateGenericLocal#set.call(value));
- self::expect(value, #lateGenericLocal#get.call());
+ if(!b) {
+ self::expect(value, #lateGenericLocal#set.call(value));
+ self::expect(value, #lateGenericLocal#get.call());
+ }
self::throws(() → T% => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
}
local.call<core::int?>(null);
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect
index bb8676d..3476c20 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect
@@ -4,6 +4,7 @@
import "dart:_internal" as _in;
static method main() → dynamic {
+ core::bool b = false;
final core::int? lateLocal;
function #lateLocal#get() → core::int
return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.") : #t1{core::int};
@@ -12,9 +13,14 @@
return lateLocal = #t2;
else
throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+ if(b) {
+ #lateLocal#set.call(123);
+ }
self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
- self::expect(123, #lateLocal#set.call(123));
- self::expect(123, #lateLocal#get.call());
+ if(!b) {
+ self::expect(123, #lateLocal#set.call(123));
+ self::expect(123, #lateLocal#get.call());
+ }
self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
final T? lateGenericLocal;
@@ -28,9 +34,14 @@
#lateGenericLocal#isSet = true;
return lateGenericLocal = #t3;
}
+ if(b) {
+ #lateGenericLocal#set.call(value);
+ }
self::throws(() → T% => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
- self::expect(value, #lateGenericLocal#set.call(value));
- self::expect(value, #lateGenericLocal#get.call());
+ if(!b) {
+ self::expect(value, #lateGenericLocal#set.call(value));
+ self::expect(value, #lateGenericLocal#get.call());
+ }
self::throws(() → T% => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
}
local.call<core::int?>(null);
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
index c886bcf..4646abe 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
@@ -55,7 +55,7 @@
// late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
// ^^^^^
//
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Warning: Constructor is marked 'const' and some fields are late.
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
// const B(); // Error: B has late final fields.
// ^
// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
index a7094a7..a0a1523 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
@@ -55,7 +55,7 @@
// late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
// ^^^^^
//
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Warning: Constructor is marked 'const' and some fields are late.
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
// const B(); // Error: B has late final fields.
// ^
// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
index ddfc6a4..9c3d453 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
@@ -2,94 +2,94 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/assignability.dart:114:10: Warning: Assigning value of type 'Object?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// Object objectVar = objectNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:115:3: Warning: Assigning value of type 'num?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = numNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:116:3: Warning: Assigning value of type 'int?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = intNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:117:3: Warning: Assigning value of type 'double?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = doubleNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:118:3: Warning: Assigning value of type 'Function?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
// - 'Function' is from 'dart:core'.
// - 'Object' is from 'dart:core'.
// objectVar = functionNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:119:3: Warning: Assigning value of type 'void Function()?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = toVoidNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:120:3: Warning: Assigning value of type 'Tearoffable?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
// - 'Object' is from 'dart:core'.
// objectVar = tearoffableNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:121:3: Warning: Assigning value of type 'XnonNull?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = xNonNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:122:3: Warning: Assigning value of type 'XpotentiallyNull' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = xPotentiallyNullArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:123:3: Warning: Assigning value of type 'XpotentiallyNull?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = xPotentiallyNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:124:3: Warning: Assigning value of type 'YnonNull?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = yNonNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:125:3: Warning: Assigning value of type 'YpotentiallyNull' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = yPotentiallyNullArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:126:3: Warning: Assigning value of type 'YpotentiallyNull?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = yPotentiallyNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:128:7: Warning: Assigning value of type 'Object' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
// - 'Object' is from 'dart:core'.
// num numVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:129:3: Warning: Assigning value of type 'Object?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
// - 'Object' is from 'dart:core'.
// numVar = objectNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:130:3: Warning: Assigning value of type 'num?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
// numVar = numNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:131:3: Warning: Assigning value of type 'int?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
// numVar = intNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:132:3: Warning: Assigning value of type 'double?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
// numVar = doubleNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
// - 'Function' is from 'dart:core'.
@@ -151,27 +151,27 @@
// numVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:148:7: Warning: Assigning value of type 'Object' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
// - 'Object' is from 'dart:core'.
// int intVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:149:3: Warning: Assigning value of type 'Object?' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
// - 'Object' is from 'dart:core'.
// intVar = objectNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:150:3: Warning: Assigning value of type 'num' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
// intVar = numArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:151:3: Warning: Assigning value of type 'num?' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
// intVar = numNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:152:3: Warning: Assigning value of type 'int?' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
// intVar = intNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
// intVar = doubleArg;
@@ -241,23 +241,23 @@
// intVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:170:10: Warning: Assigning value of type 'Object' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
// - 'Object' is from 'dart:core'.
// double doubleVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:171:3: Warning: Assigning value of type 'Object?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
// - 'Object' is from 'dart:core'.
// doubleVar = objectNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:172:3: Warning: Assigning value of type 'num' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
// doubleVar = numArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:173:3: Warning: Assigning value of type 'num?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
// doubleVar = numNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
// doubleVar = intArg;
@@ -267,9 +267,9 @@
// doubleVar = intNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:176:3: Warning: Assigning value of type 'double?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
// doubleVar = doubleNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
// - 'Function' is from 'dart:core'.
@@ -331,17 +331,17 @@
// doubleVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:192:12: Warning: Assigning value of type 'Object' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
// - 'Object' is from 'dart:core'.
// - 'Function' is from 'dart:core'.
// Function functionVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:193:3: Warning: Assigning value of type 'Object?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
// - 'Object' is from 'dart:core'.
// - 'Function' is from 'dart:core'.
// functionVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
// - 'Function' is from 'dart:core'.
@@ -373,17 +373,17 @@
// functionVar = doubleNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:200:3: Warning: Assigning value of type 'Function?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
// - 'Function' is from 'dart:core'.
// functionVar = functionNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:201:3: Warning: Assigning value of type 'void Function()?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
// - 'Function' is from 'dart:core'.
// functionVar = toVoidNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:202:17: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
// functionVar = tearoffableNullableArg;
// ^
//
@@ -427,15 +427,15 @@
// functionVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:212:19: Warning: Assigning value of type 'Object' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
// - 'Object' is from 'dart:core'.
// void Function() toVoidVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:213:3: Warning: Assigning value of type 'Object?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
// - 'Object' is from 'dart:core'.
// toVoidVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
// toVoidVar = numArg;
@@ -461,21 +461,21 @@
// toVoidVar = doubleNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:220:3: Warning: Assigning value of type 'Function' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
// - 'Function' is from 'dart:core'.
// toVoidVar = functionArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:221:3: Warning: Assigning value of type 'Function?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
// - 'Function' is from 'dart:core'.
// toVoidVar = functionNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:222:3: Warning: Assigning value of type 'void Function()?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
// toVoidVar = toVoidNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:223:15: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
// toVoidVar = tearoffableNullableArg;
// ^
//
@@ -511,17 +511,17 @@
// toVoidVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:233:15: Warning: Assigning value of type 'Object' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
// - 'Object' is from 'dart:core'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
// Tearoffable tearoffableVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:234:3: Warning: Assigning value of type 'Object?' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
// - 'Object' is from 'dart:core'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
// tearoffableVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
@@ -575,10 +575,10 @@
// tearoffableVar = toVoidNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:245:3: Warning: Assigning value of type 'Tearoffable?' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
// tearoffableVar = tearoffableNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
@@ -620,15 +620,15 @@
// tearoffableVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:255:12: Warning: Assigning value of type 'Object' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
// - 'Object' is from 'dart:core'.
// XnonNull xNonNullVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:256:3: Warning: Assigning value of type 'Object?' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
// - 'Object' is from 'dart:core'.
// xNonNullVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = numArg;
@@ -682,9 +682,9 @@
// xNonNullVar = tearoffableNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:269:3: Warning: Assigning value of type 'XnonNull?' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = xNonNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = xPotentiallyNullArg;
@@ -694,9 +694,9 @@
// xNonNullVar = xPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:272:3: Warning: Assigning value of type 'YnonNull?' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = yNonNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = yPotentiallyNullArg;
@@ -706,15 +706,15 @@
// xNonNullVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:276:20: Warning: Assigning value of type 'Object' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
// - 'Object' is from 'dart:core'.
// XpotentiallyNull xPotentiallyNullVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:277:3: Warning: Assigning value of type 'Object?' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
// - 'Object' is from 'dart:core'.
// xPotentiallyNullVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
// xPotentiallyNullVar = numArg;
@@ -776,9 +776,9 @@
// xPotentiallyNullVar = xNonNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:292:3: Warning: Assigning value of type 'XpotentiallyNull?' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
// xPotentiallyNullVar = xPotentiallyNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
// xPotentiallyNullVar = yNonNullArg;
@@ -788,19 +788,19 @@
// xPotentiallyNullVar = yNonNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:295:3: Warning: Assigning value of type 'YpotentiallyNull?' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
// xPotentiallyNullVar = yPotentiallyNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:297:12: Warning: Assigning value of type 'Object' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
// - 'Object' is from 'dart:core'.
// YnonNull yNonNullVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:298:3: Warning: Assigning value of type 'Object?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
// - 'Object' is from 'dart:core'.
// yNonNullVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = numArg;
@@ -854,13 +854,13 @@
// yNonNullVar = tearoffableNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:311:3: Warning: Assigning value of type 'XnonNull' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = xNonNullArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:312:3: Warning: Assigning value of type 'XnonNull?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = xNonNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = xPotentiallyNullArg;
@@ -870,9 +870,9 @@
// yNonNullVar = xPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:315:3: Warning: Assigning value of type 'YnonNull?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = yNonNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = yPotentiallyNullArg;
@@ -882,15 +882,15 @@
// yNonNullVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:319:20: Warning: Assigning value of type 'Object' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
// - 'Object' is from 'dart:core'.
// YpotentiallyNull yPotentiallyNullVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:320:3: Warning: Assigning value of type 'Object?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
// - 'Object' is from 'dart:core'.
// yPotentiallyNullVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = numArg;
@@ -952,13 +952,13 @@
// yPotentiallyNullVar = xNonNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:335:3: Warning: Assigning value of type 'XpotentiallyNull' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = xPotentiallyNullArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:336:3: Warning: Assigning value of type 'XpotentiallyNull?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = xPotentiallyNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = yNonNullArg;
@@ -968,9 +968,9 @@
// yPotentiallyNullVar = yNonNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:339:3: Warning: Assigning value of type 'YpotentiallyNull?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = yPotentiallyNullNullableArg;
-// ^
+// ^
//
import self as self;
import "dart:core" as core;
@@ -994,7 +994,7 @@
dynamicVar = xPotentiallyNullArg;
dynamicVar = yNonNullArg;
dynamicVar = yPotentiallyNullArg;
- core::Object objectVar = dynamicArg;
+ core::Object objectVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Object;
objectVar = objectArg;
objectVar = numArg;
objectVar = intArg;
@@ -1032,595 +1032,759 @@
yPotentiallyNullVar = yPotentiallyNullArg;
}
static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
- core::Object objectVar = objectNullableArg;
+ core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
+ Object objectVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = numNullableArg;
+ ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = intNullableArg;
+ ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = doubleNullableArg;
+ ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+ - 'Function' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
objectVar = functionNullableArg;
+ ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = toVoidNullableArg;
+ ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+ - 'Object' is from 'dart:core'.
objectVar = tearoffableNullableArg;
+ ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = xNonNullNullableArg;
+ ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = xPotentiallyNullArg;
+ ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = xPotentiallyNullNullableArg;
+ ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = yNonNullNullableArg;
+ ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = yPotentiallyNullArg;
+ ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = yPotentiallyNullNullableArg;
- core::num numVar = objectArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ core::num numVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
+ - 'Object' is from 'dart:core'.
+ num numVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
+ - 'Object' is from 'dart:core'.
+ numVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
numVar = numNullableArg;
+ ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
numVar = intNullableArg;
+ ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
numVar = doubleNullableArg;
- numVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
+ ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
- 'Function' is from 'dart:core'.
numVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
- 'Function' is from 'dart:core'.
numVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
numVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
numVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
numVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
numVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
numVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
numVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
numVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
numVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
numVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
numVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
numVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
numVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- core::int intVar = objectArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = numArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+ core::int intVar = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+ int intVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+ intVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ intVar = numArg;
+ ^" in numArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
+ intVar = numNullableArg;
+ ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
intVar = intNullableArg;
- intVar = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
intVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
intVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
- 'Function' is from 'dart:core'.
intVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
- 'Function' is from 'dart:core'.
intVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
intVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
intVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
intVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
intVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
intVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
intVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
intVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
intVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
intVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
intVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
intVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
intVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- core::double doubleVar = objectArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = numArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = numNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+ core::double doubleVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+ double doubleVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+ doubleVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ doubleVar = numArg;
+ ^" in numArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
+ doubleVar = numNullableArg;
+ ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
doubleVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
doubleVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
doubleVar = doubleNullableArg;
- doubleVar = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
+ ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
- 'Function' is from 'dart:core'.
doubleVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
- 'Function' is from 'dart:core'.
doubleVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
doubleVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
doubleVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
doubleVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
doubleVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
doubleVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
doubleVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
doubleVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
doubleVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
doubleVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
doubleVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
doubleVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
doubleVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- core::Function functionVar = objectArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
+ core::Function functionVar = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+ Function functionVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+ functionVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
functionVar = functionNullableArg;
+ ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
functionVar = toVoidNullableArg;
- functionVar = tearoffableNullableArg as{TypeError} core::Function;
- functionVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
+ ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
+ functionVar = tearoffableNullableArg;
+ ^" in tearoffableNullableArg as{TypeError} core::Function;
+ functionVar = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- () → void toVoidVar = objectArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = objectNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
+ () → void toVoidVar = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+ void Function() toVoidVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+ toVoidVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
toVoidVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
toVoidVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
toVoidVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = functionArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
+ - 'Function' is from 'dart:core'.
+ toVoidVar = functionArg;
+ ^" in functionArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
+ - 'Function' is from 'dart:core'.
+ toVoidVar = functionNullableArg;
+ ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = toVoidNullableArg;
- toVoidVar = tearoffableNullableArg as{TypeError} () → void;
- toVoidVar = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
+ ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
+ toVoidVar = tearoffableNullableArg;
+ ^" in tearoffableNullableArg as{TypeError} () → void;
+ toVoidVar = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
toVoidVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
toVoidVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
toVoidVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
toVoidVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- self::Tearoffable tearoffableVar = objectArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
+ self::Tearoffable tearoffableVar = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+ Tearoffable tearoffableVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+ tearoffableVar = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+ tearoffableVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+ tearoffableVar = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
- 'Function' is from 'dart:core'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
- 'Function' is from 'dart:core'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+ tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = tearoffableNullableArg;
- tearoffableVar = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
+ ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+ tearoffableVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- self::error::XnonNull xNonNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::XnonNull;
- xNonNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::XnonNull;
- xNonNullVar = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
+ self::error::XnonNull xNonNullVar = let final<BottomType> #t137 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+ XnonNull xNonNullVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t138 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+ xNonNullVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t140 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t142 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t144 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
- 'Function' is from 'dart:core'.
xNonNullVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
- 'Function' is from 'dart:core'.
xNonNullVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
xNonNullVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
xNonNullVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = xNonNullNullableArg;
- xNonNullVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
+ ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = yNonNullNullableArg;
- xNonNullVar = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
+ ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- self::error::XpotentiallyNull% xPotentiallyNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::XpotentiallyNull%;
- xPotentiallyNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::XpotentiallyNull%;
- xPotentiallyNullVar = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
+ self::error::XpotentiallyNull% xPotentiallyNullVar = let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+ XpotentiallyNull xPotentiallyNullVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+ xPotentiallyNullVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t160 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t163 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
- 'Function' is from 'dart:core'.
xPotentiallyNullVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t166 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
- 'Function' is from 'dart:core'.
xPotentiallyNullVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t167 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t168 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t169 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
xPotentiallyNullVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t170 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
xPotentiallyNullVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t172 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = xPotentiallyNullNullableArg;
- xPotentiallyNullVar = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+ ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = yPotentiallyNullNullableArg;
- self::error::YnonNull yNonNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
- yNonNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
- yNonNullVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
+ ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::error::YnonNull yNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
+ - 'Object' is from 'dart:core'.
+ YnonNull yNonNullVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
+ - 'Object' is from 'dart:core'.
+ yNonNullVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t179 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t182 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t185 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
- 'Function' is from 'dart:core'.
yNonNullVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
- 'Function' is from 'dart:core'.
yNonNullVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t188 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t137 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t189 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
yNonNullVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t138 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t190 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
yNonNullVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = xNonNullArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
- yNonNullVar = xNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
- yNonNullVar = let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t191 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = xNonNullArg;
+ ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t192 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = xNonNullNullableArg;
+ ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t193 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t140 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t194 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = yNonNullNullableArg;
- yNonNullVar = let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+ ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t142 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t197 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- self::error::YpotentiallyNull% yPotentiallyNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
- yPotentiallyNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
- yPotentiallyNullVar = let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
+ self::error::YpotentiallyNull% yPotentiallyNullVar = let final<BottomType> #t198 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+ YpotentiallyNull yPotentiallyNullVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t199 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+ yPotentiallyNullVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t200 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t144 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t201 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t203 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t204 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t205 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
- 'Function' is from 'dart:core'.
yPotentiallyNullVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t207 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
- 'Function' is from 'dart:core'.
yPotentiallyNullVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t208 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t209 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
yPotentiallyNullVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t211 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
yPotentiallyNullVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t212 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t213 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
- yPotentiallyNullVar = xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
- yPotentiallyNullVar = let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t214 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = xPotentiallyNullArg;
+ ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = xPotentiallyNullNullableArg;
+ ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t216 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = yPotentiallyNullNullableArg;
+ ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
index ddfc6a4..9c3d453 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
@@ -2,94 +2,94 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/assignability.dart:114:10: Warning: Assigning value of type 'Object?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// Object objectVar = objectNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:115:3: Warning: Assigning value of type 'num?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = numNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:116:3: Warning: Assigning value of type 'int?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = intNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:117:3: Warning: Assigning value of type 'double?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = doubleNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:118:3: Warning: Assigning value of type 'Function?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
// - 'Function' is from 'dart:core'.
// - 'Object' is from 'dart:core'.
// objectVar = functionNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:119:3: Warning: Assigning value of type 'void Function()?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = toVoidNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:120:3: Warning: Assigning value of type 'Tearoffable?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
// - 'Object' is from 'dart:core'.
// objectVar = tearoffableNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:121:3: Warning: Assigning value of type 'XnonNull?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = xNonNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:122:3: Warning: Assigning value of type 'XpotentiallyNull' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = xPotentiallyNullArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:123:3: Warning: Assigning value of type 'XpotentiallyNull?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = xPotentiallyNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:124:3: Warning: Assigning value of type 'YnonNull?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = yNonNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:125:3: Warning: Assigning value of type 'YpotentiallyNull' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = yPotentiallyNullArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:126:3: Warning: Assigning value of type 'YpotentiallyNull?' to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
// - 'Object' is from 'dart:core'.
// objectVar = yPotentiallyNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:128:7: Warning: Assigning value of type 'Object' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
// - 'Object' is from 'dart:core'.
// num numVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:129:3: Warning: Assigning value of type 'Object?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
// - 'Object' is from 'dart:core'.
// numVar = objectNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:130:3: Warning: Assigning value of type 'num?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
// numVar = numNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:131:3: Warning: Assigning value of type 'int?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
// numVar = intNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:132:3: Warning: Assigning value of type 'double?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
// numVar = doubleNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
// - 'Function' is from 'dart:core'.
@@ -151,27 +151,27 @@
// numVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:148:7: Warning: Assigning value of type 'Object' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
// - 'Object' is from 'dart:core'.
// int intVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:149:3: Warning: Assigning value of type 'Object?' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
// - 'Object' is from 'dart:core'.
// intVar = objectNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:150:3: Warning: Assigning value of type 'num' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
// intVar = numArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:151:3: Warning: Assigning value of type 'num?' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
// intVar = numNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:152:3: Warning: Assigning value of type 'int?' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
// intVar = intNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
// intVar = doubleArg;
@@ -241,23 +241,23 @@
// intVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:170:10: Warning: Assigning value of type 'Object' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
// - 'Object' is from 'dart:core'.
// double doubleVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:171:3: Warning: Assigning value of type 'Object?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
// - 'Object' is from 'dart:core'.
// doubleVar = objectNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:172:3: Warning: Assigning value of type 'num' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
// doubleVar = numArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:173:3: Warning: Assigning value of type 'num?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
// doubleVar = numNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
// doubleVar = intArg;
@@ -267,9 +267,9 @@
// doubleVar = intNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:176:3: Warning: Assigning value of type 'double?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
// doubleVar = doubleNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
// - 'Function' is from 'dart:core'.
@@ -331,17 +331,17 @@
// doubleVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:192:12: Warning: Assigning value of type 'Object' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
// - 'Object' is from 'dart:core'.
// - 'Function' is from 'dart:core'.
// Function functionVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:193:3: Warning: Assigning value of type 'Object?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
// - 'Object' is from 'dart:core'.
// - 'Function' is from 'dart:core'.
// functionVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
// - 'Function' is from 'dart:core'.
@@ -373,17 +373,17 @@
// functionVar = doubleNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:200:3: Warning: Assigning value of type 'Function?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
// - 'Function' is from 'dart:core'.
// functionVar = functionNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:201:3: Warning: Assigning value of type 'void Function()?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
// - 'Function' is from 'dart:core'.
// functionVar = toVoidNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:202:17: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
// functionVar = tearoffableNullableArg;
// ^
//
@@ -427,15 +427,15 @@
// functionVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:212:19: Warning: Assigning value of type 'Object' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
// - 'Object' is from 'dart:core'.
// void Function() toVoidVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:213:3: Warning: Assigning value of type 'Object?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
// - 'Object' is from 'dart:core'.
// toVoidVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
// toVoidVar = numArg;
@@ -461,21 +461,21 @@
// toVoidVar = doubleNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:220:3: Warning: Assigning value of type 'Function' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
// - 'Function' is from 'dart:core'.
// toVoidVar = functionArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:221:3: Warning: Assigning value of type 'Function?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
// - 'Function' is from 'dart:core'.
// toVoidVar = functionNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:222:3: Warning: Assigning value of type 'void Function()?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
// toVoidVar = toVoidNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:223:15: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
// toVoidVar = tearoffableNullableArg;
// ^
//
@@ -511,17 +511,17 @@
// toVoidVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:233:15: Warning: Assigning value of type 'Object' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
// - 'Object' is from 'dart:core'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
// Tearoffable tearoffableVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:234:3: Warning: Assigning value of type 'Object?' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
// - 'Object' is from 'dart:core'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
// tearoffableVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
@@ -575,10 +575,10 @@
// tearoffableVar = toVoidNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:245:3: Warning: Assigning value of type 'Tearoffable?' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
// tearoffableVar = tearoffableNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
// - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
@@ -620,15 +620,15 @@
// tearoffableVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:255:12: Warning: Assigning value of type 'Object' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
// - 'Object' is from 'dart:core'.
// XnonNull xNonNullVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:256:3: Warning: Assigning value of type 'Object?' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
// - 'Object' is from 'dart:core'.
// xNonNullVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = numArg;
@@ -682,9 +682,9 @@
// xNonNullVar = tearoffableNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:269:3: Warning: Assigning value of type 'XnonNull?' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = xNonNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = xPotentiallyNullArg;
@@ -694,9 +694,9 @@
// xNonNullVar = xPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:272:3: Warning: Assigning value of type 'YnonNull?' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = yNonNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
// xNonNullVar = yPotentiallyNullArg;
@@ -706,15 +706,15 @@
// xNonNullVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:276:20: Warning: Assigning value of type 'Object' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
// - 'Object' is from 'dart:core'.
// XpotentiallyNull xPotentiallyNullVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:277:3: Warning: Assigning value of type 'Object?' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
// - 'Object' is from 'dart:core'.
// xPotentiallyNullVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
// xPotentiallyNullVar = numArg;
@@ -776,9 +776,9 @@
// xPotentiallyNullVar = xNonNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:292:3: Warning: Assigning value of type 'XpotentiallyNull?' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
// xPotentiallyNullVar = xPotentiallyNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
// xPotentiallyNullVar = yNonNullArg;
@@ -788,19 +788,19 @@
// xPotentiallyNullVar = yNonNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:295:3: Warning: Assigning value of type 'YpotentiallyNull?' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
// xPotentiallyNullVar = yPotentiallyNullNullableArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:297:12: Warning: Assigning value of type 'Object' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
// - 'Object' is from 'dart:core'.
// YnonNull yNonNullVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:298:3: Warning: Assigning value of type 'Object?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
// - 'Object' is from 'dart:core'.
// yNonNullVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = numArg;
@@ -854,13 +854,13 @@
// yNonNullVar = tearoffableNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:311:3: Warning: Assigning value of type 'XnonNull' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = xNonNullArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:312:3: Warning: Assigning value of type 'XnonNull?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = xNonNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = xPotentiallyNullArg;
@@ -870,9 +870,9 @@
// yNonNullVar = xPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:315:3: Warning: Assigning value of type 'YnonNull?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = yNonNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
// yNonNullVar = yPotentiallyNullArg;
@@ -882,15 +882,15 @@
// yNonNullVar = yPotentiallyNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:319:20: Warning: Assigning value of type 'Object' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
// - 'Object' is from 'dart:core'.
// YpotentiallyNull yPotentiallyNullVar = objectArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:320:3: Warning: Assigning value of type 'Object?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
// - 'Object' is from 'dart:core'.
// yPotentiallyNullVar = objectNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = numArg;
@@ -952,13 +952,13 @@
// yPotentiallyNullVar = xNonNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:335:3: Warning: Assigning value of type 'XpotentiallyNull' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = xPotentiallyNullArg;
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:336:3: Warning: Assigning value of type 'XpotentiallyNull?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = xPotentiallyNullNullableArg;
-// ^
+// ^
//
// pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = yNonNullArg;
@@ -968,9 +968,9 @@
// yPotentiallyNullVar = yNonNullNullableArg;
// ^
//
-// pkg/front_end/testcases/nnbd/assignability.dart:339:3: Warning: Assigning value of type 'YpotentiallyNull?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
// yPotentiallyNullVar = yPotentiallyNullNullableArg;
-// ^
+// ^
//
import self as self;
import "dart:core" as core;
@@ -994,7 +994,7 @@
dynamicVar = xPotentiallyNullArg;
dynamicVar = yNonNullArg;
dynamicVar = yPotentiallyNullArg;
- core::Object objectVar = dynamicArg;
+ core::Object objectVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Object;
objectVar = objectArg;
objectVar = numArg;
objectVar = intArg;
@@ -1032,595 +1032,759 @@
yPotentiallyNullVar = yPotentiallyNullArg;
}
static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
- core::Object objectVar = objectNullableArg;
+ core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
+ Object objectVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = numNullableArg;
+ ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = intNullableArg;
+ ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = doubleNullableArg;
+ ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+ - 'Function' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
objectVar = functionNullableArg;
+ ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = toVoidNullableArg;
+ ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+ - 'Object' is from 'dart:core'.
objectVar = tearoffableNullableArg;
+ ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = xNonNullNullableArg;
+ ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = xPotentiallyNullArg;
+ ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = xPotentiallyNullNullableArg;
+ ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = yNonNullNullableArg;
+ ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = yPotentiallyNullArg;
+ ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
+ objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+ - 'Object' is from 'dart:core'.
objectVar = yPotentiallyNullNullableArg;
- core::num numVar = objectArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+ core::num numVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
+ - 'Object' is from 'dart:core'.
+ num numVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
+ - 'Object' is from 'dart:core'.
+ numVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
numVar = numNullableArg;
+ ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
numVar = intNullableArg;
+ ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
numVar = doubleNullableArg;
- numVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
+ ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+ numVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
- 'Function' is from 'dart:core'.
numVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
- 'Function' is from 'dart:core'.
numVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
numVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
numVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
numVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
numVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
numVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
numVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
numVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
numVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
numVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
numVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
numVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
- numVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
+ numVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
numVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
- core::int intVar = objectArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = numArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+ core::int intVar = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+ int intVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+ intVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ intVar = numArg;
+ ^" in numArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
+ intVar = numNullableArg;
+ ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
intVar = intNullableArg;
- intVar = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+ intVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
intVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
intVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
- 'Function' is from 'dart:core'.
intVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
- 'Function' is from 'dart:core'.
intVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
intVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
intVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
intVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
intVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
intVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
intVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
intVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
intVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
intVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
intVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
intVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
- intVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
+ intVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
intVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
- core::double doubleVar = objectArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = numArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = numNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+ core::double doubleVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+ double doubleVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+ doubleVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ doubleVar = numArg;
+ ^" in numArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
+ doubleVar = numNullableArg;
+ ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
doubleVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
doubleVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
doubleVar = doubleNullableArg;
- doubleVar = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
+ ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+ doubleVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
- 'Function' is from 'dart:core'.
doubleVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
- 'Function' is from 'dart:core'.
doubleVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
doubleVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
doubleVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
doubleVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
doubleVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
doubleVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
doubleVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
doubleVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
doubleVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
doubleVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
doubleVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
doubleVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
- doubleVar = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
+ doubleVar = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
doubleVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
- core::Function functionVar = objectArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
+ core::Function functionVar = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+ Function functionVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+ functionVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
functionVar = functionNullableArg;
+ ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
functionVar = toVoidNullableArg;
- functionVar = tearoffableNullableArg as{TypeError} core::Function;
- functionVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
+ ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+ functionVar = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
+ functionVar = tearoffableNullableArg;
+ ^" in tearoffableNullableArg as{TypeError} core::Function;
+ functionVar = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
- functionVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+ functionVar = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
- 'Function' is from 'dart:core'.
functionVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
- () → void toVoidVar = objectArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = objectNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
+ () → void toVoidVar = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+ void Function() toVoidVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+ toVoidVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
toVoidVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
toVoidVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
toVoidVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = functionArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
+ - 'Function' is from 'dart:core'.
+ toVoidVar = functionArg;
+ ^" in functionArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
+ - 'Function' is from 'dart:core'.
+ toVoidVar = functionNullableArg;
+ ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = toVoidNullableArg;
- toVoidVar = tearoffableNullableArg as{TypeError} () → void;
- toVoidVar = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
+ ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+ toVoidVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
+ toVoidVar = tearoffableNullableArg;
+ ^" in tearoffableNullableArg as{TypeError} () → void;
+ toVoidVar = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
toVoidVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
toVoidVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
toVoidVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
toVoidVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
- toVoidVar = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+ toVoidVar = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
toVoidVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
- self::Tearoffable tearoffableVar = objectArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
+ self::Tearoffable tearoffableVar = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+ Tearoffable tearoffableVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+ tearoffableVar = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+ tearoffableVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+ tearoffableVar = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
- 'Function' is from 'dart:core'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
- 'Function' is from 'dart:core'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+ tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = tearoffableNullableArg;
- tearoffableVar = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
+ ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+ tearoffableVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- tearoffableVar = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+ tearoffableVar = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
tearoffableVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
- self::error::XnonNull xNonNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::XnonNull;
- xNonNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::XnonNull;
- xNonNullVar = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
+ self::error::XnonNull xNonNullVar = let final<BottomType> #t137 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+ XnonNull xNonNullVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t138 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+ xNonNullVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t140 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t142 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t144 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
- 'Function' is from 'dart:core'.
xNonNullVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
- 'Function' is from 'dart:core'.
xNonNullVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
xNonNullVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
xNonNullVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = xNonNullNullableArg;
- xNonNullVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
+ ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = yNonNullNullableArg;
- xNonNullVar = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
+ ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xNonNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xNonNullVar = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+ xNonNullVar = let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
xNonNullVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- self::error::XpotentiallyNull% xPotentiallyNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::XpotentiallyNull%;
- xPotentiallyNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::XpotentiallyNull%;
- xPotentiallyNullVar = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
+ self::error::XpotentiallyNull% xPotentiallyNullVar = let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+ XpotentiallyNull xPotentiallyNullVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+ xPotentiallyNullVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t160 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t163 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
- 'Function' is from 'dart:core'.
xPotentiallyNullVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t166 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
- 'Function' is from 'dart:core'.
xPotentiallyNullVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t167 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t168 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t169 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
xPotentiallyNullVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t170 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
xPotentiallyNullVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t172 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = xPotentiallyNullNullableArg;
- xPotentiallyNullVar = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+ ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- xPotentiallyNullVar = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ xPotentiallyNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
xPotentiallyNullVar = yPotentiallyNullNullableArg;
- self::error::YnonNull yNonNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
- yNonNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
- yNonNullVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
+ ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::error::YnonNull yNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
+ - 'Object' is from 'dart:core'.
+ YnonNull yNonNullVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
+ - 'Object' is from 'dart:core'.
+ yNonNullVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t179 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t182 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t185 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
- 'Function' is from 'dart:core'.
yNonNullVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
- 'Function' is from 'dart:core'.
yNonNullVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t188 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t137 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t189 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
yNonNullVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t138 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t190 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
yNonNullVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = xNonNullArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
- yNonNullVar = xNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
- yNonNullVar = let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t191 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = xNonNullArg;
+ ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t192 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = xNonNullNullableArg;
+ ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t193 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = xPotentiallyNullArg;
^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t140 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t194 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = xPotentiallyNullNullableArg;
^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = yNonNullNullableArg;
- yNonNullVar = let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+ ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yNonNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = yPotentiallyNullArg;
^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yNonNullVar = let final<BottomType> #t142 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+ yNonNullVar = let final<BottomType> #t197 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
yNonNullVar = yPotentiallyNullNullableArg;
^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- self::error::YpotentiallyNull% yPotentiallyNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
- yPotentiallyNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
- yPotentiallyNullVar = let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
+ self::error::YpotentiallyNull% yPotentiallyNullVar = let final<BottomType> #t198 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+ YpotentiallyNull yPotentiallyNullVar = objectArg;
+ ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t199 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+ yPotentiallyNullVar = objectNullableArg;
+ ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t200 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = numArg;
^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t144 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t201 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = numNullableArg;
^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = intArg;
^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t203 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = intNullableArg;
^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t204 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = doubleArg;
^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t205 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = doubleNullableArg;
^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
- 'Function' is from 'dart:core'.
yPotentiallyNullVar = functionArg;
^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t207 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
- 'Function' is from 'dart:core'.
yPotentiallyNullVar = functionNullableArg;
^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t208 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = toVoidArg;
^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t209 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = toVoidNullableArg;
^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
yPotentiallyNullVar = tearoffableArg;
^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t211 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
- 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
yPotentiallyNullVar = tearoffableNullableArg;
^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t212 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = xNonNullArg;
^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t213 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = xNonNullNullableArg;
^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
- yPotentiallyNullVar = xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
- yPotentiallyNullVar = let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t214 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = xPotentiallyNullArg;
+ ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = xPotentiallyNullNullableArg;
+ ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t216 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = yNonNullArg;
^" in yNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
- yPotentiallyNullVar = let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ yPotentiallyNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = yNonNullNullableArg;
^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+ yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
yPotentiallyNullVar = yPotentiallyNullNullableArg;
+ ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart b/pkg/front_end/testcases/nnbd/bounds_checks.dart
index 3250d57..617a14a 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart
@@ -4,15 +4,15 @@
class A<X extends num> {}
-foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+foo(A<num?> a) {} // Error
-A<num?> bar() {} // Error in strong mode and Warning in weak mode.
+A<num?>? bar() {} // Error
-baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+baz<T extends A<num?>>() {} // Error
-class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+class B extends A<num?> {} // Error
-class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+class C<T extends A<num?>> {} // Error
void hest<T extends num>() {}
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.outline.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.outline.expect
index a66b2fe..f3c9fb6 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.outline.expect
@@ -4,23 +4,23 @@
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
// Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-// ^
+// A<num?>? bar() {} // Error
+// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
@@ -28,7 +28,7 @@
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
// Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
@@ -36,7 +36,7 @@
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
@@ -65,7 +65,7 @@
}
static method foo(self::A<core::num?> a) → dynamic
;
-static method bar() → self::A<core::num?>
+static method bar() → self::A<core::num?>?
;
static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic
;
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
index 686cc68..90866e8 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
@@ -4,23 +4,23 @@
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
// Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-// ^
+// A<num?>? bar() {} // Error
+// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
@@ -28,7 +28,7 @@
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
// Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
@@ -36,7 +36,7 @@
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
@@ -81,7 +81,7 @@
method hest<T extends core::num = core::num>() → void {}
}
static method foo(self::A<core::num?> a) → dynamic {}
-static method bar() → self::A<core::num?> {}
+static method bar() → self::A<core::num?>? {}
static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
static method hest<T extends core::num = core::num>() → void {}
static method fisk(self::Hest h) → dynamic {
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
index 686cc68..90866e8 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
@@ -4,23 +4,23 @@
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
// Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-// ^
+// A<num?>? bar() {} // Error
+// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
@@ -28,7 +28,7 @@
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
// Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
@@ -36,7 +36,7 @@
//
// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
@@ -81,7 +81,7 @@
method hest<T extends core::num = core::num>() → void {}
}
static method foo(self::A<core::num?> a) → dynamic {}
-static method bar() → self::A<core::num?> {}
+static method bar() → self::A<core::num?>? {}
static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
static method hest<T extends core::num = core::num>() → void {}
static method fisk(self::Hest h) → dynamic {
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
index d78654a..90866e8 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
@@ -2,47 +2,47 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
// Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-// ^
+// A<num?>? bar() {} // Error
+// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
// Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:24:3: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'hest'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:24:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'hest'.
// Try changing type arguments so that they conform to the bounds.
// hest<num?>();
// ^
@@ -50,7 +50,7 @@
// void hest<T extends num>() {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:25:5: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'Hest.hest'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:25:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'Hest.hest'.
// - 'Hest' is from 'pkg/front_end/testcases/nnbd/bounds_checks.dart'.
// Try changing type arguments so that they conform to the bounds.
// h.hest<num?>();
@@ -81,7 +81,7 @@
method hest<T extends core::num = core::num>() → void {}
}
static method foo(self::A<core::num?> a) → dynamic {}
-static method bar() → self::A<core::num?> {}
+static method bar() → self::A<core::num?>? {}
static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
static method hest<T extends core::num = core::num>() → void {}
static method fisk(self::Hest h) → dynamic {
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
index d78654a..90866e8 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
@@ -2,47 +2,47 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
// Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-// ^
+// A<num?>? bar() {} // Error
+// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
// Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
// Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
// ^
// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
// class A<X extends num> {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:24:3: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'hest'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:24:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'hest'.
// Try changing type arguments so that they conform to the bounds.
// hest<num?>();
// ^
@@ -50,7 +50,7 @@
// void hest<T extends num>() {}
// ^
//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:25:5: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'Hest.hest'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:25:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'Hest.hest'.
// - 'Hest' is from 'pkg/front_end/testcases/nnbd/bounds_checks.dart'.
// Try changing type arguments so that they conform to the bounds.
// h.hest<num?>();
@@ -81,7 +81,7 @@
method hest<T extends core::num = core::num>() → void {}
}
static method foo(self::A<core::num?> a) → dynamic {}
-static method bar() → self::A<core::num?> {}
+static method bar() → self::A<core::num?>? {}
static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
static method hest<T extends core::num = core::num>() → void {}
static method fisk(self::Hest h) → dynamic {
diff --git a/pkg/front_end/testcases/nnbd/call.dart.strong.expect b/pkg/front_end/testcases/nnbd/call.dart.strong.expect
index 9386657..66a5576 100644
--- a/pkg/front_end/testcases/nnbd/call.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/call.dart.strong.expect
@@ -2,11 +2,6 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
-// f();
-// ^
-//
// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
// Try calling using ?.call instead.
// f();
@@ -15,17 +10,17 @@
// pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
// Try calling using ?. instead.
// f.call();
-// ^
+// ^^^^
//
-// pkg/front_end/testcases/nnbd/call.dart:15:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
// c.field();
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/call.dart:16:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
// c.getter();
-// ^
+// ^
//
import self as self;
import "dart:core" as core;
@@ -43,22 +38,19 @@
let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
Try calling using ?.call instead.
f();
- ^" in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
- f();
^" in f.call();
- let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
Try calling using ?. instead.
f.call();
- ^" in f.call();
+ ^^^^" in f.call();
self::Class c = new self::Class::•();
- let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
c.field();
- ^" in c.{self::Class::field}.call();
- let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
+ ^" in c.{self::Class::field}.call();
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
c.getter();
- ^" in c.{self::Class::getter}.call();
+ ^" in c.{self::Class::getter}.call();
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/call.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/call.dart.strong.transformed.expect
index 9386657..66a5576 100644
--- a/pkg/front_end/testcases/nnbd/call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/call.dart.strong.transformed.expect
@@ -2,11 +2,6 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
-// f();
-// ^
-//
// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
// Try calling using ?.call instead.
// f();
@@ -15,17 +10,17 @@
// pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
// Try calling using ?. instead.
// f.call();
-// ^
+// ^^^^
//
-// pkg/front_end/testcases/nnbd/call.dart:15:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
// c.field();
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/call.dart:16:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
// c.getter();
-// ^
+// ^
//
import self as self;
import "dart:core" as core;
@@ -43,22 +38,19 @@
let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
Try calling using ?.call instead.
f();
- ^" in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
- f();
^" in f.call();
- let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
Try calling using ?. instead.
f.call();
- ^" in f.call();
+ ^^^^" in f.call();
self::Class c = new self::Class::•();
- let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
c.field();
- ^" in c.{self::Class::field}.call();
- let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
+ ^" in c.{self::Class::field}.call();
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
c.getter();
- ^" in c.{self::Class::getter}.call();
+ ^" in c.{self::Class::getter}.call();
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/call.dart.weak.expect b/pkg/front_end/testcases/nnbd/call.dart.weak.expect
index 3b6dfa5..66a5576 100644
--- a/pkg/front_end/testcases/nnbd/call.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/call.dart.weak.expect
@@ -2,30 +2,25 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
-// f();
-// ^
-//
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Warning: Expression of type 'void Function()?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
// Try calling using ?.call instead.
// f();
// ^
//
-// pkg/front_end/testcases/nnbd/call.dart:13:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
+// pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
// Try calling using ?. instead.
// f.call();
-// ^
+// ^^^^
//
-// pkg/front_end/testcases/nnbd/call.dart:15:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
// c.field();
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/call.dart:16:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
// c.getter();
-// ^
+// ^
//
import self as self;
import "dart:core" as core;
@@ -40,10 +35,22 @@
}
static method error() → dynamic {
() →? void f;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+ f();
+ ^" in f.call();
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
f.call();
- f.call();
+ ^^^^" in f.call();
self::Class c = new self::Class::•();
- c.{self::Class::field}.call();
- c.{self::Class::getter}.call();
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+ c.field();
+ ^" in c.{self::Class::field}.call();
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+ c.getter();
+ ^" in c.{self::Class::getter}.call();
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/call.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/call.dart.weak.transformed.expect
index 3b6dfa5..66a5576 100644
--- a/pkg/front_end/testcases/nnbd/call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/call.dart.weak.transformed.expect
@@ -2,30 +2,25 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
-// f();
-// ^
-//
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Warning: Expression of type 'void Function()?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
// Try calling using ?.call instead.
// f();
// ^
//
-// pkg/front_end/testcases/nnbd/call.dart:13:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
+// pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
// Try calling using ?. instead.
// f.call();
-// ^
+// ^^^^
//
-// pkg/front_end/testcases/nnbd/call.dart:15:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
// c.field();
-// ^
+// ^
//
-// pkg/front_end/testcases/nnbd/call.dart:16:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
// c.getter();
-// ^
+// ^
//
import self as self;
import "dart:core" as core;
@@ -40,10 +35,22 @@
}
static method error() → dynamic {
() →? void f;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+ f();
+ ^" in f.call();
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
f.call();
- f.call();
+ ^^^^" in f.call();
self::Class c = new self::Class::•();
- c.{self::Class::field}.call();
- c.{self::Class::getter}.call();
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+ c.field();
+ ^" in c.{self::Class::field}.call();
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+ c.getter();
+ ^" in c.{self::Class::getter}.call();
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/constants.dart b/pkg/front_end/testcases/nnbd/constants.dart
index 0a32e64..3335767 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart
+++ b/pkg/front_end/testcases/nnbd/constants.dart
@@ -41,17 +41,8 @@
final bool inStrongMode = _inStrongMode();
bool _inStrongMode() {
- var f = (String? s) {
- s.length; // This will be an invalid expression in strong mode.
- };
- try {
- f("foo");
- } catch (e) {
- print('Running in strong mode.');
- return true;
- }
- print('Running in weak mode.');
- return false;
+ const List<int?> list = const <int?>[];
+ return list is! List<int>;
}
main() {
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
index 12632c3..0293eeb 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
@@ -1,12 +1,4 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/constants.dart:45:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
-// Try accessing using ?. instead.
-// s.length; // This will be an invalid expression in strong mode.
-// ^^^^^^
-//
import self as self;
import "dart:core" as core;
import "constants_lib.dart" as con;
@@ -39,34 +31,20 @@
static const field core::bool mapConcatenationIdentical = #C16;
static final field core::bool inStrongMode = self::_inStrongMode();
static method _inStrongMode() → core::bool {
- (core::String?) → core::Null? f = (core::String? s) → core::Null? {
- let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/constants.dart:45:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
-Try accessing using ?. instead.
- s.length; // This will be an invalid expression in strong mode.
- ^^^^^^" in s.{core::String::length};
- };
- try {
- f.call("foo");
- }
- on dynamic catch(final dynamic e) {
- core::print("Running in strong mode.");
- return true;
- }
- core::print("Running in weak mode.");
- return false;
+ return !((#C17) is{ForNonNullableByDefault} core::List<core::int>);
}
static method main() → dynamic {
- self::test(#C1, #C17);
- self::test(#C3, #C18);
- self::test(#C5, #C19);
- self::test(#C6, #C20);
- self::test(#C7, #C21);
- self::test(#C8, #C22);
- self::test(#C12, #C24);
- self::test(#C15, #C25);
- self::test(#C8, #C22);
- self::test(#C12, #C24);
- self::test(#C15, #C25);
+ self::test(#C1, #C18);
+ self::test(#C3, #C19);
+ self::test(#C5, #C20);
+ self::test(#C6, #C21);
+ self::test(#C7, #C22);
+ self::test(#C8, #C23);
+ self::test(#C12, #C25);
+ self::test(#C15, #C26);
+ self::test(#C8, #C23);
+ self::test(#C12, #C25);
+ self::test(#C15, #C26);
self::test(true, #C16);
self::test(true, #C16);
self::test(true, #C16);
@@ -105,29 +83,29 @@
: con::Class::field = field, super core::Object::•()
;
}
-static const field core::Type* objectTypeLiteral = #C17;
-static const field (core::Object*, core::Object*) →* core::bool* c2 = #C26;
-static const field (core::int*) →* core::int* partialInstantiation = #C18;
-static const field con::Class<core::int*>* instance = #C19;
-static const field core::Type* functionTypeLiteral = #C20;
-static const field core::Type* genericFunctionTypeLiteral = #C21;
-static const field core::List<core::int*>* listLiteral = #C22;
-static const field core::Set<core::int*>* setLiteral = #C24;
-static const field core::Map<core::int*, core::String*>* mapLiteral = #C25;
-static const field core::List<core::int*>* listConcatenation = #C22;
-static const field core::Set<core::int*>* setConcatenation = #C24;
-static const field core::Map<core::int*, core::String*>* mapConcatenation = #C25;
+static const field core::Type* objectTypeLiteral = #C18;
+static const field (core::Object*, core::Object*) →* core::bool* c2 = #C27;
+static const field (core::int*) →* core::int* partialInstantiation = #C19;
+static const field con::Class<core::int*>* instance = #C20;
+static const field core::Type* functionTypeLiteral = #C21;
+static const field core::Type* genericFunctionTypeLiteral = #C22;
+static const field core::List<core::int*>* listLiteral = #C23;
+static const field core::Set<core::int*>* setLiteral = #C25;
+static const field core::Map<core::int*, core::String*>* mapLiteral = #C26;
+static const field core::List<core::int*>* listConcatenation = #C23;
+static const field core::Set<core::int*>* setConcatenation = #C25;
+static const field core::Map<core::int*, core::String*>* mapConcatenation = #C26;
static method id<T extends core::Object* = dynamic>(con::id::T* t) → con::id::T*
return t;
constants {
- #C1 = TypeLiteralConstant(dart.core::Object)
+ #C1 = TypeLiteralConstant(core::Object)
#C2 = tearoff con::id
#C3 = partial-instantiation con::id <core::int>
#C4 = 0
#C5 = con::Class<core::int> {field:#C4}
#C6 = TypeLiteralConstant((dynamic) → dynamic)
- #C7 = TypeLiteralConstant(<T extends dart.core::Object? = dynamic>(T%) → T%)
+ #C7 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T%) → T%)
#C8 = <core::int>[#C4]
#C9 = null
#C10 = <dynamic>[#C4, #C9]
@@ -137,14 +115,15 @@
#C14 = <dynamic>[#C4, #C13]
#C15 = core::_ImmutableMap<core::int, core::String> {_kvPairs:#C14}
#C16 = false
- #C17 = TypeLiteralConstant(dart.core::Object*)
- #C18 = partial-instantiation con::id <core::int*>
- #C19 = con::Class<core::int*> {field:#C4}
- #C20 = TypeLiteralConstant((dynamic) →* dynamic)
- #C21 = TypeLiteralConstant(<T extends dart.core::Object* = dynamic>(T*) →* T*)
- #C22 = <core::int*>[#C4]
- #C23 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
- #C24 = col::_UnmodifiableSet<core::int*> {_map:#C23}
- #C25 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
- #C26 = tearoff core::identical
+ #C17 = <core::int?>[]
+ #C18 = TypeLiteralConstant(core::Object*)
+ #C19 = partial-instantiation con::id <core::int*>
+ #C20 = con::Class<core::int*> {field:#C4}
+ #C21 = TypeLiteralConstant((dynamic) →* dynamic)
+ #C22 = TypeLiteralConstant(<T extends core::Object* = dynamic>(T*) →* T*)
+ #C23 = <core::int*>[#C4]
+ #C24 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
+ #C25 = col::_UnmodifiableSet<core::int*> {_map:#C24}
+ #C26 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
+ #C27 = tearoff core::identical
}
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
index 12632c3..0293eeb 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
@@ -1,12 +1,4 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/constants.dart:45:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
-// Try accessing using ?. instead.
-// s.length; // This will be an invalid expression in strong mode.
-// ^^^^^^
-//
import self as self;
import "dart:core" as core;
import "constants_lib.dart" as con;
@@ -39,34 +31,20 @@
static const field core::bool mapConcatenationIdentical = #C16;
static final field core::bool inStrongMode = self::_inStrongMode();
static method _inStrongMode() → core::bool {
- (core::String?) → core::Null? f = (core::String? s) → core::Null? {
- let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/constants.dart:45:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
-Try accessing using ?. instead.
- s.length; // This will be an invalid expression in strong mode.
- ^^^^^^" in s.{core::String::length};
- };
- try {
- f.call("foo");
- }
- on dynamic catch(final dynamic e) {
- core::print("Running in strong mode.");
- return true;
- }
- core::print("Running in weak mode.");
- return false;
+ return !((#C17) is{ForNonNullableByDefault} core::List<core::int>);
}
static method main() → dynamic {
- self::test(#C1, #C17);
- self::test(#C3, #C18);
- self::test(#C5, #C19);
- self::test(#C6, #C20);
- self::test(#C7, #C21);
- self::test(#C8, #C22);
- self::test(#C12, #C24);
- self::test(#C15, #C25);
- self::test(#C8, #C22);
- self::test(#C12, #C24);
- self::test(#C15, #C25);
+ self::test(#C1, #C18);
+ self::test(#C3, #C19);
+ self::test(#C5, #C20);
+ self::test(#C6, #C21);
+ self::test(#C7, #C22);
+ self::test(#C8, #C23);
+ self::test(#C12, #C25);
+ self::test(#C15, #C26);
+ self::test(#C8, #C23);
+ self::test(#C12, #C25);
+ self::test(#C15, #C26);
self::test(true, #C16);
self::test(true, #C16);
self::test(true, #C16);
@@ -105,29 +83,29 @@
: con::Class::field = field, super core::Object::•()
;
}
-static const field core::Type* objectTypeLiteral = #C17;
-static const field (core::Object*, core::Object*) →* core::bool* c2 = #C26;
-static const field (core::int*) →* core::int* partialInstantiation = #C18;
-static const field con::Class<core::int*>* instance = #C19;
-static const field core::Type* functionTypeLiteral = #C20;
-static const field core::Type* genericFunctionTypeLiteral = #C21;
-static const field core::List<core::int*>* listLiteral = #C22;
-static const field core::Set<core::int*>* setLiteral = #C24;
-static const field core::Map<core::int*, core::String*>* mapLiteral = #C25;
-static const field core::List<core::int*>* listConcatenation = #C22;
-static const field core::Set<core::int*>* setConcatenation = #C24;
-static const field core::Map<core::int*, core::String*>* mapConcatenation = #C25;
+static const field core::Type* objectTypeLiteral = #C18;
+static const field (core::Object*, core::Object*) →* core::bool* c2 = #C27;
+static const field (core::int*) →* core::int* partialInstantiation = #C19;
+static const field con::Class<core::int*>* instance = #C20;
+static const field core::Type* functionTypeLiteral = #C21;
+static const field core::Type* genericFunctionTypeLiteral = #C22;
+static const field core::List<core::int*>* listLiteral = #C23;
+static const field core::Set<core::int*>* setLiteral = #C25;
+static const field core::Map<core::int*, core::String*>* mapLiteral = #C26;
+static const field core::List<core::int*>* listConcatenation = #C23;
+static const field core::Set<core::int*>* setConcatenation = #C25;
+static const field core::Map<core::int*, core::String*>* mapConcatenation = #C26;
static method id<T extends core::Object* = dynamic>(con::id::T* t) → con::id::T*
return t;
constants {
- #C1 = TypeLiteralConstant(dart.core::Object)
+ #C1 = TypeLiteralConstant(core::Object)
#C2 = tearoff con::id
#C3 = partial-instantiation con::id <core::int>
#C4 = 0
#C5 = con::Class<core::int> {field:#C4}
#C6 = TypeLiteralConstant((dynamic) → dynamic)
- #C7 = TypeLiteralConstant(<T extends dart.core::Object? = dynamic>(T%) → T%)
+ #C7 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T%) → T%)
#C8 = <core::int>[#C4]
#C9 = null
#C10 = <dynamic>[#C4, #C9]
@@ -137,14 +115,15 @@
#C14 = <dynamic>[#C4, #C13]
#C15 = core::_ImmutableMap<core::int, core::String> {_kvPairs:#C14}
#C16 = false
- #C17 = TypeLiteralConstant(dart.core::Object*)
- #C18 = partial-instantiation con::id <core::int*>
- #C19 = con::Class<core::int*> {field:#C4}
- #C20 = TypeLiteralConstant((dynamic) →* dynamic)
- #C21 = TypeLiteralConstant(<T extends dart.core::Object* = dynamic>(T*) →* T*)
- #C22 = <core::int*>[#C4]
- #C23 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
- #C24 = col::_UnmodifiableSet<core::int*> {_map:#C23}
- #C25 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
- #C26 = tearoff core::identical
+ #C17 = <core::int?>[]
+ #C18 = TypeLiteralConstant(core::Object*)
+ #C19 = partial-instantiation con::id <core::int*>
+ #C20 = con::Class<core::int*> {field:#C4}
+ #C21 = TypeLiteralConstant((dynamic) →* dynamic)
+ #C22 = TypeLiteralConstant(<T extends core::Object* = dynamic>(T*) →* T*)
+ #C23 = <core::int*>[#C4]
+ #C24 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
+ #C25 = col::_UnmodifiableSet<core::int*> {_map:#C24}
+ #C26 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
+ #C27 = tearoff core::identical
}
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
index 794e075..d4e1e3f7 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
@@ -1,12 +1,4 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/constants.dart:45:7: Warning: Property 'length' is accessed on 'String?' which is potentially null.
-// Try accessing using ?. instead.
-// s.length; // This will be an invalid expression in strong mode.
-// ^^^^^^
-//
import self as self;
import "dart:core" as core;
import "constants_lib.dart" as con;
@@ -39,18 +31,7 @@
static const field core::bool mapConcatenationIdentical = #C16;
static final field core::bool inStrongMode = self::_inStrongMode();
static method _inStrongMode() → core::bool {
- (core::String?) → core::Null? f = (core::String? s) → core::Null? {
- s.{core::String::length};
- };
- try {
- f.call("foo");
- }
- on dynamic catch(final dynamic e) {
- core::print("Running in strong mode.");
- return true;
- }
- core::print("Running in weak mode.");
- return false;
+ return !((#C17) is{ForNonNullableByDefault} core::List<core::int>);
}
static method main() → dynamic {
self::test(#C1, #C1);
@@ -103,7 +84,7 @@
;
}
static const field core::Type* objectTypeLiteral = #C1;
-static const field (core::Object*, core::Object*) →* core::bool* c2 = #C17;
+static const field (core::Object*, core::Object*) →* core::bool* c2 = #C18;
static const field (core::int*) →* core::int* partialInstantiation = #C3;
static const field con::Class<core::int*>* instance = #C5;
static const field core::Type* functionTypeLiteral = #C6;
@@ -118,13 +99,13 @@
return t;
constants {
- #C1 = TypeLiteralConstant(dart.core::Object*)
+ #C1 = TypeLiteralConstant(core::Object*)
#C2 = tearoff con::id
#C3 = partial-instantiation con::id <core::int*>
#C4 = 0
#C5 = con::Class<core::int*> {field:#C4}
#C6 = TypeLiteralConstant((dynamic) →* dynamic)
- #C7 = TypeLiteralConstant(<T extends dart.core::Object* = dynamic>(T*) →* T*)
+ #C7 = TypeLiteralConstant(<T extends core::Object* = dynamic>(T*) →* T*)
#C8 = <core::int*>[#C4]
#C9 = null
#C10 = <dynamic>[#C4, #C9]
@@ -134,5 +115,6 @@
#C14 = <dynamic>[#C4, #C13]
#C15 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
#C16 = true
- #C17 = tearoff core::identical
+ #C17 = <core::int*>[]
+ #C18 = tearoff core::identical
}
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
index 794e075..d4e1e3f7 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
@@ -1,12 +1,4 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/constants.dart:45:7: Warning: Property 'length' is accessed on 'String?' which is potentially null.
-// Try accessing using ?. instead.
-// s.length; // This will be an invalid expression in strong mode.
-// ^^^^^^
-//
import self as self;
import "dart:core" as core;
import "constants_lib.dart" as con;
@@ -39,18 +31,7 @@
static const field core::bool mapConcatenationIdentical = #C16;
static final field core::bool inStrongMode = self::_inStrongMode();
static method _inStrongMode() → core::bool {
- (core::String?) → core::Null? f = (core::String? s) → core::Null? {
- s.{core::String::length};
- };
- try {
- f.call("foo");
- }
- on dynamic catch(final dynamic e) {
- core::print("Running in strong mode.");
- return true;
- }
- core::print("Running in weak mode.");
- return false;
+ return !((#C17) is{ForNonNullableByDefault} core::List<core::int>);
}
static method main() → dynamic {
self::test(#C1, #C1);
@@ -103,7 +84,7 @@
;
}
static const field core::Type* objectTypeLiteral = #C1;
-static const field (core::Object*, core::Object*) →* core::bool* c2 = #C17;
+static const field (core::Object*, core::Object*) →* core::bool* c2 = #C18;
static const field (core::int*) →* core::int* partialInstantiation = #C3;
static const field con::Class<core::int*>* instance = #C5;
static const field core::Type* functionTypeLiteral = #C6;
@@ -118,13 +99,13 @@
return t;
constants {
- #C1 = TypeLiteralConstant(dart.core::Object*)
+ #C1 = TypeLiteralConstant(core::Object*)
#C2 = tearoff con::id
#C3 = partial-instantiation con::id <core::int*>
#C4 = 0
#C5 = con::Class<core::int*> {field:#C4}
#C6 = TypeLiteralConstant((dynamic) →* dynamic)
- #C7 = TypeLiteralConstant(<T extends dart.core::Object* = dynamic>(T*) →* T*)
+ #C7 = TypeLiteralConstant(<T extends core::Object* = dynamic>(T*) →* T*)
#C8 = <core::int*>[#C4]
#C9 = null
#C10 = <dynamic>[#C4, #C9]
@@ -134,5 +115,6 @@
#C14 = <dynamic>[#C4, #C13]
#C15 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
#C16 = true
- #C17 = tearoff core::identical
+ #C17 = <core::int*>[]
+ #C18 = tearoff core::identical
}
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart
index 2c8941e..2afbd86 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart
@@ -10,7 +10,7 @@
return x;
}
-int bar() {}
+int bar() => 0;
int baz(int x) {
return x;
@@ -28,7 +28,7 @@
return x;
}
- int bar() {}
+ int bar() => 0;
int baz(int x) {
return x;
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.expect b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.expect
index ee1a35e..4742f80 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.expect
@@ -20,11 +20,12 @@
;
method foo() → core::int {
core::int x;
- return (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
return x;
- ^" in x) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in x;
}
- method bar() → core::int {}
+ method bar() → core::int
+ return 0;
method baz(core::int x) → core::int {
return x;
}
@@ -33,11 +34,12 @@
}
static method foo() → core::int {
core::int x;
- return (let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
return x;
- ^" in x) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in x;
}
-static method bar() → core::int {}
+static method bar() → core::int
+ return 0;
static method baz(core::int x) → core::int {
return x;
}
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.transformed.expect
index ee1a35e..4742f80 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.transformed.expect
@@ -20,11 +20,12 @@
;
method foo() → core::int {
core::int x;
- return (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
return x;
- ^" in x) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in x;
}
- method bar() → core::int {}
+ method bar() → core::int
+ return 0;
method baz(core::int x) → core::int {
return x;
}
@@ -33,11 +34,12 @@
}
static method foo() → core::int {
core::int x;
- return (let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
return x;
- ^" in x) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in x;
}
-static method bar() → core::int {}
+static method bar() → core::int
+ return 0;
static method baz(core::int x) → core::int {
return x;
}
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.expect b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.expect
index 645ac55..4742f80 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.expect
@@ -2,11 +2,11 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Warning: Non-nullable variable 'x' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
// return x;
// ^
//
-// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Warning: Non-nullable variable 'x' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
// return x;
// ^
//
@@ -20,9 +20,12 @@
;
method foo() → core::int {
core::int x;
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
return x;
+ ^" in x;
}
- method bar() → core::int {}
+ method bar() → core::int
+ return 0;
method baz(core::int x) → core::int {
return x;
}
@@ -31,9 +34,12 @@
}
static method foo() → core::int {
core::int x;
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
return x;
+ ^" in x;
}
-static method bar() → core::int {}
+static method bar() → core::int
+ return 0;
static method baz(core::int x) → core::int {
return x;
}
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.transformed.expect
index 645ac55..4742f80 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.transformed.expect
@@ -2,11 +2,11 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Warning: Non-nullable variable 'x' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
// return x;
// ^
//
-// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Warning: Non-nullable variable 'x' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
// return x;
// ^
//
@@ -20,9 +20,12 @@
;
method foo() → core::int {
core::int x;
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
return x;
+ ^" in x;
}
- method bar() → core::int {}
+ method bar() → core::int
+ return 0;
method baz(core::int x) → core::int {
return x;
}
@@ -31,9 +34,12 @@
}
static method foo() → core::int {
core::int x;
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
return x;
+ ^" in x;
}
-static method bar() → core::int {}
+static method bar() → core::int
+ return 0;
static method baz(core::int x) → core::int {
return x;
}
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart b/pkg/front_end/testcases/nnbd/definitely_assigned.dart
new file mode 100644
index 0000000..12241c7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart
@@ -0,0 +1,91 @@
+// 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 'dart:async';
+
+methodDirect<T>(T value) {
+ late final T local2;
+ late final int local4;
+ late final FutureOr<int> local6;
+
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+
+ local2 = value; // error
+ local4 = 0; // error
+ local6 = 0; // error
+}
+
+var fieldDirect = <T>(T value) {
+ late final T local2;
+ late final int local4;
+ late final FutureOr<int> local6;
+
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+
+ local2 = value; // error
+ local4 = 0; // error
+ local6 = 0; // error
+};
+
+methodConditional<T>(bool b, T value) {
+ late final T local2;
+ late final int local4;
+ late final FutureOr<int> local6;
+
+ if (b) {
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+ }
+
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+
+ local2 = value; // error
+ local4 = 0; // error
+ local6 = 0; // error
+}
+
+var fieldConditional = <T>(bool b, T value) {
+ late final T local2;
+ late final int local4;
+ late final FutureOr<int> local6;
+
+ if (b) {
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+ }
+
+ local2 = value; // ok
+ local4 = 0; // ok
+ local6 = 0; // ok
+
+ local2 = value; // error
+ local4 = 0; // error
+ local6 = 0; // error
+};
+
+methodCompound() {
+ late final int local4;
+
+ local4 = 0; // ok
+
+ local4 += 0; // error
+}
+
+var fieldCompound = () {
+ late final int local4;
+
+ local4 = 0; // ok
+
+ local4 += 0; // error
+};
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
new file mode 100644
index 0000000..1a5e8e7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
+static field () → core::Null? fieldCompound;
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
+ ;
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
+ ;
+static method methodCompound() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
new file mode 100644
index 0000000..9751d45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ late final T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ late final T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ if(b) {
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ }
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ late final core::int local4;
+ local4 = 0;
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in local4 = local4.{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ late final self::methodDirect::T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ late final self::methodConditional::T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ if(b) {
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ }
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+}
+static method methodCompound() → dynamic {
+ late final core::int local4;
+ local4 = 0;
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in local4 = local4.{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
new file mode 100644
index 0000000..9751d45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ late final T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ late final T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ if(b) {
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ }
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ late final core::int local4;
+ local4 = 0;
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in local4 = local4.{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ late final self::methodDirect::T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ late final self::methodConditional::T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ if(b) {
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ }
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+}
+static method methodCompound() → dynamic {
+ late final core::int local4;
+ local4 = 0;
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in local4 = local4.{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
new file mode 100644
index 0000000..9751d45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ late final T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ late final T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ if(b) {
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ }
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ late final core::int local4;
+ local4 = 0;
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in local4 = local4.{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ late final self::methodDirect::T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ late final self::methodConditional::T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ if(b) {
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ }
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+}
+static method methodCompound() → dynamic {
+ late final core::int local4;
+ local4 = 0;
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in local4 = local4.{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
new file mode 100644
index 0000000..9751d45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// local2 = value; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// local6 = 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ late final T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ late final T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ if(b) {
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ }
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ late final core::int local4;
+ local4 = 0;
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in local4 = local4.{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ late final self::methodDirect::T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ late final self::methodConditional::T% local2;
+ late final core::int local4;
+ late final asy::FutureOr<core::int> local6;
+ if(b) {
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ }
+ local2 = value;
+ local4 = 0;
+ local6 = 0;
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+ local2 = value; // error
+ ^^^^^^" in local2 = value;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 = 0; // error
+ ^^^^^^" in local4 = 0;
+ let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+ local6 = 0; // error
+ ^^^^^^" in local6 = 0;
+}
+static method methodCompound() → dynamic {
+ late final core::int local4;
+ local4 = 0;
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+ local4 += 0; // error
+ ^^^^^^" in local4 = local4.{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart
new file mode 100644
index 0000000..5843b75
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart
@@ -0,0 +1,115 @@
+// 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 'dart:async';
+
+methodDirect<T>(T value) {
+ T local1;
+ late T local2;
+ int local3;
+ late int local4;
+ FutureOr<int> local5;
+ late FutureOr<int> local6;
+ late T local7 = value;
+
+ local1; // error
+ local2; // error
+ local3; // error
+ local4; // error
+ local5; // error
+ local6; // error
+ local7; // ok
+}
+
+var fieldDirect = <T>(T value) {
+ T local1;
+ late T local2;
+ int local3;
+ late int local4;
+ FutureOr<int> local5;
+ late FutureOr<int> local6;
+ late T local7 = value;
+
+ local1; // error
+ local2; // error
+ local3; // error
+ local4; // error
+ local5; // error
+ local6; // error
+ local7; // ok
+};
+
+methodConditional<T>(bool b, T value) {
+ T local1;
+ late T local2;
+ int local3;
+ late int local4;
+ FutureOr<int> local5;
+ late FutureOr<int> local6;
+ late T local7 = value;
+
+ if (b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7 = value;
+ }
+
+ local1; // error
+ local2; // ok
+ local3; // error
+ local4; // ok
+ local5; // error
+ local6; // ok
+ local7; // ok
+}
+
+var fieldConditional = <T>(bool b, T value) {
+ T local1;
+ late T local2;
+ int local3;
+ late int local4;
+ FutureOr<int> local5;
+ late FutureOr<int> local6;
+ late T local7 = value;
+
+ if (b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7; // ok
+ }
+
+ local1; // error
+ local2; // ok
+ local3; // error
+ local4; // ok
+ local5; // error
+ local6; // ok
+ local7; // ok
+};
+
+methodCompound() {
+ int local3;
+ late int local4;
+
+ local3 += 0; // error
+ local4 += 0; // error
+}
+
+var fieldCompound = () {
+ int local3;
+ late int local4;
+
+ local3 += 0; // error
+ local4 += 0; // error
+};
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
new file mode 100644
index 0000000..1a5e8e7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
+static field () → core::Null? fieldCompound;
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
+ ;
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
+ ;
+static method methodCompound() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect
new file mode 100644
index 0000000..ba765a9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect
@@ -0,0 +1,237 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ T% local1;
+ late T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ late T% local7 = value;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in local2;
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in local4;
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in local6;
+ local7;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ T% local1;
+ late T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ late T% local7 = value;
+ if(b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7;
+ }
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ local2;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ local4;
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ local6;
+ local7;
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ core::int local3;
+ late core::int local4;
+ local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ local4 = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in local4).{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ self::methodDirect::T% local1;
+ late self::methodDirect::T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ late self::methodDirect::T% local7 = value;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in local2;
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in local4;
+ let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in local6;
+ local7;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ self::methodConditional::T% local1;
+ late self::methodConditional::T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ late self::methodConditional::T% local7 = value;
+ if(b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7 = value;
+ }
+ let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ local2;
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ local4;
+ let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ local6;
+ local7;
+}
+static method methodCompound() → dynamic {
+ core::int local3;
+ late core::int local4;
+ local3 = (let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ local4 = (let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in local4).{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect
new file mode 100644
index 0000000..9f695f8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect
@@ -0,0 +1,245 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ T% local1;
+ late T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ function #local7#initializer() → T%
+ return value;
+ late T% local7 = #local7#initializer.call();
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in local2;
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in local4;
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in local6;
+ local7;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ T% local1;
+ late T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ function #local7#initializer() → T%
+ return value;
+ late T% local7 = #local7#initializer.call();
+ if(b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7;
+ }
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ local2;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ local4;
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ local6;
+ local7;
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ core::int local3;
+ late core::int local4;
+ local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ local4 = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in local4).{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ self::methodDirect::T% local1;
+ late self::methodDirect::T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ function #local7#initializer() → self::methodDirect::T%
+ return value;
+ late self::methodDirect::T% local7 = #local7#initializer.call();
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in local2;
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in local4;
+ let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in local6;
+ local7;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ self::methodConditional::T% local1;
+ late self::methodConditional::T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ function #local7#initializer() → self::methodConditional::T%
+ return value;
+ late self::methodConditional::T% local7 = #local7#initializer.call();
+ if(b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7 = value;
+ }
+ let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ local2;
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ local4;
+ let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ local6;
+ local7;
+}
+static method methodCompound() → dynamic {
+ core::int local3;
+ late core::int local4;
+ local3 = (let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ local4 = (let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in local4).{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
new file mode 100644
index 0000000..ba765a9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
@@ -0,0 +1,237 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ T% local1;
+ late T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ late T% local7 = value;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in local2;
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in local4;
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in local6;
+ local7;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ T% local1;
+ late T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ late T% local7 = value;
+ if(b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7;
+ }
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ local2;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ local4;
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ local6;
+ local7;
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ core::int local3;
+ late core::int local4;
+ local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ local4 = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in local4).{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ self::methodDirect::T% local1;
+ late self::methodDirect::T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ late self::methodDirect::T% local7 = value;
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in local2;
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in local4;
+ let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in local6;
+ local7;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ self::methodConditional::T% local1;
+ late self::methodConditional::T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ late self::methodConditional::T% local7 = value;
+ if(b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7 = value;
+ }
+ let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ local2;
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ local4;
+ let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ local6;
+ local7;
+}
+static method methodCompound() → dynamic {
+ core::int local3;
+ late core::int local4;
+ local3 = (let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ local4 = (let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in local4).{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect
new file mode 100644
index 0000000..9f695f8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect
@@ -0,0 +1,245 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+// local2; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+// local6; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+// local1; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+// local5; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+// local3 += 0; // error
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+// local4 += 0; // error
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+ T% local1;
+ late T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ function #local7#initializer() → T%
+ return value;
+ late T% local7 = #local7#initializer.call();
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in local2;
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in local4;
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in local6;
+ local7;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+ T% local1;
+ late T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ function #local7#initializer() → T%
+ return value;
+ late T% local7 = #local7#initializer.call();
+ if(b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7;
+ }
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ local2;
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ local4;
+ let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ local6;
+ local7;
+};
+static field () → core::Null? fieldCompound = () → core::Null? {
+ core::int local3;
+ late core::int local4;
+ local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ local4 = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in local4).{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+ self::methodDirect::T% local1;
+ late self::methodDirect::T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ function #local7#initializer() → self::methodDirect::T%
+ return value;
+ late self::methodDirect::T% local7 = #local7#initializer.call();
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+ local2; // error
+ ^^^^^^" in local2;
+ let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4; // error
+ ^^^^^^" in local4;
+ let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+ local6; // error
+ ^^^^^^" in local6;
+ local7;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+ self::methodConditional::T% local1;
+ late self::methodConditional::T% local2;
+ core::int local3;
+ late core::int local4;
+ asy::FutureOr<core::int> local5;
+ late asy::FutureOr<core::int> local6;
+ function #local7#initializer() → self::methodConditional::T%
+ return value;
+ late self::methodConditional::T% local7 = #local7#initializer.call();
+ if(b) {
+ local1 = value;
+ local2 = value;
+ local3 = 0;
+ local4 = 0;
+ local5 = 0;
+ local6 = 0;
+ local7 = value;
+ }
+ let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+ local1; // error
+ ^^^^^^" in local1;
+ local2;
+ let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3; // error
+ ^^^^^^" in local3;
+ local4;
+ let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+ local5; // error
+ ^^^^^^" in local5;
+ local6;
+ local7;
+}
+static method methodCompound() → dynamic {
+ core::int local3;
+ late core::int local4;
+ local3 = (let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+ local3 += 0; // error
+ ^^^^^^" in local3).{core::num::+}(0);
+ local4 = (let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+ local4 += 0; // error
+ ^^^^^^" in local4).{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.expect
index 1696100..3b6af6d 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.expect
@@ -1,4 +1,15 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+// bar(value); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+// barInt(intValue); // Error.
+// ^^^^^^^^
+//
import self as self;
import "dart:core" as core;
@@ -11,8 +22,12 @@
method foo() → dynamic {
late self::A::T% value;
late core::int intValue;
- this.{self::A::bar}(value);
- this.{self::A::barInt}(intValue);
+ this.{self::A::bar}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+ bar(value); // Error.
+ ^^^^^" in value);
+ this.{self::A::barInt}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+ barInt(intValue); // Error.
+ ^^^^^^^^" in intValue);
}
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.transformed.expect
index 1696100..3b6af6d 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.transformed.expect
@@ -1,4 +1,15 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+// bar(value); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+// barInt(intValue); // Error.
+// ^^^^^^^^
+//
import self as self;
import "dart:core" as core;
@@ -11,8 +22,12 @@
method foo() → dynamic {
late self::A::T% value;
late core::int intValue;
- this.{self::A::bar}(value);
- this.{self::A::barInt}(intValue);
+ this.{self::A::bar}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+ bar(value); // Error.
+ ^^^^^" in value);
+ this.{self::A::barInt}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+ barInt(intValue); // Error.
+ ^^^^^^^^" in intValue);
}
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.expect
index 1696100..3b6af6d 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.expect
@@ -1,4 +1,15 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+// bar(value); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+// barInt(intValue); // Error.
+// ^^^^^^^^
+//
import self as self;
import "dart:core" as core;
@@ -11,8 +22,12 @@
method foo() → dynamic {
late self::A::T% value;
late core::int intValue;
- this.{self::A::bar}(value);
- this.{self::A::barInt}(intValue);
+ this.{self::A::bar}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+ bar(value); // Error.
+ ^^^^^" in value);
+ this.{self::A::barInt}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+ barInt(intValue); // Error.
+ ^^^^^^^^" in intValue);
}
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.transformed.expect
index 1696100..3b6af6d 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.transformed.expect
@@ -1,4 +1,15 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+// bar(value); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+// barInt(intValue); // Error.
+// ^^^^^^^^
+//
import self as self;
import "dart:core" as core;
@@ -11,8 +22,12 @@
method foo() → dynamic {
late self::A::T% value;
late core::int intValue;
- this.{self::A::bar}(value);
- this.{self::A::barInt}(intValue);
+ this.{self::A::bar}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+ bar(value); // Error.
+ ^^^^^" in value);
+ this.{self::A::barInt}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+ barInt(intValue); // Error.
+ ^^^^^^^^" in intValue);
}
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.expect b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.expect
index 7dd2f83..5fac846 100644
--- a/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.expect
@@ -2,59 +2,59 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:12:7: Warning: Mixing in 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:12:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
// class Coo extends Boo with Aoo? {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:14:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:14:7: Error: Can't extend 'Aoo' because it's marked with '?'.
// class Doo extends Aoo? {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:16:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:16:7: Error: Can't implement 'Boo' because it's marked with '?'.
// class Eoo implements Boo? {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:18:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:18:7: Error: Can't extend 'Boo' because it's marked with '?'.
// class Foo extends Boo? with Aoo {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't extend 'Boo' because it's marked with '?'.
// class Goo = Boo? with Aoo?;
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Warning: Mixing in 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
// class Goo = Boo? with Aoo?;
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:22:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:22:7: Error: Can't implement 'Boo' because it's marked with '?'.
// class Hoo extends Object with Aoo implements Boo? {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:24:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:24:7: Error: Can't implement 'Boo' because it's marked with '?'.
// class Ioo = Object with Aoo implements Boo?;
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't extend 'Aoo' because it's marked with '?'.
// mixin Moo1 on Aoo? implements Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't implement 'Boo' because it's marked with '?'.
// mixin Moo1 on Aoo? implements Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Aoo' because it's marked with '?'.
// mixin Moo2 on Aoo?, Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Boo' because it's marked with '?'.
// mixin Moo2 on Aoo?, Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Warning: Implementing 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Aoo' because it's marked with '?'.
// mixin Moo3 implements Aoo?, Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Boo' because it's marked with '?'.
// mixin Moo3 implements Aoo?, Boo? {}
// ^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.transformed.expect
index 2222d06..a6f6d2a 100644
--- a/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.transformed.expect
@@ -2,59 +2,59 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:12:7: Warning: Mixing in 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:12:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
// class Coo extends Boo with Aoo? {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:14:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:14:7: Error: Can't extend 'Aoo' because it's marked with '?'.
// class Doo extends Aoo? {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:16:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:16:7: Error: Can't implement 'Boo' because it's marked with '?'.
// class Eoo implements Boo? {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:18:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:18:7: Error: Can't extend 'Boo' because it's marked with '?'.
// class Foo extends Boo? with Aoo {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't extend 'Boo' because it's marked with '?'.
// class Goo = Boo? with Aoo?;
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Warning: Mixing in 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
// class Goo = Boo? with Aoo?;
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:22:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:22:7: Error: Can't implement 'Boo' because it's marked with '?'.
// class Hoo extends Object with Aoo implements Boo? {}
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:24:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:24:7: Error: Can't implement 'Boo' because it's marked with '?'.
// class Ioo = Object with Aoo implements Boo?;
// ^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't extend 'Aoo' because it's marked with '?'.
// mixin Moo1 on Aoo? implements Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't implement 'Boo' because it's marked with '?'.
// mixin Moo1 on Aoo? implements Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Aoo' because it's marked with '?'.
// mixin Moo2 on Aoo?, Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Boo' because it's marked with '?'.
// mixin Moo2 on Aoo?, Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Warning: Implementing 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Aoo' because it's marked with '?'.
// mixin Moo3 implements Aoo?, Boo? {}
// ^^^^
//
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Boo' because it's marked with '?'.
// mixin Moo3 implements Aoo?, Boo? {}
// ^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
index 36438f5..d6e6324 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
@@ -2,47 +2,47 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Warning: Assigning value of type 'Iterable<int>?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Iterable' is from 'dart:core'.
// for (int x in i2) x;
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Warning: Assigning value of type 'Iterable<int>?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Iterable' is from 'dart:core'.
// [for (int x in i2) x];
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Warning: Assigning value of type 'List<int>?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'List' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// for (int x in l2) x;
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Warning: Assigning value of type 'List<int>?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'List' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// [for (int x in l2) x];
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:15:17: Warning: Assigning value of type 'Object' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Object' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// for (int x in o1) x;
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:16:18: Warning: Assigning value of type 'Object' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Object' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// [for (int x in o1) x];
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:18:17: Warning: Assigning value of type 'Object?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Object' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// for (int x in o2) x;
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:19:18: Warning: Assigning value of type 'Object?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Object' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// [for (int x in o2) x];
@@ -52,68 +52,98 @@
import "dart:core" as core;
static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
- for (core::int x in i2)
- x;
- block {
- final core::List<core::int> #t1 = <core::int>[];
- for (core::int x in i2)
- #t1.{core::List::add}(x);
- } =>#t1;
- for (core::int x in l2)
+ for (core::int x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+ for (int x in i2) x;
+ ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
x;
block {
final core::List<core::int> #t2 = <core::int>[];
- for (core::int x in l2)
+ for (core::int x in let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+ [for (int x in i2) x];
+ ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
#t2.{core::List::add}(x);
} =>#t2;
- for (final dynamic #t3 in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
- core::int x = #t3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ for (core::int x in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'List' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ for (int x in l2) x;
+ ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
+ x;
+ block {
+ final core::List<core::int> #t5 = <core::int>[];
+ for (core::int x in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'List' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ [for (int x in l2) x];
+ ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
+ #t5.{core::List::add}(x);
+ } =>#t5;
+ for (final dynamic #t7 in let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ for (int x in o1) x;
+ ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+ core::int x = #t7 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
x;
}
block {
- final core::List<core::int> #t4 = <core::int>[];
- for (final dynamic #t5 in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
- core::int x = #t5 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
- #t4.{core::List::add}(x);
+ final core::List<core::int> #t9 = <core::int>[];
+ for (final dynamic #t10 in let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ [for (int x in o1) x];
+ ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+ core::int x = #t10 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ #t9.{core::List::add}(x);
}
- } =>#t4;
- for (final dynamic #t6 in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
- core::int x = #t6 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ } =>#t9;
+ for (final dynamic #t12 in let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ for (int x in o2) x;
+ ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+ core::int x = #t12 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
x;
}
block {
- final core::List<core::int> #t7 = <core::int>[];
- for (final dynamic #t8 in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
- core::int x = #t8 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
- #t7.{core::List::add}(x);
+ final core::List<core::int> #t14 = <core::int>[];
+ for (final dynamic #t15 in let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ [for (int x in o2) x];
+ ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+ core::int x = #t15 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ #t14.{core::List::add}(x);
}
- } =>#t7;
+ } =>#t14;
}
static method ok(core::Iterable<core::int> i1, core::List<core::int> l1, dynamic d) → dynamic {
for (core::int x in i1)
x;
block {
- final core::List<core::int> #t9 = <core::int>[];
+ final core::List<core::int> #t17 = <core::int>[];
for (core::int x in i1)
- #t9.{core::List::add}(x);
- } =>#t9;
+ #t17.{core::List::add}(x);
+ } =>#t17;
for (core::int x in l1)
x;
block {
- final core::List<core::int> #t10 = <core::int>[];
+ final core::List<core::int> #t18 = <core::int>[];
for (core::int x in l1)
- #t10.{core::List::add}(x);
- } =>#t10;
- for (final dynamic #t11 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
- core::int x = #t11 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ #t18.{core::List::add}(x);
+ } =>#t18;
+ for (final dynamic #t19 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+ core::int x = #t19 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
x;
}
block {
- final core::List<core::int> #t12 = <core::int>[];
- for (final dynamic #t13 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
- core::int x = #t13 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
- #t12.{core::List::add}(x);
+ final core::List<core::int> #t20 = <core::int>[];
+ for (final dynamic #t21 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+ core::int x = #t21 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ #t20.{core::List::add}(x);
}
- } =>#t12;
+ } =>#t20;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
index d263365..b65a75c 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
@@ -2,47 +2,47 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Warning: Assigning value of type 'Iterable<int>?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Iterable' is from 'dart:core'.
// for (int x in i2) x;
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Warning: Assigning value of type 'Iterable<int>?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Iterable' is from 'dart:core'.
// [for (int x in i2) x];
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Warning: Assigning value of type 'List<int>?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'List' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// for (int x in l2) x;
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Warning: Assigning value of type 'List<int>?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'List' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// [for (int x in l2) x];
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:15:17: Warning: Assigning value of type 'Object' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Object' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// for (int x in o1) x;
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:16:18: Warning: Assigning value of type 'Object' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Object' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// [for (int x in o1) x];
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:18:17: Warning: Assigning value of type 'Object?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Object' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// for (int x in o2) x;
// ^
//
-// pkg/front_end/testcases/nnbd/forin.dart:19:18: Warning: Assigning value of type 'Object?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
// - 'Object' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
// [for (int x in o2) x];
@@ -54,24 +54,10 @@
static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
{
- core::Iterator<core::int>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int>*>(i2).{core::Iterable::iterator};
- for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
- core::int x = :sync-for-iterator.{core::Iterator::current};
- x;
- }
- }
- block {
- final core::List<core::int> #t1 = <core::int>[];
- {
- core::Iterator<core::int>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int>*>(i2).{core::Iterable::iterator};
- for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
- core::int x = :sync-for-iterator.{core::Iterator::current};
- #t1.{core::List::add}(x);
- }
- }
- } =>#t1;
- {
- core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(l2).{core::Iterable::iterator};
+ core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+ for (int x in i2) x;
+ ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
core::int x = :sync-for-iterator.{core::Iterator::current};
x;
@@ -80,7 +66,10 @@
block {
final core::List<core::int> #t2 = <core::int>[];
{
- core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(l2).{core::Iterable::iterator};
+ core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+ [for (int x in i2) x];
+ ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
core::int x = :sync-for-iterator.{core::Iterator::current};
#t2.{core::List::add}(x);
@@ -88,51 +77,92 @@
}
} =>#t2;
{
- core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+ core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'List' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ for (int x in l2) x;
+ ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
- final dynamic #t3 = :sync-for-iterator.{core::Iterator::current};
- {
- core::int x = #t3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
- x;
- }
+ core::int x = :sync-for-iterator.{core::Iterator::current};
+ x;
}
}
block {
- final core::List<core::int> #t4 = <core::int>[];
+ final core::List<core::int> #t5 = <core::int>[];
{
- core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+ core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'List' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ [for (int x in l2) x];
+ ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
- final dynamic #t5 = :sync-for-iterator.{core::Iterator::current};
- {
- core::int x = #t5 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
- #t4.{core::List::add}(x);
- }
+ core::int x = :sync-for-iterator.{core::Iterator::current};
+ #t5.{core::List::add}(x);
}
}
- } =>#t4;
+ } =>#t5;
{
- core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+ core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ for (int x in o1) x;
+ ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
- final dynamic #t6 = :sync-for-iterator.{core::Iterator::current};
+ final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
{
- core::int x = #t6 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ core::int x = #t8 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
x;
}
}
}
block {
- final core::List<core::int> #t7 = <core::int>[];
+ final core::List<core::int> #t9 = <core::int>[];
{
- core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+ core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ [for (int x in o1) x];
+ ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
- final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
+ final dynamic #t11 = :sync-for-iterator.{core::Iterator::current};
{
- core::int x = #t8 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
- #t7.{core::List::add}(x);
+ core::int x = #t11 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ #t9.{core::List::add}(x);
}
}
}
- } =>#t7;
+ } =>#t9;
+ {
+ core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ for (int x in o2) x;
+ ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final dynamic #t13 = :sync-for-iterator.{core::Iterator::current};
+ {
+ core::int x = #t13 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ x;
+ }
+ }
+ }
+ block {
+ final core::List<core::int> #t14 = <core::int>[];
+ {
+ core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+ [for (int x in o2) x];
+ ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final dynamic #t16 = :sync-for-iterator.{core::Iterator::current};
+ {
+ core::int x = #t16 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ #t14.{core::List::add}(x);
+ }
+ }
+ }
+ } =>#t14;
}
static method ok(core::Iterable<core::int> i1, core::List<core::int> l1, dynamic d) → dynamic {
{
@@ -143,15 +173,15 @@
}
}
block {
- final core::List<core::int> #t9 = <core::int>[];
+ final core::List<core::int> #t17 = <core::int>[];
{
core::Iterator<core::int>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int>*>(i1).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
core::int x = :sync-for-iterator.{core::Iterator::current};
- #t9.{core::List::add}(x);
+ #t17.{core::List::add}(x);
}
}
- } =>#t9;
+ } =>#t17;
{
core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(l1).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -160,37 +190,37 @@
}
}
block {
- final core::List<core::int> #t10 = <core::int>[];
+ final core::List<core::int> #t18 = <core::int>[];
{
core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(l1).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
core::int x = :sync-for-iterator.{core::Iterator::current};
- #t10.{core::List::add}(x);
+ #t18.{core::List::add}(x);
}
}
- } =>#t10;
+ } =>#t18;
{
core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
- final dynamic #t11 = :sync-for-iterator.{core::Iterator::current};
+ final dynamic #t19 = :sync-for-iterator.{core::Iterator::current};
{
- core::int x = #t11 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ core::int x = #t19 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
x;
}
}
}
block {
- final core::List<core::int> #t12 = <core::int>[];
+ final core::List<core::int> #t20 = <core::int>[];
{
core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
- final dynamic #t13 = :sync-for-iterator.{core::Iterator::current};
+ final dynamic #t21 = :sync-for-iterator.{core::Iterator::current};
{
- core::int x = #t13 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
- #t12.{core::List::add}(x);
+ core::int x = #t21 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ #t20.{core::List::add}(x);
}
}
}
- } =>#t12;
+ } =>#t20;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.expect
index 1e36767..2ab45fe 100644
--- a/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.expect
@@ -47,12 +47,12 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:11:9: Warning: Field 'field5' isn't initialized and its type 'C<int?>' doesn't allow null.
+// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:11:9: Error: Field 'field5' should be initialized because its type 'C<int?>' doesn't allow null.
// - 'C' is from 'pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart'.
// C<int?> field5;
// ^^^^^^
//
-// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:13:5: Warning: Field 'field7' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:13:5: Error: Field 'field7' should be initialized because its type 'int' doesn't allow null.
// int field7;
// ^^^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.transformed.expect
index 81342ac..755f2c9 100644
--- a/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.transformed.expect
@@ -47,12 +47,12 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:11:9: Warning: Field 'field5' isn't initialized and its type 'C<int?>' doesn't allow null.
+// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:11:9: Error: Field 'field5' should be initialized because its type 'C<int?>' doesn't allow null.
// - 'C' is from 'pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart'.
// C<int?> field5;
// ^^^^^^
//
-// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:13:5: Warning: Field 'field7' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:13:5: Error: Field 'field7' should be initialized because its type 'int' doesn't allow null.
// int field7;
// ^^^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart
new file mode 100644
index 0000000..99b6bc0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart
@@ -0,0 +1,10 @@
+// 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.
+
+T f<T>(T t) => t;
+
+main() {
+ late int local;
+ local = f(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.outline.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.outline.expect
new file mode 100644
index 0000000..b6346e7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.outline.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.expect
new file mode 100644
index 0000000..954dd07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ return t;
+static method main() → dynamic {
+ late core::int local;
+ local = self::f<core::int>(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.transformed.expect
new file mode 100644
index 0000000..954dd07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.transformed.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ return t;
+static method main() → dynamic {
+ late core::int local;
+ local = self::f<core::int>(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.expect
new file mode 100644
index 0000000..954dd07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ return t;
+static method main() → dynamic {
+ late core::int local;
+ local = self::f<core::int>(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.transformed.expect
new file mode 100644
index 0000000..954dd07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.transformed.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+ return t;
+static method main() → dynamic {
+ late core::int local;
+ local = self::f<core::int>(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/issue39659.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.expect
index 0579729..910ce4f 100644
--- a/pkg/front_end/testcases/nnbd/issue39659.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.expect
@@ -2,7 +2,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Warning: Throwing a value of 'String?' that is neither dynamic nor non-nullable.
+// pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
// throw bar();
// ^
//
@@ -10,7 +10,9 @@
import "dart:core" as core;
static method foo() → dynamic {
- throw self::bar();
+ invalid-expression "pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
+ throw bar();
+ ^";
}
static method bar() → core::String?
return "asdf";
diff --git a/pkg/front_end/testcases/nnbd/issue39659.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.transformed.expect
index 0579729..910ce4f 100644
--- a/pkg/front_end/testcases/nnbd/issue39659.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Warning: Throwing a value of 'String?' that is neither dynamic nor non-nullable.
+// pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
// throw bar();
// ^
//
@@ -10,7 +10,9 @@
import "dart:core" as core;
static method foo() → dynamic {
- throw self::bar();
+ invalid-expression "pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
+ throw bar();
+ ^";
}
static method bar() → core::String?
return "asdf";
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart b/pkg/front_end/testcases/nnbd/issue40600.dart
index 270b693..41bdab6 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart
@@ -20,11 +20,11 @@
}
class C<T> {
- FutureOr<T> baz<X extends FutureOr<T>>(FutureOr<T> x) {}
+ FutureOr<T> baz<X extends FutureOr<T>>(FutureOr<T> x) => x;
}
class D<T> extends C<T> {
- FutureOr<T> baz<X extends FutureOr<T>>(FutureOr<T> x) {}
+ FutureOr<T> baz<X extends FutureOr<T>>(FutureOr<T> x) => x;
}
main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect
index fc667aa..df7df7b 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect
@@ -26,13 +26,15 @@
synthetic constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
- method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%> {}
+ method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%>
+ return x;
}
class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
synthetic constructor •() → self::D<self::D::T%>
: super self::C::•()
;
- method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%> {}
+ method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%>
+ return x;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect
index fc667aa..df7df7b 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect
@@ -26,13 +26,15 @@
synthetic constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
- method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%> {}
+ method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%>
+ return x;
}
class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
synthetic constructor •() → self::D<self::D::T%>
: super self::C::•()
;
- method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%> {}
+ method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%>
+ return x;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect
index fc667aa..df7df7b 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect
@@ -26,13 +26,15 @@
synthetic constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
- method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%> {}
+ method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%>
+ return x;
}
class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
synthetic constructor •() → self::D<self::D::T%>
: super self::C::•()
;
- method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%> {}
+ method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%>
+ return x;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect
index fc667aa..df7df7b 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect
@@ -26,13 +26,15 @@
synthetic constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
- method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%> {}
+ method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%>
+ return x;
}
class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
synthetic constructor •() → self::D<self::D::T%>
: super self::C::•()
;
- method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%> {}
+ method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%>
+ return x;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart b/pkg/front_end/testcases/nnbd/issue40601.dart
new file mode 100644
index 0000000..56ae989
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart
@@ -0,0 +1,18 @@
+// 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.
+
+abstract class A<T> {
+ T baz();
+ bar(T value) {}
+ foo() {
+ late T value;
+ var result = () => bar(value);
+ (() {
+ value = baz();
+ })();
+ return result;
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.outline.expect
new file mode 100644
index 0000000..f2c5efd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.outline.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic
+ ;
+ method foo() → dynamic
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
new file mode 100644
index 0000000..3d1b60c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ : super core::Object::•()
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+ method foo() → dynamic {
+ late self::A::T% value;
+ () → dynamic result = () → dynamic => this.{self::A::bar}(value);
+ (() → core::Null? {
+ value = this.{self::A::baz}();
+ }).call();
+ return result;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
new file mode 100644
index 0000000..3d1b60c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ : super core::Object::•()
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+ method foo() → dynamic {
+ late self::A::T% value;
+ () → dynamic result = () → dynamic => this.{self::A::bar}(value);
+ (() → core::Null? {
+ value = this.{self::A::baz}();
+ }).call();
+ return result;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
new file mode 100644
index 0000000..3d1b60c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ : super core::Object::•()
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+ method foo() → dynamic {
+ late self::A::T% value;
+ () → dynamic result = () → dynamic => this.{self::A::bar}(value);
+ (() → core::Null? {
+ value = this.{self::A::baz}();
+ }).call();
+ return result;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
new file mode 100644
index 0000000..3d1b60c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T%>
+ : super core::Object::•()
+ ;
+ abstract method baz() → self::A::T%;
+ method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+ method foo() → dynamic {
+ late self::A::T% value;
+ () → dynamic result = () → dynamic => this.{self::A::bar}(value);
+ (() → core::Null? {
+ value = this.{self::A::baz}();
+ }).call();
+ return result;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart b/pkg/front_end/testcases/nnbd/issue41102.dart
new file mode 100644
index 0000000..f10ab27
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart
@@ -0,0 +1,49 @@
+// 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 'dart:async';
+
+void main() {}
+
+final t = StreamTransformer.fromHandlers(
+ handleData: (data, sink) => Future.microtask(() => sink.add(data)),
+ handleDone: (sink) => Future.microtask(() => sink.close()));
+
+final s1 = [];
+
+final s2 = s1?.length;
+
+final s3 = new List<int>(2);
+
+final s4 = () {
+ var e = 0;
+ switch (e) {
+ case 0:
+ print('fallthrough');
+ case 1:
+ case '':
+ }
+}();
+
+int? s5;
+
+final s6 = s5 + 0;
+
+List? s7;
+
+final s8 = s7[0];
+
+final s9 = s7[0] = 0;
+
+final s10 = s7.length;
+
+final s11 = s5.length = 0;
+
+final s12 = -s5;
+
+int Function()? s13;
+
+final s14 = (s13)();
+
+final s15 = throw null;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
new file mode 100644
index 0000000..ea7aadc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t;
+static final field core::List<dynamic> s1;
+static final field core::int? s2;
+static final field core::List<core::int> s3;
+static final field dynamic s4;
+static field core::int? s5;
+static final field core::int? s6;
+static field core::List<dynamic>? s7;
+static final field dynamic s8;
+static final field core::int s9;
+static final field core::int s10;
+static final field core::int s11;
+static final field core::int s12;
+static field () →? core::int s13;
+static final field core::int s14;
+static final field Never s15;
+static method main() → void
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
new file mode 100644
index 0000000..7157bfd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:15:12: Warning: Operand of null-aware operation '?.' has type 'List<dynamic>' which excludes null.
+// - 'List' is from 'dart:core'.
+// final s2 = s1?.length;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
+// Try using List.filled instead.
+// final s3 = new List<int>(2);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:22:5: Error: Switch case may fall through to the next case.
+// case 0:
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:25:10: Error: Type 'String' of the case expression is not a subtype of type 'int' of this switch expression.
+// case '':
+// ^
+// pkg/front_end/testcases/nnbd/issue41102.dart:21:11: Context: The switch expression is here.
+// switch (e) {
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// final s6 = s5 + 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// final s8 = s7[0];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// final s9 = s7[0] = 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s10 = s7.length;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+// final s11 = s5.length = 0;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+// Try accessing using ?. instead.
+// final s11 = s5.length = 0;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// final s12 = -s5;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// final s14 = (s13)();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+// final s15 = throw null;
+// ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field core::List<dynamic> s1 = <dynamic>[];
+static final field core::int? s2 = let final core::List<dynamic> #t1 = self::s1 in #t1.{core::List::==}(null) ?{core::int?} null : #t1.{core::List::length};
+static final field core::List<core::int> s3 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
+Try using List.filled instead.
+final s3 = new List<int>(2);
+ ^" in core::List::•<core::int>(2);
+static final field dynamic s4 = (() → core::Null? {
+ core::int e = 0;
+ switch(e) {
+ #L1:
+ case #C1:
+ {
+ core::print("fallthrough");
+ }
+ #L2:
+ case #C2:
+ case #C3:
+ {}
+ }
+}).call();
+static field core::int? s5;
+static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+final s6 = s5 + 0;
+ ^" in self::s5.{core::num::+}(0);
+static field core::List<dynamic>? s7;
+static final field dynamic s8 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s8 = s7[0];
+ ^" in self::s7.{core::List::[]}(0);
+static final field core::int s9 = let final core::List<dynamic>? #t5 = self::s7 in let final core::int #t6 = 0 in let final core::int #t7 = 0 in let final void #t8 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s9 = s7[0] = 0;
+ ^" in #t5.{core::List::[]=}(#t6, #t7) in #t7;
+static final field core::int s10 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s10 = s7.length;
+ ^^^^^^" in self::s7.{core::List::length};
+static final field core::int s11 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+final s11 = s5.length = 0;
+ ^^^^^^" in invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+final s11 = s5.length = 0;
+ ^^^^^^";
+static final field core::int s12 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+final s12 = -s5;
+ ^" in self::s5.{core::int::unary-}();
+static field () →? core::int s13;
+static final field core::int s14 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+final s14 = (s13)();
+ ^" in self::s13.call();
+static final field Never s15 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+final s15 = throw null;
+ ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never;
+static method main() → void {}
+
+constants {
+ #C1 = 0
+ #C2 = 1
+ #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
new file mode 100644
index 0000000..d888b44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:15:12: Warning: Operand of null-aware operation '?.' has type 'List<dynamic>' which excludes null.
+// - 'List' is from 'dart:core'.
+// final s2 = s1?.length;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
+// Try using List.filled instead.
+// final s3 = new List<int>(2);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:22:5: Error: Switch case may fall through to the next case.
+// case 0:
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:25:10: Error: Type 'String' of the case expression is not a subtype of type 'int' of this switch expression.
+// case '':
+// ^
+// pkg/front_end/testcases/nnbd/issue41102.dart:21:11: Context: The switch expression is here.
+// switch (e) {
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// final s6 = s5 + 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// final s8 = s7[0];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// final s9 = s7[0] = 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s10 = s7.length;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+// final s11 = s5.length = 0;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+// Try accessing using ?. instead.
+// final s11 = s5.length = 0;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// final s12 = -s5;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// final s14 = (s13)();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+// final s15 = throw null;
+// ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field core::List<dynamic> s1 = <dynamic>[];
+static final field core::int? s2 = let final core::List<dynamic> #t1 = self::s1 in #t1.{core::List::==}(null) ?{core::int?} null : #t1.{core::List::length};
+static final field core::List<core::int> s3 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
+Try using List.filled instead.
+final s3 = new List<int>(2);
+ ^" in core::_List::•<core::int>(2);
+static final field dynamic s4 = (() → core::Null? {
+ core::int e = 0;
+ switch(e) {
+ #L1:
+ case #C1:
+ {
+ core::print("fallthrough");
+ }
+ #L2:
+ case #C2:
+ case #C3:
+ {}
+ }
+}).call();
+static field core::int? s5;
+static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+final s6 = s5 + 0;
+ ^" in self::s5.{core::num::+}(0);
+static field core::List<dynamic>? s7;
+static final field dynamic s8 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s8 = s7[0];
+ ^" in self::s7.{core::List::[]}(0);
+static final field core::int s9 = let final core::List<dynamic>? #t5 = self::s7 in let final core::int #t6 = 0 in let final core::int #t7 = 0 in let final void #t8 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s9 = s7[0] = 0;
+ ^" in #t5.{core::List::[]=}(#t6, #t7) in #t7;
+static final field core::int s10 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s10 = s7.length;
+ ^^^^^^" in self::s7.{core::List::length};
+static final field core::int s11 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+final s11 = s5.length = 0;
+ ^^^^^^" in invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+final s11 = s5.length = 0;
+ ^^^^^^";
+static final field core::int s12 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+final s12 = -s5;
+ ^" in self::s5.{core::int::unary-}();
+static field () →? core::int s13;
+static final field core::int s14 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+final s14 = (s13)();
+ ^" in self::s13.call();
+static final field Never s15 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+final s15 = throw null;
+ ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never;
+static method main() → void {}
+
+constants {
+ #C1 = 0
+ #C2 = 1
+ #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
new file mode 100644
index 0000000..7157bfd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:15:12: Warning: Operand of null-aware operation '?.' has type 'List<dynamic>' which excludes null.
+// - 'List' is from 'dart:core'.
+// final s2 = s1?.length;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
+// Try using List.filled instead.
+// final s3 = new List<int>(2);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:22:5: Error: Switch case may fall through to the next case.
+// case 0:
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:25:10: Error: Type 'String' of the case expression is not a subtype of type 'int' of this switch expression.
+// case '':
+// ^
+// pkg/front_end/testcases/nnbd/issue41102.dart:21:11: Context: The switch expression is here.
+// switch (e) {
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// final s6 = s5 + 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// final s8 = s7[0];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// final s9 = s7[0] = 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s10 = s7.length;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+// final s11 = s5.length = 0;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+// Try accessing using ?. instead.
+// final s11 = s5.length = 0;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// final s12 = -s5;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// final s14 = (s13)();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+// final s15 = throw null;
+// ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field core::List<dynamic> s1 = <dynamic>[];
+static final field core::int? s2 = let final core::List<dynamic> #t1 = self::s1 in #t1.{core::List::==}(null) ?{core::int?} null : #t1.{core::List::length};
+static final field core::List<core::int> s3 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
+Try using List.filled instead.
+final s3 = new List<int>(2);
+ ^" in core::List::•<core::int>(2);
+static final field dynamic s4 = (() → core::Null? {
+ core::int e = 0;
+ switch(e) {
+ #L1:
+ case #C1:
+ {
+ core::print("fallthrough");
+ }
+ #L2:
+ case #C2:
+ case #C3:
+ {}
+ }
+}).call();
+static field core::int? s5;
+static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+final s6 = s5 + 0;
+ ^" in self::s5.{core::num::+}(0);
+static field core::List<dynamic>? s7;
+static final field dynamic s8 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s8 = s7[0];
+ ^" in self::s7.{core::List::[]}(0);
+static final field core::int s9 = let final core::List<dynamic>? #t5 = self::s7 in let final core::int #t6 = 0 in let final core::int #t7 = 0 in let final void #t8 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s9 = s7[0] = 0;
+ ^" in #t5.{core::List::[]=}(#t6, #t7) in #t7;
+static final field core::int s10 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s10 = s7.length;
+ ^^^^^^" in self::s7.{core::List::length};
+static final field core::int s11 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+final s11 = s5.length = 0;
+ ^^^^^^" in invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+final s11 = s5.length = 0;
+ ^^^^^^";
+static final field core::int s12 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+final s12 = -s5;
+ ^" in self::s5.{core::int::unary-}();
+static field () →? core::int s13;
+static final field core::int s14 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+final s14 = (s13)();
+ ^" in self::s13.call();
+static final field Never s15 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+final s15 = throw null;
+ ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never;
+static method main() → void {}
+
+constants {
+ #C1 = 0
+ #C2 = 1
+ #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
new file mode 100644
index 0000000..d888b44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:15:12: Warning: Operand of null-aware operation '?.' has type 'List<dynamic>' which excludes null.
+// - 'List' is from 'dart:core'.
+// final s2 = s1?.length;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
+// Try using List.filled instead.
+// final s3 = new List<int>(2);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:22:5: Error: Switch case may fall through to the next case.
+// case 0:
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:25:10: Error: Type 'String' of the case expression is not a subtype of type 'int' of this switch expression.
+// case '':
+// ^
+// pkg/front_end/testcases/nnbd/issue41102.dart:21:11: Context: The switch expression is here.
+// switch (e) {
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// final s6 = s5 + 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// final s8 = s7[0];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// final s9 = s7[0] = 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+// - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s10 = s7.length;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+// final s11 = s5.length = 0;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+// Try accessing using ?. instead.
+// final s11 = s5.length = 0;
+// ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// final s12 = -s5;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// final s14 = (s13)();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+// final s15 = throw null;
+// ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field core::List<dynamic> s1 = <dynamic>[];
+static final field core::int? s2 = let final core::List<dynamic> #t1 = self::s1 in #t1.{core::List::==}(null) ?{core::int?} null : #t1.{core::List::length};
+static final field core::List<core::int> s3 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
+Try using List.filled instead.
+final s3 = new List<int>(2);
+ ^" in core::_List::•<core::int>(2);
+static final field dynamic s4 = (() → core::Null? {
+ core::int e = 0;
+ switch(e) {
+ #L1:
+ case #C1:
+ {
+ core::print("fallthrough");
+ }
+ #L2:
+ case #C2:
+ case #C3:
+ {}
+ }
+}).call();
+static field core::int? s5;
+static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+final s6 = s5 + 0;
+ ^" in self::s5.{core::num::+}(0);
+static field core::List<dynamic>? s7;
+static final field dynamic s8 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s8 = s7[0];
+ ^" in self::s7.{core::List::[]}(0);
+static final field core::int s9 = let final core::List<dynamic>? #t5 = self::s7 in let final core::int #t6 = 0 in let final core::int #t7 = 0 in let final void #t8 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s9 = s7[0] = 0;
+ ^" in #t5.{core::List::[]=}(#t6, #t7) in #t7;
+static final field core::int s10 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s10 = s7.length;
+ ^^^^^^" in self::s7.{core::List::length};
+static final field core::int s11 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+final s11 = s5.length = 0;
+ ^^^^^^" in invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+final s11 = s5.length = 0;
+ ^^^^^^";
+static final field core::int s12 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+final s12 = -s5;
+ ^" in self::s5.{core::int::unary-}();
+static field () →? core::int s13;
+static final field core::int s14 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+final s14 = (s13)();
+ ^" in self::s13.call();
+static final field Never s15 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+final s15 = throw null;
+ ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never;
+static method main() → void {}
+
+constants {
+ #C1 = 0
+ #C2 = 1
+ #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart b/pkg/front_end/testcases/nnbd/issue41103.dart
new file mode 100644
index 0000000..764b551
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart
@@ -0,0 +1,11 @@
+// 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 'dart:async';
+
+void main() {}
+
+final t = StreamTransformer.fromHandlers(
+ handleData: (data, sink) => Future.microtask(() => sink.add(data)),
+ handleDone: (sink) => Future.microtask(() => sink.close()));
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.outline.expect
new file mode 100644
index 0000000..49a4279
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.outline.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t;
+static method main() → void
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect
new file mode 100644
index 0000000..367e4c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.transformed.expect
new file mode 100644
index 0000000..367e4c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.transformed.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.expect
new file mode 100644
index 0000000..367e4c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.transformed.expect
new file mode 100644
index 0000000..367e4c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.transformed.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
index 2ff6a62..4ea3cb9 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
@@ -55,7 +55,7 @@
// late String s2 = '${fisk}${await hest()}${fisk}';
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Warning: Constructor is marked 'const' and some fields are late.
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
// const B();
// ^
// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
index 6f8ab34..37628df 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
@@ -55,7 +55,7 @@
// late String s2 = '${fisk}${await hest()}${fisk}';
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Warning: Constructor is marked 'const' and some fields are late.
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
// const B();
// ^
// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect
index 4b2756e..5cc723c 100644
--- a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect
@@ -2,17 +2,17 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
// Try using List.filled instead.
// new List<T>(42);
// ^
//
-// pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
// Try using List.filled instead.
// new List<int?>(42);
// ^
//
-// pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
// Try using List.filled instead.
// new List<int>(42);
// ^
@@ -21,8 +21,17 @@
import "dart:core" as core;
static method foo<T extends core::Object? = core::Object?>() → dynamic {
- core::List::•<self::foo::T%>(42);
- core::List::•<core::int?>(42);
- core::List::•<core::int>(42);
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+ new List<T>(42);
+ ^" in core::List::•<self::foo::T%>(42);
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+ new List<int?>(42);
+ ^" in core::List::•<core::int?>(42);
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+ new List<int>(42);
+ ^" in core::List::•<core::int>(42);
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect
index 80f0ed3..78ee25b 100644
--- a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect
@@ -2,17 +2,17 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
// Try using List.filled instead.
// new List<T>(42);
// ^
//
-// pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
// Try using List.filled instead.
// new List<int?>(42);
// ^
//
-// pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
// Try using List.filled instead.
// new List<int>(42);
// ^
@@ -21,8 +21,17 @@
import "dart:core" as core;
static method foo<T extends core::Object? = core::Object?>() → dynamic {
- core::_List::•<self::foo::T%>(42);
- core::_List::•<core::int?>(42);
- core::_List::•<core::int>(42);
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+ new List<T>(42);
+ ^" in core::_List::•<self::foo::T%>(42);
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+ new List<int?>(42);
+ ^" in core::_List::•<core::int?>(42);
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+ new List<int>(42);
+ ^" in core::_List::•<core::int>(42);
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart b/pkg/front_end/testcases/nnbd/load_library.dart
new file mode 100644
index 0000000..95e2745
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart
@@ -0,0 +1,12 @@
+// 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 "dart:math" deferred as math;
+
+main() {
+ var v1 = math.loadLibrary();
+ v1.then((_) {});
+ var v2 = math.loadLibrary;
+ v2().then((_) {});
+}
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.outline.expect b/pkg/front_end/testcases/nnbd/load_library.dart.outline.expect
new file mode 100644
index 0000000..69f8d21
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.outline.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "dart:math" deferred as math;
+
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect b/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect
new file mode 100644
index 0000000..92acca2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:math" deferred as math;
+
+static method main() → dynamic {
+ asy::Future<dynamic> v1 = LoadLibrary(math);
+ v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+ () → asy::Future<dynamic> v2 = #C1;
+ v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+}
+static method _#loadLibrary_math() → asy::Future<dynamic>
+ return LoadLibrary(math);
+
+constants {
+ #C1 = tearoff self::_#loadLibrary_math
+}
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect
new file mode 100644
index 0000000..92acca2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:math" deferred as math;
+
+static method main() → dynamic {
+ asy::Future<dynamic> v1 = LoadLibrary(math);
+ v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+ () → asy::Future<dynamic> v2 = #C1;
+ v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+}
+static method _#loadLibrary_math() → asy::Future<dynamic>
+ return LoadLibrary(math);
+
+constants {
+ #C1 = tearoff self::_#loadLibrary_math
+}
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect b/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect
new file mode 100644
index 0000000..92acca2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:math" deferred as math;
+
+static method main() → dynamic {
+ asy::Future<dynamic> v1 = LoadLibrary(math);
+ v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+ () → asy::Future<dynamic> v2 = #C1;
+ v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+}
+static method _#loadLibrary_math() → asy::Future<dynamic>
+ return LoadLibrary(math);
+
+constants {
+ #C1 = tearoff self::_#loadLibrary_math
+}
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect
new file mode 100644
index 0000000..92acca2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:math" deferred as math;
+
+static method main() → dynamic {
+ asy::Future<dynamic> v1 = LoadLibrary(math);
+ v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+ () → asy::Future<dynamic> v2 = #C1;
+ v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+}
+static method _#loadLibrary_math() → asy::Future<dynamic>
+ return LoadLibrary(math);
+
+constants {
+ #C1 = tearoff self::_#loadLibrary_math
+}
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.outline.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.outline.expect
index 96347ea..712b735 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.outline.expect
@@ -1,4 +1,35 @@
library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
import self as self;
import "dart:core" as core;
import "member_inheritance_from_opt_out_lib.dart" as opt;
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.expect
index b776417..9e92aa7 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.expect
@@ -1,4 +1,35 @@
library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
import self as self;
import "dart:core" as core;
import "member_inheritance_from_opt_out_lib.dart" as opt;
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.transformed.expect
index b776417..9e92aa7 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.transformed.expect
@@ -1,4 +1,35 @@
library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
import self as self;
import "dart:core" as core;
import "member_inheritance_from_opt_out_lib.dart" as opt;
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.expect
index b776417..9e92aa7 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.expect
@@ -1,4 +1,35 @@
library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
import self as self;
import "dart:core" as core;
import "member_inheritance_from_opt_out_lib.dart" as opt;
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.transformed.expect
index b776417..9e92aa7 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.transformed.expect
@@ -1,4 +1,35 @@
library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+// int method5c({required int a, required int b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+// int method5c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+// int? method6c({required int? a, required int? b}) => 0;
+// ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+// int method6c({int a, int b}) => 0;
+// ^
+//
import self as self;
import "dart:core" as core;
import "member_inheritance_from_opt_out_lib.dart" as opt;
diff --git a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.expect b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.expect
index c8a1961..aea1af9 100644
--- a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.expect
@@ -2,23 +2,29 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
// foo();
// ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:5:6: Context: Found this candidate, but the arguments don't match.
+// void foo({required String s}) {}
+// ^^^
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Warning: Missing required named parameter 'x'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
// new A();
// ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:9:3: Context: Found this candidate, but the arguments don't match.
+// A({required int x});
+// ^
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Warning: Missing required named parameter 'y'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
// a.foo();
// ^
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
// a.f();
// ^
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
// g();
// ^
//
@@ -35,12 +41,22 @@
static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → core::Null? {};
static method foo({required core::String s = #C1}) → void {}
static method bar() → dynamic {
- self::foo();
- new self::A::•();
+ invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
+ foo();
+ ^";
+ invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
+ new A();
+ ^";
self::A a = new self::A::•(x: 42);
- a.{self::A::foo}();
- a.{self::A::f}.call();
- self::g.call();
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
+ a.foo();
+ ^" in a.{self::A::foo}();
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
+ a.f();
+ ^" in a.{self::A::f}.call();
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
+ g();
+ ^" in self::g.call();
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.transformed.expect
index c8a1961..aea1af9 100644
--- a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.transformed.expect
@@ -2,23 +2,29 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
// foo();
// ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:5:6: Context: Found this candidate, but the arguments don't match.
+// void foo({required String s}) {}
+// ^^^
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Warning: Missing required named parameter 'x'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
// new A();
// ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:9:3: Context: Found this candidate, but the arguments don't match.
+// A({required int x});
+// ^
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Warning: Missing required named parameter 'y'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
// a.foo();
// ^
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
// a.f();
// ^
//
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
// g();
// ^
//
@@ -35,12 +41,22 @@
static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → core::Null? {};
static method foo({required core::String s = #C1}) → void {}
static method bar() → dynamic {
- self::foo();
- new self::A::•();
+ invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
+ foo();
+ ^";
+ invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
+ new A();
+ ^";
self::A a = new self::A::•(x: 42);
- a.{self::A::foo}();
- a.{self::A::f}.call();
- self::g.call();
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
+ a.foo();
+ ^" in a.{self::A::foo}();
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
+ a.f();
+ ^" in a.{self::A::f}.call();
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
+ g();
+ ^" in self::g.call();
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/never_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_opt_out.dart.weak.expect
index ecb173e..83a210a 100644
--- a/pkg/front_end/testcases/nnbd/never_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_opt_out.dart.weak.expect
@@ -102,7 +102,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/never_opt_out_lib.dart:19:28: Warning: Assigning value of type 'Type' to a variable of type 'Null?'.
+// pkg/front_end/testcases/nnbd/never_opt_out_lib.dart:19:28: Error: A value of type 'Type' can't be assigned to a variable of type 'Null?'.
// - 'Type' is from 'dart:core'.
// Null get nullProperty => Null;
// ^
@@ -127,7 +127,10 @@
method nullMethod(core::Null? value) → core::Null?
return value;
get nullProperty() → core::Null?
- return core::Null? as{TypeError,ForNonNullableByDefault} core::Null?;
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/never_opt_out_lib.dart:19:28: Error: A value of type 'Type' can't be assigned to a variable of type 'Null?'.
+ - 'Type' is from 'dart:core'.
+ Null get nullProperty => Null;
+ ^" in core::Null? as{TypeError,ForNonNullableByDefault} core::Null?;
set nullProperty(core::Null? value) → void {}
}
static field Never optInNever = self::optOutNever;
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
index 65d01e2..06d0203 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
@@ -32,13 +32,8 @@
// y(); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: Can't use an expression of type 'Never' as a function because it's potentially null.
-// Try calling using ?.call instead.
-// y(); // Error.
-// ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// y++; // Error.
// ^
//
@@ -46,8 +41,8 @@
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// y += 1; // Error.
// ^
//
@@ -55,8 +50,8 @@
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// y[42]; // Error.
// ^
//
@@ -64,8 +59,8 @@
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// y[42] = 42; // Error.
// ^
//
@@ -111,35 +106,32 @@
Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
y.baz = 42; // Error.
^^^";
- let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: Can't use an expression of type 'Never' as a function because it's potentially null.
-Try calling using ?.call instead.
- y(); // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
y(); // Error.
^";
- y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
+ y = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
y++; // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
y++; // Error.
^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- y = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
+ y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
y += 1; // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
y += 1; // Error.
^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
y[42]; // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
y[42]; // Error.
^";
- let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
y[42] = 42; // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
y[42] = 42; // Error.
^";
}
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
index 65d01e2..06d0203 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
@@ -32,13 +32,8 @@
// y(); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: Can't use an expression of type 'Never' as a function because it's potentially null.
-// Try calling using ?.call instead.
-// y(); // Error.
-// ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// y++; // Error.
// ^
//
@@ -46,8 +41,8 @@
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// y += 1; // Error.
// ^
//
@@ -55,8 +50,8 @@
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// y[42]; // Error.
// ^
//
@@ -64,8 +59,8 @@
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// y[42] = 42; // Error.
// ^
//
@@ -111,35 +106,32 @@
Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
y.baz = 42; // Error.
^^^";
- let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: Can't use an expression of type 'Never' as a function because it's potentially null.
-Try calling using ?.call instead.
- y(); // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
y(); // Error.
^";
- y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
+ y = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
y++; // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
y++; // Error.
^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- y = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
+ y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
y += 1; // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
y += 1; // Error.
^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
y[42]; // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
y[42]; // Error.
^";
- let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
y[42] = 42; // Error.
- ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
y[42] = 42; // Error.
^";
}
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
index ae3949b..06d0203 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
@@ -7,17 +7,12 @@
// y.foo(); // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Warning: Method 'foo' is called on 'Never' which is potentially null.
-// Try calling using ?. instead.
-// y.foo(); // Error.
-// ^^^
-//
// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
// y.bar; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Warning: Property 'bar' is accessed on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null.
// Try accessing using ?. instead.
// y.bar; // Error.
// ^^^
@@ -27,7 +22,7 @@
// y.baz = 42; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Warning: Property 'baz' is accessed on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null.
// Try accessing using ?. instead.
// y.baz = 42; // Error.
// ^^^
@@ -37,49 +32,39 @@
// y(); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Warning: Method 'call' is called on 'Never' which is potentially null.
-// Try calling using ?. instead.
-// y(); // Error.
-// ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Warning: Expression of type 'Never' is used as a function, but it's potentially null.
-// Try calling using ?.call instead.
-// y(); // Error.
-// ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Warning: Operator '+' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Warning: Operator '+' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Warning: Operator '[]' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// y[42] = 42; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Warning: Operator '[]=' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
// y[42] = 42; // Error.
// ^
//
@@ -107,11 +92,17 @@
Try correcting the name to the name of an existing method, or defining a method named 'foo'.
y.foo(); // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null.
+Try accessing using ?. instead.
+ y.bar; // Error.
+ ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
y.bar; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null.
+Try accessing using ?. instead.
+ y.baz = 42; // Error.
+ ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
y.baz = 42; // Error.
^^^";
@@ -119,20 +110,28 @@
Try correcting the name to the name of an existing method, or defining a method named 'call'.
y(); // Error.
^";
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ y = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
y++; // Error.
- ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+ y++; // Error.
+ ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+ y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
y += 1; // Error.
- ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+ y += 1; // Error.
+ ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
+ y[42]; // Error.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
y[42]; // Error.
^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
+ y[42] = 42; // Error.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
y[42] = 42; // Error.
^";
}
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
index ae3949b..06d0203 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
@@ -7,17 +7,12 @@
// y.foo(); // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Warning: Method 'foo' is called on 'Never' which is potentially null.
-// Try calling using ?. instead.
-// y.foo(); // Error.
-// ^^^
-//
// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
// y.bar; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Warning: Property 'bar' is accessed on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null.
// Try accessing using ?. instead.
// y.bar; // Error.
// ^^^
@@ -27,7 +22,7 @@
// y.baz = 42; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Warning: Property 'baz' is accessed on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null.
// Try accessing using ?. instead.
// y.baz = 42; // Error.
// ^^^
@@ -37,49 +32,39 @@
// y(); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Warning: Method 'call' is called on 'Never' which is potentially null.
-// Try calling using ?. instead.
-// y(); // Error.
-// ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Warning: Expression of type 'Never' is used as a function, but it's potentially null.
-// Try calling using ?.call instead.
-// y(); // Error.
-// ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Warning: Operator '+' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Warning: Operator '+' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Warning: Operator '[]' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// y[42] = 42; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Warning: Operator '[]=' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
// y[42] = 42; // Error.
// ^
//
@@ -107,11 +92,17 @@
Try correcting the name to the name of an existing method, or defining a method named 'foo'.
y.foo(); // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null.
+Try accessing using ?. instead.
+ y.bar; // Error.
+ ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
y.bar; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+ let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null.
+Try accessing using ?. instead.
+ y.baz = 42; // Error.
+ ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
y.baz = 42; // Error.
^^^";
@@ -119,20 +110,28 @@
Try correcting the name to the name of an existing method, or defining a method named 'call'.
y(); // Error.
^";
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ y = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
y++; // Error.
- ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+ y++; // Error.
+ ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+ y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
y += 1; // Error.
- ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+ y += 1; // Error.
+ ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+ let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
+ y[42]; // Error.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
y[42]; // Error.
^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+ let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
+ y[42] = 42; // Error.
+ ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
y[42] = 42; // Error.
^";
}
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
index 7f76fc6..bd5dcc7 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
@@ -2,39 +2,39 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:7:5: Warning: Field 'topLevelField' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:7:5: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
// int topLevelField; // Error.
// ^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:10:14: Warning: Field 'staticFieldOfA' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:10:14: Error: Field 'staticFieldOfA' should be initialized because its type 'int' doesn't allow null.
// static int staticFieldOfA; // Error.
// ^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:24:14: Warning: Field 'staticFieldOfM' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:24:14: Error: Field 'staticFieldOfM' should be initialized because its type 'int' doesn't allow null.
// static int staticFieldOfM; // Error.
// ^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:11:7: Warning: This constructor doesn't initialize field 'fieldOfA' and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:11:7: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
// int fieldOfA; // Error.
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:17:5: Warning: This constructor doesn't initialize field 'fieldOfB' and its type 'X' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:17:5: Error: This constructor should initialize field 'fieldOfB' because its type 'X' doesn't allow null.
// X fieldOfB; // Error.
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:18:5: Warning: This constructor doesn't initialize field 'fieldOfB2' and its type 'Y' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:18:5: Error: This constructor should initialize field 'fieldOfB2' because its type 'Y' doesn't allow null.
// Y fieldOfB2; // Error.
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:25:7: Warning: Field 'fieldOfM' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:25:7: Error: Field 'fieldOfM' should be initialized because its type 'int' doesn't allow null.
// int fieldOfM; // Error.
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:29:5: Warning: Field 'fieldOfN' isn't initialized and its type 'X' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:29:5: Error: Field 'fieldOfN' should be initialized because its type 'X' doesn't allow null.
// X fieldOfN; // Error.
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:30:5: Warning: Field 'fieldOfN2' isn't initialized and its type 'Y' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:30:5: Error: Field 'fieldOfN2' should be initialized because its type 'Y' doesn't allow null.
// Y fieldOfN2; // Error.
// ^^^^^^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
index 7f76fc6..bd5dcc7 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
@@ -2,39 +2,39 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:7:5: Warning: Field 'topLevelField' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:7:5: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
// int topLevelField; // Error.
// ^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:10:14: Warning: Field 'staticFieldOfA' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:10:14: Error: Field 'staticFieldOfA' should be initialized because its type 'int' doesn't allow null.
// static int staticFieldOfA; // Error.
// ^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:24:14: Warning: Field 'staticFieldOfM' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:24:14: Error: Field 'staticFieldOfM' should be initialized because its type 'int' doesn't allow null.
// static int staticFieldOfM; // Error.
// ^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:11:7: Warning: This constructor doesn't initialize field 'fieldOfA' and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:11:7: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
// int fieldOfA; // Error.
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:17:5: Warning: This constructor doesn't initialize field 'fieldOfB' and its type 'X' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:17:5: Error: This constructor should initialize field 'fieldOfB' because its type 'X' doesn't allow null.
// X fieldOfB; // Error.
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:18:5: Warning: This constructor doesn't initialize field 'fieldOfB2' and its type 'Y' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:18:5: Error: This constructor should initialize field 'fieldOfB2' because its type 'Y' doesn't allow null.
// Y fieldOfB2; // Error.
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:25:7: Warning: Field 'fieldOfM' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:25:7: Error: Field 'fieldOfM' should be initialized because its type 'int' doesn't allow null.
// int fieldOfM; // Error.
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:29:5: Warning: Field 'fieldOfN' isn't initialized and its type 'X' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:29:5: Error: Field 'fieldOfN' should be initialized because its type 'X' doesn't allow null.
// X fieldOfN; // Error.
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:30:5: Warning: Field 'fieldOfN2' isn't initialized and its type 'Y' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:30:5: Error: Field 'fieldOfN2' should be initialized because its type 'Y' doesn't allow null.
// Y fieldOfN2; // Error.
// ^^^^^^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.expect b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.expect
index e484f3d..d869c59 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.expect
@@ -2,19 +2,19 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:9:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:9:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// method1({int a}) {}
// ^
//
-// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:11:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:11:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// method2([int a]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:7:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:7:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// method3({int a}) {}
// ^
//
-// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:9:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:9:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// method4([int a]) {}
// ^
//
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.transformed.expect
index e484f3d..d869c59 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.transformed.expect
@@ -2,19 +2,19 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:9:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:9:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// method1({int a}) {}
// ^
//
-// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:11:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:11:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// method2([int a]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:7:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:7:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// method3({int a}) {}
// ^
//
-// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:9:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:9:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// method4([int a]) {}
// ^
//
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
index 3495b4b..066a5f6 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
@@ -70,12 +70,6 @@
// nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
-// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-// Try calling using ?. instead.
-// nullableClass(); // error
-// ^
-//
// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try calling using ?.call instead.
@@ -191,12 +185,8 @@
- 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
Try calling using ?.call instead.
nullableClass(); // error
- ^" in let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
- - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-Try calling using ?. instead.
- nullableClass(); // error
^" in nullableClass.{self::Class::call}();
nonNullableClass.{self::Class::call}();
- let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::call}();
- let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
}
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
index 3495b4b..066a5f6 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
@@ -70,12 +70,6 @@
// nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
-// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-// Try calling using ?. instead.
-// nullableClass(); // error
-// ^
-//
// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try calling using ?.call instead.
@@ -191,12 +185,8 @@
- 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
Try calling using ?.call instead.
nullableClass(); // error
- ^" in let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
- - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-Try calling using ?. instead.
- nullableClass(); // error
^" in nullableClass.{self::Class::call}();
nonNullableClass.{self::Class::call}();
- let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::call}();
- let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
}
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
index 7a28d30..066a5f6 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
@@ -2,67 +2,67 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/null_access.dart:24:3: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
// -nullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:25:15: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nullableInt + 2; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:26:16: Warning: Operator '[]' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableClass[nonNullableInt]; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:27:16: Warning: Operator '[]=' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableClass[nonNullableInt] = nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Warning: Operator '[]' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableClass[nonNullableInt] += nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Warning: Operator '[]=' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableClass[nonNullableInt] += nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Warning: Operator '[]' is called on 'NullableIndexClass?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
// - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Warning: Operator '[]=' is called on 'NullableIndexClass?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
// - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:37:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try accessing using ?. instead.
// nullableClass.nonNullableField; // error
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:38:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try accessing using ?. instead.
// nullableClass.nonNullableField = 2; // error
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:39:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try accessing using ?. instead.
// nullableClass.nonNullableField += 2; // error
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nonNullableClass.nullableField += 2; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nullableClass?.nullableField += 2; // error
// ^
//
@@ -70,13 +70,7 @@
// nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Warning: Method 'call' is called on 'Class?' which is potentially null.
-// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-// Try calling using ?. instead.
-// nullableClass(); // error
-// ^
-//
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Warning: Expression of type 'Class?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try calling using ?.call instead.
// nullableClass(); // error
@@ -121,32 +115,78 @@
}
static method main() → dynamic {}
static method errors(self::Class? nullableClass, self::Class nonNullableClass, core::int? nullableInt, core::int nonNullableInt, self::NullableIndexClass? nullableNullableIndexClass) → dynamic {
- nullableInt.{core::int::unary-}();
- nullableInt.{core::num::+}(2);
- nullableClass.{self::Class::[]}(nonNullableInt);
- nullableClass.{self::Class::[]=}(nonNullableInt, nonNullableInt);
- let final self::Class? #t1 = nullableClass in let final core::int #t2 = nonNullableInt in #t1.{self::Class::[]=}(#t2, #t1.{self::Class::[]}(#t2).{core::num::+}(nonNullableInt));
- let final self::NullableIndexClass? #t3 = nullableNullableIndexClass in let final core::int #t4 = nonNullableInt in #t3.{self::NullableIndexClass::[]}(#t4).{core::num::==}(null) ?{core::int} #t3.{self::NullableIndexClass::[]=}(#t4, nonNullableInt) : null;
- let final self::Class? #t5 = nullableClass in #t5.{core::Object::==}(null) ?{core::int?} null : #t5{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]}(nonNullableInt);
- let final self::Class? #t6 = nullableClass in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]=}(nonNullableInt, nonNullableInt);
- let final self::Class? #t7 = nullableClass in #t7.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t8 = #t7{self::Class}.{self::Class::nonNullableClass} in let final core::int #t9 = nonNullableInt in #t8.{self::Class::[]=}(#t9, #t8.{self::Class::[]}(#t9).{core::num::+}(nonNullableInt));
- let final self::Class? #t10 = nullableClass in #t10.{core::Object::==}(null) ?{core::int?} null : let final self::NullableIndexClass #t11 = #t10{self::Class}.{self::Class::nonNullableNullableIndexClass} in let final core::int #t12 = nonNullableInt in #t11.{self::NullableIndexClass::[]}(#t12).{core::num::==}(null) ?{core::int} #t11.{self::NullableIndexClass::[]=}(#t12, nonNullableInt) : null;
- nullableClass.{self::Class::nonNullableField};
- nullableClass.{self::Class::nonNullableField} = 2;
- let final self::Class? #t13 = nullableClass in #t13.{self::Class::nonNullableField} = #t13.{self::Class::nonNullableField}.{core::num::+}(2);
- let final self::Class? #t14 = nullableClass in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::nonNullableField};
- let final self::Class? #t15 = nullableClass in #t15.{core::Object::==}(null) ?{core::int?} null : #t15{self::Class}.{self::Class::nonNullableField} = 2;
- let final self::Class? #t16 = nullableClass in #t16.{core::Object::==}(null) ?{core::int?} null : #t16.{self::Class::nonNullableField} = #t16.{self::Class::nonNullableField}.{core::num::+}(2);
- let final self::Class? #t17 = nullableClass in #t17.{core::Object::==}(null) ?{core::int?} null : #t17{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
- let final self::Class? #t18 = nullableClass in #t18.{core::Object::==}(null) ?{core::int?} null : #t18{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
- let final self::Class #t19 = nonNullableClass in #t19.{self::Class::nullableField} = #t19.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t20 = nullableClass in #t20.{core::Object::==}(null) ?{core::int?} null : #t20.{self::Class::nullableField} = #t20.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t21 = nullableClass in #t21.{core::Object::==}(null) ?{core::int?} null : #t21.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t21.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t22 = nullableClass in #t22.{core::Object::==}(null) ?{core::int?} null : #t22.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t22.{self::Class::nullableField} = 0 : null;
- let final self::Class? #t23 = nullableClass in #t23.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t24 = #t23{self::Class}.{self::Class::nonNullableClass} in #t24{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t24{self::Class}.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t25 = nullableClass in #t25.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t26 = #t25{self::Class}.{self::Class::nonNullableClass} in #t26{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t26{self::Class}.{self::Class::nullableField} = 0 : null;
- nullableClass.{self::Class::call}();
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+ -nullableInt; // error
+ ^" in nullableInt.{core::int::unary-}();
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nullableInt + 2; // error
+ ^" in nullableInt.{core::num::+}(2);
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableClass[nonNullableInt]; // error
+ ^" in nullableClass.{self::Class::[]}(nonNullableInt);
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableClass[nonNullableInt] = nonNullableInt; // error
+ ^" in nullableClass.{self::Class::[]=}(nonNullableInt, nonNullableInt);
+ let final self::Class? #t5 = nullableClass in let final core::int #t6 = nonNullableInt in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableClass[nonNullableInt] += nonNullableInt; // error
+ ^" in #t5.{self::Class::[]=}(#t6, (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableClass[nonNullableInt] += nonNullableInt; // error
+ ^" in #t5.{self::Class::[]}(#t6)).{core::num::+}(nonNullableInt));
+ let final self::NullableIndexClass? #t9 = nullableNullableIndexClass in let final core::int #t10 = nonNullableInt in (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+ ^" in #t9.{self::NullableIndexClass::[]}(#t10)).{core::num::==}(null) ?{core::int} let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+ ^" in #t9.{self::NullableIndexClass::[]=}(#t10, nonNullableInt) : null;
+ let final self::Class? #t13 = nullableClass in #t13.{core::Object::==}(null) ?{core::int?} null : #t13{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]}(nonNullableInt);
+ let final self::Class? #t14 = nullableClass in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]=}(nonNullableInt, nonNullableInt);
+ let final self::Class? #t15 = nullableClass in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::nonNullableClass} in let final core::int #t17 = nonNullableInt in #t16.{self::Class::[]=}(#t17, #t16.{self::Class::[]}(#t17).{core::num::+}(nonNullableInt));
+ let final self::Class? #t18 = nullableClass in #t18.{core::Object::==}(null) ?{core::int?} null : let final self::NullableIndexClass #t19 = #t18{self::Class}.{self::Class::nonNullableNullableIndexClass} in let final core::int #t20 = nonNullableInt in #t19.{self::NullableIndexClass::[]}(#t20).{core::num::==}(null) ?{core::int} #t19.{self::NullableIndexClass::[]=}(#t20, nonNullableInt) : null;
+ let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+ nullableClass.nonNullableField; // error
+ ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField};
+ let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+ nullableClass.nonNullableField = 2; // error
+ ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField} = 2;
+ let final self::Class? #t23 = nullableClass in let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+ nullableClass.nonNullableField += 2; // error
+ ^^^^^^^^^^^^^^^^" in #t23.{self::Class::nonNullableField} = (let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+ nullableClass.nonNullableField += 2; // error
+ ^^^^^^^^^^^^^^^^" in #t23.{self::Class::nonNullableField}).{core::num::+}(2);
+ let final self::Class? #t26 = nullableClass in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::nonNullableField};
+ let final self::Class? #t27 = nullableClass in #t27.{core::Object::==}(null) ?{core::int?} null : #t27{self::Class}.{self::Class::nonNullableField} = 2;
+ let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
+ let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
+ let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
+ let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nonNullableClass.nullableField += 2; // error
+ ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
+ let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nullableClass?.nullableField += 2; // error
+ ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
+ let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
+ let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
+ let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try calling using ?.call instead.
+ nullableClass(); // error
+ ^" in nullableClass.{self::Class::call}();
nonNullableClass.{self::Class::call}();
- let final self::Class #t27 = nonNullableClass in #t27.{core::Object::==}(null) ?{self::Class?} null : #t27.{self::Class::nonNullableClass}.{self::Class::call}();
- let final self::Class #t28 = nonNullableClass in #t28.{core::Object::==}(null) ?{self::Class?} null : #t28.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
}
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
index 7a28d30..066a5f6 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
@@ -2,67 +2,67 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/null_access.dart:24:3: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
// -nullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:25:15: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nullableInt + 2; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:26:16: Warning: Operator '[]' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableClass[nonNullableInt]; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:27:16: Warning: Operator '[]=' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableClass[nonNullableInt] = nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Warning: Operator '[]' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableClass[nonNullableInt] += nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Warning: Operator '[]=' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableClass[nonNullableInt] += nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Warning: Operator '[]' is called on 'NullableIndexClass?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
// - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Warning: Operator '[]=' is called on 'NullableIndexClass?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
// - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:37:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try accessing using ?. instead.
// nullableClass.nonNullableField; // error
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:38:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try accessing using ?. instead.
// nullableClass.nonNullableField = 2; // error
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:39:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try accessing using ?. instead.
// nullableClass.nonNullableField += 2; // error
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nonNullableClass.nullableField += 2; // error
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nullableClass?.nullableField += 2; // error
// ^
//
@@ -70,13 +70,7 @@
// nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
// ^
//
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Warning: Method 'call' is called on 'Class?' which is potentially null.
-// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-// Try calling using ?. instead.
-// nullableClass(); // error
-// ^
-//
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Warning: Expression of type 'Class?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
// Try calling using ?.call instead.
// nullableClass(); // error
@@ -121,32 +115,78 @@
}
static method main() → dynamic {}
static method errors(self::Class? nullableClass, self::Class nonNullableClass, core::int? nullableInt, core::int nonNullableInt, self::NullableIndexClass? nullableNullableIndexClass) → dynamic {
- nullableInt.{core::int::unary-}();
- nullableInt.{core::num::+}(2);
- nullableClass.{self::Class::[]}(nonNullableInt);
- nullableClass.{self::Class::[]=}(nonNullableInt, nonNullableInt);
- let final self::Class? #t1 = nullableClass in let final core::int #t2 = nonNullableInt in #t1.{self::Class::[]=}(#t2, #t1.{self::Class::[]}(#t2).{core::num::+}(nonNullableInt));
- let final self::NullableIndexClass? #t3 = nullableNullableIndexClass in let final core::int #t4 = nonNullableInt in #t3.{self::NullableIndexClass::[]}(#t4).{core::num::==}(null) ?{core::int} #t3.{self::NullableIndexClass::[]=}(#t4, nonNullableInt) : null;
- let final self::Class? #t5 = nullableClass in #t5.{core::Object::==}(null) ?{core::int?} null : #t5{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]}(nonNullableInt);
- let final self::Class? #t6 = nullableClass in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]=}(nonNullableInt, nonNullableInt);
- let final self::Class? #t7 = nullableClass in #t7.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t8 = #t7{self::Class}.{self::Class::nonNullableClass} in let final core::int #t9 = nonNullableInt in #t8.{self::Class::[]=}(#t9, #t8.{self::Class::[]}(#t9).{core::num::+}(nonNullableInt));
- let final self::Class? #t10 = nullableClass in #t10.{core::Object::==}(null) ?{core::int?} null : let final self::NullableIndexClass #t11 = #t10{self::Class}.{self::Class::nonNullableNullableIndexClass} in let final core::int #t12 = nonNullableInt in #t11.{self::NullableIndexClass::[]}(#t12).{core::num::==}(null) ?{core::int} #t11.{self::NullableIndexClass::[]=}(#t12, nonNullableInt) : null;
- nullableClass.{self::Class::nonNullableField};
- nullableClass.{self::Class::nonNullableField} = 2;
- let final self::Class? #t13 = nullableClass in #t13.{self::Class::nonNullableField} = #t13.{self::Class::nonNullableField}.{core::num::+}(2);
- let final self::Class? #t14 = nullableClass in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::nonNullableField};
- let final self::Class? #t15 = nullableClass in #t15.{core::Object::==}(null) ?{core::int?} null : #t15{self::Class}.{self::Class::nonNullableField} = 2;
- let final self::Class? #t16 = nullableClass in #t16.{core::Object::==}(null) ?{core::int?} null : #t16.{self::Class::nonNullableField} = #t16.{self::Class::nonNullableField}.{core::num::+}(2);
- let final self::Class? #t17 = nullableClass in #t17.{core::Object::==}(null) ?{core::int?} null : #t17{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
- let final self::Class? #t18 = nullableClass in #t18.{core::Object::==}(null) ?{core::int?} null : #t18{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
- let final self::Class #t19 = nonNullableClass in #t19.{self::Class::nullableField} = #t19.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t20 = nullableClass in #t20.{core::Object::==}(null) ?{core::int?} null : #t20.{self::Class::nullableField} = #t20.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t21 = nullableClass in #t21.{core::Object::==}(null) ?{core::int?} null : #t21.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t21.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t22 = nullableClass in #t22.{core::Object::==}(null) ?{core::int?} null : #t22.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t22.{self::Class::nullableField} = 0 : null;
- let final self::Class? #t23 = nullableClass in #t23.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t24 = #t23{self::Class}.{self::Class::nonNullableClass} in #t24{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t24{self::Class}.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t25 = nullableClass in #t25.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t26 = #t25{self::Class}.{self::Class::nonNullableClass} in #t26{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t26{self::Class}.{self::Class::nullableField} = 0 : null;
- nullableClass.{self::Class::call}();
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+ -nullableInt; // error
+ ^" in nullableInt.{core::int::unary-}();
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nullableInt + 2; // error
+ ^" in nullableInt.{core::num::+}(2);
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableClass[nonNullableInt]; // error
+ ^" in nullableClass.{self::Class::[]}(nonNullableInt);
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableClass[nonNullableInt] = nonNullableInt; // error
+ ^" in nullableClass.{self::Class::[]=}(nonNullableInt, nonNullableInt);
+ let final self::Class? #t5 = nullableClass in let final core::int #t6 = nonNullableInt in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableClass[nonNullableInt] += nonNullableInt; // error
+ ^" in #t5.{self::Class::[]=}(#t6, (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableClass[nonNullableInt] += nonNullableInt; // error
+ ^" in #t5.{self::Class::[]}(#t6)).{core::num::+}(nonNullableInt));
+ let final self::NullableIndexClass? #t9 = nullableNullableIndexClass in let final core::int #t10 = nonNullableInt in (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+ ^" in #t9.{self::NullableIndexClass::[]}(#t10)).{core::num::==}(null) ?{core::int} let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+ nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+ ^" in #t9.{self::NullableIndexClass::[]=}(#t10, nonNullableInt) : null;
+ let final self::Class? #t13 = nullableClass in #t13.{core::Object::==}(null) ?{core::int?} null : #t13{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]}(nonNullableInt);
+ let final self::Class? #t14 = nullableClass in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]=}(nonNullableInt, nonNullableInt);
+ let final self::Class? #t15 = nullableClass in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::nonNullableClass} in let final core::int #t17 = nonNullableInt in #t16.{self::Class::[]=}(#t17, #t16.{self::Class::[]}(#t17).{core::num::+}(nonNullableInt));
+ let final self::Class? #t18 = nullableClass in #t18.{core::Object::==}(null) ?{core::int?} null : let final self::NullableIndexClass #t19 = #t18{self::Class}.{self::Class::nonNullableNullableIndexClass} in let final core::int #t20 = nonNullableInt in #t19.{self::NullableIndexClass::[]}(#t20).{core::num::==}(null) ?{core::int} #t19.{self::NullableIndexClass::[]=}(#t20, nonNullableInt) : null;
+ let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+ nullableClass.nonNullableField; // error
+ ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField};
+ let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+ nullableClass.nonNullableField = 2; // error
+ ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField} = 2;
+ let final self::Class? #t23 = nullableClass in let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+ nullableClass.nonNullableField += 2; // error
+ ^^^^^^^^^^^^^^^^" in #t23.{self::Class::nonNullableField} = (let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+ nullableClass.nonNullableField += 2; // error
+ ^^^^^^^^^^^^^^^^" in #t23.{self::Class::nonNullableField}).{core::num::+}(2);
+ let final self::Class? #t26 = nullableClass in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::nonNullableField};
+ let final self::Class? #t27 = nullableClass in #t27.{core::Object::==}(null) ?{core::int?} null : #t27{self::Class}.{self::Class::nonNullableField} = 2;
+ let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
+ let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
+ let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
+ let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nonNullableClass.nullableField += 2; // error
+ ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
+ let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nullableClass?.nullableField += 2; // error
+ ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
+ let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
+ let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
+ let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try calling using ?.call instead.
+ nullableClass(); // error
+ ^" in nullableClass.{self::Class::call}();
nonNullableClass.{self::Class::call}();
- let final self::Class #t27 = nonNullableClass in #t27.{core::Object::==}(null) ?{self::Class?} null : #t27.{self::Class::nonNullableClass}.{self::Class::call}();
- let final self::Class #t28 = nonNullableClass in #t28.{core::Object::==}(null) ?{self::Class?} null : #t28.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect
index 1667166..4b8eb0a 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect
@@ -2,24 +2,24 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
// Try accessing using ?. instead.
// throws(() => (n1?.nullable1 = new Class1()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
// Try accessing using ?. instead.
// throws(() => (n1?.nonNullable1Method()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
// throws(() => n1?.nonNullable1 + 0);
// ^
//
-// pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
// throws(() => -n1?.nonNullable1);
// ^
@@ -110,139 +110,153 @@
let final self::Class1? #t11 = n1 in #t11.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t12 = #t11{self::Class1}.{self::Class1::nullable1} in #t12.{core::Object::==}(null) ?{self::Class1?} null : #t12{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = #t13{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t14.{core::Object::==}(null) ?{self::Class1?} null : #t14{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
let final self::Class1? #t15 = let final self::Class1? #t16 = n1 in #t16.{core::Object::==}(null) ?{self::Class1?} null : #t16{self::Class1}.{self::Class1::nullable1} in #t15.{core::Object::==}(null) ?{self::Class1?} null : #t15{self::Class1}.{self::Class1::nullable1};
- self::throws(() → self::Class1? => (let final self::Class1? #t17 = n1 in #t17.{core::Object::==}(null) ?{self::Class1?} null : #t17{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
- self::throws(() → self::Class1? => (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nonNullable1Method}()).{self::Class1::nullable1});
- nullable1 = let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : #t19{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t21 = #t20{self::Class1}.{self::Class1::nullable1} in #t21.{core::Object::==}(null) ?{self::Class1?} null : #t21{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t23 = #t22{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t23.{core::Object::==}(null) ?{self::Class1?} null : #t23{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t25 = #t24{self::Class1}.{self::Class1::nullable1} in #t25.{core::Object::==}(null) ?{self::Class1?} null : #t25{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : #t26{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t27 = n1 in #t27.{core::Object::==}(null) ?{self::Class1?} null : #t27{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : #t28{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t29 = n1 in #t29.{core::Object::==}(null) ?{self::Class1?} null : #t29{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : #t30{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t31 = n1 in #t31.{core::Object::==}(null) ?{self::Class1?} null : #t31{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : #t32{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- let final self::Class1? #t33 = n1 in #t33.{core::Object::==}(null) ?{self::Class1?} null : #t33{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : #t34{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t35 = n1 in #t35.{core::Object::==}(null) ?{self::Class1?} null : #t35{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1};
- let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : #t36{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : #t37{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t39 = #t38{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t39.{core::Object::==}(null) ?{self::Class1?} null : #t39{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : #t40{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t41 = n1 in #t41.{core::Object::==}(null) ?{self::Class1?} null : #t41{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
- let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : #t42{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : #t43{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t44 = n1 in #t44.{core::Object::==}(null) ?{self::Class1?} null : #t44{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : #t45{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t46 = n1 in #t46.{core::Object::==}(null) ?{self::Class1?} null : #t46{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1};
- let final self::Class1? #t47 = n1 in #t47.{core::Object::==}(null) ?{self::Class1?} null : #t47{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : #t48{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : #t49{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : #t50{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : #t51{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : #t52{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : #t53{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : #t54{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : #t55{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : #t56{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : #t57{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : #t58{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : #t59{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : #t60{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t61 = n1 in #t61.{core::Object::==}(null) ?{self::Class1?} null : #t61{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : #t62{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : #t63{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : #t64{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : #t65{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : #t66{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t67 = n1 in #t67.{core::Object::==}(null) ?{self::Class1?} null : #t67{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : #t68{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : #t69{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t70 = n1 in #t70.{core::Object::==}(null) ?{self::Class1?} null : #t70{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : #t71{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t72 = n1 in #t72.{core::Object::==}(null) ?{self::Class1?} null : #t72{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- let final self::Class1? #t73 = n1 in #t73.{core::Object::==}(null) ?{self::Class1?} null : #t73{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : #t74{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : #t75{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : #t76{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : #t77{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : #t78{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : #t79{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t81 = #t80{self::Class1}.{self::Class1::nonNullable1Method}() in #t81.{core::Object::==}(null) ?{self::Class1?} null : #t81{self::Class1}.{self::Class1::nonNullable1Method}();
+ self::throws(() → self::Class1? => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+Try accessing using ?. instead.
+ throws(() => (n1?.nullable1 = new Class1()).nullable1);
+ ^^^^^^^^^" in (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
+ self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+Try accessing using ?. instead.
+ throws(() => (n1?.nonNullable1Method()).nullable1);
+ ^^^^^^^^^" in (let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : #t20{self::Class1}.{self::Class1::nonNullable1Method}()).{self::Class1::nullable1});
+ nullable1 = let final self::Class1? #t21 = n1 in #t21.{core::Object::==}(null) ?{self::Class1?} null : #t21{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t23 = #t22{self::Class1}.{self::Class1::nullable1} in #t23.{core::Object::==}(null) ?{self::Class1?} null : #t23{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t25 = #t24{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t25.{core::Object::==}(null) ?{self::Class1?} null : #t25{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = #t26{self::Class1}.{self::Class1::nullable1} in #t27.{core::Object::==}(null) ?{self::Class1?} null : #t27{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : #t28{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t29 = n1 in #t29.{core::Object::==}(null) ?{self::Class1?} null : #t29{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : #t30{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t31 = n1 in #t31.{core::Object::==}(null) ?{self::Class1?} null : #t31{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : #t32{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t33 = n1 in #t33.{core::Object::==}(null) ?{self::Class1?} null : #t33{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : #t34{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ let final self::Class1? #t35 = n1 in #t35.{core::Object::==}(null) ?{self::Class1?} null : #t35{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : #t36{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : #t37{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1};
+ let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : #t38{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : #t39{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t41 = #t40{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t41.{core::Object::==}(null) ?{self::Class1?} null : #t41{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : #t42{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : #t43{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+ let final self::Class1? #t44 = n1 in #t44.{core::Object::==}(null) ?{self::Class1?} null : #t44{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : #t45{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t46 = n1 in #t46.{core::Object::==}(null) ?{self::Class1?} null : #t46{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t47 = n1 in #t47.{core::Object::==}(null) ?{self::Class1?} null : #t47{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : #t48{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+ let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : #t49{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : #t50{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : #t51{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : #t52{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : #t53{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : #t54{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : #t55{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : #t56{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : #t57{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : #t58{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : #t59{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : #t60{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t61 = n1 in #t61.{core::Object::==}(null) ?{self::Class1?} null : #t61{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : #t62{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : #t63{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : #t64{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : #t65{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : #t66{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t67 = n1 in #t67.{core::Object::==}(null) ?{self::Class1?} null : #t67{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : #t68{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : #t69{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ let final self::Class1? #t70 = n1 in #t70.{core::Object::==}(null) ?{self::Class1?} null : #t70{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : #t71{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t72 = n1 in #t72.{core::Object::==}(null) ?{self::Class1?} null : #t72{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t73 = n1 in #t73.{core::Object::==}(null) ?{self::Class1?} null : #t73{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : #t74{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : #t75{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : #t76{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : #t77{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : #t78{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : #t79{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : #t80{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : #t81{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = #t82{self::Class1}.{self::Class1::nonNullable1Method}() in #t83.{core::Object::==}(null) ?{self::Class1?} null : #t83{self::Class1}.{self::Class1::nonNullable1Method}();
}
static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
self::Class1? nullable1 = n1;
self::Class2? nullable2 = n2;
self::Class3? nullable3 = n3;
- let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : #t82{self::Class1}.{self::Class1::[]}(nullable1);
- let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : #t83{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
- let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = #t84{self::Class1}.{self::Class1::[]}(nullable1) in #t85.{core::Object::==}(null) ?{self::Class1?} null : #t85{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t86 = n1 in #t86.{core::Object::==}(null) ?{self::Class1?} null : #t86{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1);
- let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : #t87{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = #t88{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t90 = nullable1 in let final self::Class1 #t91 = new self::Class1::•() in let final void #t92 = #t89.{self::Class1::[]=}(#t90, #t91) in #t91;
- let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t94 = #t93{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1) in #t94.{core::Object::==}(null) ?{self::Class1?} null : #t94{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t96 = #t95{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t97 = nullable2 in #t96.{self::Class2::[]=}(#t97, #t96.{self::Class2::[]}(#t97).{self::Class2::+}(0));
- nullable2 = let final self::Class1? #t98 = n1 in #t98.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t99 = #t98{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t100 = nullable2 in let final self::Class2 #t101 = #t99.{self::Class2::[]}(#t100).{self::Class2::+}(0) in let final void #t102 = #t99.{self::Class2::[]=}(#t100, #t101) in #t101;
- let final self::Class1? #t103 = n1 in #t103.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t104 = nullable1 in #t103{self::Class1}.{self::Class1::[]}(#t104).{core::Object::==}(null) ?{self::Class1?} #t103{self::Class1}.{self::Class1::[]=}(#t104, nullable1) : null;
- nullable1 = let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t106 = nullable1 in let final self::Class1? #t107 = #t105{self::Class1}.{self::Class1::[]}(#t106) in #t107.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t108 = nullable1 in let final void #t109 = #t105{self::Class1}.{self::Class1::[]=}(#t106, #t108) in #t108 : #t107{self::Class1};
- let final self::Class2? #t110 = n2 in #t110.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t111 = nullable2 in #t110{self::Class2}.{self::Class2::[]=}(#t111, #t110{self::Class2}.{self::Class2::[]}(#t111).{self::Class2::+}(0));
- nullable2 = let final self::Class2? #t112 = n2 in #t112.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t113 = nullable2 in let final self::Class2 #t114 = #t112{self::Class2}.{self::Class2::[]}(#t113).{self::Class2::+}(0) in let final void #t115 = #t112{self::Class2}.{self::Class2::[]=}(#t113, #t114) in #t114;
- let final self::Class2? #t116 = n2 in #t116.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t117 = nullable2 in #t116{self::Class2}.{self::Class2::[]=}(#t117, #t116{self::Class2}.{self::Class2::[]}(#t117).{self::Class2::+}(0));
- nullable2 = let final self::Class2? #t118 = n2 in #t118.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t119 = nullable2 in let final self::Class2 #t120 = #t118{self::Class2}.{self::Class2::[]}(#t119).{self::Class2::+}(0) in let final void #t121 = #t118{self::Class2}.{self::Class2::[]=}(#t119, #t120) in #t120;
- let final self::Class2? #t122 = n2 in #t122.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t123 = nullable2 in #t122{self::Class2}.{self::Class2::[]=}(#t123, #t122{self::Class2}.{self::Class2::[]}(#t123).{self::Class2::+}(1));
- nullable2 = let final self::Class2? #t124 = n2 in #t124.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t125 = nullable2 in let final self::Class2 #t126 = #t124{self::Class2}.{self::Class2::[]}(#t125) in let final void #t127 = #t124{self::Class2}.{self::Class2::[]=}(#t125, #t126.{self::Class2::+}(1)) in #t126;
- let final self::Class2? #t128 = n2 in #t128.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t129 = nullable2 in let final self::Class2 #t130 = #t128{self::Class2}.{self::Class2::[]}(#t129).{self::Class2::+}(1) in let final void #t131 = #t128{self::Class2}.{self::Class2::[]=}(#t129, #t130) in #t130;
- nullable2 = let final self::Class2? #t132 = n2 in #t132.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t133 = nullable2 in let final self::Class2 #t134 = #t132{self::Class2}.{self::Class2::[]}(#t133).{self::Class2::+}(1) in let final void #t135 = #t132{self::Class2}.{self::Class2::[]=}(#t133, #t134) in #t134;
- let final self::Class1? #t136 = n1 in #t136.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t137 = #t136{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t138 = nullable2 in #t137.{self::Class2::[]=}(#t138, #t137.{self::Class2::[]}(#t138).{self::Class2::+}(1));
- nullable2 = let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t140 = #t139{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t141 = nullable2 in let final self::Class2 #t142 = #t140.{self::Class2::[]}(#t141) in let final void #t143 = #t140.{self::Class2::[]=}(#t141, #t142.{self::Class2::+}(1)) in #t142;
- let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t145 = #t144{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t146 = nullable2 in let final self::Class2 #t147 = #t145.{self::Class2::[]}(#t146).{self::Class2::+}(1) in let final void #t148 = #t145.{self::Class2::[]=}(#t146, #t147) in #t147;
- nullable2 = let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t150 = #t149{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t151 = nullable2 in let final self::Class2 #t152 = #t150.{self::Class2::[]}(#t151).{self::Class2::+}(1) in let final void #t153 = #t150.{self::Class2::[]=}(#t151, #t152) in #t152;
- let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class2?} null : #t154{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2);
- let final self::Class1? #t155 = n1 in #t155.{core::Object::==}(null) ?{self::Class2?} null : #t155{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]=}(nullable2, new self::Class2::•());
- nullable2 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t157 = #t156{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t158 = nullable2 in let final self::Class2 #t159 = new self::Class2::•() in let final void #t160 = #t157.{self::Class2::[]=}(#t158, #t159) in #t159;
- let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t162 = #t161{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2) in #t162.{core::Object::==}(null) ?{self::Class2?} null : #t162{self::Class2}.{self::Class2::nonNullable2Method}();
- let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t164 = #t163{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t165 = nullable2 in #t164.{self::Class2::[]=}(#t165, #t164.{self::Class2::[]}(#t165).{self::Class2::+}(0));
- nullable2 = let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t167 = #t166{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t168 = nullable2 in let final self::Class2 #t169 = #t167.{self::Class2::[]}(#t168).{self::Class2::+}(0) in let final void #t170 = #t167.{self::Class2::[]=}(#t168, #t169) in #t169;
- let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t172 = #t171{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t173 = nullable2 in #t172.{self::Class2::[]=}(#t173, #t172.{self::Class2::[]}(#t173).{self::Class2::+}(1));
- nullable2 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t175 = #t174{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t176 = nullable2 in let final self::Class2 #t177 = #t175.{self::Class2::[]}(#t176) in let final void #t178 = #t175.{self::Class2::[]=}(#t176, #t177.{self::Class2::+}(1)) in #t177;
- let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t180 = #t179{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t181 = nullable2 in let final self::Class2 #t182 = #t180.{self::Class2::[]}(#t181).{self::Class2::+}(1) in let final void #t183 = #t180.{self::Class2::[]=}(#t181, #t182) in #t182;
- nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = #t184{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = #t185.{self::Class2::[]}(#t186).{self::Class2::+}(1) in let final void #t188 = #t185.{self::Class2::[]=}(#t186, #t187) in #t187;
- let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = #t189{self::Class1}.{self::Class1::[]}(nullable1) in #t190.{core::Object::==}(null) ?{self::Class1?} null : #t190{self::Class1}.{self::Class1::[]}(nullable1);
- let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = #t191{self::Class1}.{self::Class1::[]}(nullable1) in #t192.{core::Object::==}(null) ?{self::Class1?} null : #t192{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = #t193{self::Class1}.{self::Class1::[]}(nullable1) in #t194.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t195 = nullable1 in let final self::Class1 #t196 = new self::Class1::•() in let final void #t197 = #t194{self::Class1}.{self::Class1::[]=}(#t195, #t196) in #t196;
- let final self::Class1? #t198 = n1 in #t198.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t199 = #t198{self::Class1}.{self::Class1::[]}(nullable1) in #t199.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t200 = #t199{self::Class1}.{self::Class1::[]}(nullable1) in #t200.{core::Object::==}(null) ?{self::Class1?} null : #t200{self::Class1}.{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t201 = n1 in #t201.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t202 = #t201{self::Class1}.{self::Class1::[]}(nullable1) in #t202.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t203 = #t202{self::Class1}.{self::Class1::[]}(nullable1) in #t203.{core::Object::==}(null) ?{self::Class1?} null : #t203{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t204 = n1 in #t204.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t205 = #t204{self::Class1}.{self::Class1::[]}(nullable1) in #t205.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t206 = nullable1 in #t205{self::Class1}.{self::Class1::[]}(#t206).{core::Object::==}(null) ?{self::Class1?} #t205{self::Class1}.{self::Class1::[]=}(#t206, nullable1) : null;
- nullable1 = let final self::Class1? #t207 = n1 in #t207.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t208 = #t207{self::Class1}.{self::Class1::[]}(nullable1) in #t208.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t209 = nullable1 in let final self::Class1? #t210 = #t208{self::Class1}.{self::Class1::[]}(#t209) in #t210.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t211 = nullable1 in let final void #t212 = #t208{self::Class1}.{self::Class1::[]=}(#t209, #t211) in #t211 : #t210{self::Class1};
- let final self::Class3? #t213 = n3 in #t213.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t214 = #t213{self::Class3}.{self::Class3::[]}(nullable3) in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in #t214{self::Class2}.{self::Class2::[]=}(#t215, #t214{self::Class2}.{self::Class2::[]}(#t215).{self::Class2::+}(0));
- nullable2 = let final self::Class3? #t216 = n3 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = #t216{self::Class3}.{self::Class3::[]}(nullable3) in #t217.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t218 = nullable2 in let final self::Class2 #t219 = #t217{self::Class2}.{self::Class2::[]}(#t218).{self::Class2::+}(0) in let final void #t220 = #t217{self::Class2}.{self::Class2::[]=}(#t218, #t219) in #t219;
- let final self::Class3? #t221 = n3 in #t221.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t222 = #t221{self::Class3}.{self::Class3::[]}(nullable3) in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t223 = nullable2 in #t222{self::Class2}.{self::Class2::[]=}(#t223, #t222{self::Class2}.{self::Class2::[]}(#t223).{self::Class2::+}(1));
- nullable2 = let final self::Class3? #t224 = n3 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t225 = #t224{self::Class3}.{self::Class3::[]}(nullable3) in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t226 = nullable2 in let final self::Class2 #t227 = #t225{self::Class2}.{self::Class2::[]}(#t226) in let final void #t228 = #t225{self::Class2}.{self::Class2::[]=}(#t226, #t227.{self::Class2::+}(1)) in #t227;
- let final self::Class3? #t229 = n3 in #t229.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t230 = #t229{self::Class3}.{self::Class3::[]}(nullable3) in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t231 = nullable2 in let final self::Class2 #t232 = #t230{self::Class2}.{self::Class2::[]}(#t231).{self::Class2::+}(1) in let final void #t233 = #t230{self::Class2}.{self::Class2::[]=}(#t231, #t232) in #t232;
- nullable2 = let final self::Class3? #t234 = n3 in #t234.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t235 = #t234{self::Class3}.{self::Class3::[]}(nullable3) in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t236 = nullable2 in let final self::Class2 #t237 = #t235{self::Class2}.{self::Class2::[]}(#t236).{self::Class2::+}(1) in let final void #t238 = #t235{self::Class2}.{self::Class2::[]=}(#t236, #t237) in #t237;
+ let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : #t84{self::Class1}.{self::Class1::[]}(nullable1);
+ let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : #t85{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+ let final self::Class1? #t86 = n1 in #t86.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t87 = #t86{self::Class1}.{self::Class1::[]}(nullable1) in #t87.{core::Object::==}(null) ?{self::Class1?} null : #t87{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : #t88{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1);
+ let final self::Class1? #t89 = n1 in #t89.{core::Object::==}(null) ?{self::Class1?} null : #t89{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = #t90{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t92 = nullable1 in let final self::Class1 #t93 = new self::Class1::•() in let final void #t94 = #t91.{self::Class1::[]=}(#t92, #t93) in #t93;
+ let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t96 = #t95{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1) in #t96.{core::Object::==}(null) ?{self::Class1?} null : #t96{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t98 = #t97{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t99 = nullable2 in #t98.{self::Class2::[]=}(#t99, #t98.{self::Class2::[]}(#t99).{self::Class2::+}(0));
+ nullable2 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t101 = #t100{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t102 = nullable2 in let final self::Class2 #t103 = #t101.{self::Class2::[]}(#t102).{self::Class2::+}(0) in let final void #t104 = #t101.{self::Class2::[]=}(#t102, #t103) in #t103;
+ let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t106 = nullable1 in #t105{self::Class1}.{self::Class1::[]}(#t106).{core::Object::==}(null) ?{self::Class1?} #t105{self::Class1}.{self::Class1::[]=}(#t106, nullable1) : null;
+ nullable1 = let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t108 = nullable1 in let final self::Class1? #t109 = #t107{self::Class1}.{self::Class1::[]}(#t108) in #t109.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t110 = nullable1 in let final void #t111 = #t107{self::Class1}.{self::Class1::[]=}(#t108, #t110) in #t110 : #t109{self::Class1};
+ let final self::Class2? #t112 = n2 in #t112.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t113 = nullable2 in #t112{self::Class2}.{self::Class2::[]=}(#t113, #t112{self::Class2}.{self::Class2::[]}(#t113).{self::Class2::+}(0));
+ nullable2 = let final self::Class2? #t114 = n2 in #t114.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t115 = nullable2 in let final self::Class2 #t116 = #t114{self::Class2}.{self::Class2::[]}(#t115).{self::Class2::+}(0) in let final void #t117 = #t114{self::Class2}.{self::Class2::[]=}(#t115, #t116) in #t116;
+ let final self::Class2? #t118 = n2 in #t118.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t119 = nullable2 in #t118{self::Class2}.{self::Class2::[]=}(#t119, #t118{self::Class2}.{self::Class2::[]}(#t119).{self::Class2::+}(0));
+ nullable2 = let final self::Class2? #t120 = n2 in #t120.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t121 = nullable2 in let final self::Class2 #t122 = #t120{self::Class2}.{self::Class2::[]}(#t121).{self::Class2::+}(0) in let final void #t123 = #t120{self::Class2}.{self::Class2::[]=}(#t121, #t122) in #t122;
+ let final self::Class2? #t124 = n2 in #t124.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t125 = nullable2 in #t124{self::Class2}.{self::Class2::[]=}(#t125, #t124{self::Class2}.{self::Class2::[]}(#t125).{self::Class2::+}(1));
+ nullable2 = let final self::Class2? #t126 = n2 in #t126.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t127 = nullable2 in let final self::Class2 #t128 = #t126{self::Class2}.{self::Class2::[]}(#t127) in let final void #t129 = #t126{self::Class2}.{self::Class2::[]=}(#t127, #t128.{self::Class2::+}(1)) in #t128;
+ let final self::Class2? #t130 = n2 in #t130.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t131 = nullable2 in let final self::Class2 #t132 = #t130{self::Class2}.{self::Class2::[]}(#t131).{self::Class2::+}(1) in let final void #t133 = #t130{self::Class2}.{self::Class2::[]=}(#t131, #t132) in #t132;
+ nullable2 = let final self::Class2? #t134 = n2 in #t134.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t135 = nullable2 in let final self::Class2 #t136 = #t134{self::Class2}.{self::Class2::[]}(#t135).{self::Class2::+}(1) in let final void #t137 = #t134{self::Class2}.{self::Class2::[]=}(#t135, #t136) in #t136;
+ let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t139 = #t138{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t140 = nullable2 in #t139.{self::Class2::[]=}(#t140, #t139.{self::Class2::[]}(#t140).{self::Class2::+}(1));
+ nullable2 = let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t142 = #t141{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t143 = nullable2 in let final self::Class2 #t144 = #t142.{self::Class2::[]}(#t143) in let final void #t145 = #t142.{self::Class2::[]=}(#t143, #t144.{self::Class2::+}(1)) in #t144;
+ let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t147 = #t146{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t148 = nullable2 in let final self::Class2 #t149 = #t147.{self::Class2::[]}(#t148).{self::Class2::+}(1) in let final void #t150 = #t147.{self::Class2::[]=}(#t148, #t149) in #t149;
+ nullable2 = let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t152 = #t151{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t153 = nullable2 in let final self::Class2 #t154 = #t152.{self::Class2::[]}(#t153).{self::Class2::+}(1) in let final void #t155 = #t152.{self::Class2::[]=}(#t153, #t154) in #t154;
+ let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class2?} null : #t156{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2);
+ let final self::Class1? #t157 = n1 in #t157.{core::Object::==}(null) ?{self::Class2?} null : #t157{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]=}(nullable2, new self::Class2::•());
+ nullable2 = let final self::Class1? #t158 = n1 in #t158.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t159 = #t158{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t160 = nullable2 in let final self::Class2 #t161 = new self::Class2::•() in let final void #t162 = #t159.{self::Class2::[]=}(#t160, #t161) in #t161;
+ let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t164 = #t163{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2) in #t164.{core::Object::==}(null) ?{self::Class2?} null : #t164{self::Class2}.{self::Class2::nonNullable2Method}();
+ let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t166 = #t165{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t167 = nullable2 in #t166.{self::Class2::[]=}(#t167, #t166.{self::Class2::[]}(#t167).{self::Class2::+}(0));
+ nullable2 = let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t169 = #t168{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t170 = nullable2 in let final self::Class2 #t171 = #t169.{self::Class2::[]}(#t170).{self::Class2::+}(0) in let final void #t172 = #t169.{self::Class2::[]=}(#t170, #t171) in #t171;
+ let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t174 = #t173{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t175 = nullable2 in #t174.{self::Class2::[]=}(#t175, #t174.{self::Class2::[]}(#t175).{self::Class2::+}(1));
+ nullable2 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t177 = #t176{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t178 = nullable2 in let final self::Class2 #t179 = #t177.{self::Class2::[]}(#t178) in let final void #t180 = #t177.{self::Class2::[]=}(#t178, #t179.{self::Class2::+}(1)) in #t179;
+ let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = #t181{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t183 = nullable2 in let final self::Class2 #t184 = #t182.{self::Class2::[]}(#t183).{self::Class2::+}(1) in let final void #t185 = #t182.{self::Class2::[]=}(#t183, #t184) in #t184;
+ nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = #t186{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = #t187.{self::Class2::[]}(#t188).{self::Class2::+}(1) in let final void #t190 = #t187.{self::Class2::[]=}(#t188, #t189) in #t189;
+ let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = #t191{self::Class1}.{self::Class1::[]}(nullable1) in #t192.{core::Object::==}(null) ?{self::Class1?} null : #t192{self::Class1}.{self::Class1::[]}(nullable1);
+ let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = #t193{self::Class1}.{self::Class1::[]}(nullable1) in #t194.{core::Object::==}(null) ?{self::Class1?} null : #t194{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t195 = n1 in #t195.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t196 = #t195{self::Class1}.{self::Class1::[]}(nullable1) in #t196.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t197 = nullable1 in let final self::Class1 #t198 = new self::Class1::•() in let final void #t199 = #t196{self::Class1}.{self::Class1::[]=}(#t197, #t198) in #t198;
+ let final self::Class1? #t200 = n1 in #t200.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t201 = #t200{self::Class1}.{self::Class1::[]}(nullable1) in #t201.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t202 = #t201{self::Class1}.{self::Class1::[]}(nullable1) in #t202.{core::Object::==}(null) ?{self::Class1?} null : #t202{self::Class1}.{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t203 = n1 in #t203.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t204 = #t203{self::Class1}.{self::Class1::[]}(nullable1) in #t204.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t205 = #t204{self::Class1}.{self::Class1::[]}(nullable1) in #t205.{core::Object::==}(null) ?{self::Class1?} null : #t205{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t206 = n1 in #t206.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t207 = #t206{self::Class1}.{self::Class1::[]}(nullable1) in #t207.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t208 = nullable1 in #t207{self::Class1}.{self::Class1::[]}(#t208).{core::Object::==}(null) ?{self::Class1?} #t207{self::Class1}.{self::Class1::[]=}(#t208, nullable1) : null;
+ nullable1 = let final self::Class1? #t209 = n1 in #t209.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t210 = #t209{self::Class1}.{self::Class1::[]}(nullable1) in #t210.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t211 = nullable1 in let final self::Class1? #t212 = #t210{self::Class1}.{self::Class1::[]}(#t211) in #t212.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t213 = nullable1 in let final void #t214 = #t210{self::Class1}.{self::Class1::[]=}(#t211, #t213) in #t213 : #t212{self::Class1};
+ let final self::Class3? #t215 = n3 in #t215.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t216 = #t215{self::Class3}.{self::Class3::[]}(nullable3) in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in #t216{self::Class2}.{self::Class2::[]=}(#t217, #t216{self::Class2}.{self::Class2::[]}(#t217).{self::Class2::+}(0));
+ nullable2 = let final self::Class3? #t218 = n3 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = #t218{self::Class3}.{self::Class3::[]}(nullable3) in #t219.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t220 = nullable2 in let final self::Class2 #t221 = #t219{self::Class2}.{self::Class2::[]}(#t220).{self::Class2::+}(0) in let final void #t222 = #t219{self::Class2}.{self::Class2::[]=}(#t220, #t221) in #t221;
+ let final self::Class3? #t223 = n3 in #t223.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t224 = #t223{self::Class3}.{self::Class3::[]}(nullable3) in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t225 = nullable2 in #t224{self::Class2}.{self::Class2::[]=}(#t225, #t224{self::Class2}.{self::Class2::[]}(#t225).{self::Class2::+}(1));
+ nullable2 = let final self::Class3? #t226 = n3 in #t226.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t227 = #t226{self::Class3}.{self::Class3::[]}(nullable3) in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t228 = nullable2 in let final self::Class2 #t229 = #t227{self::Class2}.{self::Class2::[]}(#t228) in let final void #t230 = #t227{self::Class2}.{self::Class2::[]=}(#t228, #t229.{self::Class2::+}(1)) in #t229;
+ let final self::Class3? #t231 = n3 in #t231.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t232 = #t231{self::Class3}.{self::Class3::[]}(nullable3) in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t233 = nullable2 in let final self::Class2 #t234 = #t232{self::Class2}.{self::Class2::[]}(#t233).{self::Class2::+}(1) in let final void #t235 = #t232{self::Class2}.{self::Class2::[]=}(#t233, #t234) in #t234;
+ nullable2 = let final self::Class3? #t236 = n3 in #t236.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t237 = #t236{self::Class3}.{self::Class3::[]}(nullable3) in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t238 = nullable2 in let final self::Class2 #t239 = #t237{self::Class2}.{self::Class2::[]}(#t238).{self::Class2::+}(1) in let final void #t240 = #t237{self::Class2}.{self::Class2::[]=}(#t238, #t239) in #t239;
}
static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
self::Class2? nullable2 = n2;
- self::throws(() → self::Class1? => (let final self::Class1? #t239 = n1 in #t239.{core::Object::==}(null) ?{self::Class1?} null : #t239{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
- self::throws(() → self::Class1? => (let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class1?} null : #t240{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
- let final self::Class2? #t241 = n2 in #t241.{core::Object::==}(null) ?{self::Class2?} null : #t241.{self::Class2::nonNullable2} = #t241.{self::Class2::nonNullable2}.{self::Class2::+}(0);
- nullable2 = let final self::Class2? #t242 = n2 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = #t242.{self::Class2::nonNullable2}.{self::Class2::+}(0) in let final void #t244 = #t242.{self::Class2::nonNullable2} = #t243 in #t243;
- let final self::Class2? #t245 = n2 in #t245.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t246 = #t245{self::Class2}.{self::Class2::nonNullable2} in #t246.{self::Class2::nonNullable2} = #t246.{self::Class2::nonNullable2}.{self::Class2::+}(0);
- nullable2 = let final self::Class2? #t247 = n2 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t248 = #t247{self::Class2}.{self::Class2::nonNullable2} in #t248.{self::Class2::nonNullable2} = #t248.{self::Class2::nonNullable2}.{self::Class2::+}(0);
- let final self::Class2? #t249 = n2 in #t249.{core::Object::==}(null) ?{self::Class2?} null : #t249.{self::Class2::nonNullable2} = #t249.{self::Class2::nonNullable2}.{self::Class2::+}(1);
- nullable2 = let final self::Class2? #t250 = n2 in #t250.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t251 = #t250.{self::Class2::nonNullable2} in let final void #t252 = #t250.{self::Class2::nonNullable2} = #t251.{self::Class2::+}(1) in #t251;
- let final self::Class2? #t253 = n2 in #t253.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t254 = #t253.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t255 = #t253.{self::Class2::nonNullable2} = #t254 in #t254;
- nullable2 = let final self::Class2? #t256 = n2 in #t256.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t257 = #t256.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t258 = #t256.{self::Class2::nonNullable2} = #t257 in #t257;
+ self::throws(() → self::Class1? => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+ throws(() => n1?.nonNullable1 + 0);
+ ^" in (let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class1?} null : #t242{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
+ self::throws(() → self::Class1? => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+ throws(() => -n1?.nonNullable1);
+ ^" in (let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class1?} null : #t244{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
+ let final self::Class2? #t245 = n2 in #t245.{core::Object::==}(null) ?{self::Class2?} null : #t245.{self::Class2::nonNullable2} = #t245.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+ nullable2 = let final self::Class2? #t246 = n2 in #t246.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t247 = #t246.{self::Class2::nonNullable2}.{self::Class2::+}(0) in let final void #t248 = #t246.{self::Class2::nonNullable2} = #t247 in #t247;
+ let final self::Class2? #t249 = n2 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = #t249{self::Class2}.{self::Class2::nonNullable2} in #t250.{self::Class2::nonNullable2} = #t250.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+ nullable2 = let final self::Class2? #t251 = n2 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = #t251{self::Class2}.{self::Class2::nonNullable2} in #t252.{self::Class2::nonNullable2} = #t252.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+ let final self::Class2? #t253 = n2 in #t253.{core::Object::==}(null) ?{self::Class2?} null : #t253.{self::Class2::nonNullable2} = #t253.{self::Class2::nonNullable2}.{self::Class2::+}(1);
+ nullable2 = let final self::Class2? #t254 = n2 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = #t254.{self::Class2::nonNullable2} in let final void #t256 = #t254.{self::Class2::nonNullable2} = #t255.{self::Class2::+}(1) in #t255;
+ let final self::Class2? #t257 = n2 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = #t257.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t259 = #t257.{self::Class2::nonNullable2} = #t258 in #t258;
+ nullable2 = let final self::Class2? #t260 = n2 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = #t260.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t262 = #t260.{self::Class2::nonNullable2} = #t261 in #t261;
}
static method ifNull(self::Class1? n1) → void {
self::Class1? nullable1 = n1;
- let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class1?} null : #t259.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t259.{self::Class1::nullable1} = n1{self::Class1} : null;
- n1 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t261 = #t260.{self::Class1::nullable1} in #t261.{core::Object::==}(null) ?{self::Class1} #t260.{self::Class1::nullable1} = n1{self::Class1} : #t261{self::Class1};
- let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t263 = #t262{self::Class1}.{self::Class1::nonNullable1} in #t263{self::Class1}.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t263{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : null;
- n1 = let final self::Class1? #t264 = n1 in #t264.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t265 = #t264{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t266 = #t265{self::Class1}.{self::Class1::nullable1} in #t266.{core::Object::==}(null) ?{self::Class1} #t265{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : #t266{self::Class1};
- let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t268 = #t267{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t269 = n1{self::Class1} in #t268.{self::Class1::[]}(#t269).{core::Object::==}(null) ?{self::Class1} #t268.{self::Class1::[]=}(#t269, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t271 = #t270{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t272 = n1{self::Class1} in let final self::Class1? #t273 = #t271.{self::Class1::[]}(#t272) in #t273.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t274 = n1{self::Class1} in let final void #t275 = #t271.{self::Class1::[]=}(#t272, #t274) in #t274 : #t273{self::Class1};
+ let final self::Class1? #t263 = n1 in #t263.{core::Object::==}(null) ?{self::Class1?} null : #t263.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t263.{self::Class1::nullable1} = n1{self::Class1} : null;
+ n1 = let final self::Class1? #t264 = n1 in #t264.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t265 = #t264.{self::Class1::nullable1} in #t265.{core::Object::==}(null) ?{self::Class1} #t264.{self::Class1::nullable1} = n1{self::Class1} : #t265{self::Class1};
+ let final self::Class1? #t266 = n1 in #t266.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t267 = #t266{self::Class1}.{self::Class1::nonNullable1} in #t267{self::Class1}.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t267{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : null;
+ n1 = let final self::Class1? #t268 = n1 in #t268.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t269 = #t268{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t270 = #t269{self::Class1}.{self::Class1::nullable1} in #t270.{core::Object::==}(null) ?{self::Class1} #t269{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : #t270{self::Class1};
+ let final self::Class1? #t271 = n1 in #t271.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t272 = #t271{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t273 = n1{self::Class1} in #t272.{self::Class1::[]}(#t273).{core::Object::==}(null) ?{self::Class1} #t272.{self::Class1::[]=}(#t273, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t274 = n1 in #t274.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t275 = #t274{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t276 = n1{self::Class1} in let final self::Class1? #t277 = #t275.{self::Class1::[]}(#t276) in #t277.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t278 = n1{self::Class1} in let final void #t279 = #t275.{self::Class1::[]=}(#t276, #t278) in #t278 : #t277{self::Class1};
}
static method throws(() → void f) → void {
try {
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.transformed.expect
index 1667166..4b8eb0a 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.transformed.expect
@@ -2,24 +2,24 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
// Try accessing using ?. instead.
// throws(() => (n1?.nullable1 = new Class1()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
// Try accessing using ?. instead.
// throws(() => (n1?.nonNullable1Method()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
// throws(() => n1?.nonNullable1 + 0);
// ^
//
-// pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
// throws(() => -n1?.nonNullable1);
// ^
@@ -110,139 +110,153 @@
let final self::Class1? #t11 = n1 in #t11.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t12 = #t11{self::Class1}.{self::Class1::nullable1} in #t12.{core::Object::==}(null) ?{self::Class1?} null : #t12{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = #t13{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t14.{core::Object::==}(null) ?{self::Class1?} null : #t14{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
let final self::Class1? #t15 = let final self::Class1? #t16 = n1 in #t16.{core::Object::==}(null) ?{self::Class1?} null : #t16{self::Class1}.{self::Class1::nullable1} in #t15.{core::Object::==}(null) ?{self::Class1?} null : #t15{self::Class1}.{self::Class1::nullable1};
- self::throws(() → self::Class1? => (let final self::Class1? #t17 = n1 in #t17.{core::Object::==}(null) ?{self::Class1?} null : #t17{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
- self::throws(() → self::Class1? => (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nonNullable1Method}()).{self::Class1::nullable1});
- nullable1 = let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : #t19{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t21 = #t20{self::Class1}.{self::Class1::nullable1} in #t21.{core::Object::==}(null) ?{self::Class1?} null : #t21{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t23 = #t22{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t23.{core::Object::==}(null) ?{self::Class1?} null : #t23{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t25 = #t24{self::Class1}.{self::Class1::nullable1} in #t25.{core::Object::==}(null) ?{self::Class1?} null : #t25{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : #t26{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t27 = n1 in #t27.{core::Object::==}(null) ?{self::Class1?} null : #t27{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : #t28{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t29 = n1 in #t29.{core::Object::==}(null) ?{self::Class1?} null : #t29{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : #t30{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t31 = n1 in #t31.{core::Object::==}(null) ?{self::Class1?} null : #t31{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : #t32{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- let final self::Class1? #t33 = n1 in #t33.{core::Object::==}(null) ?{self::Class1?} null : #t33{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : #t34{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t35 = n1 in #t35.{core::Object::==}(null) ?{self::Class1?} null : #t35{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1};
- let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : #t36{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : #t37{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t39 = #t38{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t39.{core::Object::==}(null) ?{self::Class1?} null : #t39{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : #t40{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t41 = n1 in #t41.{core::Object::==}(null) ?{self::Class1?} null : #t41{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
- let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : #t42{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : #t43{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t44 = n1 in #t44.{core::Object::==}(null) ?{self::Class1?} null : #t44{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : #t45{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t46 = n1 in #t46.{core::Object::==}(null) ?{self::Class1?} null : #t46{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1};
- let final self::Class1? #t47 = n1 in #t47.{core::Object::==}(null) ?{self::Class1?} null : #t47{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : #t48{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : #t49{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : #t50{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : #t51{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : #t52{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : #t53{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : #t54{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : #t55{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : #t56{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : #t57{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : #t58{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : #t59{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : #t60{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t61 = n1 in #t61.{core::Object::==}(null) ?{self::Class1?} null : #t61{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : #t62{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
- let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : #t63{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : #t64{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : #t65{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : #t66{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t67 = n1 in #t67.{core::Object::==}(null) ?{self::Class1?} null : #t67{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : #t68{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : #t69{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t70 = n1 in #t70.{core::Object::==}(null) ?{self::Class1?} null : #t70{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : #t71{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- nullable1 = let final self::Class1? #t72 = n1 in #t72.{core::Object::==}(null) ?{self::Class1?} null : #t72{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- let final self::Class1? #t73 = n1 in #t73.{core::Object::==}(null) ?{self::Class1?} null : #t73{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- nullable1 = let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : #t74{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : #t75{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : #t76{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : #t77{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
- let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : #t78{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
- let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : #t79{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
- let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t81 = #t80{self::Class1}.{self::Class1::nonNullable1Method}() in #t81.{core::Object::==}(null) ?{self::Class1?} null : #t81{self::Class1}.{self::Class1::nonNullable1Method}();
+ self::throws(() → self::Class1? => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+Try accessing using ?. instead.
+ throws(() => (n1?.nullable1 = new Class1()).nullable1);
+ ^^^^^^^^^" in (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
+ self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+Try accessing using ?. instead.
+ throws(() => (n1?.nonNullable1Method()).nullable1);
+ ^^^^^^^^^" in (let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : #t20{self::Class1}.{self::Class1::nonNullable1Method}()).{self::Class1::nullable1});
+ nullable1 = let final self::Class1? #t21 = n1 in #t21.{core::Object::==}(null) ?{self::Class1?} null : #t21{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t23 = #t22{self::Class1}.{self::Class1::nullable1} in #t23.{core::Object::==}(null) ?{self::Class1?} null : #t23{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t25 = #t24{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t25.{core::Object::==}(null) ?{self::Class1?} null : #t25{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = #t26{self::Class1}.{self::Class1::nullable1} in #t27.{core::Object::==}(null) ?{self::Class1?} null : #t27{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : #t28{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t29 = n1 in #t29.{core::Object::==}(null) ?{self::Class1?} null : #t29{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : #t30{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t31 = n1 in #t31.{core::Object::==}(null) ?{self::Class1?} null : #t31{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : #t32{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t33 = n1 in #t33.{core::Object::==}(null) ?{self::Class1?} null : #t33{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : #t34{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ let final self::Class1? #t35 = n1 in #t35.{core::Object::==}(null) ?{self::Class1?} null : #t35{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : #t36{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : #t37{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1};
+ let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : #t38{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : #t39{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t41 = #t40{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t41.{core::Object::==}(null) ?{self::Class1?} null : #t41{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : #t42{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : #t43{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+ let final self::Class1? #t44 = n1 in #t44.{core::Object::==}(null) ?{self::Class1?} null : #t44{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : #t45{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t46 = n1 in #t46.{core::Object::==}(null) ?{self::Class1?} null : #t46{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t47 = n1 in #t47.{core::Object::==}(null) ?{self::Class1?} null : #t47{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : #t48{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+ let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : #t49{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : #t50{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : #t51{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : #t52{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : #t53{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : #t54{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : #t55{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : #t56{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : #t57{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : #t58{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : #t59{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : #t60{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t61 = n1 in #t61.{core::Object::==}(null) ?{self::Class1?} null : #t61{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : #t62{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : #t63{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : #t64{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+ let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : #t65{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : #t66{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t67 = n1 in #t67.{core::Object::==}(null) ?{self::Class1?} null : #t67{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : #t68{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : #t69{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ let final self::Class1? #t70 = n1 in #t70.{core::Object::==}(null) ?{self::Class1?} null : #t70{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : #t71{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t72 = n1 in #t72.{core::Object::==}(null) ?{self::Class1?} null : #t72{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t73 = n1 in #t73.{core::Object::==}(null) ?{self::Class1?} null : #t73{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ nullable1 = let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : #t74{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : #t75{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ nullable1 = let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : #t76{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : #t77{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : #t78{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : #t79{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+ let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : #t80{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+ let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : #t81{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = #t82{self::Class1}.{self::Class1::nonNullable1Method}() in #t83.{core::Object::==}(null) ?{self::Class1?} null : #t83{self::Class1}.{self::Class1::nonNullable1Method}();
}
static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
self::Class1? nullable1 = n1;
self::Class2? nullable2 = n2;
self::Class3? nullable3 = n3;
- let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : #t82{self::Class1}.{self::Class1::[]}(nullable1);
- let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : #t83{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
- let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = #t84{self::Class1}.{self::Class1::[]}(nullable1) in #t85.{core::Object::==}(null) ?{self::Class1?} null : #t85{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t86 = n1 in #t86.{core::Object::==}(null) ?{self::Class1?} null : #t86{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1);
- let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : #t87{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = #t88{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t90 = nullable1 in let final self::Class1 #t91 = new self::Class1::•() in let final void #t92 = #t89.{self::Class1::[]=}(#t90, #t91) in #t91;
- let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t94 = #t93{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1) in #t94.{core::Object::==}(null) ?{self::Class1?} null : #t94{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t96 = #t95{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t97 = nullable2 in #t96.{self::Class2::[]=}(#t97, #t96.{self::Class2::[]}(#t97).{self::Class2::+}(0));
- nullable2 = let final self::Class1? #t98 = n1 in #t98.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t99 = #t98{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t100 = nullable2 in let final self::Class2 #t101 = #t99.{self::Class2::[]}(#t100).{self::Class2::+}(0) in let final void #t102 = #t99.{self::Class2::[]=}(#t100, #t101) in #t101;
- let final self::Class1? #t103 = n1 in #t103.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t104 = nullable1 in #t103{self::Class1}.{self::Class1::[]}(#t104).{core::Object::==}(null) ?{self::Class1?} #t103{self::Class1}.{self::Class1::[]=}(#t104, nullable1) : null;
- nullable1 = let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t106 = nullable1 in let final self::Class1? #t107 = #t105{self::Class1}.{self::Class1::[]}(#t106) in #t107.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t108 = nullable1 in let final void #t109 = #t105{self::Class1}.{self::Class1::[]=}(#t106, #t108) in #t108 : #t107{self::Class1};
- let final self::Class2? #t110 = n2 in #t110.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t111 = nullable2 in #t110{self::Class2}.{self::Class2::[]=}(#t111, #t110{self::Class2}.{self::Class2::[]}(#t111).{self::Class2::+}(0));
- nullable2 = let final self::Class2? #t112 = n2 in #t112.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t113 = nullable2 in let final self::Class2 #t114 = #t112{self::Class2}.{self::Class2::[]}(#t113).{self::Class2::+}(0) in let final void #t115 = #t112{self::Class2}.{self::Class2::[]=}(#t113, #t114) in #t114;
- let final self::Class2? #t116 = n2 in #t116.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t117 = nullable2 in #t116{self::Class2}.{self::Class2::[]=}(#t117, #t116{self::Class2}.{self::Class2::[]}(#t117).{self::Class2::+}(0));
- nullable2 = let final self::Class2? #t118 = n2 in #t118.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t119 = nullable2 in let final self::Class2 #t120 = #t118{self::Class2}.{self::Class2::[]}(#t119).{self::Class2::+}(0) in let final void #t121 = #t118{self::Class2}.{self::Class2::[]=}(#t119, #t120) in #t120;
- let final self::Class2? #t122 = n2 in #t122.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t123 = nullable2 in #t122{self::Class2}.{self::Class2::[]=}(#t123, #t122{self::Class2}.{self::Class2::[]}(#t123).{self::Class2::+}(1));
- nullable2 = let final self::Class2? #t124 = n2 in #t124.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t125 = nullable2 in let final self::Class2 #t126 = #t124{self::Class2}.{self::Class2::[]}(#t125) in let final void #t127 = #t124{self::Class2}.{self::Class2::[]=}(#t125, #t126.{self::Class2::+}(1)) in #t126;
- let final self::Class2? #t128 = n2 in #t128.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t129 = nullable2 in let final self::Class2 #t130 = #t128{self::Class2}.{self::Class2::[]}(#t129).{self::Class2::+}(1) in let final void #t131 = #t128{self::Class2}.{self::Class2::[]=}(#t129, #t130) in #t130;
- nullable2 = let final self::Class2? #t132 = n2 in #t132.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t133 = nullable2 in let final self::Class2 #t134 = #t132{self::Class2}.{self::Class2::[]}(#t133).{self::Class2::+}(1) in let final void #t135 = #t132{self::Class2}.{self::Class2::[]=}(#t133, #t134) in #t134;
- let final self::Class1? #t136 = n1 in #t136.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t137 = #t136{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t138 = nullable2 in #t137.{self::Class2::[]=}(#t138, #t137.{self::Class2::[]}(#t138).{self::Class2::+}(1));
- nullable2 = let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t140 = #t139{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t141 = nullable2 in let final self::Class2 #t142 = #t140.{self::Class2::[]}(#t141) in let final void #t143 = #t140.{self::Class2::[]=}(#t141, #t142.{self::Class2::+}(1)) in #t142;
- let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t145 = #t144{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t146 = nullable2 in let final self::Class2 #t147 = #t145.{self::Class2::[]}(#t146).{self::Class2::+}(1) in let final void #t148 = #t145.{self::Class2::[]=}(#t146, #t147) in #t147;
- nullable2 = let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t150 = #t149{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t151 = nullable2 in let final self::Class2 #t152 = #t150.{self::Class2::[]}(#t151).{self::Class2::+}(1) in let final void #t153 = #t150.{self::Class2::[]=}(#t151, #t152) in #t152;
- let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class2?} null : #t154{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2);
- let final self::Class1? #t155 = n1 in #t155.{core::Object::==}(null) ?{self::Class2?} null : #t155{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]=}(nullable2, new self::Class2::•());
- nullable2 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t157 = #t156{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t158 = nullable2 in let final self::Class2 #t159 = new self::Class2::•() in let final void #t160 = #t157.{self::Class2::[]=}(#t158, #t159) in #t159;
- let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t162 = #t161{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2) in #t162.{core::Object::==}(null) ?{self::Class2?} null : #t162{self::Class2}.{self::Class2::nonNullable2Method}();
- let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t164 = #t163{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t165 = nullable2 in #t164.{self::Class2::[]=}(#t165, #t164.{self::Class2::[]}(#t165).{self::Class2::+}(0));
- nullable2 = let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t167 = #t166{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t168 = nullable2 in let final self::Class2 #t169 = #t167.{self::Class2::[]}(#t168).{self::Class2::+}(0) in let final void #t170 = #t167.{self::Class2::[]=}(#t168, #t169) in #t169;
- let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t172 = #t171{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t173 = nullable2 in #t172.{self::Class2::[]=}(#t173, #t172.{self::Class2::[]}(#t173).{self::Class2::+}(1));
- nullable2 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t175 = #t174{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t176 = nullable2 in let final self::Class2 #t177 = #t175.{self::Class2::[]}(#t176) in let final void #t178 = #t175.{self::Class2::[]=}(#t176, #t177.{self::Class2::+}(1)) in #t177;
- let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t180 = #t179{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t181 = nullable2 in let final self::Class2 #t182 = #t180.{self::Class2::[]}(#t181).{self::Class2::+}(1) in let final void #t183 = #t180.{self::Class2::[]=}(#t181, #t182) in #t182;
- nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = #t184{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = #t185.{self::Class2::[]}(#t186).{self::Class2::+}(1) in let final void #t188 = #t185.{self::Class2::[]=}(#t186, #t187) in #t187;
- let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = #t189{self::Class1}.{self::Class1::[]}(nullable1) in #t190.{core::Object::==}(null) ?{self::Class1?} null : #t190{self::Class1}.{self::Class1::[]}(nullable1);
- let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = #t191{self::Class1}.{self::Class1::[]}(nullable1) in #t192.{core::Object::==}(null) ?{self::Class1?} null : #t192{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = #t193{self::Class1}.{self::Class1::[]}(nullable1) in #t194.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t195 = nullable1 in let final self::Class1 #t196 = new self::Class1::•() in let final void #t197 = #t194{self::Class1}.{self::Class1::[]=}(#t195, #t196) in #t196;
- let final self::Class1? #t198 = n1 in #t198.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t199 = #t198{self::Class1}.{self::Class1::[]}(nullable1) in #t199.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t200 = #t199{self::Class1}.{self::Class1::[]}(nullable1) in #t200.{core::Object::==}(null) ?{self::Class1?} null : #t200{self::Class1}.{self::Class1::nonNullable1Method}();
- nullable1 = let final self::Class1? #t201 = n1 in #t201.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t202 = #t201{self::Class1}.{self::Class1::[]}(nullable1) in #t202.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t203 = #t202{self::Class1}.{self::Class1::[]}(nullable1) in #t203.{core::Object::==}(null) ?{self::Class1?} null : #t203{self::Class1}.{self::Class1::nonNullable1Method}();
- let final self::Class1? #t204 = n1 in #t204.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t205 = #t204{self::Class1}.{self::Class1::[]}(nullable1) in #t205.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t206 = nullable1 in #t205{self::Class1}.{self::Class1::[]}(#t206).{core::Object::==}(null) ?{self::Class1?} #t205{self::Class1}.{self::Class1::[]=}(#t206, nullable1) : null;
- nullable1 = let final self::Class1? #t207 = n1 in #t207.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t208 = #t207{self::Class1}.{self::Class1::[]}(nullable1) in #t208.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t209 = nullable1 in let final self::Class1? #t210 = #t208{self::Class1}.{self::Class1::[]}(#t209) in #t210.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t211 = nullable1 in let final void #t212 = #t208{self::Class1}.{self::Class1::[]=}(#t209, #t211) in #t211 : #t210{self::Class1};
- let final self::Class3? #t213 = n3 in #t213.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t214 = #t213{self::Class3}.{self::Class3::[]}(nullable3) in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in #t214{self::Class2}.{self::Class2::[]=}(#t215, #t214{self::Class2}.{self::Class2::[]}(#t215).{self::Class2::+}(0));
- nullable2 = let final self::Class3? #t216 = n3 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = #t216{self::Class3}.{self::Class3::[]}(nullable3) in #t217.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t218 = nullable2 in let final self::Class2 #t219 = #t217{self::Class2}.{self::Class2::[]}(#t218).{self::Class2::+}(0) in let final void #t220 = #t217{self::Class2}.{self::Class2::[]=}(#t218, #t219) in #t219;
- let final self::Class3? #t221 = n3 in #t221.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t222 = #t221{self::Class3}.{self::Class3::[]}(nullable3) in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t223 = nullable2 in #t222{self::Class2}.{self::Class2::[]=}(#t223, #t222{self::Class2}.{self::Class2::[]}(#t223).{self::Class2::+}(1));
- nullable2 = let final self::Class3? #t224 = n3 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t225 = #t224{self::Class3}.{self::Class3::[]}(nullable3) in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t226 = nullable2 in let final self::Class2 #t227 = #t225{self::Class2}.{self::Class2::[]}(#t226) in let final void #t228 = #t225{self::Class2}.{self::Class2::[]=}(#t226, #t227.{self::Class2::+}(1)) in #t227;
- let final self::Class3? #t229 = n3 in #t229.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t230 = #t229{self::Class3}.{self::Class3::[]}(nullable3) in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t231 = nullable2 in let final self::Class2 #t232 = #t230{self::Class2}.{self::Class2::[]}(#t231).{self::Class2::+}(1) in let final void #t233 = #t230{self::Class2}.{self::Class2::[]=}(#t231, #t232) in #t232;
- nullable2 = let final self::Class3? #t234 = n3 in #t234.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t235 = #t234{self::Class3}.{self::Class3::[]}(nullable3) in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t236 = nullable2 in let final self::Class2 #t237 = #t235{self::Class2}.{self::Class2::[]}(#t236).{self::Class2::+}(1) in let final void #t238 = #t235{self::Class2}.{self::Class2::[]=}(#t236, #t237) in #t237;
+ let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : #t84{self::Class1}.{self::Class1::[]}(nullable1);
+ let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : #t85{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+ let final self::Class1? #t86 = n1 in #t86.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t87 = #t86{self::Class1}.{self::Class1::[]}(nullable1) in #t87.{core::Object::==}(null) ?{self::Class1?} null : #t87{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : #t88{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1);
+ let final self::Class1? #t89 = n1 in #t89.{core::Object::==}(null) ?{self::Class1?} null : #t89{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = #t90{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t92 = nullable1 in let final self::Class1 #t93 = new self::Class1::•() in let final void #t94 = #t91.{self::Class1::[]=}(#t92, #t93) in #t93;
+ let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t96 = #t95{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1) in #t96.{core::Object::==}(null) ?{self::Class1?} null : #t96{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t98 = #t97{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t99 = nullable2 in #t98.{self::Class2::[]=}(#t99, #t98.{self::Class2::[]}(#t99).{self::Class2::+}(0));
+ nullable2 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t101 = #t100{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t102 = nullable2 in let final self::Class2 #t103 = #t101.{self::Class2::[]}(#t102).{self::Class2::+}(0) in let final void #t104 = #t101.{self::Class2::[]=}(#t102, #t103) in #t103;
+ let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t106 = nullable1 in #t105{self::Class1}.{self::Class1::[]}(#t106).{core::Object::==}(null) ?{self::Class1?} #t105{self::Class1}.{self::Class1::[]=}(#t106, nullable1) : null;
+ nullable1 = let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t108 = nullable1 in let final self::Class1? #t109 = #t107{self::Class1}.{self::Class1::[]}(#t108) in #t109.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t110 = nullable1 in let final void #t111 = #t107{self::Class1}.{self::Class1::[]=}(#t108, #t110) in #t110 : #t109{self::Class1};
+ let final self::Class2? #t112 = n2 in #t112.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t113 = nullable2 in #t112{self::Class2}.{self::Class2::[]=}(#t113, #t112{self::Class2}.{self::Class2::[]}(#t113).{self::Class2::+}(0));
+ nullable2 = let final self::Class2? #t114 = n2 in #t114.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t115 = nullable2 in let final self::Class2 #t116 = #t114{self::Class2}.{self::Class2::[]}(#t115).{self::Class2::+}(0) in let final void #t117 = #t114{self::Class2}.{self::Class2::[]=}(#t115, #t116) in #t116;
+ let final self::Class2? #t118 = n2 in #t118.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t119 = nullable2 in #t118{self::Class2}.{self::Class2::[]=}(#t119, #t118{self::Class2}.{self::Class2::[]}(#t119).{self::Class2::+}(0));
+ nullable2 = let final self::Class2? #t120 = n2 in #t120.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t121 = nullable2 in let final self::Class2 #t122 = #t120{self::Class2}.{self::Class2::[]}(#t121).{self::Class2::+}(0) in let final void #t123 = #t120{self::Class2}.{self::Class2::[]=}(#t121, #t122) in #t122;
+ let final self::Class2? #t124 = n2 in #t124.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t125 = nullable2 in #t124{self::Class2}.{self::Class2::[]=}(#t125, #t124{self::Class2}.{self::Class2::[]}(#t125).{self::Class2::+}(1));
+ nullable2 = let final self::Class2? #t126 = n2 in #t126.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t127 = nullable2 in let final self::Class2 #t128 = #t126{self::Class2}.{self::Class2::[]}(#t127) in let final void #t129 = #t126{self::Class2}.{self::Class2::[]=}(#t127, #t128.{self::Class2::+}(1)) in #t128;
+ let final self::Class2? #t130 = n2 in #t130.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t131 = nullable2 in let final self::Class2 #t132 = #t130{self::Class2}.{self::Class2::[]}(#t131).{self::Class2::+}(1) in let final void #t133 = #t130{self::Class2}.{self::Class2::[]=}(#t131, #t132) in #t132;
+ nullable2 = let final self::Class2? #t134 = n2 in #t134.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t135 = nullable2 in let final self::Class2 #t136 = #t134{self::Class2}.{self::Class2::[]}(#t135).{self::Class2::+}(1) in let final void #t137 = #t134{self::Class2}.{self::Class2::[]=}(#t135, #t136) in #t136;
+ let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t139 = #t138{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t140 = nullable2 in #t139.{self::Class2::[]=}(#t140, #t139.{self::Class2::[]}(#t140).{self::Class2::+}(1));
+ nullable2 = let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t142 = #t141{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t143 = nullable2 in let final self::Class2 #t144 = #t142.{self::Class2::[]}(#t143) in let final void #t145 = #t142.{self::Class2::[]=}(#t143, #t144.{self::Class2::+}(1)) in #t144;
+ let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t147 = #t146{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t148 = nullable2 in let final self::Class2 #t149 = #t147.{self::Class2::[]}(#t148).{self::Class2::+}(1) in let final void #t150 = #t147.{self::Class2::[]=}(#t148, #t149) in #t149;
+ nullable2 = let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t152 = #t151{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t153 = nullable2 in let final self::Class2 #t154 = #t152.{self::Class2::[]}(#t153).{self::Class2::+}(1) in let final void #t155 = #t152.{self::Class2::[]=}(#t153, #t154) in #t154;
+ let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class2?} null : #t156{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2);
+ let final self::Class1? #t157 = n1 in #t157.{core::Object::==}(null) ?{self::Class2?} null : #t157{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]=}(nullable2, new self::Class2::•());
+ nullable2 = let final self::Class1? #t158 = n1 in #t158.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t159 = #t158{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t160 = nullable2 in let final self::Class2 #t161 = new self::Class2::•() in let final void #t162 = #t159.{self::Class2::[]=}(#t160, #t161) in #t161;
+ let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t164 = #t163{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2) in #t164.{core::Object::==}(null) ?{self::Class2?} null : #t164{self::Class2}.{self::Class2::nonNullable2Method}();
+ let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t166 = #t165{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t167 = nullable2 in #t166.{self::Class2::[]=}(#t167, #t166.{self::Class2::[]}(#t167).{self::Class2::+}(0));
+ nullable2 = let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t169 = #t168{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t170 = nullable2 in let final self::Class2 #t171 = #t169.{self::Class2::[]}(#t170).{self::Class2::+}(0) in let final void #t172 = #t169.{self::Class2::[]=}(#t170, #t171) in #t171;
+ let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t174 = #t173{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t175 = nullable2 in #t174.{self::Class2::[]=}(#t175, #t174.{self::Class2::[]}(#t175).{self::Class2::+}(1));
+ nullable2 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t177 = #t176{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t178 = nullable2 in let final self::Class2 #t179 = #t177.{self::Class2::[]}(#t178) in let final void #t180 = #t177.{self::Class2::[]=}(#t178, #t179.{self::Class2::+}(1)) in #t179;
+ let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = #t181{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t183 = nullable2 in let final self::Class2 #t184 = #t182.{self::Class2::[]}(#t183).{self::Class2::+}(1) in let final void #t185 = #t182.{self::Class2::[]=}(#t183, #t184) in #t184;
+ nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = #t186{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = #t187.{self::Class2::[]}(#t188).{self::Class2::+}(1) in let final void #t190 = #t187.{self::Class2::[]=}(#t188, #t189) in #t189;
+ let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = #t191{self::Class1}.{self::Class1::[]}(nullable1) in #t192.{core::Object::==}(null) ?{self::Class1?} null : #t192{self::Class1}.{self::Class1::[]}(nullable1);
+ let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = #t193{self::Class1}.{self::Class1::[]}(nullable1) in #t194.{core::Object::==}(null) ?{self::Class1?} null : #t194{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t195 = n1 in #t195.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t196 = #t195{self::Class1}.{self::Class1::[]}(nullable1) in #t196.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t197 = nullable1 in let final self::Class1 #t198 = new self::Class1::•() in let final void #t199 = #t196{self::Class1}.{self::Class1::[]=}(#t197, #t198) in #t198;
+ let final self::Class1? #t200 = n1 in #t200.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t201 = #t200{self::Class1}.{self::Class1::[]}(nullable1) in #t201.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t202 = #t201{self::Class1}.{self::Class1::[]}(nullable1) in #t202.{core::Object::==}(null) ?{self::Class1?} null : #t202{self::Class1}.{self::Class1::nonNullable1Method}();
+ nullable1 = let final self::Class1? #t203 = n1 in #t203.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t204 = #t203{self::Class1}.{self::Class1::[]}(nullable1) in #t204.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t205 = #t204{self::Class1}.{self::Class1::[]}(nullable1) in #t205.{core::Object::==}(null) ?{self::Class1?} null : #t205{self::Class1}.{self::Class1::nonNullable1Method}();
+ let final self::Class1? #t206 = n1 in #t206.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t207 = #t206{self::Class1}.{self::Class1::[]}(nullable1) in #t207.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t208 = nullable1 in #t207{self::Class1}.{self::Class1::[]}(#t208).{core::Object::==}(null) ?{self::Class1?} #t207{self::Class1}.{self::Class1::[]=}(#t208, nullable1) : null;
+ nullable1 = let final self::Class1? #t209 = n1 in #t209.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t210 = #t209{self::Class1}.{self::Class1::[]}(nullable1) in #t210.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t211 = nullable1 in let final self::Class1? #t212 = #t210{self::Class1}.{self::Class1::[]}(#t211) in #t212.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t213 = nullable1 in let final void #t214 = #t210{self::Class1}.{self::Class1::[]=}(#t211, #t213) in #t213 : #t212{self::Class1};
+ let final self::Class3? #t215 = n3 in #t215.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t216 = #t215{self::Class3}.{self::Class3::[]}(nullable3) in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in #t216{self::Class2}.{self::Class2::[]=}(#t217, #t216{self::Class2}.{self::Class2::[]}(#t217).{self::Class2::+}(0));
+ nullable2 = let final self::Class3? #t218 = n3 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = #t218{self::Class3}.{self::Class3::[]}(nullable3) in #t219.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t220 = nullable2 in let final self::Class2 #t221 = #t219{self::Class2}.{self::Class2::[]}(#t220).{self::Class2::+}(0) in let final void #t222 = #t219{self::Class2}.{self::Class2::[]=}(#t220, #t221) in #t221;
+ let final self::Class3? #t223 = n3 in #t223.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t224 = #t223{self::Class3}.{self::Class3::[]}(nullable3) in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t225 = nullable2 in #t224{self::Class2}.{self::Class2::[]=}(#t225, #t224{self::Class2}.{self::Class2::[]}(#t225).{self::Class2::+}(1));
+ nullable2 = let final self::Class3? #t226 = n3 in #t226.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t227 = #t226{self::Class3}.{self::Class3::[]}(nullable3) in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t228 = nullable2 in let final self::Class2 #t229 = #t227{self::Class2}.{self::Class2::[]}(#t228) in let final void #t230 = #t227{self::Class2}.{self::Class2::[]=}(#t228, #t229.{self::Class2::+}(1)) in #t229;
+ let final self::Class3? #t231 = n3 in #t231.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t232 = #t231{self::Class3}.{self::Class3::[]}(nullable3) in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t233 = nullable2 in let final self::Class2 #t234 = #t232{self::Class2}.{self::Class2::[]}(#t233).{self::Class2::+}(1) in let final void #t235 = #t232{self::Class2}.{self::Class2::[]=}(#t233, #t234) in #t234;
+ nullable2 = let final self::Class3? #t236 = n3 in #t236.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t237 = #t236{self::Class3}.{self::Class3::[]}(nullable3) in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t238 = nullable2 in let final self::Class2 #t239 = #t237{self::Class2}.{self::Class2::[]}(#t238).{self::Class2::+}(1) in let final void #t240 = #t237{self::Class2}.{self::Class2::[]=}(#t238, #t239) in #t239;
}
static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
self::Class2? nullable2 = n2;
- self::throws(() → self::Class1? => (let final self::Class1? #t239 = n1 in #t239.{core::Object::==}(null) ?{self::Class1?} null : #t239{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
- self::throws(() → self::Class1? => (let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class1?} null : #t240{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
- let final self::Class2? #t241 = n2 in #t241.{core::Object::==}(null) ?{self::Class2?} null : #t241.{self::Class2::nonNullable2} = #t241.{self::Class2::nonNullable2}.{self::Class2::+}(0);
- nullable2 = let final self::Class2? #t242 = n2 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = #t242.{self::Class2::nonNullable2}.{self::Class2::+}(0) in let final void #t244 = #t242.{self::Class2::nonNullable2} = #t243 in #t243;
- let final self::Class2? #t245 = n2 in #t245.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t246 = #t245{self::Class2}.{self::Class2::nonNullable2} in #t246.{self::Class2::nonNullable2} = #t246.{self::Class2::nonNullable2}.{self::Class2::+}(0);
- nullable2 = let final self::Class2? #t247 = n2 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t248 = #t247{self::Class2}.{self::Class2::nonNullable2} in #t248.{self::Class2::nonNullable2} = #t248.{self::Class2::nonNullable2}.{self::Class2::+}(0);
- let final self::Class2? #t249 = n2 in #t249.{core::Object::==}(null) ?{self::Class2?} null : #t249.{self::Class2::nonNullable2} = #t249.{self::Class2::nonNullable2}.{self::Class2::+}(1);
- nullable2 = let final self::Class2? #t250 = n2 in #t250.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t251 = #t250.{self::Class2::nonNullable2} in let final void #t252 = #t250.{self::Class2::nonNullable2} = #t251.{self::Class2::+}(1) in #t251;
- let final self::Class2? #t253 = n2 in #t253.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t254 = #t253.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t255 = #t253.{self::Class2::nonNullable2} = #t254 in #t254;
- nullable2 = let final self::Class2? #t256 = n2 in #t256.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t257 = #t256.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t258 = #t256.{self::Class2::nonNullable2} = #t257 in #t257;
+ self::throws(() → self::Class1? => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+ throws(() => n1?.nonNullable1 + 0);
+ ^" in (let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class1?} null : #t242{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
+ self::throws(() → self::Class1? => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+ throws(() => -n1?.nonNullable1);
+ ^" in (let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class1?} null : #t244{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
+ let final self::Class2? #t245 = n2 in #t245.{core::Object::==}(null) ?{self::Class2?} null : #t245.{self::Class2::nonNullable2} = #t245.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+ nullable2 = let final self::Class2? #t246 = n2 in #t246.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t247 = #t246.{self::Class2::nonNullable2}.{self::Class2::+}(0) in let final void #t248 = #t246.{self::Class2::nonNullable2} = #t247 in #t247;
+ let final self::Class2? #t249 = n2 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = #t249{self::Class2}.{self::Class2::nonNullable2} in #t250.{self::Class2::nonNullable2} = #t250.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+ nullable2 = let final self::Class2? #t251 = n2 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = #t251{self::Class2}.{self::Class2::nonNullable2} in #t252.{self::Class2::nonNullable2} = #t252.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+ let final self::Class2? #t253 = n2 in #t253.{core::Object::==}(null) ?{self::Class2?} null : #t253.{self::Class2::nonNullable2} = #t253.{self::Class2::nonNullable2}.{self::Class2::+}(1);
+ nullable2 = let final self::Class2? #t254 = n2 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = #t254.{self::Class2::nonNullable2} in let final void #t256 = #t254.{self::Class2::nonNullable2} = #t255.{self::Class2::+}(1) in #t255;
+ let final self::Class2? #t257 = n2 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = #t257.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t259 = #t257.{self::Class2::nonNullable2} = #t258 in #t258;
+ nullable2 = let final self::Class2? #t260 = n2 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = #t260.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t262 = #t260.{self::Class2::nonNullable2} = #t261 in #t261;
}
static method ifNull(self::Class1? n1) → void {
self::Class1? nullable1 = n1;
- let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class1?} null : #t259.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t259.{self::Class1::nullable1} = n1{self::Class1} : null;
- n1 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t261 = #t260.{self::Class1::nullable1} in #t261.{core::Object::==}(null) ?{self::Class1} #t260.{self::Class1::nullable1} = n1{self::Class1} : #t261{self::Class1};
- let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t263 = #t262{self::Class1}.{self::Class1::nonNullable1} in #t263{self::Class1}.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t263{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : null;
- n1 = let final self::Class1? #t264 = n1 in #t264.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t265 = #t264{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t266 = #t265{self::Class1}.{self::Class1::nullable1} in #t266.{core::Object::==}(null) ?{self::Class1} #t265{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : #t266{self::Class1};
- let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t268 = #t267{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t269 = n1{self::Class1} in #t268.{self::Class1::[]}(#t269).{core::Object::==}(null) ?{self::Class1} #t268.{self::Class1::[]=}(#t269, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t271 = #t270{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t272 = n1{self::Class1} in let final self::Class1? #t273 = #t271.{self::Class1::[]}(#t272) in #t273.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t274 = n1{self::Class1} in let final void #t275 = #t271.{self::Class1::[]=}(#t272, #t274) in #t274 : #t273{self::Class1};
+ let final self::Class1? #t263 = n1 in #t263.{core::Object::==}(null) ?{self::Class1?} null : #t263.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t263.{self::Class1::nullable1} = n1{self::Class1} : null;
+ n1 = let final self::Class1? #t264 = n1 in #t264.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t265 = #t264.{self::Class1::nullable1} in #t265.{core::Object::==}(null) ?{self::Class1} #t264.{self::Class1::nullable1} = n1{self::Class1} : #t265{self::Class1};
+ let final self::Class1? #t266 = n1 in #t266.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t267 = #t266{self::Class1}.{self::Class1::nonNullable1} in #t267{self::Class1}.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t267{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : null;
+ n1 = let final self::Class1? #t268 = n1 in #t268.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t269 = #t268{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t270 = #t269{self::Class1}.{self::Class1::nullable1} in #t270.{core::Object::==}(null) ?{self::Class1} #t269{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : #t270{self::Class1};
+ let final self::Class1? #t271 = n1 in #t271.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t272 = #t271{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t273 = n1{self::Class1} in #t272.{self::Class1::[]}(#t273).{core::Object::==}(null) ?{self::Class1} #t272.{self::Class1::[]=}(#t273, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t274 = n1 in #t274.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t275 = #t274{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t276 = n1{self::Class1} in let final self::Class1? #t277 = #t275.{self::Class1::[]}(#t276) in #t277.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t278 = n1{self::Class1} in let final void #t279 = #t275.{self::Class1::[]=}(#t276, #t278) in #t278 : #t277{self::Class1};
}
static method throws(() → void f) → void {
try {
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.expect
index 559dca6..ad010f7 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.expect
@@ -2,24 +2,24 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
// Try accessing using ?. instead.
// throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
// Try accessing using ?. instead.
// throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
// throws(() => Extension1(n1)?.nonNullable1 + 0);
// ^
//
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
// throws(() => -Extension1(n1)?.nonNullable1);
// ^
@@ -139,139 +139,153 @@
let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
- self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
- self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
- nullable1 = let final self::Class1? #t23 = n1 in #t23.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
- nullable1 = let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
- nullable1 = let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
- let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
- let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
- let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
- nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
- let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
- let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
- let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
- let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
- let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
- let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
- nullable1 = let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
- let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
- let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
- nullable1 = let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
- let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
- nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
- let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
- nullable1 = let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
- let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
- let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
- let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
- let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
- let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
- nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
- let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t94 = n1 in #t94.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
- let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
- nullable1 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
- let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
- nullable1 = let final self::Class1? #t110 = n1 in #t110.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
- let final self::Class1? #t117 = n1 in #t117.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
- nullable1 = let final self::Class1? #t120 = n1 in #t120.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
- let final self::Class1? #t125 = n1 in #t125.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t126 = n1 in #t126.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
- let final self::Class1? #t129 = n1 in #t129.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
- nullable1 = let final self::Class1? #t132 = n1 in #t132.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
- let final self::Class1? #t137 = n1 in #t137.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
- let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
- let final self::Class1? #t142 = n1 in #t142.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
- nullable1 = let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
- let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
- let final self::Class1? #t147 = n1 in #t147.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
- nullable1 = let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
- let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
- nullable1 = let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
- let final self::Class1? #t159 = n1 in #t159.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
- nullable1 = let final self::Class1? #t160 = n1 in #t160.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
- let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
- let final self::Class1? #t164 = n1 in #t164.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
- let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
- let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{self::Class1});
+ self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+Try accessing using ?. instead.
+ throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
+ ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
+ self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+Try accessing using ?. instead.
+ throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
+ ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t24{self::Class1})));
+ nullable1 = let final self::Class1? #t25 = n1 in #t25.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t26 = new self::Class1::•() in let final void #t27 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t25{self::Class1}), #t26) in #t26;
+ nullable1 = let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t29 = self::Extension1|get#nullable1(#t28{self::Class1}) in #t29.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t30 = new self::Class1::•() in let final void #t31 = self::Extension1|set#nullable1(#t29{self::Class1}, #t30) in #t30;
+ nullable1 = let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t33 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t32{self::Class1})) in #t33.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t34 = new self::Class1::•() in let final void #t35 = self::Extension1|set#nullable1(#t33{self::Class1}, #t34) in #t34;
+ let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t37 = self::Extension1|get#nullable1(#t36{self::Class1}) in #t37.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t37{self::Class1});
+ let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t38{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t40 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t41 = self::Extension1|set#nullable1(#t39{self::Class1}, #t40) in #t40;
+ let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t42{self::Class1}, let final self::Class1 #t43 = new self::Class1::•() in let final void #t44 = self::Extension1|set#nullable1(new self::Class1::•(), #t43) in #t43);
+ nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t46 = let final self::Class1 #t47 = new self::Class1::•() in let final void #t48 = self::Extension1|set#nullable1(new self::Class1::•(), #t47) in #t47 in let final void #t49 = self::Extension1|set#nullable1(#t45{self::Class1}, #t46) in #t46;
+ let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t50{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t52 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t53 = self::Extension1|set#nullable1(#t51{self::Class1}, #t52) in #t52;
+ let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+ let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t55{self::Class1}), new self::Class1::•());
+ let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t56{self::Class1}));
+ let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})));
+ let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t58{self::Class1})), new self::Class1::•());
+ nullable1 = let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t60 = new self::Class1::•() in let final void #t61 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t59{self::Class1})), #t60) in #t60;
+ let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t63 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t62{self::Class1})) in #t63.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t63{self::Class1});
+ let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t64{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t66 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t67 = self::Extension1|set#nullable1(#t65{self::Class1}, #t66) in #t66;
+ let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t68{self::Class1}, let final self::Class1 #t69 = new self::Class1::•() in let final void #t70 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t69) in #t69);
+ nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t72 = let final self::Class1 #t73 = new self::Class1::•() in let final void #t74 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t73) in #t73 in let final void #t75 = self::Extension1|set#nullable1(#t71{self::Class1}, #t72) in #t72;
+ let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t76{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t78 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t79 = self::Extension1|set#nullable1(#t77{self::Class1}, #t78) in #t78;
+ let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+ let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t81{self::Class1})), new self::Class1::•());
+ let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t82{self::Class1})));
+ let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t83{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t86 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t84{self::Class1}), #t85) in #t85;
+ let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t87{self::Class1}), let final self::Class1 #t88 = new self::Class1::•() in let final void #t89 = self::Extension1|set#nullable1(new self::Class1::•(), #t88) in #t88);
+ nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = let final self::Class1 #t92 = new self::Class1::•() in let final void #t93 = self::Extension1|set#nullable1(new self::Class1::•(), #t92) in #t92 in let final void #t94 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t90{self::Class1}), #t91) in #t91;
+ let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t95{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t96 = n1 in #t96.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t97 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t98 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t96{self::Class1}), #t97) in #t97;
+ let final self::Class1? #t99 = n1 in #t99.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t99{self::Class1}, let final self::Class1? #t100 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t101 = self::Extension1|set#nullable1(new self::Class1::•(), #t100) in #t100);
+ nullable1 = let final self::Class1? #t102 = n1 in #t102.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t103 = let final self::Class1? #t104 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t105 = self::Extension1|set#nullable1(new self::Class1::•(), #t104) in #t104 in let final void #t106 = self::Extension1|set#nullable1(#t102{self::Class1}, #t103) in #t103;
+ let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t107{self::Class1}, let final self::Class1 #t108 = let final self::Class1 #t109 = new self::Class1::•() in let final void #t110 = self::Extension1|set#nullable1(new self::Class1::•(), #t109) in #t109 in let final void #t111 = self::Extension1|set#nullable1(new self::Class1::•(), #t108) in #t108);
+ nullable1 = let final self::Class1? #t112 = n1 in #t112.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t113 = let final self::Class1 #t114 = let final self::Class1 #t115 = new self::Class1::•() in let final void #t116 = self::Extension1|set#nullable1(new self::Class1::•(), #t115) in #t115 in let final void #t117 = self::Extension1|set#nullable1(new self::Class1::•(), #t114) in #t114 in let final void #t118 = self::Extension1|set#nullable1(#t112{self::Class1}, #t113) in #t113;
+ let final self::Class1? #t119 = n1 in #t119.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t119{self::Class1}, let final self::Class1 #t120 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t121 = self::Extension1|set#nullable1(new self::Class1::•(), #t120) in #t120);
+ nullable1 = let final self::Class1? #t122 = n1 in #t122.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t123 = let final self::Class1 #t124 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t125 = self::Extension1|set#nullable1(new self::Class1::•(), #t124) in #t124 in let final void #t126 = self::Extension1|set#nullable1(#t122{self::Class1}, #t123) in #t123;
+ let final self::Class1? #t127 = n1 in #t127.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t127{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t128 = n1 in #t128.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t129 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t130 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t128{self::Class1}), #t129) in #t129;
+ let final self::Class1? #t131 = n1 in #t131.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t131{self::Class1}), let final self::Class1 #t132 = new self::Class1::•() in let final void #t133 = self::Extension1|set#nullable1(new self::Class1::•(), #t132) in #t132);
+ nullable1 = let final self::Class1? #t134 = n1 in #t134.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t135 = let final self::Class1 #t136 = new self::Class1::•() in let final void #t137 = self::Extension1|set#nullable1(new self::Class1::•(), #t136) in #t136 in let final void #t138 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t134{self::Class1}), #t135) in #t135;
+ let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t139{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t140 = n1 in #t140.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t141 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t142 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t140{self::Class1}), #t141) in #t141;
+ let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})));
+ let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t144{self::Class1})), new self::Class1::•());
+ nullable1 = let final self::Class1? #t145 = n1 in #t145.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t146 = new self::Class1::•() in let final void #t147 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t145{self::Class1})), #t146) in #t146;
+ let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t148{self::Class1})));
+ let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t149{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t150 = n1 in #t150.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t151 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t152 = self::Extension1|set#nullable1(#t150{self::Class1}, #t151) in #t151;
+ let final self::Class1? #t153 = n1 in #t153.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t153{self::Class1}, let final self::Class1 #t154 = new self::Class1::•() in let final void #t155 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t154) in #t154);
+ nullable1 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t157 = let final self::Class1 #t158 = new self::Class1::•() in let final void #t159 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t158) in #t158 in let final void #t160 = self::Extension1|set#nullable1(#t156{self::Class1}, #t157) in #t157;
+ let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t161{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t162 = n1 in #t162.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t163 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t164 = self::Extension1|set#nullable1(#t162{self::Class1}, #t163) in #t163;
+ let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+ let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t166{self::Class1})), new self::Class1::•());
+ let final self::Class1? #t167 = n1 in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t167{self::Class1})));
+ let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t169 = self::Extension1|nonNullable1Method(#t168{self::Class1}) in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t169{self::Class1});
}
static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
self::Class1? nullable1 = n1;
self::Class2? nullable2 = n2;
self::Class3? nullable3 = n3;
- let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
- let final self::Class1? #t169 = n1 in #t169.{core::Object::==}(null) ?{void} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
- let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
- let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
- let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
- let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
- let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
- nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
- let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
- nullable1 = let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
- let final self::Class2? #t196 = n2 in #t196.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
- nullable2 = let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
- let final self::Class2? #t202 = n2 in #t202.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
- nullable2 = let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
- let final self::Class2? #t208 = n2 in #t208.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
- nullable2 = let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
- let final self::Class2? #t214 = n2 in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
- nullable2 = let final self::Class2? #t218 = n2 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
- let final self::Class1? #t222 = n1 in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
- nullable2 = let final self::Class1? #t225 = n1 in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
- let final self::Class1? #t230 = n1 in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
- nullable2 = let final self::Class1? #t235 = n1 in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
- let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
- let final self::Class1? #t241 = n1 in #t241.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
- nullable2 = let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
- let final self::Class1? #t247 = n1 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
- let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
- nullable2 = let final self::Class1? #t252 = n1 in #t252.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
- let final self::Class1? #t257 = n1 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
- nullable2 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
- let final self::Class1? #t265 = n1 in #t265.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
- nullable2 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
- let final self::Class1? #t275 = n1 in #t275.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
- let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
- let final self::Class1? #t284 = n1 in #t284.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
- nullable1 = let final self::Class1? #t287 = n1 in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
- let final self::Class1? #t290 = n1 in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
- nullable1 = let final self::Class1? #t293 = n1 in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
- let final self::Class3? #t299 = n3 in #t299.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
- nullable2 = let final self::Class3? #t302 = n3 in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
- let final self::Class3? #t307 = n3 in #t307.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
- nullable2 = let final self::Class3? #t310 = n3 in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
- let final self::Class3? #t315 = n3 in #t315.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
- nullable2 = let final self::Class3? #t320 = n3 in #t320.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+ let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t170{self::Class1}, nullable1);
+ let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{void} null : self::Extension1|[]=(#t171{self::Class1}, nullable1, new self::Class1::•());
+ let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t173 = self::Extension1|[](#t172{self::Class1}, nullable1) in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t173{self::Class1});
+ let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t174{self::Class1}), nullable1);
+ let final self::Class1? #t175 = n1 in #t175.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t175{self::Class1}), nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t177 = self::Extension1|get#nonNullable1(#t176{self::Class1}) in let final self::Class1? #t178 = nullable1 in let final self::Class1 #t179 = new self::Class1::•() in let final void #t180 = self::Extension1|[]=(#t177, #t178, #t179) in #t179;
+ let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t182 = self::Extension1|[](self::Extension1|get#nonNullable1(#t181{self::Class1}), nullable1) in #t182.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t182{self::Class1});
+ let final self::Class1? #t183 = n1 in #t183.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t184 = self::Extension1|get#nonNullable2(#t183{self::Class1}) in let final self::Class2? #t185 = nullable2 in self::Extension2|[]=(#t184, #t185, self::Extension2|+(self::Extension2|[](#t184, #t185), 0));
+ nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = self::Extension1|get#nonNullable2(#t186{self::Class1}) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = self::Extension2|+(self::Extension2|[](#t187, #t188), 0) in let final void #t190 = self::Extension2|[]=(#t187, #t188, #t189) in #t189;
+ let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in self::Extension1|[](#t191{self::Class1}, #t192).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t191{self::Class1}, #t192, nullable1) : null;
+ nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = nullable1 in let final self::Class1? #t195 = self::Extension1|[](#t193{self::Class1}, #t194) in #t195.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t196 = nullable1 in let final void #t197 = self::Extension1|[]=(#t193{self::Class1}, #t194, #t196) in #t196 : #t195{self::Class1};
+ let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in self::Extension2|[]=(#t198{self::Class2}, #t199, self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0));
+ nullable2 = let final self::Class2? #t200 = n2 in #t200.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t201 = nullable2 in let final self::Class2 #t202 = self::Extension2|+(self::Extension2|[](#t200{self::Class2}, #t201), 0) in let final void #t203 = self::Extension2|[]=(#t200{self::Class2}, #t201, #t202) in #t202;
+ let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in self::Extension2|[]=(#t204{self::Class2}, #t205, self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0));
+ nullable2 = let final self::Class2? #t206 = n2 in #t206.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t207 = nullable2 in let final self::Class2 #t208 = self::Extension2|+(self::Extension2|[](#t206{self::Class2}, #t207), 0) in let final void #t209 = self::Extension2|[]=(#t206{self::Class2}, #t207, #t208) in #t208;
+ let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(self::Extension2|[](#t210{self::Class2}, #t211), 1));
+ nullable2 = let final self::Class2? #t212 = n2 in #t212.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t213 = nullable2 in let final self::Class2 #t214 = self::Extension2|[](#t212{self::Class2}, #t213) in let final void #t215 = self::Extension2|[]=(#t212{self::Class2}, #t213, self::Extension2|+(#t214, 1)) in #t214;
+ let final self::Class2? #t216 = n2 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in let final self::Class2 #t218 = self::Extension2|+(self::Extension2|[](#t216{self::Class2}, #t217), 1) in let final void #t219 = self::Extension2|[]=(#t216{self::Class2}, #t217, #t218) in #t218;
+ nullable2 = let final self::Class2? #t220 = n2 in #t220.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t221 = nullable2 in let final self::Class2 #t222 = self::Extension2|+(self::Extension2|[](#t220{self::Class2}, #t221), 1) in let final void #t223 = self::Extension2|[]=(#t220{self::Class2}, #t221, #t222) in #t222;
+ let final self::Class1? #t224 = n1 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t225 = self::Extension1|get#nonNullable2(#t224{self::Class1}) in let final self::Class2? #t226 = nullable2 in self::Extension2|[]=(#t225, #t226, self::Extension2|+(self::Extension2|[](#t225, #t226), 1));
+ nullable2 = let final self::Class1? #t227 = n1 in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t228 = self::Extension1|get#nonNullable2(#t227{self::Class1}) in let final self::Class2? #t229 = nullable2 in let final self::Class2 #t230 = self::Extension2|[](#t228, #t229) in let final void #t231 = self::Extension2|[]=(#t228, #t229, self::Extension2|+(#t230, 1)) in #t230;
+ let final self::Class1? #t232 = n1 in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t233 = self::Extension1|get#nonNullable2(#t232{self::Class1}) in let final self::Class2? #t234 = nullable2 in let final self::Class2 #t235 = self::Extension2|+(self::Extension2|[](#t233, #t234), 1) in let final void #t236 = self::Extension2|[]=(#t233, #t234, #t235) in #t235;
+ nullable2 = let final self::Class1? #t237 = n1 in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t238 = self::Extension1|get#nonNullable2(#t237{self::Class1}) in let final self::Class2? #t239 = nullable2 in let final self::Class2 #t240 = self::Extension2|+(self::Extension2|[](#t238, #t239), 1) in let final void #t241 = self::Extension2|[]=(#t238, #t239, #t240) in #t240;
+ let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2), nullable2);
+ let final self::Class1? #t243 = n1 in #t243.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t243{self::Class1}), nullable2), nullable2, new self::Class2::•());
+ nullable2 = let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t245 = self::Extension2|[](self::Extension1|get#nonNullable2(#t244{self::Class1}), nullable2) in let final self::Class2? #t246 = nullable2 in let final self::Class2 #t247 = new self::Class2::•() in let final void #t248 = self::Extension2|[]=(#t245, #t246, #t247) in #t247;
+ let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t250 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2), nullable2) in #t250.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t250{self::Class2});
+ let final self::Class1? #t251 = n1 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = self::Extension2|[](self::Extension1|get#nonNullable2(#t251{self::Class1}), nullable2) in let final self::Class2? #t253 = nullable2 in self::Extension2|[]=(#t252, #t253, self::Extension2|+(self::Extension2|[](#t252, #t253), 0));
+ nullable2 = let final self::Class1? #t254 = n1 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = self::Extension2|[](self::Extension1|get#nonNullable2(#t254{self::Class1}), nullable2) in let final self::Class2? #t256 = nullable2 in let final self::Class2 #t257 = self::Extension2|+(self::Extension2|[](#t255, #t256), 0) in let final void #t258 = self::Extension2|[]=(#t255, #t256, #t257) in #t257;
+ let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t260 = self::Extension2|[](self::Extension1|get#nonNullable2(#t259{self::Class1}), nullable2) in let final self::Class2? #t261 = nullable2 in self::Extension2|[]=(#t260, #t261, self::Extension2|+(self::Extension2|[](#t260, #t261), 1));
+ nullable2 = let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t263 = self::Extension2|[](self::Extension1|get#nonNullable2(#t262{self::Class1}), nullable2) in let final self::Class2? #t264 = nullable2 in let final self::Class2 #t265 = self::Extension2|[](#t263, #t264) in let final void #t266 = self::Extension2|[]=(#t263, #t264, self::Extension2|+(#t265, 1)) in #t265;
+ let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t268 = self::Extension2|[](self::Extension1|get#nonNullable2(#t267{self::Class1}), nullable2) in let final self::Class2? #t269 = nullable2 in let final self::Class2 #t270 = self::Extension2|+(self::Extension2|[](#t268, #t269), 1) in let final void #t271 = self::Extension2|[]=(#t268, #t269, #t270) in #t270;
+ nullable2 = let final self::Class1? #t272 = n1 in #t272.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t273 = self::Extension2|[](self::Extension1|get#nonNullable2(#t272{self::Class1}), nullable2) in let final self::Class2? #t274 = nullable2 in let final self::Class2 #t275 = self::Extension2|+(self::Extension2|[](#t273, #t274), 1) in let final void #t276 = self::Extension2|[]=(#t273, #t274, #t275) in #t275;
+ let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t278{self::Class1}, nullable1);
+ let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t280{self::Class1}, nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t281 = n1 in #t281.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t282 = self::Extension1|[](#t281{self::Class1}, nullable1) in #t282.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t283 = nullable1 in let final self::Class1 #t284 = new self::Class1::•() in let final void #t285 = self::Extension1|[]=(#t282{self::Class1}, #t283, #t284) in #t284;
+ let final self::Class1? #t286 = n1 in #t286.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t287 = self::Extension1|[](#t286{self::Class1}, nullable1) in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t288{self::Class1});
+ nullable1 = let final self::Class1? #t289 = n1 in #t289.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t290 = self::Extension1|[](#t289{self::Class1}, nullable1) in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t291{self::Class1});
+ let final self::Class1? #t292 = n1 in #t292.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t293 = self::Extension1|[](#t292{self::Class1}, nullable1) in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = nullable1 in self::Extension1|[](#t293{self::Class1}, #t294).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t293{self::Class1}, #t294, nullable1) : null;
+ nullable1 = let final self::Class1? #t295 = n1 in #t295.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t296 = self::Extension1|[](#t295{self::Class1}, nullable1) in #t296.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t297 = nullable1 in let final self::Class1? #t298 = self::Extension1|[](#t296{self::Class1}, #t297) in #t298.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t299 = nullable1 in let final void #t300 = self::Extension1|[]=(#t296{self::Class1}, #t297, #t299) in #t299 : #t298{self::Class1};
+ let final self::Class3? #t301 = n3 in #t301.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t302 = self::Extension3|[](#t301{self::Class3}, nullable3) in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = nullable2 in self::Extension2|[]=(#t302{self::Class2}, #t303, self::Extension2|+(self::Extension2|[](#t302{self::Class2}, #t303), 0));
+ nullable2 = let final self::Class3? #t304 = n3 in #t304.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t305 = self::Extension3|[](#t304{self::Class3}, nullable3) in #t305.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t306 = nullable2 in let final self::Class2 #t307 = self::Extension2|+(self::Extension2|[](#t305{self::Class2}, #t306), 0) in let final void #t308 = self::Extension2|[]=(#t305{self::Class2}, #t306, #t307) in #t307;
+ let final self::Class3? #t309 = n3 in #t309.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t310 = self::Extension3|[](#t309{self::Class3}, nullable3) in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = nullable2 in self::Extension2|[]=(#t310{self::Class2}, #t311, self::Extension2|+(self::Extension2|[](#t310{self::Class2}, #t311), 1));
+ nullable2 = let final self::Class3? #t312 = n3 in #t312.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t313 = self::Extension3|[](#t312{self::Class3}, nullable3) in #t313.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t314 = nullable2 in let final self::Class2 #t315 = self::Extension2|[](#t313{self::Class2}, #t314) in let final void #t316 = self::Extension2|[]=(#t313{self::Class2}, #t314, self::Extension2|+(#t315, 1)) in #t315;
+ let final self::Class3? #t317 = n3 in #t317.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t318 = self::Extension3|[](#t317{self::Class3}, nullable3) in #t318.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t319 = nullable2 in let final self::Class2 #t320 = self::Extension2|+(self::Extension2|[](#t318{self::Class2}, #t319), 1) in let final void #t321 = self::Extension2|[]=(#t318{self::Class2}, #t319, #t320) in #t320;
+ nullable2 = let final self::Class3? #t322 = n3 in #t322.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t323 = self::Extension3|[](#t322{self::Class3}, nullable3) in #t323.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t324 = nullable2 in let final self::Class2 #t325 = self::Extension2|+(self::Extension2|[](#t323{self::Class2}, #t324), 1) in let final void #t326 = self::Extension2|[]=(#t323{self::Class2}, #t324, #t325) in #t325;
}
static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
self::Class2? nullable2 = n2;
- self::throws(() → self::Class1? => self::Extension1|+(let final self::Class1? #t325 = n1 in #t325.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
- self::throws(() → self::Class1? => self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
- let final self::Class2? #t327 = n2 in #t327.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t327{self::Class2}), 0));
- nullable2 = let final self::Class2? #t328 = n2 in #t328.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328{self::Class2}), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328{self::Class2}, #t329) in #t329;
- let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
- nullable2 = let final self::Class2? #t333 = n2 in #t333.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
- let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t337{self::Class2}), 1));
- nullable2 = let final self::Class2? #t338 = n2 in #t338.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final self::Class2 #t340 = let final self::Class2 #t341 = self::Extension2|+(#t339, 1) in let final void #t342 = self::Extension2|set#nonNullable2(#t338{self::Class2}, #t341) in #t341 in #t339;
- let final self::Class2? #t343 = n2 in #t343.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t344 = self::Extension2|+(self::Extension2|get#nonNullable2(#t343{self::Class2}), 1) in let final void #t345 = self::Extension2|set#nonNullable2(#t343{self::Class2}, #t344) in #t344;
- nullable2 = let final self::Class2? #t346 = n2 in #t346.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t347 = self::Extension2|+(self::Extension2|get#nonNullable2(#t346{self::Class2}), 1) in let final void #t348 = self::Extension2|set#nonNullable2(#t346{self::Class2}, #t347) in #t347;
+ self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+ throws(() => Extension1(n1)?.nonNullable1 + 0);
+ ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
+ self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+ throws(() => -Extension1(n1)?.nonNullable1);
+ ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
+ let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t331{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t331{self::Class2}), 0));
+ nullable2 = let final self::Class2? #t332 = n2 in #t332.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t333 = self::Extension2|+(self::Extension2|get#nonNullable2(#t332{self::Class2}), 0) in let final void #t334 = self::Extension2|set#nonNullable2(#t332{self::Class2}, #t333) in #t333;
+ let final self::Class2? #t335 = n2 in #t335.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t336 = self::Extension2|get#nonNullable2(#t335{self::Class2}) in self::Extension2|set#nonNullable2(#t336, self::Extension2|+(self::Extension2|get#nonNullable2(#t336), 0));
+ nullable2 = let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t338 = self::Extension2|get#nonNullable2(#t337{self::Class2}) in let final self::Class2 #t339 = self::Extension2|+(self::Extension2|get#nonNullable2(#t338), 0) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, #t339) in #t339;
+ let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t341{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t341{self::Class2}), 1));
+ nullable2 = let final self::Class2? #t342 = n2 in #t342.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t343 = self::Extension2|get#nonNullable2(#t342{self::Class2}) in let final self::Class2 #t344 = let final self::Class2 #t345 = self::Extension2|+(#t343, 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t342{self::Class2}, #t345) in #t345 in #t343;
+ let final self::Class2? #t347 = n2 in #t347.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t348 = self::Extension2|+(self::Extension2|get#nonNullable2(#t347{self::Class2}), 1) in let final void #t349 = self::Extension2|set#nonNullable2(#t347{self::Class2}, #t348) in #t348;
+ nullable2 = let final self::Class2? #t350 = n2 in #t350.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t351 = self::Extension2|+(self::Extension2|get#nonNullable2(#t350{self::Class2}), 1) in let final void #t352 = self::Extension2|set#nonNullable2(#t350{self::Class2}, #t351) in #t351;
}
static method ifNull(self::Class1? n1) → void {
self::Class1? nullable1 = n1;
- let final self::Class1? #t349 = n1 in #t349.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t349).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t349, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t350 = n1 in #t350.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t351 = self::Extension1|get#nullable1(#t350) in #t351.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t352 = n1{self::Class1} in let final void #t353 = self::Extension1|set#nullable1(#t350, #t352) in #t352 : #t351{self::Class1};
- let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in self::Extension1|get#nullable1(#t355{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t355{self::Class1}, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t356 = n1 in #t356.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in let final self::Class1? #t358 = self::Extension1|get#nullable1(#t357{self::Class1}) in #t358.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t359 = n1{self::Class1} in let final void #t360 = self::Extension1|set#nullable1(#t357{self::Class1}, #t359) in #t359 : #t358{self::Class1};
- let final self::Class1? #t361 = n1 in #t361.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t362 = self::Extension1|get#nonNullable1(#t361{self::Class1}) in let final self::Class1 #t363 = n1{self::Class1} in self::Extension1|[](#t362, #t363).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t362, #t363, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t364 = n1 in #t364.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t365 = self::Extension1|get#nonNullable1(#t364{self::Class1}) in let final self::Class1 #t366 = n1{self::Class1} in let final self::Class1? #t367 = self::Extension1|[](#t365, #t366) in #t367.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t368 = n1{self::Class1} in let final void #t369 = self::Extension1|[]=(#t365, #t366, #t368) in #t368 : #t367{self::Class1};
+ let final self::Class1? #t353 = n1 in #t353.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t353).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t353, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nullable1(#t354) in #t355.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t356 = n1{self::Class1} in let final void #t357 = self::Extension1|set#nullable1(#t354, #t356) in #t356 : #t355{self::Class1};
+ let final self::Class1? #t358 = n1 in #t358.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t359 = self::Extension1|get#nonNullable1(#t358{self::Class1}) in self::Extension1|get#nullable1(#t359{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t359{self::Class1}, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t360 = n1 in #t360.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t361 = self::Extension1|get#nonNullable1(#t360{self::Class1}) in let final self::Class1? #t362 = self::Extension1|get#nullable1(#t361{self::Class1}) in #t362.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t363 = n1{self::Class1} in let final void #t364 = self::Extension1|set#nullable1(#t361{self::Class1}, #t363) in #t363 : #t362{self::Class1};
+ let final self::Class1? #t365 = n1 in #t365.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t366 = self::Extension1|get#nonNullable1(#t365{self::Class1}) in let final self::Class1 #t367 = n1{self::Class1} in self::Extension1|[](#t366, #t367).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t366, #t367, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t368 = n1 in #t368.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t369 = self::Extension1|get#nonNullable1(#t368{self::Class1}) in let final self::Class1 #t370 = n1{self::Class1} in let final self::Class1? #t371 = self::Extension1|[](#t369, #t370) in #t371.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t372 = n1{self::Class1} in let final void #t373 = self::Extension1|[]=(#t369, #t370, #t372) in #t372 : #t371{self::Class1};
}
static method throws(() → void f) → void {
try {
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.transformed.expect
index 559dca6..ad010f7 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.transformed.expect
@@ -2,24 +2,24 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
// Try accessing using ?. instead.
// throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
// Try accessing using ?. instead.
// throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
// throws(() => Extension1(n1)?.nonNullable1 + 0);
// ^
//
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
// throws(() => -Extension1(n1)?.nonNullable1);
// ^
@@ -139,139 +139,153 @@
let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
- self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
- self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
- nullable1 = let final self::Class1? #t23 = n1 in #t23.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
- nullable1 = let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
- nullable1 = let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
- let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
- let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
- let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
- nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
- let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
- let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
- let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
- let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
- let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
- let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
- nullable1 = let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
- let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
- let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
- nullable1 = let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
- let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
- nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
- let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
- nullable1 = let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
- let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
- let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
- let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
- let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
- let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
- nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
- let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t94 = n1 in #t94.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
- let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
- nullable1 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
- let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
- nullable1 = let final self::Class1? #t110 = n1 in #t110.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
- let final self::Class1? #t117 = n1 in #t117.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
- nullable1 = let final self::Class1? #t120 = n1 in #t120.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
- let final self::Class1? #t125 = n1 in #t125.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t126 = n1 in #t126.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
- let final self::Class1? #t129 = n1 in #t129.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
- nullable1 = let final self::Class1? #t132 = n1 in #t132.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
- let final self::Class1? #t137 = n1 in #t137.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
- let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
- let final self::Class1? #t142 = n1 in #t142.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
- nullable1 = let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
- let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
- let final self::Class1? #t147 = n1 in #t147.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
- nullable1 = let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
- let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
- nullable1 = let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
- let final self::Class1? #t159 = n1 in #t159.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
- nullable1 = let final self::Class1? #t160 = n1 in #t160.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
- let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
- let final self::Class1? #t164 = n1 in #t164.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
- let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
- let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{self::Class1});
+ self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+Try accessing using ?. instead.
+ throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
+ ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
+ self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+Try accessing using ?. instead.
+ throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
+ ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t24{self::Class1})));
+ nullable1 = let final self::Class1? #t25 = n1 in #t25.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t26 = new self::Class1::•() in let final void #t27 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t25{self::Class1}), #t26) in #t26;
+ nullable1 = let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t29 = self::Extension1|get#nullable1(#t28{self::Class1}) in #t29.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t30 = new self::Class1::•() in let final void #t31 = self::Extension1|set#nullable1(#t29{self::Class1}, #t30) in #t30;
+ nullable1 = let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t33 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t32{self::Class1})) in #t33.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t34 = new self::Class1::•() in let final void #t35 = self::Extension1|set#nullable1(#t33{self::Class1}, #t34) in #t34;
+ let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t37 = self::Extension1|get#nullable1(#t36{self::Class1}) in #t37.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t37{self::Class1});
+ let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t38{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t40 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t41 = self::Extension1|set#nullable1(#t39{self::Class1}, #t40) in #t40;
+ let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t42{self::Class1}, let final self::Class1 #t43 = new self::Class1::•() in let final void #t44 = self::Extension1|set#nullable1(new self::Class1::•(), #t43) in #t43);
+ nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t46 = let final self::Class1 #t47 = new self::Class1::•() in let final void #t48 = self::Extension1|set#nullable1(new self::Class1::•(), #t47) in #t47 in let final void #t49 = self::Extension1|set#nullable1(#t45{self::Class1}, #t46) in #t46;
+ let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t50{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t52 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t53 = self::Extension1|set#nullable1(#t51{self::Class1}, #t52) in #t52;
+ let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+ let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t55{self::Class1}), new self::Class1::•());
+ let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t56{self::Class1}));
+ let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})));
+ let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t58{self::Class1})), new self::Class1::•());
+ nullable1 = let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t60 = new self::Class1::•() in let final void #t61 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t59{self::Class1})), #t60) in #t60;
+ let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t63 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t62{self::Class1})) in #t63.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t63{self::Class1});
+ let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t64{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t66 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t67 = self::Extension1|set#nullable1(#t65{self::Class1}, #t66) in #t66;
+ let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t68{self::Class1}, let final self::Class1 #t69 = new self::Class1::•() in let final void #t70 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t69) in #t69);
+ nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t72 = let final self::Class1 #t73 = new self::Class1::•() in let final void #t74 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t73) in #t73 in let final void #t75 = self::Extension1|set#nullable1(#t71{self::Class1}, #t72) in #t72;
+ let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t76{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t78 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t79 = self::Extension1|set#nullable1(#t77{self::Class1}, #t78) in #t78;
+ let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+ let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t81{self::Class1})), new self::Class1::•());
+ let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t82{self::Class1})));
+ let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t83{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t86 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t84{self::Class1}), #t85) in #t85;
+ let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t87{self::Class1}), let final self::Class1 #t88 = new self::Class1::•() in let final void #t89 = self::Extension1|set#nullable1(new self::Class1::•(), #t88) in #t88);
+ nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = let final self::Class1 #t92 = new self::Class1::•() in let final void #t93 = self::Extension1|set#nullable1(new self::Class1::•(), #t92) in #t92 in let final void #t94 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t90{self::Class1}), #t91) in #t91;
+ let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t95{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t96 = n1 in #t96.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t97 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t98 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t96{self::Class1}), #t97) in #t97;
+ let final self::Class1? #t99 = n1 in #t99.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t99{self::Class1}, let final self::Class1? #t100 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t101 = self::Extension1|set#nullable1(new self::Class1::•(), #t100) in #t100);
+ nullable1 = let final self::Class1? #t102 = n1 in #t102.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t103 = let final self::Class1? #t104 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t105 = self::Extension1|set#nullable1(new self::Class1::•(), #t104) in #t104 in let final void #t106 = self::Extension1|set#nullable1(#t102{self::Class1}, #t103) in #t103;
+ let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t107{self::Class1}, let final self::Class1 #t108 = let final self::Class1 #t109 = new self::Class1::•() in let final void #t110 = self::Extension1|set#nullable1(new self::Class1::•(), #t109) in #t109 in let final void #t111 = self::Extension1|set#nullable1(new self::Class1::•(), #t108) in #t108);
+ nullable1 = let final self::Class1? #t112 = n1 in #t112.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t113 = let final self::Class1 #t114 = let final self::Class1 #t115 = new self::Class1::•() in let final void #t116 = self::Extension1|set#nullable1(new self::Class1::•(), #t115) in #t115 in let final void #t117 = self::Extension1|set#nullable1(new self::Class1::•(), #t114) in #t114 in let final void #t118 = self::Extension1|set#nullable1(#t112{self::Class1}, #t113) in #t113;
+ let final self::Class1? #t119 = n1 in #t119.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t119{self::Class1}, let final self::Class1 #t120 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t121 = self::Extension1|set#nullable1(new self::Class1::•(), #t120) in #t120);
+ nullable1 = let final self::Class1? #t122 = n1 in #t122.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t123 = let final self::Class1 #t124 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t125 = self::Extension1|set#nullable1(new self::Class1::•(), #t124) in #t124 in let final void #t126 = self::Extension1|set#nullable1(#t122{self::Class1}, #t123) in #t123;
+ let final self::Class1? #t127 = n1 in #t127.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t127{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t128 = n1 in #t128.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t129 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t130 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t128{self::Class1}), #t129) in #t129;
+ let final self::Class1? #t131 = n1 in #t131.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t131{self::Class1}), let final self::Class1 #t132 = new self::Class1::•() in let final void #t133 = self::Extension1|set#nullable1(new self::Class1::•(), #t132) in #t132);
+ nullable1 = let final self::Class1? #t134 = n1 in #t134.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t135 = let final self::Class1 #t136 = new self::Class1::•() in let final void #t137 = self::Extension1|set#nullable1(new self::Class1::•(), #t136) in #t136 in let final void #t138 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t134{self::Class1}), #t135) in #t135;
+ let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t139{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t140 = n1 in #t140.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t141 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t142 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t140{self::Class1}), #t141) in #t141;
+ let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})));
+ let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t144{self::Class1})), new self::Class1::•());
+ nullable1 = let final self::Class1? #t145 = n1 in #t145.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t146 = new self::Class1::•() in let final void #t147 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t145{self::Class1})), #t146) in #t146;
+ let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t148{self::Class1})));
+ let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t149{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t150 = n1 in #t150.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t151 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t152 = self::Extension1|set#nullable1(#t150{self::Class1}, #t151) in #t151;
+ let final self::Class1? #t153 = n1 in #t153.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t153{self::Class1}, let final self::Class1 #t154 = new self::Class1::•() in let final void #t155 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t154) in #t154);
+ nullable1 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t157 = let final self::Class1 #t158 = new self::Class1::•() in let final void #t159 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t158) in #t158 in let final void #t160 = self::Extension1|set#nullable1(#t156{self::Class1}, #t157) in #t157;
+ let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t161{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t162 = n1 in #t162.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t163 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t164 = self::Extension1|set#nullable1(#t162{self::Class1}, #t163) in #t163;
+ let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+ let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t166{self::Class1})), new self::Class1::•());
+ let final self::Class1? #t167 = n1 in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t167{self::Class1})));
+ let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t169 = self::Extension1|nonNullable1Method(#t168{self::Class1}) in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t169{self::Class1});
}
static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
self::Class1? nullable1 = n1;
self::Class2? nullable2 = n2;
self::Class3? nullable3 = n3;
- let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
- let final self::Class1? #t169 = n1 in #t169.{core::Object::==}(null) ?{void} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
- let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
- let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
- let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
- let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
- let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
- nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
- let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
- nullable1 = let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
- let final self::Class2? #t196 = n2 in #t196.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
- nullable2 = let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
- let final self::Class2? #t202 = n2 in #t202.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
- nullable2 = let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
- let final self::Class2? #t208 = n2 in #t208.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
- nullable2 = let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
- let final self::Class2? #t214 = n2 in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
- nullable2 = let final self::Class2? #t218 = n2 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
- let final self::Class1? #t222 = n1 in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
- nullable2 = let final self::Class1? #t225 = n1 in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
- let final self::Class1? #t230 = n1 in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
- nullable2 = let final self::Class1? #t235 = n1 in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
- let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
- let final self::Class1? #t241 = n1 in #t241.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
- nullable2 = let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
- let final self::Class1? #t247 = n1 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
- let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
- nullable2 = let final self::Class1? #t252 = n1 in #t252.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
- let final self::Class1? #t257 = n1 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
- nullable2 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
- let final self::Class1? #t265 = n1 in #t265.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
- nullable2 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
- let final self::Class1? #t275 = n1 in #t275.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
- let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
- let final self::Class1? #t284 = n1 in #t284.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
- nullable1 = let final self::Class1? #t287 = n1 in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
- let final self::Class1? #t290 = n1 in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
- nullable1 = let final self::Class1? #t293 = n1 in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
- let final self::Class3? #t299 = n3 in #t299.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
- nullable2 = let final self::Class3? #t302 = n3 in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
- let final self::Class3? #t307 = n3 in #t307.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
- nullable2 = let final self::Class3? #t310 = n3 in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
- let final self::Class3? #t315 = n3 in #t315.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
- nullable2 = let final self::Class3? #t320 = n3 in #t320.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+ let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t170{self::Class1}, nullable1);
+ let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{void} null : self::Extension1|[]=(#t171{self::Class1}, nullable1, new self::Class1::•());
+ let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t173 = self::Extension1|[](#t172{self::Class1}, nullable1) in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t173{self::Class1});
+ let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t174{self::Class1}), nullable1);
+ let final self::Class1? #t175 = n1 in #t175.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t175{self::Class1}), nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t177 = self::Extension1|get#nonNullable1(#t176{self::Class1}) in let final self::Class1? #t178 = nullable1 in let final self::Class1 #t179 = new self::Class1::•() in let final void #t180 = self::Extension1|[]=(#t177, #t178, #t179) in #t179;
+ let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t182 = self::Extension1|[](self::Extension1|get#nonNullable1(#t181{self::Class1}), nullable1) in #t182.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t182{self::Class1});
+ let final self::Class1? #t183 = n1 in #t183.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t184 = self::Extension1|get#nonNullable2(#t183{self::Class1}) in let final self::Class2? #t185 = nullable2 in self::Extension2|[]=(#t184, #t185, self::Extension2|+(self::Extension2|[](#t184, #t185), 0));
+ nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = self::Extension1|get#nonNullable2(#t186{self::Class1}) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = self::Extension2|+(self::Extension2|[](#t187, #t188), 0) in let final void #t190 = self::Extension2|[]=(#t187, #t188, #t189) in #t189;
+ let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in self::Extension1|[](#t191{self::Class1}, #t192).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t191{self::Class1}, #t192, nullable1) : null;
+ nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = nullable1 in let final self::Class1? #t195 = self::Extension1|[](#t193{self::Class1}, #t194) in #t195.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t196 = nullable1 in let final void #t197 = self::Extension1|[]=(#t193{self::Class1}, #t194, #t196) in #t196 : #t195{self::Class1};
+ let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in self::Extension2|[]=(#t198{self::Class2}, #t199, self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0));
+ nullable2 = let final self::Class2? #t200 = n2 in #t200.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t201 = nullable2 in let final self::Class2 #t202 = self::Extension2|+(self::Extension2|[](#t200{self::Class2}, #t201), 0) in let final void #t203 = self::Extension2|[]=(#t200{self::Class2}, #t201, #t202) in #t202;
+ let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in self::Extension2|[]=(#t204{self::Class2}, #t205, self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0));
+ nullable2 = let final self::Class2? #t206 = n2 in #t206.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t207 = nullable2 in let final self::Class2 #t208 = self::Extension2|+(self::Extension2|[](#t206{self::Class2}, #t207), 0) in let final void #t209 = self::Extension2|[]=(#t206{self::Class2}, #t207, #t208) in #t208;
+ let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(self::Extension2|[](#t210{self::Class2}, #t211), 1));
+ nullable2 = let final self::Class2? #t212 = n2 in #t212.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t213 = nullable2 in let final self::Class2 #t214 = self::Extension2|[](#t212{self::Class2}, #t213) in let final void #t215 = self::Extension2|[]=(#t212{self::Class2}, #t213, self::Extension2|+(#t214, 1)) in #t214;
+ let final self::Class2? #t216 = n2 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in let final self::Class2 #t218 = self::Extension2|+(self::Extension2|[](#t216{self::Class2}, #t217), 1) in let final void #t219 = self::Extension2|[]=(#t216{self::Class2}, #t217, #t218) in #t218;
+ nullable2 = let final self::Class2? #t220 = n2 in #t220.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t221 = nullable2 in let final self::Class2 #t222 = self::Extension2|+(self::Extension2|[](#t220{self::Class2}, #t221), 1) in let final void #t223 = self::Extension2|[]=(#t220{self::Class2}, #t221, #t222) in #t222;
+ let final self::Class1? #t224 = n1 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t225 = self::Extension1|get#nonNullable2(#t224{self::Class1}) in let final self::Class2? #t226 = nullable2 in self::Extension2|[]=(#t225, #t226, self::Extension2|+(self::Extension2|[](#t225, #t226), 1));
+ nullable2 = let final self::Class1? #t227 = n1 in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t228 = self::Extension1|get#nonNullable2(#t227{self::Class1}) in let final self::Class2? #t229 = nullable2 in let final self::Class2 #t230 = self::Extension2|[](#t228, #t229) in let final void #t231 = self::Extension2|[]=(#t228, #t229, self::Extension2|+(#t230, 1)) in #t230;
+ let final self::Class1? #t232 = n1 in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t233 = self::Extension1|get#nonNullable2(#t232{self::Class1}) in let final self::Class2? #t234 = nullable2 in let final self::Class2 #t235 = self::Extension2|+(self::Extension2|[](#t233, #t234), 1) in let final void #t236 = self::Extension2|[]=(#t233, #t234, #t235) in #t235;
+ nullable2 = let final self::Class1? #t237 = n1 in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t238 = self::Extension1|get#nonNullable2(#t237{self::Class1}) in let final self::Class2? #t239 = nullable2 in let final self::Class2 #t240 = self::Extension2|+(self::Extension2|[](#t238, #t239), 1) in let final void #t241 = self::Extension2|[]=(#t238, #t239, #t240) in #t240;
+ let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2), nullable2);
+ let final self::Class1? #t243 = n1 in #t243.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t243{self::Class1}), nullable2), nullable2, new self::Class2::•());
+ nullable2 = let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t245 = self::Extension2|[](self::Extension1|get#nonNullable2(#t244{self::Class1}), nullable2) in let final self::Class2? #t246 = nullable2 in let final self::Class2 #t247 = new self::Class2::•() in let final void #t248 = self::Extension2|[]=(#t245, #t246, #t247) in #t247;
+ let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t250 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2), nullable2) in #t250.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t250{self::Class2});
+ let final self::Class1? #t251 = n1 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = self::Extension2|[](self::Extension1|get#nonNullable2(#t251{self::Class1}), nullable2) in let final self::Class2? #t253 = nullable2 in self::Extension2|[]=(#t252, #t253, self::Extension2|+(self::Extension2|[](#t252, #t253), 0));
+ nullable2 = let final self::Class1? #t254 = n1 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = self::Extension2|[](self::Extension1|get#nonNullable2(#t254{self::Class1}), nullable2) in let final self::Class2? #t256 = nullable2 in let final self::Class2 #t257 = self::Extension2|+(self::Extension2|[](#t255, #t256), 0) in let final void #t258 = self::Extension2|[]=(#t255, #t256, #t257) in #t257;
+ let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t260 = self::Extension2|[](self::Extension1|get#nonNullable2(#t259{self::Class1}), nullable2) in let final self::Class2? #t261 = nullable2 in self::Extension2|[]=(#t260, #t261, self::Extension2|+(self::Extension2|[](#t260, #t261), 1));
+ nullable2 = let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t263 = self::Extension2|[](self::Extension1|get#nonNullable2(#t262{self::Class1}), nullable2) in let final self::Class2? #t264 = nullable2 in let final self::Class2 #t265 = self::Extension2|[](#t263, #t264) in let final void #t266 = self::Extension2|[]=(#t263, #t264, self::Extension2|+(#t265, 1)) in #t265;
+ let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t268 = self::Extension2|[](self::Extension1|get#nonNullable2(#t267{self::Class1}), nullable2) in let final self::Class2? #t269 = nullable2 in let final self::Class2 #t270 = self::Extension2|+(self::Extension2|[](#t268, #t269), 1) in let final void #t271 = self::Extension2|[]=(#t268, #t269, #t270) in #t270;
+ nullable2 = let final self::Class1? #t272 = n1 in #t272.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t273 = self::Extension2|[](self::Extension1|get#nonNullable2(#t272{self::Class1}), nullable2) in let final self::Class2? #t274 = nullable2 in let final self::Class2 #t275 = self::Extension2|+(self::Extension2|[](#t273, #t274), 1) in let final void #t276 = self::Extension2|[]=(#t273, #t274, #t275) in #t275;
+ let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t278{self::Class1}, nullable1);
+ let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t280{self::Class1}, nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t281 = n1 in #t281.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t282 = self::Extension1|[](#t281{self::Class1}, nullable1) in #t282.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t283 = nullable1 in let final self::Class1 #t284 = new self::Class1::•() in let final void #t285 = self::Extension1|[]=(#t282{self::Class1}, #t283, #t284) in #t284;
+ let final self::Class1? #t286 = n1 in #t286.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t287 = self::Extension1|[](#t286{self::Class1}, nullable1) in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t288{self::Class1});
+ nullable1 = let final self::Class1? #t289 = n1 in #t289.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t290 = self::Extension1|[](#t289{self::Class1}, nullable1) in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t291{self::Class1});
+ let final self::Class1? #t292 = n1 in #t292.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t293 = self::Extension1|[](#t292{self::Class1}, nullable1) in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = nullable1 in self::Extension1|[](#t293{self::Class1}, #t294).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t293{self::Class1}, #t294, nullable1) : null;
+ nullable1 = let final self::Class1? #t295 = n1 in #t295.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t296 = self::Extension1|[](#t295{self::Class1}, nullable1) in #t296.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t297 = nullable1 in let final self::Class1? #t298 = self::Extension1|[](#t296{self::Class1}, #t297) in #t298.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t299 = nullable1 in let final void #t300 = self::Extension1|[]=(#t296{self::Class1}, #t297, #t299) in #t299 : #t298{self::Class1};
+ let final self::Class3? #t301 = n3 in #t301.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t302 = self::Extension3|[](#t301{self::Class3}, nullable3) in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = nullable2 in self::Extension2|[]=(#t302{self::Class2}, #t303, self::Extension2|+(self::Extension2|[](#t302{self::Class2}, #t303), 0));
+ nullable2 = let final self::Class3? #t304 = n3 in #t304.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t305 = self::Extension3|[](#t304{self::Class3}, nullable3) in #t305.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t306 = nullable2 in let final self::Class2 #t307 = self::Extension2|+(self::Extension2|[](#t305{self::Class2}, #t306), 0) in let final void #t308 = self::Extension2|[]=(#t305{self::Class2}, #t306, #t307) in #t307;
+ let final self::Class3? #t309 = n3 in #t309.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t310 = self::Extension3|[](#t309{self::Class3}, nullable3) in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = nullable2 in self::Extension2|[]=(#t310{self::Class2}, #t311, self::Extension2|+(self::Extension2|[](#t310{self::Class2}, #t311), 1));
+ nullable2 = let final self::Class3? #t312 = n3 in #t312.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t313 = self::Extension3|[](#t312{self::Class3}, nullable3) in #t313.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t314 = nullable2 in let final self::Class2 #t315 = self::Extension2|[](#t313{self::Class2}, #t314) in let final void #t316 = self::Extension2|[]=(#t313{self::Class2}, #t314, self::Extension2|+(#t315, 1)) in #t315;
+ let final self::Class3? #t317 = n3 in #t317.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t318 = self::Extension3|[](#t317{self::Class3}, nullable3) in #t318.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t319 = nullable2 in let final self::Class2 #t320 = self::Extension2|+(self::Extension2|[](#t318{self::Class2}, #t319), 1) in let final void #t321 = self::Extension2|[]=(#t318{self::Class2}, #t319, #t320) in #t320;
+ nullable2 = let final self::Class3? #t322 = n3 in #t322.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t323 = self::Extension3|[](#t322{self::Class3}, nullable3) in #t323.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t324 = nullable2 in let final self::Class2 #t325 = self::Extension2|+(self::Extension2|[](#t323{self::Class2}, #t324), 1) in let final void #t326 = self::Extension2|[]=(#t323{self::Class2}, #t324, #t325) in #t325;
}
static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
self::Class2? nullable2 = n2;
- self::throws(() → self::Class1? => self::Extension1|+(let final self::Class1? #t325 = n1 in #t325.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
- self::throws(() → self::Class1? => self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
- let final self::Class2? #t327 = n2 in #t327.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t327{self::Class2}), 0));
- nullable2 = let final self::Class2? #t328 = n2 in #t328.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328{self::Class2}), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328{self::Class2}, #t329) in #t329;
- let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
- nullable2 = let final self::Class2? #t333 = n2 in #t333.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
- let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t337{self::Class2}), 1));
- nullable2 = let final self::Class2? #t338 = n2 in #t338.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final self::Class2 #t340 = let final self::Class2 #t341 = self::Extension2|+(#t339, 1) in let final void #t342 = self::Extension2|set#nonNullable2(#t338{self::Class2}, #t341) in #t341 in #t339;
- let final self::Class2? #t343 = n2 in #t343.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t344 = self::Extension2|+(self::Extension2|get#nonNullable2(#t343{self::Class2}), 1) in let final void #t345 = self::Extension2|set#nonNullable2(#t343{self::Class2}, #t344) in #t344;
- nullable2 = let final self::Class2? #t346 = n2 in #t346.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t347 = self::Extension2|+(self::Extension2|get#nonNullable2(#t346{self::Class2}), 1) in let final void #t348 = self::Extension2|set#nonNullable2(#t346{self::Class2}, #t347) in #t347;
+ self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+ throws(() => Extension1(n1)?.nonNullable1 + 0);
+ ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
+ self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+ throws(() => -Extension1(n1)?.nonNullable1);
+ ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
+ let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t331{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t331{self::Class2}), 0));
+ nullable2 = let final self::Class2? #t332 = n2 in #t332.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t333 = self::Extension2|+(self::Extension2|get#nonNullable2(#t332{self::Class2}), 0) in let final void #t334 = self::Extension2|set#nonNullable2(#t332{self::Class2}, #t333) in #t333;
+ let final self::Class2? #t335 = n2 in #t335.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t336 = self::Extension2|get#nonNullable2(#t335{self::Class2}) in self::Extension2|set#nonNullable2(#t336, self::Extension2|+(self::Extension2|get#nonNullable2(#t336), 0));
+ nullable2 = let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t338 = self::Extension2|get#nonNullable2(#t337{self::Class2}) in let final self::Class2 #t339 = self::Extension2|+(self::Extension2|get#nonNullable2(#t338), 0) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, #t339) in #t339;
+ let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t341{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t341{self::Class2}), 1));
+ nullable2 = let final self::Class2? #t342 = n2 in #t342.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t343 = self::Extension2|get#nonNullable2(#t342{self::Class2}) in let final self::Class2 #t344 = let final self::Class2 #t345 = self::Extension2|+(#t343, 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t342{self::Class2}, #t345) in #t345 in #t343;
+ let final self::Class2? #t347 = n2 in #t347.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t348 = self::Extension2|+(self::Extension2|get#nonNullable2(#t347{self::Class2}), 1) in let final void #t349 = self::Extension2|set#nonNullable2(#t347{self::Class2}, #t348) in #t348;
+ nullable2 = let final self::Class2? #t350 = n2 in #t350.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t351 = self::Extension2|+(self::Extension2|get#nonNullable2(#t350{self::Class2}), 1) in let final void #t352 = self::Extension2|set#nonNullable2(#t350{self::Class2}, #t351) in #t351;
}
static method ifNull(self::Class1? n1) → void {
self::Class1? nullable1 = n1;
- let final self::Class1? #t349 = n1 in #t349.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t349).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t349, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t350 = n1 in #t350.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t351 = self::Extension1|get#nullable1(#t350) in #t351.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t352 = n1{self::Class1} in let final void #t353 = self::Extension1|set#nullable1(#t350, #t352) in #t352 : #t351{self::Class1};
- let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in self::Extension1|get#nullable1(#t355{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t355{self::Class1}, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t356 = n1 in #t356.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in let final self::Class1? #t358 = self::Extension1|get#nullable1(#t357{self::Class1}) in #t358.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t359 = n1{self::Class1} in let final void #t360 = self::Extension1|set#nullable1(#t357{self::Class1}, #t359) in #t359 : #t358{self::Class1};
- let final self::Class1? #t361 = n1 in #t361.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t362 = self::Extension1|get#nonNullable1(#t361{self::Class1}) in let final self::Class1 #t363 = n1{self::Class1} in self::Extension1|[](#t362, #t363).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t362, #t363, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t364 = n1 in #t364.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t365 = self::Extension1|get#nonNullable1(#t364{self::Class1}) in let final self::Class1 #t366 = n1{self::Class1} in let final self::Class1? #t367 = self::Extension1|[](#t365, #t366) in #t367.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t368 = n1{self::Class1} in let final void #t369 = self::Extension1|[]=(#t365, #t366, #t368) in #t368 : #t367{self::Class1};
+ let final self::Class1? #t353 = n1 in #t353.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t353).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t353, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nullable1(#t354) in #t355.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t356 = n1{self::Class1} in let final void #t357 = self::Extension1|set#nullable1(#t354, #t356) in #t356 : #t355{self::Class1};
+ let final self::Class1? #t358 = n1 in #t358.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t359 = self::Extension1|get#nonNullable1(#t358{self::Class1}) in self::Extension1|get#nullable1(#t359{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t359{self::Class1}, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t360 = n1 in #t360.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t361 = self::Extension1|get#nonNullable1(#t360{self::Class1}) in let final self::Class1? #t362 = self::Extension1|get#nullable1(#t361{self::Class1}) in #t362.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t363 = n1{self::Class1} in let final void #t364 = self::Extension1|set#nullable1(#t361{self::Class1}, #t363) in #t363 : #t362{self::Class1};
+ let final self::Class1? #t365 = n1 in #t365.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t366 = self::Extension1|get#nonNullable1(#t365{self::Class1}) in let final self::Class1 #t367 = n1{self::Class1} in self::Extension1|[](#t366, #t367).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t366, #t367, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t368 = n1 in #t368.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t369 = self::Extension1|get#nonNullable1(#t368{self::Class1}) in let final self::Class1 #t370 = n1{self::Class1} in let final self::Class1? #t371 = self::Extension1|[](#t369, #t370) in #t371.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t372 = n1{self::Class1} in let final void #t373 = self::Extension1|[]=(#t369, #t370, #t372) in #t372 : #t371{self::Class1};
}
static method throws(() → void f) → void {
try {
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.expect
index dce5931..51808db 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.expect
@@ -2,24 +2,24 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
// Try accessing using ?. instead.
// throws(() => (n1?.nullable1 = new Class1()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
// Try accessing using ?. instead.
// throws(() => (n1?.nonNullable1Method()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
// throws(() => n1?.nonNullable1 + 0);
// ^
//
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
// throws(() => -n1?.nonNullable1);
// ^
@@ -139,139 +139,153 @@
let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
- self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
- self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
- nullable1 = let final self::Class1? #t23 = n1 in #t23.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
- nullable1 = let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
- nullable1 = let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
- let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
- let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
- let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
- nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
- let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
- let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
- let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
- let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
- let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
- let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
- nullable1 = let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
- let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
- let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
- nullable1 = let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
- let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
- nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
- let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
- nullable1 = let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
- let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
- let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
- let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
- let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
- let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
- nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
- let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t94 = n1 in #t94.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
- let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
- nullable1 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
- let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
- nullable1 = let final self::Class1? #t110 = n1 in #t110.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
- let final self::Class1? #t117 = n1 in #t117.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
- nullable1 = let final self::Class1? #t120 = n1 in #t120.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
- let final self::Class1? #t125 = n1 in #t125.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t126 = n1 in #t126.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
- let final self::Class1? #t129 = n1 in #t129.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
- nullable1 = let final self::Class1? #t132 = n1 in #t132.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
- let final self::Class1? #t137 = n1 in #t137.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
- let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
- let final self::Class1? #t142 = n1 in #t142.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
- nullable1 = let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
- let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
- let final self::Class1? #t147 = n1 in #t147.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
- nullable1 = let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
- let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
- nullable1 = let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
- let final self::Class1? #t159 = n1 in #t159.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
- nullable1 = let final self::Class1? #t160 = n1 in #t160.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
- let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
- let final self::Class1? #t164 = n1 in #t164.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
- let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
- let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{self::Class1});
+ self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+Try accessing using ?. instead.
+ throws(() => (n1?.nullable1 = new Class1()).nullable1);
+ ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
+ self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+Try accessing using ?. instead.
+ throws(() => (n1?.nonNullable1Method()).nullable1);
+ ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t24{self::Class1})));
+ nullable1 = let final self::Class1? #t25 = n1 in #t25.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t26 = new self::Class1::•() in let final void #t27 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t25{self::Class1}), #t26) in #t26;
+ nullable1 = let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t29 = self::Extension1|get#nullable1(#t28{self::Class1}) in #t29.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t30 = new self::Class1::•() in let final void #t31 = self::Extension1|set#nullable1(#t29{self::Class1}, #t30) in #t30;
+ nullable1 = let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t33 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t32{self::Class1})) in #t33.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t34 = new self::Class1::•() in let final void #t35 = self::Extension1|set#nullable1(#t33{self::Class1}, #t34) in #t34;
+ let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t37 = self::Extension1|get#nullable1(#t36{self::Class1}) in #t37.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t37{self::Class1});
+ let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t38{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t40 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t41 = self::Extension1|set#nullable1(#t39{self::Class1}, #t40) in #t40;
+ let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t42{self::Class1}, let final self::Class1 #t43 = new self::Class1::•() in let final void #t44 = self::Extension1|set#nullable1(new self::Class1::•(), #t43) in #t43);
+ nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t46 = let final self::Class1 #t47 = new self::Class1::•() in let final void #t48 = self::Extension1|set#nullable1(new self::Class1::•(), #t47) in #t47 in let final void #t49 = self::Extension1|set#nullable1(#t45{self::Class1}, #t46) in #t46;
+ let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t50{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t52 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t53 = self::Extension1|set#nullable1(#t51{self::Class1}, #t52) in #t52;
+ let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+ let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t55{self::Class1}), new self::Class1::•());
+ let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t56{self::Class1}));
+ let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})));
+ let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t58{self::Class1})), new self::Class1::•());
+ nullable1 = let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t60 = new self::Class1::•() in let final void #t61 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t59{self::Class1})), #t60) in #t60;
+ let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t63 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t62{self::Class1})) in #t63.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t63{self::Class1});
+ let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t64{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t66 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t67 = self::Extension1|set#nullable1(#t65{self::Class1}, #t66) in #t66;
+ let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t68{self::Class1}, let final self::Class1 #t69 = new self::Class1::•() in let final void #t70 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t69) in #t69);
+ nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t72 = let final self::Class1 #t73 = new self::Class1::•() in let final void #t74 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t73) in #t73 in let final void #t75 = self::Extension1|set#nullable1(#t71{self::Class1}, #t72) in #t72;
+ let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t76{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t78 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t79 = self::Extension1|set#nullable1(#t77{self::Class1}, #t78) in #t78;
+ let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+ let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t81{self::Class1})), new self::Class1::•());
+ let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t82{self::Class1})));
+ let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t83{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t86 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t84{self::Class1}), #t85) in #t85;
+ let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t87{self::Class1}), let final self::Class1 #t88 = new self::Class1::•() in let final void #t89 = self::Extension1|set#nullable1(new self::Class1::•(), #t88) in #t88);
+ nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = let final self::Class1 #t92 = new self::Class1::•() in let final void #t93 = self::Extension1|set#nullable1(new self::Class1::•(), #t92) in #t92 in let final void #t94 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t90{self::Class1}), #t91) in #t91;
+ let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t95{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t96 = n1 in #t96.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t97 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t98 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t96{self::Class1}), #t97) in #t97;
+ let final self::Class1? #t99 = n1 in #t99.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t99{self::Class1}, let final self::Class1? #t100 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t101 = self::Extension1|set#nullable1(new self::Class1::•(), #t100) in #t100);
+ nullable1 = let final self::Class1? #t102 = n1 in #t102.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t103 = let final self::Class1? #t104 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t105 = self::Extension1|set#nullable1(new self::Class1::•(), #t104) in #t104 in let final void #t106 = self::Extension1|set#nullable1(#t102{self::Class1}, #t103) in #t103;
+ let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t107{self::Class1}, let final self::Class1 #t108 = let final self::Class1 #t109 = new self::Class1::•() in let final void #t110 = self::Extension1|set#nullable1(new self::Class1::•(), #t109) in #t109 in let final void #t111 = self::Extension1|set#nullable1(new self::Class1::•(), #t108) in #t108);
+ nullable1 = let final self::Class1? #t112 = n1 in #t112.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t113 = let final self::Class1 #t114 = let final self::Class1 #t115 = new self::Class1::•() in let final void #t116 = self::Extension1|set#nullable1(new self::Class1::•(), #t115) in #t115 in let final void #t117 = self::Extension1|set#nullable1(new self::Class1::•(), #t114) in #t114 in let final void #t118 = self::Extension1|set#nullable1(#t112{self::Class1}, #t113) in #t113;
+ let final self::Class1? #t119 = n1 in #t119.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t119{self::Class1}, let final self::Class1 #t120 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t121 = self::Extension1|set#nullable1(new self::Class1::•(), #t120) in #t120);
+ nullable1 = let final self::Class1? #t122 = n1 in #t122.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t123 = let final self::Class1 #t124 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t125 = self::Extension1|set#nullable1(new self::Class1::•(), #t124) in #t124 in let final void #t126 = self::Extension1|set#nullable1(#t122{self::Class1}, #t123) in #t123;
+ let final self::Class1? #t127 = n1 in #t127.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t127{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t128 = n1 in #t128.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t129 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t130 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t128{self::Class1}), #t129) in #t129;
+ let final self::Class1? #t131 = n1 in #t131.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t131{self::Class1}), let final self::Class1 #t132 = new self::Class1::•() in let final void #t133 = self::Extension1|set#nullable1(new self::Class1::•(), #t132) in #t132);
+ nullable1 = let final self::Class1? #t134 = n1 in #t134.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t135 = let final self::Class1 #t136 = new self::Class1::•() in let final void #t137 = self::Extension1|set#nullable1(new self::Class1::•(), #t136) in #t136 in let final void #t138 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t134{self::Class1}), #t135) in #t135;
+ let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t139{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t140 = n1 in #t140.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t141 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t142 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t140{self::Class1}), #t141) in #t141;
+ let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})));
+ let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t144{self::Class1})), new self::Class1::•());
+ nullable1 = let final self::Class1? #t145 = n1 in #t145.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t146 = new self::Class1::•() in let final void #t147 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t145{self::Class1})), #t146) in #t146;
+ let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t148{self::Class1})));
+ let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t149{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t150 = n1 in #t150.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t151 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t152 = self::Extension1|set#nullable1(#t150{self::Class1}, #t151) in #t151;
+ let final self::Class1? #t153 = n1 in #t153.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t153{self::Class1}, let final self::Class1 #t154 = new self::Class1::•() in let final void #t155 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t154) in #t154);
+ nullable1 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t157 = let final self::Class1 #t158 = new self::Class1::•() in let final void #t159 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t158) in #t158 in let final void #t160 = self::Extension1|set#nullable1(#t156{self::Class1}, #t157) in #t157;
+ let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t161{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t162 = n1 in #t162.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t163 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t164 = self::Extension1|set#nullable1(#t162{self::Class1}, #t163) in #t163;
+ let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+ let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t166{self::Class1})), new self::Class1::•());
+ let final self::Class1? #t167 = n1 in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t167{self::Class1})));
+ let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t169 = self::Extension1|nonNullable1Method(#t168{self::Class1}) in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t169{self::Class1});
}
static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
self::Class1? nullable1 = n1;
self::Class2? nullable2 = n2;
self::Class3? nullable3 = n3;
- let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
- let final self::Class1? #t169 = n1 in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
- let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
- let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
- let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
- let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
- let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
- nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
- let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
- nullable1 = let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
- let final self::Class2? #t196 = n2 in #t196.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
- nullable2 = let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
- let final self::Class2? #t202 = n2 in #t202.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
- nullable2 = let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
- let final self::Class2? #t208 = n2 in #t208.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
- nullable2 = let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
- let final self::Class2? #t214 = n2 in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
- nullable2 = let final self::Class2? #t218 = n2 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
- let final self::Class1? #t222 = n1 in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
- nullable2 = let final self::Class1? #t225 = n1 in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
- let final self::Class1? #t230 = n1 in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
- nullable2 = let final self::Class1? #t235 = n1 in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
- let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
- let final self::Class1? #t241 = n1 in #t241.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
- nullable2 = let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
- let final self::Class1? #t247 = n1 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
- let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
- nullable2 = let final self::Class1? #t252 = n1 in #t252.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
- let final self::Class1? #t257 = n1 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
- nullable2 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
- let final self::Class1? #t265 = n1 in #t265.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
- nullable2 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
- let final self::Class1? #t275 = n1 in #t275.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
- let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
- let final self::Class1? #t284 = n1 in #t284.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
- nullable1 = let final self::Class1? #t287 = n1 in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
- let final self::Class1? #t290 = n1 in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
- nullable1 = let final self::Class1? #t293 = n1 in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
- let final self::Class3? #t299 = n3 in #t299.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
- nullable2 = let final self::Class3? #t302 = n3 in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
- let final self::Class3? #t307 = n3 in #t307.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
- nullable2 = let final self::Class3? #t310 = n3 in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
- let final self::Class3? #t315 = n3 in #t315.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
- nullable2 = let final self::Class3? #t320 = n3 in #t320.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+ let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t170{self::Class1}, nullable1);
+ let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t171{self::Class1}, nullable1, new self::Class1::•());
+ let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t173 = self::Extension1|[](#t172{self::Class1}, nullable1) in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t173{self::Class1});
+ let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t174{self::Class1}), nullable1);
+ let final self::Class1? #t175 = n1 in #t175.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t175{self::Class1}), nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t177 = self::Extension1|get#nonNullable1(#t176{self::Class1}) in let final self::Class1? #t178 = nullable1 in let final self::Class1 #t179 = new self::Class1::•() in let final void #t180 = self::Extension1|[]=(#t177, #t178, #t179) in #t179;
+ let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t182 = self::Extension1|[](self::Extension1|get#nonNullable1(#t181{self::Class1}), nullable1) in #t182.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t182{self::Class1});
+ let final self::Class1? #t183 = n1 in #t183.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t184 = self::Extension1|get#nonNullable2(#t183{self::Class1}) in let final self::Class2? #t185 = nullable2 in self::Extension2|[]=(#t184, #t185, self::Extension2|+(self::Extension2|[](#t184, #t185), 0));
+ nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = self::Extension1|get#nonNullable2(#t186{self::Class1}) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = self::Extension2|+(self::Extension2|[](#t187, #t188), 0) in let final void #t190 = self::Extension2|[]=(#t187, #t188, #t189) in #t189;
+ let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in self::Extension1|[](#t191{self::Class1}, #t192).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t191{self::Class1}, #t192, nullable1) : null;
+ nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = nullable1 in let final self::Class1? #t195 = self::Extension1|[](#t193{self::Class1}, #t194) in #t195.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t196 = nullable1 in let final void #t197 = self::Extension1|[]=(#t193{self::Class1}, #t194, #t196) in #t196 : #t195{self::Class1};
+ let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in self::Extension2|[]=(#t198{self::Class2}, #t199, self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0));
+ nullable2 = let final self::Class2? #t200 = n2 in #t200.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t201 = nullable2 in let final self::Class2 #t202 = self::Extension2|+(self::Extension2|[](#t200{self::Class2}, #t201), 0) in let final void #t203 = self::Extension2|[]=(#t200{self::Class2}, #t201, #t202) in #t202;
+ let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in self::Extension2|[]=(#t204{self::Class2}, #t205, self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0));
+ nullable2 = let final self::Class2? #t206 = n2 in #t206.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t207 = nullable2 in let final self::Class2 #t208 = self::Extension2|+(self::Extension2|[](#t206{self::Class2}, #t207), 0) in let final void #t209 = self::Extension2|[]=(#t206{self::Class2}, #t207, #t208) in #t208;
+ let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(self::Extension2|[](#t210{self::Class2}, #t211), 1));
+ nullable2 = let final self::Class2? #t212 = n2 in #t212.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t213 = nullable2 in let final self::Class2 #t214 = self::Extension2|[](#t212{self::Class2}, #t213) in let final void #t215 = self::Extension2|[]=(#t212{self::Class2}, #t213, self::Extension2|+(#t214, 1)) in #t214;
+ let final self::Class2? #t216 = n2 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in let final self::Class2 #t218 = self::Extension2|+(self::Extension2|[](#t216{self::Class2}, #t217), 1) in let final void #t219 = self::Extension2|[]=(#t216{self::Class2}, #t217, #t218) in #t218;
+ nullable2 = let final self::Class2? #t220 = n2 in #t220.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t221 = nullable2 in let final self::Class2 #t222 = self::Extension2|+(self::Extension2|[](#t220{self::Class2}, #t221), 1) in let final void #t223 = self::Extension2|[]=(#t220{self::Class2}, #t221, #t222) in #t222;
+ let final self::Class1? #t224 = n1 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t225 = self::Extension1|get#nonNullable2(#t224{self::Class1}) in let final self::Class2? #t226 = nullable2 in self::Extension2|[]=(#t225, #t226, self::Extension2|+(self::Extension2|[](#t225, #t226), 1));
+ nullable2 = let final self::Class1? #t227 = n1 in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t228 = self::Extension1|get#nonNullable2(#t227{self::Class1}) in let final self::Class2? #t229 = nullable2 in let final self::Class2 #t230 = self::Extension2|[](#t228, #t229) in let final void #t231 = self::Extension2|[]=(#t228, #t229, self::Extension2|+(#t230, 1)) in #t230;
+ let final self::Class1? #t232 = n1 in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t233 = self::Extension1|get#nonNullable2(#t232{self::Class1}) in let final self::Class2? #t234 = nullable2 in let final self::Class2 #t235 = self::Extension2|+(self::Extension2|[](#t233, #t234), 1) in let final void #t236 = self::Extension2|[]=(#t233, #t234, #t235) in #t235;
+ nullable2 = let final self::Class1? #t237 = n1 in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t238 = self::Extension1|get#nonNullable2(#t237{self::Class1}) in let final self::Class2? #t239 = nullable2 in let final self::Class2 #t240 = self::Extension2|+(self::Extension2|[](#t238, #t239), 1) in let final void #t241 = self::Extension2|[]=(#t238, #t239, #t240) in #t240;
+ let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2), nullable2);
+ let final self::Class1? #t243 = n1 in #t243.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t243{self::Class1}), nullable2), nullable2, new self::Class2::•());
+ nullable2 = let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t245 = self::Extension2|[](self::Extension1|get#nonNullable2(#t244{self::Class1}), nullable2) in let final self::Class2? #t246 = nullable2 in let final self::Class2 #t247 = new self::Class2::•() in let final void #t248 = self::Extension2|[]=(#t245, #t246, #t247) in #t247;
+ let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t250 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2), nullable2) in #t250.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t250{self::Class2});
+ let final self::Class1? #t251 = n1 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = self::Extension2|[](self::Extension1|get#nonNullable2(#t251{self::Class1}), nullable2) in let final self::Class2? #t253 = nullable2 in self::Extension2|[]=(#t252, #t253, self::Extension2|+(self::Extension2|[](#t252, #t253), 0));
+ nullable2 = let final self::Class1? #t254 = n1 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = self::Extension2|[](self::Extension1|get#nonNullable2(#t254{self::Class1}), nullable2) in let final self::Class2? #t256 = nullable2 in let final self::Class2 #t257 = self::Extension2|+(self::Extension2|[](#t255, #t256), 0) in let final void #t258 = self::Extension2|[]=(#t255, #t256, #t257) in #t257;
+ let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t260 = self::Extension2|[](self::Extension1|get#nonNullable2(#t259{self::Class1}), nullable2) in let final self::Class2? #t261 = nullable2 in self::Extension2|[]=(#t260, #t261, self::Extension2|+(self::Extension2|[](#t260, #t261), 1));
+ nullable2 = let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t263 = self::Extension2|[](self::Extension1|get#nonNullable2(#t262{self::Class1}), nullable2) in let final self::Class2? #t264 = nullable2 in let final self::Class2 #t265 = self::Extension2|[](#t263, #t264) in let final void #t266 = self::Extension2|[]=(#t263, #t264, self::Extension2|+(#t265, 1)) in #t265;
+ let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t268 = self::Extension2|[](self::Extension1|get#nonNullable2(#t267{self::Class1}), nullable2) in let final self::Class2? #t269 = nullable2 in let final self::Class2 #t270 = self::Extension2|+(self::Extension2|[](#t268, #t269), 1) in let final void #t271 = self::Extension2|[]=(#t268, #t269, #t270) in #t270;
+ nullable2 = let final self::Class1? #t272 = n1 in #t272.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t273 = self::Extension2|[](self::Extension1|get#nonNullable2(#t272{self::Class1}), nullable2) in let final self::Class2? #t274 = nullable2 in let final self::Class2 #t275 = self::Extension2|+(self::Extension2|[](#t273, #t274), 1) in let final void #t276 = self::Extension2|[]=(#t273, #t274, #t275) in #t275;
+ let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t278{self::Class1}, nullable1);
+ let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t280{self::Class1}, nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t281 = n1 in #t281.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t282 = self::Extension1|[](#t281{self::Class1}, nullable1) in #t282.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t283 = nullable1 in let final self::Class1 #t284 = new self::Class1::•() in let final void #t285 = self::Extension1|[]=(#t282{self::Class1}, #t283, #t284) in #t284;
+ let final self::Class1? #t286 = n1 in #t286.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t287 = self::Extension1|[](#t286{self::Class1}, nullable1) in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t288{self::Class1});
+ nullable1 = let final self::Class1? #t289 = n1 in #t289.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t290 = self::Extension1|[](#t289{self::Class1}, nullable1) in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t291{self::Class1});
+ let final self::Class1? #t292 = n1 in #t292.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t293 = self::Extension1|[](#t292{self::Class1}, nullable1) in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = nullable1 in self::Extension1|[](#t293{self::Class1}, #t294).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t293{self::Class1}, #t294, nullable1) : null;
+ nullable1 = let final self::Class1? #t295 = n1 in #t295.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t296 = self::Extension1|[](#t295{self::Class1}, nullable1) in #t296.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t297 = nullable1 in let final self::Class1? #t298 = self::Extension1|[](#t296{self::Class1}, #t297) in #t298.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t299 = nullable1 in let final void #t300 = self::Extension1|[]=(#t296{self::Class1}, #t297, #t299) in #t299 : #t298{self::Class1};
+ let final self::Class3? #t301 = n3 in #t301.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t302 = self::Extension3|[](#t301{self::Class3}, nullable3) in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = nullable2 in self::Extension2|[]=(#t302{self::Class2}, #t303, self::Extension2|+(self::Extension2|[](#t302{self::Class2}, #t303), 0));
+ nullable2 = let final self::Class3? #t304 = n3 in #t304.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t305 = self::Extension3|[](#t304{self::Class3}, nullable3) in #t305.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t306 = nullable2 in let final self::Class2 #t307 = self::Extension2|+(self::Extension2|[](#t305{self::Class2}, #t306), 0) in let final void #t308 = self::Extension2|[]=(#t305{self::Class2}, #t306, #t307) in #t307;
+ let final self::Class3? #t309 = n3 in #t309.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t310 = self::Extension3|[](#t309{self::Class3}, nullable3) in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = nullable2 in self::Extension2|[]=(#t310{self::Class2}, #t311, self::Extension2|+(self::Extension2|[](#t310{self::Class2}, #t311), 1));
+ nullable2 = let final self::Class3? #t312 = n3 in #t312.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t313 = self::Extension3|[](#t312{self::Class3}, nullable3) in #t313.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t314 = nullable2 in let final self::Class2 #t315 = self::Extension2|[](#t313{self::Class2}, #t314) in let final void #t316 = self::Extension2|[]=(#t313{self::Class2}, #t314, self::Extension2|+(#t315, 1)) in #t315;
+ let final self::Class3? #t317 = n3 in #t317.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t318 = self::Extension3|[](#t317{self::Class3}, nullable3) in #t318.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t319 = nullable2 in let final self::Class2 #t320 = self::Extension2|+(self::Extension2|[](#t318{self::Class2}, #t319), 1) in let final void #t321 = self::Extension2|[]=(#t318{self::Class2}, #t319, #t320) in #t320;
+ nullable2 = let final self::Class3? #t322 = n3 in #t322.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t323 = self::Extension3|[](#t322{self::Class3}, nullable3) in #t323.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t324 = nullable2 in let final self::Class2 #t325 = self::Extension2|+(self::Extension2|[](#t323{self::Class2}, #t324), 1) in let final void #t326 = self::Extension2|[]=(#t323{self::Class2}, #t324, #t325) in #t325;
}
static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
self::Class2? nullable2 = n2;
- self::throws(() → self::Class1? => self::Extension1|+(let final self::Class1? #t325 = n1 in #t325.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
- self::throws(() → self::Class1? => self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
- let final self::Class2? #t327 = n2 in #t327.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327, self::Extension2|+(self::Extension2|get#nonNullable2(#t327), 0));
- nullable2 = let final self::Class2? #t328 = n2 in #t328.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328, #t329) in #t329;
- let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
- nullable2 = let final self::Class2? #t333 = n2 in #t333.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
- let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337, self::Extension2|+(self::Extension2|get#nonNullable2(#t337), 1));
- nullable2 = let final self::Class2? #t338 = n2 in #t338.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, self::Extension2|+(#t339, 1)) in #t339;
- let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t342 = self::Extension2|+(self::Extension2|get#nonNullable2(#t341), 1) in let final void #t343 = self::Extension2|set#nonNullable2(#t341, #t342) in #t342;
- nullable2 = let final self::Class2? #t344 = n2 in #t344.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t345 = self::Extension2|+(self::Extension2|get#nonNullable2(#t344), 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t344, #t345) in #t345;
+ self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+ throws(() => n1?.nonNullable1 + 0);
+ ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
+ self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+ throws(() => -n1?.nonNullable1);
+ ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
+ let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t331, self::Extension2|+(self::Extension2|get#nonNullable2(#t331), 0));
+ nullable2 = let final self::Class2? #t332 = n2 in #t332.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t333 = self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0) in let final void #t334 = self::Extension2|set#nonNullable2(#t332, #t333) in #t333;
+ let final self::Class2? #t335 = n2 in #t335.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t336 = self::Extension2|get#nonNullable2(#t335{self::Class2}) in self::Extension2|set#nonNullable2(#t336, self::Extension2|+(self::Extension2|get#nonNullable2(#t336), 0));
+ nullable2 = let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t338 = self::Extension2|get#nonNullable2(#t337{self::Class2}) in let final self::Class2 #t339 = self::Extension2|+(self::Extension2|get#nonNullable2(#t338), 0) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, #t339) in #t339;
+ let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t341, self::Extension2|+(self::Extension2|get#nonNullable2(#t341), 1));
+ nullable2 = let final self::Class2? #t342 = n2 in #t342.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t343 = self::Extension2|get#nonNullable2(#t342) in let final void #t344 = self::Extension2|set#nonNullable2(#t342, self::Extension2|+(#t343, 1)) in #t343;
+ let final self::Class2? #t345 = n2 in #t345.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t346 = self::Extension2|+(self::Extension2|get#nonNullable2(#t345), 1) in let final void #t347 = self::Extension2|set#nonNullable2(#t345, #t346) in #t346;
+ nullable2 = let final self::Class2? #t348 = n2 in #t348.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t349 = self::Extension2|+(self::Extension2|get#nonNullable2(#t348), 1) in let final void #t350 = self::Extension2|set#nonNullable2(#t348, #t349) in #t349;
}
static method ifNull(self::Class1? n1) → void {
self::Class1? nullable1 = n1;
- let final self::Class1? #t347 = n1 in #t347.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t347).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t347, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t348 = n1 in #t348.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t349 = self::Extension1|get#nullable1(#t348) in #t349.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t350 = n1{self::Class1} in let final void #t351 = self::Extension1|set#nullable1(#t348, #t350) in #t350 : #t349{self::Class1};
- let final self::Class1? #t352 = n1 in #t352.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t353 = self::Extension1|get#nonNullable1(#t352{self::Class1}) in self::Extension1|get#nullable1(#t353{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t353{self::Class1}, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in let final self::Class1? #t356 = self::Extension1|get#nullable1(#t355{self::Class1}) in #t356.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t357 = n1{self::Class1} in let final void #t358 = self::Extension1|set#nullable1(#t355{self::Class1}, #t357) in #t357 : #t356{self::Class1};
- let final self::Class1? #t359 = n1 in #t359.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t360 = self::Extension1|get#nonNullable1(#t359{self::Class1}) in let final self::Class1 #t361 = n1{self::Class1} in self::Extension1|[](#t360, #t361).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t360, #t361, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t362 = n1 in #t362.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t363 = self::Extension1|get#nonNullable1(#t362{self::Class1}) in let final self::Class1 #t364 = n1{self::Class1} in let final self::Class1? #t365 = self::Extension1|[](#t363, #t364) in #t365.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t366 = n1{self::Class1} in let final void #t367 = self::Extension1|[]=(#t363, #t364, #t366) in #t366 : #t365{self::Class1};
+ let final self::Class1? #t351 = n1 in #t351.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t351).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t351, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t352 = n1 in #t352.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t353 = self::Extension1|get#nullable1(#t352) in #t353.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t354 = n1{self::Class1} in let final void #t355 = self::Extension1|set#nullable1(#t352, #t354) in #t354 : #t353{self::Class1};
+ let final self::Class1? #t356 = n1 in #t356.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in self::Extension1|get#nullable1(#t357{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t357{self::Class1}, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t358 = n1 in #t358.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t359 = self::Extension1|get#nonNullable1(#t358{self::Class1}) in let final self::Class1? #t360 = self::Extension1|get#nullable1(#t359{self::Class1}) in #t360.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t361 = n1{self::Class1} in let final void #t362 = self::Extension1|set#nullable1(#t359{self::Class1}, #t361) in #t361 : #t360{self::Class1};
+ let final self::Class1? #t363 = n1 in #t363.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t364 = self::Extension1|get#nonNullable1(#t363{self::Class1}) in let final self::Class1 #t365 = n1{self::Class1} in self::Extension1|[](#t364, #t365).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t364, #t365, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t366 = n1 in #t366.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t367 = self::Extension1|get#nonNullable1(#t366{self::Class1}) in let final self::Class1 #t368 = n1{self::Class1} in let final self::Class1? #t369 = self::Extension1|[](#t367, #t368) in #t369.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t370 = n1{self::Class1} in let final void #t371 = self::Extension1|[]=(#t367, #t368, #t370) in #t370 : #t369{self::Class1};
}
static method throws(() → void f) → void {
try {
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.transformed.expect
index dce5931..51808db 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.transformed.expect
@@ -2,24 +2,24 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
// Try accessing using ?. instead.
// throws(() => (n1?.nullable1 = new Class1()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
// Try accessing using ?. instead.
// throws(() => (n1?.nonNullable1Method()).nullable1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
// throws(() => n1?.nonNullable1 + 0);
// ^
//
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
// - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
// throws(() => -n1?.nonNullable1);
// ^
@@ -139,139 +139,153 @@
let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
- self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
- self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
- nullable1 = let final self::Class1? #t23 = n1 in #t23.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
- nullable1 = let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
- nullable1 = let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
- let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
- let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
- let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
- nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
- let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
- let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
- let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
- let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
- let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
- let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
- nullable1 = let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
- let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
- let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
- nullable1 = let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
- let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
- nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
- let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
- nullable1 = let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
- let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
- let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
- let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
- let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
- let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
- nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
- let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t94 = n1 in #t94.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
- let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
- nullable1 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
- let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
- nullable1 = let final self::Class1? #t110 = n1 in #t110.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
- let final self::Class1? #t117 = n1 in #t117.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
- nullable1 = let final self::Class1? #t120 = n1 in #t120.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
- let final self::Class1? #t125 = n1 in #t125.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
- nullable1 = let final self::Class1? #t126 = n1 in #t126.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
- let final self::Class1? #t129 = n1 in #t129.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
- nullable1 = let final self::Class1? #t132 = n1 in #t132.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
- let final self::Class1? #t137 = n1 in #t137.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
- nullable1 = let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
- let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
- let final self::Class1? #t142 = n1 in #t142.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
- nullable1 = let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
- let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
- let final self::Class1? #t147 = n1 in #t147.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
- nullable1 = let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
- let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
- nullable1 = let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
- let final self::Class1? #t159 = n1 in #t159.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
- nullable1 = let final self::Class1? #t160 = n1 in #t160.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
- let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
- let final self::Class1? #t164 = n1 in #t164.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
- let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
- let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{self::Class1});
+ self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+Try accessing using ?. instead.
+ throws(() => (n1?.nullable1 = new Class1()).nullable1);
+ ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
+ self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+Try accessing using ?. instead.
+ throws(() => (n1?.nonNullable1Method()).nullable1);
+ ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t24{self::Class1})));
+ nullable1 = let final self::Class1? #t25 = n1 in #t25.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t26 = new self::Class1::•() in let final void #t27 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t25{self::Class1}), #t26) in #t26;
+ nullable1 = let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t29 = self::Extension1|get#nullable1(#t28{self::Class1}) in #t29.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t30 = new self::Class1::•() in let final void #t31 = self::Extension1|set#nullable1(#t29{self::Class1}, #t30) in #t30;
+ nullable1 = let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t33 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t32{self::Class1})) in #t33.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t34 = new self::Class1::•() in let final void #t35 = self::Extension1|set#nullable1(#t33{self::Class1}, #t34) in #t34;
+ let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t37 = self::Extension1|get#nullable1(#t36{self::Class1}) in #t37.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t37{self::Class1});
+ let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t38{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t40 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t41 = self::Extension1|set#nullable1(#t39{self::Class1}, #t40) in #t40;
+ let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t42{self::Class1}, let final self::Class1 #t43 = new self::Class1::•() in let final void #t44 = self::Extension1|set#nullable1(new self::Class1::•(), #t43) in #t43);
+ nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t46 = let final self::Class1 #t47 = new self::Class1::•() in let final void #t48 = self::Extension1|set#nullable1(new self::Class1::•(), #t47) in #t47 in let final void #t49 = self::Extension1|set#nullable1(#t45{self::Class1}, #t46) in #t46;
+ let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t50{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t52 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t53 = self::Extension1|set#nullable1(#t51{self::Class1}, #t52) in #t52;
+ let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+ let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t55{self::Class1}), new self::Class1::•());
+ let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t56{self::Class1}));
+ let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})));
+ let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t58{self::Class1})), new self::Class1::•());
+ nullable1 = let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t60 = new self::Class1::•() in let final void #t61 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t59{self::Class1})), #t60) in #t60;
+ let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t63 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t62{self::Class1})) in #t63.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t63{self::Class1});
+ let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t64{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t66 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t67 = self::Extension1|set#nullable1(#t65{self::Class1}, #t66) in #t66;
+ let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t68{self::Class1}, let final self::Class1 #t69 = new self::Class1::•() in let final void #t70 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t69) in #t69);
+ nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t72 = let final self::Class1 #t73 = new self::Class1::•() in let final void #t74 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t73) in #t73 in let final void #t75 = self::Extension1|set#nullable1(#t71{self::Class1}, #t72) in #t72;
+ let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t76{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t78 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t79 = self::Extension1|set#nullable1(#t77{self::Class1}, #t78) in #t78;
+ let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+ let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t81{self::Class1})), new self::Class1::•());
+ let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t82{self::Class1})));
+ let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t83{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t86 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t84{self::Class1}), #t85) in #t85;
+ let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t87{self::Class1}), let final self::Class1 #t88 = new self::Class1::•() in let final void #t89 = self::Extension1|set#nullable1(new self::Class1::•(), #t88) in #t88);
+ nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = let final self::Class1 #t92 = new self::Class1::•() in let final void #t93 = self::Extension1|set#nullable1(new self::Class1::•(), #t92) in #t92 in let final void #t94 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t90{self::Class1}), #t91) in #t91;
+ let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t95{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t96 = n1 in #t96.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t97 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t98 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t96{self::Class1}), #t97) in #t97;
+ let final self::Class1? #t99 = n1 in #t99.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t99{self::Class1}, let final self::Class1? #t100 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t101 = self::Extension1|set#nullable1(new self::Class1::•(), #t100) in #t100);
+ nullable1 = let final self::Class1? #t102 = n1 in #t102.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t103 = let final self::Class1? #t104 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t105 = self::Extension1|set#nullable1(new self::Class1::•(), #t104) in #t104 in let final void #t106 = self::Extension1|set#nullable1(#t102{self::Class1}, #t103) in #t103;
+ let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t107{self::Class1}, let final self::Class1 #t108 = let final self::Class1 #t109 = new self::Class1::•() in let final void #t110 = self::Extension1|set#nullable1(new self::Class1::•(), #t109) in #t109 in let final void #t111 = self::Extension1|set#nullable1(new self::Class1::•(), #t108) in #t108);
+ nullable1 = let final self::Class1? #t112 = n1 in #t112.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t113 = let final self::Class1 #t114 = let final self::Class1 #t115 = new self::Class1::•() in let final void #t116 = self::Extension1|set#nullable1(new self::Class1::•(), #t115) in #t115 in let final void #t117 = self::Extension1|set#nullable1(new self::Class1::•(), #t114) in #t114 in let final void #t118 = self::Extension1|set#nullable1(#t112{self::Class1}, #t113) in #t113;
+ let final self::Class1? #t119 = n1 in #t119.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t119{self::Class1}, let final self::Class1 #t120 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t121 = self::Extension1|set#nullable1(new self::Class1::•(), #t120) in #t120);
+ nullable1 = let final self::Class1? #t122 = n1 in #t122.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t123 = let final self::Class1 #t124 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t125 = self::Extension1|set#nullable1(new self::Class1::•(), #t124) in #t124 in let final void #t126 = self::Extension1|set#nullable1(#t122{self::Class1}, #t123) in #t123;
+ let final self::Class1? #t127 = n1 in #t127.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t127{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t128 = n1 in #t128.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t129 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t130 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t128{self::Class1}), #t129) in #t129;
+ let final self::Class1? #t131 = n1 in #t131.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t131{self::Class1}), let final self::Class1 #t132 = new self::Class1::•() in let final void #t133 = self::Extension1|set#nullable1(new self::Class1::•(), #t132) in #t132);
+ nullable1 = let final self::Class1? #t134 = n1 in #t134.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t135 = let final self::Class1 #t136 = new self::Class1::•() in let final void #t137 = self::Extension1|set#nullable1(new self::Class1::•(), #t136) in #t136 in let final void #t138 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t134{self::Class1}), #t135) in #t135;
+ let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t139{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+ nullable1 = let final self::Class1? #t140 = n1 in #t140.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t141 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t142 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t140{self::Class1}), #t141) in #t141;
+ let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})));
+ let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t144{self::Class1})), new self::Class1::•());
+ nullable1 = let final self::Class1? #t145 = n1 in #t145.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t146 = new self::Class1::•() in let final void #t147 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t145{self::Class1})), #t146) in #t146;
+ let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t148{self::Class1})));
+ let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t149{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t150 = n1 in #t150.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t151 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t152 = self::Extension1|set#nullable1(#t150{self::Class1}, #t151) in #t151;
+ let final self::Class1? #t153 = n1 in #t153.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t153{self::Class1}, let final self::Class1 #t154 = new self::Class1::•() in let final void #t155 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t154) in #t154);
+ nullable1 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t157 = let final self::Class1 #t158 = new self::Class1::•() in let final void #t159 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t158) in #t158 in let final void #t160 = self::Extension1|set#nullable1(#t156{self::Class1}, #t157) in #t157;
+ let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t161{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+ nullable1 = let final self::Class1? #t162 = n1 in #t162.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t163 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t164 = self::Extension1|set#nullable1(#t162{self::Class1}, #t163) in #t163;
+ let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+ let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t166{self::Class1})), new self::Class1::•());
+ let final self::Class1? #t167 = n1 in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t167{self::Class1})));
+ let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t169 = self::Extension1|nonNullable1Method(#t168{self::Class1}) in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t169{self::Class1});
}
static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
self::Class1? nullable1 = n1;
self::Class2? nullable2 = n2;
self::Class3? nullable3 = n3;
- let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
- let final self::Class1? #t169 = n1 in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
- let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
- let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
- let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
- let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
- let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
- nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
- let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
- nullable1 = let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
- let final self::Class2? #t196 = n2 in #t196.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
- nullable2 = let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
- let final self::Class2? #t202 = n2 in #t202.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
- nullable2 = let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
- let final self::Class2? #t208 = n2 in #t208.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
- nullable2 = let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
- let final self::Class2? #t214 = n2 in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
- nullable2 = let final self::Class2? #t218 = n2 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
- let final self::Class1? #t222 = n1 in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
- nullable2 = let final self::Class1? #t225 = n1 in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
- let final self::Class1? #t230 = n1 in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
- nullable2 = let final self::Class1? #t235 = n1 in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
- let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
- let final self::Class1? #t241 = n1 in #t241.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
- nullable2 = let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
- let final self::Class1? #t247 = n1 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
- let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
- nullable2 = let final self::Class1? #t252 = n1 in #t252.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
- let final self::Class1? #t257 = n1 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
- nullable2 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
- let final self::Class1? #t265 = n1 in #t265.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
- nullable2 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
- let final self::Class1? #t275 = n1 in #t275.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
- let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
- nullable1 = let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
- let final self::Class1? #t284 = n1 in #t284.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
- nullable1 = let final self::Class1? #t287 = n1 in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
- let final self::Class1? #t290 = n1 in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
- nullable1 = let final self::Class1? #t293 = n1 in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
- let final self::Class3? #t299 = n3 in #t299.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
- nullable2 = let final self::Class3? #t302 = n3 in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
- let final self::Class3? #t307 = n3 in #t307.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
- nullable2 = let final self::Class3? #t310 = n3 in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
- let final self::Class3? #t315 = n3 in #t315.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
- nullable2 = let final self::Class3? #t320 = n3 in #t320.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+ let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t170{self::Class1}, nullable1);
+ let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t171{self::Class1}, nullable1, new self::Class1::•());
+ let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t173 = self::Extension1|[](#t172{self::Class1}, nullable1) in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t173{self::Class1});
+ let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t174{self::Class1}), nullable1);
+ let final self::Class1? #t175 = n1 in #t175.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t175{self::Class1}), nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t177 = self::Extension1|get#nonNullable1(#t176{self::Class1}) in let final self::Class1? #t178 = nullable1 in let final self::Class1 #t179 = new self::Class1::•() in let final void #t180 = self::Extension1|[]=(#t177, #t178, #t179) in #t179;
+ let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t182 = self::Extension1|[](self::Extension1|get#nonNullable1(#t181{self::Class1}), nullable1) in #t182.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t182{self::Class1});
+ let final self::Class1? #t183 = n1 in #t183.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t184 = self::Extension1|get#nonNullable2(#t183{self::Class1}) in let final self::Class2? #t185 = nullable2 in self::Extension2|[]=(#t184, #t185, self::Extension2|+(self::Extension2|[](#t184, #t185), 0));
+ nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = self::Extension1|get#nonNullable2(#t186{self::Class1}) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = self::Extension2|+(self::Extension2|[](#t187, #t188), 0) in let final void #t190 = self::Extension2|[]=(#t187, #t188, #t189) in #t189;
+ let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in self::Extension1|[](#t191{self::Class1}, #t192).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t191{self::Class1}, #t192, nullable1) : null;
+ nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = nullable1 in let final self::Class1? #t195 = self::Extension1|[](#t193{self::Class1}, #t194) in #t195.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t196 = nullable1 in let final void #t197 = self::Extension1|[]=(#t193{self::Class1}, #t194, #t196) in #t196 : #t195{self::Class1};
+ let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in self::Extension2|[]=(#t198{self::Class2}, #t199, self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0));
+ nullable2 = let final self::Class2? #t200 = n2 in #t200.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t201 = nullable2 in let final self::Class2 #t202 = self::Extension2|+(self::Extension2|[](#t200{self::Class2}, #t201), 0) in let final void #t203 = self::Extension2|[]=(#t200{self::Class2}, #t201, #t202) in #t202;
+ let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in self::Extension2|[]=(#t204{self::Class2}, #t205, self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0));
+ nullable2 = let final self::Class2? #t206 = n2 in #t206.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t207 = nullable2 in let final self::Class2 #t208 = self::Extension2|+(self::Extension2|[](#t206{self::Class2}, #t207), 0) in let final void #t209 = self::Extension2|[]=(#t206{self::Class2}, #t207, #t208) in #t208;
+ let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(self::Extension2|[](#t210{self::Class2}, #t211), 1));
+ nullable2 = let final self::Class2? #t212 = n2 in #t212.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t213 = nullable2 in let final self::Class2 #t214 = self::Extension2|[](#t212{self::Class2}, #t213) in let final void #t215 = self::Extension2|[]=(#t212{self::Class2}, #t213, self::Extension2|+(#t214, 1)) in #t214;
+ let final self::Class2? #t216 = n2 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in let final self::Class2 #t218 = self::Extension2|+(self::Extension2|[](#t216{self::Class2}, #t217), 1) in let final void #t219 = self::Extension2|[]=(#t216{self::Class2}, #t217, #t218) in #t218;
+ nullable2 = let final self::Class2? #t220 = n2 in #t220.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t221 = nullable2 in let final self::Class2 #t222 = self::Extension2|+(self::Extension2|[](#t220{self::Class2}, #t221), 1) in let final void #t223 = self::Extension2|[]=(#t220{self::Class2}, #t221, #t222) in #t222;
+ let final self::Class1? #t224 = n1 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t225 = self::Extension1|get#nonNullable2(#t224{self::Class1}) in let final self::Class2? #t226 = nullable2 in self::Extension2|[]=(#t225, #t226, self::Extension2|+(self::Extension2|[](#t225, #t226), 1));
+ nullable2 = let final self::Class1? #t227 = n1 in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t228 = self::Extension1|get#nonNullable2(#t227{self::Class1}) in let final self::Class2? #t229 = nullable2 in let final self::Class2 #t230 = self::Extension2|[](#t228, #t229) in let final void #t231 = self::Extension2|[]=(#t228, #t229, self::Extension2|+(#t230, 1)) in #t230;
+ let final self::Class1? #t232 = n1 in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t233 = self::Extension1|get#nonNullable2(#t232{self::Class1}) in let final self::Class2? #t234 = nullable2 in let final self::Class2 #t235 = self::Extension2|+(self::Extension2|[](#t233, #t234), 1) in let final void #t236 = self::Extension2|[]=(#t233, #t234, #t235) in #t235;
+ nullable2 = let final self::Class1? #t237 = n1 in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t238 = self::Extension1|get#nonNullable2(#t237{self::Class1}) in let final self::Class2? #t239 = nullable2 in let final self::Class2 #t240 = self::Extension2|+(self::Extension2|[](#t238, #t239), 1) in let final void #t241 = self::Extension2|[]=(#t238, #t239, #t240) in #t240;
+ let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2), nullable2);
+ let final self::Class1? #t243 = n1 in #t243.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t243{self::Class1}), nullable2), nullable2, new self::Class2::•());
+ nullable2 = let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t245 = self::Extension2|[](self::Extension1|get#nonNullable2(#t244{self::Class1}), nullable2) in let final self::Class2? #t246 = nullable2 in let final self::Class2 #t247 = new self::Class2::•() in let final void #t248 = self::Extension2|[]=(#t245, #t246, #t247) in #t247;
+ let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t250 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2), nullable2) in #t250.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t250{self::Class2});
+ let final self::Class1? #t251 = n1 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = self::Extension2|[](self::Extension1|get#nonNullable2(#t251{self::Class1}), nullable2) in let final self::Class2? #t253 = nullable2 in self::Extension2|[]=(#t252, #t253, self::Extension2|+(self::Extension2|[](#t252, #t253), 0));
+ nullable2 = let final self::Class1? #t254 = n1 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = self::Extension2|[](self::Extension1|get#nonNullable2(#t254{self::Class1}), nullable2) in let final self::Class2? #t256 = nullable2 in let final self::Class2 #t257 = self::Extension2|+(self::Extension2|[](#t255, #t256), 0) in let final void #t258 = self::Extension2|[]=(#t255, #t256, #t257) in #t257;
+ let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t260 = self::Extension2|[](self::Extension1|get#nonNullable2(#t259{self::Class1}), nullable2) in let final self::Class2? #t261 = nullable2 in self::Extension2|[]=(#t260, #t261, self::Extension2|+(self::Extension2|[](#t260, #t261), 1));
+ nullable2 = let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t263 = self::Extension2|[](self::Extension1|get#nonNullable2(#t262{self::Class1}), nullable2) in let final self::Class2? #t264 = nullable2 in let final self::Class2 #t265 = self::Extension2|[](#t263, #t264) in let final void #t266 = self::Extension2|[]=(#t263, #t264, self::Extension2|+(#t265, 1)) in #t265;
+ let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t268 = self::Extension2|[](self::Extension1|get#nonNullable2(#t267{self::Class1}), nullable2) in let final self::Class2? #t269 = nullable2 in let final self::Class2 #t270 = self::Extension2|+(self::Extension2|[](#t268, #t269), 1) in let final void #t271 = self::Extension2|[]=(#t268, #t269, #t270) in #t270;
+ nullable2 = let final self::Class1? #t272 = n1 in #t272.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t273 = self::Extension2|[](self::Extension1|get#nonNullable2(#t272{self::Class1}), nullable2) in let final self::Class2? #t274 = nullable2 in let final self::Class2 #t275 = self::Extension2|+(self::Extension2|[](#t273, #t274), 1) in let final void #t276 = self::Extension2|[]=(#t273, #t274, #t275) in #t275;
+ let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t278{self::Class1}, nullable1);
+ let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t280{self::Class1}, nullable1, new self::Class1::•());
+ nullable1 = let final self::Class1? #t281 = n1 in #t281.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t282 = self::Extension1|[](#t281{self::Class1}, nullable1) in #t282.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t283 = nullable1 in let final self::Class1 #t284 = new self::Class1::•() in let final void #t285 = self::Extension1|[]=(#t282{self::Class1}, #t283, #t284) in #t284;
+ let final self::Class1? #t286 = n1 in #t286.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t287 = self::Extension1|[](#t286{self::Class1}, nullable1) in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t288{self::Class1});
+ nullable1 = let final self::Class1? #t289 = n1 in #t289.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t290 = self::Extension1|[](#t289{self::Class1}, nullable1) in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t291{self::Class1});
+ let final self::Class1? #t292 = n1 in #t292.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t293 = self::Extension1|[](#t292{self::Class1}, nullable1) in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = nullable1 in self::Extension1|[](#t293{self::Class1}, #t294).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t293{self::Class1}, #t294, nullable1) : null;
+ nullable1 = let final self::Class1? #t295 = n1 in #t295.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t296 = self::Extension1|[](#t295{self::Class1}, nullable1) in #t296.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t297 = nullable1 in let final self::Class1? #t298 = self::Extension1|[](#t296{self::Class1}, #t297) in #t298.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t299 = nullable1 in let final void #t300 = self::Extension1|[]=(#t296{self::Class1}, #t297, #t299) in #t299 : #t298{self::Class1};
+ let final self::Class3? #t301 = n3 in #t301.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t302 = self::Extension3|[](#t301{self::Class3}, nullable3) in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = nullable2 in self::Extension2|[]=(#t302{self::Class2}, #t303, self::Extension2|+(self::Extension2|[](#t302{self::Class2}, #t303), 0));
+ nullable2 = let final self::Class3? #t304 = n3 in #t304.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t305 = self::Extension3|[](#t304{self::Class3}, nullable3) in #t305.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t306 = nullable2 in let final self::Class2 #t307 = self::Extension2|+(self::Extension2|[](#t305{self::Class2}, #t306), 0) in let final void #t308 = self::Extension2|[]=(#t305{self::Class2}, #t306, #t307) in #t307;
+ let final self::Class3? #t309 = n3 in #t309.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t310 = self::Extension3|[](#t309{self::Class3}, nullable3) in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = nullable2 in self::Extension2|[]=(#t310{self::Class2}, #t311, self::Extension2|+(self::Extension2|[](#t310{self::Class2}, #t311), 1));
+ nullable2 = let final self::Class3? #t312 = n3 in #t312.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t313 = self::Extension3|[](#t312{self::Class3}, nullable3) in #t313.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t314 = nullable2 in let final self::Class2 #t315 = self::Extension2|[](#t313{self::Class2}, #t314) in let final void #t316 = self::Extension2|[]=(#t313{self::Class2}, #t314, self::Extension2|+(#t315, 1)) in #t315;
+ let final self::Class3? #t317 = n3 in #t317.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t318 = self::Extension3|[](#t317{self::Class3}, nullable3) in #t318.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t319 = nullable2 in let final self::Class2 #t320 = self::Extension2|+(self::Extension2|[](#t318{self::Class2}, #t319), 1) in let final void #t321 = self::Extension2|[]=(#t318{self::Class2}, #t319, #t320) in #t320;
+ nullable2 = let final self::Class3? #t322 = n3 in #t322.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t323 = self::Extension3|[](#t322{self::Class3}, nullable3) in #t323.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t324 = nullable2 in let final self::Class2 #t325 = self::Extension2|+(self::Extension2|[](#t323{self::Class2}, #t324), 1) in let final void #t326 = self::Extension2|[]=(#t323{self::Class2}, #t324, #t325) in #t325;
}
static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
self::Class2? nullable2 = n2;
- self::throws(() → self::Class1? => self::Extension1|+(let final self::Class1? #t325 = n1 in #t325.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
- self::throws(() → self::Class1? => self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
- let final self::Class2? #t327 = n2 in #t327.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327, self::Extension2|+(self::Extension2|get#nonNullable2(#t327), 0));
- nullable2 = let final self::Class2? #t328 = n2 in #t328.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328, #t329) in #t329;
- let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
- nullable2 = let final self::Class2? #t333 = n2 in #t333.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
- let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337, self::Extension2|+(self::Extension2|get#nonNullable2(#t337), 1));
- nullable2 = let final self::Class2? #t338 = n2 in #t338.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, self::Extension2|+(#t339, 1)) in #t339;
- let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t342 = self::Extension2|+(self::Extension2|get#nonNullable2(#t341), 1) in let final void #t343 = self::Extension2|set#nonNullable2(#t341, #t342) in #t342;
- nullable2 = let final self::Class2? #t344 = n2 in #t344.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t345 = self::Extension2|+(self::Extension2|get#nonNullable2(#t344), 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t344, #t345) in #t345;
+ self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+ throws(() => n1?.nonNullable1 + 0);
+ ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
+ self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+ throws(() => -n1?.nonNullable1);
+ ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
+ let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t331, self::Extension2|+(self::Extension2|get#nonNullable2(#t331), 0));
+ nullable2 = let final self::Class2? #t332 = n2 in #t332.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t333 = self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0) in let final void #t334 = self::Extension2|set#nonNullable2(#t332, #t333) in #t333;
+ let final self::Class2? #t335 = n2 in #t335.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t336 = self::Extension2|get#nonNullable2(#t335{self::Class2}) in self::Extension2|set#nonNullable2(#t336, self::Extension2|+(self::Extension2|get#nonNullable2(#t336), 0));
+ nullable2 = let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t338 = self::Extension2|get#nonNullable2(#t337{self::Class2}) in let final self::Class2 #t339 = self::Extension2|+(self::Extension2|get#nonNullable2(#t338), 0) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, #t339) in #t339;
+ let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t341, self::Extension2|+(self::Extension2|get#nonNullable2(#t341), 1));
+ nullable2 = let final self::Class2? #t342 = n2 in #t342.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t343 = self::Extension2|get#nonNullable2(#t342) in let final void #t344 = self::Extension2|set#nonNullable2(#t342, self::Extension2|+(#t343, 1)) in #t343;
+ let final self::Class2? #t345 = n2 in #t345.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t346 = self::Extension2|+(self::Extension2|get#nonNullable2(#t345), 1) in let final void #t347 = self::Extension2|set#nonNullable2(#t345, #t346) in #t346;
+ nullable2 = let final self::Class2? #t348 = n2 in #t348.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t349 = self::Extension2|+(self::Extension2|get#nonNullable2(#t348), 1) in let final void #t350 = self::Extension2|set#nonNullable2(#t348, #t349) in #t349;
}
static method ifNull(self::Class1? n1) → void {
self::Class1? nullable1 = n1;
- let final self::Class1? #t347 = n1 in #t347.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t347).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t347, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t348 = n1 in #t348.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t349 = self::Extension1|get#nullable1(#t348) in #t349.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t350 = n1{self::Class1} in let final void #t351 = self::Extension1|set#nullable1(#t348, #t350) in #t350 : #t349{self::Class1};
- let final self::Class1? #t352 = n1 in #t352.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t353 = self::Extension1|get#nonNullable1(#t352{self::Class1}) in self::Extension1|get#nullable1(#t353{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t353{self::Class1}, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in let final self::Class1? #t356 = self::Extension1|get#nullable1(#t355{self::Class1}) in #t356.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t357 = n1{self::Class1} in let final void #t358 = self::Extension1|set#nullable1(#t355{self::Class1}, #t357) in #t357 : #t356{self::Class1};
- let final self::Class1? #t359 = n1 in #t359.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t360 = self::Extension1|get#nonNullable1(#t359{self::Class1}) in let final self::Class1 #t361 = n1{self::Class1} in self::Extension1|[](#t360, #t361).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t360, #t361, n1{self::Class1}) : null;
- n1 = let final self::Class1? #t362 = n1 in #t362.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t363 = self::Extension1|get#nonNullable1(#t362{self::Class1}) in let final self::Class1 #t364 = n1{self::Class1} in let final self::Class1? #t365 = self::Extension1|[](#t363, #t364) in #t365.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t366 = n1{self::Class1} in let final void #t367 = self::Extension1|[]=(#t363, #t364, #t366) in #t366 : #t365{self::Class1};
+ let final self::Class1? #t351 = n1 in #t351.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t351).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t351, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t352 = n1 in #t352.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t353 = self::Extension1|get#nullable1(#t352) in #t353.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t354 = n1{self::Class1} in let final void #t355 = self::Extension1|set#nullable1(#t352, #t354) in #t354 : #t353{self::Class1};
+ let final self::Class1? #t356 = n1 in #t356.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in self::Extension1|get#nullable1(#t357{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t357{self::Class1}, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t358 = n1 in #t358.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t359 = self::Extension1|get#nonNullable1(#t358{self::Class1}) in let final self::Class1? #t360 = self::Extension1|get#nullable1(#t359{self::Class1}) in #t360.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t361 = n1{self::Class1} in let final void #t362 = self::Extension1|set#nullable1(#t359{self::Class1}, #t361) in #t361 : #t360{self::Class1};
+ let final self::Class1? #t363 = n1 in #t363.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t364 = self::Extension1|get#nonNullable1(#t363{self::Class1}) in let final self::Class1 #t365 = n1{self::Class1} in self::Extension1|[](#t364, #t365).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t364, #t365, n1{self::Class1}) : null;
+ n1 = let final self::Class1? #t366 = n1 in #t366.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t367 = self::Extension1|get#nonNullable1(#t366{self::Class1}) in let final self::Class1 #t368 = n1{self::Class1} in let final self::Class1? #t369 = self::Extension1|[](#t367, #t368) in #t369.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t370 = n1{self::Class1} in let final void #t371 = self::Extension1|[]=(#t367, #t368, #t370) in #t370 : #t369{self::Class1};
}
static method throws(() → void f) → void {
try {
diff --git a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect
index dc3992f..9699336 100644
--- a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect
@@ -2,7 +2,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
// Try accessing using ?. instead.
// throws(() => c.nonNullableField);
@@ -33,9 +33,13 @@
}
static method main() → dynamic {
self::Class? c;
- self::throws(() → self::A => c.{self::Class::nonNullableField});
- self::expect(null, let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::A?} null : #t1{self::Class}.{self::Class::nonNullableField});
- self::expect(null, let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::A?} null : #t2{self::Class}.{self::Class::nonNullableField}.{self::A::nonNullableProperty});
+ self::throws(() → self::A => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
+Try accessing using ?. instead.
+ throws(() => c.nonNullableField);
+ ^^^^^^^^^^^^^^^^" in c.{self::Class::nonNullableField});
+ self::expect(null, let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::A?} null : #t2{self::Class}.{self::Class::nonNullableField});
+ self::expect(null, let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::A?} null : #t3{self::Class}.{self::Class::nonNullableField}.{self::A::nonNullableProperty});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.transformed.expect
index dc3992f..9699336 100644
--- a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
// Try accessing using ?. instead.
// throws(() => c.nonNullableField);
@@ -33,9 +33,13 @@
}
static method main() → dynamic {
self::Class? c;
- self::throws(() → self::A => c.{self::Class::nonNullableField});
- self::expect(null, let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::A?} null : #t1{self::Class}.{self::Class::nonNullableField});
- self::expect(null, let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::A?} null : #t2{self::Class}.{self::Class::nonNullableField}.{self::A::nonNullableProperty});
+ self::throws(() → self::A => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
+Try accessing using ?. instead.
+ throws(() => c.nonNullableField);
+ ^^^^^^^^^^^^^^^^" in c.{self::Class::nonNullableField});
+ self::expect(null, let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::A?} null : #t2{self::Class}.{self::Class::nonNullableField});
+ self::expect(null, let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::A?} null : #t3{self::Class}.{self::Class::nonNullableField}.{self::A::nonNullableProperty});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
index a326cf2..24d5f3d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
@@ -30,12 +30,6 @@
// a.baz = 42;
// ^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
-// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-// a();
-// ^
-//
// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try calling using ?.call instead.
@@ -108,23 +102,19 @@
- 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
Try calling using ?.call instead.
a();
- ^" in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try calling using ?. instead.
- a();
^" in a.{self::A::call}();
- let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
- 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
Try calling using ?. instead.
b.toString(0);
^^^^^^^^" in b.{self::B::toString}(0);
- core::Function f1 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+ core::Function f1 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
Function f1 = a;
^" in a as{TypeError} core::Function;
- () → void f2 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+ () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
void Function() f2 = a;
^" in a as{TypeError} () → void;
- () →? void f3 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+ () →? void f3 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
void Function()? f3 = a;
^" in a as{TypeError} () →? void;
}
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect
index a326cf2..24d5f3d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect
@@ -30,12 +30,6 @@
// a.baz = 42;
// ^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
-// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-// a();
-// ^
-//
// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try calling using ?.call instead.
@@ -108,23 +102,19 @@
- 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
Try calling using ?.call instead.
a();
- ^" in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try calling using ?. instead.
- a();
^" in a.{self::A::call}();
- let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
- 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
Try calling using ?. instead.
b.toString(0);
^^^^^^^^" in b.{self::B::toString}(0);
- core::Function f1 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+ core::Function f1 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
Function f1 = a;
^" in a as{TypeError} core::Function;
- () → void f2 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+ () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
void Function() f2 = a;
^" in a as{TypeError} () → void;
- () →? void f3 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+ () →? void f3 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
void Function()? f3 = a;
^" in a as{TypeError} () →? void;
}
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
index a00b574..24d5f3d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
@@ -2,61 +2,55 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
// Try accessing using ?. instead.
// s.length;
// ^^^^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Warning: Method 'substring' is called on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
// Try calling using ?. instead.
// s.substring(1, 1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Warning: Method 'foo' is called on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try calling using ?. instead.
// a.foo();
// ^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Warning: Property 'bar' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try accessing using ?. instead.
// a.bar;
// ^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Warning: Property 'baz' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try accessing using ?. instead.
// a.baz = 42;
// ^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Method 'call' is called on 'A?' which is potentially null.
-// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-// a();
-// ^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Expression of type 'A?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try calling using ?.call instead.
// a();
// ^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Warning: Method 'toString' is called on 'B?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
// - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try calling using ?. instead.
// b.toString(0);
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
// Function f1 = a;
// ^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
// void Function() f2 = a;
// ^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
// void Function()? f3 = a;
// ^
//
@@ -81,16 +75,48 @@
return super.{core::Object::toString}();
}
static method error(core::String? s, self::A? a, self::B? b) → dynamic {
- s.{core::String::length};
- s.{core::String::substring}(1, 1);
- a.{self::A::foo}();
- a.{self::A::bar};
- a.{self::A::baz} = 42;
- a.{self::A::call}();
- b.{self::B::toString}(0);
- core::Function f1 = a as{TypeError} core::Function;
- () → void f2 = a as{TypeError} () → void;
- () →? void f3 = a as{TypeError} () →? void;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+Try accessing using ?. instead.
+ s.length;
+ ^^^^^^" in s.{core::String::length};
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+Try calling using ?. instead.
+ s.substring(1, 1);
+ ^^^^^^^^^" in s.{core::String::substring}(1, 1);
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+ a.foo();
+ ^^^" in a.{self::A::foo}();
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+ a.bar;
+ ^^^" in a.{self::A::bar};
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+ a.baz = 42;
+ ^^^" in a.{self::A::baz} = 42;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?.call instead.
+ a();
+ ^" in a.{self::A::call}();
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+ b.toString(0);
+ ^^^^^^^^" in b.{self::B::toString}(0);
+ core::Function f1 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+ Function f1 = a;
+ ^" in a as{TypeError} core::Function;
+ () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+ void Function() f2 = a;
+ ^" in a as{TypeError} () → void;
+ () →? void f3 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+ void Function()? f3 = a;
+ ^" in a as{TypeError} () →? void;
}
static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
s.{core::String::==}(s);
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect
index a00b574..24d5f3d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect
@@ -2,61 +2,55 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
// Try accessing using ?. instead.
// s.length;
// ^^^^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Warning: Method 'substring' is called on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
// Try calling using ?. instead.
// s.substring(1, 1);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Warning: Method 'foo' is called on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try calling using ?. instead.
// a.foo();
// ^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Warning: Property 'bar' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try accessing using ?. instead.
// a.bar;
// ^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Warning: Property 'baz' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try accessing using ?. instead.
// a.baz = 42;
// ^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Method 'call' is called on 'A?' which is potentially null.
-// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-// a();
-// ^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Expression of type 'A?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
// - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try calling using ?.call instead.
// a();
// ^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Warning: Method 'toString' is called on 'B?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
// - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
// Try calling using ?. instead.
// b.toString(0);
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
// Function f1 = a;
// ^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
// void Function() f2 = a;
// ^
//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
// void Function()? f3 = a;
// ^
//
@@ -81,16 +75,48 @@
return super.{core::Object::toString}();
}
static method error(core::String? s, self::A? a, self::B? b) → dynamic {
- s.{core::String::length};
- s.{core::String::substring}(1, 1);
- a.{self::A::foo}();
- a.{self::A::bar};
- a.{self::A::baz} = 42;
- a.{self::A::call}();
- b.{self::B::toString}(0);
- core::Function f1 = a as{TypeError} core::Function;
- () → void f2 = a as{TypeError} () → void;
- () →? void f3 = a as{TypeError} () →? void;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+Try accessing using ?. instead.
+ s.length;
+ ^^^^^^" in s.{core::String::length};
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+Try calling using ?. instead.
+ s.substring(1, 1);
+ ^^^^^^^^^" in s.{core::String::substring}(1, 1);
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+ a.foo();
+ ^^^" in a.{self::A::foo}();
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+ a.bar;
+ ^^^" in a.{self::A::bar};
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+ a.baz = 42;
+ ^^^" in a.{self::A::baz} = 42;
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?.call instead.
+ a();
+ ^" in a.{self::A::call}();
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+ b.toString(0);
+ ^^^^^^^^" in b.{self::B::toString}(0);
+ core::Function f1 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+ Function f1 = a;
+ ^" in a as{TypeError} core::Function;
+ () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+ void Function() f2 = a;
+ ^" in a as{TypeError} () → void;
+ () →? void f3 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+ void Function()? f3 = a;
+ ^" in a as{TypeError} () →? void;
}
static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
s.{core::String::==}(s);
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect
index 3429c36..4c7e4f3 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect
@@ -1,12 +1,19 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
-typedef F = () →? void;
+typedef F = invalid-type;
static method foo(() → void x) → void
;
-static method bar(() →? void x) → void
+static method bar(invalid-type x) → void
;
-static method baz(() →? void x) → void
+static method baz(invalid-type x) → void
;
static method main() → dynamic
;
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect
index 425f791..8c42147 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect
@@ -1,13 +1,20 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
-typedef F = () →? void;
+typedef F = invalid-type;
static method foo(() → void x) → void {
- self::bar(x);
+ self::bar(x as{TypeError,ForNonNullableByDefault} invalid-type);
self::bar(null);
- self::baz(x);
+ self::baz(x as{TypeError,ForNonNullableByDefault} invalid-type);
self::baz(null);
}
-static method bar(() →? void x) → void {}
-static method baz(() →? void x) → void {}
+static method bar(invalid-type x) → void {}
+static method baz(invalid-type x) → void {}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect
index 425f791..8c42147 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect
@@ -1,13 +1,20 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
-typedef F = () →? void;
+typedef F = invalid-type;
static method foo(() → void x) → void {
- self::bar(x);
+ self::bar(x as{TypeError,ForNonNullableByDefault} invalid-type);
self::bar(null);
- self::baz(x);
+ self::baz(x as{TypeError,ForNonNullableByDefault} invalid-type);
self::baz(null);
}
-static method bar(() →? void x) → void {}
-static method baz(() →? void x) → void {}
+static method bar(invalid-type x) → void {}
+static method baz(invalid-type x) → void {}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect
index 425f791..8c42147 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect
@@ -1,13 +1,20 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
-typedef F = () →? void;
+typedef F = invalid-type;
static method foo(() → void x) → void {
- self::bar(x);
+ self::bar(x as{TypeError,ForNonNullableByDefault} invalid-type);
self::bar(null);
- self::baz(x);
+ self::baz(x as{TypeError,ForNonNullableByDefault} invalid-type);
self::baz(null);
}
-static method bar(() →? void x) → void {}
-static method baz(() →? void x) → void {}
+static method bar(invalid-type x) → void {}
+static method baz(invalid-type x) → void {}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect
index 425f791..8c42147 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect
@@ -1,13 +1,20 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
-typedef F = () →? void;
+typedef F = invalid-type;
static method foo(() → void x) → void {
- self::bar(x);
+ self::bar(x as{TypeError,ForNonNullableByDefault} invalid-type);
self::bar(null);
- self::baz(x);
+ self::baz(x as{TypeError,ForNonNullableByDefault} invalid-type);
self::baz(null);
}
-static method bar(() →? void x) → void {}
-static method baz(() →? void x) → void {}
+static method bar(invalid-type x) → void {}
+static method baz(invalid-type x) → void {}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
index 7361e96..49acd75 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
@@ -1,10 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
import "dart:core" as core;
import "org-dartlang-testcase:///opt_out_lib.dart";
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object? = dynamic> extends core::Object {
late field core::int field;
synthetic constructor •() → self::A<self::A::T%>
@@ -45,6 +52,10 @@
// // @dart=2.5
// ^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
// pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
// Try removing the `@dart=` annotation or setting the language version higher.
// List<String?> l = [];
@@ -80,7 +91,7 @@
import self as self2;
import "dart:core" as core;
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object* = dynamic> extends core::Object {
field core::int* field;
synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
index 66a160f..a4191d5 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
@@ -1,10 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
import "dart:core" as core;
import "org-dartlang-testcase:///opt_out_lib.dart";
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object? = dynamic> extends core::Object {
late field core::int field = 42;
synthetic constructor •() → self::A<self::A::T%>
@@ -50,6 +57,10 @@
// // @dart=2.5
// ^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
// pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
// Try removing the `@dart=` annotation or setting the language version higher.
// List<String?> l = [];
@@ -121,7 +132,7 @@
import self as self2;
import "dart:core" as core;
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object* = dynamic> extends core::Object {
field core::int* field = 42;
synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
index 66a160f..a4191d5 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
@@ -1,10 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
import "dart:core" as core;
import "org-dartlang-testcase:///opt_out_lib.dart";
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object? = dynamic> extends core::Object {
late field core::int field = 42;
synthetic constructor •() → self::A<self::A::T%>
@@ -50,6 +57,10 @@
// // @dart=2.5
// ^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
// pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
// Try removing the `@dart=` annotation or setting the language version higher.
// List<String?> l = [];
@@ -121,7 +132,7 @@
import self as self2;
import "dart:core" as core;
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object* = dynamic> extends core::Object {
field core::int* field = 42;
synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect
index 66a160f..a4191d5 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect
@@ -1,10 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
import "dart:core" as core;
import "org-dartlang-testcase:///opt_out_lib.dart";
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object? = dynamic> extends core::Object {
late field core::int field = 42;
synthetic constructor •() → self::A<self::A::T%>
@@ -50,6 +57,10 @@
// // @dart=2.5
// ^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
// pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
// Try removing the `@dart=` annotation or setting the language version higher.
// List<String?> l = [];
@@ -121,7 +132,7 @@
import self as self2;
import "dart:core" as core;
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object* = dynamic> extends core::Object {
field core::int* field = 42;
synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect
index 66a160f..a4191d5 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect
@@ -1,10 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
import self as self;
import "dart:core" as core;
import "org-dartlang-testcase:///opt_out_lib.dart";
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object? = dynamic> extends core::Object {
late field core::int field = 42;
synthetic constructor •() → self::A<self::A::T%>
@@ -50,6 +57,10 @@
// // @dart=2.5
// ^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+// ^
+//
// pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
// Try removing the `@dart=` annotation or setting the language version higher.
// List<String?> l = [];
@@ -121,7 +132,7 @@
import self as self2;
import "dart:core" as core;
-typedef F = () →? void;
+typedef F = invalid-type;
class A<T extends core::Object* = dynamic> extends core::Object {
field core::int* field = 42;
synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
index 4749c02..0c70778 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
@@ -7,14 +7,14 @@
// factory C1 = C2<int?>; // Error in strong mode and Warning in weak mode.
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:14:7: Warning: The field 'B2.bar' has type 'num', which does not match the corresponding type, 'num?', in the overridden setter, 'B1.bar'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:14:7: Error: The field 'B2.bar' has type 'num', which does not match the corresponding type, 'num?', in the overridden setter, 'B1.bar'.
// num bar = 3.14; // Error in strong mode and Warning in weak mode.
// ^
// pkg/front_end/testcases/nnbd/override_checks.dart:8:12: Context: This is the overridden method ('bar').
// void set bar(num? value) {}
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:15:12: Warning: The return type of the method 'B2.baz' is 'num?', which does not match the return type, 'num', of the overridden method, 'B1.baz'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:15:12: Error: The return type of the method 'B2.baz' is 'num?', which does not match the return type, 'num', of the overridden method, 'B1.baz'.
// Change to a subtype of 'num'.
// num? get baz => null; // Error in strong mode and Warning in weak mode.
// ^
@@ -22,7 +22,7 @@
// num get baz => 42;
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:16:17: Warning: The parameter 'value' of the method 'B2.hest' has type 'num', which does not match the corresponding type, 'num?', in the overridden method, 'B1.hest'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:16:17: Error: The parameter 'value' of the method 'B2.hest' has type 'num', which does not match the corresponding type, 'num?', in the overridden method, 'B1.hest'.
// Change to a supertype of 'num?', or, for a covariant parameter, a subtype.
// void hest(num value) {} // Error in strong mode and Warning in weak mode.
// ^
@@ -30,12 +30,12 @@
// void hest(num? value) {}
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:20:16: Warning: The type 'int?' doesn't extend 'int'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:20:16: Error: The type 'int?' doesn't extend 'int'.
// Try using a different type as argument.
// factory C1 = C2<int?>; // Error in strong mode and Warning in weak mode.
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Warning: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
// - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
// factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
// ^
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
index 8670b98..1387d52 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
@@ -7,14 +7,14 @@
// factory C1 = C2<int?>; // Error in strong mode and Warning in weak mode.
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:14:7: Warning: The field 'B2.bar' has type 'num', which does not match the corresponding type, 'num?', in the overridden setter, 'B1.bar'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:14:7: Error: The field 'B2.bar' has type 'num', which does not match the corresponding type, 'num?', in the overridden setter, 'B1.bar'.
// num bar = 3.14; // Error in strong mode and Warning in weak mode.
// ^
// pkg/front_end/testcases/nnbd/override_checks.dart:8:12: Context: This is the overridden method ('bar').
// void set bar(num? value) {}
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:15:12: Warning: The return type of the method 'B2.baz' is 'num?', which does not match the return type, 'num', of the overridden method, 'B1.baz'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:15:12: Error: The return type of the method 'B2.baz' is 'num?', which does not match the return type, 'num', of the overridden method, 'B1.baz'.
// Change to a subtype of 'num'.
// num? get baz => null; // Error in strong mode and Warning in weak mode.
// ^
@@ -22,7 +22,7 @@
// num get baz => 42;
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:16:17: Warning: The parameter 'value' of the method 'B2.hest' has type 'num', which does not match the corresponding type, 'num?', in the overridden method, 'B1.hest'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:16:17: Error: The parameter 'value' of the method 'B2.hest' has type 'num', which does not match the corresponding type, 'num?', in the overridden method, 'B1.hest'.
// Change to a supertype of 'num?', or, for a covariant parameter, a subtype.
// void hest(num value) {} // Error in strong mode and Warning in weak mode.
// ^
@@ -30,12 +30,12 @@
// void hest(num? value) {}
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:20:16: Warning: The type 'int?' doesn't extend 'int'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:20:16: Error: The type 'int?' doesn't extend 'int'.
// Try using a different type as argument.
// factory C1 = C2<int?>; // Error in strong mode and Warning in weak mode.
// ^
//
-// pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Warning: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
// - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
// factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
// ^
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect
index 560b2ef..7a5255b 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect
@@ -76,47 +76,47 @@
method method(core::int a) → core::int {
core::int k;
core::int j = a;
- return (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
@#C1
method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
- return (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
- return (let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
}
static method method(core::int a) → core::int {
core::int k;
core::int j = a;
- return (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
@#C1
static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
- return (let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
- return (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
constants {
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect
index 560b2ef..7a5255b 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect
@@ -76,47 +76,47 @@
method method(core::int a) → core::int {
core::int k;
core::int j = a;
- return (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
@#C1
method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
- return (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
- return (let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
}
static method method(core::int a) → core::int {
core::int k;
core::int j = a;
- return (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
@#C1
static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
- return (let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
- return (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
- ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+ ^" in k;
}
constants {
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect
index 08205c5..7a5255b 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect
@@ -13,35 +13,35 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
// k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
// k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
@@ -61,46 +61,62 @@
constructor constructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
: test::Class::a = a, test::Class::b = b, super core::Object::•() {
core::int k;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
k;
+ ^" in k;
}
@#C1
constructor patchedConstructor(core::int i, test::Class::T j) → test::Class<test::Class::T>
: test::Class::a = i, test::Class::b = j, super core::Object::•() {
core::int k;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
k;
+ ^" in k;
}
method method(core::int a) → core::int {
core::int k;
core::int j = a;
+ return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
@#C1
method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
+ return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
}
static method method(core::int a) → core::int {
core::int k;
core::int j = a;
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
@#C1
static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
+ return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
constants {
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect
index 08205c5..7a5255b 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect
@@ -13,35 +13,35 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
// k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
// k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
// return k;
// ^
//
@@ -61,46 +61,62 @@
constructor constructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
: test::Class::a = a, test::Class::b = b, super core::Object::•() {
core::int k;
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
k;
+ ^" in k;
}
@#C1
constructor patchedConstructor(core::int i, test::Class::T j) → test::Class<test::Class::T>
: test::Class::a = i, test::Class::b = j, super core::Object::•() {
core::int k;
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
k;
+ ^" in k;
}
method method(core::int a) → core::int {
core::int k;
core::int j = a;
+ return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
@#C1
method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
+ return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
}
static method method(core::int a) → core::int {
core::int k;
core::int j = a;
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
@#C1
static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
+ return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
core::int k;
core::int j = i;
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
return k;
+ ^" in k;
}
constants {
diff --git a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.expect
index 56c3e97..d823eb3 100644
--- a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.expect
@@ -13,11 +13,11 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:10:7: Warning: Field 'field' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:10:7: Error: Field 'field' should be initialized because its type 'int' doesn't allow null.
// int field;
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:15:7: Warning: This constructor doesn't initialize field 'field' and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:15:7: Error: This constructor should initialize field 'field' because its type 'int' doesn't allow null.
// int field;
// ^^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.transformed.expect
index 56c3e97..d823eb3 100644
--- a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.transformed.expect
@@ -13,11 +13,11 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:10:7: Warning: Field 'field' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:10:7: Error: Field 'field' should be initialized because its type 'int' doesn't allow null.
// int field;
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:15:7: Warning: This constructor doesn't initialize field 'field' and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:15:7: Error: This constructor should initialize field 'field' because its type 'int' doesn't allow null.
// int field;
// ^^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
index 0faff12..9a4131e 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
@@ -12,35 +12,35 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:11:27: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:11:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void _injectedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:19:27: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:19:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void _injectedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:6:20: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:6:20: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void method([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:8:36: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:8:36: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// external void patchedMethod([int i]);
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void method([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// external void patchedMethod([int i]);
// ^
//
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
index 0faff12..9a4131e 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
@@ -12,35 +12,35 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:11:27: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:11:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void _injectedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:19:27: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:19:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void _injectedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:6:20: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:6:20: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void method([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:8:36: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:8:36: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// external void patchedMethod([int i]);
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// void method([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
// external void patchedMethod([int i]);
// ^
//
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect
index 0b34a21..ac1c56b 100644
--- a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect
@@ -2,19 +2,19 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:8:5: Warning: Field 'x' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:8:5: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
// int x; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:13:14: Warning: Field 'x' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:13:14: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
// static int x; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:17:7: Warning: Field 'lx' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:17:7: Error: Field 'lx' should be initialized because its type 'int' doesn't allow null.
// int lx; // Error.
// ^^
//
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:23:5: Warning: Field 'lt' isn't initialized and its type 'T' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:23:5: Error: Field 'lt' should be initialized because its type 'T' doesn't allow null.
// T lt; // Error.
// ^^
//
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect
index 0b34a21..ac1c56b 100644
--- a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect
@@ -2,19 +2,19 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:8:5: Warning: Field 'x' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:8:5: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
// int x; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:13:14: Warning: Field 'x' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:13:14: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
// static int x; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:17:7: Warning: Field 'lx' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:17:7: Error: Field 'lx' should be initialized because its type 'int' doesn't allow null.
// int lx; // Error.
// ^^
//
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:23:5: Warning: Field 'lt' isn't initialized and its type 'T' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:23:5: Error: Field 'lt' should be initialized because its type 'T' doesn't allow null.
// T lt; // Error.
// ^^
//
diff --git a/pkg/front_end/testcases/nnbd/required.dart.weak.expect b/pkg/front_end/testcases/nnbd/required.dart.weak.expect
index 4c8f81d..ed0ee8e 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.weak.expect
@@ -2,7 +2,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/required.dart:29:8: Warning: Optional parameter 'x' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:29:8: Error: Optional parameter 'x' should have a default value because its type 'int' doesn't allow null.
// foo({x}) {}
// ^
//
@@ -21,27 +21,27 @@
// f2 = (int a = 42, [int b]) {};
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:48:15: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:48:15: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// void g({int a, required int b = 42}) {}
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:48:31: Warning: Named parameter 'b' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required.dart:48:31: Error: Named parameter 'b' is required and can't have a default value.
// void g({int a, required int b = 42}) {}
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:49:13: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:49:13: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// f = ({int a, required int b = 42}) {};
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:49:29: Warning: Named parameter 'b' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required.dart:49:29: Error: Named parameter 'b' is required and can't have a default value.
// f = ({int a, required int b = 42}) {};
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:52:28: Warning: Optional parameter 'b' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:52:28: Error: Optional parameter 'b' should have a default value because its type 'int' doesn't allow null.
// void g2(int a = 42, [int b]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:53:26: Warning: Optional parameter 'b' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:53:26: Error: Optional parameter 'b' should have a default value because its type 'int' doesn't allow null.
// f2 = (int a = 42, [int b]) {};
// ^
//
diff --git a/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
index 4c8f81d..ed0ee8e 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/required.dart:29:8: Warning: Optional parameter 'x' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:29:8: Error: Optional parameter 'x' should have a default value because its type 'int' doesn't allow null.
// foo({x}) {}
// ^
//
@@ -21,27 +21,27 @@
// f2 = (int a = 42, [int b]) {};
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:48:15: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:48:15: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// void g({int a, required int b = 42}) {}
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:48:31: Warning: Named parameter 'b' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required.dart:48:31: Error: Named parameter 'b' is required and can't have a default value.
// void g({int a, required int b = 42}) {}
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:49:13: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:49:13: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
// f = ({int a, required int b = 42}) {};
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:49:29: Warning: Named parameter 'b' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required.dart:49:29: Error: Named parameter 'b' is required and can't have a default value.
// f = ({int a, required int b = 42}) {};
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:52:28: Warning: Optional parameter 'b' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:52:28: Error: Optional parameter 'b' should have a default value because its type 'int' doesn't allow null.
// void g2(int a = 42, [int b]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/required.dart:53:26: Warning: Optional parameter 'b' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:53:26: Error: Optional parameter 'b' should have a default value because its type 'int' doesn't allow null.
// f2 = (int a = 42, [int b]) {};
// ^
//
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart b/pkg/front_end/testcases/nnbd/required_name_override.dart
new file mode 100644
index 0000000..ed0b0526
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart
@@ -0,0 +1,22 @@
+// 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 'required_name_override_lib.dart';
+
+class B {
+ void test_default({int? i}) {}
+ void test_nondefault({int? i = 1}) {}
+}
+
+class A extends B implements C {
+ void test_default({required int? i}) {}
+ void test_nondefault({required int? i}) {}
+ void test_legacy({required int? i}) {}
+}
+
+main() {
+ A().test_default(i: 1);
+ A().test_nondefault(i: 1);
+ A().test_legacy(i: 1);
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.outline.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.outline.expect
new file mode 100644
index 0000000..a35314d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.outline.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+// void test_default({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+// void test_default({int? i}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+// void test_nondefault({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+// void test_nondefault({int? i = 1}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+// void test_legacy({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+// void test_legacy({int i}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ ;
+ method test_default({core::int? i}) → void
+ ;
+ method test_nondefault({core::int? i = 1}) → void
+ ;
+}
+class A extends self::B implements req::C {
+ synthetic constructor •() → self::A
+ ;
+ method test_default({required core::int? i}) → void
+ ;
+ method test_nondefault({required core::int? i}) → void
+ ;
+ method test_legacy({required core::int? i}) → void
+ ;
+}
+static method main() → dynamic
+ ;
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → req::C*
+ ;
+ method test_legacy({core::int* i}) → void
+ ;
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.expect
new file mode 100644
index 0000000..201e23a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+// void test_default({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+// void test_default({int? i}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+// void test_nondefault({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+// void test_nondefault({int? i = 1}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+// void test_legacy({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+// void test_legacy({int i}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+ method test_default({core::int? i = #C1}) → void {}
+ method test_nondefault({core::int? i = #C2}) → void {}
+}
+class A extends self::B implements req::C {
+ synthetic constructor •() → self::A
+ : super self::B::•()
+ ;
+ method test_default({required core::int? i = #C1}) → void {}
+ method test_nondefault({required core::int? i = #C1}) → void {}
+ method test_legacy({required core::int? i = #C1}) → void {}
+}
+static method main() → dynamic {
+ new self::A::•().{self::A::test_default}(i: 1);
+ new self::A::•().{self::A::test_nondefault}(i: 1);
+ new self::A::•().{self::A::test_legacy}(i: 1);
+}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → req::C*
+ : super core::Object::•()
+ ;
+ method test_legacy({core::int* i = #C1}) → void {}
+}
+
+constants {
+ #C1 = null
+ #C2 = 1
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.transformed.expect
new file mode 100644
index 0000000..201e23a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.transformed.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+// void test_default({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+// void test_default({int? i}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+// void test_nondefault({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+// void test_nondefault({int? i = 1}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+// void test_legacy({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+// void test_legacy({int i}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+ method test_default({core::int? i = #C1}) → void {}
+ method test_nondefault({core::int? i = #C2}) → void {}
+}
+class A extends self::B implements req::C {
+ synthetic constructor •() → self::A
+ : super self::B::•()
+ ;
+ method test_default({required core::int? i = #C1}) → void {}
+ method test_nondefault({required core::int? i = #C1}) → void {}
+ method test_legacy({required core::int? i = #C1}) → void {}
+}
+static method main() → dynamic {
+ new self::A::•().{self::A::test_default}(i: 1);
+ new self::A::•().{self::A::test_nondefault}(i: 1);
+ new self::A::•().{self::A::test_legacy}(i: 1);
+}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → req::C*
+ : super core::Object::•()
+ ;
+ method test_legacy({core::int* i = #C1}) → void {}
+}
+
+constants {
+ #C1 = null
+ #C2 = 1
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.expect
new file mode 100644
index 0000000..201e23a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+// void test_default({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+// void test_default({int? i}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+// void test_nondefault({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+// void test_nondefault({int? i = 1}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+// void test_legacy({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+// void test_legacy({int i}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+ method test_default({core::int? i = #C1}) → void {}
+ method test_nondefault({core::int? i = #C2}) → void {}
+}
+class A extends self::B implements req::C {
+ synthetic constructor •() → self::A
+ : super self::B::•()
+ ;
+ method test_default({required core::int? i = #C1}) → void {}
+ method test_nondefault({required core::int? i = #C1}) → void {}
+ method test_legacy({required core::int? i = #C1}) → void {}
+}
+static method main() → dynamic {
+ new self::A::•().{self::A::test_default}(i: 1);
+ new self::A::•().{self::A::test_nondefault}(i: 1);
+ new self::A::•().{self::A::test_legacy}(i: 1);
+}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → req::C*
+ : super core::Object::•()
+ ;
+ method test_legacy({core::int* i = #C1}) → void {}
+}
+
+constants {
+ #C1 = null
+ #C2 = 1
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.transformed.expect
new file mode 100644
index 0000000..201e23a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.transformed.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+// void test_default({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+// void test_default({int? i}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+// void test_nondefault({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+// void test_nondefault({int? i = 1}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+// void test_legacy({required int? i}) {}
+// ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+// void test_legacy({int i}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+ method test_default({core::int? i = #C1}) → void {}
+ method test_nondefault({core::int? i = #C2}) → void {}
+}
+class A extends self::B implements req::C {
+ synthetic constructor •() → self::A
+ : super self::B::•()
+ ;
+ method test_default({required core::int? i = #C1}) → void {}
+ method test_nondefault({required core::int? i = #C1}) → void {}
+ method test_legacy({required core::int? i = #C1}) → void {}
+}
+static method main() → dynamic {
+ new self::A::•().{self::A::test_default}(i: 1);
+ new self::A::•().{self::A::test_nondefault}(i: 1);
+ new self::A::•().{self::A::test_legacy}(i: 1);
+}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → req::C*
+ : super core::Object::•()
+ ;
+ method test_legacy({core::int* i = #C1}) → void {}
+}
+
+constants {
+ #C1 = null
+ #C2 = 1
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override_lib.dart b/pkg/front_end/testcases/nnbd/required_name_override_lib.dart
new file mode 100644
index 0000000..44d3239
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override_lib.dart
@@ -0,0 +1,9 @@
+// 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.
+
+// @dart=2.5
+
+class C {
+ void test_legacy({int i}) {}
+}
diff --git a/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.expect b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.expect
index 8f475d6..41566f3 100644
--- a/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.expect
@@ -2,15 +2,15 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:6:19: Warning: Named parameter 'parameter' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:6:19: Error: Named parameter 'parameter' is required and can't have a default value.
// foo({required int parameter = 42}) {}
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:7:11: Warning: Optional parameter 'parameter' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:7:11: Error: Optional parameter 'parameter' should have a default value because its type 'int' doesn't allow null.
// foo2({int parameter}) {}
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:8:11: Warning: Optional parameter 'parameter' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:8:11: Error: Optional parameter 'parameter' should have a default value because its type 'int' doesn't allow null.
// foo3([int parameter]) {}
// ^^^^^^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.transformed.expect
index 8f475d6..41566f3 100644
--- a/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.transformed.expect
@@ -2,15 +2,15 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:6:19: Warning: Named parameter 'parameter' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:6:19: Error: Named parameter 'parameter' is required and can't have a default value.
// foo({required int parameter = 42}) {}
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:7:11: Warning: Optional parameter 'parameter' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:7:11: Error: Optional parameter 'parameter' should have a default value because its type 'int' doesn't allow null.
// foo2({int parameter}) {}
// ^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:8:11: Warning: Optional parameter 'parameter' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:8:11: Error: Optional parameter 'parameter' should have a default value because its type 'int' doesn't allow null.
// foo3([int parameter]) {}
// ^^^^^^^^^
//
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart b/pkg/front_end/testcases/nnbd/return_null.dart
new file mode 100644
index 0000000..a044f19
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart
@@ -0,0 +1,126 @@
+// 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 'dart:async';
+
+String returnImplicit() /*error*/ {
+ print("foo");
+}
+
+String returnExplicit() {
+ print("foo");
+ return null; // error
+}
+
+String returnMixed(bool b) /*error*/ {
+ if (b) {
+ print("foo");
+ return null; // error
+ }
+}
+
+Future returnAsync1() async {} // ok
+
+FutureOr returnAsync2() async {} // ok
+
+FutureOr<int> returnAsync3() async {} // error
+
+FutureOr<int?> returnAsync4() async {} // ok
+
+returnAsync5() async {} // ok
+
+Future<int?> returnAsync6() async {
+ return null; // ok
+}
+
+Future<int?> returnAsync7() async {} // ok
+
+Iterable yieldSync() sync* {} // ok
+
+Stream yieldAsync() async* {} // ok
+
+enum Enum { a, b }
+
+Enum caseReturn1(Enum e) /* ok */ {
+ switch (e) {
+ case Enum.a:
+ return e;
+ case Enum.b:
+ return e;
+ }
+}
+
+Enum caseReturn2(Enum e) /* error */ {
+ switch (e) {
+ case Enum.a:
+ return e;
+ default:
+ }
+}
+
+localFunctions() {
+ String returnImplicit() /* error */ {
+ print("foo");
+ }
+
+ String returnExplicit() {
+ print("foo");
+ return null; // error
+ }
+
+ String returnMixed(bool b) /* error */ {
+ if (b) {
+ print("foo");
+ return null; // error
+ }
+ }
+
+ Future returnAsync1() async {} // ok
+
+ FutureOr returnAsync2() async {} // ok
+
+ FutureOr<int> returnAsync3() async {} // error
+
+ FutureOr<int?> returnAsync4() async {} // ok
+
+ returnAsync5() async {} // ok
+
+ Future<int?> returnAsync6() async {
+ return null; // ok
+ }
+
+ Future<int?> returnAsync7() async {} // ok
+
+ Iterable yieldSync() sync* {} // ok
+
+ Stream yieldAsync() async* {} // ok
+
+ Enum caseReturn1(Enum e) /* ok */ {
+ switch (e) {
+ case Enum.a:
+ return e;
+ case Enum.b:
+ return e;
+ }
+ }
+
+ Enum caseReturn2(Enum e) /* error */ {
+ switch (e) {
+ case Enum.a:
+ return e;
+ default:
+ }
+ }
+
+ bool b = false;
+ var local1 = () /* error */ {
+ if (b) return 0;
+ }();
+ var local2 = () /* ok */ {
+ if (b) return null;
+ if (!b) return 0;
+ }();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect b/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
new file mode 100644
index 0000000..94a68bd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/ {
+ final field core::int index;
+ final field core::String _name;
+ static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::a, self::Enum::b];
+ static const field self::Enum a = const self::Enum::•(0, "Enum.a");
+ static const field self::Enum b = const self::Enum::•(1, "Enum.b");
+ const constructor •(core::int index, core::String _name) → self::Enum
+ : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+ ;
+ method toString() → core::String
+ return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String
+ ;
+static method returnExplicit() → core::String
+ ;
+static method returnMixed(core::bool b) → core::String
+ ;
+static method returnAsync1() → asy::Future<dynamic>
+ ;
+static method returnAsync2() → asy::FutureOr<dynamic>
+ ;
+static method returnAsync3() → asy::FutureOr<core::int>
+ ;
+static method returnAsync4() → asy::FutureOr<core::int?>
+ ;
+static method returnAsync5() → dynamic
+ ;
+static method returnAsync6() → asy::Future<core::int?>
+ ;
+static method returnAsync7() → asy::Future<core::int?>
+ ;
+static method yieldSync() → core::Iterable<dynamic>
+ ;
+static method yieldAsync() → asy::Stream<dynamic>
+ ;
+static method caseReturn1(self::Enum e) → self::Enum
+ ;
+static method caseReturn2(self::Enum e) → self::Enum
+ ;
+static method localFunctions() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
new file mode 100644
index 0000000..336e616
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
@@ -0,0 +1,239 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /*error*/ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnMixed(bool b) /*error*/ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnMixed(bool b) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// var local1 = () /* error */ {
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/ {
+ final field core::int index;
+ final field core::String _name;
+ static const field core::List<self::Enum> values = #C7;
+ static const field self::Enum a = #C3;
+ static const field self::Enum b = #C6;
+ const constructor •(core::int index, core::String _name) → self::Enum
+ : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+ ;
+ method toString() → core::String
+ return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnImplicit() /*error*/ {
+ ^" in null;
+}
+static method returnExplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+}
+static method returnMixed(core::bool b) → core::String {
+ if(b) {
+ core::print("foo");
+ return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnMixed(bool b) /*error*/ {
+ ^" in null;
+}
+static method returnAsync1() → asy::Future<dynamic> async {}
+static method returnAsync2() → asy::FutureOr<dynamic> async {}
+static method returnAsync3() → asy::FutureOr<core::int> async {
+ return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+FutureOr<int> returnAsync3() async {} // error
+ ^" in null;
+}
+static method returnAsync4() → asy::FutureOr<core::int?> async {}
+static method returnAsync5() → dynamic async {}
+static method returnAsync6() → asy::Future<core::int?> async {
+ return null;
+}
+static method returnAsync7() → asy::Future<core::int?> async {}
+static method yieldSync() → core::Iterable<dynamic> sync* {}
+static method yieldAsync() → asy::Stream<dynamic> async* {}
+static method caseReturn1(self::Enum e) → self::Enum {
+ switch(e) {
+ #L1:
+ case #C3:
+ {
+ return e;
+ }
+ #L2:
+ case #C6:
+ {
+ return e;
+ }
+ }
+}
+static method caseReturn2(self::Enum e) → self::Enum {
+ switch(e) {
+ #L3:
+ case #C3:
+ {
+ return e;
+ }
+ #L4:
+ default:
+ {}
+ }
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+Enum caseReturn2(Enum e) /* error */ {
+ ^" in null;
+}
+static method localFunctions() → dynamic {
+ function returnImplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+ String returnImplicit() /* error */ {
+ ^" in null;
+ }
+ function returnExplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ function returnMixed(core::bool b) → core::String {
+ if(b) {
+ core::print("foo");
+ return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+ String returnMixed(bool b) /* error */ {
+ ^" in null;
+ }
+ function returnAsync1() → asy::Future<dynamic> async {}
+ function returnAsync2() → asy::FutureOr<dynamic> async {}
+ function returnAsync3() → asy::FutureOr<core::int> async {
+ return let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+ FutureOr<int> returnAsync3() async {} // error
+ ^" in null;
+ }
+ function returnAsync4() → asy::FutureOr<core::int?> async {}
+ function returnAsync5() → asy::Future<core::Null?> async {}
+ function returnAsync6() → asy::Future<core::int?> async {
+ return null;
+ }
+ function returnAsync7() → asy::Future<core::int?> async {}
+ function yieldSync() → core::Iterable<dynamic> sync* {}
+ function yieldAsync() → asy::Stream<dynamic> async* {}
+ function caseReturn1(self::Enum e) → self::Enum {
+ switch(e) {
+ #L5:
+ case #C3:
+ {
+ return e;
+ }
+ #L6:
+ case #C6:
+ {
+ return e;
+ }
+ }
+ }
+ function caseReturn2(self::Enum e) → self::Enum {
+ switch(e) {
+ #L7:
+ case #C3:
+ {
+ return e;
+ }
+ #L8:
+ default:
+ {}
+ }
+ return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+ Enum caseReturn2(Enum e) /* error */ {
+ ^" in null;
+ }
+ core::bool b = false;
+ core::int local1 = (() → core::int {
+ if(b)
+ return 0;
+ return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+ var local1 = () /* error */ {
+ ^" in null;
+ }).call();
+ core::int? local2 = (() → core::int? {
+ if(b)
+ return null;
+ if(!b)
+ return 0;
+ }).call();
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "Enum.a"
+ #C3 = self::Enum {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "Enum.b"
+ #C6 = self::Enum {index:#C4, _name:#C5}
+ #C7 = <self::Enum>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
new file mode 100644
index 0000000..7c0e736
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
@@ -0,0 +1,635 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /*error*/ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnMixed(bool b) /*error*/ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnMixed(bool b) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// var local1 = () /* error */ {
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/ {
+ final field core::int index;
+ final field core::String _name;
+ static const field core::List<self::Enum> values = #C7;
+ static const field self::Enum a = #C3;
+ static const field self::Enum b = #C6;
+ const constructor •(core::int index, core::String _name) → self::Enum
+ : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+ ;
+ method toString() → core::String
+ return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnImplicit() /*error*/ {
+ ^" in null;
+}
+static method returnExplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+}
+static method returnMixed(core::bool b) → core::String {
+ if(b) {
+ core::print("foo");
+ return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnMixed(bool b) /*error*/ {
+ ^" in null;
+}
+static method returnAsync1() → asy::Future<dynamic> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L1:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync2() → asy::FutureOr<dynamic> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L2:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync3() → asy::FutureOr<core::int> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+ asy::FutureOr<core::int>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L3:
+ {
+ :return_value = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+FutureOr<int> returnAsync3() async {} // error
+ ^" in null;
+ break #L3;
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync4() → asy::FutureOr<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L4:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync5() → dynamic /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L5:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync6() → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L6:
+ {
+ :return_value = null;
+ break #L6;
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync7() → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L7:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+ {}
+ return false;
+ }
+ return new core::_SyncIterable::•<dynamic>(:sync_op);
+}
+static method yieldAsync() → asy::Stream<dynamic> /* originally async* */ {
+ asy::_AsyncStarStreamController<dynamic>? :controller;
+ dynamic :controller_stream;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try
+ try {
+ #L8:
+ {}
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+ }
+ finally {
+ :controller.{asy::_AsyncStarStreamController::close}();
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
+ :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+ return :controller_stream;
+}
+static method caseReturn1(self::Enum e) → self::Enum {
+ switch(e) {
+ #L9:
+ case #C3:
+ {
+ return e;
+ }
+ #L10:
+ case #C6:
+ {
+ return e;
+ }
+ }
+}
+static method caseReturn2(self::Enum e) → self::Enum {
+ switch(e) {
+ #L11:
+ case #C3:
+ {
+ return e;
+ }
+ #L12:
+ default:
+ {}
+ }
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+Enum caseReturn2(Enum e) /* error */ {
+ ^" in null;
+}
+static method localFunctions() → dynamic {
+ function returnImplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+ String returnImplicit() /* error */ {
+ ^" in null;
+ }
+ function returnExplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ function returnMixed(core::bool b) → core::String {
+ if(b) {
+ core::print("foo");
+ return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+ String returnMixed(bool b) /* error */ {
+ ^" in null;
+ }
+ function returnAsync1() → asy::Future<dynamic> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L13:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync2() → asy::FutureOr<dynamic> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L14:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync3() → asy::FutureOr<core::int> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+ asy::FutureOr<core::int>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L15:
+ {
+ :return_value = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+ FutureOr<int> returnAsync3() async {} // error
+ ^" in null;
+ break #L15;
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync4() → asy::FutureOr<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L16:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync5() → asy::Future<core::Null?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::Null?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null?>();
+ asy::FutureOr<core::Null?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L17:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync6() → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L18:
+ {
+ :return_value = null;
+ break #L18;
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync7() → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L19:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+ {}
+ return false;
+ }
+ return new core::_SyncIterable::•<dynamic>(:sync_op);
+ }
+ function yieldAsync() → asy::Stream<dynamic> /* originally async* */ {
+ asy::_AsyncStarStreamController<dynamic>? :controller;
+ dynamic :controller_stream;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try
+ try {
+ #L20:
+ {}
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+ }
+ finally {
+ :controller.{asy::_AsyncStarStreamController::close}();
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
+ :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+ return :controller_stream;
+ }
+ function caseReturn1(self::Enum e) → self::Enum {
+ switch(e) {
+ #L21:
+ case #C3:
+ {
+ return e;
+ }
+ #L22:
+ case #C6:
+ {
+ return e;
+ }
+ }
+ }
+ function caseReturn2(self::Enum e) → self::Enum {
+ switch(e) {
+ #L23:
+ case #C3:
+ {
+ return e;
+ }
+ #L24:
+ default:
+ {}
+ }
+ return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+ Enum caseReturn2(Enum e) /* error */ {
+ ^" in null;
+ }
+ core::bool b = false;
+ core::int local1 = (() → core::int {
+ if(b)
+ return 0;
+ return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+ var local1 = () /* error */ {
+ ^" in null;
+ }).call();
+ core::int? local2 = (() → core::int? {
+ if(b)
+ return null;
+ if(!b)
+ return 0;
+ }).call();
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "Enum.a"
+ #C3 = self::Enum {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "Enum.b"
+ #C6 = self::Enum {index:#C4, _name:#C5}
+ #C7 = <self::Enum>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
new file mode 100644
index 0000000..9180305
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
@@ -0,0 +1,239 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /*error*/ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnMixed(bool b) /*error*/ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnMixed(bool b) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// var local1 = () /* error */ {
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/ {
+ final field core::int index;
+ final field core::String _name;
+ static const field core::List<self::Enum> values = #C7;
+ static const field self::Enum a = #C3;
+ static const field self::Enum b = #C6;
+ const constructor •(core::int index, core::String _name) → self::Enum
+ : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+ ;
+ method toString() → core::String
+ return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnImplicit() /*error*/ {
+ ^" in null;
+}
+static method returnExplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+}
+static method returnMixed(core::bool b) → core::String {
+ if(b) {
+ core::print("foo");
+ return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnMixed(bool b) /*error*/ {
+ ^" in null;
+}
+static method returnAsync1() → asy::Future<dynamic> async {}
+static method returnAsync2() → asy::FutureOr<dynamic> async {}
+static method returnAsync3() → asy::FutureOr<core::int> async {
+ return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+FutureOr<int> returnAsync3() async {} // error
+ ^" in null;
+}
+static method returnAsync4() → asy::FutureOr<core::int?> async {}
+static method returnAsync5() → dynamic async {}
+static method returnAsync6() → asy::Future<core::int?> async {
+ return null;
+}
+static method returnAsync7() → asy::Future<core::int?> async {}
+static method yieldSync() → core::Iterable<dynamic> sync* {}
+static method yieldAsync() → asy::Stream<dynamic> async* {}
+static method caseReturn1(self::Enum e) → self::Enum {
+ switch(e) {
+ #L1:
+ case #C3:
+ {
+ return e;
+ }
+ #L2:
+ case #C6:
+ {
+ return e;
+ }
+ }
+}
+static method caseReturn2(self::Enum e) → self::Enum {
+ switch(e) {
+ #L3:
+ case #C3:
+ {
+ return e;
+ }
+ #L4:
+ default:
+ {}
+ }
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+Enum caseReturn2(Enum e) /* error */ {
+ ^" in null;
+}
+static method localFunctions() → dynamic {
+ function returnImplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+ String returnImplicit() /* error */ {
+ ^" in null;
+ }
+ function returnExplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ function returnMixed(core::bool b) → core::String {
+ if(b) {
+ core::print("foo");
+ return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+ String returnMixed(bool b) /* error */ {
+ ^" in null;
+ }
+ function returnAsync1() → asy::Future<dynamic> async {}
+ function returnAsync2() → asy::FutureOr<dynamic> async {}
+ function returnAsync3() → asy::FutureOr<core::int> async {
+ return let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+ FutureOr<int> returnAsync3() async {} // error
+ ^" in null;
+ }
+ function returnAsync4() → asy::FutureOr<core::int?> async {}
+ function returnAsync5() → asy::Future<core::Null?> async {}
+ function returnAsync6() → asy::Future<core::int?> async {
+ return null;
+ }
+ function returnAsync7() → asy::Future<core::int?> async {}
+ function yieldSync() → core::Iterable<dynamic> sync* {}
+ function yieldAsync() → asy::Stream<dynamic> async* {}
+ function caseReturn1(self::Enum e) → self::Enum {
+ switch(e) {
+ #L5:
+ case #C3:
+ {
+ return e;
+ }
+ #L6:
+ case #C6:
+ {
+ return e;
+ }
+ }
+ }
+ function caseReturn2(self::Enum e) → self::Enum {
+ switch(e) {
+ #L7:
+ case #C3:
+ {
+ return e;
+ }
+ #L8:
+ default:
+ {}
+ }
+ return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+ Enum caseReturn2(Enum e) /* error */ {
+ ^" in null;
+ }
+ core::bool b = false;
+ core::int local1 = (() → core::int {
+ if(b)
+ return 0;
+ return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+ var local1 = () /* error */ {
+ ^" in null;
+ }).call();
+ core::int? local2 = (() → core::int? {
+ if(b)
+ return null;
+ if(!b)
+ return 0;
+ }).call();
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "Enum.a"
+ #C3 = self::Enum {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "Enum.b"
+ #C6 = self::Enum {index:#C4, _name:#C5}
+ #C7 = <self::Enum*>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
new file mode 100644
index 0000000..319833c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
@@ -0,0 +1,635 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /*error*/ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnMixed(bool b) /*error*/ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+// return null; // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnMixed(bool b) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+// ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// var local1 = () /* error */ {
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/ {
+ final field core::int index;
+ final field core::String _name;
+ static const field core::List<self::Enum> values = #C7;
+ static const field self::Enum a = #C3;
+ static const field self::Enum b = #C6;
+ const constructor •(core::int index, core::String _name) → self::Enum
+ : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+ ;
+ method toString() → core::String
+ return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnImplicit() /*error*/ {
+ ^" in null;
+}
+static method returnExplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+}
+static method returnMixed(core::bool b) → core::String {
+ if(b) {
+ core::print("foo");
+ return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnMixed(bool b) /*error*/ {
+ ^" in null;
+}
+static method returnAsync1() → asy::Future<dynamic> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L1:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync2() → asy::FutureOr<dynamic> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L2:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync3() → asy::FutureOr<core::int> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+ asy::FutureOr<core::int>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L3:
+ {
+ :return_value = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+FutureOr<int> returnAsync3() async {} // error
+ ^" in null;
+ break #L3;
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync4() → asy::FutureOr<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L4:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync5() → dynamic /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L5:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync6() → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L6:
+ {
+ :return_value = null;
+ break #L6;
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method returnAsync7() → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L7:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+ {}
+ return false;
+ }
+ return new core::_SyncIterable::•<dynamic>(:sync_op);
+}
+static method yieldAsync() → asy::Stream<dynamic> /* originally async* */ {
+ asy::_AsyncStarStreamController<dynamic>? :controller;
+ dynamic :controller_stream;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try
+ try {
+ #L8:
+ {}
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+ }
+ finally {
+ :controller.{asy::_AsyncStarStreamController::close}();
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
+ :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+ return :controller_stream;
+}
+static method caseReturn1(self::Enum e) → self::Enum {
+ switch(e) {
+ #L9:
+ case #C3:
+ {
+ return e;
+ }
+ #L10:
+ case #C6:
+ {
+ return e;
+ }
+ }
+}
+static method caseReturn2(self::Enum e) → self::Enum {
+ switch(e) {
+ #L11:
+ case #C3:
+ {
+ return e;
+ }
+ #L12:
+ default:
+ {}
+ }
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+Enum caseReturn2(Enum e) /* error */ {
+ ^" in null;
+}
+static method localFunctions() → dynamic {
+ function returnImplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+ String returnImplicit() /* error */ {
+ ^" in null;
+ }
+ function returnExplicit() → core::String {
+ core::print("foo");
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ function returnMixed(core::bool b) → core::String {
+ if(b) {
+ core::print("foo");
+ return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+ return null; // error
+ ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+ }
+ return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+ String returnMixed(bool b) /* error */ {
+ ^" in null;
+ }
+ function returnAsync1() → asy::Future<dynamic> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L13:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync2() → asy::FutureOr<dynamic> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L14:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync3() → asy::FutureOr<core::int> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+ asy::FutureOr<core::int>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L15:
+ {
+ :return_value = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+ FutureOr<int> returnAsync3() async {} // error
+ ^" in null;
+ break #L15;
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync4() → asy::FutureOr<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L16:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync5() → asy::Future<core::Null?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::Null?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null?>();
+ asy::FutureOr<core::Null?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L17:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync6() → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L18:
+ {
+ :return_value = null;
+ break #L18;
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function returnAsync7() → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ asy::FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L19:
+ {}
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ function yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+ {}
+ return false;
+ }
+ return new core::_SyncIterable::•<dynamic>(:sync_op);
+ }
+ function yieldAsync() → asy::Stream<dynamic> /* originally async* */ {
+ asy::_AsyncStarStreamController<dynamic>? :controller;
+ dynamic :controller_stream;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try
+ try {
+ #L20:
+ {}
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+ }
+ finally {
+ :controller.{asy::_AsyncStarStreamController::close}();
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
+ :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+ return :controller_stream;
+ }
+ function caseReturn1(self::Enum e) → self::Enum {
+ switch(e) {
+ #L21:
+ case #C3:
+ {
+ return e;
+ }
+ #L22:
+ case #C6:
+ {
+ return e;
+ }
+ }
+ }
+ function caseReturn2(self::Enum e) → self::Enum {
+ switch(e) {
+ #L23:
+ case #C3:
+ {
+ return e;
+ }
+ #L24:
+ default:
+ {}
+ }
+ return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+ Enum caseReturn2(Enum e) /* error */ {
+ ^" in null;
+ }
+ core::bool b = false;
+ core::int local1 = (() → core::int {
+ if(b)
+ return 0;
+ return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+ var local1 = () /* error */ {
+ ^" in null;
+ }).call();
+ core::int? local2 = (() → core::int? {
+ if(b)
+ return null;
+ if(!b)
+ return 0;
+ }).call();
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "Enum.a"
+ #C3 = self::Enum {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "Enum.b"
+ #C6 = self::Enum {index:#C4, _name:#C5}
+ #C7 = <self::Enum*>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
index 0c83c79..9ddd160 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
@@ -2,34 +2,34 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// throwsInStrong(() => c?.field + 2); // error
// ^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Warning: Property 'field' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
// Try accessing using ?. instead.
// throwsInStrong(() => (c?.next).field); // error
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
// throwsInStrong(() => -c?.field); // error
// ^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// throwsInStrong(() => c?.next[0] + 2); // error
// ^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Warning: Property 'isEven' is accessed on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
// Try accessing using ?. instead.
// throwsInStrong(() => (c?.next[0]).isEven); // error
// ^^^^^^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
// throwsInStrong(() => -c?.next[0]); // error
// ^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
// Try accessing using ?. instead.
// s.length; // This will be an invalid expression in strong mode.
// ^^^^^^
@@ -54,21 +54,39 @@
}
static method test(self::Class? c) → dynamic {
let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
- self::throwsInStrong(() → core::int? => (let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{core::int?} null : #t2{self::Class}.{self::Class::field}).{core::num::+}(2));
- let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : let final core::int #t4 = #t3.{self::Class::field}.{core::num::+}(1) in let final void #t5 = #t3.{self::Class::field} = #t4 in #t4;
- let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{core::int?} null : #t6.{self::Class::field} = #t6.{self::Class::field}.{core::num::+}(1);
- self::throwsInStrong(() → core::int => (let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : #t7{self::Class}.{self::Class::next}).{self::Class::field});
- self::throwsInStrong(() → core::int => (let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{core::int?} null : #t8{self::Class}.{self::Class::field}).{core::int::unary-}());
- let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{core::bool?} null : #t9{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
- self::throwsInStrong(() → core::int? => (let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{core::int?} null : #t10{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
- let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t12 = #t11{self::Class}.{self::Class::next} in let final core::int #t13 = 0 in let final core::int #t14 = #t12.{self::Class::[]}(#t13).{core::num::+}(1) in let final void #t15 = #t12.{self::Class::[]=}(#t13, #t14) in #t14;
- let final self::Class? #t16 = c in #t16.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t17 = #t16{self::Class}.{self::Class::next} in let final core::int #t18 = 0 in #t17.{self::Class::[]=}(#t18, #t17.{self::Class::[]}(#t18).{core::num::+}(1));
- self::throwsInStrong(() → core::bool => (let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{core::int?} null : #t19{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
- self::throwsInStrong(() → core::int => (let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : #t20{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
+ self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ throwsInStrong(() => c?.field + 2); // error
+ ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
+ let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
+ let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{core::int?} null : #t7.{self::Class::field} = #t7.{self::Class::field}.{core::num::+}(1);
+ self::throwsInStrong(() → core::int => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
+Try accessing using ?. instead.
+ throwsInStrong(() => (c?.next).field); // error
+ ^^^^^" in (let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9{self::Class}.{self::Class::next}).{self::Class::field});
+ self::throwsInStrong(() → core::int => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+ throwsInStrong(() => -c?.field); // error
+ ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
+ let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
+ self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ throwsInStrong(() => c?.next[0] + 2); // error
+ ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
+ let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
+ let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t21 = #t20{self::Class}.{self::Class::next} in let final core::int #t22 = 0 in #t21.{self::Class::[]=}(#t22, #t21.{self::Class::[]}(#t22).{core::num::+}(1));
+ self::throwsInStrong(() → core::bool => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+ throwsInStrong(() => (c?.next[0]).isEven); // error
+ ^^^^^^" in (let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{core::int?} null : #t24{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
+ self::throwsInStrong(() → core::int => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+ throwsInStrong(() => -c?.next[0]); // error
+ ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
}
static method _inStrongMode() → core::bool {
(core::String?) → core::Null? f = (core::String? s) → core::Null? {
- s.{core::String::length};
+ let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+Try accessing using ?. instead.
+ s.length; // This will be an invalid expression in strong mode.
+ ^^^^^^" in s.{core::String::length};
};
try {
f.call("foo");
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
index 0c83c79..9ddd160 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
@@ -2,34 +2,34 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// throwsInStrong(() => c?.field + 2); // error
// ^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Warning: Property 'field' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
// - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
// Try accessing using ?. instead.
// throwsInStrong(() => (c?.next).field); // error
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
// throwsInStrong(() => -c?.field); // error
// ^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// throwsInStrong(() => c?.next[0] + 2); // error
// ^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Warning: Property 'isEven' is accessed on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
// Try accessing using ?. instead.
// throwsInStrong(() => (c?.next[0]).isEven); // error
// ^^^^^^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
// throwsInStrong(() => -c?.next[0]); // error
// ^
//
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
// Try accessing using ?. instead.
// s.length; // This will be an invalid expression in strong mode.
// ^^^^^^
@@ -54,21 +54,39 @@
}
static method test(self::Class? c) → dynamic {
let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
- self::throwsInStrong(() → core::int? => (let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{core::int?} null : #t2{self::Class}.{self::Class::field}).{core::num::+}(2));
- let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : let final core::int #t4 = #t3.{self::Class::field}.{core::num::+}(1) in let final void #t5 = #t3.{self::Class::field} = #t4 in #t4;
- let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{core::int?} null : #t6.{self::Class::field} = #t6.{self::Class::field}.{core::num::+}(1);
- self::throwsInStrong(() → core::int => (let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : #t7{self::Class}.{self::Class::next}).{self::Class::field});
- self::throwsInStrong(() → core::int => (let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{core::int?} null : #t8{self::Class}.{self::Class::field}).{core::int::unary-}());
- let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{core::bool?} null : #t9{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
- self::throwsInStrong(() → core::int? => (let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{core::int?} null : #t10{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
- let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t12 = #t11{self::Class}.{self::Class::next} in let final core::int #t13 = 0 in let final core::int #t14 = #t12.{self::Class::[]}(#t13).{core::num::+}(1) in let final void #t15 = #t12.{self::Class::[]=}(#t13, #t14) in #t14;
- let final self::Class? #t16 = c in #t16.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t17 = #t16{self::Class}.{self::Class::next} in let final core::int #t18 = 0 in #t17.{self::Class::[]=}(#t18, #t17.{self::Class::[]}(#t18).{core::num::+}(1));
- self::throwsInStrong(() → core::bool => (let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{core::int?} null : #t19{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
- self::throwsInStrong(() → core::int => (let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : #t20{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
+ self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ throwsInStrong(() => c?.field + 2); // error
+ ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
+ let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
+ let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{core::int?} null : #t7.{self::Class::field} = #t7.{self::Class::field}.{core::num::+}(1);
+ self::throwsInStrong(() → core::int => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
+Try accessing using ?. instead.
+ throwsInStrong(() => (c?.next).field); // error
+ ^^^^^" in (let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9{self::Class}.{self::Class::next}).{self::Class::field});
+ self::throwsInStrong(() → core::int => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+ throwsInStrong(() => -c?.field); // error
+ ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
+ let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
+ self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ throwsInStrong(() => c?.next[0] + 2); // error
+ ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
+ let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
+ let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t21 = #t20{self::Class}.{self::Class::next} in let final core::int #t22 = 0 in #t21.{self::Class::[]=}(#t22, #t21.{self::Class::[]}(#t22).{core::num::+}(1));
+ self::throwsInStrong(() → core::bool => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+ throwsInStrong(() => (c?.next[0]).isEven); // error
+ ^^^^^^" in (let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{core::int?} null : #t24{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
+ self::throwsInStrong(() → core::int => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+ throwsInStrong(() => -c?.next[0]); // error
+ ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
}
static method _inStrongMode() → core::bool {
(core::String?) → core::Null? f = (core::String? s) → core::Null? {
- s.{core::String::length};
+ let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+Try accessing using ?. instead.
+ s.length; // This will be an invalid expression in strong mode.
+ ^^^^^^" in s.{core::String::length};
};
try {
f.call("foo");
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
index 2317ae7..19bd0eb 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
@@ -2,19 +2,19 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
// functionContext(null as C?); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Error: Can't tear off method 'call' from a potentially null value.
// nullableFunctionContext(null as C?); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
// functionContext(c); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
// nullableFunctionContext(c); // Error.
// ^
//
@@ -55,30 +55,38 @@
static method functionContext(() → core::int f) → dynamic {}
static method nullableFunctionContext(() →? core::int f) → dynamic {}
static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
- self::functionContext((null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
- self::nullableFunctionContext((null as{ForNonNullableByDefault} self::C?) as{TypeError} () →? core::int);
- self::functionContext(c as{TypeError} () → core::int);
- self::nullableFunctionContext(c as{TypeError} () →? core::int);
- self::functionContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+ self::functionContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
+ functionContext(null as C?); // Error.
+ ^" in (null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
+ self::nullableFunctionContext(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Error: Can't tear off method 'call' from a potentially null value.
+ nullableFunctionContext(null as C?); // Error.
+ ^" in (null as{ForNonNullableByDefault} self::C?) as{TypeError} () →? core::int);
+ self::functionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
+ functionContext(c); // Error.
+ ^" in c as{TypeError} () → core::int);
+ self::nullableFunctionContext(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
+ nullableFunctionContext(c); // Error.
+ ^" in c as{TypeError} () →? core::int);
+ self::functionContext(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
functionContext(t); // Error.
^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
- self::nullableFunctionContext(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+ self::nullableFunctionContext(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
nullableFunctionContext(t); // Error.
^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
- self::functionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
+ self::functionContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
functionContext(nt); // Error.
^" in nt as{TypeError,ForNonNullableByDefault} () → core::int);
- self::nullableFunctionContext(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
+ self::nullableFunctionContext(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
nullableFunctionContext(nt); // Error.
^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
}
static method bar<T extends self::C = self::C>(self::C c, self::bar::T t) → dynamic {
- self::functionContext(let final self::C #t5 = c in #t5.==(null) ?{() → core::int} null : #t5.{self::C::call});
- self::nullableFunctionContext(let final self::C #t6 = c in #t6.==(null) ?{() → core::int} null : #t6.{self::C::call});
- self::functionContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+ self::functionContext(let final self::C #t9 = c in #t9.==(null) ?{() → core::int} null : #t9.{self::C::call});
+ self::nullableFunctionContext(let final self::C #t10 = c in #t10.==(null) ?{() → core::int} null : #t10.{self::C::call});
+ self::functionContext(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
functionContext(t); // Shouldn't result in a compile-time error.
^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
- self::nullableFunctionContext(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+ self::nullableFunctionContext(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
nullableFunctionContext(t); // Shouldn't result in a compile-time error.
^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
}
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
index 2317ae7..19bd0eb 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
@@ -2,19 +2,19 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
// functionContext(null as C?); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Error: Can't tear off method 'call' from a potentially null value.
// nullableFunctionContext(null as C?); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
// functionContext(c); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
// nullableFunctionContext(c); // Error.
// ^
//
@@ -55,30 +55,38 @@
static method functionContext(() → core::int f) → dynamic {}
static method nullableFunctionContext(() →? core::int f) → dynamic {}
static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
- self::functionContext((null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
- self::nullableFunctionContext((null as{ForNonNullableByDefault} self::C?) as{TypeError} () →? core::int);
- self::functionContext(c as{TypeError} () → core::int);
- self::nullableFunctionContext(c as{TypeError} () →? core::int);
- self::functionContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+ self::functionContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
+ functionContext(null as C?); // Error.
+ ^" in (null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
+ self::nullableFunctionContext(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Error: Can't tear off method 'call' from a potentially null value.
+ nullableFunctionContext(null as C?); // Error.
+ ^" in (null as{ForNonNullableByDefault} self::C?) as{TypeError} () →? core::int);
+ self::functionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
+ functionContext(c); // Error.
+ ^" in c as{TypeError} () → core::int);
+ self::nullableFunctionContext(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
+ nullableFunctionContext(c); // Error.
+ ^" in c as{TypeError} () →? core::int);
+ self::functionContext(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
functionContext(t); // Error.
^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
- self::nullableFunctionContext(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+ self::nullableFunctionContext(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
nullableFunctionContext(t); // Error.
^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
- self::functionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
+ self::functionContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
functionContext(nt); // Error.
^" in nt as{TypeError,ForNonNullableByDefault} () → core::int);
- self::nullableFunctionContext(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
+ self::nullableFunctionContext(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
nullableFunctionContext(nt); // Error.
^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
}
static method bar<T extends self::C = self::C>(self::C c, self::bar::T t) → dynamic {
- self::functionContext(let final self::C #t5 = c in #t5.==(null) ?{() → core::int} null : #t5.{self::C::call});
- self::nullableFunctionContext(let final self::C #t6 = c in #t6.==(null) ?{() → core::int} null : #t6.{self::C::call});
- self::functionContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+ self::functionContext(let final self::C #t9 = c in #t9.==(null) ?{() → core::int} null : #t9.{self::C::call});
+ self::nullableFunctionContext(let final self::C #t10 = c in #t10.==(null) ?{() → core::int} null : #t10.{self::C::call});
+ self::functionContext(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
functionContext(t); // Shouldn't result in a compile-time error.
^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
- self::nullableFunctionContext(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+ self::nullableFunctionContext(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
nullableFunctionContext(t); // Shouldn't result in a compile-time error.
^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
}
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
index f449dd1..8b101b6 100644
--- a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
@@ -28,9 +28,9 @@
// }
// ^
//
-// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
// - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// C<
// ^
//
@@ -42,9 +42,9 @@
: super core::Object::•() {}
}
static method main() → dynamic {
- invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+ invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
- 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
C<
^";
}
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
index f449dd1..8b101b6 100644
--- a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
@@ -28,9 +28,9 @@
// }
// ^
//
-// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
// - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// C<
// ^
//
@@ -42,9 +42,9 @@
: super core::Object::•() {}
}
static method main() → dynamic {
- invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+ invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
- 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
C<
^";
}
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 4ed69fe..5907733 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -229,43 +229,43 @@
// use(super.m -= 42);
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:95:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// super.m++;
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:96:16: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:96:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// use(super.m++);
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:97:12: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:97:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// super.n++;
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:98:16: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:98:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// use(super.n++);
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:120:5: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:120:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// ++super.m;
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:121:9: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:121:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// use(++super.m);
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:122:5: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:122:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// ++super.n;
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:123:9: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:123:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// use(++super.n);
// ^
//
@@ -293,43 +293,43 @@
// use(super.n(87));
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:222:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// super.m += 42;
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:223:17: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:223:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// use(super.m += 42);
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:224:13: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:224:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// super.n += 42;
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:225:17: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:225:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
// use(super.n += 42);
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// pkg/front_end/testcases/rasta/super.dart:247:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// super.m -= 42;
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:248:17: Error: The method '-' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// pkg/front_end/testcases/rasta/super.dart:248:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// use(super.m -= 42);
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:249:13: Error: The method '-' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// pkg/front_end/testcases/rasta/super.dart:249:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// super.n -= 42;
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// pkg/front_end/testcases/rasta/super.dart:250:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
// use(super.n -= 42);
// ^
//
@@ -455,20 +455,20 @@
self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
let final core::int* #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
self::use(let final core::int* #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final void #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
- super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:95:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
super.m++;
^";
- self::use(let final () →* void #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:96:16: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ self::use(let final () →* void #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:96:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
use(super.m++);
^" in #t23);
- super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:97:12: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:97:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
super.n++;
^";
- self::use(let final () →* void #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:98:16: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ self::use(let final () →* void #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:98:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
use(super.n++);
^" in #t25);
super.{self::A::a} = super.{self::A::a}.+(1);
@@ -491,20 +491,20 @@
self::use(super.{self::B::i} = super.{self::A::i}.+(1));
let final core::int* #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(1) in let final void #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
self::use(let final core::int* #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30).+(1) in let final void #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
- super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:120:5: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:120:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
++super.m;
^";
- self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:121:9: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:121:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
use(++super.m);
^");
- super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:122:5: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:122:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
++super.n;
^";
- self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:123:9: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:123:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
use(++super.n);
^");
super.{self::A::a}.call();
@@ -615,20 +615,20 @@
self::use(super.{self::B::i} = super.{self::A::i}.+(42));
let final core::int* #t57 = 87 in super.{self::A::[]=}(#t57, super.{self::A::[]}(#t57).+(42));
self::use(let final core::int* #t58 = 87 in let final dynamic #t59 = super.{self::A::[]}(#t58).+(42) in let final void #t60 = super.{self::A::[]=}(#t58, #t59) in #t59);
- super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:222:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
super.m += 42;
^";
- self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:223:17: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:223:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
use(super.m += 42);
^");
- super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:224:13: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:224:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
super.n += 42;
^";
- self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:225:17: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+ self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:225:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
use(super.n += 42);
^");
super.{self::A::a} = super.{self::A::a}.-(42);
@@ -651,20 +651,20 @@
self::use(super.{self::B::i} = super.{self::A::i}.-(42));
let final core::int* #t61 = 87 in super.{self::A::[]=}(#t61, super.{self::A::[]}(#t61).-(42));
self::use(let final core::int* #t62 = 87 in let final dynamic #t63 = super.{self::A::[]}(#t62).-(42) in let final void #t64 = super.{self::A::[]=}(#t62, #t63) in #t63);
- super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+ super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:247:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
super.m -= 42;
^";
- self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:248:17: Error: The method '-' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+ self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:248:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
use(super.m -= 42);
^");
- super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:249:13: Error: The method '-' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+ super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:249:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
super.n -= 42;
^";
- self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+ self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:250:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
use(super.n -= 42);
^");
}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
index abdf3cd..96da1b8 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -24,9 +24,9 @@
// var f = Map<A, B> {};
// ^
//
-// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The operator '<' isn't defined for the class 'Type'.
// - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// var f = Map<A, B> {};
// ^
//
@@ -44,9 +44,9 @@
;
}
class C extends core::Object {
- field dynamic f = invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+ field dynamic f = invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The operator '<' isn't defined for the class 'Type'.
- 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
var f = Map<A, B> {};
^";
field dynamic B = null;
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
index abdf3cd..96da1b8 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
@@ -24,9 +24,9 @@
// var f = Map<A, B> {};
// ^
//
-// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The operator '<' isn't defined for the class 'Type'.
// - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// var f = Map<A, B> {};
// ^
//
@@ -44,9 +44,9 @@
;
}
class C extends core::Object {
- field dynamic f = invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+ field dynamic f = invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The operator '<' isn't defined for the class 'Type'.
- 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
var f = Map<A, B> {};
^";
field dynamic B = null;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
index 5874008..8a0e754 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -22,17 +22,17 @@
// type T = Map<A, B>
// ^
//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
// - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// type T = Map<A, B>
// ^
//
import self as self;
-static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
- 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
type T = Map<A, B>
^" as{TypeError,ForDynamic} invalid-type;
static field invalid-type B;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
index 5874008..8a0e754 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
@@ -22,17 +22,17 @@
// type T = Map<A, B>
// ^
//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
// - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
// type T = Map<A, B>
// ^
//
import self as self;
-static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
- 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
type T = Map<A, B>
^" as{TypeError,ForDynamic} invalid-type;
static field invalid-type B;
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index a15ef79..2ef9e79 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -38,7 +38,6 @@
general/external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
general/incomplete_field_formal_parameter: RuntimeError
general/infer_field_from_multiple: TypeCheckError
-general/invalid_type: TypeCheckError
general/invalid_operator: TypeCheckError
general/invocations: RuntimeError
general/issue37776: RuntimeError
@@ -92,7 +91,6 @@
general_nnbd_opt_out/expressions: RuntimeError
general_nnbd_opt_out/external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
general_nnbd_opt_out/incomplete_field_formal_parameter: RuntimeError
-general_nnbd_opt_out/invalid_type: TypeCheckError
general_nnbd_opt_out/invocations: RuntimeError
general_nnbd_opt_out/issue37776: RuntimeError
general_nnbd_opt_out/issue38938: RuntimeError # no main and compile time errors.
@@ -150,7 +148,6 @@
inference/override_equals: RuntimeError
inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: InstrumentationMismatch # Issue #25824
inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: InstrumentationMismatch # Issue #25824
-inference_new/dependency_only_if_overloaded: TypeCheckError
inference_new/infer_assign_to_index_super_upwards: TypeCheckError
inference_new/infer_assign_to_index_this_upwards: TypeCheckError
inference_new/infer_assign_to_index_upwards: TypeCheckError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 20fccba..1a235ee 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -11,6 +11,7 @@
agnostic/set: TextSerializationFailure
expression/eval: TextSerializationFailure # Was: Pass
expression/main: TextSerializationFailure # Was: Pass
+extensions/ambiguous: TextSerializationFailure
extensions/annotations: TextSerializationFailure
extensions/builtin_identifiers: TextSerializationFailure
extensions/call_methods: TypeCheckError
@@ -57,6 +58,7 @@
extensions/issue38750: TextSerializationFailure
extensions/issue38755: TextSerializationFailure
extensions/issue38915: TextSerializationFailure
+extensions/issue39527: TextSerializationFailure
extensions/issue39889: TextSerializationFailure
extensions/issue39938/issue39938: TextSerializationFailure
extensions/issue40596: TextSerializationFailure
@@ -217,6 +219,7 @@
general/infer_field_type: TextSerializationFailure
general/infer_fixed_generic_return_type: TextSerializationFailure
general/infer_map_literal_with_closure: TextSerializationFailure
+general/inherit_function: TextSerializationFailure
general/interface_conflict: TextSerializationFailure
general/interface_contravariant_from_class: TextSerializationFailure
general/interface_covariantImpl_from_class: TextSerializationFailure
@@ -225,7 +228,7 @@
general/invalid_cast: TextSerializationFailure # Was: Pass
general/invalid_operator2: TextSerializationFailure
general/invalid_operator: TypeCheckError
-general/invalid_type: TypeCheckError
+general/invalid_type: TextSerializationFailure
general/invocations: TextSerializationFailure # Was: RuntimeError
general/issue129167943: TextSerializationFailure
general/issue34515: TextSerializationFailure
@@ -512,7 +515,7 @@
general_nnbd_opt_out/interface_covariantInterface_from_class: TextSerializationFailure
general_nnbd_opt_out/invalid_assignment: TextSerializationFailure # Was: Pass
general_nnbd_opt_out/invalid_cast: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/invalid_type: TypeCheckError
+general_nnbd_opt_out/invalid_type: TextSerializationFailure
general_nnbd_opt_out/invocations: TextSerializationFailure # Was: RuntimeError
general_nnbd_opt_out/issue129167943: TextSerializationFailure
general_nnbd_opt_out/issue34515: TextSerializationFailure
@@ -1211,8 +1214,12 @@
instantiate_to_bound/typedef_omitted_bound: TextSerializationFailure # Was: Pass
instantiate_to_bound/typedef_raw_in_bound: TextSerializationFailure # Was: Pass
instantiate_to_bound/typedef_super_bounded_type: TextSerializationFailure # Was: Pass
+late_lowering/compound: TextSerializationFailure
+late_lowering/definitely_assigned: TextSerializationFailure
+late_lowering/definitely_unassigned: TextSerializationFailure
late_lowering/initializer_rewrite: TextSerializationFailure
late_lowering/infer_late_field_type: TextSerializationFailure
+late_lowering/infer_from_late_variable: TextSerializationFailure
late_lowering/injected_late_field_checks/main: TextSerializationFailure
late_lowering/instance_field_with_initializer: TextSerializationFailure
late_lowering/instance_field_without_initializer: TextSerializationFailure
@@ -1223,6 +1230,7 @@
late_lowering/issue40093: TextSerializationFailure
late_lowering/issue40373: TextSerializationFailure
late_lowering/issue40373b: TextSerializationFailure
+late_lowering/issue40601: TextSerializationFailure
late_lowering/issue40805: TextSerializationFailure
late_lowering/late_field_inference: TextSerializationFailure
late_lowering/late_field_with_initializer: TextSerializationFailure
@@ -1255,6 +1263,8 @@
nnbd/constants: TextSerializationFailure
nnbd/covariant_nnbd_top_merge: TextSerializationFailure
nnbd/definite_assignment_and_completion: TextSerializationFailure
+nnbd/definitely_assigned: TextSerializationFailure
+nnbd/definitely_unassigned: TextSerializationFailure
nnbd/definitely_unassigned_late_local_variables: TextSerializationFailure
nnbd/demote_closure_types: TextSerializationFailure
nnbd/export_from_opt_out: TextSerializationFailure
@@ -1265,6 +1275,7 @@
nnbd/future_or_variables: TextSerializationFailure
nnbd/generic_override: TextSerializationFailure
nnbd/infer_constraints_from_opt_in: TextSerializationFailure
+nnbd/infer_from_late_variable: TextSerializationFailure
nnbd/infer_from_opt_in: TextSerializationFailure
nnbd/infer_from_opt_out: TextSerializationFailure
nnbd/infer_if_null: TextSerializationFailure
@@ -1280,7 +1291,10 @@
nnbd/issue40134: TextSerializationFailure
nnbd/issue40512/issue40512: TextSerializationFailure
nnbd/issue40600: TextSerializationFailure
+nnbd/issue40601: TextSerializationFailure
nnbd/issue40805: TextSerializationFailure
+nnbd/issue41102: TextSerializationFailure
+nnbd/issue41103: TextSerializationFailure
nnbd/issue_39286: TextSerializationFailure
nnbd/issue_39286_2: TextSerializationFailure
nnbd/late: TextSerializationFailure
@@ -1288,6 +1302,7 @@
nnbd/lhs_of_if_null: TextSerializationFailure
nnbd/list_constructor: TextSerializationFailure
nnbd/literal_from_opt_in: TextSerializationFailure
+nnbd/load_library: TextSerializationFailure
nnbd/member_inheritance_from_opt_in: TextSerializationFailure
nnbd/member_inheritance_from_opt_out: TextSerializationFailure
nnbd/messages_with_types_opt_in: TypeCheckError
@@ -1330,8 +1345,10 @@
nnbd/potentially_non_nullable_field: TextSerializationFailure
nnbd/regress_null_aware: TextSerializationFailure
nnbd/required: TextSerializationFailure
+nnbd/required_name_override: TextSerializationFailure
nnbd/required_named_parameter: TextSerializationFailure
nnbd/return_late: TextSerializationFailure
+nnbd/return_null: TextSerializationFailure
nnbd/shorting_stop: TextSerializationFailure
nnbd/simple_never: TextSerializationFailure
nnbd/sink_hierarchy: TextSerializationFailure
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 23aa8f9..76ab3a5 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -35,7 +35,6 @@
general_nnbd_opt_out/expressions: RuntimeError
general_nnbd_opt_out/external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
general_nnbd_opt_out/incomplete_field_formal_parameter: RuntimeError
-general_nnbd_opt_out/invalid_type: TypeCheckError
general_nnbd_opt_out/invocations: RuntimeError
general_nnbd_opt_out/issue37776: RuntimeError
general_nnbd_opt_out/issue38938: RuntimeError # no main and compile time errors.
diff --git a/pkg/front_end/tool/_fasta/abcompile.dart b/pkg/front_end/tool/_fasta/abcompile.dart
index 4ccde2a..63ea80b 100644
--- a/pkg/front_end/tool/_fasta/abcompile.dart
+++ b/pkg/front_end/tool/_fasta/abcompile.dart
@@ -9,11 +9,10 @@
import 'standard_deviation.dart';
-const String bRootPath = const String.fromEnvironment("bRoot");
-const int abIterations =
- const int.fromEnvironment("abIterations", defaultValue: 15);
-const int iterations =
- const int.fromEnvironment("iterations", defaultValue: 15);
+const String bRootPath =
+ bool.hasEnvironment("bRoot") ? String.fromEnvironment("bRoot") : null;
+const int abIterations = int.fromEnvironment("abIterations", defaultValue: 15);
+const int iterations = int.fromEnvironment("iterations", defaultValue: 15);
/// Compare the performance of two different fast implementations
/// by alternately launching the compile application in this directory
diff --git a/pkg/frontend_server/lib/src/javascript_bundle.dart b/pkg/frontend_server/lib/src/javascript_bundle.dart
index cedccc6..201d379f 100644
--- a/pkg/frontend_server/lib/src/javascript_bundle.dart
+++ b/pkg/frontend_server/lib/src/javascript_bundle.dart
@@ -156,6 +156,7 @@
mapUrl: '$moduleUrl.lib.js.map',
sourceMapBase: sourceMapBase,
customScheme: _fileSystemScheme,
+ component: summaryComponent,
);
final codeBytes = utf8.encode(code.code);
final sourceMapBytes = utf8.encode(json.encode(code.sourceMap));
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 92e1b4c..3cce979 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -76,12 +76,83 @@
import 'default_language_version.dart';
import 'transformations/flags.dart';
-import 'text/ast_to_text.dart';
+import 'text/ast_to_text.dart' as astToText;
import 'core_types.dart';
import 'type_algebra.dart';
import 'type_environment.dart';
import 'src/assumptions.dart';
+String _debugNullability(Nullability nullability) {
+ switch (nullability) {
+ case Nullability.legacy:
+ return '*';
+ case Nullability.nullable:
+ return '?';
+ case Nullability.undetermined:
+ return '%';
+ case Nullability.nonNullable:
+ return '';
+ }
+ throw "Unknown Nullability: $nullability";
+}
+
+String _debugLibraryName(Library node) {
+ return node == null ? 'null' : node.name ?? 'library ${node.importUri}';
+}
+
+String _debugQualifiedClassName(Class node) {
+ return _debugLibraryName(node.enclosingLibrary) +
+ '::' +
+ _debugClassName(node);
+}
+
+String _debugClassName(Class node) {
+ return node == null
+ ? 'null'
+ : node.name ?? 'null-named class ${node.runtimeType} ${node.hashCode}';
+}
+
+String _debugQualifiedMemberName(Member node) {
+ if (node.enclosingClass != null) {
+ return _debugQualifiedClassName(node.enclosingClass) +
+ '::' +
+ _debugMemberName(node);
+ } else {
+ return _debugLibraryName(node.enclosingLibrary) +
+ '::' +
+ _debugMemberName(node);
+ }
+}
+
+String _debugMemberName(Member node) {
+ return node.name?.name ??
+ "null-named member ${node.runtimeType} ${node.hashCode}";
+}
+
+String _debugVariableDeclarationName(VariableDeclaration node) {
+ return node.name ??
+ "null-named VariableDeclaration ${node.runtimeType} ${node.hashCode}";
+}
+
+String _debugQualifiedTypeParameterName(TypeParameter node) {
+ if (node.parent is Class) {
+ return _debugQualifiedClassName(node.parent) +
+ '::' +
+ _debugTypeParameterName(node);
+ }
+ if (node.parent is Member) {
+ return _debugQualifiedMemberName(node.parent) +
+ '::' +
+ _debugTypeParameterName(node);
+ }
+ return _debugTypeParameterName(node);
+}
+
+String _debugTypeParameterName(TypeParameter node) {
+ return node.name ??
+ "null-named TypeParameter ${node.runtimeType} ${node.hashCode}";
+}
+
/// Any type of node in the IR.
abstract class Node {
const Node();
@@ -91,22 +162,21 @@
/// Returns the textual representation of this node for use in debugging.
///
- /// [toString] should only be used for debugging and short-running test tools
- /// as it can cause serious memory leaks.
+ /// [toString] should only be used for debugging, but should not leak.
///
- /// Synthetic names are cached globally to retain consistency across different
- /// [toString] calls (hence the memory leak).
- ///
- /// Nodes that are named, such as [Class] and [Member], return their
- /// (possibly synthesized) name, whereas other AST nodes return the complete
- /// textual representation of their subtree.
- String toString() => debugNodeToString(this);
+ /// The data is generally bare-bones, but can easily be updated for your
+ /// specific debugging needs.
+ String toString();
/// Returns the textual representation of this node for use in debugging.
///
/// Note that this adds some nodes to a static map to ensure consistent
- /// naming, but that it thus also leaks memory.
- String leakingDebugToString() => debugNodeToString(this);
+ /// naming, but that it thus also leaks memory. [leakingDebugToString] should
+ /// thus only be used for debugging and short-running test tools.
+ ///
+ /// Synthetic names are cached globally to retain consistency across different
+ /// [leakingDebugToString] calls (hence the memory leak).
+ String leakingDebugToString() => astToText.debugNodeToString(this);
}
/// A mutable AST node with a parent pointer.
@@ -615,7 +685,7 @@
/// Returns a possibly synthesized name for this library, consistent with
/// the names across all [toString] calls.
- String toString() => debugLibraryName(this);
+ String toString() => _debugLibraryName(this);
Location _getLocationInEnclosingFile(int offset) {
return _getLocationInComponent(enclosingComponent, fileUri, offset);
@@ -698,6 +768,11 @@
transformList(annotations, v, this);
transformList(combinators, v, this);
}
+
+ @override
+ String toString() {
+ return "LibraryDependency()";
+ }
}
/// A part declaration in a library.
@@ -726,6 +801,11 @@
transformChildren(Transformer v) {
transformList(annotations, v, this);
}
+
+ @override
+ String toString() {
+ return "LibraryPart()";
+ }
}
/// A `show` or `hide` clause for an import or export.
@@ -750,6 +830,11 @@
@override
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "Combinator()";
+ }
}
/// Declaration of a type alias.
@@ -817,6 +902,11 @@
Location _getLocationInEnclosingFile(int offset) {
return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
+
+ @override
+ String toString() {
+ return "Typedef()";
+ }
}
/// The degree to which the contents of a class have been loaded into memory.
@@ -1328,7 +1418,7 @@
/// Returns a possibly synthesized name for this class, consistent with
/// the names used across all [toString] calls.
- String toString() => debugQualifiedClassName(this);
+ String toString() => _debugQualifiedClassName(this);
visitChildren(Visitor v) {
visitList(annotations, v);
@@ -1426,6 +1516,11 @@
onType = v.visitDartType(onType);
}
}
+
+ @override
+ String toString() {
+ return "Extension()";
+ }
}
enum ExtensionMemberKind {
@@ -1586,7 +1681,7 @@
/// Returns a possibly synthesized name for this member, consistent with
/// the names used across all [toString] calls.
- String toString() => debugQualifiedMemberName(this);
+ String toString() => _debugQualifiedMemberName(this);
void addAnnotation(Expression node) {
if (annotations.isEmpty) {
@@ -2362,6 +2457,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "InvalidInitializer()";
+ }
}
/// A field assignment `field = value` occurring in the initializer list of
@@ -2403,6 +2503,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "FieldInitializer()";
+ }
}
/// A super call `super(x,y)` occurring in the initializer list of a
@@ -2445,6 +2550,11 @@
arguments?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "SuperInitializer()";
+ }
}
/// A redirecting call `this(x,y)` occurring in the initializer list of
@@ -2483,6 +2593,11 @@
arguments?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "RedirectingInitializer()";
+ }
}
/// Binding of a temporary variable in the initializer list of a constructor.
@@ -2508,6 +2623,11 @@
variable?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "LocalInitializer()";
+ }
}
class AssertInitializer extends Initializer {
@@ -2527,6 +2647,11 @@
statement = statement.accept<TreeNode>(v);
statement.parent = this;
}
+
+ @override
+ String toString() {
+ return "AssertInitializer()";
+ }
}
// ------------------------------------------------------------------------
@@ -2676,6 +2801,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "FunctionNode()";
+ }
}
enum AsyncMarker {
@@ -2802,6 +2932,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "InvalidExpression()";
+ }
}
/// Read a local variable, a local function, or a function parameter.
@@ -2828,6 +2963,11 @@
promotedType = v.visitDartType(promotedType);
}
}
+
+ @override
+ String toString() {
+ return "VariableGet()";
+ }
}
/// Assign a local variable or function parameter.
@@ -2858,6 +2998,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "VariableSet()";
+ }
}
/// Expression of form `x.field`.
@@ -2918,6 +3063,11 @@
receiver?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "PropertyGet($receiver.$name)";
+ }
}
/// Expression of form `x.field = value`.
@@ -2973,6 +3123,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "PropertySet()";
+ }
}
/// Directly read a field, call a getter, or tear off a method.
@@ -3015,6 +3170,11 @@
return Substitution.fromInterfaceType(receiverType)
.substituteType(target.getterType);
}
+
+ @override
+ String toString() {
+ return "DirectPropertyGet()";
+ }
}
/// Directly assign a field, or call a setter.
@@ -3063,6 +3223,11 @@
DartType getStaticType(StaticTypeContext context) =>
value.getStaticType(context);
+
+ @override
+ String toString() {
+ return "DirectPropertySet()";
+ }
}
/// Directly call an instance method, bypassing ordinary dispatch.
@@ -3124,6 +3289,11 @@
target.function.typeParameters, arguments.types)
.substituteType(returnType);
}
+
+ @override
+ String toString() {
+ return "DirectMethodInvocation()";
+ }
}
/// Expression of form `super.field`.
@@ -3172,6 +3342,11 @@
}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "SuperPropertyGet()";
+ }
}
/// Expression of form `super.field = value`.
@@ -3218,6 +3393,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "SuperPropertySet()";
+ }
}
/// Read a static field, call a static getter, or tear off a static method.
@@ -3246,6 +3426,11 @@
}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "StaticGet()";
+ }
}
/// Assign a static field or call a static setter.
@@ -3287,6 +3472,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "StaticSet()";
+ }
}
/// The arguments to a function call, divided into type arguments,
@@ -3334,6 +3524,11 @@
transformList(positional, v, this);
transformList(named, v, this);
}
+
+ @override
+ String toString() {
+ return "Arguments()";
+ }
}
/// A named argument, `name: value`.
@@ -3357,6 +3552,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "NamedExpression()";
+ }
}
/// Common super class for [DirectMethodInvocation], [MethodInvocation],
@@ -3486,6 +3686,11 @@
arguments?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "MethodInvocation()";
+ }
}
/// Expression of form `super.foo(x)`.
@@ -3541,6 +3746,11 @@
arguments?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "SuperMethodInvocation()";
+ }
}
/// Expression of form `foo(x)`, or `const foo(x)` if the target is an
@@ -3592,6 +3802,11 @@
arguments?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "StaticInvocation($targetReference, $arguments)";
+ }
}
/// Expression of form `new Foo(x)` or `const Foo(x)`.
@@ -3659,6 +3874,11 @@
: new InterfaceType(
enclosingClass, Nullability.legacy, arguments.types);
}
+
+ @override
+ String toString() {
+ return "ConstructorInvocation()";
+ }
}
/// An explicit type instantiation of a generic function.
@@ -3692,6 +3912,11 @@
}
transformTypeList(typeArguments, v);
}
+
+ @override
+ String toString() {
+ return "Instantiation()";
+ }
}
/// Expression of form `!x`.
@@ -3721,6 +3946,11 @@
operand?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "Not()";
+ }
}
/// Expression of form `x && y` or `x || y`
@@ -3756,6 +3986,11 @@
right?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "LogicalExpression()";
+ }
}
/// Expression of form `x ? y : z`.
@@ -3804,6 +4039,11 @@
staticType = v.visitDartType(staticType);
}
}
+
+ @override
+ String toString() {
+ return "ConditionalExpression($condition ? $then : $otherwise)";
+ }
}
/// Convert expressions to strings and concatenate them. Semantically, calls
@@ -3834,6 +4074,11 @@
transformChildren(Transformer v) {
transformList(expressions, v, this);
}
+
+ @override
+ String toString() {
+ return "StringConcatenation()";
+ }
}
/// Concatenate lists into a single list.
@@ -3868,6 +4113,11 @@
typeArgument = v.visitDartType(typeArgument);
transformList(lists, v, this);
}
+
+ @override
+ String toString() {
+ return "ListConcatenation()";
+ }
}
/// Concatenate sets into a single set.
@@ -3905,6 +4155,11 @@
typeArgument = v.visitDartType(typeArgument);
transformList(sets, v, this);
}
+
+ @override
+ String toString() {
+ return "SetConcatenation()";
+ }
}
/// Concatenate maps into a single map.
@@ -3948,6 +4203,11 @@
valueType = v.visitDartType(valueType);
transformList(maps, v, this);
}
+
+ @override
+ String toString() {
+ return "MapConcatenation()";
+ }
}
/// Create an instance directly from the field values.
@@ -4007,6 +4267,11 @@
transformList(asserts, v, this);
transformList(unusedArguments, v, this);
}
+
+ @override
+ String toString() {
+ return "InstanceCreation()";
+ }
}
/// A marker indicating that a subexpression originates in a different source
@@ -4044,6 +4309,11 @@
Location _getLocationInEnclosingFile(int offset) {
return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
+
+ @override
+ String toString() {
+ return "FileUriExpression()";
+ }
}
/// Expression of form `x is T`.
@@ -4091,6 +4361,11 @@
}
type = v.visitDartType(type);
}
+
+ @override
+ String toString() {
+ return "IsExpression()";
+ }
}
/// Expression of form `x as T`.
@@ -4183,6 +4458,11 @@
}
type = v.visitDartType(type);
}
+
+ @override
+ String toString() {
+ return "AsExpression($operand as $type)";
+ }
}
/// Null check expression of form `x!`.
@@ -4217,6 +4497,11 @@
operand?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "NullCheck()";
+ }
}
/// An integer, double, boolean, string, or null constant.
@@ -4238,6 +4523,11 @@
R accept<R>(ExpressionVisitor<R> v) => v.visitStringLiteral(this);
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitStringLiteral(this, arg);
+
+ @override
+ String toString() {
+ return "StringLiteral($value)";
+ }
}
class IntLiteral extends BasicLiteral {
@@ -4255,6 +4545,11 @@
R accept<R>(ExpressionVisitor<R> v) => v.visitIntLiteral(this);
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitIntLiteral(this, arg);
+
+ @override
+ String toString() {
+ return "IntLiteral($value)";
+ }
}
class DoubleLiteral extends BasicLiteral {
@@ -4268,6 +4563,11 @@
R accept<R>(ExpressionVisitor<R> v) => v.visitDoubleLiteral(this);
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitDoubleLiteral(this, arg);
+
+ @override
+ String toString() {
+ return "DoubleLiteral($value)";
+ }
}
class BoolLiteral extends BasicLiteral {
@@ -4281,6 +4581,11 @@
R accept<R>(ExpressionVisitor<R> v) => v.visitBoolLiteral(this);
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitBoolLiteral(this, arg);
+
+ @override
+ String toString() {
+ return "BoolLiteral($value)";
+ }
}
class NullLiteral extends BasicLiteral {
@@ -4292,6 +4597,11 @@
R accept<R>(ExpressionVisitor<R> v) => v.visitNullLiteral(this);
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitNullLiteral(this, arg);
+
+ @override
+ String toString() {
+ return "NullLiteral()";
+ }
}
class SymbolLiteral extends Expression {
@@ -4308,6 +4618,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "SymbolLiteral(#$value)";
+ }
}
class TypeLiteral extends Expression {
@@ -4329,6 +4644,11 @@
transformChildren(Transformer v) {
type = v.visitDartType(type);
}
+
+ @override
+ String toString() {
+ return "TypeLiteral($type)";
+ }
}
class ThisExpression extends Expression {
@@ -4340,6 +4660,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "ThisExpression()";
+ }
}
class Rethrow extends Expression {
@@ -4354,6 +4679,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "Rethrow()";
+ }
}
class Throw extends Expression {
@@ -4381,6 +4711,11 @@
expression?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "Throw()";
+ }
}
class ListLiteral extends Expression {
@@ -4411,6 +4746,11 @@
typeArgument = v.visitDartType(typeArgument);
transformList(expressions, v, this);
}
+
+ @override
+ String toString() {
+ return "ListLiteral()";
+ }
}
class SetLiteral extends Expression {
@@ -4441,6 +4781,11 @@
typeArgument = v.visitDartType(typeArgument);
transformList(expressions, v, this);
}
+
+ @override
+ String toString() {
+ return "SetLiteral()";
+ }
}
class MapLiteral extends Expression {
@@ -4478,6 +4823,11 @@
valueType = v.visitDartType(valueType);
transformList(entries, v, this);
}
+
+ @override
+ String toString() {
+ return "MapLiteral()";
+ }
}
class MapEntry extends TreeNode {
@@ -4506,6 +4856,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "MapEntry()";
+ }
}
/// Expression of form `await x`.
@@ -4534,6 +4889,11 @@
operand?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "AwaitExpression()";
+ }
}
/// Common super-interface for [FunctionExpression] and [FunctionDeclaration].
@@ -4569,6 +4929,11 @@
function?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "FunctionExpression()";
+ }
}
class ConstantExpression extends Expression {
@@ -4594,6 +4959,11 @@
constant = v.visitConstant(constant);
type = v.visitDartType(type);
}
+
+ @override
+ String toString() {
+ return "ConstantExpression()";
+ }
}
/// Synthetic expression of form `let v = x in y`
@@ -4627,6 +4997,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "Let()";
+ }
}
class BlockExpression extends Expression {
@@ -4660,6 +5035,11 @@
value?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "BlockExpression()";
+ }
}
/// Attempt to load the library referred to by a deferred import.
@@ -4691,6 +5071,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "LoadLibrary()";
+ }
}
/// Checks that the given deferred import has been marked as 'loaded'.
@@ -4710,6 +5095,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "CheckLibraryIsLoaded()";
+ }
}
// ------------------------------------------------------------------------
@@ -4742,6 +5132,11 @@
expression?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ExpressionStatement()";
+ }
}
class Block extends Statement {
@@ -4771,6 +5166,11 @@
statements.add(node);
node.parent = this;
}
+
+ @override
+ String toString() {
+ return "Block()";
+ }
}
/// A block that is only executed when asserts are enabled.
@@ -4806,6 +5206,11 @@
statements.add(node);
node.parent = this;
}
+
+ @override
+ String toString() {
+ return "AssertBlock()";
+ }
}
class EmptyStatement extends Statement {
@@ -4815,6 +5220,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "EmptyStatement()";
+ }
}
class AssertStatement extends Statement {
@@ -4856,6 +5266,11 @@
message?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "AssertStatement()";
+ }
}
/// A target of a [Break] statement.
@@ -4884,6 +5299,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "LabeledStatement()";
+ }
}
/// Breaks out of an enclosing [LabeledStatement].
@@ -4917,6 +5337,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "BreakStatement()";
+ }
}
class WhileStatement extends Statement {
@@ -4947,6 +5372,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "WhileStatement()";
+ }
}
class DoStatement extends Statement {
@@ -4977,6 +5407,11 @@
condition?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "DoStatement()";
+ }
}
class ForStatement extends Statement {
@@ -5015,6 +5450,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ForStatement()";
+ }
}
class ForInStatement extends Statement {
@@ -5060,6 +5500,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ForInStatement()";
+ }
}
/// Statement of form `switch (e) { case x: ... }`.
@@ -5091,6 +5536,11 @@
}
transformList(cases, v, this);
}
+
+ @override
+ String toString() {
+ return "SwitchStatement()";
+ }
}
/// A group of `case` clauses and/or a `default` clause.
@@ -5135,6 +5585,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "SwitchCase()";
+ }
}
/// Jump to a case in an enclosing switch.
@@ -5149,6 +5604,11 @@
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
+
+ @override
+ String toString() {
+ return "ContinueSwitchStatement()";
+ }
}
class IfStatement extends Statement {
@@ -5186,6 +5646,11 @@
otherwise?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "IfStatement()";
+ }
}
class ReturnStatement extends Statement {
@@ -5209,6 +5674,11 @@
expression?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "ReturnStatement()";
+ }
}
class TryCatch extends Statement {
@@ -5237,6 +5707,11 @@
}
transformList(catches, v, this);
}
+
+ @override
+ String toString() {
+ return "TryCatch()";
+ }
}
class Catch extends TreeNode {
@@ -5277,6 +5752,11 @@
body?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "Catch()";
+ }
}
class TryFinally extends Statement {
@@ -5307,6 +5787,11 @@
finalizer?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "TryFinally()";
+ }
}
/// Statement of form `yield x` or `yield* x`.
@@ -5351,6 +5836,11 @@
expression?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "YieldStatement()";
+ }
}
/// Declaration of a local variable.
@@ -5550,7 +6040,7 @@
/// Returns a possibly synthesized name for this variable, consistent with
/// the names used across all [toString] calls.
- String toString() => debugVariableDeclarationName(this);
+ String toString() => _debugVariableDeclarationName(this);
}
/// Declaration a local function.
@@ -5584,6 +6074,11 @@
function?.parent = this;
}
}
+
+ @override
+ String toString() {
+ return "FunctionDeclaration()";
+ }
}
// ------------------------------------------------------------------------
@@ -5637,7 +6132,7 @@
///
/// Note that this adds some nodes to a static map to ensure consistent
/// naming, but that it thus also leaks memory.
- String leakingDebugToString() => debugNodeToString(this);
+ String leakingDebugToString() => astToText.debugNodeToString(this);
}
class _PrivateName extends Name {
@@ -5800,6 +6295,11 @@
@override
InvalidType withNullability(Nullability nullability) => this;
+
+ @override
+ String toString() {
+ return "invalid-type";
+ }
}
class DynamicType extends DartType {
@@ -5829,6 +6329,11 @@
@override
DynamicType withNullability(Nullability nullability) => this;
+
+ @override
+ String toString() {
+ return "dynamic";
+ }
}
class VoidType extends DartType {
@@ -5858,6 +6363,11 @@
@override
VoidType withNullability(Nullability nullability) => this;
+
+ @override
+ String toString() {
+ return "void";
+ }
}
class NeverType extends DartType {
@@ -5892,6 +6402,11 @@
NeverType withNullability(Nullability nullability) {
return this.nullability == nullability ? this : new NeverType(nullability);
}
+
+ @override
+ String toString() {
+ return "NeverType()";
+ }
}
class BottomType extends DartType {
@@ -5921,6 +6436,11 @@
@override
BottomType withNullability(Nullability nullability) => this;
+
+ @override
+ String toString() {
+ return "<BottomType>";
+ }
}
class InterfaceType extends DartType {
@@ -6005,6 +6525,11 @@
? this
: new InterfaceType.byReference(className, nullability, typeArguments);
}
+
+ @override
+ String toString() {
+ return "InterfaceType($className${_debugNullability(nullability)})";
+ }
}
/// A possibly generic function type.
@@ -6175,6 +6700,11 @@
if (typeParameters.isEmpty) return result;
return getFreshTypeParameters(typeParameters).applyToFunctionType(result);
}
+
+ @override
+ String toString() {
+ return "FunctionType()";
+ }
}
/// A use of a [Typedef] as a type.
@@ -6263,6 +6793,11 @@
: new TypedefType.byReference(
typedefReference, nullability, typeArguments);
}
+
+ @override
+ String toString() {
+ return "TypedefType()";
+ }
}
/// A named parameter in [FunctionType].
@@ -6301,6 +6836,11 @@
void visitChildren(Visitor v) {
type.accept(v);
}
+
+ @override
+ String toString() {
+ return "NamedType()";
+ }
}
/// Reference to a type variable.
@@ -6571,6 +7111,11 @@
return Nullability.legacy;
}
+
+ @override
+ String toString() {
+ return "TypeParameterType()";
+ }
}
/// Value set for variance of a type parameter X in a type term T.
@@ -6772,7 +7317,7 @@
/// Returns a possibly synthesized name for this type parameter, consistent
/// with the names used across all [toString] calls.
- String toString() => debugQualifiedTypeParameterName(this);
+ String toString() => _debugQualifiedTypeParameterName(this);
bool get isFunctionTypeTypeParameter => parent == null;
}
@@ -6820,6 +7365,11 @@
}
return hash;
}
+
+ @override
+ String toString() {
+ return "Supertype()";
+ }
}
// ------------------------------------------------------------------------
@@ -7256,6 +7806,11 @@
@override
Expression asExpression() => expression;
+
+ @override
+ String toString() {
+ return "UnevaluatedConstant()";
+ }
}
// ------------------------------------------------------------------------
@@ -7394,6 +7949,11 @@
void addMetadataRepository(MetadataRepository repository) {
metadata[repository.tag] = repository;
}
+
+ @override
+ String toString() {
+ return "Component()";
+ }
}
/// A tuple with file, line, and column number, for displaying human-readable
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index da3e50b..9d460d4 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -1284,11 +1284,9 @@
// Copy over the super type entries.
subInfo.genericSuperType ??= <Class, Supertype>{};
subInfo.genericSuperTypes ??= <Class, List<Supertype>>{};
- superInfo.genericSuperTypes?.forEach((Class key, List<Supertype> types) {
- for (Supertype type in types) {
- subInfo.recordGenericSuperType(
- coreTypes, key, type, _onAmbiguousSupertypes);
- }
+ superInfo.genericSuperType?.forEach((Class key, Supertype type) {
+ subInfo.recordGenericSuperType(
+ coreTypes, key, type, _onAmbiguousSupertypes);
});
} else {
// Copy over all transitive generic super types, and substitute the
@@ -1298,11 +1296,9 @@
superclass.typeParameters, supertype.typeArguments);
subInfo.genericSuperType ??= <Class, Supertype>{};
subInfo.genericSuperTypes ??= <Class, List<Supertype>>{};
- superInfo.genericSuperTypes?.forEach((Class key, List<Supertype> types) {
- for (Supertype type in types) {
- subInfo.recordGenericSuperType(coreTypes, key,
- substitution.substituteSupertype(type), _onAmbiguousSupertypes);
- }
+ superInfo.genericSuperType?.forEach((Class key, Supertype type) {
+ subInfo.recordGenericSuperType(coreTypes, key,
+ substitution.substituteSupertype(type), _onAmbiguousSupertypes);
});
subInfo.recordGenericSuperType(
diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart
index 20ee3b5..e18a1125 100644
--- a/pkg/kernel/lib/naive_type_checker.dart
+++ b/pkg/kernel/lib/naive_type_checker.dart
@@ -251,6 +251,12 @@
if (receiver is DynamicType) {
return;
}
+ if (receiver is InvalidType) {
+ return;
+ }
+ if (receiver is BottomType) {
+ return;
+ }
if (receiver is NeverType &&
receiver.nullability == Nullability.nonNullable) {
return;
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 03e68b4..c1ea1f8 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -11,8 +11,10 @@
FunctionType,
InterfaceType,
InvalidType,
+ Library,
NamedType,
NeverType,
+ Nullability,
TypeParameter,
TypeParameterType,
Typedef,
@@ -113,7 +115,8 @@
}
}
-DartType instantiateToBounds(DartType type, Class objectClass) {
+DartType instantiateToBounds(
+ DartType type, Class objectClass, Library contextLibrary) {
if (type is InterfaceType) {
if (type.typeArguments.isEmpty) return type;
for (DartType typeArgument in type.typeArguments) {
@@ -124,8 +127,11 @@
return type;
}
}
- return new InterfaceType.byReference(type.className, type.nullability,
- calculateBounds(type.classNode.typeParameters, objectClass));
+ return new InterfaceType.byReference(
+ type.className,
+ type.nullability,
+ calculateBounds(
+ type.classNode.typeParameters, objectClass, contextLibrary));
}
if (type is TypedefType) {
if (type.typeArguments.isEmpty) return type;
@@ -134,8 +140,11 @@
return type;
}
}
- return new TypedefType.byReference(type.typedefReference, type.nullability,
- calculateBounds(type.typedefNode.typeParameters, objectClass));
+ return new TypedefType.byReference(
+ type.typedefReference,
+ type.nullability,
+ calculateBounds(
+ type.typedefNode.typeParameters, objectClass, contextLibrary));
}
return type;
}
@@ -146,8 +155,8 @@
/// See the [description]
/// (https://github.com/dart-lang/sdk/blob/master/docs/language/informal/instantiate-to-bound.md)
/// of the algorithm for details.
-List<DartType> calculateBounds(
- List<TypeParameter> typeParameters, Class objectClass) {
+List<DartType> calculateBounds(List<TypeParameter> typeParameters,
+ Class objectClass, Library contextLibrary) {
List<DartType> bounds = new List<DartType>(typeParameters.length);
for (int i = 0; i < typeParameters.length; i++) {
DartType bound = typeParameters[i].bound;
@@ -165,12 +174,16 @@
TypeVariableGraph graph = new TypeVariableGraph(typeParameters, bounds);
List<List<int>> stronglyConnected = computeStrongComponents(graph);
+ final DartType topType = const DynamicType();
+ final DartType bottomType = contextLibrary.isNonNullableByDefault
+ ? const NeverType(Nullability.nonNullable)
+ : const BottomType();
for (List<int> component in stronglyConnected) {
Map<TypeParameter, DartType> upperBounds = <TypeParameter, DartType>{};
Map<TypeParameter, DartType> lowerBounds = <TypeParameter, DartType>{};
for (int typeParameterIndex in component) {
- upperBounds[typeParameters[typeParameterIndex]] = const DynamicType();
- lowerBounds[typeParameters[typeParameterIndex]] = const BottomType();
+ upperBounds[typeParameters[typeParameterIndex]] = topType;
+ lowerBounds[typeParameters[typeParameterIndex]] = bottomType;
}
Substitution substitution =
Substitution.fromUpperAndLowerBounds(upperBounds, lowerBounds);
@@ -184,7 +197,7 @@
Map<TypeParameter, DartType> upperBounds = <TypeParameter, DartType>{};
Map<TypeParameter, DartType> lowerBounds = <TypeParameter, DartType>{};
upperBounds[typeParameters[i]] = bounds[i];
- lowerBounds[typeParameters[i]] = const BottomType();
+ lowerBounds[typeParameters[i]] = bottomType;
Substitution substitution =
Substitution.fromUpperAndLowerBounds(upperBounds, lowerBounds);
for (int j = 0; j < typeParameters.length; j++) {
@@ -227,13 +240,30 @@
typeParameter == other.typeParameter &&
enclosingType == other.enclosingType;
}
+
+ String toString() {
+ return "TypeArgumentIssue(index=${index}, argument=${argument}, "
+ "typeParameter=${typeParameter}, enclosingType=${enclosingType}";
+ }
}
+// Finds type arguments that don't follow the rules of well-boundness.
+//
+// [bottomType] should be either Null or Never, depending on what should be
+// taken for the bottom type at the call site. The bottom type is used in the
+// checks for super-boundness for construction of the auxiliary type. For
+// details see Dart Language Specification, Section 14.3.2 The Instantiation to
+// Bound Algorithm.
// TODO(dmitryas): Remove [typedefInstantiations] when type arguments passed to
// typedefs are preserved in the Kernel output.
-List<TypeArgumentIssue> findTypeArgumentIssues(DartType type,
- TypeEnvironment typeEnvironment, SubtypeCheckMode subtypeCheckMode,
+List<TypeArgumentIssue> findTypeArgumentIssues(
+ DartType type,
+ TypeEnvironment typeEnvironment,
+ SubtypeCheckMode subtypeCheckMode,
+ DartType bottomType,
{bool allowSuperBounded = false}) {
+ assert(bottomType == const NeverType(Nullability.nonNullable) ||
+ bottomType == typeEnvironment.nullType);
List<TypeParameter> variables;
List<DartType> arguments;
List<TypeArgumentIssue> typedefRhsResult;
@@ -251,7 +281,7 @@
requiredParameterCount: functionType.requiredParameterCount,
typedefType: null);
typedefRhsResult = findTypeArgumentIssues(
- cloned, typeEnvironment, subtypeCheckMode,
+ cloned, typeEnvironment, subtypeCheckMode, bottomType,
allowSuperBounded: true);
type = functionType.typedefType;
}
@@ -266,24 +296,24 @@
List<TypeArgumentIssue> result = <TypeArgumentIssue>[];
for (TypeParameter parameter in type.typeParameters) {
result.addAll(findTypeArgumentIssues(
- parameter.bound, typeEnvironment, subtypeCheckMode,
+ parameter.bound, typeEnvironment, subtypeCheckMode, bottomType,
allowSuperBounded: true) ??
const <TypeArgumentIssue>[]);
}
for (DartType formal in type.positionalParameters) {
result.addAll(findTypeArgumentIssues(
- formal, typeEnvironment, subtypeCheckMode,
+ formal, typeEnvironment, subtypeCheckMode, bottomType,
allowSuperBounded: true) ??
const <TypeArgumentIssue>[]);
}
for (NamedType named in type.namedParameters) {
result.addAll(findTypeArgumentIssues(
- named.type, typeEnvironment, subtypeCheckMode,
+ named.type, typeEnvironment, subtypeCheckMode, bottomType,
allowSuperBounded: true) ??
const <TypeArgumentIssue>[]);
}
result.addAll(findTypeArgumentIssues(
- type.returnType, typeEnvironment, subtypeCheckMode,
+ type.returnType, typeEnvironment, subtypeCheckMode, bottomType,
allowSuperBounded: true) ??
const <TypeArgumentIssue>[]);
return result.isEmpty ? null : result;
@@ -316,7 +346,7 @@
}
List<TypeArgumentIssue> issues = findTypeArgumentIssues(
- argument, typeEnvironment, subtypeCheckMode,
+ argument, typeEnvironment, subtypeCheckMode, bottomType,
allowSuperBounded: true);
if (issues != null) {
argumentsResult ??= <TypeArgumentIssue>[];
@@ -337,7 +367,7 @@
if (!allowSuperBounded) return result;
result = null;
- type = convertSuperBoundedToRegularBounded(typeEnvironment, type);
+ type = convertSuperBoundedToRegularBounded(typeEnvironment, type, bottomType);
List<DartType> argumentsToReport = arguments.toList();
if (type is InterfaceType) {
variables = type.classNode.typeParameters;
@@ -373,6 +403,13 @@
return result;
}
+// Finds type arguments that don't follow the rules of well-boundness.
+//
+// [bottomType] should be either Null or Never, depending on what should be
+// taken for the bottom type at the call site. The bottom type is used in the
+// checks for super-boundness for construction of the auxiliary type. For
+// details see Dart Language Specification, Section 14.3.2 The Instantiation to
+// Bound Algorithm.
// TODO(dmitryas): Remove [typedefInstantiations] when type arguments passed to
// typedefs are preserved in the Kernel output.
List<TypeArgumentIssue> findTypeArgumentIssuesForInvocation(
@@ -380,8 +417,11 @@
List<DartType> arguments,
TypeEnvironment typeEnvironment,
SubtypeCheckMode subtypeCheckMode,
+ DartType bottomType,
{Map<FunctionType, List<DartType>> typedefInstantiations}) {
assert(arguments.length == parameters.length);
+ assert(bottomType == const NeverType(Nullability.nonNullable) ||
+ bottomType == typeEnvironment.nullType);
List<TypeArgumentIssue> result;
var substitutionMap = <TypeParameter, DartType>{};
for (int i = 0; i < arguments.length; ++i) {
@@ -403,7 +443,7 @@
}
List<TypeArgumentIssue> issues = findTypeArgumentIssues(
- argument, typeEnvironment, subtypeCheckMode,
+ argument, typeEnvironment, subtypeCheckMode, bottomType,
allowSuperBounded: true);
if (issues != null) {
result ??= <TypeArgumentIssue>[];
@@ -426,22 +466,21 @@
/// [BottomType] and all contravariant occurrences of `Null` and [BottomType]
/// with `Object`.
DartType convertSuperBoundedToRegularBounded(
- TypeEnvironment typeEnvironment, DartType type,
+ TypeEnvironment typeEnvironment, DartType type, DartType bottomType,
{bool isCovariant = true}) {
if ((type is DynamicType ||
type is VoidType ||
isObject(typeEnvironment, type)) &&
isCovariant) {
- return const BottomType();
- } else if ((type is BottomType || isNull(typeEnvironment, type)) &&
- !isCovariant) {
+ return bottomType;
+ } else if ((type == bottomType || type is BottomType) && !isCovariant) {
return typeEnvironment.coreTypes.objectLegacyRawType;
} else if (type is InterfaceType && type.classNode.typeParameters != null) {
List<DartType> replacedTypeArguments =
new List<DartType>(type.typeArguments.length);
for (int i = 0; i < replacedTypeArguments.length; i++) {
replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
- typeEnvironment, type.typeArguments[i],
+ typeEnvironment, type.typeArguments[i], bottomType,
isCovariant: isCovariant);
}
return new InterfaceType(
@@ -451,20 +490,20 @@
new List<DartType>(type.typeArguments.length);
for (int i = 0; i < replacedTypeArguments.length; i++) {
replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
- typeEnvironment, type.typeArguments[i],
+ typeEnvironment, type.typeArguments[i], bottomType,
isCovariant: isCovariant);
}
return new TypedefType(
type.typedefNode, type.nullability, replacedTypeArguments);
} else if (type is FunctionType) {
var replacedReturnType = convertSuperBoundedToRegularBounded(
- typeEnvironment, type.returnType,
+ typeEnvironment, type.returnType, bottomType,
isCovariant: isCovariant);
var replacedPositionalParameters =
new List<DartType>(type.positionalParameters.length);
for (int i = 0; i < replacedPositionalParameters.length; i++) {
replacedPositionalParameters[i] = convertSuperBoundedToRegularBounded(
- typeEnvironment, type.positionalParameters[i],
+ typeEnvironment, type.positionalParameters[i], bottomType,
isCovariant: !isCovariant);
}
var replacedNamedParameters =
@@ -473,7 +512,7 @@
replacedNamedParameters[i] = new NamedType(
type.namedParameters[i].name,
convertSuperBoundedToRegularBounded(
- typeEnvironment, type.namedParameters[i].type,
+ typeEnvironment, type.namedParameters[i].type, bottomType,
isCovariant: !isCovariant));
}
return new FunctionType(
@@ -491,11 +530,6 @@
type.classNode == typeEnvironment.coreTypes.objectClass;
}
-bool isNull(TypeEnvironment typeEnvironment, DartType type) {
- return type is InterfaceType &&
- type.classNode == typeEnvironment.nullType.classNode;
-}
-
int computeVariance(TypeParameter typeParameter, DartType type,
{Map<TypeParameter, Map<DartType, int>> computedVariances}) {
computedVariances ??= new Map<TypeParameter, Map<DartType, int>>.identity();
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index 0f066b2..43b38d5 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -437,7 +437,8 @@
..defaultType = type;
}
}
- List<DartType> defaultTypes = calculateBounds(typeParameters, objectClass);
+ List<DartType> defaultTypes = calculateBounds(typeParameters, objectClass,
+ new Library(new Uri.file("test.lib"))..isNonNullableByDefault = true);
for (int i = 0; i < typeParameters.length; i++) {
typeParameters[i].defaultType = defaultTypes[i];
}
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 72fb6e7..e3e2566 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -2294,6 +2294,16 @@
endLine(')');
}
+ visitTypeLiteralConstant(TypeLiteralConstant node) {
+ writeIndentation();
+ writeConstantReference(node);
+ writeSpaced('=');
+ writeWord('${node.runtimeType}');
+ writeSymbol('(');
+ writeNode(node.type);
+ endLine(')');
+ }
+
visitInstanceConstant(InstanceConstant node) {
writeIndentation();
writeConstantReference(node);
diff --git a/pkg/kernel/test/metadata_test.dart b/pkg/kernel/test/metadata_test.dart
index 87ed4e9..a6d285a 100644
--- a/pkg/kernel/test/metadata_test.dart
+++ b/pkg/kernel/test/metadata_test.dart
@@ -25,8 +25,8 @@
Member get member => _memberRef?.asMember;
Metadata.forNode(TreeNode n)
- : this(n.toString(), getMemberReference(getMemberForMetadata(n)),
- getTypeForMetadata(n));
+ : this(n.leakingDebugToString(),
+ getMemberReference(getMemberForMetadata(n)), getTypeForMetadata(n));
Metadata(this.string, this._memberRef, this.type);
}
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index c69b044..a128818 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -7,10 +7,6 @@
import 'package:kernel/verifier.dart';
import 'package:test/test.dart';
-const String varRegexp = "#t[0-9]+";
-
-const String tvarRegexp = "#T[0-9]+";
-
/// Checks that the verifier correctly find errors in invalid components.
///
/// The frontend should never generate invalid components, so we have to test
@@ -19,496 +15,653 @@
/// We mostly test negative cases here, as we get plenty of positive cases by
/// compiling the Dart test suite with the verifier enabled.
main() {
- positiveTest('Test harness has no errors', (TestHarness test) {
- test.addNode(NullLiteral());
- });
- negativeTest('VariableGet out of scope',
- matches("Variable '$varRegexp' used out of scope\\."),
- (TestHarness test) {
- test.addNode(VariableGet(test.makeVariable()));
- });
- negativeTest('VariableSet out of scope',
- matches("Variable '$varRegexp' used out of scope\\."),
- (TestHarness test) {
- test.addNode(VariableSet(test.makeVariable(), new NullLiteral()));
- });
- negativeTest('Variable block scope',
- matches("Variable '$varRegexp' used out of scope\\."),
- (TestHarness test) {
- VariableDeclaration variable = test.makeVariable();
- test.addNode(Block([
- new Block([variable]),
- new ReturnStatement(new VariableGet(variable))
- ]));
- });
- negativeTest('Variable let scope',
- matches("Variable '$varRegexp' used out of scope\\."),
- (TestHarness test) {
- VariableDeclaration variable = test.makeVariable();
- test.addNode(LogicalExpression(new Let(variable, new VariableGet(variable)),
- '&&', new VariableGet(variable)));
- });
- negativeTest('Variable redeclared',
- matches("Variable '$varRegexp' declared more than once\\."),
- (TestHarness test) {
- VariableDeclaration variable = test.makeVariable();
- test.addNode(Block([variable, variable]));
- });
- negativeTest('Member redeclared',
- "Member 'test_lib::Test::field' has been declared more than once.",
- (TestHarness test) {
- Field field = new Field(new Name('field'), initializer: new NullLiteral());
- test.addNode(Class(
- name: 'Test',
- supertype: test.objectClass.asRawSupertype,
- fields: [field, field]));
- });
- negativeTest('Class redeclared',
- "Class 'test_lib::OtherClass' declared more than once.",
- (TestHarness test) {
- test.addNode(
- test.otherClass); // Test harness also adds otherClass to component.
- });
- negativeTest('Class type parameter redeclared',
- matches("Type parameter 'test_lib::Test::$tvarRegexp' redeclared\\."),
- (TestHarness test) {
- var parameter = test.makeTypeParameter();
- test.addNode(Class(
- name: 'Test',
- supertype: test.objectClass.asRawSupertype,
- typeParameters: [parameter, parameter]));
- });
- negativeTest('Member type parameter redeclared',
- matches("Type parameter '$tvarRegexp' redeclared\\."),
- (TestHarness test) {
- var parameter = test.makeTypeParameter();
- test.addNode(Procedure(
- new Name('bar'),
- ProcedureKind.Method,
- new FunctionNode(new ReturnStatement(new NullLiteral()),
- typeParameters: [parameter, parameter])));
- });
- negativeTest(
- 'Type parameter out of scope',
- matches("Type parameter '$tvarRegexp' referenced out of scope,"
- " parent is: 'null'\\."), (TestHarness test) {
- var parameter = test.makeTypeParameter();
- test.addNode(ListLiteral([],
- typeArgument: new TypeParameterType(parameter, Nullability.legacy)));
- });
- negativeTest(
- 'Class type parameter from another class',
- "Type parameter 'test_lib::OtherClass::OtherT' referenced out of scope,"
- " parent is: 'test_lib::OtherClass'.", (TestHarness test) {
- test.addNode(TypeLiteral(new TypeParameterType(
- test.otherClass.typeParameters[0], Nullability.legacy)));
- });
- negativeTest(
- 'Class type parameter in static method',
- "Type parameter 'test_lib::TestClass::T' referenced from static context,"
- " parent is: 'test_lib::TestClass'.", (TestHarness test) {
- test.addNode(Procedure(
- new Name('bar'),
- ProcedureKind.Method,
- new FunctionNode(new ReturnStatement(new TypeLiteral(
- new TypeParameterType(
- test.classTypeParameter, Nullability.legacy)))),
- isStatic: true));
- });
- negativeTest(
- 'Class type parameter in static field',
- "Type parameter 'test_lib::TestClass::T' referenced from static context,"
- " parent is: 'test_lib::TestClass'.", (TestHarness test) {
- test.addNode(Field(new Name('field'),
- initializer: new TypeLiteral(
- new TypeParameterType(test.classTypeParameter, Nullability.legacy)),
- isStatic: true));
- });
- negativeTest(
- 'Method type parameter out of scope',
- matches("Type parameter '$tvarRegexp' referenced out of scope,"
- " parent is: '<FunctionNode>'\\."), (TestHarness test) {
- var parameter = test.makeTypeParameter();
- test.addNode(Class(
- name: 'Test',
- supertype: test.objectClass.asRawSupertype,
- procedures: [
- new Procedure(
- new Name('generic'),
- ProcedureKind.Method,
- new FunctionNode(new EmptyStatement(),
- typeParameters: [parameter])),
- new Procedure(
- new Name('use'),
- ProcedureKind.Method,
- new FunctionNode(new ReturnStatement(new TypeLiteral(
- new TypeParameterType(parameter, Nullability.legacy)))))
- ]));
- });
- negativeTest(
- 'Interface type arity too low',
- "Type test_lib::OtherClass* provides 0 type arguments,"
- " but the class declares 1 parameters.", (TestHarness test) {
- test.addNode(TypeLiteral(
- new InterfaceType(test.otherClass, Nullability.legacy, [])));
- });
- negativeTest(
- 'Interface type arity too high',
- "Type test_lib::OtherClass<dynamic, dynamic>* provides 2 type arguments,"
- " but the class declares 1 parameters.", (TestHarness test) {
- test.addNode(TypeLiteral(new InterfaceType(test.otherClass,
- Nullability.legacy, [new DynamicType(), new DynamicType()])));
- });
- negativeTest(
- 'Dangling interface type',
- matches("Dangling reference to 'null::#class[0-9]+',"
- " parent is: 'null'\\."), (TestHarness test) {
- var orphan = new Class();
- test.addNode(TypeLiteral(new InterfaceType(orphan, Nullability.legacy)));
- });
- negativeTest('Dangling field get',
- "Dangling reference to 'null::foo', parent is: 'null'.",
- (TestHarness test) {
- var orphan = new Field(new Name('foo'));
- test.addNode(DirectPropertyGet(new NullLiteral(), orphan));
- });
- negativeTest(
- 'Missing block parent pointer',
- "Incorrect parent pointer on ReturnStatement:"
- " expected 'Block', but found: 'Null'.", (TestHarness test) {
- var block = new Block([]);
- block.statements.add(new ReturnStatement());
- test.addNode(block);
- });
- negativeTest(
- 'Missing function parent pointer',
- "Incorrect parent pointer on FunctionNode:"
- " expected 'Procedure', but found: 'Null'.", (TestHarness test) {
- var procedure = new Procedure(new Name('bar'), ProcedureKind.Method, null);
- procedure.function = new FunctionNode(new EmptyStatement());
- test.addNode(procedure);
- });
- negativeTest('StaticGet without target', "StaticGet without target.",
- (TestHarness test) {
- test.addNode(StaticGet(null));
- });
- negativeTest('StaticSet without target', "StaticSet without target.",
- (TestHarness test) {
- test.addNode(StaticSet(null, new NullLiteral()));
- });
- negativeTest(
- 'StaticInvocation without target', "StaticInvocation without target.",
- (TestHarness test) {
- test.addNode(StaticInvocation(null, new Arguments.empty()));
- });
- positiveTest('Correct StaticInvocation', (TestHarness test) {
- var method = new Procedure(
- new Name('foo'),
- ProcedureKind.Method,
- new FunctionNode(new EmptyStatement(),
- positionalParameters: [new VariableDeclaration('p')]),
- isStatic: true);
- test.enclosingClass.addMember(method);
- test.addNode(StaticInvocation(method, new Arguments([new NullLiteral()])));
- });
- negativeTest(
- 'StaticInvocation with too many parameters',
- "StaticInvocation with incompatible arguments for"
- " 'test_lib::TestClass::bar'.", (TestHarness test) {
- var method = new Procedure(new Name('bar'), ProcedureKind.Method,
- new FunctionNode(new EmptyStatement()),
- isStatic: true);
- test.enclosingClass.addMember(method);
- test.addNode(StaticInvocation(method, new Arguments([new NullLiteral()])));
- });
- negativeTest(
- 'StaticInvocation with too few parameters',
- "StaticInvocation with incompatible arguments for"
- " 'test_lib::TestClass::bar'.", (TestHarness test) {
- var method = new Procedure(
- new Name('bar'),
- ProcedureKind.Method,
- new FunctionNode(new EmptyStatement(),
- positionalParameters: [new VariableDeclaration('p')]),
- isStatic: true);
- test.enclosingClass.addMember(method);
- test.addNode(StaticInvocation(method, new Arguments.empty()));
- });
- negativeTest(
- 'StaticInvocation with unmatched named parameter',
- "StaticInvocation with incompatible arguments for"
- " 'test_lib::TestClass::bar'.", (TestHarness test) {
- var method = new Procedure(new Name('bar'), ProcedureKind.Method,
- new FunctionNode(new EmptyStatement()),
- isStatic: true);
- test.enclosingClass.addMember(method);
- test.addNode(StaticInvocation(
- method,
- new Arguments([],
- named: [new NamedExpression('p', new NullLiteral())])));
- });
- negativeTest(
- 'StaticInvocation with missing type argument',
- "StaticInvocation with wrong number of type arguments for"
- " 'test_lib::TestClass::bar'.", (TestHarness test) {
- var method = new Procedure(
- new Name('bar'),
- ProcedureKind.Method,
- new FunctionNode(new EmptyStatement(),
- typeParameters: [test.makeTypeParameter()]),
- isStatic: true);
- test.enclosingClass.addMember(method);
- test.addNode(StaticInvocation(method, new Arguments.empty()));
- });
- negativeTest(
- 'ConstructorInvocation with missing type argument',
- "ConstructorInvocation with wrong number of type arguments for"
- " 'test_lib::TestClass::foo'.", (TestHarness test) {
- var class_ = new Class(
- name: 'Test',
- typeParameters: [test.makeTypeParameter()],
- supertype: test.objectClass.asRawSupertype);
- test.enclosingLibrary.addClass(class_);
- var constructor = new Constructor(new FunctionNode(new EmptyStatement()),
- name: new Name('foo'));
- test.enclosingClass.addMember(constructor);
- test.addNode(ConstructorInvocation(constructor, new Arguments.empty()));
- });
- positiveTest('Valid typedef Foo = `(C) => void`', (TestHarness test) {
- var typedef_ = new Typedef(
- 'Foo',
- new FunctionType(
- [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
- test.addNode(typedef_);
- });
- positiveTest('Valid typedef Foo = C<dynamic>', (TestHarness test) {
- var typedef_ = new Typedef(
- 'Foo',
- new InterfaceType(
- test.otherClass, Nullability.legacy, [const DynamicType()]));
- test.addNode(typedef_);
- });
- positiveTest('Valid typedefs Foo = Bar, Bar = C', (TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
- foo.type = new TypedefType(bar, Nullability.legacy);
- bar.type = test.otherLegacyRawType;
- test.enclosingLibrary.addTypedef(foo);
- test.enclosingLibrary.addTypedef(bar);
- });
- positiveTest('Valid typedefs Foo = C<Bar>, Bar = C', (TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
- foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypedefType(bar, Nullability.legacy)]);
- bar.type = test.otherLegacyRawType;
- test.enclosingLibrary.addTypedef(foo);
- test.enclosingLibrary.addTypedef(bar);
- });
- positiveTest('Valid typedef type in field', (TestHarness test) {
- var typedef_ = new Typedef(
- 'Foo',
- new FunctionType(
- [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
- var field = new Field(new Name('field'),
- type: new TypedefType(typedef_, Nullability.legacy), isStatic: true);
- test.enclosingLibrary.addTypedef(typedef_);
- test.enclosingLibrary.addMember(field);
- });
- negativeTest(
- 'Invalid typedef Foo = Foo',
- "The typedef 'typedef Foo = test_lib::Foo;\n'"
- " refers to itself", (TestHarness test) {
- var typedef_ = new Typedef('Foo', null);
- typedef_.type = new TypedefType(typedef_, Nullability.legacy);
- test.addNode(typedef_);
- });
- negativeTest(
- 'Invalid typedef Foo = `(Foo) => void`',
- "The typedef 'typedef Foo = (test_lib::Foo) →* void;\n'"
- " refers to itself", (TestHarness test) {
- var typedef_ = new Typedef('Foo', null);
- typedef_.type = new FunctionType(
- [new TypedefType(typedef_, Nullability.legacy)],
- const VoidType(),
- Nullability.legacy);
- test.addNode(typedef_);
- });
- negativeTest(
- 'Invalid typedef Foo = `() => Foo`',
- "The typedef 'typedef Foo = () →* test_lib::Foo;\n'"
- " refers to itself", (TestHarness test) {
- var typedef_ = new Typedef('Foo', null);
- typedef_.type = new FunctionType(
- [], new TypedefType(typedef_, Nullability.legacy), Nullability.legacy);
- test.addNode(typedef_);
- });
- negativeTest(
- 'Invalid typedef Foo = C<Foo>',
- "The typedef 'typedef Foo = test_lib::OtherClass<test_lib::Foo>*;\n'"
- " refers to itself", (TestHarness test) {
- var typedef_ = new Typedef('Foo', null);
- typedef_.type = new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypedefType(typedef_, Nullability.legacy)]);
- test.addNode(typedef_);
- });
- negativeTest(
- 'Invalid typedefs Foo = Bar, Bar = Foo',
- "The typedef 'typedef Foo = test_lib::Bar;\n'"
- " refers to itself", (TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
- foo.type = new TypedefType(bar, Nullability.legacy);
- bar.type = new TypedefType(foo, Nullability.legacy);
- test.enclosingLibrary.addTypedef(foo);
- test.enclosingLibrary.addTypedef(bar);
- });
- negativeTest(
- 'Invalid typedefs Foo = Bar, Bar = C<Foo>',
- "The typedef 'typedef Foo = test_lib::Bar;\n'"
- " refers to itself", (TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
- foo.type = new TypedefType(bar, Nullability.legacy);
- bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypedefType(foo, Nullability.legacy)]);
- test.enclosingLibrary.addTypedef(foo);
- test.enclosingLibrary.addTypedef(bar);
- });
- negativeTest(
- 'Invalid typedefs Foo = C<Bar>, Bar = C<Foo>',
- "The typedef 'typedef Foo = test_lib::OtherClass<test_lib::Bar>*;\n'"
- " refers to itself", (TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
- foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypedefType(bar, Nullability.legacy)]);
- bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypedefType(foo, Nullability.legacy)]);
- test.enclosingLibrary.addTypedef(foo);
- test.enclosingLibrary.addTypedef(bar);
- });
- positiveTest('Valid long typedefs C20 = C19 = ... = C1 = C0 = dynamic',
- (TestHarness test) {
- var typedef_ = new Typedef('C0', const DynamicType());
- test.enclosingLibrary.addTypedef(typedef_);
- for (int i = 1; i < 20; ++i) {
- typedef_ =
- new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+ positiveTest(
+ 'Test harness has no errors',
+ (TestHarness test) {
+ test.addNode(NullLiteral());
+ },
+ );
+ negative1Test(
+ 'VariableGet out of scope',
+ (TestHarness test) {
+ VariableDeclaration node = test.makeVariable();
+ test.addNode(VariableGet(node));
+ return node;
+ },
+ (Node node) => matches("Variable '$node' used out of scope\\."),
+ );
+ negative1Test(
+ 'VariableSet out of scope',
+ (TestHarness test) {
+ VariableDeclaration variable = test.makeVariable();
+ test.addNode(VariableSet(variable, new NullLiteral()));
+ return variable;
+ },
+ (Node node) => matches("Variable '$node' used out of scope\\."),
+ );
+ negative1Test(
+ 'Variable block scope',
+ (TestHarness test) {
+ VariableDeclaration variable = test.makeVariable();
+ test.addNode(Block([
+ new Block([variable]),
+ new ReturnStatement(new VariableGet(variable))
+ ]));
+ return variable;
+ },
+ (Node node) => matches("Variable '$node' used out of scope\\."),
+ );
+ negative1Test(
+ 'Variable let scope',
+ (TestHarness test) {
+ VariableDeclaration variable = test.makeVariable();
+ test.addNode(LogicalExpression(
+ new Let(variable, new VariableGet(variable)),
+ '&&',
+ new VariableGet(variable)));
+ return variable;
+ },
+ (Node node) => matches("Variable '$node' used out of scope\\."),
+ );
+ negative1Test(
+ 'Variable redeclared',
+ (TestHarness test) {
+ VariableDeclaration variable = test.makeVariable();
+ test.addNode(Block([variable, variable]));
+ return variable;
+ },
+ (Node node) => matches("Variable '$node' declared more than once\\."),
+ );
+ negative1Test(
+ 'Member redeclared',
+ (TestHarness test) {
+ Field field =
+ new Field(new Name('field'), initializer: new NullLiteral());
+ test.addNode(Class(
+ name: 'Test',
+ supertype: test.objectClass.asRawSupertype,
+ fields: [field, field]));
+ return field;
+ },
+ (Node node) => "Member '$node' has been declared more than once.",
+ );
+ negative1Test(
+ 'Class redeclared',
+ (TestHarness test) {
+ Class otherClass = test.otherClass;
+ test.addNode(
+ otherClass); // Test harness also adds otherClass to component.
+ return test.otherClass;
+ },
+ (Node node) => "Class '$node' declared more than once.",
+ );
+ negative1Test(
+ 'Class type parameter redeclared',
+ (TestHarness test) {
+ TypeParameter parameter = test.makeTypeParameter();
+ test.addNode(Class(
+ name: 'Test',
+ supertype: test.objectClass.asRawSupertype,
+ typeParameters: [parameter, parameter]));
+ return parameter;
+ },
+ (Node node) => matches("Type parameter '$node' redeclared\\."),
+ );
+ negative1Test(
+ 'Member type parameter redeclared',
+ (TestHarness test) {
+ TypeParameter parameter = test.makeTypeParameter();
+ test.addNode(Procedure(
+ new Name('bar'),
+ ProcedureKind.Method,
+ new FunctionNode(new ReturnStatement(new NullLiteral()),
+ typeParameters: [parameter, parameter])));
+
+ return parameter;
+ },
+ (Node node) => matches("Type parameter '$node' redeclared\\."),
+ );
+ negative2Test(
+ 'Type parameter out of scope',
+ (TestHarness test) {
+ TypeParameter parameter = test.makeTypeParameter();
+ test.addNode(ListLiteral([],
+ typeArgument: new TypeParameterType(parameter, Nullability.legacy)));
+ return [parameter, null];
+ },
+ (Node node, Node parent) =>
+ matches("Type parameter '$node' referenced out of scope,"
+ " parent is: '$parent'\\."),
+ );
+ negative2Test(
+ 'Class type parameter from another class',
+ (TestHarness test) {
+ TypeParameter node = test.otherClass.typeParameters[0];
+ test.addNode(
+ TypeLiteral(new TypeParameterType(node, Nullability.legacy)));
+ return [node, test.otherClass];
+ },
+ (Node node, Node parent) =>
+ "Type parameter '$node' referenced out of scope,"
+ " parent is: '$parent'.",
+ );
+ negative2Test(
+ 'Class type parameter in static method',
+ (TestHarness test) {
+ TypeParameter node = test.classTypeParameter;
+ test.addNode(Procedure(
+ new Name('bar'),
+ ProcedureKind.Method,
+ new FunctionNode(new ReturnStatement(new TypeLiteral(
+ new TypeParameterType(node, Nullability.legacy)))),
+ isStatic: true));
+
+ return [node, test.enclosingClass];
+ },
+ (Node node, Node parent) =>
+ "Type parameter '$node' referenced from static context,"
+ " parent is: '$parent'.",
+ );
+ negative2Test(
+ 'Class type parameter in static field',
+ (TestHarness test) {
+ TypeParameter node = test.classTypeParameter;
+ test.addNode(Field(new Name('field'),
+ initializer:
+ new TypeLiteral(new TypeParameterType(node, Nullability.legacy)),
+ isStatic: true));
+ return [node, test.enclosingClass];
+ },
+ (Node node, Node parent) =>
+ "Type parameter '$node' referenced from static context,"
+ " parent is: '$parent'.",
+ );
+ negative2Test(
+ 'Method type parameter out of scope',
+ (TestHarness test) {
+ TypeParameter parameter = test.makeTypeParameter();
+ FunctionNode parent =
+ new FunctionNode(new EmptyStatement(), typeParameters: [parameter]);
+ test.addNode(Class(
+ name: 'Test',
+ supertype: test.objectClass.asRawSupertype,
+ procedures: [
+ new Procedure(new Name('generic'), ProcedureKind.Method, parent),
+ new Procedure(
+ new Name('use'),
+ ProcedureKind.Method,
+ new FunctionNode(new ReturnStatement(new TypeLiteral(
+ new TypeParameterType(parameter, Nullability.legacy)))))
+ ]));
+
+ return [parameter, parent];
+ },
+ (Node node, Node parent) =>
+ "Type parameter '$node' referenced out of scope,"
+ " parent is: '$parent'.",
+ );
+ negative1Test(
+ 'Interface type arity too low',
+ (TestHarness test) {
+ InterfaceType node =
+ new InterfaceType(test.otherClass, Nullability.legacy, []);
+ test.addNode(TypeLiteral(node));
+ return node;
+ },
+ (Node node) => "Type $node provides 0 type arguments,"
+ " but the class declares 1 parameters.",
+ );
+ negative1Test(
+ 'Interface type arity too high',
+ (TestHarness test) {
+ InterfaceType node = new InterfaceType(test.otherClass,
+ Nullability.legacy, [new DynamicType(), new DynamicType()]);
+ test.addNode(TypeLiteral(node));
+ return node;
+ },
+ (Node node) => "Type $node provides 2 type arguments,"
+ " but the class declares 1 parameters.",
+ );
+ negative1Test(
+ 'Dangling interface type',
+ (TestHarness test) {
+ Class orphan = new Class();
+ test.addNode(
+ new TypeLiteral(new InterfaceType(orphan, Nullability.legacy)));
+ return orphan;
+ },
+ (Node node) => "Dangling reference to '$node', parent is: 'null'.",
+ );
+ negative1Test(
+ 'Dangling field get',
+ (TestHarness test) {
+ Field orphan = new Field(new Name('foo'));
+ test.addNode(new DirectPropertyGet(new NullLiteral(), orphan));
+ return orphan;
+ },
+ (Node node) => "Dangling reference to '$node', parent is: 'null'.",
+ );
+ simpleNegativeTest(
+ 'Missing block parent pointer',
+ "Incorrect parent pointer on ReturnStatement:"
+ " expected 'Block', but found: 'Null'.",
+ (TestHarness test) {
+ var block = new Block([]);
+ block.statements.add(new ReturnStatement());
+ test.addNode(block);
+ },
+ );
+ simpleNegativeTest(
+ 'Missing function parent pointer',
+ "Incorrect parent pointer on FunctionNode:"
+ " expected 'Procedure', but found: 'Null'.",
+ (TestHarness test) {
+ var procedure =
+ new Procedure(new Name('bar'), ProcedureKind.Method, null);
+ procedure.function = new FunctionNode(new EmptyStatement());
+ test.addNode(procedure);
+ },
+ );
+ simpleNegativeTest(
+ 'StaticGet without target',
+ "StaticGet without target.",
+ (TestHarness test) {
+ test.addNode(StaticGet(null));
+ },
+ );
+ simpleNegativeTest(
+ 'StaticSet without target',
+ "StaticSet without target.",
+ (TestHarness test) {
+ test.addNode(StaticSet(null, new NullLiteral()));
+ },
+ );
+ simpleNegativeTest(
+ 'StaticInvocation without target',
+ "StaticInvocation without target.",
+ (TestHarness test) {
+ test.addNode(StaticInvocation(null, new Arguments.empty()));
+ },
+ );
+ positiveTest(
+ 'Correct StaticInvocation',
+ (TestHarness test) {
+ var method = new Procedure(
+ new Name('foo'),
+ ProcedureKind.Method,
+ new FunctionNode(new EmptyStatement(),
+ positionalParameters: [new VariableDeclaration('p')]),
+ isStatic: true);
+ test.enclosingClass.addMember(method);
+ test.addNode(
+ StaticInvocation(method, new Arguments([new NullLiteral()])));
+ },
+ );
+ negative1Test(
+ 'StaticInvocation with too many parameters',
+ (TestHarness test) {
+ var method = new Procedure(new Name('bar'), ProcedureKind.Method,
+ new FunctionNode(new EmptyStatement()),
+ isStatic: true);
+ test.enclosingClass.addMember(method);
+ test.addNode(
+ StaticInvocation(method, new Arguments([new NullLiteral()])));
+ return method;
+ },
+ (Node node) => "StaticInvocation with incompatible arguments for"
+ " '$node'.",
+ );
+ negative1Test(
+ 'StaticInvocation with too few parameters',
+ (TestHarness test) {
+ var method = new Procedure(
+ new Name('bar'),
+ ProcedureKind.Method,
+ new FunctionNode(new EmptyStatement(),
+ positionalParameters: [new VariableDeclaration('p')]),
+ isStatic: true);
+ test.enclosingClass.addMember(method);
+ test.addNode(StaticInvocation(method, new Arguments.empty()));
+ return method;
+ },
+ (Node node) => "StaticInvocation with incompatible arguments for '$node'.",
+ );
+ negative1Test(
+ 'StaticInvocation with unmatched named parameter',
+ (TestHarness test) {
+ var method = new Procedure(new Name('bar'), ProcedureKind.Method,
+ new FunctionNode(new EmptyStatement()),
+ isStatic: true);
+ test.enclosingClass.addMember(method);
+ test.addNode(StaticInvocation(
+ method,
+ new Arguments([],
+ named: [new NamedExpression('p', new NullLiteral())])));
+ return method;
+ },
+ (Node node) => "StaticInvocation with incompatible arguments for"
+ " '$node'.",
+ );
+ negative1Test(
+ 'StaticInvocation with missing type argument',
+ (TestHarness test) {
+ Procedure method = new Procedure(
+ new Name('bar'),
+ ProcedureKind.Method,
+ new FunctionNode(new EmptyStatement(),
+ typeParameters: [test.makeTypeParameter()]),
+ isStatic: true);
+ test.enclosingClass.addMember(method);
+ test.addNode(StaticInvocation(method, new Arguments.empty()));
+ return method;
+ },
+ (Node node) => "StaticInvocation with wrong number of type arguments for"
+ " '$node'.",
+ );
+ negative1Test(
+ 'ConstructorInvocation with missing type argument',
+ (TestHarness test) {
+ var constructor = new Constructor(new FunctionNode(new EmptyStatement()),
+ name: new Name('foo'));
+ test.enclosingClass.addMember(constructor);
+ test.addNode(ConstructorInvocation(constructor, new Arguments.empty()));
+ return constructor;
+ },
+ (Node node) =>
+ "ConstructorInvocation with wrong number of type arguments for"
+ " '$node'.",
+ );
+ positiveTest(
+ 'Valid typedef Foo = `(C) => void`',
+ (TestHarness test) {
+ var typedef_ = new Typedef(
+ 'Foo',
+ new FunctionType(
+ [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
+ test.addNode(typedef_);
+ },
+ );
+ positiveTest(
+ 'Valid typedef Foo = C<dynamic>',
+ (TestHarness test) {
+ var typedef_ = new Typedef(
+ 'Foo',
+ new InterfaceType(
+ test.otherClass, Nullability.legacy, [const DynamicType()]));
+ test.addNode(typedef_);
+ },
+ );
+ positiveTest(
+ 'Valid typedefs Foo = Bar, Bar = C',
+ (TestHarness test) {
+ var foo = new Typedef('Foo', null);
+ var bar = new Typedef('Bar', null);
+ foo.type = new TypedefType(bar, Nullability.legacy);
+ bar.type = test.otherLegacyRawType;
+ test.enclosingLibrary.addTypedef(foo);
+ test.enclosingLibrary.addTypedef(bar);
+ },
+ );
+ positiveTest(
+ 'Valid typedefs Foo = C<Bar>, Bar = C',
+ (TestHarness test) {
+ var foo = new Typedef('Foo', null);
+ var bar = new Typedef('Bar', null);
+ foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypedefType(bar, Nullability.legacy)]);
+ bar.type = test.otherLegacyRawType;
+ test.enclosingLibrary.addTypedef(foo);
+ test.enclosingLibrary.addTypedef(bar);
+ },
+ );
+ positiveTest(
+ 'Valid typedef type in field',
+ (TestHarness test) {
+ var typedef_ = new Typedef(
+ 'Foo',
+ new FunctionType(
+ [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
+ var field = new Field(new Name('field'),
+ type: new TypedefType(typedef_, Nullability.legacy), isStatic: true);
test.enclosingLibrary.addTypedef(typedef_);
- }
- });
- negativeTest(
- 'Invalid long typedefs C20 = C19 = ... = C1 = C0 = C20',
- "The typedef 'typedef C0 = test_lib::C19;\n'"
- " refers to itself", (TestHarness test) {
- var typedef_ = new Typedef('C0', null);
- test.enclosingLibrary.addTypedef(typedef_);
- var first = typedef_;
- for (int i = 1; i < 20; ++i) {
- typedef_ =
- new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+ test.enclosingLibrary.addMember(field);
+ },
+ );
+ negative1Test(
+ 'Invalid typedef Foo = Foo',
+ (TestHarness test) {
+ var typedef_ = new Typedef('Foo', null);
+ typedef_.type = new TypedefType(typedef_, Nullability.legacy);
+ test.addNode(typedef_);
+ return typedef_;
+ },
+ (Node node) => "The typedef '$node' refers to itself",
+ );
+ negative1Test(
+ 'Invalid typedef Foo = `(Foo) => void`',
+ (TestHarness test) {
+ var typedef_ = new Typedef('Foo', null);
+ typedef_.type = new FunctionType(
+ [new TypedefType(typedef_, Nullability.legacy)],
+ const VoidType(),
+ Nullability.legacy);
+ test.addNode(typedef_);
+ return typedef_;
+ },
+ (Node node) => "The typedef '$node' refers to itself",
+ );
+ negative1Test(
+ 'Invalid typedef Foo = `() => Foo`',
+ (TestHarness test) {
+ var typedef_ = new Typedef('Foo', null);
+ typedef_.type = new FunctionType([],
+ new TypedefType(typedef_, Nullability.legacy), Nullability.legacy);
+ test.addNode(typedef_);
+ return typedef_;
+ },
+ (Node node) => "The typedef '$node' refers to itself",
+ );
+ negative1Test(
+ 'Invalid typedef Foo = C<Foo>',
+ (TestHarness test) {
+ var typedef_ = new Typedef('Foo', null);
+ typedef_.type = new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypedefType(typedef_, Nullability.legacy)]);
+ test.addNode(typedef_);
+ return typedef_;
+ },
+ (Node node) => "The typedef '$node' refers to itself",
+ );
+ negative1Test(
+ 'Invalid typedefs Foo = Bar, Bar = Foo',
+ (TestHarness test) {
+ var foo = new Typedef('Foo', null);
+ var bar = new Typedef('Bar', null);
+ foo.type = new TypedefType(bar, Nullability.legacy);
+ bar.type = new TypedefType(foo, Nullability.legacy);
+ test.enclosingLibrary.addTypedef(foo);
+ test.enclosingLibrary.addTypedef(bar);
+ return foo;
+ },
+ (Node foo) => "The typedef '$foo' refers to itself",
+ );
+ negative1Test(
+ 'Invalid typedefs Foo = Bar, Bar = C<Foo>',
+ (TestHarness test) {
+ var foo = new Typedef('Foo', null);
+ var bar = new Typedef('Bar', null);
+ foo.type = new TypedefType(bar, Nullability.legacy);
+ bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypedefType(foo, Nullability.legacy)]);
+ test.enclosingLibrary.addTypedef(foo);
+ test.enclosingLibrary.addTypedef(bar);
+ return foo;
+ },
+ (Node foo) => "The typedef '$foo' refers to itself",
+ );
+ negative1Test(
+ 'Invalid typedefs Foo = C<Bar>, Bar = C<Foo>',
+ (TestHarness test) {
+ var foo = new Typedef('Foo', null);
+ var bar = new Typedef('Bar', null);
+ foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypedefType(bar, Nullability.legacy)]);
+ bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypedefType(foo, Nullability.legacy)]);
+ test.enclosingLibrary.addTypedef(foo);
+ test.enclosingLibrary.addTypedef(bar);
+ return foo;
+ },
+ (Node foo) => "The typedef '$foo' refers to itself",
+ );
+ positiveTest(
+ 'Valid long typedefs C20 = C19 = ... = C1 = C0 = dynamic',
+ (TestHarness test) {
+ var typedef_ = new Typedef('C0', const DynamicType());
test.enclosingLibrary.addTypedef(typedef_);
- }
- first.type = new TypedefType(typedef_, Nullability.legacy);
- });
- positiveTest('Valid typedef Foo<T extends C> = C<T>', (TestHarness test) {
- var param = new TypeParameter('T', test.otherLegacyRawType);
- var foo = new Typedef(
- 'Foo',
- new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypeParameterType(param, Nullability.legacy)]),
- typeParameters: [param]);
- test.addNode(foo);
- });
- positiveTest('Valid typedef Foo<T extends C<T>> = C<T>', (TestHarness test) {
- var param = new TypeParameter('T', test.otherLegacyRawType);
- param.bound = new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypeParameterType(param, Nullability.legacy)]);
- var foo = new Typedef(
- 'Foo',
- new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypeParameterType(param, Nullability.legacy)]),
- typeParameters: [param]);
- test.addNode(foo);
- });
- positiveTest('Valid typedef Foo<T> = dynamic, Bar<T extends Foo<T>> = C<T>',
- (TestHarness test) {
- var fooParam = test.makeTypeParameter('T');
- var foo =
- new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
- var barParam = new TypeParameter('T', null);
- barParam.bound = new TypedefType(foo, Nullability.legacy,
- [new TypeParameterType(barParam, Nullability.legacy)]);
- var bar = new Typedef(
- 'Bar',
- new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypeParameterType(barParam, Nullability.legacy)]),
- typeParameters: [barParam]);
- test.enclosingLibrary.addTypedef(foo);
- test.enclosingLibrary.addTypedef(bar);
- });
- negativeTest(
- 'Invalid typedefs Foo<T extends Bar<T>>, Bar<T extends Foo<T>>',
- "The typedef 'typedef Foo<T extends test_lib::Bar<T*>> = dynamic;\n'"
- " refers to itself", (TestHarness test) {
- var fooParam = test.makeTypeParameter('T');
- var foo =
- new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
- var barParam = new TypeParameter('T', null);
- barParam.bound = new TypedefType(foo, Nullability.legacy,
- [new TypeParameterType(barParam, Nullability.legacy)]);
- var bar = new Typedef(
- 'Bar',
- new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypeParameterType(barParam, Nullability.legacy)]),
- typeParameters: [barParam]);
- fooParam.bound = new TypedefType(bar, Nullability.legacy,
- [new TypeParameterType(fooParam, Nullability.legacy)]);
- test.enclosingLibrary.addTypedef(foo);
- test.enclosingLibrary.addTypedef(bar);
- });
- negativeTest(
- 'Invalid typedef Foo<T extends Foo<dynamic> = C<T>',
- "The typedef 'typedef Foo<T extends test_lib::Foo<dynamic>> = "
- "test_lib::OtherClass<T*>*;\n'"
- " refers to itself", (TestHarness test) {
- var param = new TypeParameter('T', null);
- var foo = new Typedef(
- 'Foo',
- new InterfaceType(test.otherClass, Nullability.legacy,
- [new TypeParameterType(param, Nullability.legacy)]),
- typeParameters: [param]);
- param.bound =
- new TypedefType(foo, Nullability.legacy, [const DynamicType()]);
- test.addNode(foo);
- });
- negativeTest(
- 'Typedef arity error',
- "The typedef type test_lib::Foo provides 0 type arguments,"
- " but the typedef declares 1 parameters.", (TestHarness test) {
- var param = test.makeTypeParameter('T');
- var foo =
- new Typedef('Foo', test.otherLegacyRawType, typeParameters: [param]);
- var field = new Field(new Name('field'),
- type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
- test.enclosingLibrary.addTypedef(foo);
- test.enclosingLibrary.addMember(field);
- });
- negativeTest(
- 'Dangling typedef reference',
- "Dangling reference to 'typedef Foo = test_lib::OtherClass<dynamic>*;\n'"
- ", parent is: 'null'", (TestHarness test) {
- var foo = new Typedef('Foo', test.otherLegacyRawType, typeParameters: []);
- var field = new Field(new Name('field'),
- type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
- test.enclosingLibrary.addMember(field);
- });
- negativeTest('Non-static top-level field',
- "The top-level field 'field' should be static", (TestHarness test) {
- var field = new Field(new Name('field'));
- test.enclosingLibrary.addMember(field);
- });
+ for (int i = 1; i < 20; ++i) {
+ typedef_ =
+ new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+ test.enclosingLibrary.addTypedef(typedef_);
+ }
+ },
+ );
+ negative1Test(
+ 'Invalid long typedefs C20 = C19 = ... = C1 = C0 = C20',
+ (TestHarness test) {
+ Typedef firstTypedef = new Typedef('C0', null);
+ Typedef typedef_ = firstTypedef;
+ test.enclosingLibrary.addTypedef(typedef_);
+ var first = typedef_;
+ for (int i = 1; i < 20; ++i) {
+ typedef_ =
+ new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+ test.enclosingLibrary.addTypedef(typedef_);
+ }
+ first.type = new TypedefType(typedef_, Nullability.legacy);
+ return firstTypedef;
+ },
+ (Node node) => "The typedef '$node' refers to itself",
+ );
+ positiveTest(
+ 'Valid typedef Foo<T extends C> = C<T>',
+ (TestHarness test) {
+ var param = new TypeParameter('T', test.otherLegacyRawType);
+ var foo = new Typedef(
+ 'Foo',
+ new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypeParameterType(param, Nullability.legacy)]),
+ typeParameters: [param]);
+ test.addNode(foo);
+ },
+ );
+ positiveTest(
+ 'Valid typedef Foo<T extends C<T>> = C<T>',
+ (TestHarness test) {
+ var param = new TypeParameter('T', test.otherLegacyRawType);
+ param.bound = new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypeParameterType(param, Nullability.legacy)]);
+ var foo = new Typedef(
+ 'Foo',
+ new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypeParameterType(param, Nullability.legacy)]),
+ typeParameters: [param]);
+ test.addNode(foo);
+ },
+ );
+ positiveTest(
+ 'Valid typedef Foo<T> = dynamic, Bar<T extends Foo<T>> = C<T>',
+ (TestHarness test) {
+ var fooParam = test.makeTypeParameter('T');
+ var foo =
+ new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
+ var barParam = new TypeParameter('T', null);
+ barParam.bound = new TypedefType(foo, Nullability.legacy,
+ [new TypeParameterType(barParam, Nullability.legacy)]);
+ var bar = new Typedef(
+ 'Bar',
+ new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypeParameterType(barParam, Nullability.legacy)]),
+ typeParameters: [barParam]);
+ test.enclosingLibrary.addTypedef(foo);
+ test.enclosingLibrary.addTypedef(bar);
+ },
+ );
+ negative1Test(
+ 'Invalid typedefs Foo<T extends Bar<T>>, Bar<T extends Foo<T>>',
+ (TestHarness test) {
+ var fooParam = test.makeTypeParameter('T');
+ var foo =
+ new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
+ var barParam = new TypeParameter('T', null);
+ barParam.bound = new TypedefType(foo, Nullability.legacy,
+ [new TypeParameterType(barParam, Nullability.legacy)]);
+ var bar = new Typedef(
+ 'Bar',
+ new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypeParameterType(barParam, Nullability.legacy)]),
+ typeParameters: [barParam]);
+ fooParam.bound = new TypedefType(bar, Nullability.legacy,
+ [new TypeParameterType(fooParam, Nullability.legacy)]);
+ test.enclosingLibrary.addTypedef(foo);
+ test.enclosingLibrary.addTypedef(bar);
+ return foo;
+ },
+ (Node foo) => "The typedef '$foo' refers to itself",
+ );
+ negative1Test(
+ 'Invalid typedef Foo<T extends Foo<dynamic> = C<T>',
+ (TestHarness test) {
+ var param = new TypeParameter('T', null);
+ var foo = new Typedef(
+ 'Foo',
+ new InterfaceType(test.otherClass, Nullability.legacy,
+ [new TypeParameterType(param, Nullability.legacy)]),
+ typeParameters: [param]);
+ param.bound =
+ new TypedefType(foo, Nullability.legacy, [const DynamicType()]);
+ test.addNode(foo);
+ return foo;
+ },
+ (Node foo) => "The typedef '$foo' refers to itself",
+ );
+ negative1Test(
+ 'Typedef arity error',
+ (TestHarness test) {
+ var param = test.makeTypeParameter('T');
+ var foo =
+ new Typedef('Foo', test.otherLegacyRawType, typeParameters: [param]);
+ var typedefType = new TypedefType(foo, Nullability.legacy, []);
+ var field =
+ new Field(new Name('field'), type: typedefType, isStatic: true);
+ test.enclosingLibrary.addTypedef(foo);
+ test.enclosingLibrary.addMember(field);
+ return typedefType;
+ },
+ (Node typedefType) =>
+ "The typedef type $typedefType provides 0 type arguments,"
+ " but the typedef declares 1 parameters.",
+ );
+ negative1Test(
+ 'Dangling typedef reference',
+ (TestHarness test) {
+ var foo = new Typedef('Foo', test.otherLegacyRawType, typeParameters: []);
+ var field = new Field(new Name('field'),
+ type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
+ test.enclosingLibrary.addMember(field);
+ return foo;
+ },
+ (Node foo) => "Dangling reference to '$foo', parent is: 'null'",
+ );
+ negative1Test(
+ 'Non-static top-level field',
+ (TestHarness test) {
+ var field = new Field(new Name('field'));
+ test.enclosingLibrary.addMember(field);
+ return null;
+ },
+ (Node node) => "The top-level field 'field' should be static",
+ );
}
checkHasError(Component component, Matcher matcher) {
@@ -620,21 +773,61 @@
}
}
-negativeTest(String name, matcher, void makeTestCase(TestHarness test)) {
- if (matcher is String) {
- matcher = equals(matcher);
- }
- test(name, () {
- var test = new TestHarness();
- makeTestCase(test);
- checkHasError(test.component, matcher);
- });
+negative1Test(String name, Node Function(TestHarness test) nodeProvider,
+ dynamic Function(Node node) matcher) {
+ TestHarness testHarness = new TestHarness();
+ Node node = nodeProvider(testHarness);
+ test(
+ name,
+ () {
+ dynamic matcherResult = matcher(node);
+ if (matcherResult is String) {
+ matcherResult = equals(matcherResult);
+ }
+ checkHasError(testHarness.component, matcherResult);
+ },
+ );
+}
+
+negative2Test(String name, List<Node> Function(TestHarness test) nodeProvider,
+ dynamic Function(Node node, Node other) matcher) {
+ TestHarness testHarness = new TestHarness();
+ List<Node> nodes = nodeProvider(testHarness);
+ if (nodes.length != 2) throw "Needs exactly 2 nodes: Node and other!";
+ test(
+ name,
+ () {
+ dynamic matcherResult = matcher(nodes[0], nodes[1]);
+ if (matcherResult is String) {
+ matcherResult = equals(matcherResult);
+ }
+ checkHasError(testHarness.component, matcherResult);
+ },
+ );
+}
+
+simpleNegativeTest(String name, dynamic matcher,
+ void Function(TestHarness test) makeTestCase) {
+ TestHarness testHarness = new TestHarness();
+ test(
+ name,
+ () {
+ makeTestCase(testHarness);
+ if (matcher is String) {
+ matcher = equals(matcher);
+ }
+ checkHasError(testHarness.component, matcher);
+ },
+ );
}
positiveTest(String name, void makeTestCase(TestHarness test)) {
- test(name, () {
- var test = new TestHarness();
- makeTestCase(test);
- verifyComponent(test.component);
- });
+ test(
+ name,
+ () {
+ var test = new TestHarness();
+ makeTestCase(test);
+ verifyComponent(test.component);
+ },
+ );
}
diff --git a/pkg/native_stack_traces/CHANGELOG.md b/pkg/native_stack_traces/CHANGELOG.md
index de635af..c6fb8b8 100644
--- a/pkg/native_stack_traces/CHANGELOG.md
+++ b/pkg/native_stack_traces/CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog
+## 0.3.0
+
+- Adds handling of virtual addresses within stub code payloads.
+
## 0.2.2
- Finds instruction sections by the dynamic symbols the Dart VM creates instead
diff --git a/pkg/native_stack_traces/bin/decode.dart b/pkg/native_stack_traces/bin/decode.dart
index fe59643..4b864c0 100644
--- a/pkg/native_stack_traces/bin/decode.dart
+++ b/pkg/native_stack_traces/bin/decode.dart
@@ -10,36 +10,36 @@
import 'package:path/path.dart' as path;
import 'package:native_stack_traces/native_stack_traces.dart';
-final ArgParser _translateParser = ArgParser(allowTrailingOptions: true)
+ArgParser _createBaseDebugParser(ArgParser parser) => parser
..addOption('debug',
abbr: 'd',
help: 'Filename containing debugging information (REQUIRED)',
valueHelp: 'FILE')
- ..addOption('input',
- abbr: 'i', help: 'Filename for processed input', valueHelp: 'FILE')
- ..addOption('output',
- abbr: 'o', help: 'Filename for generated output', valueHelp: 'FILE')
- ..addFlag('verbose',
- abbr: 'v',
- negatable: false,
- help: 'Translate all frames, not just user or library code frames');
-
-final ArgParser _findParser = ArgParser(allowTrailingOptions: true)
- ..addOption('debug',
- abbr: 'd',
- help: 'Filename containing debugging information (REQUIRED)',
- valueHelp: 'FILE')
- ..addMultiOption('location',
- abbr: 'l', help: 'PC address to find', valueHelp: 'PC')
..addFlag('verbose',
abbr: 'v',
negatable: false,
help: 'Translate all frames, not just user or library code frames')
- ..addOption('vm_start',
- help: 'Absolute address for start of VM instructions', valueHelp: 'PC')
- ..addOption('isolate_start',
- help: 'Absolute address for start of isolate instructions',
- valueHelp: 'PC');
+ ..addFlag('dump_debug_file_contents',
+ negatable: false,
+ help: 'Dump all the parsed information from the debugging file');
+
+final ArgParser _translateParser =
+ _createBaseDebugParser(ArgParser(allowTrailingOptions: true))
+ ..addOption('input',
+ abbr: 'i', help: 'Filename for processed input', valueHelp: 'FILE')
+ ..addOption('output',
+ abbr: 'o', help: 'Filename for generated output', valueHelp: 'FILE');
+
+final ArgParser _findParser =
+ _createBaseDebugParser(ArgParser(allowTrailingOptions: true))
+ ..addMultiOption('location',
+ abbr: 'l', help: 'PC address to find', valueHelp: 'PC')
+ ..addOption('vm_start',
+ help: 'Absolute address for start of VM instructions',
+ valueHelp: 'PC')
+ ..addOption('isolate_start',
+ help: 'Absolute address for start of isolate instructions',
+ valueHelp: 'PC');
final ArgParser _helpParser = ArgParser(allowTrailingOptions: true);
@@ -141,14 +141,34 @@
}
}
+Dwarf _loadFromFile(String original, Function(String) usageError) {
+ if (original == null) {
+ usageError('must provide -d/--debug');
+ return null;
+ }
+ final filename = path.canonicalize(path.normalize(original));
+ if (!io.File(filename).existsSync()) {
+ usageError('debug file "$original" does not exist');
+ return null;
+ }
+ final dwarf = Dwarf.fromFile(filename);
+ if (dwarf == null) {
+ usageError('file "$original" does not contain debugging information');
+ }
+ return dwarf;
+}
+
void find(ArgResults options) {
void usageError(String message) => errorWithUsage(message, command: 'find');
int convertAddress(String s) => int.tryParse(s, radix: 16);
- if (options['debug'] == null) {
- return usageError('must provide -d/--debug');
+ final dwarf = _loadFromFile(options['debug'], usageError);
+ if (dwarf == null) {
+ return;
}
- final dwarf = Dwarf.fromFile(options['debug']);
+ if (options['dump_debug_file_contents']) {
+ print(dwarf.dumpFileInfo());
+ }
final verbose = options['verbose'];
int vm_start;
@@ -215,11 +235,13 @@
void usageError(String message) =>
errorWithUsage(message, command: 'translate');
- if (options['debug'] == null) {
- return usageError('must provide -d/--debug');
+ final dwarf = _loadFromFile(options['debug'], usageError);
+ if (dwarf == null) {
+ return;
}
- final dwarf =
- Dwarf.fromFile(path.canonicalize(path.normalize(options['debug'])));
+ if (options['dump_debug_file_contents']) {
+ print(dwarf.dumpFileInfo());
+ }
final verbose = options['verbose'];
final output = options['output'] != null
diff --git a/pkg/native_stack_traces/lib/native_stack_traces.dart b/pkg/native_stack_traces/lib/native_stack_traces.dart
index ad8e6a9..bbb59f7 100644
--- a/pkg/native_stack_traces/lib/native_stack_traces.dart
+++ b/pkg/native_stack_traces/lib/native_stack_traces.dart
@@ -4,4 +4,5 @@
export 'src/convert.dart'
show collectPCOffsets, DwarfStackTraceDecoder, StackTraceHeader;
-export 'src/dwarf.dart' show CallInfo, Dwarf, PCOffset;
+export 'src/dwarf.dart'
+ show CallInfo, DartCallInfo, StubCallInfo, Dwarf, PCOffset;
diff --git a/pkg/native_stack_traces/lib/src/dwarf.dart b/pkg/native_stack_traces/lib/src/dwarf.dart
index a10a9cd..a53ea59 100644
--- a/pkg/native_stack_traces/lib/src/dwarf.dart
+++ b/pkg/native_stack_traces/lib/src/dwarf.dart
@@ -174,16 +174,27 @@
}
}
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer
+ ..write(' Tag: ')
+ ..writeln(_tagStrings[tag])
+ ..write(' Children: ')
+ ..writeln(children ? 'DW_CHILDREN_yes' : 'DW_CHILDREN_no')
+ ..writeln(' Attributes:');
+ for (final attribute in attributes) {
+ buffer
+ ..write(' ')
+ ..write(_attributeNameStrings[attribute.name])
+ ..write(': ')
+ ..writeln(_attributeFormStrings[attribute.form]);
+ }
+ }
+
@override
String toString() {
- var ret = " Tag: ${_tagStrings[tag]}\n"
- " Children: ${children ? "DW_CHILDREN_yes" : "DW_CHILDREN_no"}\n"
- " Attributes:\n";
- for (final attribute in attributes) {
- ret += " ${_attributeNameStrings[attribute.name]}: "
- "${_attributeFormStrings[attribute.form]}\n";
- }
- return ret;
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
}
}
@@ -214,12 +225,24 @@
}
}
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer..writeln('Abbreviations table:')..writeln();
+ for (final key in _abbreviations.keys) {
+ buffer
+ ..write(' ')
+ ..write(key)
+ ..writeln(':');
+ _abbreviations[key].writeToStringBuffer(buffer);
+ buffer..writeln();
+ }
+ }
+
@override
- String toString() =>
- "Abbreviations table:\n\n" +
- _abbreviations.keys
- .map((k) => " Abbreviation $k:\n" + _abbreviations[k].toString())
- .join("\n");
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
+ }
}
/// A DWARF Debug Information Entry (DIE).
@@ -356,7 +379,7 @@
continue;
}
if (tag != _Tag.compileUnit) {
- callInfo.add(CallInfo(
+ callInfo.add(DartCallInfo(
function: abstractOrigin.name,
inlined: inlined,
filename: callFilename(unit.callFileIndex),
@@ -370,7 +393,7 @@
final filename = lineNumberProgram.filename(address);
final line = lineNumberProgram.lineNumber(address);
return [
- CallInfo(
+ DartCallInfo(
function: abstractOrigin.name,
inlined: inlined,
filename: filename,
@@ -378,26 +401,51 @@
];
}
- @override
- String toString() {
- var ret =
- "Abbreviated unit (code $code, offset ${paddedHex(_unitOffset)}):\n";
+ void writeToStringBuffer(StringBuffer buffer, {String indent = ''}) {
+ buffer
+ ..write(indent)
+ ..write('Abbreviated unit (code ')
+ ..write(code)
+ ..write(', offset ')
+ ..write(paddedHex(_unitOffset))
+ ..writeln('):');
for (final attribute in attributes.keys) {
- ret += " ${_attributeNameStrings[attribute.name]} => "
- "${_attributeValueToString(attribute, attributes[attribute])}\n";
+ buffer
+ ..write(indent)
+ ..write(' ')
+ ..write(_attributeNameStrings[attribute.name])
+ ..write(' => ')
+ ..writeln(_attributeValueToString(attribute, attributes[attribute]));
}
if (children == null || children.isEmpty) {
- ret += "Has no children.\n\n";
- return ret;
+ buffer
+ ..write(indent)
+ ..writeln('Has no children.');
+ return;
}
- ret += "Has ${children.length} " +
- (children.length == 1 ? "child" : "children") +
- "\n\n";
+ buffer
+ ..write(indent)
+ ..write('Has ')
+ ..write(children.length)
+ ..write(' ')
+ ..write(children.length == 1 ? "child" : "children")
+ ..writeln(':');
for (int i = 0; i < children.length; i++) {
- ret += "Child ${i} of unit at offset ${paddedHex(_unitOffset)}:\n";
- ret += children[i].toString();
+ buffer
+ ..write(indent)
+ ..write('Child ')
+ ..write(i)
+ ..write(' of unit at offset ')
+ ..write(paddedHex(_unitOffset))
+ ..writeln(':');
+ children[i].writeToStringBuffer(buffer, indent: indent + ' ');
}
- return ret;
+ }
+
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
}
}
@@ -465,13 +513,28 @@
_AbbreviationsTable get abbreviations =>
_abbreviationsTables[abbreviationOffset];
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer
+ ..writeln('Compilation unit:')
+ ..write(' Version: ')
+ ..writeln(version)
+ ..write(' Abbreviation offset: ')
+ ..writeln(paddedHex(abbreviationOffset, 4))
+ ..write(' Address size: ')
+ ..writeln(addressSize)
+ ..writeln();
+ for (final die in contents) {
+ die.writeToStringBuffer(buffer);
+ buffer.writeln();
+ }
+ }
+
@override
- String toString() =>
- "Compilation unit:\n"
- " Version: $version\n"
- " Abbreviation offset: ${paddedHex(abbreviationOffset, 4)}\n"
- " Address size: $addressSize\n\n" +
- contents.map((DebugInformationEntry u) => u.toString()).join();
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
+ }
}
/// A class representing a DWARF `.debug_info` section.
@@ -511,9 +574,18 @@
return null;
}
- String toString() =>
- "Debug information:\n\n" +
- units.map((CompilationUnit u) => u.toString()).join();
+ void writeToStringBuffer(StringBuffer buffer) {
+ for (final unit in units) {
+ unit.writeToStringBuffer(buffer);
+ buffer.writeln();
+ }
+ }
+
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
+ }
}
class FileEntry {
@@ -681,7 +753,7 @@
" Column number: $column\n"
" Is ${isStatement ? "" : "not "}a statement.\n"
" Is ${basicBlock ? "" : "not "}at the beginning of a basic block.\n"
- " Is ${endSequence ? "" : "not "}just after the end of a sequence.\n";
+ " Is ${endSequence ? "" : "not "}just after the end of a sequence.";
}
/// A class representing a DWARF line number program.
@@ -887,32 +959,40 @@
return state.line;
}
- @override
- String toString() {
- var buffer = StringBuffer(" Size: $size\n"
- " Version: $version\n"
- " Header length: $headerLength\n"
- " Min instruction length: $minimumInstructionLength\n"
- " Default value of is_stmt: $defaultIsStatement\n"
- " Line base: $lineBase\n"
- " Line range: $lineRange\n"
- " Opcode base: $opcodeBase\n"
- " Standard opcode lengths:\n");
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer
+ ..write(' Size: ')
+ ..writeln(size)
+ ..write(' Version: ')
+ ..writeln(version)
+ ..write(' Header length: ')
+ ..writeln(headerLength)
+ ..write(' Min instruction length: ')
+ ..writeln(minimumInstructionLength)
+ ..write(' Default value of is_stmt: ')
+ ..writeln(defaultIsStatement)
+ ..write(' Line base: ')
+ ..writeln(lineBase)
+ ..write(' Line range: ')
+ ..writeln(lineRange)
+ ..write(' Opcode base: ')
+ ..writeln(opcodeBase)
+ ..writeln('Standard opcode lengths:');
for (int i = 1; i < opcodeBase; i++) {
buffer
- ..write(" Opcode ")
+ ..write(' Opcode ')
..write(i)
- ..write(": ")
+ ..write(': ')
..writeln(standardOpcodeLengths[i]);
}
if (includeDirectories.isEmpty) {
- buffer.writeln("No include directories.");
+ buffer.writeln('No include directories.');
} else {
- buffer.writeln("Include directories:");
+ buffer.writeln('Include directories:');
for (final dir in includeDirectories) {
buffer
- ..write(" ")
+ ..write(' ')
..writeln(dir);
}
}
@@ -921,9 +1001,13 @@
buffer.writeln("Results of line number program:");
for (final state in calculatedMatrix) {
- buffer..write(state);
+ buffer..writeln(state);
}
+ }
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
return buffer.toString();
}
}
@@ -955,13 +1039,20 @@
bool containsKey(int address) => programs.containsKey(address);
LineNumberProgram operator [](int address) => programs[address];
- String toString() =>
- "Line number information:\n\n" +
- programs
- .map((int i, LineNumberProgram p) =>
- MapEntry(i, "Line number program @ 0x${paddedHex(i)}:\n$p\n"))
- .values
- .join();
+ void writeToStringBuffer(StringBuffer buffer) {
+ for (final offset in programs.keys) {
+ buffer
+ ..write('Line number program @ 0x')
+ ..writeln(paddedHex(offset));
+ programs[offset].writeToStringBuffer(buffer);
+ }
+ }
+
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
+ }
}
// TODO(11617): Replace calls to these functions with a general hashing solution
@@ -978,22 +1069,35 @@
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
-class CallInfo {
+/// Represents the information for a call site.
+abstract class CallInfo {
+ /// Whether this call site is considered internal (i.e. not located in either
+ /// user or library Dart source code).
+ bool get isInternal => true;
+}
+
+/// Represents the information for a call site located in Dart source code.
+class DartCallInfo extends CallInfo {
final bool inlined;
final String function;
final String filename;
final int line;
- CallInfo({this.inlined = false, this.function, this.filename, this.line});
+ DartCallInfo({this.inlined = false, this.function, this.filename, this.line});
+ @override
+ bool get isInternal => line <= 0;
+
+ @override
int get hashCode => _hashFinish(_hashCombine(
_hashCombine(
_hashCombine(_hashCombine(0, inlined.hashCode), function.hashCode),
filename.hashCode),
line.hashCode));
+ @override
bool operator ==(Object other) {
- if (other is CallInfo) {
+ if (other is DartCallInfo) {
return inlined == other.inlined &&
function == other.function &&
filename == other.filename &&
@@ -1002,8 +1106,32 @@
return false;
}
+ @override
String toString() =>
- "${function} (${filename}:${line <= 0 ? "??" : line.toString()})";
+ "${function} (${filename}:${isInternal ? "??" : line.toString()})";
+}
+
+/// Represents the information for a call site located in a Dart stub.
+class StubCallInfo extends CallInfo {
+ final String name;
+ final int offset;
+
+ StubCallInfo({this.name, this.offset});
+
+ @override
+ int get hashCode => _hashFinish(
+ _hashCombine(_hashCombine(0, name.hashCode), offset.hashCode));
+
+ @override
+ bool operator ==(Object other) {
+ if (other is StubCallInfo) {
+ return name == other.name && offset == other.offset;
+ }
+ return false;
+ }
+
+ @override
+ String toString() => "${name} + ${offset}";
}
/// The instructions section in which a program counter address is located.
@@ -1042,14 +1170,15 @@
/// The DWARF debugging information for a Dart snapshot.
class Dwarf {
+ final Elf _elf;
final Map<int, _AbbreviationsTable> _abbreviationTables;
final DebugInfo _debugInfo;
final LineNumberInfo _lineNumberInfo;
final int _vmStartAddress;
final int _isolateStartAddress;
- Dwarf._(this._abbreviationTables, this._debugInfo, this._lineNumberInfo,
- this._vmStartAddress, this._isolateStartAddress);
+ Dwarf._(this._elf, this._abbreviationTables, this._debugInfo,
+ this._lineNumberInfo, this._vmStartAddress, this._isolateStartAddress);
/// Attempts to load the DWARF debugging information from the reader.
///
@@ -1072,8 +1201,8 @@
/// Returns a [Dwarf] object if the load succeeds, otherwise returns null.
static Dwarf fromFile(String path) => Dwarf.fromReader(Reader.fromFile(path));
- static const String _vmSymbol = "_kDartVmSnapshotInstructions";
- static const String _isolateSymbol = "_kDartIsolateSnapshotInstructions";
+ static const String _vmSymbolName = "_kDartVmSnapshotInstructions";
+ static const String _isolateSymbolName = "_kDartIsolateSnapshotInstructions";
static Dwarf _loadSectionsFromElf(Elf elf) {
final abbrevSection = elf.namedSections(".debug_abbrev").single;
@@ -1094,17 +1223,21 @@
final debugInfo = DebugInfo.fromReader(
infoSection.reader, abbreviationTables, lineNumberInfo);
- final vmStartAddress = elf.namedAddress(_vmSymbol);
- if (vmStartAddress == -1) {
- throw FormatException("Expected a dynamic symbol with name ${_vmSymbol}");
- }
- final isolateStartAddress = elf.namedAddress(_isolateSymbol);
- if (isolateStartAddress == -1) {
+ final vmStartSymbol = elf.dynamicSymbolFor(_vmSymbolName);
+ if (vmStartSymbol == null) {
throw FormatException(
- "Expected a dynamic symbol with name ${_isolateSymbol}");
+ "Expected a dynamic symbol with name ${_vmSymbolName}");
}
+ final vmStartAddress = vmStartSymbol.value;
- return Dwarf._(abbreviationTables, debugInfo, lineNumberInfo,
+ final isolateStartSymbol = elf.dynamicSymbolFor(_isolateSymbolName);
+ if (isolateStartSymbol == null) {
+ throw FormatException(
+ "Expected a dynamic symbol with name ${_isolateSymbolName}");
+ }
+ final isolateStartAddress = isolateStartSymbol.value;
+
+ return Dwarf._(elf, abbreviationTables, debugInfo, lineNumberInfo,
vmStartAddress, isolateStartAddress);
}
@@ -1116,9 +1249,19 @@
/// to user or library code is returned.
Iterable<CallInfo> callInfoFor(int address,
{bool includeInternalFrames = false}) {
- final calls = _debugInfo.callInfo(address);
+ var calls = _debugInfo.callInfo(address);
+ if (calls == null) {
+ // Since we're dealing with return addresses in stack frames, subtract
+ // one in case the return address is just off the end of the stub (since
+ // the calling instruction is before the return address).
+ final symbol = _elf.staticSymbolAt(address - 1);
+ if (symbol != null) {
+ final offset = address - symbol.value;
+ calls = <CallInfo>[StubCallInfo(name: symbol.name, offset: offset)];
+ }
+ }
if (calls != null && !includeInternalFrames) {
- return calls.where((CallInfo c) => c.line > 0);
+ return calls.where((CallInfo c) => !c.isInternal);
}
return calls;
}
@@ -1135,13 +1278,42 @@
}
}
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer
+ ..writeln('----------------------------------------')
+ ..writeln(' Abbreviation tables')
+ ..writeln('----------------------------------------')
+ ..writeln();
+ for (final offset in _abbreviationTables.keys) {
+ buffer..write('(Offset ')..write(paddedHex(offset, 4))..write(') ');
+ _abbreviationTables[offset].writeToStringBuffer(buffer);
+ }
+ buffer
+ ..writeln('----------------------------------------')
+ ..writeln(' Debug information')
+ ..writeln('----------------------------------------')
+ ..writeln();
+ _debugInfo.writeToStringBuffer(buffer);
+ buffer
+ ..writeln('----------------------------------------')
+ ..writeln(' Line number information')
+ ..writeln('----------------------------------------')
+ ..writeln();
+ _lineNumberInfo.writeToStringBuffer(buffer);
+ }
+
+ String dumpFileInfo() {
+ final buffer = StringBuffer();
+ _elf.writeToStringBuffer(buffer);
+ buffer.writeln();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
+ }
+
@override
- String toString() =>
- "DWARF debugging information:\n\n" +
- _abbreviationTables
- .map((int i, _AbbreviationsTable t) =>
- MapEntry(i, "(Offset ${paddedHex(i)}) $t"))
- .values
- .join() +
- "\n$_debugInfo\n$_lineNumberInfo";
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
+ }
}
diff --git a/pkg/native_stack_traces/lib/src/elf.dart b/pkg/native_stack_traces/lib/src/elf.dart
index da4efae..64b325a 100644
--- a/pkg/native_stack_traces/lib/src/elf.dart
+++ b/pkg/native_stack_traces/lib/src/elf.dart
@@ -189,29 +189,42 @@
}
}
- String toString() {
- var ret = "Format is ${wordSize * 8} bits\n";
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer..write('Format is ')..write(wordSize * 8)..write(' bits');
switch (endian) {
case Endian.little:
- ret += "Little-endian format\n";
+ buffer..writeln(' and little-endian');
break;
case Endian.big:
- ret += "Big-endian format\n";
+ buffer..writeln(' and big-endian');
break;
}
- ret += "Entry point: 0x${paddedHex(entry, wordSize)}\n"
- "Flags: 0x${paddedHex(flags, 4)}\n"
- "Header size: ${headerSize}\n"
- "Program header offset: "
- "0x${paddedHex(programHeaderOffset, wordSize)}\n"
- "Program header entry size: ${programHeaderEntrySize}\n"
- "Program header entry count: ${programHeaderCount}\n"
- "Section header offset: "
- "0x${paddedHex(sectionHeaderOffset, wordSize)}\n"
- "Section header entry size: ${sectionHeaderEntrySize}\n"
- "Section header entry count: ${sectionHeaderCount}\n"
- "Section header strings index: ${sectionHeaderStringsIndex}\n";
- return ret;
+ buffer
+ ..write('Entry point: 0x')
+ ..writeln(paddedHex(entry, wordSize))
+ ..write('Flags: 0x')
+ ..writeln(paddedHex(flags, 4))
+ ..write('Program header offset: 0x')
+ ..writeln(paddedHex(programHeaderOffset, wordSize))
+ ..write('Program header entry size: ')
+ ..writeln(programHeaderEntrySize)
+ ..write('Program header entry count: ')
+ ..writeln(programHeaderCount)
+ ..write('Section header offset: 0x')
+ ..writeln(paddedHex(sectionHeaderOffset, wordSize))
+ ..write('Section header entry size: ')
+ ..writeln(sectionHeaderEntrySize)
+ ..write('Section header entry count: ')
+ ..writeln(sectionHeaderCount)
+ ..write('Section header strings index: ')
+ ..write(sectionHeaderStringsIndex);
+ }
+
+ @override
+ String toString() {
+ var buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
}
}
@@ -269,14 +282,31 @@
return "unknown (${paddedHex(type, 4)})";
}
- String toString() => "Type: ${_typeToString(type)}\n"
- "Flags: 0x${paddedHex(flags, 4)}\n"
- "Offset: $offset (0x${paddedHex(offset, reader.wordSize)})\n"
- "Virtual address: 0x${paddedHex(vaddr, reader.wordSize)}\n"
- "Physical address: 0x${paddedHex(paddr, reader.wordSize)}\n"
- "Size in file: $filesz\n"
- "Size in memory: $memsz\n"
- "Alignment: 0x${paddedHex(align, reader.wordSize)}\n";
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer
+ ..write('Type: ')
+ ..writeln(_typeToString(type))
+ ..write('Flags: 0x')
+ ..writeln(paddedHex(flags, 4))
+ ..write('Offset: 0x')
+ ..writeln(paddedHex(offset, reader.wordSize))
+ ..write('Virtual address: 0x')
+ ..writeln(paddedHex(vaddr, reader.wordSize))
+ ..write('Physical address: 0x')
+ ..writeln(paddedHex(paddr, reader.wordSize))
+ ..write('Size in file: ')
+ ..writeln(filesz)
+ ..write('Size in memory')
+ ..writeln(memsz)
+ ..write('Alignment: 0x')
+ ..write(paddedHex(align, reader.wordSize));
+ }
+
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
+ }
}
class ProgramHeader {
@@ -303,12 +333,21 @@
}
}
- String toString() {
- var ret = "";
+ void writeToStringBuffer(StringBuffer buffer) {
for (var i = 0; i < length; i++) {
- ret += "Entry $i:\n${this[i]}\n";
+ if (i != 0) buffer..writeln()..writeln();
+ buffer
+ ..write('Entry ')
+ ..write(i)
+ ..writeln(':');
+ _entries[i].writeToStringBuffer(buffer);
}
- return ret;
+ }
+
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
}
}
@@ -316,7 +355,7 @@
final Reader reader;
int nameIndex;
- String name;
+ String _cachedName;
int type;
int flags;
int addr;
@@ -356,9 +395,11 @@
}
void setName(StringTable nameTable) {
- name = nameTable[nameIndex];
+ _cachedName = nameTable[nameIndex];
}
+ String get name => _cachedName != null ? _cachedName : '<${nameIndex}>';
+
static const _typeStrings = <int, String>{
_SHT_NULL: "SHT_NULL",
_SHT_PROGBITS: "SHT_PROGBITS",
@@ -377,16 +418,44 @@
return "unknown (${paddedHex(type, 4)})";
}
- String toString() => "Name: ${name} (@ ${nameIndex})\n"
- "Type: ${_typeToString(type)}\n"
- "Flags: 0x${paddedHex(flags, reader.wordSize)}\n"
- "Address: 0x${paddedHex(addr, reader.wordSize)}\n"
- "Offset: $offset (0x${paddedHex(offset, reader.wordSize)})\n"
- "Size: $size\n"
- "Link: $link\n"
- "Info: 0x${paddedHex(info, 4)}\n"
- "Address alignment: 0x${paddedHex(addrAlign, reader.wordSize)}\n"
- "Entry size: ${entrySize}\n";
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer.write('Name: ');
+ if (_cachedName != null) {
+ buffer
+ ..write('"')
+ ..write(name)
+ ..write('" (@ ')
+ ..write(nameIndex)
+ ..writeln(')');
+ } else {
+ buffer.writeln(name);
+ }
+ buffer
+ ..write('Type: ')
+ ..writeln(_typeToString(type))
+ ..write('Flags: 0x')
+ ..writeln(paddedHex(flags, reader.wordSize))
+ ..write('Address: 0x')
+ ..writeln(paddedHex(addr, reader.wordSize))
+ ..write('Offset: 0x')
+ ..writeln(paddedHex(offset, reader.wordSize))
+ ..write('Size: ')
+ ..writeln(size)
+ ..write('Link: ')
+ ..writeln(link)
+ ..write('Info: 0x')
+ ..writeln(paddedHex(info, 4))
+ ..write('Address alignment: 0x')
+ ..writeln(paddedHex(addrAlign, reader.wordSize))
+ ..write('Entry size: ')
+ ..write(entrySize);
+ }
+
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
+ }
}
class SectionHeader {
@@ -436,13 +505,22 @@
int get length => _entries.length;
SectionHeaderEntry operator [](int index) => _entries[index];
+ void writeToStringBuffer(StringBuffer buffer) {
+ for (var i = 0; i < length; i++) {
+ if (i != 0) buffer..writeln()..writeln();
+ buffer
+ ..write('Entry ')
+ ..write(i)
+ ..writeln(':');
+ _entries[i].writeToStringBuffer(buffer);
+ }
+ }
+
@override
String toString() {
- var ret = "";
- for (var i = 0; i < length; i++) {
- ret += "Entry $i:\n${this[i]}\n";
- }
- return ret;
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
}
}
@@ -467,33 +545,48 @@
int get virtualAddress => headerEntry.addr;
int get length => reader.bdata.lengthInBytes;
+
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer
+ ..write('Section "')
+ ..write(headerEntry.name)
+ ..write('" is unparsed and ')
+ ..write(length)
+ ..writeln(' bytes long.');
+ }
+
@override
- String toString() => "an unparsed section of ${length} bytes\n";
+ String toString() {
+ StringBuffer buffer;
+ writeToStringBuffer(buffer);
+ return buffer.toString();
+ }
}
class StringTable extends Section {
- final _entries = Map<int, String>();
+ final _entries;
- StringTable(SectionHeaderEntry entry, Reader reader) : super(entry, reader) {
- while (!reader.done) {
- _entries[reader.offset] = reader.readNullTerminatedString();
- }
- }
+ StringTable(SectionHeaderEntry entry, Reader reader)
+ : _entries = Map<int, String>.fromEntries(
+ reader.readRepeated((r) => r.readNullTerminatedString())),
+ super(entry, reader);
String operator [](int index) => _entries[index];
bool containsKey(int index) => _entries.containsKey(index);
@override
- String toString() {
- var buffer = StringBuffer("a string table:\n");
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer
+ ..write('Section "')
+ ..write(headerEntry.name)
+ ..writeln('" is a string table:');
for (var key in _entries.keys) {
buffer
- ..write(" ")
+ ..write(" ")
..write(key)
..write(" => ")
..writeln(_entries[key]);
}
- return buffer.toString();
}
}
@@ -562,37 +655,59 @@
SymbolType get type => SymbolType.values[info & 0x0f];
SymbolVisibility get visibility => SymbolVisibility.values[other & 0x03];
- @override
- String toString() {
- final buffer = StringBuffer("symbol ");
+ void writeToStringBuffer(StringBuffer buffer) {
if (name != null) {
- buffer..write('"')..write(name)..write('" ');
+ buffer..write('"')..write(name)..write('" =>');
+ } else {
+ buffer..write('<')..write(nameIndex)..write('> =>');
+ }
+ switch (bind) {
+ case SymbolBinding.STB_GLOBAL:
+ buffer..write(' a global');
+ break;
+ case SymbolBinding.STB_LOCAL:
+ buffer..write(' a local');
+ break;
+ }
+ switch (visibility) {
+ case SymbolVisibility.STV_DEFAULT:
+ break;
+ case SymbolVisibility.STV_HIDDEN:
+ buffer..write(' hidden');
+ break;
+ case SymbolVisibility.STV_INTERNAL:
+ buffer..write(' internal');
+ break;
+ case SymbolVisibility.STV_PROTECTED:
+ buffer..write(' protected');
+ break;
}
buffer
- ..write("(")
- ..write(nameIndex)
- ..write("): ")
- ..write(paddedHex(value, _wordSize))
- ..write(" ")
+ ..write(" symbol that points to ")
..write(size)
- ..write(" sec ")
- ..write(sectionIndex)
- ..write(" ")
- ..write(bind)
- ..write(" ")
- ..write(type)
- ..write(" ")
- ..write(visibility);
+ ..write(" bytes at location 0x")
+ ..write(paddedHex(value, _wordSize))
+ ..write(" in section ")
+ ..write(sectionIndex);
+ }
+
+ @override
+ String toString() {
+ final buffer = StringBuffer();
+ writeToStringBuffer(buffer);
return buffer.toString();
}
}
class SymbolTable extends Section {
- final Iterable<Symbol> _entries;
+ final List<Symbol> _entries;
final _nameCache = Map<String, Symbol>();
SymbolTable(SectionHeaderEntry entry, Reader reader)
- : _entries = reader.readRepeated(Symbol.fromReader),
+ : _entries = reader
+ .readRepeated(Symbol.fromReader)
+ .map((kv) => kv.value)
+ .toList(),
super(entry, reader);
void _cacheNames(StringTable stringTable) {
@@ -603,18 +718,21 @@
}
}
+ Iterable<String> get keys => _nameCache.keys;
Symbol operator [](String name) => _nameCache[name];
bool containsKey(String name) => _nameCache.containsKey(name);
@override
- String toString() {
- var buffer = StringBuffer("a symbol table:\n");
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer
+ ..write('Section "')
+ ..write(headerEntry.name)
+ ..writeln('" is a symbol table:');
for (var symbol in _entries) {
- buffer
- ..write(" ")
- ..writeln(symbol);
+ buffer.write(" ");
+ symbol.writeToStringBuffer(buffer);
+ buffer.writeln();
}
- return buffer.toString();
}
}
@@ -647,16 +765,16 @@
/// Returns null if the file does not start with the ELF magic number.
static Elf fromFile(String path) => Elf.fromReader(Reader.fromFile(path));
- /// The virtual address value of the dynamic symbol named [name].
+ /// Lookup of a dynamic symbol by name.
///
- /// Returns -1 if there is no dynamic symbol with that name.
- int namedAddress(String name) {
+ /// Returns -1 if there is no dynamic symbol that matches [name].
+ Symbol dynamicSymbolFor(String name) {
for (final SymbolTable dynsym in namedSections(".dynsym")) {
if (dynsym.containsKey(name)) {
- return dynsym[name].value;
+ return dynsym[name];
}
}
- return -1;
+ return null;
}
/// The [Section]s whose names match [name].
@@ -666,6 +784,20 @@
.map((entry) => _sections[entry]);
}
+ /// Reverse lookup of the static symbol that contains the given virtual
+ /// address. Returns null if no static symbol matching the address is found.
+ Symbol staticSymbolAt(int address) {
+ for (final SymbolTable table in namedSections('.symtab')) {
+ for (final name in table.keys) {
+ final symbol = table[name];
+ if (symbol.value <= address && address < (symbol.value + symbol.size)) {
+ return symbol;
+ }
+ }
+ }
+ return null;
+ }
+
static Elf _read(Reader startingReader) {
final header = ElfHeader.fromReader(startingReader.copy());
// Now use the word size and endianness information from the header.
@@ -681,48 +813,81 @@
entryCount: header.sectionHeaderCount,
stringsIndex: header.sectionHeaderStringsIndex);
final sections = <SectionHeaderEntry, Section>{};
- final dynsyms = Map<SectionHeaderEntry, SymbolTable>();
- final dynstrs = Map<SectionHeaderEntry, StringTable>();
for (var i = 0; i < sectionHeader.length; i++) {
final entry = sectionHeader[i];
if (i == header.sectionHeaderStringsIndex) {
sections[entry] = sectionHeader.nameTable;
continue;
}
- final section = Section.fromEntryAndReader(
+ sections[entry] = Section.fromEntryAndReader(
entry, reader.refocus(entry.offset, entry.size));
- // Store the dynamic symbol tables and dynamic string tables so we can
- // cache the symbol names afterwards.
- switch (entry.name) {
- case ".dynsym":
- dynsyms[entry] = section;
- break;
- case ".dynstr":
- dynstrs[entry] = section;
- break;
- default:
- break;
- }
- sections[entry] = section;
}
- dynsyms.forEach((entry, dynsym) {
- final linkEntry = sectionHeader[entry.link];
- if (!dynstrs.containsKey(linkEntry)) {
- throw FormatException(
- "String table not found at section header entry ${entry.link}");
+ void _cacheSymbolNames(String stringTableTag, String symbolTableTag) {
+ final stringTables = <SectionHeaderEntry, StringTable>{};
+ final symbolTables = <SymbolTable>[];
+ for (final entry in sections.keys) {
+ if (entry.name == stringTableTag) {
+ stringTables[entry] = sections[entry];
+ } else if (entry.name == symbolTableTag) {
+ symbolTables.add(sections[entry]);
+ }
}
- dynsym._cacheNames(dynstrs[linkEntry]);
- });
+ for (final symbolTable in symbolTables) {
+ final link = symbolTable.headerEntry.link;
+ final entry = sectionHeader[link];
+ if (!stringTables.containsKey(entry)) {
+ throw FormatException(
+ "String table not found at section header entry ${link}");
+ }
+ symbolTable._cacheNames(stringTables[entry]);
+ }
+ }
+
+ _cacheSymbolNames('.strtab', '.symtab');
+ _cacheSymbolNames('.dynstr', '.dynsym');
return Elf._(header, programHeader, sectionHeader, sections);
}
+ void writeToStringBuffer(StringBuffer buffer) {
+ buffer
+ ..writeln('-----------------------------------------------------')
+ ..writeln(' ELF header information')
+ ..writeln('-----------------------------------------------------')
+ ..writeln();
+ _header.writeToStringBuffer(buffer);
+ buffer
+ ..writeln()
+ ..writeln()
+ ..writeln('-----------------------------------------------------')
+ ..writeln(' Program header information')
+ ..writeln('-----------------------------------------------------')
+ ..writeln();
+ _programHeader.writeToStringBuffer(buffer);
+ buffer
+ ..writeln()
+ ..writeln()
+ ..writeln('-----------------------------------------------------')
+ ..writeln(' Section header information')
+ ..writeln('-----------------------------------------------------')
+ ..writeln();
+ _sectionHeader.writeToStringBuffer(buffer);
+ buffer
+ ..writeln()
+ ..writeln()
+ ..writeln('-----------------------------------------------------')
+ ..writeln(' Section information')
+ ..writeln('-----------------------------------------------------')
+ ..writeln();
+ for (final entry in _sections.keys) {
+ _sections[entry].writeToStringBuffer(buffer);
+ buffer.writeln();
+ }
+ }
+
@override
String toString() {
- String accumulateSection(String acc, SectionHeaderEntry entry) =>
- acc + "\nSection ${entry.name} is ${_sections[entry]}";
- return "Header information:\n\n${_header}"
- "\nProgram header information:\n\n${_programHeader}"
- "\nSection header information:\n\n${_sectionHeader}"
- "${_sections.keys.fold("", accumulateSection)}";
+ StringBuffer buffer = StringBuffer();
+ writeToStringBuffer(buffer);
+ return buffer.toString();
}
}
diff --git a/pkg/native_stack_traces/lib/src/reader.dart b/pkg/native_stack_traces/lib/src/reader.dart
index 3079094..8f6b637 100644
--- a/pkg/native_stack_traces/lib/src/reader.dart
+++ b/pkg/native_stack_traces/lib/src/reader.dart
@@ -123,9 +123,10 @@
return ret;
}
- Iterable<S> readRepeated<S>(S Function(Reader) callback) sync* {
+ Iterable<MapEntry<int, S>> readRepeated<S>(
+ S Function(Reader) callback) sync* {
while (!done) {
- yield callback(this);
+ yield MapEntry<int, S>(offset, callback(this));
}
}
@@ -156,7 +157,7 @@
}
String toString() {
- final buffer = new StringBuffer();
+ final buffer = StringBuffer();
buffer
..write("Start: 0x")
..write(paddedHex(start, wordSize))
diff --git a/pkg/native_stack_traces/pubspec.yaml b/pkg/native_stack_traces/pubspec.yaml
index aeccefc..e300e9e 100644
--- a/pkg/native_stack_traces/pubspec.yaml
+++ b/pkg/native_stack_traces/pubspec.yaml
@@ -1,6 +1,6 @@
name: native_stack_traces
description: Utilities for working with non-symbolic stack traces.
-version: 0.2.2
+version: 0.3.0
homepage: https://github.com/dart-lang/sdk/tree/master/pkg/native_stack_traces
diff --git a/pkg/nnbd_migration/README.md b/pkg/nnbd_migration/README.md
index b1d8f0a..4e46dd6 100644
--- a/pkg/nnbd_migration/README.md
+++ b/pkg/nnbd_migration/README.md
@@ -1,4 +1,85 @@
-# NNBD Migration Engine
+# Null Safety Migration Tooling
-This package provides infrastructure for migrating code to be non-nullable by
-default.
+Note: the null safety migration tooling and workflow is in an early state;
+this doc will be updated as the steps and workflow are simplified.
+
+## Building the NNBD sdk
+
+In order to run the tool currently you have to be able to build your own copy
+of the Dart SDK.
+
+To do this, run:
+
+```
+./tools/build.py -mrelease --nnbd create_sdk
+```
+
+The NNBD sdk now lives under the ReleaseX64NNBD sub-directory of your build
+directory, e.g.
+
+```
+xcodebuild/ReleaseX64NNBD/dart-sdk/
+```
+
+## Migrating a package
+
+- build a NNBD version of the SDK (see above)
+- select a package to work on
+- in that package, edit the `analysis_options.yaml` to enable the NNBD
+ experiment from the POV of the analyzer:
+```yaml
+analyzer:
+ enable-experiment:
+ - non-nullable
+```
+- run `pub get` for the package (and, verify that the
+ `.dart_tool/package_config.json` file was created)
+
+Then, run the migration tool from the top-level of the package directory:
+
+```
+<sdk-repo>/xcodebuild/ReleaseX64NNBD/dart migrate .
+```
+
+The migration tool will run, print the proposed changes to the console, and
+display a url for the preview tool. Open that url from a browser to see a rich
+preview of the proposed null safety changes.
+
+## Using the tool
+
+1. Run the tool (see above).
+2. Once analysis and migration suggestions are complete, open the indicated url
+in a browser.
+3. Start with an important or interesting file in your package on the left
+side by clicking on it.
+4. Look at the proposed edits in the upper right, and click on them in turn.
+5. If you see an edit that looks wrong:
+ 1. Use the "trace view" in the bottom right to find the root cause
+ 2. Go to your editor and make a change to the original file by adding a hint
+ (`String foo` ==> `String/*!*/ foo`) or making other changes as needed.
+ 3. You can have the migration tool perform this itself, although right now
+ for large packages this takes a prohibitively long time.
+ 1. ***Warning: DO NOT mix edits in your editor and edits applied by the
+ migration tool. We have not yet written the necessary logic to
+ prevent the migration tool from clobbering files edited while the
+ preview tool is running.***
+ 2. To try this, from the 'Edit Details' area in the bottom right select
+ the `Force type to be non-nullable` or `Force type to be nullable`
+ links. These will add the indicated hints on disk and recompute the
+ migration suggestions.
+6. After some edits are complete, control-C the migration and rerun it. If
+some things are still wrong, return to step 5.
+7. Once all edits are complete and you've rerun migration and are satisfied with
+the output:
+ 1. Save your work using git or other means. Applying the migration will
+ overwrite the existing files on disk.
+ 2. Rerun the migration with `--apply-changes`, or click the
+ `Apply Migration` button in the interface.
+8. Remove any SDK constraint in your pubspec.yaml.
+9. Remove any opt-out comments in your library files (e.g.: `// @dart = 2.6`).
+10. Rerun `pub get` and test your package.
+
+## Providing feedback
+
+Please file issues at https://github.com/dart-lang/sdk/issues, and reference the
+`analyzer-nnbd-migration` label (you may not be able to apply the label yourself).
diff --git a/pkg/nnbd_migration/lib/nnbd_migration.dart b/pkg/nnbd_migration/lib/nnbd_migration.dart
index bd2113c..16cdeed 100644
--- a/pkg/nnbd_migration/lib/nnbd_migration.dart
+++ b/pkg/nnbd_migration/lib/nnbd_migration.dart
@@ -86,6 +86,14 @@
kind: NullabilityFixKind.makeTypeNullable,
);
+ /// An explicit type mentioned in the source program does not need to be made
+ /// nullable.
+ factory NullabilityFixDescription.typeNotMadeNullable(String type) =>
+ NullabilityFixDescription._(
+ appliedMessage: "Type '$type' was not made nullable",
+ kind: NullabilityFixKind.typeNotMadeNullable,
+ );
+
const NullabilityFixDescription._(
{@required this.appliedMessage, @required this.kind});
@@ -117,9 +125,9 @@
discardIf,
discardThen,
makeTypeNullable,
- noModification,
removeAs,
removeNullAwareness,
+ typeNotMadeNullable,
}
/// Provisional API for DartFix to perform nullability migration.
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 6949482..021717b 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -893,7 +893,8 @@
List<DecoratedType> decoratedTypeArguments;
var typeArguments = node.constructorName.type.typeArguments;
List<EdgeOrigin> parameterEdgeOrigins;
- var target = NullabilityNodeTarget.codeRef('constructed type', node);
+ var target =
+ NullabilityNodeTarget.text('constructed type').withCodeRef(node);
if (typeArguments != null) {
typeArguments.accept(this);
typeArgumentTypes = typeArguments.arguments.map((t) => t.type);
@@ -999,7 +1000,8 @@
try {
var listType = node.staticType as InterfaceType;
if (node.typeArguments == null) {
- var target = NullabilityNodeTarget.codeRef('list element type', node);
+ var target =
+ NullabilityNodeTarget.text('list element type').withCodeRef(node);
var elementType = DecoratedType.forImplicitType(
typeProvider, listType.typeArguments[0], _graph, target);
instrumentation?.implicitTypeArguments(source, node, [elementType]);
@@ -1104,7 +1106,7 @@
@override
DecoratedType visitNullLiteral(NullLiteral node) {
_flowAnalysis.nullLiteral(node);
- var target = NullabilityNodeTarget.codeRef('null literal', node);
+ var target = NullabilityNodeTarget.text('null literal').withCodeRef(node);
var decoratedType = DecoratedType.forImplicitType(
typeProvider, node.staticType, _graph, target);
_graph.makeNullable(decoratedType.node, LiteralOrigin(source, node));
@@ -1223,7 +1225,8 @@
@override
DecoratedType visitRethrowExpression(RethrowExpression node) {
_flowAnalysis.handleExit();
- var target = NullabilityNodeTarget.codeRef('rethrow expression', node);
+ var target =
+ NullabilityNodeTarget.text('rethrow expression').withCodeRef(node);
var nullabilityNode = NullabilityNode.forInferredType(target);
_graph.makeNonNullable(nullabilityNode, ThrowOrigin(source, node));
return DecoratedType(node.staticType, nullabilityNode);
@@ -1235,7 +1238,8 @@
Expression returnValue = node.expression;
final isAsync = node.thisOrAncestorOfType<FunctionBody>().isAsynchronous;
if (returnValue == null) {
- var target = NullabilityNodeTarget.codeRef('implicit null return', node);
+ var target =
+ NullabilityNodeTarget.text('implicit null return').withCodeRef(node);
var implicitNullType = DecoratedType.forImplicitType(
typeProvider, typeProvider.nullType, _graph, target);
_graph.makeNullable(
@@ -1269,7 +1273,8 @@
try {
if (typeArguments == null) {
assert(setOrMapType.typeArguments.length == 1);
- var target = NullabilityNodeTarget.codeRef('set element type', node);
+ var target =
+ NullabilityNodeTarget.text('set element type').withCodeRef(node);
var elementType = DecoratedType.forImplicitType(
typeProvider, setOrMapType.typeArguments[0], _graph, target);
instrumentation?.implicitTypeArguments(source, node, [elementType]);
@@ -1294,12 +1299,13 @@
try {
if (typeArguments == null) {
assert(setOrMapType.typeArguments.length == 2);
- var targetKey = NullabilityNodeTarget.codeRef('map key type', node);
+ var targetKey =
+ NullabilityNodeTarget.text('map key type').withCodeRef(node);
var keyType = DecoratedType.forImplicitType(
typeProvider, setOrMapType.typeArguments[0], _graph, targetKey);
_currentMapKeyType = keyType;
var targetValue =
- NullabilityNodeTarget.codeRef('map value type', node);
+ NullabilityNodeTarget.text('map value type').withCodeRef(node);
var valueType = DecoratedType.forImplicitType(
typeProvider, setOrMapType.typeArguments[1], _graph, targetValue);
_currentMapValueType = valueType;
@@ -1375,7 +1381,8 @@
DecoratedType visitSpreadElement(SpreadElement node) {
final spreadType = node.expression.staticType;
DecoratedType spreadTypeDecorated;
- var target = NullabilityNodeTarget.codeRef('spread element type', node);
+ var target =
+ NullabilityNodeTarget.text('spread element type').withCodeRef(node);
if (_typeSystem.isSubtypeOf(spreadType, typeProvider.mapObjectObjectType)) {
assert(_currentMapKeyType != null && _currentMapValueType != null);
final expectedType = typeProvider.mapType2(
@@ -1418,8 +1425,8 @@
DecoratedType visitSuperConstructorInvocation(
SuperConstructorInvocation node) {
var callee = node.staticElement;
- var target =
- NullabilityNodeTarget.codeRef('super constructor invocation', node);
+ var target = NullabilityNodeTarget.text('super constructor invocation')
+ .withCodeRef(node);
var nullabilityNode = NullabilityNode.forInferredType(target);
var class_ = node.thisOrAncestorOfType<ClassDeclaration>();
var decoratedSupertype = _decoratedClassHierarchy.getDecoratedSupertype(
@@ -1485,7 +1492,8 @@
node.expression.accept(this);
// TODO(paulberry): do we need to check the expression type? I think not.
_flowAnalysis.handleExit();
- var target = NullabilityNodeTarget.codeRef('throw expression', node);
+ var target =
+ NullabilityNodeTarget.text('throw expression').withCodeRef(node);
var nullabilityNode = NullabilityNode.forInferredType(target);
_graph.makeNonNullable(nullabilityNode, ThrowOrigin(source, node));
return DecoratedType(node.staticType, nullabilityNode);
@@ -1601,6 +1609,29 @@
} else {
assert(_flowAnalysis != null);
}
+ var type = _variables.decoratedElementType(declaredElement);
+ var enclosingElement = declaredElement.enclosingElement;
+ if (!declaredElement.isStatic && enclosingElement is ClassElement) {
+ var overriddenElements = _inheritanceManager.getOverridden(
+ enclosingElement.thisType,
+ Name(enclosingElement.library.source.uri, declaredElement.name));
+ for (var overriddenElement
+ in overriddenElements ?? <ExecutableElement>[]) {
+ _handleFieldOverriddenDeclaration(
+ variable, type, enclosingElement, overriddenElement);
+ }
+ if (!declaredElement.isFinal) {
+ var overriddenElements = _inheritanceManager.getOverridden(
+ enclosingElement.thisType,
+ Name(enclosingElement.library.source.uri,
+ declaredElement.name + '='));
+ for (var overriddenElement
+ in overriddenElements ?? <ExecutableElement>[]) {
+ _handleFieldOverriddenDeclaration(
+ variable, type, enclosingElement, overriddenElement);
+ }
+ }
+ }
try {
if (declaredElement is PromotableElement) {
_flowAnalysis.declare(declaredElement, initializer != null);
@@ -1613,13 +1644,11 @@
// the variable isn't definitely assigned).
if (isTopLevel &&
!(declaredElement is FieldElement && !declaredElement.isStatic)) {
- var type = _variables.decoratedElementType(declaredElement);
_graph.makeNullable(
type.node, ImplicitNullInitializerOrigin(source, node));
}
} else {
- var destinationType = getOrComputeElementType(declaredElement);
- _handleAssignment(initializer, destinationType: destinationType);
+ _handleAssignment(initializer, destinationType: type);
}
if (isTopLevel) {
_flowAnalysis.finish();
@@ -1720,7 +1749,8 @@
/// Creates a type that can be used to check that an expression's value is
/// non-nullable.
DecoratedType _createNonNullableType(Expression expression) {
- var target = NullabilityNodeTarget.codeRef('expression type', expression);
+ var target =
+ NullabilityNodeTarget.text('expression type').withCodeRef(expression);
// Note: it's not necessary for the type to precisely match the type of the
// expression, since all we are going to do is cause a single graph edge to
// be built; it is sufficient to pass in any decorated type whose node is
@@ -1903,7 +1933,7 @@
typeProvider,
typeProvider.futureType2(type.type),
_graph,
- NullabilityNodeTarget.codeRef('implicit future', node),
+ NullabilityNodeTarget.text('implicit future').withCodeRef(node),
typeArguments: [type]);
@override
@@ -2200,6 +2230,45 @@
}
}
+ void _handleFieldOverriddenDeclaration(
+ VariableDeclaration node,
+ DecoratedType type,
+ ClassElement classElement,
+ Element overriddenElement) {
+ overriddenElement = overriddenElement.declaration;
+ var overriddenClass = overriddenElement.enclosingElement as ClassElement;
+ var decoratedSupertype = _decoratedClassHierarchy.getDecoratedSupertype(
+ classElement, overriddenClass);
+ var substitution = decoratedSupertype.asSubstitution;
+ if (overriddenElement is PropertyAccessorElement) {
+ DecoratedType unsubstitutedOverriddenType;
+ if (overriddenElement.isSynthetic) {
+ unsubstitutedOverriddenType =
+ _variables.decoratedElementType(overriddenElement.variable);
+ } else {
+ if (overriddenElement.isGetter) {
+ unsubstitutedOverriddenType =
+ _variables.decoratedElementType(overriddenElement).returnType;
+ } else {
+ unsubstitutedOverriddenType = _variables
+ .decoratedElementType(overriddenElement)
+ .positionalParameters[0];
+ }
+ }
+ var overriddenType = unsubstitutedOverriddenType.substitute(substitution);
+ if (overriddenElement.isGetter) {
+ _checkAssignment(ReturnTypeInheritanceOrigin(source, node),
+ source: type, destination: overriddenType, hard: true);
+ } else {
+ assert(overriddenElement.isSetter);
+ _checkAssignment(ParameterInheritanceOrigin(source, node),
+ source: overriddenType, destination: type, hard: true);
+ }
+ } else {
+ assert(false, 'Field overrides non-property-accessor');
+ }
+ }
+
void _handleForLoopParts(AstNode node, ForLoopParts parts, AstNode body,
DecoratedType Function(AstNode) bodyHandler) {
if (parts is ForParts) {
@@ -2218,6 +2287,7 @@
Element lhsElement;
if (parts is ForEachPartsWithDeclaration) {
var variableElement = parts.loopVariable.declaredElement;
+ _flowAnalysis.declare(variableElement, true);
lhsElement = variableElement;
parts.loopVariable?.type?.accept(this);
} else if (parts is ForEachPartsWithIdentifier) {
@@ -2294,7 +2364,7 @@
List<TypeParameterElement> constructorTypeParameters,
{DartType invokeType}) {
var typeFormals = constructorTypeParameters ?? calleeType.typeFormals;
- var target = NullabilityNodeTarget.codeRef('invocation', node);
+ var target = NullabilityNodeTarget.text('invocation').withCodeRef(node);
if (typeFormals.isNotEmpty) {
if (typeArguments != null) {
var argumentTypes = typeArguments.arguments
@@ -2505,7 +2575,8 @@
DecoratedType _makeNonNullableBoolType(Expression expression) {
assert(expression.staticType.isDartCoreBool);
- var target = NullabilityNodeTarget.codeRef('expression', expression);
+ var target =
+ NullabilityNodeTarget.text('expression').withCodeRef(expression);
var nullabilityNode = NullabilityNode.forInferredType(target);
_graph.makeNonNullableUnion(
nullabilityNode, NonNullableBoolTypeOrigin(source, expression));
@@ -2514,7 +2585,8 @@
DecoratedType _makeNonNullLiteralType(Expression expression,
{List<DecoratedType> typeArguments = const []}) {
- var target = NullabilityNodeTarget.codeRef('expression', expression);
+ var target =
+ NullabilityNodeTarget.text('expression').withCodeRef(expression);
var nullabilityNode = NullabilityNode.forInferredType(target);
_graph.makeNonNullableUnion(
nullabilityNode, LiteralOrigin(source, expression));
@@ -2523,7 +2595,8 @@
}
DecoratedType _makeNullableDynamicType(AstNode astNode) {
- var target = NullabilityNodeTarget.codeRef('dynamic type', astNode);
+ var target =
+ NullabilityNodeTarget.text('dynamic type').withCodeRef(astNode);
var decoratedType = DecoratedType.forImplicitType(
typeProvider, typeProvider.dynamicType, _graph, target);
_graph.makeNullable(
@@ -2532,7 +2605,7 @@
}
DecoratedType _makeNullableVoidType(SimpleIdentifier astNode) {
- var target = NullabilityNodeTarget.codeRef('void type', astNode);
+ var target = NullabilityNodeTarget.text('void type').withCodeRef(astNode);
var decoratedType = DecoratedType.forImplicitType(
typeProvider, typeProvider.voidType, _graph, target);
_graph.makeNullable(
@@ -2563,7 +2636,8 @@
}
var token = node.beginToken.lexeme;
- var target = NullabilityNodeTarget.codeRef('$token expression', node);
+ var target =
+ NullabilityNodeTarget.text('$token expression').withCodeRef(node);
if (_currentClassOrExtension is ClassElement) {
final type = (_currentClassOrExtension as ClassElement).thisType;
diff --git a/pkg/nnbd_migration/lib/src/edit_plan.dart b/pkg/nnbd_migration/lib/src/edit_plan.dart
index 6cb72cb..00931b3 100644
--- a/pkg/nnbd_migration/lib/src/edit_plan.dart
+++ b/pkg/nnbd_migration/lib/src/edit_plan.dart
@@ -69,19 +69,26 @@
/// if no characters should be inserted.
final String replacement;
+ /// If `true`, this edit shouldn't actually be made to the source file; it
+ /// exists merely to provide additional information to be shown in the preview
+ /// tool.
+ final bool isInformative;
+
/// Initialize an edit to delete [length] characters.
///
/// Optional argument [info] contains information about why the change was
/// made.
const AtomicEdit.delete(this.length, {this.info})
: assert(length > 0),
- replacement = '';
+ replacement = '',
+ isInformative = false;
/// Initialize an edit to insert the [replacement] characters.
///
/// Optional argument [info] contains information about why the change was
/// made.
- const AtomicEdit.insert(this.replacement, {this.info})
+ const AtomicEdit.insert(this.replacement,
+ {this.info, this.isInformative: false})
: assert(replacement.length > 0),
length = 0;
@@ -91,7 +98,8 @@
/// Optional argument [info] contains information about why the change was
/// made.
const AtomicEdit.replace(this.length, this.replacement, {this.info})
- : assert(length > 0 || replacement.length > 0);
+ : assert(length > 0 || replacement.length > 0),
+ isInformative = false;
/// Return `true` if this edit is a deletion (no characters added).
bool get isDeletion => replacement.length == 0;
@@ -255,6 +263,18 @@
_PassThroughBuilderImpl(node);
/// Creates a new edit plan that consists of executing [innerPlan], and then
+ /// appending an informative ` `, to illustrate that the type is non-nullable.
+ ///
+ /// Optional argument [info] contains information about why the change was
+ /// made.
+ NodeProducingEditPlan explainNonNullable(NodeProducingEditPlan innerPlan,
+ {AtomicEditInfo info}) {
+ assert(innerPlan.sourceNode is TypeAnnotation);
+ return surround(innerPlan,
+ suffix: [AtomicEdit.insert(' ', info: info, isInformative: true)]);
+ }
+
+ /// Creates a new edit plan that consists of executing [innerPlan], and then
/// removing from the source code any code that is in [sourceNode] but not in
/// [innerPlan.sourceNode]. This is intended to be used to drop unnecessary
/// syntax (for example, to drop an unnecessary cast).
@@ -1498,12 +1518,17 @@
extension AtomicEditList on List<AtomicEdit> {
/// Converts a list of [AtomicEdits] to a single [SourceEdit] by concatenating
/// them.
- SourceEdit toSourceEdit(int offset) {
+ ///
+ /// If [includeInformative] is `true`, informative edits are included;
+ /// otherwise they are ignored.
+ SourceEdit toSourceEdit(int offset, {bool includeInformative = false}) {
var totalLength = 0;
var replacement = '';
for (var edit in this) {
- totalLength += edit.length;
- replacement += edit.replacement;
+ if (!edit.isInformative || includeInformative) {
+ totalLength += edit.length;
+ replacement += edit.replacement;
+ }
}
return SourceEdit(offset, totalLength, replacement);
}
@@ -1514,16 +1539,24 @@
/// source file changes.
extension AtomicEditMap on Map<int, List<AtomicEdit>> {
/// Applies the changes to source file text.
- String applyTo(String code) {
- return SourceEdit.applySequence(code, toSourceEdits());
+ ///
+ /// If [includeInformative] is `true`, informative edits are included;
+ /// otherwise they are ignored.
+ String applyTo(String code, {bool includeInformative = false}) {
+ return SourceEdit.applySequence(
+ code, toSourceEdits(includeInformative: includeInformative));
}
/// Converts the changes to a list of [SourceEdit]s. The list is reverse
/// sorted by offset so that they can be applied in order.
- List<SourceEdit> toSourceEdits() {
+ ///
+ /// If [includeInformative] is `true`, informative edits are included;
+ /// otherwise they are ignored.
+ List<SourceEdit> toSourceEdits({bool includeInformative = false}) {
return [
for (var offset in keys.toList()..sort((a, b) => b.compareTo(a)))
- this[offset].toSourceEdit(offset)
+ this[offset]
+ .toSourceEdit(offset, includeInformative: includeInformative)
];
}
diff --git a/pkg/nnbd_migration/lib/src/fix_aggregator.dart b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
index 1aca2bc..a4c8043 100644
--- a/pkg/nnbd_migration/lib/src/fix_aggregator.dart
+++ b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
@@ -5,6 +5,8 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:nnbd_migration/instrumentation.dart';
import 'package:nnbd_migration/nnbd_migration.dart';
@@ -24,7 +26,35 @@
final EditPlanner planner;
- FixAggregator._(this.planner, this._changes);
+ /// Map from library to the prefix we should use when inserting code that
+ /// refers to it.
+ final Map<LibraryElement, String> _importPrefixes = {};
+
+ FixAggregator._(this.planner, this._changes,
+ CompilationUnitElement compilationUnitElement) {
+ for (var importElement in compilationUnitElement.library.imports) {
+ // TODO(paulberry): the `??=` should ensure that if there are two imports,
+ // one prefixed and one not, we prefer the prefix. Test this.
+ _importPrefixes[importElement.importedLibrary] ??=
+ importElement.prefix?.name;
+ }
+ }
+
+ /// Creates the necessary Dart code to refer to the given element, using an
+ /// import prefix if necessary.
+ ///
+ /// TODO(paulberry): if the element is not currently imported, we should
+ /// update or add an import statement as necessary.
+ String elementToCode(Element element) {
+ var name = element.name;
+ var library = element.library;
+ var prefix = _importPrefixes[library];
+ if (prefix != null) {
+ return '$prefix.$name';
+ } else {
+ return name;
+ }
+ }
/// Gathers all the changes to nodes descended from [node] into a single
/// [EditPlan].
@@ -57,6 +87,75 @@
}
}
+ /// Creates a string representation of the given type parameter element,
+ /// suitable for inserting into the user's source code.
+ String typeFormalToCode(TypeParameterElement formal) {
+ var bound = formal.bound;
+ if (bound == null ||
+ bound.isDynamic ||
+ (bound.isDartCoreObject &&
+ bound.nullabilitySuffix != NullabilitySuffix.none)) {
+ return formal.name;
+ }
+ return '${formal.name} extends ${typeToCode(bound)}';
+ }
+
+ String typeToCode(DartType type) {
+ // TODO(paulberry): is it possible to share code with DartType.toString()
+ // somehow?
+ String suffix =
+ type.nullabilitySuffix == NullabilitySuffix.question ? '?' : '';
+ if (type is InterfaceType) {
+ var name = elementToCode(type.element);
+ var typeArguments = type.typeArguments;
+ if (typeArguments.isEmpty) {
+ return '$name$suffix';
+ } else {
+ var args = [for (var arg in typeArguments) typeToCode(arg)].join(', ');
+ return '$name<$args>$suffix';
+ }
+ } else if (type is FunctionType) {
+ var buffer = StringBuffer();
+ buffer.write(typeToCode(type.returnType));
+ buffer.write(' Function');
+ var typeFormals = type.typeFormals;
+ if (typeFormals.isNotEmpty) {
+ var formals = [for (var formal in typeFormals) typeFormalToCode(formal)]
+ .join(', ');
+ buffer.write('<$formals>');
+ }
+ buffer.write('(');
+ String optionalOrNamedCloser = '';
+ bool commaNeeded = false;
+ for (var parameter in type.parameters) {
+ if (commaNeeded) {
+ buffer.write(', ');
+ } else {
+ commaNeeded = true;
+ }
+ if (optionalOrNamedCloser.isEmpty && !parameter.isRequiredPositional) {
+ if (parameter.isPositional) {
+ buffer.write('[');
+ optionalOrNamedCloser = ']';
+ } else {
+ buffer.write('{');
+ optionalOrNamedCloser = '}';
+ }
+ }
+ buffer.write(typeToCode(parameter.type));
+ if (parameter.isNamed) {
+ buffer.write(' ${parameter.name}');
+ }
+ }
+ buffer.write(optionalOrNamedCloser);
+ buffer.write(')');
+ buffer.write(suffix);
+ return buffer.toString();
+ } else {
+ return type.toString();
+ }
+ }
+
@override
void visitNode(AstNode node) {
var change = _changes[node];
@@ -76,7 +175,7 @@
{bool removeViaComments: false}) {
var planner = EditPlanner(unit.lineInfo, sourceText,
removeViaComments: removeViaComments);
- var aggregator = FixAggregator._(planner, changes);
+ var aggregator = FixAggregator._(planner, changes, unit.declaredElement);
unit.accept(aggregator);
if (aggregator._plans.isEmpty) return {};
EditPlan plan;
@@ -94,6 +193,10 @@
abstract class NodeChange<N extends AstNode> {
NodeChange._();
+ /// Indicates whether this node exists solely to provide informative
+ /// information.
+ bool get isInformative => false;
+
/// Applies this change to the given [node], producing an [EditPlan]. The
/// [aggregator] may be used to gather up any edits to the node's descendants
/// into their own [EditPlan]s.
@@ -289,7 +392,7 @@
AtomicEditInfo _addNullCheckInfo;
- String _introducesAsType;
+ DartType _introducesAsType;
AtomicEditInfo _introduceAsInfo;
@@ -308,7 +411,7 @@
/// Causes a cast to the given [type] to be added to this expression, with
/// the given [info].
- void introduceAs(String type, AtomicEditInfo info) {
+ void introduceAs(DartType type, AtomicEditInfo info) {
assert(!_addsNullCheck);
assert(_introducesAsType == null);
assert(type != null);
@@ -332,7 +435,7 @@
.addUnaryPostfix(innerPlan, TokenType.BANG, info: _addNullCheckInfo);
} else if (_introducesAsType != null) {
return aggregator.planner.addBinaryPostfix(
- innerPlan, TokenType.AS, _introducesAsType,
+ innerPlan, TokenType.AS, aggregator.typeToCode(_introducesAsType),
info: _introduceAsInfo);
} else {
return innerPlan;
@@ -461,20 +564,35 @@
/// Indicates whether the type should be made nullable by adding a `?`.
bool makeNullable = false;
- /// If [makeNullable] is `true`, the decorated type that results.
- DecoratedType makeNullableType;
+ /// The decorated type of the type annotation, or `null` if there is no
+ /// decorated type info of interest. If [makeNullable] is `true`, the node
+ /// from this type will be attached to the edit that adds the `?`. If
+ /// [makeNullable] is `false`, the node from this type will be attached to the
+ /// information about why the node wasn't made nullable.
+ DecoratedType decoratedType;
NodeChangeForTypeAnnotation() : super._();
@override
+ bool get isInformative => !makeNullable;
+
+ @override
EditPlan _apply(TypeAnnotation node, FixAggregator aggregator) {
var innerPlan = aggregator.innerPlanForNode(node);
- if (!makeNullable) return innerPlan;
- return aggregator.planner.makeNullable(innerPlan,
- info: AtomicEditInfo(
- NullabilityFixDescription.makeTypeNullable(
- makeNullableType.type.getDisplayString(withNullability: false)),
- [makeNullableType.node]));
+ if (decoratedType == null) return innerPlan;
+ if (makeNullable) {
+ return aggregator.planner.makeNullable(innerPlan,
+ info: AtomicEditInfo(
+ NullabilityFixDescription.makeTypeNullable(
+ decoratedType.type.getDisplayString(withNullability: false)),
+ [decoratedType.node]));
+ } else {
+ return aggregator.planner.explainNonNullable(innerPlan,
+ info: AtomicEditInfo(
+ NullabilityFixDescription.typeNotMadeNullable(
+ decoratedType.type.getDisplayString(withNullability: false)),
+ [decoratedType.node]));
+ }
}
}
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 098c842..76b1db7 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -32,6 +32,7 @@
import 'package:nnbd_migration/src/fix_aggregator.dart';
import 'package:nnbd_migration/src/nullability_node.dart';
import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
+import 'package:nnbd_migration/src/utilities/resolution_utils.dart';
import 'package:nnbd_migration/src/variables.dart';
/// Problem reported by [FixBuilder] when encountering a compound assignment
@@ -432,7 +433,7 @@
NullabilityFixDescription.checkExpression, checks.edges)
: null;
(_fixBuilder._getChange(node) as NodeChangeForExpression)
- .introduceAs(contextType.getDisplayString(withNullability: true), info);
+ .introduceAs(contextType, info);
_flowAnalysis.asExpression_end(node, contextType);
return contextType;
}
@@ -659,10 +660,10 @@
void visitGenericFunctionType(GenericFunctionType node) {
var decoratedType = _fixBuilder._variables
.decoratedTypeAnnotation(_fixBuilder.source, node);
- if (decoratedType.node.isNullable) {
+ if (!typeIsNonNullableByContext(node)) {
(_fixBuilder._getChange(node) as NodeChangeForTypeAnnotation)
- ..makeNullable = true
- ..makeNullableType = decoratedType;
+ ..makeNullable = decoratedType.node.isNullable
+ ..decoratedType = decoratedType;
}
(node as GenericFunctionTypeImpl).type =
_fixBuilder._variables.toFinalType(decoratedType);
@@ -673,11 +674,13 @@
void visitTypeName(TypeName node) {
var decoratedType = _fixBuilder._variables
.decoratedTypeAnnotation(_fixBuilder.source, node);
- var type = decoratedType.type;
- if (!type.isDynamic && !type.isVoid && decoratedType.node.isNullable) {
- (_fixBuilder._getChange(node) as NodeChangeForTypeAnnotation)
- ..makeNullable = true
- ..makeNullableType = decoratedType;
+ if (!typeIsNonNullableByContext(node)) {
+ var type = decoratedType.type;
+ if (!type.isDynamic && !type.isVoid) {
+ (_fixBuilder._getChange(node) as NodeChangeForTypeAnnotation)
+ ..makeNullable = decoratedType.node.isNullable
+ ..decoratedType = decoratedType;
+ }
}
node.type = _fixBuilder._variables.toFinalType(decoratedType);
super.visitTypeName(node);
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 132666e..e0e5a2f 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -22,6 +22,7 @@
import 'package:nnbd_migration/src/potential_modification.dart';
import 'package:nnbd_migration/src/utilities/completeness_tracker.dart';
import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
+import 'package:nnbd_migration/src/utilities/resolution_utils.dart';
import 'edge_origin.dart';
@@ -74,7 +75,7 @@
if (node.exceptionParameter != null) {
// If there is no `on Type` part of the catch clause, the type is dynamic.
if (exceptionType == null) {
- var target = NullabilityNodeTarget.codeRef('exception', node);
+ var target = NullabilityNodeTarget.text('exception').withCodeRef(node);
exceptionType = DecoratedType.forImplicitType(
_typeProvider, _typeProvider.dynamicType, _graph, target);
instrumentation?.implicitType(
@@ -85,7 +86,7 @@
}
if (node.stackTraceParameter != null) {
// The type of stack traces is always StackTrace (non-nullable).
- var target = NullabilityNodeTarget.codeRef('stack trace', node);
+ var target = NullabilityNodeTarget.text('stack trace').withCodeRef(node);
var nullabilityNode = NullabilityNode.forInferredType(target);
_graph.makeNonNullableUnion(nullabilityNode,
StackTraceTypeOrigin(source, node.stackTraceParameter));
@@ -273,6 +274,24 @@
}
@override
+ DecoratedType visitFormalParameterList(FormalParameterList node) {
+ int index = 0;
+ for (var parameter in node.parameters) {
+ var element = parameter.declaredElement;
+ NullabilityNodeTarget newTarget;
+ if (_target == null) {
+ newTarget = null;
+ } else if (element.isNamed) {
+ newTarget = _target.namedParameter(element.name);
+ } else {
+ newTarget = _target.positionalParameter(index++);
+ }
+ _pushNullabilityNodeTarget(newTarget, () => parameter.accept(this));
+ }
+ return null;
+ }
+
+ @override
DecoratedType visitFunctionDeclaration(FunctionDeclaration node) {
_handleExecutableDeclaration(
node,
@@ -398,8 +417,8 @@
DecoratedType visitTypeAnnotation(TypeAnnotation node) {
assert(node != null); // TODO(paulberry)
var type = node.type;
- var target =
- _target ?? NullabilityNodeTarget.codeRef('explicit type', node);
+ var target = (_target ?? NullabilityNodeTarget.text('explicit type'))
+ .withCodeRef(node);
if (type.isVoid || type.isDynamic) {
var nullabilityNode = NullabilityNode.forTypeAnnotation(target);
var decoratedType = DecoratedType(type, nullabilityNode);
@@ -457,13 +476,7 @@
}
}
NullabilityNode nullabilityNode;
- var parent = node.parent;
- if (parent is ExtendsClause ||
- parent is ImplementsClause ||
- parent is WithClause ||
- parent is OnClause ||
- parent is ClassTypeAlias ||
- parent is GenericTypeAlias) {
+ if (typeIsNonNullableByContext(node)) {
nullabilityNode = _graph.never;
} else {
nullabilityNode = NullabilityNode.forTypeAnnotation(target);
@@ -612,7 +625,7 @@
DecoratedType decoratedFunctionType;
try {
typeParameters?.accept(this);
- parameters?.accept(this);
+ _pushNullabilityNodeTarget(target, () => parameters?.accept(this));
redirectedConstructor?.accept(this);
initializers?.accept(this);
decoratedFunctionType = DecoratedType(functionType, _graph.never,
@@ -708,8 +721,8 @@
for (var supertype in supertypes) {
DecoratedType decoratedSupertype;
if (supertype == null) {
- var target =
- NullabilityNodeTarget.codeRef('implicit object supertype', astNode);
+ var target = NullabilityNodeTarget.text('implicit object supertype')
+ .withCodeRef(astNode);
var nullabilityNode = NullabilityNode.forInferredType(target);
_graph.makeNonNullableUnion(
nullabilityNode, NonNullableObjectSuperclass(source, astNode));
diff --git a/pkg/nnbd_migration/lib/src/nullability_node.dart b/pkg/nnbd_migration/lib/src/nullability_node.dart
index 506236e..6031c97 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node.dart
@@ -680,7 +680,7 @@
/// Creates a [NullabilityNode] representing the nullability of a variable
/// whose type is determined by the `??` operator.
factory NullabilityNode.forIfNotNull(AstNode node) => _NullabilityNodeSimple(
- NullabilityNodeTarget.codeRef('?? operator', node));
+ NullabilityNodeTarget.text('?? operator').withCodeRef(node));
/// Creates a [NullabilityNode] representing the nullability of a variable
/// whose type is determined by type inference.
diff --git a/pkg/nnbd_migration/lib/src/nullability_node_target.dart b/pkg/nnbd_migration/lib/src/nullability_node_target.dart
index c83ae21..61a46e6 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node_target.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node_target.dart
@@ -27,11 +27,6 @@
/// Data structure tracking information about which type in the user's source
/// code is referenced by a given nullability node.
abstract class NullabilityNodeTarget {
- /// Creates a [NullabilityNodeTarget] referring to a particular point in the
- /// source code.
- factory NullabilityNodeTarget.codeRef(String description, AstNode astNode) =
- _NullabilityNodeTarget_CodeRef;
-
/// Creates a [NullabilityNodeTarget] referring to a particular element.
factory NullabilityNodeTarget.element(Element element) =
_NullabilityNodeTarget_Element;
@@ -51,8 +46,15 @@
CodeReference get codeReference => null;
/// Gets a short description of this nullability node target suitable for
- /// displaying to the user.
- String get displayName;
+ /// displaying to the user, not including a code reference.
+ String get description;
+
+ /// Same as [description], but if there is a [codeReference], it is included
+ /// after the description in parentheses.
+ String get displayName {
+ if (codeReference == null) return description;
+ return '$description (${codeReference.shortName})';
+ }
/// Creates a new [NullabilityNodeTarget] representing a named function
/// parameter of this target.
@@ -77,21 +79,26 @@
/// function type parameter of this target.
NullabilityNodeTarget typeFormalBound(String typeFormalName) =>
_NullabilityNodeTarget_TypeFormalBound(this, typeFormalName);
+
+ /// Creates a [NullabilityNodeTarget] referring to a particular point in the
+ /// source code.
+ NullabilityNodeTarget withCodeRef(AstNode astNode) =>
+ _NullabilityNodeTarget_CodeRef(this, astNode);
}
/// Nullability node target representing a reference to a specific location in
/// source code.
class _NullabilityNodeTarget_CodeRef extends NullabilityNodeTarget {
- final String description;
+ final NullabilityNodeTarget inner;
final CodeReference codeReference;
- _NullabilityNodeTarget_CodeRef(this.description, AstNode astNode)
+ _NullabilityNodeTarget_CodeRef(this.inner, AstNode astNode)
: codeReference = CodeReference.fromAstNode(astNode),
super._();
@override
- String get displayName => '$description (${codeReference.shortName})';
+ String get description => inner.description;
}
/// Nullability node target representing the type of an element.
@@ -103,7 +110,7 @@
super._();
@override
- String get displayName => name;
+ String get description => name;
}
/// Nullability node target representing the type of a named function parameter.
@@ -115,7 +122,7 @@
: super(inner);
@override
- String get displayName => 'parameter $name of ${inner.displayName}';
+ String get description => 'parameter $name of ${inner.description}';
}
/// Nullability node target representing a type that forms part of a larger type
@@ -140,7 +147,7 @@
: super(inner);
@override
- String get displayName => 'parameter $index of ${inner.displayName}';
+ String get description => 'parameter $index of ${inner.description}';
}
/// Nullability node target representing a function's return type.
@@ -148,7 +155,7 @@
_NullabilityNodeTarget_ReturnType(NullabilityNodeTarget inner) : super(inner);
@override
- String get displayName => 'return type of ${inner.displayName}';
+ String get description => 'return type of ${inner.description}';
}
/// Nullability node target for which we only know a string description.
@@ -158,7 +165,7 @@
_NullabilityNodeTarget_Text(this.name) : super._();
@override
- String get displayName => name;
+ String get description => name;
}
/// Nullability node target representing a type argument of an interface type or
@@ -170,7 +177,7 @@
: super(inner);
@override
- String get displayName => 'type argument $index of ${inner.displayName}';
+ String get description => 'type argument $index of ${inner.description}';
}
/// Nullability node target representing a bound of a function type's formal
@@ -184,8 +191,8 @@
: super(inner);
@override
- String get displayName =>
- 'bound of type formal $typeFormalName of ${inner.displayName}';
+ String get description =>
+ 'bound of type formal $typeFormalName of ${inner.description}';
}
/// Nullability node target representing a type parameter bound.
@@ -197,5 +204,5 @@
super._();
@override
- String get displayName => 'bound of $name';
+ String get description => 'bound of $name';
}
diff --git a/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart b/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart
index d5d8170..81624db 100644
--- a/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart
@@ -2,8 +2,22 @@
// 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:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/type_provider.dart';
+/// Determines whether a type annotation's position in the AST makes it
+/// impossible to be nullable.
+bool typeIsNonNullableByContext(TypeAnnotation node) {
+ var parent = node.parent;
+ return parent is ExtendsClause ||
+ parent is ImplementsClause ||
+ parent is WithClause ||
+ parent is OnClause ||
+ parent is ClassTypeAlias ||
+ parent is GenericTypeAlias ||
+ parent is ConstructorName;
+}
+
/// This mixin provides utilities that are useful to visitors implementing
/// resolution-like behaviors.
mixin ResolutionUtils {
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 7a63ba6..06dd229 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -2053,6 +2053,32 @@
await _checkSingleFileChanges(content, expected);
}
+ Future<void> test_field_overrides_getter() async {
+ var content = '''
+abstract class C {
+ int get i;
+}
+class D implements C {
+ @override
+ final int i;
+ D._() : i = computeI();
+}
+int computeI() => null;
+''';
+ var expected = '''
+abstract class C {
+ int? get i;
+}
+class D implements C {
+ @override
+ final int? i;
+ D._() : i = computeI();
+}
+int? computeI() => null;
+''';
+ await _checkSingleFileChanges(content, expected);
+ }
+
Future<void> test_field_type_inferred() async {
var content = '''
int f() => null;
@@ -2161,6 +2187,28 @@
await _checkSingleFileChanges(content, expected);
}
+ Future<void> test_for_each_variable_initialized() async {
+ var content = '''
+int sum(List<int> list) {
+ int total = 0;
+ for (var i in list) {
+ total = total + i;
+ }
+ return total;
+}
+''';
+ var expected = '''
+int sum(List<int> list) {
+ int total = 0;
+ for (var i in list) {
+ total = total + i;
+ }
+ return total;
+}
+''';
+ await _checkSingleFileChanges(content, expected);
+ }
+
Future<void> test_function_expression() async {
var content = '''
int f(int i) {
@@ -2704,6 +2752,18 @@
await _checkSingleFileChanges(content, expected);
}
+ Future<void> test_insert_as_prefixed_type() async {
+ var content = '''
+import 'dart:async' as a;
+Future<int> f(Object o) => o;
+''';
+ var expected = '''
+import 'dart:async' as a;
+Future<int> f(Object o) => o as a.Future<int>;
+''';
+ await _checkSingleFileChanges(content, expected);
+ }
+
@FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/40871')
Future<void> test_insert_type_with_prefix() async {
var content = '''
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index a410270..9612cea 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -2705,6 +2705,22 @@
// metadata was visited.
}
+ Future<void> test_field_final_does_not_override_setter() async {
+ await analyze('''
+abstract class A {
+ void set i(int value);
+}
+abstract class C implements A {
+ final int i;
+ C(this.i);
+}
+''');
+ var baseNode = decoratedTypeAnnotation('int value').node;
+ var derivedNode = decoratedTypeAnnotation('int i').node;
+ assertNoEdge(derivedNode, baseNode);
+ assertNoEdge(baseNode, derivedNode);
+ }
+
Future<void> test_field_initialized_in_constructor() async {
await analyze('''
class C {
@@ -2731,6 +2747,67 @@
// metadata was visited.
}
+ Future<void> test_field_overrides_field() async {
+ await analyze('''
+abstract class A {
+ int i; // A
+}
+class C implements A {
+ int i; // C
+}
+''');
+ var baseNode = decoratedTypeAnnotation('int i; // A').node;
+ var derivedNode = decoratedTypeAnnotation('int i; // C').node;
+ assertEdge(baseNode, derivedNode, hard: true);
+ assertEdge(derivedNode, baseNode, hard: true);
+ }
+
+ Future<void> test_field_overrides_field_final() async {
+ await analyze('''
+abstract class A {
+ final int i; // A
+ A(this.i);
+}
+class C implements A {
+ int i; // C
+}
+''');
+ var baseNode = decoratedTypeAnnotation('int i; // A').node;
+ var derivedNode = decoratedTypeAnnotation('int i; // C').node;
+ assertEdge(derivedNode, baseNode, hard: true);
+ assertNoEdge(baseNode, derivedNode);
+ }
+
+ Future<void> test_field_overrides_getter() async {
+ await analyze('''
+abstract class A {
+ int get i;
+}
+class C implements A {
+ int i;
+}
+''');
+ var baseNode = decoratedTypeAnnotation('int get i').node;
+ var derivedNode = decoratedTypeAnnotation('int i').node;
+ assertEdge(derivedNode, baseNode, hard: true);
+ assertNoEdge(baseNode, derivedNode);
+ }
+
+ Future<void> test_field_overrides_setter() async {
+ await analyze('''
+abstract class A {
+ void set i(int value);
+}
+class C implements A {
+ int i;
+}
+''');
+ var baseNode = decoratedTypeAnnotation('int value').node;
+ var derivedNode = decoratedTypeAnnotation('int i').node;
+ assertEdge(baseNode, derivedNode, hard: true);
+ assertNoEdge(derivedNode, baseNode);
+ }
+
Future<void> test_field_static_implicitInitializer() async {
await analyze('''
class C {
diff --git a/pkg/nnbd_migration/test/edit_plan_test.dart b/pkg/nnbd_migration/test/edit_plan_test.dart
index 3d78101..5cb8c7f 100644
--- a/pkg/nnbd_migration/test/edit_plan_test.dart
+++ b/pkg/nnbd_migration/test/edit_plan_test.dart
@@ -40,9 +40,13 @@
await resolveTestUnit(code);
}
- Map<int, List<AtomicEdit>> checkPlan(EditPlan plan, String expected) {
+ Map<int, List<AtomicEdit>> checkPlan(EditPlan plan, String expected,
+ {String expectedIncludingInformative}) {
+ expectedIncludingInformative ??= expected;
var changes = planner.finalize(plan);
expect(changes.applyTo(code), expected);
+ expect(changes.applyTo(code, includeInformative: true),
+ expectedIncludingInformative);
return changes;
}
@@ -284,6 +288,15 @@
}
}
+ Future<void> test_explainNonNullable() async {
+ await analyze('int x = 0;');
+ checkPlan(
+ planner.explainNonNullable(
+ planner.passThrough(findNode.typeAnnotation('int'))),
+ 'int x = 0;',
+ expectedIncludingInformative: 'int x = 0;');
+ }
+
Future<void> test_extract_add_parens() async {
await analyze('f(g) => 1 * g(2, 3 + 4, 5);');
checkPlan(
diff --git a/pkg/nnbd_migration/test/fix_aggregator_test.dart b/pkg/nnbd_migration/test/fix_aggregator_test.dart
index 10cc5a8..e50444b 100644
--- a/pkg/nnbd_migration/test/fix_aggregator_test.dart
+++ b/pkg/nnbd_migration/test/fix_aggregator_test.dart
@@ -2,9 +2,13 @@
// 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:analyzer/analyzer.dart';
import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
import 'package:nnbd_migration/src/decorated_type.dart';
import 'package:nnbd_migration/src/edit_plan.dart';
import 'package:nnbd_migration/src/fix_aggregator.dart';
@@ -23,6 +27,10 @@
@reflectiveTest
class FixAggregatorTest extends FixAggregatorTestBase {
+ TypeProviderImpl get nnbdTypeProvider =>
+ (testAnalysisResult.typeProvider as TypeProviderImpl)
+ .asNonNullableByDefault;
+
Future<void> test_addRequired() async {
await analyze('f({int x}) => 0;');
var previewInfo = run({
@@ -374,28 +382,296 @@
// leave them.
await analyze('f(a, c) => a..b = (throw c..d);');
var cd = findNode.cascade('c..d');
- var previewInfo =
- run({cd: NodeChangeForExpression()..introduceAs('int', _MockInfo())});
+ var previewInfo = run({
+ cd: NodeChangeForExpression()
+ ..introduceAs(nnbdTypeProvider.intType, _MockInfo())
+ });
expect(
previewInfo.applyTo(code), 'f(a, c) => a..b = (throw (c..d) as int);');
}
+ Future<void> test_introduceAs_dynamic() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(nnbdTypeProvider.dynamicType, _MockInfo())
+ });
+ expect(previewInfo.applyTo(code), 'f(Object o) => o as dynamic;');
+ }
+
+ Future<void> test_introduceAs_favorPrefix() async {
+ await analyze('''
+import 'dart:async' as a;
+import 'dart:async';
+f(Object o) => o;
+''');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(nnbdTypeProvider.futureNullType, _MockInfo())
+ });
+ expect(previewInfo.applyTo(code), '''
+import 'dart:async' as a;
+import 'dart:async';
+f(Object o) => o as a.Future<Null>;
+''');
+ }
+
+ Future<void> test_introduceAs_functionType() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [],
+ parameters: [],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(previewInfo.applyTo(code), 'f(Object o) => o as bool Function();');
+ }
+
+ Future<void> test_introduceAs_functionType_formal_bound() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [
+ TypeParameterElementImpl.synthetic('T')
+ ..bound = nnbdTypeProvider.numType
+ ],
+ parameters: [],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(previewInfo.applyTo(code),
+ 'f(Object o) => o as bool Function<T extends num>();');
+ }
+
+ Future<void> test_introduceAs_functionType_formal_bound_dynamic() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [
+ TypeParameterElementImpl.synthetic('T')
+ ..bound = nnbdTypeProvider.dynamicType
+ ],
+ parameters: [],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(
+ previewInfo.applyTo(code), 'f(Object o) => o as bool Function<T>();');
+ }
+
+ Future<void> test_introduceAs_functionType_formal_bound_object() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [
+ TypeParameterElementImpl.synthetic('T')
+ ..bound = nnbdTypeProvider.objectType
+ ],
+ parameters: [],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(previewInfo.applyTo(code),
+ 'f(Object o) => o as bool Function<T extends Object>();');
+ }
+
+ Future<void>
+ test_introduceAs_functionType_formal_bound_object_question() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [
+ TypeParameterElementImpl.synthetic('T')
+ ..bound = (nnbdTypeProvider.objectType as TypeImpl)
+ .withNullability(NullabilitySuffix.question)
+ ],
+ parameters: [],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(
+ previewInfo.applyTo(code), 'f(Object o) => o as bool Function<T>();');
+ }
+
+ Future<void> test_introduceAs_functionType_formal_bound_question() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [
+ TypeParameterElementImpl.synthetic('T')
+ ..bound = (nnbdTypeProvider.numType as TypeImpl)
+ .withNullability(NullabilitySuffix.question)
+ ],
+ parameters: [],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(previewInfo.applyTo(code),
+ 'f(Object o) => o as bool Function<T extends num?>();');
+ }
+
+ Future<void> test_introduceAs_functionType_formals() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [
+ TypeParameterElementImpl.synthetic('T'),
+ TypeParameterElementImpl.synthetic('U')
+ ],
+ parameters: [],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(previewInfo.applyTo(code),
+ 'f(Object o) => o as bool Function<T, U>();');
+ }
+
+ Future<void> test_introduceAs_functionType_parameters() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [],
+ parameters: [
+ ParameterElementImpl.synthetic(
+ 'x', nnbdTypeProvider.intType, ParameterKind.REQUIRED),
+ ParameterElementImpl.synthetic(
+ 'y', nnbdTypeProvider.numType, ParameterKind.REQUIRED)
+ ],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(previewInfo.applyTo(code),
+ 'f(Object o) => o as bool Function(int, num);');
+ }
+
+ Future<void> test_introduceAs_functionType_parameters_named() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [],
+ parameters: [
+ ParameterElementImpl.synthetic(
+ 'x', nnbdTypeProvider.intType, ParameterKind.NAMED),
+ ParameterElementImpl.synthetic(
+ 'y', nnbdTypeProvider.numType, ParameterKind.NAMED)
+ ],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(previewInfo.applyTo(code),
+ 'f(Object o) => o as bool Function({int x, num y});');
+ }
+
+ Future<void> test_introduceAs_functionType_parameters_optional() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ FunctionTypeImpl(
+ returnType: nnbdTypeProvider.boolType,
+ typeFormals: [],
+ parameters: [
+ ParameterElementImpl.synthetic(
+ 'x', nnbdTypeProvider.intType, ParameterKind.POSITIONAL),
+ ParameterElementImpl.synthetic(
+ 'y', nnbdTypeProvider.numType, ParameterKind.POSITIONAL)
+ ],
+ nullabilitySuffix: NullabilitySuffix.none),
+ _MockInfo())
+ });
+ expect(previewInfo.applyTo(code),
+ 'f(Object o) => o as bool Function([int, num]);');
+ }
+
+ Future<void> test_introduceAs_interfaceType_parameterized() async {
+ await analyze('f(Object o) => o;');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(
+ nnbdTypeProvider.mapType2(
+ nnbdTypeProvider.intType, nnbdTypeProvider.boolType),
+ _MockInfo())
+ });
+ expect(previewInfo.applyTo(code), 'f(Object o) => o as Map<int, bool>;');
+ }
+
Future<void> test_introduceAs_no_parens() async {
await analyze('f(a, b) => a | b;');
var expr = findNode.binary('a | b');
- var previewInfo =
- run({expr: NodeChangeForExpression()..introduceAs('int', _MockInfo())});
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(nnbdTypeProvider.intType, _MockInfo())
+ });
expect(previewInfo.applyTo(code), 'f(a, b) => a | b as int;');
}
Future<void> test_introduceAs_parens() async {
await analyze('f(a, b) => a < b;');
var expr = findNode.binary('a < b');
- var previewInfo = run(
- {expr: NodeChangeForExpression()..introduceAs('bool', _MockInfo())});
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(nnbdTypeProvider.boolType, _MockInfo())
+ });
expect(previewInfo.applyTo(code), 'f(a, b) => (a < b) as bool;');
}
+ Future<void> test_introduceAs_usePrefix() async {
+ await analyze('''
+import 'dart:async' as a;
+f(Object o) => o;
+''');
+ var expr = findNode.simple('o;');
+ var previewInfo = run({
+ expr: NodeChangeForExpression()
+ ..introduceAs(nnbdTypeProvider.futureNullType, _MockInfo())
+ });
+ expect(previewInfo.applyTo(code), '''
+import 'dart:async' as a;
+f(Object o) => o as a.Future<Null>;
+''');
+ }
+
Future<void> test_keep_redundant_parens() async {
await analyze('f(a, b, c) => a + (b * c);');
var previewInfo = run({});
@@ -408,12 +684,33 @@
var previewInfo = run({
typeName: NodeChangeForTypeAnnotation()
..makeNullable = true
- ..makeNullableType = MockDecoratedType(
+ ..decoratedType = MockDecoratedType(
MockDartType(toStringValueWithoutNullability: 'int'))
});
expect(previewInfo.applyTo(code), 'f(int? x) {}');
}
+ Future<void> test_noChangeToTypeAnnotation() async {
+ await analyze('int x = 0;');
+ var typeName = findNode.typeName('int');
+ var previewInfo = run({
+ typeName: NodeChangeForTypeAnnotation()
+ ..decoratedType = MockDecoratedType(
+ MockDartType(toStringValueWithoutNullability: 'int'))
+ });
+ expect(previewInfo.applyTo(code), 'int x = 0;');
+ expect(previewInfo.applyTo(code, includeInformative: true), 'int x = 0;');
+ expect(previewInfo.values.single.single.info.description.appliedMessage,
+ "Type 'int' was not made nullable");
+ }
+
+ Future<void> test_noInfoForTypeAnnotation() async {
+ await analyze('int x = 0;');
+ var typeName = findNode.typeName('int');
+ var previewInfo = run({typeName: NodeChangeForTypeAnnotation()});
+ expect(previewInfo, null);
+ }
+
Future<void> test_nullCheck_index_cascadeResult() async {
await analyze('f(a) => a..[0].c;');
var index = findNode.index('[0]');
@@ -614,7 +911,7 @@
..removeNullAwareness = true,
typeAnnotation: NodeChangeForTypeAnnotation()
..makeNullable = true
- ..makeNullableType = MockDecoratedType(
+ ..decoratedType = MockDecoratedType(
MockDartType(toStringValueWithoutNullability: 'int'))
});
expect(previewInfo.applyTo(code), 'f(x) => x.m<int?>();');
diff --git a/pkg/nnbd_migration/test/fix_builder_test.dart b/pkg/nnbd_migration/test/fix_builder_test.dart
index bded508..228047a 100644
--- a/pkg/nnbd_migration/test/fix_builder_test.dart
+++ b/pkg/nnbd_migration/test/fix_builder_test.dart
@@ -46,6 +46,9 @@
static final isMakeNullable = TypeMatcher<NodeChangeForTypeAnnotation>()
.having((c) => c.makeNullable, 'makeNullable', true);
+ static final isExplainNonNullable = TypeMatcher<NodeChangeForTypeAnnotation>()
+ .having((c) => c.makeNullable, 'makeNullable', false);
+
static final isNullCheck = TypeMatcher<NodeChangeForExpression>()
.having((c) => c.addsNullCheck, 'addsNullCheck', true);
@@ -78,7 +81,16 @@
FixBuilder fixBuilder, AstNode scope) =>
{
for (var entry in fixBuilder.changes.entries)
- if (_isInScope(entry.key, scope)) entry.key: entry.value
+ if (_isInScope(entry.key, scope) && !entry.value.isInformative)
+ entry.key: entry.value
+ };
+
+ Map<AstNode, NodeChange> scopedInformative(
+ FixBuilder fixBuilder, AstNode scope) =>
+ {
+ for (var entry in fixBuilder.changes.entries)
+ if (_isInScope(entry.key, scope) && entry.value.isInformative)
+ entry.key: entry.value
};
Map<AstNode, Set<Problem>> scopedProblems(
@@ -1216,8 +1228,18 @@
void Function() x = _f;
}
''');
- visitTypeAnnotation(
- findNode.genericFunctionType('Function'), 'void Function()');
+ var genericFunctionType = findNode.genericFunctionType('Function');
+ visitTypeAnnotation(genericFunctionType, 'void Function()',
+ informative: {genericFunctionType: isExplainNonNullable});
+ }
+
+ Future<void> test_genericFunctionType_nonNullable_by_context() async {
+ await analyze('''
+typedef F = void Function();
+''');
+ var genericFunctionType = findNode.genericFunctionType('Function');
+ visitTypeAnnotation(genericFunctionType, 'void Function()',
+ informative: isEmpty);
}
Future<void> test_genericFunctionType_nullable() async {
@@ -2575,7 +2597,17 @@
int i = 0;
}
''');
- visitTypeAnnotation(findNode.typeAnnotation('int'), 'int');
+ var typeAnnotation = findNode.typeAnnotation('int');
+ visitTypeAnnotation(typeAnnotation, 'int',
+ informative: {typeAnnotation: isExplainNonNullable});
+ }
+
+ Future<void> test_typeName_simple_nonNullable_by_context() async {
+ await analyze('''
+class C extends Object {}
+''');
+ visitTypeAnnotation(findNode.typeAnnotation('Object'), 'Object',
+ informative: isEmpty);
}
Future<void> test_typeName_simple_nullable() async {
@@ -2715,13 +2747,15 @@
void visitTypeAnnotation(TypeAnnotation node, String expectedType,
{Map<AstNode, Matcher> changes = const <AstNode, Matcher>{},
- Map<AstNode, Set<Problem>> problems = const <AstNode, Set<Problem>>{}}) {
+ Map<AstNode, Set<Problem>> problems = const <AstNode, Set<Problem>>{},
+ dynamic informative = anything}) {
var fixBuilder = _createFixBuilder(node);
fixBuilder.visitAll();
var type = node.type;
expect(type.getDisplayString(withNullability: true), expectedType);
expect(scopedChanges(fixBuilder, node), changes);
expect(scopedProblems(fixBuilder, node), problems);
+ expect(scopedInformative(fixBuilder, node), informative);
}
AssignmentTargetInfo _computeAssignmentTargetInfo(
diff --git a/pkg/nnbd_migration/test/instrumentation_test.dart b/pkg/nnbd_migration/test/instrumentation_test.dart
index a27e8f4..3f20a56 100644
--- a/pkg/nnbd_migration/test/instrumentation_test.dart
+++ b/pkg/nnbd_migration/test/instrumentation_test.dart
@@ -29,7 +29,11 @@
@override
void changes(Source source, Map<int, List<AtomicEdit>> changes) {
expect(test.changes, isNull);
- test.changes = changes;
+ test.changes = {
+ for (var entry in changes.entries)
+ if (entry.value.any((edit) => !edit.isInformative))
+ entry.key: entry.value
+ };
}
@override
diff --git a/pkg/nnbd_migration/test/node_builder_test.dart b/pkg/nnbd_migration/test/node_builder_test.dart
index f6e8bbc..7a1fcf7 100644
--- a/pkg/nnbd_migration/test/node_builder_test.dart
+++ b/pkg/nnbd_migration/test/node_builder_test.dart
@@ -454,6 +454,24 @@
same(decoratedTypeAnnotation('V> {').node));
}
+ Future<void> test_displayName_explicitParameterType_named() async {
+ await analyze('void f({int x, int y}) {}');
+ expect(decoratedTypeAnnotation('int x').node.displayName,
+ 'parameter x of f (test.dart:1:9)');
+ expect(decoratedTypeAnnotation('int y').node.displayName,
+ 'parameter y of f (test.dart:1:16)');
+ }
+
+ Future<void> test_displayName_explicitParameterType_positional() async {
+ await analyze('void f(int x, int y, [int z]) {}');
+ expect(decoratedTypeAnnotation('int x').node.displayName,
+ 'parameter 0 of f (test.dart:1:8)');
+ expect(decoratedTypeAnnotation('int y').node.displayName,
+ 'parameter 1 of f (test.dart:1:15)');
+ expect(decoratedTypeAnnotation('int z').node.displayName,
+ 'parameter 2 of f (test.dart:1:23)');
+ }
+
Future<void> test_dynamic_type() async {
await analyze('''
dynamic f() {}
@@ -656,7 +674,8 @@
}
''');
var decoratedType = decoratedTypeAnnotation('int');
- expect(decoratedType.node.displayName, 'return type of C.f');
+ expect(
+ decoratedType.node.displayName, 'return type of C.f (test.dart:2:3)');
}
Future<void> test_function_generic_bounded() async {
@@ -903,7 +922,7 @@
expect(decoratedIntType.node, isNotNull);
expect(decoratedIntType.node, isNot(never));
expect(decoratedType.returnType.node.displayName,
- 'return type of explicit type (test.dart:1:8)');
+ 'parameter 0 of f (test.dart:1:8)');
}
Future<void> test_genericFunctionType_syntax_inferred_dynamic_return() async {
@@ -1010,7 +1029,8 @@
expect(decoratedType.typeFormals, isEmpty);
expect(decoratedType.positionalParameters[0],
same(decoratedTypeAnnotation('String')));
- expect(decoratedType.returnType.node.displayName, 'return type of F');
+ expect(decoratedType.returnType.node.displayName,
+ 'return type of F (test.dart:1:13)');
}
Future<void> test_interfaceType_generic_instantiate_to_dynamic() async {
@@ -1642,8 +1662,8 @@
decoratedType.returnType.node, TypeMatcher<NullabilityNodeMutable>());
expect(decoratedType.returnType.node,
isNot(same(typedefDecoratedType.returnType.node)));
- expect(
- typedefDecoratedType.returnType.node.displayName, 'return type of F');
+ expect(typedefDecoratedType.returnType.node.displayName,
+ 'return type of F (test.dart:1:9)');
expect(decoratedType.returnType.node.displayName,
'return type of explicit type (test.dart:2:1)');
_assertType(decoratedType.positionalParameters[0].type, 'String');
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 53d5295..18134be 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -120,6 +120,7 @@
mutation_observer: Skip # Skip tests on the VM if the package depends on dart:html
[ $runtime != vm ]
+dds/test/*: SkipByDesign # Only meant to run on vm
dev_compiler/test/options/*: SkipByDesign
front_end/test/hot_reload_e2e_test: Skip
frontend_server/test/*: SkipByDesign # Only meant to run on vm
diff --git a/pkg/telemetry/lib/crash_reporting.dart b/pkg/telemetry/lib/crash_reporting.dart
index 808c4ac..1590da8 100644
--- a/pkg/telemetry/lib/crash_reporting.dart
+++ b/pkg/telemetry/lib/crash_reporting.dart
@@ -126,15 +126,20 @@
}
final Chain chain = new Chain.forTrace(stackTrace);
- req.files.add(new http.MultipartFile.fromString(
- _stackTraceFileField, chain.terse.toString(),
- filename: _stackTraceFilename));
+ req.files.add(
+ new http.MultipartFile.fromString(
+ _stackTraceFileField,
+ chain.terse.toString(),
+ filename: _stackTraceFilename,
+ ),
+ );
for (var attachment in attachments) {
req.files.add(
new http.MultipartFile.fromString(
attachment._field,
attachment._value,
+ filename: attachment._field,
),
);
}
diff --git a/pkg/test_runner/lib/src/utils.dart b/pkg/test_runner/lib/src/utils.dart
index ca61d45..7daa0eb 100644
--- a/pkg/test_runner/lib/src/utils.dart
+++ b/pkg/test_runner/lib/src/utils.dart
@@ -27,8 +27,7 @@
"matcher",
"meta",
"path",
- "stack_trace",
- "unittest"
+ "stack_trace"
];
// TODO(nshahan): Grow this list until it matches the list above. We are
diff --git a/pkg/testing/lib/src/discover.dart b/pkg/testing/lib/src/discover.dart
index 9b82e8a..3fd09e9 100644
--- a/pkg/testing/lib/src/discover.dart
+++ b/pkg/testing/lib/src/discover.dart
@@ -64,9 +64,15 @@
return Uri.base.resolve(".packages");
}
+// TODO(eernst): Use `bool.hasEnvironment` below when possible;
+// for now we use a dual `defaultValue` rewrite.
+const _dartSdk = (String.fromEnvironment("DART_SDK", defaultValue: "1") ==
+ String.fromEnvironment("DART_SDK", defaultValue: "2"))
+ ? String.fromEnvironment("DART_SDK")
+ : null;
+
Uri computeDartSdk() {
- String dartSdkPath = Platform.environment["DART_SDK"] ??
- const String.fromEnvironment("DART_SDK");
+ String dartSdkPath = Platform.environment["DART_SDK"] ?? _dartSdk;
if (dartSdkPath != null) {
return Uri.base.resolveUri(new Uri.file(dartSdkPath));
} else {
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index d947d92..7109a15 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -820,6 +820,9 @@
library.importUri.toString() == 'dart:_internal') {
return false;
}
+ if (member is Procedure && member.isMemberSignature) {
+ return false;
+ }
return true;
}
diff --git a/pkg/vm/lib/transformations/list_factory_specializer.dart b/pkg/vm/lib/transformations/list_factory_specializer.dart
index ca9df25..ad989c3 100644
--- a/pkg/vm/lib/transformations/list_factory_specializer.dart
+++ b/pkg/vm/lib/transformations/list_factory_specializer.dart
@@ -7,25 +7,36 @@
import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart' show CoreTypes;
-/// Replaces new List() and new List(n) with VM-specific
-/// new _GrowableList(0) and new _List(n).
+/// Replaces invocation of List factory constructors with
+/// factories of VM-specific classes.
+///
+/// new List() => new _GrowableList(0)
+/// new List(n) => new _List(n)
+/// new List.filled(n, null, growable: true) => new _GrowableList(n)
+/// new List.filled(n, null) => new _List(n)
+///
void transformLibraries(List<Library> libraries, CoreTypes coreTypes) {
final transformer = new _ListFactorySpecializer(coreTypes);
libraries.forEach(transformer.visitLibrary);
}
class _ListFactorySpecializer extends Transformer {
- final Procedure _listFactory;
+ final Procedure _defaultListFactory;
+ final Procedure _listFilledFactory;
final Procedure _growableListFactory;
final Procedure _fixedListFactory;
_ListFactorySpecializer(CoreTypes coreTypes)
- : _listFactory = coreTypes.index.getMember('dart:core', 'List', ''),
+ : _defaultListFactory =
+ coreTypes.index.getMember('dart:core', 'List', ''),
+ _listFilledFactory =
+ coreTypes.index.getMember('dart:core', 'List', 'filled'),
_growableListFactory =
coreTypes.index.getMember('dart:core', '_GrowableList', ''),
_fixedListFactory =
coreTypes.index.getMember('dart:core', '_List', '') {
- assert(_listFactory.isFactory);
+ assert(_defaultListFactory.isFactory);
+ assert(_listFilledFactory.isFactory);
assert(_growableListFactory.isFactory);
assert(_fixedListFactory.isFactory);
}
@@ -34,15 +45,53 @@
visitStaticInvocation(StaticInvocation node) {
super.visitStaticInvocation(node);
- if (node.target == _listFactory) {
- if (node.arguments.positional.isEmpty) {
- return new StaticInvocation(_growableListFactory,
- new Arguments([new IntLiteral(0)], types: node.arguments.types))
- ..parent = node.parent
+ final target = node.target;
+ if (target == _defaultListFactory) {
+ final args = node.arguments;
+ if (args.positional.isEmpty) {
+ return StaticInvocation(_growableListFactory,
+ Arguments([new IntLiteral(0)], types: args.types))
..fileOffset = node.fileOffset;
} else {
- return new StaticInvocation(_fixedListFactory, node.arguments)
- ..parent = node.parent
+ return StaticInvocation(_fixedListFactory, args)
+ ..fileOffset = node.fileOffset;
+ }
+ } else if (target == _listFilledFactory) {
+ final args = node.arguments;
+ assert(args.positional.length == 2);
+ final length = args.positional[0];
+ final fill = args.positional[1];
+ if (fill is! NullLiteral &&
+ !(fill is ConstantExpression && fill.constant is NullConstant)) {
+ return node;
+ }
+ bool growable;
+ if (args.named.isEmpty) {
+ growable = false;
+ } else {
+ final namedArg = args.named.single;
+ assert(namedArg.name == 'growable');
+ final value = namedArg.value;
+ if (value is BoolLiteral) {
+ growable = value.value;
+ } else if (value is ConstantExpression) {
+ final constant = value.constant;
+ if (constant is BoolConstant) {
+ growable = constant.value;
+ } else {
+ return node;
+ }
+ } else {
+ return node;
+ }
+ }
+ if (growable) {
+ return StaticInvocation(
+ _growableListFactory, Arguments([length], types: args.types))
+ ..fileOffset = node.fileOffset;
+ } else {
+ return StaticInvocation(
+ _fixedListFactory, Arguments([length], types: args.types))
..fileOffset = node.fileOffset;
}
}
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
index 164a6e9..379c1ed 100644
--- a/pkg/vm/lib/transformations/type_flow/utils.dart
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -32,7 +32,7 @@
const bool.fromEnvironment('global.type.flow.scope.trace');
const int kScopeIndent =
- const int.fromEnvironment('global.type.flow.scope.indent');
+ const int.fromEnvironment('global.type.flow.scope.indent', defaultValue: 1);
/// Extended 'assert': always checks condition.
assertx(bool cond, {details}) {
@@ -57,7 +57,7 @@
"\u001b[35m", // magenta
"\u001b[36m", // cyan
];
- static const int _scopeIndent = kScopeIndent ?? 1;
+ static const int _scopeIndent = kScopeIndent;
int _scope = 0;
List<String> _scopePrefixes = <String>[""];
diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect
index d8c3913..4149a93 100644
--- a/pkg/vm/testcases/bytecode/asserts.dart.expect
+++ b/pkg/vm/testcases/bytecode/asserts.dart.expect
@@ -90,7 +90,7 @@
assert(condition);
}
static method test2(() →* dart.core::bool* condition, () →* dart.core::String* message) → void {
- assert([@vm.call-site-attributes.metadata=receiverType:() →* dart.core::bool*] condition.call(), [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::String*] message.call());
+ assert([@vm.call-site-attributes.metadata=receiverType:FunctionType()] condition.call(), [@vm.call-site-attributes.metadata=receiverType:FunctionType()] message.call());
}
static method main() → dynamic {}
}
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 558d02f..fd792c7 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -1770,13 +1770,13 @@
dart.core::print(<dart.core::Type*>[#lib::A::T1*, #lib::A::T2*, #lib::A::foo::T3*, #lib::A::foo::T4*, T5*, T6*, T7*, T8*]);
#lib::callWithArgs<#lib::A::T1*, #lib::A::T2*, #lib::A::foo::T3*, #lib::A::foo::T4*, T5*, T6*, T7*, T8*>();
};
- [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null?] nested3.call();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested3.call();
}
- [@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() →* void] nested2.call<#lib::C7*, #lib::C8*>();
- [@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() →* void] nested2.call<dart.core::List<#lib::C7*>*, dart.core::List<#lib::C8*>*>();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested2.call<#lib::C7*, #lib::C8*>();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested2.call<dart.core::List<#lib::C7*>*, dart.core::List<#lib::C8*>*>();
}
- [@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic>() →* void] nested1.call<#lib::C5*, #lib::C6*>();
- [@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic>() →* void] nested1.call<dart.core::List<#lib::C5*>*, dart.core::List<#lib::C6*>*>();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested1.call<#lib::C5*, #lib::C6*>();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested1.call<dart.core::List<#lib::C5*>*, dart.core::List<#lib::C6*>*>();
}
}
class B extends dart.core::Object {
@@ -1798,12 +1798,12 @@
z = x.{dart.core::num::+}(2);
w = this.{#lib::B::foo}.{dart.core::num::+}(y);
}
- [@vm.call-site-attributes.metadata=receiverType:() →* void] closure2.call();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] closure2.call();
dart.core::print(w);
}
};
- [@vm.call-site-attributes.metadata=receiverType:(dart.core::int*) →* dart.core::Null?] closure1.call(10);
- [@vm.call-site-attributes.metadata=receiverType:(dart.core::int*) →* dart.core::Null?] closure1.call(11);
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] closure1.call(10);
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] closure1.call(11);
dart.core::print(y);
dart.core::print(z);
}
@@ -1814,7 +1814,7 @@
() →* dart.core::Null? closure3 = () → dart.core::Null? {
this.{#lib::B::foo} = x;
};
- [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null?] closure3.call();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] closure3.call();
}
}
}
@@ -1827,8 +1827,8 @@
dart.core::List<dart.core::Function*>* getI = <dart.core::Function*>[];
dart.core::List<dart.core::Function*>* setI = <dart.core::Function*>[];
for (dart.core::int* i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
- [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function*>*] getI.{dart.core::List::add}(() → dart.core::int* => i.{dart.core::num::+}(delta));
- [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function*>*] setI.{dart.core::List::add}((dart.core::int* ii) → dart.core::Null? {
+ [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::List*)] getI.{dart.core::List::add}(() → dart.core::int* => i.{dart.core::num::+}(delta));
+ [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::List*)] setI.{dart.core::List::add}((dart.core::int* ii) → dart.core::Null? {
i = ii.{dart.core::num::+}(delta);
});
}
@@ -1842,7 +1842,7 @@
() →* dart.core::Null? inc = () → dart.core::Null? {
i = i.{dart.core::num::+}(1);
};
- [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null?] inc.call();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] inc.call();
dart.core::print(i);
}
}
@@ -1859,7 +1859,7 @@
method bar() → dynamic {
return () → dart.core::Null? {
function inner() → dart.core::Null? {}
- [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null?] inner.call();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] inner.call();
};
}
}
@@ -1873,18 +1873,18 @@
abstract method evalArg2() → dart.core::int*;
abstract method getE() → #lib::E*;
method testCallThroughGetter1() → dart.core::int*
- return let final dart.core::int* #t1 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t2 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:(dart.core::int*, dart.core::int*) →* dart.core::int*] this.{#lib::E::foo1}.call(#t1, #t2);
+ return let final dart.core::int* #t1 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t2 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:FunctionType()] this.{#lib::E::foo1}.call(#t1, #t2);
method testCallThroughGetter2() → dart.core::int*
- return let final dart.core::int* #t3 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t4 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:<T extends dart.core::Object* = dynamic>(T*, T*) →* dart.core::int*] this.{#lib::E::foo2}.call<dart.core::int*>(#t3, #t4);
+ return let final dart.core::int* #t3 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t4 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:FunctionType()] this.{#lib::E::foo2}.call<dart.core::int*>(#t3, #t4);
method testCallThroughGetter3() → dart.core::int*
- return let final #lib::E* #t5 = this.{#lib::E::getE}() in let final dart.core::int* #t6 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t7 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:<T extends dart.core::Object* = dynamic>(T*, T*) →* dart.core::int*] #t5.{#lib::E::foo2}.call<dart.core::int*>(#t6, #t7);
+ return let final #lib::E* #t5 = this.{#lib::E::getE}() in let final dart.core::int* #t6 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t7 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:FunctionType()] #t5.{#lib::E::foo2}.call<dart.core::int*>(#t6, #t7);
}
static method simpleClosure() → dart.core::int* {
dart.core::int* x = 5;
(dart.core::int*) →* dart.core::Null? inc = (dart.core::int* y) → dart.core::Null? {
x = x.{dart.core::num::+}(y);
};
- [@vm.call-site-attributes.metadata=receiverType:(dart.core::int*) →* dart.core::Null?] inc.call(3);
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] inc.call(3);
return x;
}
static method callWithArgs<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic, T3 extends dart.core::Object* = dynamic, T4 extends dart.core::Object* = dynamic, T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic, T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() → void {
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index 4bc3448..1d0580f 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -1033,7 +1033,7 @@
y = 3;
}
}
- [@vm.call-site-attributes.metadata=receiverType:() →* void] foo.call();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] foo.call();
dart.core::print(y);
}
on dynamic catch(final dynamic e, final dart.core::StackTrace* st) {
@@ -1099,7 +1099,7 @@
dart.core::print(x);
dart.core::print(y);
}
- [@vm.call-site-attributes.metadata=receiverType:() →* void] foo.call();
+ [@vm.call-site-attributes.metadata=receiverType:FunctionType()] foo.call();
continue #L4;
}
finally {
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index 02d8487..1293a71 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -706,7 +706,7 @@
if(y is #lib::C<dynamic, #lib::D::Q*, dart.core::List<#lib::D::P*>*>*) {
dart.core::print("22");
}
- [@vm.call-site-attributes.metadata=receiverType:#lib::D<#lib::D::P*, #lib::D::Q*>*] this.{#lib::D::foo} = y as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
+ [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::D*)] this.{#lib::D::foo} = y as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
}
method foo3<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic>(dynamic z) → dynamic {
if(z is #lib::A<#lib::D::foo3::T1*>*) {
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
index f99332f..80c11a9 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
@@ -6,22 +6,22 @@
RESULT: _T {}?
------------ #lib::bool_expressions ------------
t0* = _Call direct [#lib::foo] ()
-t1 = _TypeCheck (t0 against dart.core::bool) (for #lib::foo() as{TypeError,ForDynamic} dart.core::bool*)
+t1 = _TypeCheck (t0 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t2* = _Call direct [#lib::bar] ()
t3* = _Call [dart.core::num::+] (_T (dart.core::int)+, _T (dart.core::_Smi, 1))
-i_0 = _Join [dart.core::int*] (_T (dart.core::_Smi, 0), t3)
+i_0 = _Join [InterfaceType(Reference to root::dart:core::int*)] (_T (dart.core::_Smi, 0), t3)
t5* = _Call [dart.core::num::<] (i_0, _T (dart.core::_Smi, 10))
t6* = _Call direct [#lib::bar] ()
t7* = _Call direct [#lib::foo] ()
t8 = _Join [dynamic] (_T (dart.core::bool, true), t7)
-t9 = _TypeCheck (t8 against dart.core::bool) (for (x{dart.core::bool*} ?{dynamic} true : #lib::foo()) as{TypeError,ForDynamic} dart.core::bool*)
+t9 = _TypeCheck (t8 against dart.core::bool) (for AsExpression(ConditionalExpression(VariableGetImpl() ? BoolLiteral(true) : StaticInvocation(Reference to #lib::foo, ArgumentsImpl())) as InterfaceType(Reference to root::dart:core::bool*)))
t10* = _Call direct [#lib::bar] ()
t11* = _Call direct [#lib::bar] ()
t12* = _Call direct [#lib::foo] ()
-t13 = _TypeCheck (t12 against dart.core::bool) (for #lib::foo() as{TypeError,ForDynamic} dart.core::bool*)
+t13 = _TypeCheck (t12 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t14* = _Call direct [#lib::foo] ()
-t15 = _TypeCheck (t14 against dart.core::bool) (for #lib::foo() as{TypeError,ForDynamic} dart.core::bool*)
-y_0 = _Join [dart.core::bool*] (_T (dart.core::bool), _T (dart.core::bool, true))
+t15 = _TypeCheck (t14 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
+y_0 = _Join [InterfaceType(Reference to root::dart:core::bool*)] (_T (dart.core::bool), _T (dart.core::bool, true))
RESULT: _T {}?
------------ #lib::main ------------
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
index 50d02f9b..721f2bd 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
@@ -38,7 +38,7 @@
t6 = _Call [#lib::A::foo1] (%aa, _T (#lib::B))
t7 = _Narrow (%aa to _T ANY)
t8* = _Call get [#lib::A::foo2] (t7)
-t9 = _TypeCheck (t8 against dart.core::int) (for aa.{#lib::A::foo2} as{TypeError,ForDynamic} dart.core::int*)
+t9 = _TypeCheck (t8 against dart.core::int) (for AsExpression(PropertyGet(VariableGetImpl().foo2) as InterfaceType(Reference to root::dart:core::int*)))
t10 = _Call set [#lib::A::foo3] (t7, t9)
t11* = _Call get [#lib::A::foo1] (t7)
t12* = _Call get [#lib::A::foo2] (t7)
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect
index 7741659..b471e61 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect
@@ -9,18 +9,18 @@
RESULT: _T (dart.core::_OneByteString, abc)
------------ #lib::indexingIntoConstantList1 ------------
%i = _Parameter #0 [_T (dart.core::int)+?]
-t1 = _Join [dart.core::int*] (_T (dart.core::_Smi, 1), _T (dart.core::_Smi, 2), _T (dart.core::_Smi, 3))
+t1 = _Join [InterfaceType(Reference to root::dart:core::int*)] (_T (dart.core::_Smi, 1), _T (dart.core::_Smi, 2), _T (dart.core::_Smi, 3))
RESULT: t1
------------ #lib::indexingIntoConstantList2 ------------
%i = _Parameter #0 [_T (dart.core::int)+?]
-t1 = _Join [dart.core::Object*] (_T (dart.core::_OneByteString, hi), _T (dart.core::_Smi, 33), _T {}?, _T (dart.core::_Smi, -5))
+t1 = _Join [InterfaceType(Reference to root::dart:core::Object*)] (_T (dart.core::_OneByteString, hi), _T (dart.core::_Smi, 33), _T {}?, _T (dart.core::_Smi, -5))
RESULT: t1
------------ #lib::main ------------
RESULT: _T {}?
------------ #lib::_constList1 ------------
-RESULT: _T (dart.core::_ImmutableList, ListConstant<dart.core::int*>([1, 2, 3]))
+RESULT: _T (dart.core::_ImmutableList, ListConstant<InterfaceType(Reference to root::dart:core::int*)>([1, 2, 3]))
------------ #lib::_constList2 ------------
-RESULT: _T (dart.core::_ImmutableList, ListConstant<dart.core::Object*>([hi, 33, null, -5]))
+RESULT: _T (dart.core::_ImmutableList, ListConstant<InterfaceType(Reference to root::dart:core::Object*)>([hi, 33, null, -5]))
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
index eba9380..460c362 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
@@ -28,7 +28,7 @@
RESULT: t1
------------ #lib::TestEnum::values ------------
-RESULT: _T (dart.core::_ImmutableList, ListConstant<#lib::TestEnum*>([#lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, }, #lib::TestEnum {index: 1, #lib::_name: TestEnum.v2, }]))
+RESULT: _T (dart.core::_ImmutableList, ListConstant<InterfaceType(Reference to #lib::TestEnum*)>([#lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, }, #lib::TestEnum {index: 1, #lib::_name: TestEnum.v2, }]))
------------ #lib::TestEnum::v1 ------------
RESULT: _T (#lib::TestEnum, #lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, })
@@ -71,10 +71,10 @@
t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
t4* = _Call direct [#lib::foo] (_T (#lib::C2))
-t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t5 = _TypeCheck (t4 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t6 = _Call direct [#lib::C3::] (_T (#lib::C3))
t7* = _Call direct [#lib::foo] (_T (#lib::C3))
-t8 = _TypeCheck (t7 against dart.core::bool) (for #lib::foo(x = new #lib::C3::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t8 = _TypeCheck (t7 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
x_0 = _Join [dynamic] (_T (#lib::C2), _T (#lib::C3))
t10 = _Call direct [#lib::bar] (x_0)
RESULT: x_0
@@ -82,10 +82,10 @@
t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
t1 = _Call direct [#lib::C2::] (_T (#lib::C2))
t2* = _Call direct [#lib::foo] (_T (#lib::C2))
-t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t4 = _Call direct [#lib::C3::] (_T (#lib::C3))
t5* = _Call direct [#lib::foo] (_T (#lib::C3))
-t6 = _TypeCheck (t5 against dart.core::bool) (for #lib::foo(x = new #lib::C3::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t6 = _TypeCheck (t5 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t7 = _Call direct [#lib::bar] (_T (#lib::C3))
x_0 = _Join [dynamic] (_T (#lib::C2), _T (#lib::C3))
RESULT: x_0
@@ -99,12 +99,12 @@
%x = _Parameter #0 [_T (dart.core::bool)+?]
t1 = _Call direct [#lib::foo] (_T (dart.core::bool, true))
t2 = _Call direct [#lib::bar] (_T (dart.core::bool, false))
-x_0 = _Join [dart.core::bool*] (_T (dart.core::bool, true), _T (dart.core::bool, false))
+x_0 = _Join [InterfaceType(Reference to root::dart:core::bool*)] (_T (dart.core::bool, true), _T (dart.core::bool, false))
t4 = _Call direct [#lib::baz] (x_0)
RESULT: _T {}?
------------ #lib::if6b ------------
%x = _Parameter #0 [_T ANY?]
-t1 = _TypeCheck (%x against dart.core::bool) (for x as{TypeError,ForDynamic} dart.core::bool*)
+t1 = _TypeCheck (%x against dart.core::bool) (for AsExpression(VariableGetImpl() as InterfaceType(Reference to root::dart:core::bool*)))
t2 = _Call direct [#lib::foo] (_T (dart.core::bool, true))
t3 = _Call direct [#lib::bar] (_T (dart.core::bool, false))
x_0 = _Join [dynamic] (_T (dart.core::bool, true), _T (dart.core::bool, false))
@@ -138,12 +138,12 @@
t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
t4* = _Call direct [#lib::foo] (_T (#lib::C2))
-t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t5 = _TypeCheck (t4 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t6 = _Call direct [#lib::C3::] (_T (#lib::C3))
t7 = _Call direct [#lib::C4::] (_T (#lib::C4))
x_0 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C4))
t9 = _Call direct [#lib::foo] (x_0)
-t10 = _Join [dart.core::Object*] (_T (#lib::C3), _T (#lib::C4))
+t10 = _Join [InterfaceType(Reference to root::dart:core::Object*)] (_T (#lib::C3), _T (#lib::C4))
t11 = _Narrow (t10 to _T (dart.core::Object)+?)
t12 = _Call direct [#lib::bar] (t11)
RESULT: _T {}?
@@ -153,7 +153,7 @@
t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
t4* = _Call direct [#lib::foo] (_T (#lib::C2))
-t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t5 = _TypeCheck (t4 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t6 = _Call direct [#lib::C3::] (_T (#lib::C3))
t7 = _Call direct [#lib::C4::] (_T (#lib::C4))
t8* = _Call direct [#lib::foo] (_T (dart.core::_GrowableList<#lib::C4>))
@@ -165,7 +165,7 @@
t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C2))
t2* = _Call direct [#lib::foo] (x_0)
-t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x) as{TypeError,ForDynamic} dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t4 = _Call direct [#lib::C2::] (_T (#lib::C2))
t5 = _Call direct [#lib::bar] (x_0)
RESULT: x_0
@@ -177,13 +177,13 @@
t4 = _Call direct [#lib::bar] (_T (#lib::C2))
t5 = _Call direct [#lib::C3::] (_T (#lib::C3))
t6* = _Call direct [#lib::bar] (_T (#lib::C3))
-t7 = _TypeCheck (t6 against dart.core::bool) (for #lib::bar(x = new #lib::C3::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t7 = _TypeCheck (t6 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::bar, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
RESULT: _T (#lib::C3)
------------ #lib::loop3 ------------
t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
t1 = _Call direct [#lib::C2::] (_T (#lib::C2))
t2* = _Call direct [#lib::foo] (_T (#lib::C2))
-t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t4 = _Call direct [#lib::C3::] (_T (#lib::C3))
t5 = _Call direct [#lib::bar] (_T (#lib::C2))
RESULT: _T (#lib::C2)
@@ -204,10 +204,10 @@
t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C3))
t2* = _Call direct [#lib::foo] (x_0)
-t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x) as{TypeError,ForDynamic} dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t4 = _Call direct [#lib::C2::] (_T (#lib::C2))
t5* = _Call direct [#lib::bar] (_T (#lib::C2))
-t6 = _TypeCheck (t5 against dart.core::bool) (for #lib::bar(x) as{TypeError,ForDynamic} dart.core::bool*)
+t6 = _TypeCheck (t5 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::bar, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t7 = _Call direct [#lib::C3::] (_T (#lib::C3))
x_1 = _Join [dynamic] (x_0, _T (#lib::C2))
RESULT: x_1
@@ -216,10 +216,10 @@
x_1 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C2))
x_0 = _Join [dynamic] (_T (#lib::C1), x_1)
t3* = _Call direct [#lib::foo] (x_0)
-t4 = _TypeCheck (t3 against dart.core::bool) (for #lib::foo(x) as{TypeError,ForDynamic} dart.core::bool*)
+t4 = _TypeCheck (t3 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t5 = _Call direct [#lib::C2::] (_T (#lib::C2))
t6* = _Call direct [#lib::bar] (_T (#lib::C2))
-t7 = _TypeCheck (t6 against dart.core::bool) (for #lib::bar(x) as{TypeError,ForDynamic} dart.core::bool*)
+t7 = _TypeCheck (t6 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::bar, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
t8 = _Call direct [#lib::C3::] (_T (#lib::C3))
RESULT: x_0
------------ #lib::try1 ------------
@@ -272,7 +272,7 @@
RESULT: x_2
------------ #lib::cast1 ------------
%x = _Parameter #0 [_T ANY?]
-t1 = _TypeCheck (%x against #lib::C1) (for x as #lib::C1*)
+t1 = _TypeCheck (%x against #lib::C1) (for AsExpression(VariableGetImpl() as InterfaceType(Reference to #lib::C1*)))
t2 = _Call direct [#lib::foo] (t1)
t3 = _Call direct [#lib::bar] (t1)
RESULT: _T {}?
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
index 2aff27c..c6281be 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
@@ -11,11 +11,11 @@
%a2 = _Parameter #1 [_T (dart.core::Object)+?]
t2* = _Call direct get [#lib::someStatic] ()
t3 = _Call direct [#lib::A::] (_T (#lib::A))
-a1_0 = _Join [dart.core::Object*] (_T (#lib::A), %a1)
+a1_0 = _Join [InterfaceType(Reference to root::dart:core::Object*)] (_T (#lib::A), %a1)
t5 = _Call direct [#lib::bar] (a1_0, _T (dart.core::_Smi, 42))
t6 = _Call direct [#lib::B::] (_T (#lib::B))
t7* = _Call [dart.core::Object::==] (_T (#lib::B), %a2)
-t8 = _Join [dart.core::Object*] (_T (#lib::B), %a2)
+t8 = _Join [InterfaceType(Reference to root::dart:core::Object*)] (_T (#lib::B), %a2)
t9 = _Narrow (t8 to _T (dart.core::Object)+?)
RESULT: t9
------------ #lib::bar ------------
@@ -25,7 +25,7 @@
t3* = _Call [dart.core::num::+] (t2, %a2)
t4* = _Call [dart.core::num::*] (t3, _T (dart.core::_Smi, 3))
t5* = _Call [dart.core::int::unary-] (_T (dart.core::_Smi, 1))
-%result = _Join [dart.core::int*] (t4, t5)
+%result = _Join [InterfaceType(Reference to root::dart:core::int*)] (t4, t5)
RESULT: %result
------------ #lib::loop1 ------------
%a1 = _Parameter #0 [_T (dart.core::Object)+?]
@@ -35,10 +35,10 @@
------------ #lib::loop2 ------------
%x = _Parameter #0 [_T (dart.core::int)+?]
t1* = _Call [dart.core::num::+] (_T (dart.core::int)+, _T (dart.core::_Smi, 1))
-i_0 = _Join [dart.core::int*] (_T (dart.core::_Smi, 0), t1)
+i_0 = _Join [InterfaceType(Reference to root::dart:core::int*)] (_T (dart.core::_Smi, 0), t1)
t3* = _Call [dart.core::num::<] (i_0, _T (dart.core::_Smi, 5))
t4* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi, 10))
-x_0 = _Join [dart.core::int*] (%x, t4)
+x_0 = _Join [InterfaceType(Reference to root::dart:core::int*)] (%x, t4)
RESULT: x_0
------------ #lib::main ------------
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
index fd9dd20..6188f8a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
@@ -23,7 +23,7 @@
: super self::C::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method foo() → dynamic
- return [@vm.inferred-type.metadata=#lib::D<dart.core::String*>] super.{self::C::foo}();
+ return [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::String*)>] super.{self::C::foo}();
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method bar() → dynamic
return new self::D::•<self::E::S*>();
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method baz() → dynamic
@@ -59,18 +59,18 @@
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] method id3([@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.0)] generic-covariant-impl core::Comparable<self::C2::T*>* x) → dynamic
return x;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method id4([@vm.inferred-type.metadata=#lib::K<#lib::J*> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method id4([@vm.inferred-type.metadata=#lib::K<InterfaceType(Reference to #lib::J*)> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
return x;
}
static method main() → dynamic {
- core::print([@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::C::•<core::int*>().{self::C::foo}());
- core::print([@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}());
- core::print([@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}());
- core::print([@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}());
+ core::print([@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::int*)> (skip check)] new self::C::•<core::int*>().{self::C::foo}());
+ core::print([@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::String*)> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}());
+ core::print([@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::int*)> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}());
+ core::print([@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::String*)> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}());
self::C<self::X*>* c = new self::C::•<self::Y*>();
- [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C::id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
- [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C::id2] c.{self::C::id2}(new self::Z::•());
+ [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::C*)] [@vm.direct-call.metadata=#lib::C::id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
+ [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::C*)] [@vm.direct-call.metadata=#lib::C::id2] c.{self::C::id2}(new self::Z::•());
self::C2<core::num*>* c2 = new self::C2::•<core::num*>();
- [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2::id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
- [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2::id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J*>());
+ [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::C2*)] [@vm.direct-call.metadata=#lib::C2::id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
+ [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::C2*)] [@vm.direct-call.metadata=#lib::C2::id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J*>());
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
index 8c4940c..701445c 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
@@ -10,12 +10,12 @@
;
}
class InheritedElement extends self::Element {
-[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] final field core::Map<self::Element*, core::Object*>* _dependents = <self::Element*, core::Object*>{};
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<InterfaceType(Reference to #lib::Element*), InterfaceType(Reference to root::dart:core::Object*)>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] final field core::Map<self::Element*, core::Object*>* _dependents = <self::Element*, core::Object*>{};
synthetic constructor •() → self::InheritedElement*
: super self::Element::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method setDependencies([@vm.inferred-type.metadata=!] self::Element* dependent, [@vm.inferred-type.metadata=dart.core::_Smi?] core::Object* value) → void {
- [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element*, dart.core::Object*>*] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin::[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement::_dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
+ [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Map*)] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin::[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement::_dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<InterfaceType(Reference to #lib::Element*), InterfaceType(Reference to root::dart:core::Object*)>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
}
}
static method main() → dynamic {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
index 5ad5c41..9f278403 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
@@ -45,7 +45,7 @@
}
static method getList() → dynamic
return #C6;
-static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([1, 2, 3]))] dynamic arg1, [[@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([4, 5]))] dynamic arg2 = #C9]) → void {
+static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<InterfaceType(Reference to root::dart:core::int*)>([1, 2, 3]))] dynamic arg1, [[@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<InterfaceType(Reference to root::dart:core::int*)>([4, 5]))] dynamic arg2 = #C9]) → void {
core::print(arg1);
core::print(arg2);
}
@@ -56,5 +56,5 @@
self::testDouble(3.14);
self::testStrings(new self::A::•(), "bazz");
self::testPassEnum(#C11);
- self::testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([1, 2, 3]))] self::getList());
+ self::testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<InterfaceType(Reference to root::dart:core::int*)>([1, 2, 3]))] self::getList());
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect
index 2f98a40..c2edab0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect
@@ -3,6 +3,6 @@
import "dart:core" as core;
static method main() → dynamic {
- dynamic x = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] core::_List::•<core::int*>(10);
+ dynamic x = [@vm.inferred-type.metadata=dart.core::_List<InterfaceType(Reference to root::dart:core::int*)>] core::_List::•<core::int*>(10);
[@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.direct-call.metadata=dart.core::_List::[]] [@vm.inferred-type.metadata=int? (receiver not int)] x.[](0).+(10);
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
index be83db0..406725b 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
@@ -10,21 +10,21 @@
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method test2c([@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method test2r([@vm.inferred-type.metadata=#lib::C<dart.core::int*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method test3r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] method test4r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method test5r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16] method test6r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18] method test7r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20] method test8r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method test3c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to root::dart:core::int*)> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method test4c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to root::dart:core::int*)> (skip check)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method test2r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:core::int*)> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method test3r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::Future*)> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] method test4r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::Future*)> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method test5r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::FutureOr*)>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16] method test6r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::FutureOr*)> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18] method test7r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::FutureOr*)>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20] method test8r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::Future*)>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
}
static method main() → dynamic {
dynamic c = new self::C::•<core::int*>();
[@vm.direct-call.metadata=#lib::C::test2c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test2c(3);
- [@vm.direct-call.metadata=#lib::C::test3c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
- [@vm.direct-call.metadata=#lib::C::test4c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
+ [@vm.direct-call.metadata=#lib::C::test3c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to root::dart:core::int*)>] asy::Future::value<core::int*>(3));
+ [@vm.direct-call.metadata=#lib::C::test4c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to root::dart:core::int*)>] asy::Future::value<core::int*>(3));
[@vm.direct-call.metadata=#lib::C::test2r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test2r(new self::C::•<core::int*>());
[@vm.direct-call.metadata=#lib::C::test3r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3r(new self::C::•<asy::Future<core::int*>*>());
[@vm.direct-call.metadata=#lib::C::test4r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4r(new self::C::•<asy::Future<core::int*>*>());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
index d7385b2..f97cfd3 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
@@ -16,11 +16,11 @@
;
}
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
-static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
+static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] dynamic x) → void {}
static method foo1_a2([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
-static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
+static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] dynamic x) → void {}
static method foo1_a4([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
-static method foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B] self::A* a2, [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] asy::FutureOr<self::A*>* a4) → void {
+static method foo1([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B] self::A* a2, [@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] asy::FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] asy::FutureOr<self::A*>* a4) → void {
self::foo1_a1(a1);
self::foo1_a2(a2);
self::foo1_a3(a3);
@@ -37,8 +37,8 @@
self::foo2_a4(a4);
}
static method getDynamic() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
static method main(core::List<core::String*>* args) → dynamic {
- self::foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•(), [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•());
+ self::foo1([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•(), [@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•());
self::foo2(self::getDynamic() as{TypeError,ForDynamic} asy::Future<self::A*>*, self::getDynamic() as{TypeError,ForDynamic} self::A*, self::getDynamic() as{TypeError,ForDynamic} asy::FutureOr<self::A*>*, self::getDynamic() as{TypeError,ForDynamic} asy::FutureOr<self::A*>*);
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
index 6d5cf67..975ada1 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
@@ -64,7 +64,7 @@
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static field core::Object* field1 = [@vm.inferred-type.metadata=!] self::getValue();
static method getDynamic() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
static method getValue() → core::Object* {
self::A* aa = self::getDynamic() as{TypeError,ForDynamic} self::A*;
return [@vm.inferred-type.metadata=!] aa.{self::A::foo}();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
index 95c4d00..5685ec8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
@@ -33,7 +33,7 @@
static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
static method getDynamic() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
static method allocateB() → dynamic {
new self::B::•();
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
index 6149267..1718427 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
@@ -59,7 +59,7 @@
static method use3([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
static method getDynamic() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
static method allocateB() → dynamic {
new self::B::•();
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
index c86de6e..9321536 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
@@ -49,7 +49,7 @@
static method use_bazz(dynamic x) → dynamic
return [@vm.inferred-type.metadata=#lib::T3] x.bazz();
static method getDynamic() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
static method allocateA() → dynamic {
new self::A::•();
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
index 6698bb7..c4aba2f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
@@ -51,7 +51,7 @@
static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(aa);
static method getDynamic() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
static method setField2([@vm.inferred-type.metadata=#lib::A] self::A* aa, [@vm.inferred-type.metadata=#lib::T2] dynamic value) → void {
[@vm.direct-call.metadata=#lib::A::field2] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::field2} = value;
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
index 9372e70..fdbf579 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
@@ -28,8 +28,8 @@
: self::Q::result = result, super core::Object::•()
;
}
-static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1*>] core::List<self::T1*>* list) → dynamic {
- [@vm.direct-call.metadata=#lib::T3::run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1::go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q::result??] [@vm.direct-call.metadata=dart._internal::ListIterable::first] [@vm.inferred-type.metadata=#lib::Q?] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin::map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1*, ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1*>*>((self::T1* t1) → self::Q<self::T1*>* => new self::Q::•<self::T1*>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
+static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<InterfaceType(Reference to #lib::T1*)>] core::List<self::T1*>* list) → dynamic {
+ [@vm.direct-call.metadata=#lib::T3::run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1::go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q::result??] [@vm.direct-call.metadata=dart._internal::ListIterable::first] [@vm.inferred-type.metadata=#lib::Q?] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin::map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<InterfaceType(Reference to #lib::T1*), ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1*>*>((self::T1* t1) → self::Q<self::T1*>* => new self::Q::•<self::T1*>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
}
static method foo2NewValue() → self::Q<dynamic>*
return new self::Q::•<self::T2*>(new self::T2::•());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index fa129ad..52f7c57 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -49,11 +49,11 @@
return new self::T1::•();
}
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] no-such-method-forwarder get bar() → dynamic
- return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+ return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] no-such-method-forwarder method foo() → dynamic
- return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+ return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
- return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+ return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
}
abstract class C extends core::Object {
synthetic constructor •() → self::C*
@@ -68,11 +68,11 @@
: super self::C::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] no-such-method-forwarder get bar() → dynamic
- return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+ return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] no-such-method-forwarder method foo() → dynamic
- return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+ return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
- return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+ return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
}
class E extends core::Object implements self::A {
synthetic constructor •() → self::E*
@@ -82,7 +82,7 @@
return new self::T4::•();
}
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] no-such-method-forwarder get bar() → dynamic
- return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+ return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
}
class F extends core::Object {
synthetic constructor •() → self::F*
@@ -114,7 +114,7 @@
[@vm.inferred-type.metadata=#lib::D?]static field self::A* dd = new self::D::•();
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static method getDynamic() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
static method main(core::List<core::String*>* args) → dynamic {
core::print([@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::foo}());
core::print([@vm.direct-call.metadata=#lib::B::bar??] [@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bar});
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
index 0378cce..3a1361a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
@@ -49,9 +49,9 @@
[@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
}
static method getDynamic() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
static method use(dynamic x) → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call(x);
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call(x);
static method main(core::List<core::String*>* args) → dynamic {
self::func1(self::getDynamic() as{TypeError,ForDynamic} self::T0*);
self::use(#C1);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
index a7ca2b5..471beff 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
@@ -14,18 +14,18 @@
synthetic constructor •() → self::B*
: super core::Object::•()
;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<InterfaceType(Reference to root::dart:core::int*)>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
core::List<dynamic>* result = <dynamic>[];
while ([@vm.direct-call.metadata=dart._internal::ListIterator::moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] iter.{core::Iterator::moveNext}()) {
if([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart._internal::ListIterator::current] [@vm.inferred-type.metadata=int?] iter.{core::Iterator::current}.{core::num::<}(0)) {
return result;
}
- [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dynamic>*] [@vm.direct-call.metadata=dart.core::_GrowableList::add] [@vm.inferred-type.metadata=!? (skip check)] result.{core::List::add}(new self::A::•([@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] this.{self::B::_foo}(iter)));
+ [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::List*)] [@vm.direct-call.metadata=dart.core::_GrowableList::add] [@vm.inferred-type.metadata=!? (skip check)] result.{core::List::add}(new self::A::•([@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] this.{self::B::_foo}(iter)));
}
return result;
}
}
static method main() → void {
- core::List<dynamic>* list = [@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=dart.core::_GrowableList::iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>]<core::int*>[1, 2, 3].{core::Iterable::iterator});
+ core::List<dynamic>* list = [@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=dart.core::_GrowableList::iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<InterfaceType(Reference to root::dart:core::int*)>]<core::int*>[1, 2, 3].{core::Iterable::iterator});
core::print(list);
}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
index de17976..bb1f31d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
@@ -2,7 +2,7 @@
import self as self;
import "dart:core" as core;
-[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int*>* x) → dynamic
+[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<InterfaceType(Reference to root::dart:core::int*)>] core::List<core::int*>* x) → dynamic
return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=dart.core::_GrowableList::[]] [@vm.inferred-type.metadata=int? (skip check)] x.{core::List::[]}(0));
static method main() → dynamic
return [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::print([@vm.inferred-type.metadata=int] self::foo(<core::int*>[1]));
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
index ab1a24e..3b00d52 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
@@ -117,7 +117,7 @@
[@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function* unknown4 = () → dynamic => self::bb4;
static method test1() → void {
self::B1* bb = new self::B1::•();
- let final self::B1* #t1 = bb in let final core::int* #t2 = 1 in let final core::int* #t3 = 2 in let final core::int* #t4 = 3 in let final core::int* #t5 = 4 in let final self::T1* #t6 = new self::T1::•() in [@vm.call-site-attributes.metadata=receiverType:#lib::A1*] [@vm.direct-call.metadata=#lib::A1::call] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] #t1.{self::B1::aa1}.{self::A1::call}(#t2, #t3, #t4, #t5, #t6);
+ let final self::B1* #t1 = bb in let final core::int* #t2 = 1 in let final core::int* #t3 = 2 in let final core::int* #t4 = 3 in let final core::int* #t5 = 4 in let final self::T1* #t6 = new self::T1::•() in [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::A1*)] [@vm.direct-call.metadata=#lib::A1::call] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] #t1.{self::B1::aa1}.{self::A1::call}(#t2, #t3, #t4, #t5, #t6);
self::ok = false;
[@vm.direct-call.metadata=#lib::T1::doTest1??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::A1::foo] [@vm.inferred-type.metadata=#lib::T1?] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}.{self::A1::foo}.{self::T1::doTest1}();
exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
@@ -130,7 +130,7 @@
exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method getDynamic3() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown3.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown3.call();
static method test3() → void {
self::getDynamic3().aa3(1, 2, 3, 4, 5, 6, new self::T3::•());
self::ok = false;
@@ -138,7 +138,7 @@
exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method getDynamic4() → dynamic
- return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown4.call();
+ return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown4.call();
static method test4() → void {
self::getDynamic4().aa4(1, 2, 3, 4, 5, 6, 7, new self::T4::•());
self::ok = false;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
index e3c2996..f2aa9f5 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
@@ -25,5 +25,5 @@
return new self::B::•();
static method main(core::List<core::String*>* args) → dynamic {
core::Function* closure = () → self::B* => new self::B::•();
- new self::TearOffDynamicMethod::•([@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] closure.call());
+ new self::TearOffDynamicMethod::•([@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] closure.call());
}
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 6758942..cbe9222 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,8 +1,8 @@
# Changelog
## 4.0.0
-- **breaking**: RPCs which can return a `Sentinel` will now throw the `Sentinel`
- it is received as a response.
+- **breaking**: RPCs which can return a `Sentinel` will now throw a `SentinelException`
+ if a `Sential` is received as a response.
- **breaking**: RPCs which can return multiple values now return
`Future<Response>` rather than `Future<dynamic>`.
- `RPCError` now implements `Exception`.
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index d7395fc..abf3f53 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -530,7 +530,10 @@
]
args = []
if (use_nnbd) {
- args += [ "--enable-experiment=non-nullable" ]
+ args += [
+ "--enable-experiment=non-nullable",
+ "--null-safety",
+ ]
}
args += [
"--deterministic",
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 0ac8065..886970e 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -763,7 +763,7 @@
Namespace* namespc = Namespace::GetNamespace(args, 0);
const char* path_1 = DartUtils::GetNativeStringArgument(args, 1);
const char* path_2 = DartUtils::GetNativeStringArgument(args, 2);
- File::Identical result = File::AreIdentical(namespc, path_1, path_2);
+ File::Identical result = File::AreIdentical(namespc, path_1, namespc, path_2);
if (result == File::kError) {
Dart_SetReturnValue(args, DartUtils::NewDartOSError());
} else {
@@ -1455,7 +1455,7 @@
CObjectString path1(request[1]);
CObjectString path2(request[2]);
File::Identical result =
- File::AreIdentical(namespc, path1.CString(), path2.CString());
+ File::AreIdentical(namespc, path1.CString(), namespc, path2.CString());
if (result == File::kError) {
return CObject::NewOSError();
}
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index ac89688..642ba9e 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -250,8 +250,9 @@
static const char* PathSeparator();
static const char* StringEscapedPathSeparator();
static Type GetType(Namespace* namespc, const char* path, bool follow_links);
- static Identical AreIdentical(Namespace* namespc,
+ static Identical AreIdentical(Namespace* namespc_1,
const char* file_1,
+ Namespace* namespc_2,
const char* file_2);
static StdioHandleType GetStdioHandleType(int fd);
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 151c969..51a7599 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -702,22 +702,28 @@
return kOther;
}
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
const char* file_1,
+ Namespace* namespc_2,
const char* file_2) {
- NamespaceScope ns1(namespc, file_1);
- NamespaceScope ns2(namespc, file_2);
struct stat file_1_info;
struct stat file_2_info;
- int status = TEMP_FAILURE_RETRY(
- fstatat(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
- if (status == -1) {
- return File::kError;
+ int status;
+ {
+ NamespaceScope ns1(namespc_1, file_1);
+ status = TEMP_FAILURE_RETRY(
+ fstatat(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
+ if (status == -1) {
+ return File::kError;
+ }
}
- status = TEMP_FAILURE_RETRY(
- fstatat(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
- if (status == -1) {
- return File::kError;
+ {
+ NamespaceScope ns2(namespc_2, file_2);
+ status = TEMP_FAILURE_RETRY(
+ fstatat(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
+ if (status == -1) {
+ return File::kError;
+ }
}
return ((file_1_info.st_ino == file_2_info.st_ino) &&
(file_1_info.st_dev == file_2_info.st_dev))
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index 0fde6ae..354dd65 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -655,22 +655,28 @@
return kOther;
}
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
const char* file_1,
+ Namespace* namespc_2,
const char* file_2) {
- NamespaceScope ns1(namespc, file_1);
- NamespaceScope ns2(namespc, file_2);
struct stat file_1_info;
struct stat file_2_info;
- int status = TEMP_FAILURE_RETRY(
- fstatat(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
- if (status == -1) {
- return File::kError;
+ int status;
+ {
+ NamespaceScope ns1(namespc_1, file_1);
+ status = TEMP_FAILURE_RETRY(
+ fstatat(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
+ if (status == -1) {
+ return File::kError;
+ }
}
- status = TEMP_FAILURE_RETRY(
- fstatat(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
- if (status == -1) {
- return File::kError;
+ {
+ NamespaceScope ns2(namespc_2, file_2);
+ status = TEMP_FAILURE_RETRY(
+ fstatat(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
+ if (status == -1) {
+ return File::kError;
+ }
}
return ((file_1_info.st_ino == file_2_info.st_ino) &&
(file_1_info.st_dev == file_2_info.st_dev))
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index e8efaa1..16c1770 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -699,22 +699,28 @@
return kOther;
}
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
const char* file_1,
+ Namespace* namespc_2,
const char* file_2) {
- NamespaceScope ns1(namespc, file_1);
- NamespaceScope ns2(namespc, file_2);
struct stat64 file_1_info;
struct stat64 file_2_info;
- int status = TEMP_FAILURE_RETRY(
- fstatat64(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
- if (status == -1) {
- return File::kError;
+ int status;
+ {
+ NamespaceScope ns1(namespc_1, file_1);
+ status = TEMP_FAILURE_RETRY(
+ fstatat64(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
+ if (status == -1) {
+ return File::kError;
+ }
}
- status = TEMP_FAILURE_RETRY(
- fstatat64(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
- if (status == -1) {
- return File::kError;
+ {
+ NamespaceScope ns2(namespc_2, file_2);
+ status = TEMP_FAILURE_RETRY(
+ fstatat64(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
+ if (status == -1) {
+ return File::kError;
+ }
}
return ((file_1_info.st_ino == file_2_info.st_ino) &&
(file_1_info.st_dev == file_2_info.st_dev))
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index d763add..bc6ef93 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -619,9 +619,12 @@
return kOther;
}
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
const char* file_1,
+ Namespace* namespc_2,
const char* file_2) {
+ USE(namespc_1);
+ USE(namespc_2);
struct stat file_1_info;
struct stat file_2_info;
if ((NO_RETRY_EXPECTED(lstat(file_1, &file_1_info)) == -1) ||
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index bc4c6b1..2dc6b95 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -760,9 +760,12 @@
return result;
}
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
const char* file_1,
+ Namespace* namespc_2,
const char* file_2) {
+ USE(namespc_1);
+ USE(namespc_2);
BY_HANDLE_FILE_INFORMATION file_info[2];
const char* file_names[2] = {file_1, file_2};
for (int i = 0; i < 2; ++i) {
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index f34671c..155d415 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -82,6 +82,7 @@
V(Filter_Process, 4) \
V(Filter_Processed, 3) \
V(InternetAddress_Parse, 1) \
+ V(InternetAddress_RawAddrToString, 1) \
V(IOService_NewServicePort, 0) \
V(Namespace_Create, 2) \
V(Namespace_GetDefault, 0) \
@@ -130,11 +131,14 @@
V(SecurityContext_UseCertificateChainBytes, 3) \
V(ServerSocket_Accept, 2) \
V(ServerSocket_CreateBindListen, 7) \
+ V(ServerSocket_CreateUnixDomainBindListen, 5) \
V(SocketBase_IsBindError, 2) \
V(Socket_Available, 1) \
V(Socket_CreateBindConnect, 5) \
+ V(Socket_CreateUnixDomainBindConnect, 4) \
V(Socket_CreateBindDatagram, 6) \
V(Socket_CreateConnect, 4) \
+ V(Socket_CreateUnixDomainConnect, 3) \
V(Socket_GetPort, 1) \
V(Socket_GetRemotePeer, 1) \
V(Socket_GetError, 1) \
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index c96530b..1b79c66 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -6,6 +6,7 @@
#include "bin/dartutils.h"
#include "bin/eventhandler.h"
+#include "bin/file.h"
#include "bin/io_buffer.h"
#include "bin/isolate_data.h"
#include "bin/lockers.h"
@@ -178,7 +179,7 @@
Socket* socketfd = new Socket(fd);
OSSocket* os_socket =
- new OSSocket(addr, allocated_port, v6_only, shared, socketfd);
+ new OSSocket(addr, allocated_port, v6_only, shared, socketfd, NULL);
os_socket->ref_count = 1;
os_socket->next = first_os_socket;
@@ -192,6 +193,73 @@
return Dart_True();
}
+Dart_Handle ListeningSocketRegistry::CreateUnixDomainBindListen(
+ Dart_Handle socket_object,
+ Namespace* namespc,
+ const char* path,
+ intptr_t backlog,
+ bool shared) {
+ MutexLocker ml(&mutex_);
+
+ if (unix_domain_sockets_ != NULL && File::Exists(namespc, path)) {
+ // If there is a socket listening on this file. Ensure
+ // that it was created with `shared` mode and current `shared`
+ // is also true.
+ OSSocket* os_socket = unix_domain_sockets_;
+ OSSocket* os_socket_same_addr =
+ FindOSSocketWithPath(os_socket, namespc, path);
+ if (os_socket_same_addr != NULL) {
+ if (!os_socket_same_addr->shared || !shared) {
+ OSError os_error(-1,
+ "The shared flag to bind() needs to be `true` if "
+ "binding multiple times on the same path.",
+ OSError::kUnknown);
+ return DartUtils::NewDartOSError(&os_error);
+ }
+
+ // This socket creation is the exact same as the one which originally
+ // created the socket. Feed the same fd and store it into the native field
+ // of dart socket_object. Sockets here will share same fd but contain a
+ // different port() through EventHandler_SendData.
+ Socket* socketfd = new Socket(os_socket->fd);
+ os_socket->ref_count++;
+ // We set as a side-effect the file descriptor on the dart
+ // socket_object.
+ Socket::ReuseSocketIdNativeField(socket_object, socketfd,
+ Socket::kFinalizerListening);
+ InsertByFd(socketfd, os_socket);
+ return Dart_True();
+ }
+ }
+
+ RawAddr addr;
+ Dart_Handle result =
+ SocketAddress::GetUnixDomainSockAddr(path, namespc, &addr);
+ if (!Dart_IsNull(result)) {
+ return result;
+ }
+
+ // There is no socket listening on that path, so we create new one.
+ intptr_t fd = ServerSocket::CreateUnixDomainBindListen(addr, backlog);
+
+ if (fd < 0) {
+ return DartUtils::NewDartOSError();
+ }
+
+ Socket* socketfd = new Socket(fd);
+ OSSocket* os_socket =
+ new OSSocket(addr, -1, false, shared, socketfd, namespc);
+ os_socket->ref_count = 1;
+ os_socket->next = unix_domain_sockets_;
+ unix_domain_sockets_ = os_socket;
+ InsertByFd(socketfd, os_socket);
+
+ Socket::ReuseSocketIdNativeField(socket_object, socketfd,
+ Socket::kFinalizerListening);
+
+ return Dart_True();
+}
+
bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket,
Socket* socket) {
ASSERT(!mutex_.TryLock());
@@ -202,7 +270,12 @@
if (os_socket->ref_count > 0) {
return false;
}
-
+ // Unlink the socket file, if os_socket contains unix domain sockets.
+ if (os_socket->address.addr.sa_family == AF_UNIX) {
+ unlink(os_socket->address.un.sun_path);
+ delete os_socket;
+ return true;
+ }
OSSocket* prev = NULL;
OSSocket* current = LookupByPort(os_socket->port);
while (current != os_socket) {
@@ -298,6 +371,72 @@
}
}
+void FUNCTION_NAME(Socket_CreateUnixDomainBindConnect)(
+ Dart_NativeArguments args) {
+#if defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
+ OSError os_error(
+ -1, "Unix domain sockets are not available on this operating system.",
+ OSError::kUnknown);
+ Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+#else
+ RawAddr addr;
+ Dart_Handle address = Dart_GetNativeArgument(args, 1);
+ ASSERT(Dart_IsString(address));
+ Dart_Handle result = SocketAddress::GetUnixDomainSockAddr(
+ DartUtils::GetStringValue(address), Namespace::GetNamespace(args, 3),
+ &addr);
+ if (!Dart_IsNull(result)) {
+ return Dart_SetReturnValue(args, result);
+ }
+
+ RawAddr sourceAddr;
+ address = Dart_GetNativeArgument(args, 2);
+ ASSERT(Dart_IsString(address));
+ result = SocketAddress::GetUnixDomainSockAddr(
+ DartUtils::GetStringValue(address), Namespace::GetNamespace(args, 3),
+ &sourceAddr);
+ if (!Dart_IsNull(result)) {
+ return Dart_SetReturnValue(args, result);
+ }
+
+ intptr_t socket = Socket::CreateUnixDomainBindConnect(addr, sourceAddr);
+ if (socket >= 0) {
+ Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
+ Socket::kFinalizerNormal);
+ Dart_SetReturnValue(args, Dart_True());
+ } else {
+ Dart_SetReturnValue(args, DartUtils::NewDartOSError());
+ }
+#endif // defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
+}
+
+void FUNCTION_NAME(Socket_CreateUnixDomainConnect)(Dart_NativeArguments args) {
+#if defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
+ OSError os_error(
+ -1, "Unix domain sockets are only available on linux, android and macos.",
+ OSError::kUnknown);
+ Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+#else
+ RawAddr addr;
+ Dart_Handle address = Dart_GetNativeArgument(args, 1);
+ ASSERT(Dart_IsString(address));
+ Dart_Handle result = SocketAddress::GetUnixDomainSockAddr(
+ DartUtils::GetStringValue(address), Namespace::GetNamespace(args, 2),
+ &addr);
+ if (!Dart_IsNull(result)) {
+ return Dart_SetReturnValue(args, result);
+ }
+ intptr_t socket = Socket::CreateUnixDomainConnect(addr);
+ if (socket >= 0) {
+ Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
+ Socket::kFinalizerNormal);
+ Dart_SetReturnValue(args, Dart_True());
+ } else {
+ Dart_SetReturnValue(args, DartUtils::NewDartOSError());
+ }
+#endif // defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
+}
+
void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) {
RawAddr addr;
SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
@@ -423,18 +562,24 @@
// Get the port and clear it in the sockaddr structure.
int port = SocketAddress::GetAddrPort(addr);
+ // TODO(21403): Add checks for AF_UNIX, if unix domain sockets
+ // are used in SOCK_DGRAM.
+ enum internet_type { IPv4, IPv6 };
+ internet_type type;
if (addr.addr.sa_family == AF_INET) {
addr.in.sin_port = 0;
+ type = IPv4;
} else {
ASSERT(addr.addr.sa_family == AF_INET6);
addr.in6.sin6_port = 0;
+ type = IPv6;
}
// Format the address to a string using the numeric format.
char numeric_address[INET6_ADDRSTRLEN];
SocketBase::FormatNumericAddress(addr, numeric_address, INET6_ADDRSTRLEN);
// Create a Datagram object with the data and sender address and port.
- const int kNumArgs = 4;
+ const int kNumArgs = 5;
Dart_Handle dart_args[kNumArgs];
dart_args[0] = data;
dart_args[1] = Dart_NewStringFromCString(numeric_address);
@@ -443,6 +588,7 @@
}
dart_args[2] = SocketAddress::ToTypedData(addr);
dart_args[3] = Dart_NewInteger(port);
+ dart_args[4] = Dart_NewInteger(type);
if (Dart_IsError(dart_args[3])) {
Dart_PropagateError(dart_args[3]);
}
@@ -550,7 +696,7 @@
if (port > 0) {
Dart_SetIntegerReturnValue(args, port);
} else {
- Dart_ThrowException(DartUtils::NewDartOSError());
+ Dart_SetReturnValue(args, DartUtils::NewDartOSError());
}
}
@@ -561,14 +707,18 @@
SocketAddress* addr = SocketBase::GetRemotePeer(socket->fd(), &port);
if (addr != NULL) {
Dart_Handle list = Dart_NewList(2);
-
- Dart_Handle entry = Dart_NewList(3);
- Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType()));
+ int type = addr->GetType();
+ Dart_Handle entry;
+ if (type == SocketAddress::TYPE_UNIX) {
+ entry = Dart_NewList(2);
+ } else {
+ entry = Dart_NewList(3);
+ RawAddr raw = addr->addr();
+ Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw));
+ }
+ Dart_ListSetAt(entry, 0, Dart_NewInteger(type));
Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string()));
- RawAddr raw = addr->addr();
- Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw));
-
Dart_ListSetAt(list, 0, entry);
Dart_ListSetAt(list, 1, Dart_NewInteger(port));
Dart_SetReturnValue(args, list);
@@ -651,6 +801,29 @@
Dart_SetReturnValue(args, result);
}
+void FUNCTION_NAME(ServerSocket_CreateUnixDomainBindListen)(
+ Dart_NativeArguments args) {
+#if defined(HOST_OS_WINDOWS)
+ OSError os_error(
+ -1, "Unix domain sockets are only available on linux, android and macos.",
+ OSError::kUnknown);
+ Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+#else
+ Dart_Handle address = Dart_GetNativeArgument(args, 1);
+ ASSERT(Dart_IsString(address));
+ const char* path = DartUtils::GetStringValue(address);
+ int64_t backlog = DartUtils::GetInt64ValueCheckRange(
+ Dart_GetNativeArgument(args, 2), 0, 65535);
+ bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
+ Namespace* namespc = Namespace::GetNamespace(args, 4);
+ Dart_Handle socket_object = Dart_GetNativeArgument(args, 0);
+ Dart_Handle result =
+ ListeningSocketRegistry::Instance()->CreateUnixDomainBindListen(
+ socket_object, namespc, path, backlog, shared);
+ Dart_SetReturnValue(args, result);
+#endif // defined(HOST_OS_WINDOWS)
+}
+
void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) {
Socket* socket =
Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index c3ea9fe..caed3bb 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -7,6 +7,7 @@
#include "bin/builtin.h"
#include "bin/dartutils.h"
+#include "bin/file.h"
#include "bin/reference_counting.h"
#include "bin/socket_base.h"
#include "bin/thread.h"
@@ -70,10 +71,13 @@
// Creates a socket which is bound and connected. The port to connect to is
// specified as the port component of the passed RawAddr structure.
static intptr_t CreateConnect(const RawAddr& addr);
+ static intptr_t CreateUnixDomainConnect(const RawAddr& addr);
// Creates a socket which is bound and connected. The port to connect to is
// specified as the port component of the passed RawAddr structure.
static intptr_t CreateBindConnect(const RawAddr& addr,
const RawAddr& source_addr);
+ static intptr_t CreateUnixDomainBindConnect(const RawAddr& addr,
+ const RawAddr& source_addr);
// Creates a datagram socket which is bound. The port to bind
// to is specified as the port component of the RawAddr structure.
static intptr_t CreateBindDatagram(const RawAddr& addr,
@@ -146,6 +150,8 @@
static intptr_t CreateBindListen(const RawAddr& addr,
intptr_t backlog,
bool v6_only = false);
+ static intptr_t CreateUnixDomainBindListen(const RawAddr& addr,
+ intptr_t backlog);
// Start accepting on a newly created listening socket. If it was unable to
// start accepting incoming sockets, the fd is invalidated.
@@ -173,6 +179,8 @@
static void Cleanup();
+ // Bind `socket_object` to `addr`.
+ // Return Dart_True() if succeed.
// This function should be called from a dart runtime call in order to create
// a new (potentially shared) socket.
Dart_Handle CreateBindListen(Dart_Handle socket_object,
@@ -180,6 +188,15 @@
intptr_t backlog,
bool v6_only,
bool shared);
+ // Bind unix domain socket`socket_object` to `path`.
+ // Return Dart_True() if succeed.
+ // This function should be called from a dart runtime call in order to create
+ // a new socket.
+ Dart_Handle CreateUnixDomainBindListen(Dart_Handle socket_object,
+ Namespace* namespc,
+ const char* path,
+ intptr_t backlog,
+ bool shared);
// This should be called from the event handler for every kCloseEvent it gets
// on listening sockets.
@@ -202,6 +219,10 @@
int ref_count;
intptr_t fd;
+ // Only applicable to Unix domain socket, where address.addr.sa_family
+ // == AF_UNIX.
+ Namespace* namespc;
+
// Singly linked lists of OSSocket instances which listen on the same port
// but on different addresses.
OSSocket* next;
@@ -210,12 +231,14 @@
int port,
bool v6_only,
bool shared,
- Socket* socketfd)
+ Socket* socketfd,
+ Namespace* namespc)
: address(address),
port(port),
v6_only(v6_only),
shared(shared),
ref_count(0),
+ namespc(namespc),
next(NULL) {
fd = socketfd->fd();
}
@@ -233,6 +256,20 @@
return NULL;
}
+ OSSocket* FindOSSocketWithPath(OSSocket* current,
+ Namespace* namespc,
+ const char* path) {
+ while (current != NULL) {
+ ASSERT(current->address.addr.sa_family == AF_UNIX);
+ if (File::AreIdentical(current->namespc, current->address.un.sun_path,
+ namespc, path) == File::kIdentical) {
+ return current;
+ }
+ current = current->next;
+ }
+ return NULL;
+ }
+
static bool SameIntptrValue(void* key1, void* key2) {
return reinterpret_cast<intptr_t>(key1) == reinterpret_cast<intptr_t>(key2);
}
@@ -259,6 +296,8 @@
SimpleHashMap sockets_by_port_;
SimpleHashMap sockets_by_fd_;
+ OSSocket* unix_domain_sockets_;
+
Mutex mutex_;
DISALLOW_COPY_AND_ASSIGN(ListeningSocketRegistry);
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 78e1f8e..196cb36 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -37,7 +37,7 @@
if (fd < 0) {
return -1;
}
- if (!FDUtils::SetCloseOnExec(fd)) {
+ if (!FDUtils::SetCloseOnExec(fd) || !FDUtils::SetNonBlocking(fd)) {
FDUtils::SaveErrorAndClose(fd);
return -1;
}
@@ -60,13 +60,23 @@
return fd;
}
- if (!FDUtils::SetNonBlocking(fd)) {
- FDUtils::SaveErrorAndClose(fd);
- return -1;
- }
return Connect(fd, addr);
}
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+ intptr_t fd = Create(addr);
+ if (fd < 0) {
+ return fd;
+ }
+ intptr_t result = TEMP_FAILURE_RETRY(connect(
+ fd, (struct sockaddr*)&addr.un, SocketAddress::GetAddrLength(addr)));
+ if (result == 0 || errno == EAGAIN) {
+ return fd;
+ }
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+}
+
intptr_t Socket::CreateBindConnect(const RawAddr& addr,
const RawAddr& source_addr) {
intptr_t fd = Create(addr);
@@ -76,7 +86,7 @@
intptr_t result = TEMP_FAILURE_RETRY(
bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
- if ((result != 0) && (errno != EINPROGRESS)) {
+ if (result != 0) {
FDUtils::SaveErrorAndClose(fd);
return -1;
}
@@ -84,6 +94,29 @@
return Connect(fd, addr);
}
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+ const RawAddr& source_addr) {
+ intptr_t fd = Create(addr);
+ if (fd < 0) {
+ return fd;
+ }
+
+ intptr_t result = TEMP_FAILURE_RETRY(
+ bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
+ if (result != 0) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+
+ result = TEMP_FAILURE_RETRY(connect(fd, (struct sockaddr*)&addr.un,
+ SocketAddress::GetAddrLength(addr)));
+ if (result == 0 || errno == EAGAIN) {
+ return fd;
+ }
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+}
+
intptr_t Socket::CreateBindDatagram(const RawAddr& addr,
bool reuseAddress,
bool reusePort,
@@ -189,6 +222,21 @@
return fd;
}
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+ intptr_t backlog) {
+ intptr_t fd = Create(addr);
+ if (NO_RETRY_EXPECTED(bind(fd, (struct sockaddr*)&addr.un,
+ SocketAddress::GetAddrLength(addr))) < 0) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+ if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+ return fd;
+}
+
bool ServerSocket::StartAccept(intptr_t fd) {
USE(fd);
return true;
diff --git a/runtime/bin/socket_base.cc b/runtime/bin/socket_base.cc
index 8789c43..6fb402c 100644
--- a/runtime/bin/socket_base.cc
+++ b/runtime/bin/socket_base.cc
@@ -9,6 +9,7 @@
#include "bin/isolate_data.h"
#include "bin/lockers.h"
#include "bin/thread.h"
+#include "bin/typed_data_utils.h"
#include "bin/utils.h"
#include "include/dart_api.h"
@@ -20,16 +21,33 @@
namespace bin {
int SocketAddress::GetType() {
- if (addr_.ss.ss_family == AF_INET6) {
- return TYPE_IPV6;
+ switch (addr_.ss.ss_family) {
+ case AF_INET6:
+ return TYPE_IPV6;
+ case AF_INET:
+ return TYPE_IPV4;
+ case AF_UNIX:
+ return TYPE_UNIX;
+ default:
+ UNREACHABLE();
+ return TYPE_ANY;
}
- return TYPE_IPV4;
}
intptr_t SocketAddress::GetAddrLength(const RawAddr& addr) {
- ASSERT((addr.ss.ss_family == AF_INET) || (addr.ss.ss_family == AF_INET6));
- return (addr.ss.ss_family == AF_INET6) ? sizeof(struct sockaddr_in6)
- : sizeof(struct sockaddr_in);
+ ASSERT((addr.ss.ss_family == AF_INET) || (addr.ss.ss_family == AF_INET6) ||
+ (addr.ss.ss_family == AF_UNIX));
+ switch (addr.ss.ss_family) {
+ case AF_INET6:
+ return sizeof(struct sockaddr_in6);
+ case AF_INET:
+ return sizeof(struct sockaddr_in);
+ case AF_UNIX:
+ return sizeof(struct sockaddr_un);
+ default:
+ UNREACHABLE();
+ return 0;
+ }
}
intptr_t SocketAddress::GetInAddrLength(const RawAddr& addr) {
@@ -39,18 +57,24 @@
}
bool SocketAddress::AreAddressesEqual(const RawAddr& a, const RawAddr& b) {
+ if (a.ss.ss_family != b.ss.ss_family) {
+ return false;
+ }
if (a.ss.ss_family == AF_INET) {
- if (b.ss.ss_family != AF_INET) {
- return false;
- }
return memcmp(&a.in.sin_addr, &b.in.sin_addr, sizeof(a.in.sin_addr)) == 0;
} else if (a.ss.ss_family == AF_INET6) {
- if (b.ss.ss_family != AF_INET6) {
- return false;
- }
return memcmp(&a.in6.sin6_addr, &b.in6.sin6_addr,
sizeof(a.in6.sin6_addr)) == 0 &&
a.in6.sin6_scope_id == b.in6.sin6_scope_id;
+ } else if (a.ss.ss_family == AF_UNIX) {
+ // This is not used anywhere. The comparison of file path is done via
+ // File::AreIdentical().
+ int len = sizeof(a.un.sun_path);
+ for (int i = 0; i < len; i++) {
+ if (a.un.sun_path[i] != b.un.sun_path[i]) return false;
+ if (a.un.sun_path[i] == '\0') return true;
+ }
+ return true;
} else {
UNREACHABLE();
return false;
@@ -82,6 +106,25 @@
Dart_TypedDataReleaseData(obj);
}
+Dart_Handle SocketAddress::GetUnixDomainSockAddr(const char* path,
+ Namespace* namespc,
+ RawAddr* addr) {
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
+ NamespaceScope ns(namespc, path);
+ path = ns.path();
+#endif // defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
+ if (sizeof(path) > sizeof(addr->un.sun_path)) {
+ OSError os_error(-1,
+ "The length of path exceeds the limit. "
+ "Check out man 7 unix page",
+ OSError::kUnknown);
+ return DartUtils::NewDartOSError(&os_error);
+ }
+ addr->un.sun_family = AF_UNIX;
+ Utils::SNPrint(addr->un.sun_path, sizeof(addr->un.sun_path), "%s", path);
+ return Dart_Null();
+}
+
int16_t SocketAddress::FromType(int type) {
if (type == TYPE_ANY) {
return AF_UNSPEC;
@@ -89,6 +132,9 @@
if (type == TYPE_IPV4) {
return AF_INET;
}
+ if (type == TYPE_UNIX) {
+ return AF_UNIX;
+ }
ASSERT((type == TYPE_IPV6) && "Invalid type");
return AF_INET6;
}
@@ -96,16 +142,23 @@
void SocketAddress::SetAddrPort(RawAddr* addr, intptr_t port) {
if (addr->ss.ss_family == AF_INET) {
addr->in.sin_port = htons(port);
- } else {
+ } else if (addr->ss.ss_family == AF_INET6) {
addr->in6.sin6_port = htons(port);
+ } else {
+ UNREACHABLE();
}
}
intptr_t SocketAddress::GetAddrPort(const RawAddr& addr) {
if (addr.ss.ss_family == AF_INET) {
return ntohs(addr.in.sin_port);
- } else {
+ } else if (addr.ss.ss_family == AF_INET6) {
return ntohs(addr.in6.sin6_port);
+ } else if (addr.ss.ss_family == AF_UNIX) {
+ return 0;
+ } else {
+ UNREACHABLE();
+ return -1;
}
}
@@ -176,16 +229,27 @@
}
}
+void FUNCTION_NAME(InternetAddress_RawAddrToString)(Dart_NativeArguments args) {
+ RawAddr addr;
+ SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 0), &addr);
+ // INET6_ADDRSTRLEN is larger than INET_ADDRSTRLEN
+ char str[INET6_ADDRSTRLEN];
+ bool ok = SocketBase::RawAddrToString(&addr, str);
+ if (!ok) {
+ str[0] = '\0';
+ }
+ Dart_SetReturnValue(args, ThrowIfError(DartUtils::NewString(str)));
+}
+
void FUNCTION_NAME(NetworkInterface_ListSupported)(Dart_NativeArguments args) {
- Dart_SetReturnValue(args,
- Dart_NewBoolean(SocketBase::ListInterfacesSupported()));
+ Dart_SetBooleanReturnValue(args, SocketBase::ListInterfacesSupported());
}
void FUNCTION_NAME(SocketBase_IsBindError)(Dart_NativeArguments args) {
intptr_t error_number =
DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
bool is_bind_error = SocketBase::IsBindError(error_number);
- Dart_SetReturnValue(args, is_bind_error ? Dart_True() : Dart_False());
+ Dart_SetBooleanReturnValue(args, is_bind_error ? true : false);
}
} // namespace bin
diff --git a/runtime/bin/socket_base.h b/runtime/bin/socket_base.h
index 404357b..8af4c59 100644
--- a/runtime/bin/socket_base.h
+++ b/runtime/bin/socket_base.h
@@ -23,6 +23,7 @@
#include "bin/builtin.h"
#include "bin/dartutils.h"
+#include "bin/file.h"
#include "bin/thread.h"
#include "bin/utils.h"
#include "platform/allocation.h"
@@ -34,6 +35,7 @@
union RawAddr {
struct sockaddr_in in;
struct sockaddr_in6 in6;
+ struct sockaddr_un un;
struct sockaddr_storage ss;
struct sockaddr addr;
};
@@ -44,6 +46,7 @@
TYPE_ANY = -1,
TYPE_IPV4,
TYPE_IPV6,
+ TYPE_UNIX,
};
enum {
@@ -55,7 +58,9 @@
ADDRESS_LAST = ADDRESS_ANY_IP_V6,
};
- explicit SocketAddress(struct sockaddr* sa);
+ // Unix domain socket may be unnamed. In this case addr_.un.sun_path contains
+ // garbage and should not be inspected.
+ explicit SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket = false);
~SocketAddress() {}
@@ -68,6 +73,9 @@
static intptr_t GetInAddrLength(const RawAddr& addr);
static bool AreAddressesEqual(const RawAddr& a, const RawAddr& b);
static void GetSockAddr(Dart_Handle obj, RawAddr* addr);
+ static Dart_Handle GetUnixDomainSockAddr(const char* path,
+ Namespace* namespc,
+ RawAddr* addr);
static int16_t FromType(int type);
static void SetAddrPort(RawAddr* addr, intptr_t port);
static intptr_t GetAddrPort(const RawAddr& addr);
@@ -77,7 +85,17 @@
static intptr_t GetAddrScope(const RawAddr& addr);
private:
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) || defined(HOST_OS_ANDROID)
+ // Unix domain address is only on Linux, Mac OS and Android now.
+ // unix(7) require sun_path to be 108 bytes on Linux and Android, 104 bytes on
+ // Mac OS.
+ static const intptr_t kMaxUnixPathLength =
+ sizeof(((struct sockaddr_un*)0)->sun_path);
+ char as_string_[kMaxUnixPathLength];
+#else
char as_string_[INET6_ADDRSTRLEN];
+#endif // defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) || \
+ // defined(HOST_OS_ANDROID)
RawAddr addr_;
DISALLOW_COPY_AND_ASSIGN(SocketAddress);
@@ -214,6 +232,9 @@
OSError** os_error);
static bool ParseAddress(int type, const char* address, RawAddr* addr);
+
+ // Convert address from byte representation to human readable string.
+ static bool RawAddrToString(RawAddr* addr, char* str);
static bool FormatNumericAddress(const RawAddr& addr, char* address, int len);
// Whether ListInterfaces is supported.
diff --git a/runtime/bin/socket_base_android.cc b/runtime/bin/socket_base_android.cc
index c72c276..6cea30d 100644
--- a/runtime/bin/socket_base_android.cc
+++ b/runtime/bin/socket_base_android.cc
@@ -26,11 +26,19 @@
namespace dart {
namespace bin {
-SocketAddress::SocketAddress(struct sockaddr* sa) {
- ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
- if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
- as_string_, INET6_ADDRSTRLEN)) {
+SocketAddress::SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket) {
+ if (unnamed_unix_socket) {
+ // This is an unnamed unix domain socket.
as_string_[0] = 0;
+ } else if (sa->sa_family == AF_UNIX) {
+ struct sockaddr_un* un = ((struct sockaddr_un*)sa);
+ memmove(as_string_, un->sun_path, sizeof(un->sun_path));
+ } else {
+ ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
+ if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
+ as_string_, INET6_ADDRSTRLEN)) {
+ as_string_[0] = 0;
+ }
}
socklen_t salen = GetAddrLength(*reinterpret_cast<RawAddr*>(sa));
memmove(reinterpret_cast<void*>(&addr_), sa, salen);
@@ -140,6 +148,13 @@
if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
return NULL;
}
+ // sockaddr_un contains sa_family_t sun_familty and char[] sun_path.
+ // If size is the size of sa_familty_t, this is an unnamed socket and
+ // sun_path contains garbage.
+ if (size == sizeof(sa_family_t)) {
+ *port = 0;
+ return new SocketAddress(&raw.addr, true);
+ }
*port = SocketAddress::GetAddrPort(raw);
return new SocketAddress(&raw.addr);
}
@@ -244,6 +259,16 @@
return (result == 1);
}
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+ if (addr->addr.sa_family == AF_INET) {
+ return inet_ntop(AF_INET, &addr->in.sin_addr, str, INET_ADDRSTRLEN) != NULL;
+ } else {
+ ASSERT(addr->addr.sa_family == AF_INET6);
+ return inet_ntop(AF_INET6, &addr->in6.sin6_addr, str, INET6_ADDRSTRLEN) !=
+ NULL;
+ }
+}
+
static bool ShouldIncludeIfaAddrs(struct ifaddrs* ifa, int lookup_family) {
if (ifa->ifa_addr == NULL) {
// OpenVPN's virtual device tun0.
diff --git a/runtime/bin/socket_base_android.h b/runtime/bin/socket_base_android.h
index fb685be..9b10162 100644
--- a/runtime/bin/socket_base_android.h
+++ b/runtime/bin/socket_base_android.h
@@ -12,5 +12,6 @@
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/socket.h>
+#include <sys/un.h>
#endif // RUNTIME_BIN_SOCKET_BASE_ANDROID_H_
diff --git a/runtime/bin/socket_base_fuchsia.cc b/runtime/bin/socket_base_fuchsia.cc
index ba90aa9..d956dd0 100644
--- a/runtime/bin/socket_base_fuchsia.cc
+++ b/runtime/bin/socket_base_fuchsia.cc
@@ -54,7 +54,11 @@
namespace dart {
namespace bin {
-SocketAddress::SocketAddress(struct sockaddr* sa) {
+SocketAddress::SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket) {
+ // Fuchsia does not support unix domain sockets.
+ if (unnamed_unix_socket) {
+ FATAL("Fuchsia does not support unix domain sockets.");
+ }
ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
as_string_, INET6_ADDRSTRLEN)) {
@@ -274,6 +278,16 @@
return (result == 1);
}
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+ if (addr->addr.sa_family == AF_INET) {
+ return inet_ntop(AF_INET, &addr->in.sin_addr, str, INET_ADDRSTRLEN) != NULL;
+ } else {
+ ASSERT(addr->addr.sa_family == AF_INET6);
+ return inet_ntop(AF_INET6, &addr->in6.sin6_addr, str, INET6_ADDRSTRLEN) !=
+ NULL;
+ }
+}
+
bool SocketBase::ListInterfacesSupported() {
return true;
}
diff --git a/runtime/bin/socket_base_fuchsia.h b/runtime/bin/socket_base_fuchsia.h
index 3ec3343..43d036b 100644
--- a/runtime/bin/socket_base_fuchsia.h
+++ b/runtime/bin/socket_base_fuchsia.h
@@ -12,5 +12,6 @@
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/socket.h>
+#include <sys/un.h>
#endif // RUNTIME_BIN_SOCKET_BASE_FUCHSIA_H_
diff --git a/runtime/bin/socket_base_linux.cc b/runtime/bin/socket_base_linux.cc
index 9a52d96..fb1e555 100644
--- a/runtime/bin/socket_base_linux.cc
+++ b/runtime/bin/socket_base_linux.cc
@@ -26,11 +26,19 @@
namespace dart {
namespace bin {
-SocketAddress::SocketAddress(struct sockaddr* sa) {
- ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
- if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
- as_string_, INET6_ADDRSTRLEN)) {
+SocketAddress::SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket) {
+ if (unnamed_unix_socket) {
+ // This is an unnamed unix domain socket.
as_string_[0] = 0;
+ } else if (sa->sa_family == AF_UNIX) {
+ struct sockaddr_un* un = ((struct sockaddr_un*)sa);
+ memmove(as_string_, un->sun_path, sizeof(un->sun_path));
+ } else {
+ ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
+ if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
+ as_string_, INET6_ADDRSTRLEN)) {
+ as_string_[0] = 0;
+ }
}
socklen_t salen = GetAddrLength(*reinterpret_cast<RawAddr*>(sa));
memmove(reinterpret_cast<void*>(&addr_), sa, salen);
@@ -140,6 +148,13 @@
if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
return NULL;
}
+ // sockaddr_un contains sa_family_t sun_familty and char[] sun_path.
+ // If size is the size of sa_familty_t, this is an unnamed socket and
+ // sun_path contains garbage.
+ if (size == sizeof(sa_family_t)) {
+ *port = 0;
+ return new SocketAddress(&raw.addr, true);
+ }
*port = SocketAddress::GetAddrPort(raw);
return new SocketAddress(&raw.addr);
}
@@ -246,6 +261,16 @@
return (result == 1);
}
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+ if (addr->addr.sa_family == AF_INET) {
+ return inet_ntop(AF_INET, &addr->in.sin_addr, str, INET_ADDRSTRLEN) != NULL;
+ } else {
+ ASSERT(addr->addr.sa_family == AF_INET6);
+ return inet_ntop(AF_INET6, &addr->in6.sin6_addr, str, INET6_ADDRSTRLEN) !=
+ NULL;
+ }
+}
+
static bool ShouldIncludeIfaAddrs(struct ifaddrs* ifa, int lookup_family) {
if (ifa->ifa_addr == NULL) {
// OpenVPN's virtual device tun0.
diff --git a/runtime/bin/socket_base_linux.h b/runtime/bin/socket_base_linux.h
index 0cca9bc..42f5439 100644
--- a/runtime/bin/socket_base_linux.h
+++ b/runtime/bin/socket_base_linux.h
@@ -12,5 +12,6 @@
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/socket.h>
+#include <sys/un.h>
#endif // RUNTIME_BIN_SOCKET_BASE_LINUX_H_
diff --git a/runtime/bin/socket_base_macos.cc b/runtime/bin/socket_base_macos.cc
index a448911..e8bea83 100644
--- a/runtime/bin/socket_base_macos.cc
+++ b/runtime/bin/socket_base_macos.cc
@@ -25,11 +25,19 @@
namespace dart {
namespace bin {
-SocketAddress::SocketAddress(struct sockaddr* sa) {
- ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
- if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
- as_string_, INET6_ADDRSTRLEN)) {
+SocketAddress::SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket) {
+ if (unnamed_unix_socket) {
+ // This is an unnamed unix domain socket.
as_string_[0] = 0;
+ } else if (sa->sa_family == AF_UNIX) {
+ struct sockaddr_un* un = ((struct sockaddr_un*)sa);
+ memmove(as_string_, un->sun_path, sizeof(un->sun_path));
+ } else {
+ ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
+ if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
+ as_string_, INET6_ADDRSTRLEN)) {
+ as_string_[0] = 0;
+ }
}
socklen_t salen = GetAddrLength(*reinterpret_cast<RawAddr*>(sa));
memmove(reinterpret_cast<void*>(&addr_), sa, salen);
@@ -139,6 +147,13 @@
if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
return NULL;
}
+ // sockaddr_un contains sa_family_t sun_familty and char[] sun_path.
+ // If size is the size of sa_familty_t, this is an unnamed socket and
+ // sun_path contains garbage.
+ if (size == sizeof(sa_family_t)) {
+ *port = 0;
+ return new SocketAddress(&raw.addr, true);
+ }
*port = SocketAddress::GetAddrPort(raw);
return new SocketAddress(&raw.addr);
}
@@ -236,6 +251,16 @@
return (result == 1);
}
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+ if (addr->addr.sa_family == AF_INET) {
+ return inet_ntop(AF_INET, &addr->in.sin_addr, str, INET_ADDRSTRLEN) != NULL;
+ } else {
+ ASSERT(addr->addr.sa_family == AF_INET6);
+ return inet_ntop(AF_INET6, &addr->in6.sin6_addr, str, INET6_ADDRSTRLEN) !=
+ NULL;
+ }
+}
+
static bool ShouldIncludeIfaAddrs(struct ifaddrs* ifa, int lookup_family) {
if (ifa->ifa_addr == NULL) {
// OpenVPN's virtual device tun0.
diff --git a/runtime/bin/socket_base_macos.h b/runtime/bin/socket_base_macos.h
index c382401..d919063 100644
--- a/runtime/bin/socket_base_macos.h
+++ b/runtime/bin/socket_base_macos.h
@@ -12,5 +12,6 @@
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/socket.h>
+#include <sys/un.h>
#endif // RUNTIME_BIN_SOCKET_BASE_MACOS_H_
diff --git a/runtime/bin/socket_base_win.cc b/runtime/bin/socket_base_win.cc
index b24dc05..4ce3fc0 100644
--- a/runtime/bin/socket_base_win.cc
+++ b/runtime/bin/socket_base_win.cc
@@ -20,7 +20,10 @@
namespace dart {
namespace bin {
-SocketAddress::SocketAddress(struct sockaddr* sockaddr) {
+SocketAddress::SocketAddress(struct sockaddr* sockaddr,
+ bool unnamed_unix_socket) {
+ // Unix domain sockets not supported on Win. Remove this assert if enabled.
+ ASSERT(!unnamed_unix_socket);
ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
RawAddr* raw = reinterpret_cast<RawAddr*>(sockaddr);
@@ -246,6 +249,31 @@
return result == 1;
}
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+ // According to InetNtopW(), buffer should be large enough for at least 46
+ // characters for IPv6 and 16 for IPv4.
+ COMPILE_ASSERT(INET6_ADDRSTRLEN >= 46);
+ wchar_t tmp_buffer[INET6_ADDRSTRLEN];
+ if (addr->addr.sa_family == AF_INET) {
+ if (InetNtop(AF_INET, &addr->in.sin_addr, tmp_buffer, INET_ADDRSTRLEN) ==
+ NULL) {
+ return false;
+ }
+ } else {
+ ASSERT(addr->addr.sa_family == AF_INET6);
+ if (InetNtop(AF_INET6, &addr->in6.sin6_addr, tmp_buffer,
+ INET6_ADDRSTRLEN) == NULL) {
+ return false;
+ }
+ }
+ WideToUtf8Scope wide_to_utf8_scope(tmp_buffer);
+ if (wide_to_utf8_scope.length() <= INET6_ADDRSTRLEN) {
+ strncpy(str, wide_to_utf8_scope.utf8(), INET6_ADDRSTRLEN);
+ return true;
+ }
+ return false;
+}
+
bool SocketBase::ListInterfacesSupported() {
return true;
}
diff --git a/runtime/bin/socket_base_win.h b/runtime/bin/socket_base_win.h
index 55ab91d..9bfbe8c 100644
--- a/runtime/bin/socket_base_win.h
+++ b/runtime/bin/socket_base_win.h
@@ -9,6 +9,7 @@
#error Do not include socket_base_win.h directly. Use socket_base.h.
#endif
+#include <afunix.h>
#include <iphlpapi.h>
#include <mswsock.h>
#include <winsock2.h>
diff --git a/runtime/bin/socket_fuchsia.cc b/runtime/bin/socket_fuchsia.cc
index b4c0b10..fa8a958 100644
--- a/runtime/bin/socket_fuchsia.cc
+++ b/runtime/bin/socket_fuchsia.cc
@@ -109,12 +109,25 @@
return Connect(fd, addr);
}
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+ // Fuchsia does not support unix domain socket
+ errno = ENOSYS;
+ return -1;
+}
+
intptr_t Socket::CreateBindConnect(const RawAddr& addr,
const RawAddr& source_addr) {
errno = ENOSYS;
return -1;
}
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+ const RawAddr& source_addr) {
+ // Fuchsia does not support unix domain socket
+ errno = ENOSYS;
+ return -1;
+}
+
intptr_t Socket::CreateBindDatagram(const RawAddr& addr,
bool reuseAddress,
bool reusePort,
@@ -192,6 +205,13 @@
return reinterpret_cast<intptr_t>(io_handle);
}
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+ intptr_t backlog) {
+ // Fuchsia does not support unix domain socket.
+ errno = ENOSYS;
+ return -1;
+}
+
bool ServerSocket::StartAccept(intptr_t fd) {
USE(fd);
return true;
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index c993fcb..e6b7e5c 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -48,7 +48,7 @@
if ((result == 0) || (errno == EINPROGRESS)) {
return fd;
}
- FDUtils::FDUtils::SaveErrorAndClose(fd);
+ FDUtils::SaveErrorAndClose(fd);
return -1;
}
@@ -60,6 +60,20 @@
return Connect(fd, addr);
}
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+ intptr_t fd = Create(addr);
+ if (fd < 0) {
+ return fd;
+ }
+ intptr_t result = TEMP_FAILURE_RETRY(connect(
+ fd, (struct sockaddr*)&addr.un, SocketAddress::GetAddrLength(addr)));
+ if (result == 0 || errno == EAGAIN) {
+ return fd;
+ }
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+}
+
intptr_t Socket::CreateBindConnect(const RawAddr& addr,
const RawAddr& source_addr) {
intptr_t fd = Create(addr);
@@ -69,7 +83,7 @@
intptr_t result = TEMP_FAILURE_RETRY(
bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
- if ((result != 0) && (errno != EINPROGRESS)) {
+ if (result != 0) {
FDUtils::SaveErrorAndClose(fd);
return -1;
}
@@ -77,6 +91,29 @@
return Connect(fd, addr);
}
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+ const RawAddr& source_addr) {
+ intptr_t fd = Create(addr);
+ if (fd < 0) {
+ return fd;
+ }
+
+ intptr_t result = TEMP_FAILURE_RETRY(
+ bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
+ if (result != 0) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+
+ result = TEMP_FAILURE_RETRY(connect(fd, (struct sockaddr*)&addr.un,
+ SocketAddress::GetAddrLength(addr)));
+ if (result == 0 || errno == EAGAIN) {
+ return fd;
+ }
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+}
+
intptr_t Socket::CreateBindDatagram(const RawAddr& addr,
bool reuseAddress,
bool reusePort,
@@ -182,6 +219,21 @@
return fd;
}
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+ intptr_t backlog) {
+ intptr_t fd = Create(addr);
+ if (NO_RETRY_EXPECTED(bind(fd, (struct sockaddr*)&addr.un,
+ sizeof(struct sockaddr_un))) < 0) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+ if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+ return fd;
+}
+
bool ServerSocket::StartAccept(intptr_t fd) {
USE(fd);
return true;
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index f87482e..8c6be8b 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -66,6 +66,14 @@
return Connect(fd, addr);
}
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+ intptr_t fd = Create(addr);
+ if (fd < 0) {
+ return fd;
+ }
+ return Connect(fd, addr);
+}
+
intptr_t Socket::CreateBindConnect(const RawAddr& addr,
const RawAddr& source_addr) {
intptr_t fd = Create(addr);
@@ -75,7 +83,24 @@
intptr_t result = TEMP_FAILURE_RETRY(
bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
- if ((result != 0) && (errno != EINPROGRESS)) {
+ if (result != 0) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+
+ return Connect(fd, addr);
+}
+
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+ const RawAddr& source_addr) {
+ intptr_t fd = Create(addr);
+ if (fd < 0) {
+ return fd;
+ }
+
+ intptr_t result = TEMP_FAILURE_RETRY(
+ bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
+ if (result != 0) {
FDUtils::SaveErrorAndClose(fd);
return -1;
}
@@ -199,6 +224,37 @@
return fd;
}
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+ intptr_t backlog) {
+ intptr_t fd;
+ fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
+ if (fd < 0) {
+ return -1;
+ }
+
+ if (!FDUtils::SetCloseOnExec(fd)) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+
+ if (NO_RETRY_EXPECTED(
+ bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+
+ if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+
+ if (!FDUtils::SetNonBlocking(fd)) {
+ FDUtils::SaveErrorAndClose(fd);
+ return -1;
+ }
+ return fd;
+}
+
bool ServerSocket::StartAccept(intptr_t fd) {
USE(fd);
return true;
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 5d476e9..4e393dc 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -131,6 +131,13 @@
return Connect(fd, addr, bind_addr);
}
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+ // TODO(21403): Support unix domain socket on Windows
+ // https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return -1;
+}
+
intptr_t Socket::CreateBindConnect(const RawAddr& addr,
const RawAddr& source_addr) {
intptr_t fd = Create(addr);
@@ -141,6 +148,12 @@
return Connect(fd, addr, source_addr);
}
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+ const RawAddr& source_addr) {
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return -1;
+}
+
intptr_t ServerSocket::Accept(intptr_t fd) {
ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(fd);
ClientSocket* client_socket = listen_socket->Accept();
@@ -271,6 +284,14 @@
return reinterpret_cast<intptr_t>(listen_socket);
}
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+ intptr_t backlog) {
+ // TODO(21403): Support unix domain socket on Windows
+ // https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return -1;
+}
+
bool ServerSocket::StartAccept(intptr_t fd) {
ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(fd);
listen_socket->EnsureInitialized(EventHandler::delegate());
diff --git a/runtime/bin/sync_socket_android.cc b/runtime/bin/sync_socket_android.cc
index b051e3a..80094f7 100644
--- a/runtime/bin/sync_socket_android.cc
+++ b/runtime/bin/sync_socket_android.cc
@@ -38,7 +38,7 @@
return fd;
}
ASSERT(errno != EINPROGRESS);
- FDUtils::FDUtils::SaveErrorAndClose(fd);
+ FDUtils::SaveErrorAndClose(fd);
return -1;
}
diff --git a/runtime/bin/sync_socket_fuchsia.cc b/runtime/bin/sync_socket_fuchsia.cc
index 3a6fe0d..23461f4f 100644
--- a/runtime/bin/sync_socket_fuchsia.cc
+++ b/runtime/bin/sync_socket_fuchsia.cc
@@ -38,7 +38,7 @@
return fd;
}
ASSERT(errno != EINPROGRESS);
- FDUtils::FDUtils::SaveErrorAndClose(fd);
+ FDUtils::SaveErrorAndClose(fd);
return -1;
}
diff --git a/runtime/bin/sync_socket_linux.cc b/runtime/bin/sync_socket_linux.cc
index 1fb564b..963787b 100644
--- a/runtime/bin/sync_socket_linux.cc
+++ b/runtime/bin/sync_socket_linux.cc
@@ -38,7 +38,7 @@
return fd;
}
ASSERT(errno != EINPROGRESS);
- FDUtils::FDUtils::SaveErrorAndClose(fd);
+ FDUtils::SaveErrorAndClose(fd);
return -1;
}
diff --git a/runtime/bin/sync_socket_macos.cc b/runtime/bin/sync_socket_macos.cc
index 5ee9b68c..e266341 100644
--- a/runtime/bin/sync_socket_macos.cc
+++ b/runtime/bin/sync_socket_macos.cc
@@ -41,7 +41,7 @@
return fd;
}
ASSERT(errno != EINPROGRESS);
- FDUtils::FDUtils::SaveErrorAndClose(fd);
+ FDUtils::SaveErrorAndClose(fd);
return -1;
}
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 0da49b0..b01cedc 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -530,6 +530,7 @@
bool load_vmservice_library;
bool unsafe_trust_strong_mode_types;
bool copy_parent_code;
+ bool null_safety;
} Dart_IsolateFlags;
/**
diff --git a/runtime/observatory/.packages b/runtime/observatory/.packages
index 0b5a10a..8521bd7 100644
--- a/runtime/observatory/.packages
+++ b/runtime/observatory/.packages
@@ -8,7 +8,6 @@
path:../../third_party/observatory_pub_packages/packages/path/lib
quiver:../../third_party/observatory_pub_packages/packages/quiver/lib
stack_trace:../../third_party/observatory_pub_packages/packages/stack_trace/lib
-unittest:../../third_party/observatory_pub_packages/packages/unittest/lib
usage:../../third_party/observatory_pub_packages/packages/usage/lib
observatory:lib
@@ -17,6 +16,7 @@
boolean_selector:../../third_party/pkg/boolean_selector/lib
charcode:../../third_party/pkg/charcode/lib
dart_internal:../../pkg/dart_internal/lib
+expect:../../pkg/expect/lib
http:../../third_party/pkg/http/lib
http_parser:../../third_party/pkg/http_parser/lib
matcher:../../third_party/pkg/matcher/lib
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart
index 6f7cfe5..ce48c8b 100644
--- a/runtime/observatory/lib/object_graph.dart
+++ b/runtime/observatory/lib/object_graph.dart
@@ -260,7 +260,7 @@
_SnapshotObject._new(this._id, this._graph, this.label);
- bool operator ==(other) {
+ bool operator ==(Object other) {
if (other is _SnapshotObject) {
return _id == other._id && _graph == other._graph;
}
@@ -378,7 +378,13 @@
_SnapshotMergedDominator._new(this._id, this._graph, this._parent);
- bool operator ==(other) => _id == other._id && _graph == other._graph;
+ bool operator ==(Object other) {
+ if (other is _SnapshotMergedDominator) {
+ return _id == other._id && _graph == other._graph;
+ }
+ return false;
+ }
+
int get hashCode => _id ^ _graph.hashCode;
String get description => "$instanceCount instances of ${klass.name}";
@@ -742,7 +748,7 @@
_totalExternalSize = stream.readUnsigned();
var K = stream.readUnsigned();
- var classes = new List<_SnapshotClass>(K + 1);
+ var classes = new List<_SnapshotClass>.filled(K + 1, null);
classes[0] = _SnapshotClass._new(this, 0, "Root", "", "");
for (var cid = 1; cid <= K; cid++) {
diff --git a/runtime/observatory/lib/src/app/analytics.dart b/runtime/observatory/lib/src/app/analytics.dart
index 484f7da..a34c2da 100644
--- a/runtime/observatory/lib/src/app/analytics.dart
+++ b/runtime/observatory/lib/src/app/analytics.dart
@@ -4,10 +4,17 @@
part of app;
+// TODO(eernst): Use 'bool.fromEnvironment' below when possible;
+// for now we use a dual `defaultValue` rewrite.
+const _obsVer = (String.fromEnvironment('OBS_VER', defaultValue: '1') ==
+ String.fromEnvironment('OBS_VER', defaultValue: '2'))
+ ? String.fromEnvironment('OBS_VER')
+ : null;
+
class Analytics {
static final _UA = 'UA-26406144-17';
static final _name = 'Observatory';
- static final _version = const String.fromEnvironment('OBS_VER');
+ static final _version = _obsVer;
static final _googleAnalytics = new AnalyticsHtml(_UA, _name, _version);
static initialize() {
diff --git a/runtime/observatory/lib/src/app/application.dart b/runtime/observatory/lib/src/app/application.dart
index 42ffe2e..e3c4d7b 100644
--- a/runtime/observatory/lib/src/app/application.dart
+++ b/runtime/observatory/lib/src/app/application.dart
@@ -12,7 +12,7 @@
final TargetRepository targets = new TargetRepository(isConnectedVMTarget);
final EventRepository events = new EventRepository();
final NotificationRepository notifications = new NotificationRepository();
- final _pageRegistry = new List<Page>();
+ final _pageRegistry = <Page>[];
LocationManager _locationManager;
LocationManager get locationManager => _locationManager;
Page currentPage;
diff --git a/runtime/observatory/lib/src/app/view_model.dart b/runtime/observatory/lib/src/app/view_model.dart
index d312cb3..f210e13 100644
--- a/runtime/observatory/lib/src/app/view_model.dart
+++ b/runtime/observatory/lib/src/app/view_model.dart
@@ -24,7 +24,7 @@
class SortedTable {
final List<SortedTableColumn> columns;
- final List<SortedTableRow> rows = new List<SortedTableRow>();
+ final List<SortedTableRow> rows = <SortedTableRow>[];
final List<int> sortedRows = [];
SortedTable(this.columns);
diff --git a/runtime/observatory/lib/src/cli/command.dart b/runtime/observatory/lib/src/cli/command.dart
index b2a1ab7..0a0fc42 100644
--- a/runtime/observatory/lib/src/cli/command.dart
+++ b/runtime/observatory/lib/src/cli/command.dart
@@ -61,7 +61,7 @@
// Returns a list of local subcommands which match the args.
List<Command> _matchLocal(String argWithSpace, bool preferExact) {
- var matches = new List<Command>();
+ var matches = <Command>[];
var arg = argWithSpace.trimRight();
for (var child in _children) {
if (child.name.startsWith(arg)) {
diff --git a/runtime/observatory/lib/src/elements/context_ref.dart b/runtime/observatory/lib/src/elements/context_ref.dart
index 1f92a48..f88bf00 100644
--- a/runtime/observatory/lib/src/elements/context_ref.dart
+++ b/runtime/observatory/lib/src/elements/context_ref.dart
@@ -101,7 +101,7 @@
if (_loadedContext == null) {
return [new SpanElement()..text = 'Loading...'];
}
- var members = new List<Element>();
+ var members = <Element>[];
if (_loadedContext.parentContext != null) {
members.add(new DivElement()
..classes = ['memberItem']
diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart
index c5cd6cf..f6505be 100644
--- a/runtime/observatory/lib/src/elements/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart
@@ -434,7 +434,7 @@
rootDiff.name = root;
rootDiff.sizeA = graphA.processPartitions[root] ?? 0;
rootDiff.sizeB = graphB.processPartitions[root] ?? 0;
- rootDiff.children = new List<PartitionDiff>();
+ rootDiff.children = <PartitionDiff>[];
partitions.remove(root);
var childrenA = 0;
@@ -518,7 +518,7 @@
SnapshotGraph graphA, SnapshotGraph graphB) {
// Matching classes by SnapshotClass.qualifiedName.
var classesB = new Map<String, SnapshotClass>();
- var classesDiff = new List<SnapshotClassDiff>();
+ var classesDiff = <SnapshotClassDiff>[];
for (var classB in graphB.classes) {
classesB[classB.qualifiedName] = classB;
}
@@ -581,7 +581,7 @@
// dominator tree can be arbitrarily deep. We need to compute the full
// tree to compute areas, so we do this eagerly to avoid having to
// repeatedly test for initialization.
- var worklist = new List<MergedDominatorDiff>();
+ var worklist = <MergedDominatorDiff>[];
worklist.add(root);
// Compute children top-down.
for (var i = 0; i < worklist.length; i++) {
@@ -597,7 +597,7 @@
void _computeChildren(List<MergedDominatorDiff> worklist) {
assert(children == null);
- children = new List<MergedDominatorDiff>();
+ children = <MergedDominatorDiff>[];
// Matching children by MergedObjectVertex.klass.qualifiedName.
final childrenB = <String, SnapshotMergedDominator>{};
@@ -681,7 +681,7 @@
M.ObjectRepository _objects;
SnapshotReader _reader;
String _status;
- List<SnapshotGraph> _loadedSnapshots = new List<SnapshotGraph>();
+ List<SnapshotGraph> _loadedSnapshots = <SnapshotGraph>[];
SnapshotGraph _snapshotA;
SnapshotGraph _snapshotB;
HeapSnapshotTreeMode _mode = HeapSnapshotTreeMode.mergedDominatorTreeMap;
diff --git a/runtime/observatory/lib/src/elements/helpers/tag.dart b/runtime/observatory/lib/src/elements/helpers/tag.dart
index 1ad74c7..65c269a 100644
--- a/runtime/observatory/lib/src/elements/helpers/tag.dart
+++ b/runtime/observatory/lib/src/elements/helpers/tag.dart
@@ -11,7 +11,7 @@
static Expando reverseElements = new Expando();
static CustomElement reverse(HtmlElement element) => reverseElements[element];
- static List<CustomElement> toBeAttached = new List<CustomElement>();
+ static List<CustomElement> toBeAttached = <CustomElement>[];
static void drainAttached() {
// Send 'attached' to elements that have been attached to the document.
bool fired = false;
diff --git a/runtime/observatory/lib/src/elements/retaining_path.dart b/runtime/observatory/lib/src/elements/retaining_path.dart
index 7dca764..c27b912 100644
--- a/runtime/observatory/lib/src/elements/retaining_path.dart
+++ b/runtime/observatory/lib/src/elements/retaining_path.dart
@@ -87,7 +87,7 @@
return [new SpanElement()..text = 'Loading'];
}
- var elements = new List<Element>();
+ var elements = <Element>[];
bool first = true;
for (var item in _path.elements) {
elements.add(_createItem(item, first));
diff --git a/runtime/observatory/lib/src/repositories/flag.dart b/runtime/observatory/lib/src/repositories/flag.dart
index a3db15d..13ab784 100644
--- a/runtime/observatory/lib/src/repositories/flag.dart
+++ b/runtime/observatory/lib/src/repositories/flag.dart
@@ -22,7 +22,7 @@
FlagsRepository(this.vm);
Future<Iterable<Flag>> list() async {
- var result = new List<Flag>();
+ var result = <Flag>[];
for (var map in ((await vm.getFlagList()) as S.ServiceMap)['flags']) {
result.add(_toFlag(map));
}
diff --git a/runtime/observatory/lib/src/repositories/notification.dart b/runtime/observatory/lib/src/repositories/notification.dart
index 78a81c4..19eb99e 100644
--- a/runtime/observatory/lib/src/repositories/notification.dart
+++ b/runtime/observatory/lib/src/repositories/notification.dart
@@ -10,7 +10,7 @@
}
class NotificationRepository implements M.NotificationRepository {
- final List<M.Notification> _list = new List<M.Notification>();
+ final List<M.Notification> _list = <M.Notification>[];
final StreamController<M.NotificationChangeEvent> _onChange =
new StreamController<M.NotificationChangeEvent>.broadcast();
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index dcbe861..1e4bf9f 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -1061,7 +1061,7 @@
int get sum => _sum;
int _sum = 0;
TagProfileSnapshot(this.seconds, int countersLength)
- : counters = new List<int>(countersLength);
+ : counters = new List<int>.filled(countersLength, 0);
/// Set [counters] and update [sum].
void set(List<int> counters) {
@@ -1097,8 +1097,8 @@
}
class TagProfile {
- final List<String> names = new List<String>();
- final List<TagProfileSnapshot> snapshots = new List<TagProfileSnapshot>();
+ final List<String> names = <String>[];
+ final List<TagProfileSnapshot> snapshots = <TagProfileSnapshot>[];
double get updatedAtSeconds => _seconds;
double _seconds;
TagProfileSnapshot _maxSnapshot;
@@ -1404,7 +1404,7 @@
return M.IsolateStatus.loading;
}
- final List<String> extensionRPCs = new List<String>();
+ final List<String> extensionRPCs = <String>[];
Map<String, ServiceObject> _cache = new Map<String, ServiceObject>();
final TagProfile tagProfile = new TagProfile(20);
@@ -1601,7 +1601,7 @@
SnapshotReader _snapshotFetch;
List<Thread> get threads => _threads;
- final List<Thread> _threads = new List<Thread>();
+ final List<Thread> _threads = <Thread>[];
int get zoneHighWatermark => _zoneHighWatermark;
int _zoneHighWatermark = 0;
@@ -2054,7 +2054,7 @@
}
class ObjectStore extends ServiceObject implements M.ObjectStore {
- List<NamedField> fields = new List<NamedField>();
+ List<NamedField> fields = <NamedField>[];
ObjectStore._empty(ServiceObjectOwner owner) : super._empty(owner);
@@ -2911,7 +2911,7 @@
twoByteBytecode = map['_twoByteBytecode'];
if (map['fields'] != null) {
- var fields = new List<BoundField>();
+ var fields = <BoundField>[];
for (var f in map['fields']) {
fields.add(new BoundField(f['decl'], f['value']));
}
@@ -2930,7 +2930,7 @@
// Should be:
// elements = map['elements'].map((e) => new Guarded<Instance>(e)).toList();
// some times we obtain object that are not InstanceRef
- var localElements = new List<Guarded<HeapObject>>();
+ var localElements = <Guarded<HeapObject>>[];
for (var element in map['elements']) {
localElements.add(new Guarded<HeapObject>(element));
}
@@ -3051,7 +3051,7 @@
if (map['variables'] == null) {
variables = <ContextElement>[];
} else {
- var localVariables = new List<ContextElement>();
+ var localVariables = <ContextElement>[];
for (var element in map['variables']) {
localVariables.add(new ContextElement(element));
}
@@ -3465,15 +3465,18 @@
factory CallSite.fromMap(Map siteMap, Script script) {
var name = siteMap['name'];
var tokenPos = siteMap['tokenPos'];
- var entries = new List<CallSiteEntry>();
+ var entries = <CallSiteEntry>[];
for (var entryMap in siteMap['cacheEntries']) {
entries.add(new CallSiteEntry.fromMap(entryMap));
}
return new CallSite(name, script, tokenPos, entries);
}
- operator ==(other) {
- return (script == other.script) && (tokenPos == other.tokenPos);
+ bool operator ==(Object other) {
+ if (other is CallSite) {
+ return (script == other.script) && (tokenPos == other.tokenPos);
+ }
+ return false;
}
int get hashCode => (script.hashCode << 8) | tokenPos;
@@ -4239,7 +4242,7 @@
class CodeInlineInterval {
final int start;
final int end;
- final List<ServiceFunction> functions = new List<ServiceFunction>();
+ final List<ServiceFunction> functions = <ServiceFunction>[];
bool contains(int pc) => (pc >= start) && (pc < end);
CodeInlineInterval(this.start, this.end);
}
diff --git a/runtime/observatory/lib/utils.dart b/runtime/observatory/lib/utils.dart
index 286b512..821e88f 100644
--- a/runtime/observatory/lib/utils.dart
+++ b/runtime/observatory/lib/utils.dart
@@ -251,7 +251,7 @@
static bool runningInJavaScript() => identical(1.0, 1);
static formatStringAsLiteral(String value, [bool wasTruncated = false]) {
- var result = new List<int>();
+ var result = <int>[];
result.add("'".codeUnitAt(0));
for (int codeUnit in value.codeUnits) {
if (codeUnit == '\n'.codeUnitAt(0))
diff --git a/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart b/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
index 6d5f293..34feaf0 100644
--- a/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
+++ b/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/allocations_test.dart b/runtime/observatory/tests/service/allocations_test.dart
index b3a5c04..b2d9085 100644
--- a/runtime/observatory/tests/service/allocations_test.dart
+++ b/runtime/observatory/tests/service/allocations_test.dart
@@ -5,7 +5,7 @@
library allocations_test;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
class Foo {}
diff --git a/runtime/observatory/tests/service/async_generator_breakpoint_test.dart b/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
index af14028..44f5c2a 100644
--- a/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
+++ b/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
@@ -6,7 +6,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
printSync() {
diff --git a/runtime/observatory/tests/service/async_scope_test.dart b/runtime/observatory/tests/service/async_scope_test.dart
index 106e053..3e01b1d 100644
--- a/runtime/observatory/tests/service/async_scope_test.dart
+++ b/runtime/observatory/tests/service/async_scope_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/auth_token_test.dart b/runtime/observatory/tests/service/auth_token_test.dart
index 8c6ae7f..f2ba275 100644
--- a/runtime/observatory/tests/service/auth_token_test.dart
+++ b/runtime/observatory/tests/service/auth_token_test.dart
@@ -5,8 +5,9 @@
import 'dart:async';
import 'dart:developer';
import 'dart:io' as io;
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
Future<Null> testeeBefore() async {
@@ -14,11 +15,11 @@
print(await Service.getInfo());
// Start the web server.
ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
- expect(info.serverUri, isNotNull);
+ Expect.isNotNull(info.serverUri);
// Ensure that we have the auth token in the path segments.
- expect(info.serverUri.pathSegments.length, greaterThan(1));
+ Expect.isTrue(info.serverUri.pathSegments.length > 1);
// Sanity check the length of the auth token.
- expect(info.serverUri.pathSegments[0].length, greaterThan(8));
+ Expect.isTrue(info.serverUri.pathSegments[0].length > 8);
// Try connecting to the server without the auth token, it should throw
// an exception.
@@ -27,17 +28,16 @@
var httpClient = new io.HttpClient();
try {
var request = await httpClient.getUrl(url);
- expect(true, false);
+ fail('expected exception');
} catch (e) {
- expect(true, true);
+ // Expected
}
// Try connecting to the server with the auth token, it should succeed.
try {
var request = await httpClient.getUrl(info.serverUri);
- expect(true, true);
} catch (e) {
- expect(true, false);
+ fail('could not connect');
}
}
@@ -46,7 +46,6 @@
await isolate.reload();
// Just getting here means that the testee enabled the service protocol
// web server.
- expect(true, true);
}
];
diff --git a/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart b/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart
index b2ba9cd..e9b971c 100644
--- a/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart
+++ b/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart
@@ -7,7 +7,7 @@
import 'dart:developer';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart b/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart
index 2887925..0aef00e 100644
--- a/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart
@@ -7,7 +7,7 @@
import 'dart:developer';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/bad_reload_test.dart b/runtime/observatory/tests/service/bad_reload_test.dart
index ff6396c..9c4219c 100644
--- a/runtime/observatory/tests/service/bad_reload_test.dart
+++ b/runtime/observatory/tests/service/bad_reload_test.dart
@@ -10,7 +10,7 @@
import 'service_test_common.dart';
import 'package:observatory/service.dart';
import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
// Chop off the file name.
String baseDirectory = path.dirname(Platform.script.path) + '/';
diff --git a/runtime/observatory/tests/service/bad_web_socket_address_test.dart b/runtime/observatory/tests/service/bad_web_socket_address_test.dart
index 62bbfb3..08df24d 100644
--- a/runtime/observatory/tests/service/bad_web_socket_address_test.dart
+++ b/runtime/observatory/tests/service/bad_web_socket_address_test.dart
@@ -4,7 +4,7 @@
import 'package:logging/logging.dart';
import "package:observatory/service_io.dart";
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
void testBadWebSocket() {
var vm = new WebSocketVM(new WebSocketVMTarget('ws://karatekid/ws'));
diff --git a/runtime/observatory/tests/service/break_on_activation_test.dart b/runtime/observatory/tests/service/break_on_activation_test.dart
index 64ae8bf..fac2684 100644
--- a/runtime/observatory/tests/service/break_on_activation_test.dart
+++ b/runtime/observatory/tests/service/break_on_activation_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
genRepeater(value) {
diff --git a/runtime/observatory/tests/service/break_on_async_function_test.dart b/runtime/observatory/tests/service/break_on_async_function_test.dart
index b5bf200..dd52294 100644
--- a/runtime/observatory/tests/service/break_on_async_function_test.dart
+++ b/runtime/observatory/tests/service/break_on_async_function_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/break_on_default_constructor_test.dart b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
index 8f5d9e5..bc504c74 100644
--- a/runtime/observatory/tests/service/break_on_default_constructor_test.dart
+++ b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
@@ -7,7 +7,7 @@
import 'package:observatory/debugger.dart';
import 'package:observatory/service.dart' as S;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/break_on_function_test.dart b/runtime/observatory/tests/service/break_on_function_test.dart
index 83cfbc9..89f60fb 100644
--- a/runtime/observatory/tests/service/break_on_function_test.dart
+++ b/runtime/observatory/tests/service/break_on_function_test.dart
@@ -4,7 +4,7 @@
// VMOptions=--verbose_debug
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/breakpoint_async_break_test.dart b/runtime/observatory/tests/service/breakpoint_async_break_test.dart
index c33d670..b59613e 100644
--- a/runtime/observatory/tests/service/breakpoint_async_break_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_async_break_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart b/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart
index 7656a7b..0bc3c1f 100644
--- a/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart
@@ -5,7 +5,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
import 'package:path/path.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
@@ -69,7 +69,6 @@
},
resumeIsolate,
hasStoppedAtExit,
- resumeIsolate
];
main(args) => runIsolateTests(args, tests,
diff --git a/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart b/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
index 8c21890..4723545 100644
--- a/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
@@ -7,7 +7,7 @@
// to create a breakpoint for fast Smi ops.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/caching_test.dart b/runtime/observatory/tests/service/caching_test.dart
index b54f241..0c89eca 100644
--- a/runtime/observatory/tests/service/caching_test.dart
+++ b/runtime/observatory/tests/service/caching_test.dart
@@ -9,7 +9,7 @@
library caching_test;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/capture_stdio_test.dart b/runtime/observatory/tests/service/capture_stdio_test.dart
index 64386323..b02e476 100644
--- a/runtime/observatory/tests/service/capture_stdio_test.dart
+++ b/runtime/observatory/tests/service/capture_stdio_test.dart
@@ -6,7 +6,7 @@
import 'dart:developer';
import 'dart:io';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/causal_async_stack_contents_test.dart b/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
index 10a3669..ed77ae6 100644
--- a/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
@@ -7,7 +7,7 @@
import 'dart:developer';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
index 02d92ff..0e57f47 100644
--- a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
@@ -6,7 +6,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart b/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
index feb529e..8efcecc 100644
--- a/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
@@ -7,7 +7,7 @@
import 'dart:developer';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
index 9456579..df29834 100644
--- a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
@@ -6,7 +6,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/client_name_rpc_test.dart b/runtime/observatory/tests/service/client_name_rpc_test.dart
index b143bd5..41cbe4f 100644
--- a/runtime/observatory/tests/service/client_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/client_name_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart b/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart
index 3a57471..427706f 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'client_resume_approvals_common.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/client_resume_approvals_common.dart b/runtime/observatory/tests/service/client_resume_approvals_common.dart
index 3323484..a2221e5 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_common.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_common.dart
@@ -5,7 +5,6 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
import 'service_test_common.dart';
const String clientName = 'TestClient';
diff --git a/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart b/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
index 0dc0402..9d23522 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'client_resume_approvals_common.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart b/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart
index ffbbc06..d3a09a9 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'client_resume_approvals_common.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart b/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart
index 65989ee..5f26a9c 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'client_resume_approvals_common.dart';
import 'service_test_common.dart';
@@ -36,7 +36,7 @@
);
client3 = await createClient(isolate.owner, clientName: 'DummyClient');
- Future resumeFuture = waitForResume(isolate);
+ final resumeFuture = waitForResume(isolate);
expect(await isPausedAtStart(isolate), true);
await resume(client2, isolate);
expect(await isPausedAtStart(isolate), true);
@@ -51,13 +51,10 @@
isolate,
pauseOnExit: true,
);
- final resumeFuture = waitForResume(isolate);
await resume(client1, isolate);
expect(await isPausedAtExit(isolate), true);
await resume(client2, isolate);
- await resumeFuture;
- await isolate.reload();
- expect(await isPausedAtExit(isolate), false);
+ await waitForTargetVMExit(isolate.vm);
},
];
diff --git a/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart b/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart
index 9f0f52d..3d33112 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'client_resume_approvals_common.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart b/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
index db0b852..250d349 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'client_resume_approvals_common.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/code_test.dart b/runtime/observatory/tests/service/code_test.dart
index c904e8b..c08ef61 100644
--- a/runtime/observatory/tests/service/code_test.dart
+++ b/runtime/observatory/tests/service/code_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/collect_all_garbage_test.dart b/runtime/observatory/tests/service/collect_all_garbage_test.dart
index 8db2921..a9c0377 100644
--- a/runtime/observatory/tests/service/collect_all_garbage_test.dart
+++ b/runtime/observatory/tests/service/collect_all_garbage_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/command_test.dart b/runtime/observatory/tests/service/command_test.dart
index 86e40d5..57ca485 100644
--- a/runtime/observatory/tests/service/command_test.dart
+++ b/runtime/observatory/tests/service/command_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/cli.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
class TestCommand extends Command {
TestCommand(this.out, name, children) : super(name, children);
diff --git a/runtime/observatory/tests/service/complex_reload_test.dart b/runtime/observatory/tests/service/complex_reload_test.dart
index 2e6e35e..f0c8b93 100644
--- a/runtime/observatory/tests/service/complex_reload_test.dart
+++ b/runtime/observatory/tests/service/complex_reload_test.dart
@@ -10,7 +10,7 @@
import 'service_test_common.dart';
import 'package:observatory/service.dart';
import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
// Chop off the file name.
String baseDirectory = path.dirname(Platform.script.path) + '/';
diff --git a/runtime/observatory/tests/service/contexts_test.dart b/runtime/observatory/tests/service/contexts_test.dart
index ecc9b44..ad17f38 100644
--- a/runtime/observatory/tests/service/contexts_test.dart
+++ b/runtime/observatory/tests/service/contexts_test.dart
@@ -5,7 +5,7 @@
library inbound_references_test;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var cleanBlock, copyingBlock, fullBlock, fullBlockWithChain;
diff --git a/runtime/observatory/tests/service/coverage_const_field_async_closure_test.dart b/runtime/observatory/tests/service/coverage_const_field_async_closure_test.dart
index a89b0e9..a85a9c3 100644
--- a/runtime/observatory/tests/service/coverage_const_field_async_closure_test.dart
+++ b/runtime/observatory/tests/service/coverage_const_field_async_closure_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/coverage_leaf_function_test.dart b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
index a90ec86..c36441b 100644
--- a/runtime/observatory/tests/service/coverage_leaf_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
import 'dart:developer';
@@ -44,12 +44,12 @@
var expectedRange = {
'scriptIndex': 0,
- 'startPos': 392,
- 'endPos': 442,
+ 'startPos': 384,
+ 'endPos': 434,
'compiled': true,
'coverage': {
'hits': [],
- 'misses': [392]
+ 'misses': [384]
}
};
@@ -85,11 +85,11 @@
var expectedRange = {
'scriptIndex': 0,
- 'startPos': 392,
- 'endPos': 442,
+ 'startPos': 384,
+ 'endPos': 434,
'compiled': true,
'coverage': {
- 'hits': [392],
+ 'hits': [384],
'misses': []
}
};
diff --git a/runtime/observatory/tests/service/coverage_optimized_function_test.dart b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
index 8d68907..ad57d161 100644
--- a/runtime/observatory/tests/service/coverage_optimized_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
@@ -4,7 +4,7 @@
// VMOptions=--no_background_compilation --optimization_counter_threshold=10
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
import 'dart:developer';
@@ -37,11 +37,11 @@
var expectedRange = {
'scriptIndex': 0,
- 'startPos': 469,
- 'endPos': 536,
+ 'startPos': 461,
+ 'endPos': 528,
'compiled': true,
'coverage': {
- 'hits': [469, 509, 520, 524],
+ 'hits': [461, 501, 512, 516],
'misses': []
}
};
diff --git a/runtime/observatory/tests/service/debugger_inspect_test.dart b/runtime/observatory/tests/service/debugger_inspect_test.dart
index 767fb64..1501b32 100644
--- a/runtime/observatory/tests/service/debugger_inspect_test.dart
+++ b/runtime/observatory/tests/service/debugger_inspect_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/debugger_location_second_test.dart b/runtime/observatory/tests/service/debugger_location_second_test.dart
index 03c40b3..e8d6739 100644
--- a/runtime/observatory/tests/service/debugger_location_second_test.dart
+++ b/runtime/observatory/tests/service/debugger_location_second_test.dart
@@ -4,7 +4,7 @@
import 'package:observatory/service_io.dart';
import 'package:observatory/debugger.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/debugger_location_test.dart b/runtime/observatory/tests/service/debugger_location_test.dart
index 0ffd76c..77b939c 100644
--- a/runtime/observatory/tests/service/debugger_location_test.dart
+++ b/runtime/observatory/tests/service/debugger_location_test.dart
@@ -4,7 +4,7 @@
import 'package:observatory/service_io.dart';
import 'package:observatory/debugger.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
import 'dart:async';
@@ -82,17 +82,19 @@
// Parse script + line
(Isolate isolate) async {
var debugger = await initDebugger(isolate);
- var loc = await DebuggerLocation.parse(debugger, 'unittest.dart:15');
+ var loc = await DebuggerLocation.parse(
+ debugger, 'debugger_location_test.dart:16');
expect(loc.valid, isTrue);
- expect(loc.toString(), equals('unittest.dart:15'));
+ expect(loc.toString(), equals('debugger_location_test.dart:16'));
},
// Parse script + line + col
(Isolate isolate) async {
var debugger = await initDebugger(isolate);
- var loc = await DebuggerLocation.parse(debugger, 'unittest.dart:15:10');
+ var loc = await DebuggerLocation.parse(
+ debugger, 'debugger_location_test.dart:16:11');
expect(loc.valid, isTrue);
- expect(loc.toString(), equals('unittest.dart:15:10'));
+ expect(loc.toString(), equals('debugger_location_test.dart:16:11'));
},
// Parse bad script
diff --git a/runtime/observatory/tests/service/debugging_inlined_finally_test.dart b/runtime/observatory/tests/service/debugging_inlined_finally_test.dart
index 424952c..9012cf3 100644
--- a/runtime/observatory/tests/service/debugging_inlined_finally_test.dart
+++ b/runtime/observatory/tests/service/debugging_inlined_finally_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/debugging_test.dart b/runtime/observatory/tests/service/debugging_test.dart
index 9435ad2..55a6e05 100644
--- a/runtime/observatory/tests/service/debugging_test.dart
+++ b/runtime/observatory/tests/service/debugging_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/dev_fs_http_put_test.dart b/runtime/observatory/tests/service/dev_fs_http_put_test.dart
index faa2fa6..107778d 100644
--- a/runtime/observatory/tests/service/dev_fs_http_put_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_http_put_test.dart
@@ -6,7 +6,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
Future<String> readResponse(HttpClientResponse response) {
diff --git a/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart b/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart
index 8126f45..7801775 100644
--- a/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart
@@ -6,7 +6,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
Future<String> readResponse(HttpClientResponse response) {
diff --git a/runtime/observatory/tests/service/dev_fs_spawn_test.dart b/runtime/observatory/tests/service/dev_fs_spawn_test.dart
index 1221a58..4e76990 100644
--- a/runtime/observatory/tests/service/dev_fs_spawn_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_spawn_test.dart
@@ -6,7 +6,7 @@
import 'dart:convert';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/dev_fs_test.dart b/runtime/observatory/tests/service/dev_fs_test.dart
index eca5e3ca..920a152 100644
--- a/runtime/observatory/tests/service/dev_fs_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_test.dart
@@ -4,7 +4,7 @@
import 'dart:convert';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var tests = <VMTest>[
diff --git a/runtime/observatory/tests/service/dev_fs_uri_test.dart b/runtime/observatory/tests/service/dev_fs_uri_test.dart
index 2fda4d7..42e5150 100644
--- a/runtime/observatory/tests/service/dev_fs_uri_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_uri_test.dart
@@ -6,7 +6,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
Future<String> readResponse(HttpClientResponse response) {
diff --git a/runtime/observatory/tests/service/dev_fs_weird_char_test.dart b/runtime/observatory/tests/service/dev_fs_weird_char_test.dart
index bab7d69..f2fddce 100644
--- a/runtime/observatory/tests/service/dev_fs_weird_char_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_weird_char_test.dart
@@ -4,7 +4,7 @@
import 'dart:convert';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var tests = <VMTest>[
diff --git a/runtime/observatory/tests/service/developer_extension_test.dart b/runtime/observatory/tests/service/developer_extension_test.dart
index ad1a386..d210539 100644
--- a/runtime/observatory/tests/service/developer_extension_test.dart
+++ b/runtime/observatory/tests/service/developer_extension_test.dart
@@ -5,9 +5,10 @@
import 'dart:async';
import 'dart:convert';
import 'dart:developer';
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart';
import 'package:observatory/sample_profile.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
@@ -60,7 +61,8 @@
} catch (e) {
exceptionThrown = true;
}
- expect(exceptionThrown, isTrue);
+ // This check is running in the target process so we can't used package:test.
+ Expect.isTrue(exceptionThrown);
}
var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/developer_server_control_test.dart b/runtime/observatory/tests/service/developer_server_control_test.dart
index a4b99f3..24347ea 100644
--- a/runtime/observatory/tests/service/developer_server_control_test.dart
+++ b/runtime/observatory/tests/service/developer_server_control_test.dart
@@ -4,8 +4,8 @@
import 'dart:async';
import 'dart:developer';
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
import 'test_helper.dart';
int majorVersion;
@@ -21,39 +21,39 @@
majorVersion = info.majorVersion;
minorVersion = info.minorVersion;
serverUri = info.serverUri;
- expect(info.serverUri, isNull);
+ Expect.isNull(info.serverUri);
{
// Now, start the web server and store the URI which is expected to be
// non NULL in the top level variable.
ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
- expect(info.majorVersion, equals(majorVersion));
- expect(info.minorVersion, equals(minorVersion));
- expect(info.serverUri, isNotNull);
+ Expect.equals(info.majorVersion, majorVersion);
+ Expect.equals(info.minorVersion, minorVersion);
+ Expect.isNotNull(info.serverUri);
serverUri = info.serverUri;
}
{
// Now try starting the web server again, this should just return the
// existing state without any change (port number does not change).
ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
- expect(info.majorVersion, equals(majorVersion));
- expect(info.minorVersion, equals(minorVersion));
- expect(info.serverUri, equals(serverUri));
+ Expect.equals(info.majorVersion, majorVersion);
+ Expect.equals(info.minorVersion, minorVersion);
+ Expect.equals(info.serverUri, serverUri);
}
{
// Try turning off the web server, this should turn off the server and
// the Uri returned should be null.
ServiceProtocolInfo info = await Service.controlWebServer(enable: false);
- expect(info.majorVersion, equals(majorVersion));
- expect(info.minorVersion, equals(minorVersion));
- expect(info.serverUri, isNull);
+ Expect.equals(info.majorVersion, majorVersion);
+ Expect.equals(info.minorVersion, minorVersion);
+ Expect.isNull(info.serverUri);
}
{
// Try turning off the web server again, this should be a nop
// and the Uri returned should be null.
ServiceProtocolInfo info = await Service.controlWebServer(enable: false);
- expect(info.majorVersion, equals(majorVersion));
- expect(info.minorVersion, equals(minorVersion));
- expect(info.serverUri, isNull);
+ Expect.equals(info.majorVersion, majorVersion);
+ Expect.equals(info.minorVersion, minorVersion);
+ Expect.isNull(info.serverUri);
}
{
// Start the web server again for the test below.
@@ -61,9 +61,9 @@
majorVersion = info.majorVersion;
minorVersion = info.minorVersion;
serverUri = info.serverUri;
- expect(info.majorVersion, equals(majorVersion));
- expect(info.minorVersion, equals(minorVersion));
- expect(info.serverUri, equals(serverUri));
+ Expect.equals(info.majorVersion, majorVersion);
+ Expect.equals(info.minorVersion, minorVersion);
+ Expect.equals(info.serverUri, serverUri);
}
}
@@ -72,7 +72,7 @@
await isolate.reload();
// Just getting here means that the testee enabled the service protocol
// web server.
- expect(true, true);
+ Expect.equals(true, true);
}
];
diff --git a/runtime/observatory/tests/service/developer_service_get_isolate_id_test.dart b/runtime/observatory/tests/service/developer_service_get_isolate_id_test.dart
index 4400e47..1539e07 100644
--- a/runtime/observatory/tests/service/developer_service_get_isolate_id_test.dart
+++ b/runtime/observatory/tests/service/developer_service_get_isolate_id_test.dart
@@ -7,7 +7,7 @@
import 'dart:isolate' as Core;
import 'package:observatory/service_io.dart' as Service;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/dominator_tree_vm_test.dart b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
index be63548..ebb9c77 100644
--- a/runtime/observatory/tests/service/dominator_tree_vm_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
@@ -7,7 +7,7 @@
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
// small example from [Lenguaer & Tarjan 1979]
diff --git a/runtime/observatory/tests/service/dominator_tree_vm_with_double_field_test.dart b/runtime/observatory/tests/service/dominator_tree_vm_with_double_field_test.dart
index 9edaf23..858f10a 100644
--- a/runtime/observatory/tests/service/dominator_tree_vm_with_double_field_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_vm_with_double_field_test.dart
@@ -7,8 +7,9 @@
import 'dart:typed_data';
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
double getDoubleWithHeapObjectTag() {
@@ -119,7 +120,7 @@
k.y = r;
l.x = h;
- expect(r.fld, getDoubleWithHeapObjectTag());
+ Expect.equals(r.fld, getDoubleWithHeapObjectTag());
}
var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/echo_test.dart b/runtime/observatory/tests/service/echo_test.dart
index eda2f81..49ebe73 100644
--- a/runtime/observatory/tests/service/echo_test.dart
+++ b/runtime/observatory/tests/service/echo_test.dart
@@ -4,7 +4,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart b/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart
index c2159eb..ca25d5f 100644
--- a/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart
+++ b/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart
@@ -5,7 +5,7 @@
import 'dart:io';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
// Tests that the --enable-service-port-fallback flag works correctly by trying to bind to
diff --git a/runtime/observatory/tests/service/enable_service_port_fallback_test.dart b/runtime/observatory/tests/service/enable_service_port_fallback_test.dart
index e5fdef0..ea63b8b 100644
--- a/runtime/observatory/tests/service/enable_service_port_fallback_test.dart
+++ b/runtime/observatory/tests/service/enable_service_port_fallback_test.dart
@@ -5,7 +5,7 @@
import 'dart:io';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
// Tests that the --enable-service-port-fallback flag works correctly by trying to bind to
diff --git a/runtime/observatory/tests/service/eval_internal_class_test.dart b/runtime/observatory/tests/service/eval_internal_class_test.dart
index 0abee5e..98b5840 100644
--- a/runtime/observatory/tests/service/eval_internal_class_test.dart
+++ b/runtime/observatory/tests/service/eval_internal_class_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart b/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
index 6e06387..28f07d7 100644
--- a/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
+++ b/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
@@ -6,7 +6,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/eval_test.dart b/runtime/observatory/tests/service/eval_test.dart
index a83ef37..0eafc1e 100644
--- a/runtime/observatory/tests/service/eval_test.dart
+++ b/runtime/observatory/tests/service/eval_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart b/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart
index 9fc206a..e1a78c4 100644
--- a/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart
+++ b/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart
@@ -7,7 +7,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/evaluate_activation_test.dart b/runtime/observatory/tests/service/evaluate_activation_test.dart
index 01f1e63..059d769 100644
--- a/runtime/observatory/tests/service/evaluate_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_activation_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/evaluate_async_closure_test.dart b/runtime/observatory/tests/service/evaluate_async_closure_test.dart
index bcffa6b..4b64e63 100644
--- a/runtime/observatory/tests/service/evaluate_async_closure_test.dart
+++ b/runtime/observatory/tests/service/evaluate_async_closure_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart b/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart
index 0909420..48b6530 100644
--- a/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart
+++ b/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart b/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
index 9e63186..1f8fcd0 100644
--- a/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
+++ b/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart b/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
index 0e021dc..6607b89 100644
--- a/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart b/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart
index 34c4358..4d6771a 100644
--- a/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart b/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart
index 5ec7dfd..2e47197 100644
--- a/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart b/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
index e9724f5..fecc245 100644
--- a/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
@@ -5,7 +5,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart b/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart
index c29a44c..bbaf78f 100644
--- a/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart b/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart
index bb87130..7849fc7 100644
--- a/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart
+++ b/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
dynamic escapedClosure;
diff --git a/runtime/observatory/tests/service/evaluate_with_scope_test.dart b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
index 5b6ee5c..90ea063 100644
--- a/runtime/observatory/tests/service/evaluate_with_scope_test.dart
+++ b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var thing1;
diff --git a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
index 4feafac..2778167 100644
--- a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:io' show WebSocket;
import 'dart:convert' show jsonDecode, jsonEncode;
diff --git a/runtime/observatory/tests/service/external_service_disappear_test.dart b/runtime/observatory/tests/service/external_service_disappear_test.dart
index 6a7a0d6..eafe5a6 100644
--- a/runtime/observatory/tests/service/external_service_disappear_test.dart
+++ b/runtime/observatory/tests/service/external_service_disappear_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:io' show WebSocket;
import 'dart:convert' show jsonDecode, jsonEncode;
diff --git a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
index 37547cb..3b1e695 100644
--- a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:io' show WebSocket;
import 'dart:convert' show jsonDecode, jsonEncode;
@@ -57,7 +57,7 @@
client_invoker.first.then((_) {
expect(false, isTrue, reason: 'shouldn\'t get here');
- }).catchError((e) => e);
+ }).catchError((_) => null);
// Testing serial invocation of service which succedes
for (var iteration = 0; iteration < repetition; iteration++) {
diff --git a/runtime/observatory/tests/service/external_service_registration_test.dart b/runtime/observatory/tests/service/external_service_registration_test.dart
index bee0eec..2ec0d95 100644
--- a/runtime/observatory/tests/service/external_service_registration_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:io' show WebSocket;
import 'dart:convert' show jsonDecode, jsonEncode;
diff --git a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
index 857b292..333c24e 100644
--- a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:io' show WebSocket;
import 'dart:convert' show jsonDecode, jsonEncode;
diff --git a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
index 69ab333..97917b3 100644
--- a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:io' show WebSocket;
import 'dart:convert' show jsonDecode, jsonEncode;
diff --git a/runtime/observatory/tests/service/field_script_test.dart b/runtime/observatory/tests/service/field_script_test.dart
index 1267101..17be1b1 100644
--- a/runtime/observatory/tests/service/field_script_test.dart
+++ b/runtime/observatory/tests/service/field_script_test.dart
@@ -5,7 +5,7 @@
library field_script_test;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/file_service_test.dart b/runtime/observatory/tests/service/file_service_test.dart
index 8eb2dcf..08c6d71 100644
--- a/runtime/observatory/tests/service/file_service_test.dart
+++ b/runtime/observatory/tests/service/file_service_test.dart
@@ -6,8 +6,9 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io' as io;
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
Future setupFiles() async {
@@ -55,7 +56,7 @@
await utilFile.writeAsString('foobar');
var readTemp = new io.File(writeTemp);
var result = await readTemp.readAsString();
- expect(result, equals('foobar'));
+ Expect.equals(result, 'foobar');
} catch (e) {
closeDown();
throw e;
diff --git a/runtime/observatory/tests/service/gc_test.dart b/runtime/observatory/tests/service/gc_test.dart
index c0cab5f..20efc34 100644
--- a/runtime/observatory/tests/service/gc_test.dart
+++ b/runtime/observatory/tests/service/gc_test.dart
@@ -13,7 +13,7 @@
if (iterations <= 0) {
return;
}
- new List<int>(size);
+ new List<int>.filled(size, 0);
new Timer(duration, () => grow(iterations - 1, size, duration));
};
grow(100, 1 << 24, new Duration(seconds: 1));
diff --git a/runtime/observatory/tests/service/get_allocation_profile_public_rpc_test.dart b/runtime/observatory/tests/service/get_allocation_profile_public_rpc_test.dart
index 85b2aff..d1c81e0 100644
--- a/runtime/observatory/tests/service/get_allocation_profile_public_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_allocation_profile_public_rpc_test.dart
@@ -4,7 +4,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart b/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart
index 8d5c88e..05ab7c8 100644
--- a/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart
@@ -4,7 +4,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_allocation_samples_test.dart b/runtime/observatory/tests/service/get_allocation_samples_test.dart
index 38dabcf..2370433 100644
--- a/runtime/observatory/tests/service/get_allocation_samples_test.dart
+++ b/runtime/observatory/tests/service/get_allocation_samples_test.dart
@@ -6,7 +6,7 @@
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
import 'package:observatory/sample_profile.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_client_name_rpc_test.dart b/runtime/observatory/tests/service/get_client_name_rpc_test.dart
index a3af0a6..d503a91 100644
--- a/runtime/observatory/tests/service/get_client_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_client_name_rpc_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart b/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart
index 5b7d1ec..db43578 100644
--- a/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart
@@ -4,7 +4,7 @@
import 'package:observatory/src/repositories/timeline_base.dart';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart b/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart
index 542b476..93a7353 100644
--- a/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_flag_list_rpc_test.dart b/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
index 35484f6..f1c2c54 100644
--- a/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_heap_map_rpc_test.dart b/runtime/observatory/tests/service/get_heap_map_rpc_test.dart
index d5ff5c0..c85a561 100644
--- a/runtime/observatory/tests/service/get_heap_map_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_heap_map_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_instances_rpc_test.dart b/runtime/observatory/tests/service/get_instances_rpc_test.dart
index 8479483..0f234be 100644
--- a/runtime/observatory/tests/service/get_instances_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_instances_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_isolate_after_async_error_test.dart b/runtime/observatory/tests/service/get_isolate_after_async_error_test.dart
index e61d1b1..814cb7b 100644
--- a/runtime/observatory/tests/service/get_isolate_after_async_error_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_after_async_error_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/get_isolate_after_language_error_test.dart b/runtime/observatory/tests/service/get_isolate_after_language_error_test.dart
index 4a7e076..425eb53 100644
--- a/runtime/observatory/tests/service/get_isolate_after_language_error_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_after_language_error_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/get_isolate_after_stack_overflow_error_test.dart b/runtime/observatory/tests/service/get_isolate_after_stack_overflow_error_test.dart
index 0db543b..ab1c05d 100644
--- a/runtime/observatory/tests/service/get_isolate_after_stack_overflow_error_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_after_stack_overflow_error_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/get_isolate_after_sync_error_test.dart b/runtime/observatory/tests/service/get_isolate_after_sync_error_test.dart
index cdf2763..8d0db3c 100644
--- a/runtime/observatory/tests/service/get_isolate_after_sync_error_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_after_sync_error_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart b/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart
index 8a834d9..1bdb6bd 100644
--- a/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart
+++ b/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_isolate_rpc_test.dart b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
index 1b89f8c..2346282 100644
--- a/runtime/observatory/tests/service/get_isolate_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_memory_usage.dart b/runtime/observatory/tests/service/get_memory_usage.dart
index 96832c2..19ce0d2 100644
--- a/runtime/observatory/tests/service/get_memory_usage.dart
+++ b/runtime/observatory/tests/service/get_memory_usage.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_native_allocation_samples_test.dart b/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
index 7ade11d..31f5325 100644
--- a/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
+++ b/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
@@ -7,7 +7,7 @@
import 'package:observatory/sample_profile.dart';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
void verifyHelper(var root, bool exclusive) {
diff --git a/runtime/observatory/tests/service/get_object_rpc_test.dart b/runtime/observatory/tests/service/get_object_rpc_test.dart
index a19a869..faf5eca 100644
--- a/runtime/observatory/tests/service/get_object_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_object_rpc_test.dart
@@ -7,13 +7,13 @@
import 'dart:typed_data';
import 'dart:convert' show base64Decode;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
class _DummyClass {
static var dummyVar = 11;
- final List<String> dummyList = new List<String>(20);
+ final List<String> dummyList = new List<String>.filled(20, null);
void dummyFunction() {}
}
diff --git a/runtime/observatory/tests/service/get_object_store_rpc_test.dart b/runtime/observatory/tests/service/get_object_store_rpc_test.dart
index a98b595..cf50555 100644
--- a/runtime/observatory/tests/service/get_object_store_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_object_store_rpc_test.dart
@@ -4,7 +4,7 @@
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_ports_rpc_test.dart b/runtime/observatory/tests/service/get_ports_rpc_test.dart
index 343bb48..61b6678 100644
--- a/runtime/observatory/tests/service/get_ports_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_ports_rpc_test.dart
@@ -6,7 +6,7 @@
import 'dart:isolate' hide Isolate;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_retained_size_rpc_test.dart b/runtime/observatory/tests/service/get_retained_size_rpc_test.dart
index 318c511..7060f13 100644
--- a/runtime/observatory/tests/service/get_retained_size_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_retained_size_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart b/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
index e9f6e55..78cacc0 100644
--- a/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_scripts_rpc_test.dart b/runtime/observatory/tests/service/get_scripts_rpc_test.dart
index c22da46..9331adb 100644
--- a/runtime/observatory/tests/service/get_scripts_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_scripts_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index 7abd05e..731e2f3 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/get_source_report_with_mixin_test.dart b/runtime/observatory/tests/service/get_source_report_with_mixin_test.dart
index ff2d41b..db85b1a 100644
--- a/runtime/observatory/tests/service/get_source_report_with_mixin_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_with_mixin_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/get_stack_rpc_test.dart b/runtime/observatory/tests/service/get_stack_rpc_test.dart
index a322752..db1695f 100644
--- a/runtime/observatory/tests/service/get_stack_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_stack_rpc_test.dart
@@ -4,7 +4,7 @@
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart b/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart
index e65dddf..9f69aeb 100644
--- a/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 4503f6e..caaa488 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_vm_rpc_test.dart b/runtime/observatory/tests/service/get_vm_rpc_test.dart
index 0e924a3..97f973a 100644
--- a/runtime/observatory/tests/service/get_vm_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_rpc_test.dart
@@ -6,7 +6,7 @@
import 'dart:io';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_vm_timeline_micros_rpc_test.dart b/runtime/observatory/tests/service/get_vm_timeline_micros_rpc_test.dart
index e8fa8e6..98a5150 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_micros_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_micros_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
index 25bcec0..b149a7e 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
@@ -6,7 +6,7 @@
import 'dart:io';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/get_zone_memory_info_rpc_test.dart b/runtime/observatory/tests/service/get_zone_memory_info_rpc_test.dart
index d4d5467..428c42e 100644
--- a/runtime/observatory/tests/service/get_zone_memory_info_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_zone_memory_info_rpc_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/http_enable_timeline_logging_service_test.dart b/runtime/observatory/tests/service/http_enable_timeline_logging_service_test.dart
index f880308..d3b3df8 100644
--- a/runtime/observatory/tests/service/http_enable_timeline_logging_service_test.dart
+++ b/runtime/observatory/tests/service/http_enable_timeline_logging_service_test.dart
@@ -4,7 +4,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/http_get_isolate_group_rpc_common.dart b/runtime/observatory/tests/service/http_get_isolate_group_rpc_common.dart
index 2b28be5..ebe21f5 100644
--- a/runtime/observatory/tests/service/http_get_isolate_group_rpc_common.dart
+++ b/runtime/observatory/tests/service/http_get_isolate_group_rpc_common.dart
@@ -6,8 +6,8 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io' as io;
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
import 'test_helper.dart';
Future<String> getIsolateGroupId(
@@ -36,7 +36,7 @@
print(await Service.getInfo());
// Start the web server.
final ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
- expect(info.serverUri, isNotNull);
+ Expect.isNotNull(info.serverUri);
final httpClient = new io.HttpClient();
// Build the request.
@@ -63,13 +63,13 @@
.transform(json.decoder)
.first;
final result = jsonResponse['result'];
- expect(result['type'], equals('IsolateGroup'));
- expect(result['id'], startsWith('isolateGroups/'));
- expect(result['number'], new isInstanceOf<String>());
- expect(result['isolates'].length, isPositive);
- expect(result['isolates'][0]['type'], equals('@Isolate'));
+ Expect.equals(result['type'], 'IsolateGroup');
+ Expect.isTrue(result['id'].startsWith('isolateGroups/'));
+ Expect.type<String>(result['number']);
+ Expect.isTrue(result['isolates'].length > 0);
+ Expect.equals(result['isolates'][0]['type'], '@Isolate');
} catch (e) {
- fail('invalid request: $e');
+ Expect.fail('invalid request: $e');
}
}
@@ -78,6 +78,5 @@
await isolate.reload();
// Just getting here means that the testee enabled the service protocol
// web server.
- expect(true, true);
}
];
diff --git a/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart b/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart
index f49e5a4..6d487c2 100644
--- a/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart
+++ b/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart
@@ -6,8 +6,8 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io' as io;
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
import 'test_helper.dart';
Future<String> getIsolateId(io.HttpClient httpClient, Uri serverUri) async {
@@ -35,7 +35,7 @@
print(await Service.getInfo());
// Start the web server.
ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
- expect(info.serverUri, isNotNull);
+ Expect.isNotNull(info.serverUri);
var httpClient = new io.HttpClient();
// Build the request.
@@ -61,26 +61,26 @@
.transform(json.decoder)
.first;
Map result = response['result'];
- expect(result['type'], equals('Isolate'));
- expect(result['id'], startsWith('isolates/'));
- expect(result['number'], new isInstanceOf<String>());
- expect(result['_originNumber'], equals(result['number']));
- expect(result['startTime'], isPositive);
- expect(result['livePorts'], isPositive);
- expect(result['pauseOnExit'], isFalse);
- expect(result['pauseEvent']['type'], equals('Event'));
- expect(result['error'], isNull);
- expect(result['_numZoneHandles'], isPositive);
- expect(result['_numScopedHandles'], isPositive);
- expect(result['rootLib']['type'], equals('@Library'));
- expect(result['libraries'].length, isPositive);
- expect(result['libraries'][0]['type'], equals('@Library'));
- expect(result['breakpoints'].length, isZero);
- expect(result['_heaps']['new']['type'], equals('HeapSpace'));
- expect(result['_heaps']['old']['type'], equals('HeapSpace'));
- expect(result['isolate_group']['type'], equals('@IsolateGroup'));
+ Expect.equals(result['type'], 'Isolate');
+ Expect.isTrue(result['id'].startsWith('isolates/'));
+ Expect.type<String>(result['number']);
+ Expect.equals(result['_originNumber'], result['number']);
+ Expect.isTrue(result['startTime'] > 0);
+ Expect.isTrue(result['livePorts'] > 0);
+ Expect.isFalse(result['pauseOnExit']);
+ Expect.equals(result['pauseEvent']['type'], 'Event');
+ Expect.isNull(result['error']);
+ Expect.isTrue(result['_numZoneHandles'] > 0);
+ Expect.isTrue(result['_numScopedHandles'] > 0);
+ Expect.equals(result['rootLib']['type'], '@Library');
+ Expect.isTrue(result['libraries'].length > 0);
+ Expect.equals(result['libraries'][0]['type'], '@Library');
+ Expect.equals(result['breakpoints'].length, 0);
+ Expect.equals(result['_heaps']['new']['type'], 'HeapSpace');
+ Expect.equals(result['_heaps']['old']['type'], 'HeapSpace');
+ Expect.equals(result['isolate_group']['type'], '@IsolateGroup');
} catch (e) {
- fail('invalid request: $e');
+ Expect.fail('invalid request: $e');
}
}
@@ -89,6 +89,5 @@
await isolate.reload();
// Just getting here means that the testee enabled the service protocol
// web server.
- expect(true, true);
}
];
diff --git a/runtime/observatory/tests/service/http_get_vm_rpc_common.dart b/runtime/observatory/tests/service/http_get_vm_rpc_common.dart
index 18a0abe..b9b405e 100644
--- a/runtime/observatory/tests/service/http_get_vm_rpc_common.dart
+++ b/runtime/observatory/tests/service/http_get_vm_rpc_common.dart
@@ -6,8 +6,8 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io' as io;
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
import 'test_helper.dart';
Future<Null> testeeBefore() async {
@@ -15,7 +15,7 @@
print(await Service.getInfo());
// Start the web server.
ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
- expect(info.serverUri, isNotNull);
+ Expect.isNotNull(info.serverUri);
var httpClient = new io.HttpClient();
// Build the request.
@@ -36,20 +36,20 @@
.transform(json.decoder)
.first;
Map result = response['result'];
- expect(result['type'], equals('VM'));
- expect(result['name'], equals('vm'));
- expect(result['architectureBits'], isPositive);
- expect(result['targetCPU'], new isInstanceOf<String>());
- expect(result['hostCPU'], new isInstanceOf<String>());
- expect(result['version'], new isInstanceOf<String>());
- expect(result['pid'], new isInstanceOf<int>());
- expect(result['startTime'], isPositive);
- expect(result['isolates'].length, isPositive);
- expect(result['isolates'][0]['type'], equals('@Isolate'));
- expect(result['isolateGroups'].length, isPositive);
- expect(result['isolateGroups'][0]['type'], equals('@IsolateGroup'));
+ Expect.equals(result['type'], 'VM');
+ Expect.equals(result['name'], 'vm');
+ Expect.isTrue(result['architectureBits'] > 0);
+ Expect.type<String>(result['targetCPU']);
+ Expect.type<String>(result['hostCPU']);
+ Expect.type<String>(result['version']);
+ Expect.type<int>(result['pid']);
+ Expect.isTrue(result['startTime'] > 0);
+ Expect.isTrue(result['isolates'].length > 0);
+ Expect.equals(result['isolates'][0]['type'], '@Isolate');
+ Expect.isTrue(result['isolateGroups'].length > 0);
+ Expect.equals(result['isolateGroups'][0]['type'], '@IsolateGroup');
} catch (e) {
- fail('invalid request: $e');
+ Expect.fail('invalid request: $e');
}
}
@@ -58,6 +58,5 @@
await isolate.reload();
// Just getting here means that the testee enabled the service protocol
// web server.
- expect(true, true);
}
];
diff --git a/runtime/observatory/tests/service/implicit_getter_setter_test.dart b/runtime/observatory/tests/service/implicit_getter_setter_test.dart
index 25423e3..30710d5 100644
--- a/runtime/observatory/tests/service/implicit_getter_setter_test.dart
+++ b/runtime/observatory/tests/service/implicit_getter_setter_test.dart
@@ -6,7 +6,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
class A {
diff --git a/runtime/observatory/tests/service/inbound_references_test.dart b/runtime/observatory/tests/service/inbound_references_test.dart
index fddc8ba..4c1e496 100644
--- a/runtime/observatory/tests/service/inbound_references_test.dart
+++ b/runtime/observatory/tests/service/inbound_references_test.dart
@@ -5,7 +5,7 @@
library inbound_references_test;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
class Node {
diff --git a/runtime/observatory/tests/service/instance_field_order_rpc_test.dart b/runtime/observatory/tests/service/instance_field_order_rpc_test.dart
index c531ad6..9ff16e4 100644
--- a/runtime/observatory/tests/service/instance_field_order_rpc_test.dart
+++ b/runtime/observatory/tests/service/instance_field_order_rpc_test.dart
@@ -5,7 +5,7 @@
library get_object_rpc_test;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
class Super {
diff --git a/runtime/observatory/tests/service/invoke_skip_breakpoint.dart b/runtime/observatory/tests/service/invoke_skip_breakpoint.dart
index d2d258c..825f94b 100644
--- a/runtime/observatory/tests/service/invoke_skip_breakpoint.dart
+++ b/runtime/observatory/tests/service/invoke_skip_breakpoint.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/invoke_test.dart b/runtime/observatory/tests/service/invoke_test.dart
index 437a86d..8a9ebb7 100644
--- a/runtime/observatory/tests/service/invoke_test.dart
+++ b/runtime/observatory/tests/service/invoke_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/isolate_lifecycle_test.dart b/runtime/observatory/tests/service/isolate_lifecycle_test.dart
index 57d3eb0..a4a364b 100644
--- a/runtime/observatory/tests/service/isolate_lifecycle_test.dart
+++ b/runtime/observatory/tests/service/isolate_lifecycle_test.dart
@@ -8,7 +8,7 @@
import 'package:observatory/service_io.dart';
import 'package:observatory/models.dart' as M;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/issue_25465_test.dart b/runtime/observatory/tests/service/issue_25465_test.dart
index 41cb026..4b17e14 100644
--- a/runtime/observatory/tests/service/issue_25465_test.dart
+++ b/runtime/observatory/tests/service/issue_25465_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/issue_30555_test.dart b/runtime/observatory/tests/service/issue_30555_test.dart
index b804d9e..22f6a2b 100644
--- a/runtime/observatory/tests/service/issue_30555_test.dart
+++ b/runtime/observatory/tests/service/issue_30555_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/kill_paused_test.dart b/runtime/observatory/tests/service/kill_paused_test.dart
index cf88edd..ad42edc 100644
--- a/runtime/observatory/tests/service/kill_paused_test.dart
+++ b/runtime/observatory/tests/service/kill_paused_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_common.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/kill_running_test.dart b/runtime/observatory/tests/service/kill_running_test.dart
index 5fe16b7..c62a85c 100644
--- a/runtime/observatory/tests/service/kill_running_test.dart
+++ b/runtime/observatory/tests/service/kill_running_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_common.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/library_dependency_test.dart b/runtime/observatory/tests/service/library_dependency_test.dart
index a485b78..99df38d 100644
--- a/runtime/observatory/tests/service/library_dependency_test.dart
+++ b/runtime/observatory/tests/service/library_dependency_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
export 'dart:collection';
diff --git a/runtime/observatory/tests/service/local_variable_declaration_test.dart b/runtime/observatory/tests/service/local_variable_declaration_test.dart
index 2c59824..f7e696a 100644
--- a/runtime/observatory/tests/service/local_variable_declaration_test.dart
+++ b/runtime/observatory/tests/service/local_variable_declaration_test.dart
@@ -4,7 +4,7 @@
// VMOptions=--verbose_debug
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/logging_test.dart b/runtime/observatory/tests/service/logging_test.dart
index 5e24f01..4acf8b0 100644
--- a/runtime/observatory/tests/service/logging_test.dart
+++ b/runtime/observatory/tests/service/logging_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer' as developer;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'package:logging/logging.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/malformed_test.dart b/runtime/observatory/tests/service/malformed_test.dart
index 5738afe..5fff3fd 100644
--- a/runtime/observatory/tests/service/malformed_test.dart
+++ b/runtime/observatory/tests/service/malformed_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/metrics_test.dart b/runtime/observatory/tests/service/metrics_test.dart
index 328a2ca..b35806c 100644
--- a/runtime/observatory/tests/service/metrics_test.dart
+++ b/runtime/observatory/tests/service/metrics_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/mirror_references_test.dart b/runtime/observatory/tests/service/mirror_references_test.dart
index f0c9019..1567d2d 100644
--- a/runtime/observatory/tests/service/mirror_references_test.dart
+++ b/runtime/observatory/tests/service/mirror_references_test.dart
@@ -6,7 +6,7 @@
import 'dart:mirrors';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
class Foo {}
diff --git a/runtime/observatory/tests/service/native_metrics_test.dart b/runtime/observatory/tests/service/native_metrics_test.dart
index e8afd57..0cb1394 100644
--- a/runtime/observatory/tests/service/native_metrics_test.dart
+++ b/runtime/observatory/tests/service/native_metrics_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/network_profiling_test.dart b/runtime/observatory/tests/service/network_profiling_test.dart
index 9ec766f6..c02b278 100644
--- a/runtime/observatory/tests/service/network_profiling_test.dart
+++ b/runtime/observatory/tests/service/network_profiling_test.dart
@@ -8,7 +8,7 @@
import 'dart:io' as io;
import 'dart:isolate';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/object_graph_vm_test.dart b/runtime/observatory/tests/service/object_graph_vm_test.dart
index 669d096..852c823 100644
--- a/runtime/observatory/tests/service/object_graph_vm_test.dart
+++ b/runtime/observatory/tests/service/object_graph_vm_test.dart
@@ -5,7 +5,7 @@
import 'package:observatory/models.dart' as M;
import 'package:observatory/object_graph.dart';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
class Foo {
diff --git a/runtime/observatory/tests/service/observatory_assets_test.dart b/runtime/observatory/tests/service/observatory_assets_test.dart
index 43054f6..4b8f8e2 100644
--- a/runtime/observatory/tests/service/observatory_assets_test.dart
+++ b/runtime/observatory/tests/service/observatory_assets_test.dart
@@ -4,7 +4,7 @@
import 'dart:io';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/parameters_in_scope_at_entry_test.dart b/runtime/observatory/tests/service/parameters_in_scope_at_entry_test.dart
index 7c8623a..03285f4 100644
--- a/runtime/observatory/tests/service/parameters_in_scope_at_entry_test.dart
+++ b/runtime/observatory/tests/service/parameters_in_scope_at_entry_test.dart
@@ -6,7 +6,7 @@
import 'package:observatory/service_io.dart';
import 'test_helper.dart';
import 'dart:developer';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/pause_idle_isolate_test.dart b/runtime/observatory/tests/service/pause_idle_isolate_test.dart
index cefff87..672b13a 100644
--- a/runtime/observatory/tests/service/pause_idle_isolate_test.dart
+++ b/runtime/observatory/tests/service/pause_idle_isolate_test.dart
@@ -7,7 +7,7 @@
import 'dart:isolate' show ReceivePort;
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/pause_on_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_exceptions_test.dart
index b30206b..05dae04 100644
--- a/runtime/observatory/tests/service/pause_on_exceptions_test.dart
+++ b/runtime/observatory/tests/service/pause_on_exceptions_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/pause_on_start_and_exit_test.dart b/runtime/observatory/tests/service/pause_on_start_and_exit_test.dart
index 1326441..f1aff65 100644
--- a/runtime/observatory/tests/service/pause_on_start_and_exit_test.dart
+++ b/runtime/observatory/tests/service/pause_on_start_and_exit_test.dart
@@ -4,7 +4,7 @@
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart b/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart
index 756d169..1d3a8bf 100644
--- a/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart
+++ b/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart
@@ -4,7 +4,7 @@
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
import 'dart:isolate' as isolate;
diff --git a/runtime/observatory/tests/service/pause_on_start_then_step_test.dart b/runtime/observatory/tests/service/pause_on_start_then_step_test.dart
index 4791e6d..93cefb4 100644
--- a/runtime/observatory/tests/service/pause_on_start_then_step_test.dart
+++ b/runtime/observatory/tests/service/pause_on_start_then_step_test.dart
@@ -4,7 +4,7 @@
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
index bc12e54..850177a 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
@@ -8,7 +8,7 @@
import 'package:observatory/service_io.dart';
import 'package:observatory/models.dart' as M;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart
index e46654b..5871f60 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart
@@ -6,7 +6,7 @@
// function. Regression test for https://dartbug.com/38697.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
index c9ab632..05cf750 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
@@ -6,7 +6,7 @@
import 'package:observatory/service_io.dart';
import 'package:observatory/models.dart' as M;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_exceptions_test.dart
index 3921ac7..62cf7df 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_exceptions_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_exceptions_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/positive_token_pos_test.dart b/runtime/observatory/tests/service/positive_token_pos_test.dart
index 72d54dd..ee8dbad 100644
--- a/runtime/observatory/tests/service/positive_token_pos_test.dart
+++ b/runtime/observatory/tests/service/positive_token_pos_test.dart
@@ -5,7 +5,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/process_service_test.dart b/runtime/observatory/tests/service/process_service_test.dart
index 045ed2c..02e71fc 100644
--- a/runtime/observatory/tests/service/process_service_test.dart
+++ b/runtime/observatory/tests/service/process_service_test.dart
@@ -9,7 +9,7 @@
import 'package:observatory/service_io.dart';
import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/reachable_size_test.dart b/runtime/observatory/tests/service/reachable_size_test.dart
index 800ebb2..6bc92f5 100644
--- a/runtime/observatory/tests/service/reachable_size_test.dart
+++ b/runtime/observatory/tests/service/reachable_size_test.dart
@@ -4,7 +4,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/regexp_function_test.dart b/runtime/observatory/tests/service/regexp_function_test.dart
index 6fb09bc..a44cb5b 100644
--- a/runtime/observatory/tests/service/regexp_function_test.dart
+++ b/runtime/observatory/tests/service/regexp_function_test.dart
@@ -4,8 +4,9 @@
// VMOptions=
// VMOptions=--interpret_irregexp
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var regex0;
@@ -17,7 +18,7 @@
regex = new RegExp(r"(\w+)");
String str = "Parse my string";
Iterable<Match> matches = regex.allMatches(str); // Run to generate bytecode.
- expect(matches.length, equals(3));
+ Expect.equals(matches.length, 3);
}
var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/regress_28443_test.dart b/runtime/observatory/tests/service/regress_28443_test.dart
index bd585b9..ccdec12 100644
--- a/runtime/observatory/tests/service/regress_28443_test.dart
+++ b/runtime/observatory/tests/service/regress_28443_test.dart
@@ -6,7 +6,7 @@
import 'test_helper.dart';
import 'service_test_common.dart';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
const int LINE_A = 28, LINE_B = 33;
diff --git a/runtime/observatory/tests/service/regress_28980_test.dart b/runtime/observatory/tests/service/regress_28980_test.dart
index 65a59ae..56fac2a 100644
--- a/runtime/observatory/tests/service/regress_28980_test.dart
+++ b/runtime/observatory/tests/service/regress_28980_test.dart
@@ -6,7 +6,7 @@
import 'test_helper.dart';
import 'service_test_common.dart';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
const int LINE_A = 19, LINE_B = 38;
diff --git a/runtime/observatory/tests/service/regress_34841_test.dart b/runtime/observatory/tests/service/regress_34841_test.dart
index c53a9e9..05bb56a 100644
--- a/runtime/observatory/tests/service/regress_34841_test.dart
+++ b/runtime/observatory/tests/service/regress_34841_test.dart
@@ -8,7 +8,7 @@
// (i.e. not actual) positions in this file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
import 'dart:developer';
diff --git a/runtime/observatory/tests/service/rewind_optimized_out_test.dart b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
index 304678d..97aca1c 100644
--- a/runtime/observatory/tests/service/rewind_optimized_out_test.dart
+++ b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/rewind_test.dart b/runtime/observatory/tests/service/rewind_test.dart
index 059d5f1..87e46ec 100644
--- a/runtime/observatory/tests/service/rewind_test.dart
+++ b/runtime/observatory/tests/service/rewind_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index 57227cd..85df4f6 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -8,7 +8,8 @@
import 'dart:io' show Platform;
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_common.dart';
-import 'package:unittest/unittest.dart';
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
typedef Future IsolateTest(Isolate isolate);
typedef Future VMTest(VM vm);
@@ -579,3 +580,5 @@
}
return result;
}
+
+Future<void> waitForTargetVMExit(VM vm) async => await vm.onDisconnect;
diff --git a/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart b/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
index 2a14bbb..1a5c8fd 100644
--- a/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
@@ -5,7 +5,7 @@
library set_library_debuggable_rpc_test;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/set_library_debuggable_test.dart b/runtime/observatory/tests/service/set_library_debuggable_test.dart
index 6550a89..4ffbcb6 100644
--- a/runtime/observatory/tests/service/set_library_debuggable_test.dart
+++ b/runtime/observatory/tests/service/set_library_debuggable_test.dart
@@ -6,7 +6,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/set_name_rpc_test.dart b/runtime/observatory/tests/service/set_name_rpc_test.dart
index 186e4e0..1e4253d 100644
--- a/runtime/observatory/tests/service/set_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_name_rpc_test.dart
@@ -4,7 +4,7 @@
// VMOptions=--vm-name=Walter
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/set_vm_name_rpc_test.dart b/runtime/observatory/tests/service/set_vm_name_rpc_test.dart
index 3a7c62c..67ad461 100644
--- a/runtime/observatory/tests/service/set_vm_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_vm_name_rpc_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var tests = <VMTest>[
diff --git a/runtime/observatory/tests/service/simple_reload_test.dart b/runtime/observatory/tests/service/simple_reload_test.dart
index 3ae8295..f67c95d 100644
--- a/runtime/observatory/tests/service/simple_reload_test.dart
+++ b/runtime/observatory/tests/service/simple_reload_test.dart
@@ -12,7 +12,7 @@
import 'service_test_common.dart';
import 'package:observatory/service.dart';
import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
// Chop off the file name.
String baseDirectory = path.dirname(Platform.script.path) + '/';
diff --git a/runtime/observatory/tests/service/steal_breakpoint_test.dart b/runtime/observatory/tests/service/steal_breakpoint_test.dart
index 540eda4..4fe7d08 100644
--- a/runtime/observatory/tests/service/steal_breakpoint_test.dart
+++ b/runtime/observatory/tests/service/steal_breakpoint_test.dart
@@ -4,7 +4,7 @@
// VMOptions=--steal-breakpoints
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
import 'dart:async';
diff --git a/runtime/observatory/tests/service/step_over_await_test.dart b/runtime/observatory/tests/service/step_over_await_test.dart
index 3471106..e8103b2 100644
--- a/runtime/observatory/tests/service/step_over_await_test.dart
+++ b/runtime/observatory/tests/service/step_over_await_test.dart
@@ -11,7 +11,7 @@
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
const int LINE_A = 22;
const int LINE_B = 24;
diff --git a/runtime/observatory/tests/service/step_test.dart b/runtime/observatory/tests/service/step_test.dart
index 973a208..01aaeb0 100644
--- a/runtime/observatory/tests/service/step_test.dart
+++ b/runtime/observatory/tests/service/step_test.dart
@@ -6,7 +6,7 @@
import 'test_helper.dart';
import 'service_test_common.dart';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
const int LINE_A = 14;
diff --git a/runtime/observatory/tests/service/string_escaping_test.dart b/runtime/observatory/tests/service/string_escaping_test.dart
index 81783d6..8a11dfb 100644
--- a/runtime/observatory/tests/service/string_escaping_test.dart
+++ b/runtime/observatory/tests/service/string_escaping_test.dart
@@ -6,7 +6,7 @@
import 'dart:async';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var ascii;
diff --git a/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart b/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart
index 740a138..8996577 100644
--- a/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart
+++ b/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart
@@ -6,7 +6,7 @@
import 'dart:convert';
import 'dart:io' as io;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
/// Test that we correctly remove sockets that have been closed from the list
diff --git a/runtime/observatory/tests/service/tcp_socket_service_test.dart b/runtime/observatory/tests/service/tcp_socket_service_test.dart
index 889c50d..9e61a01 100644
--- a/runtime/observatory/tests/service/tcp_socket_service_test.dart
+++ b/runtime/observatory/tests/service/tcp_socket_service_test.dart
@@ -6,7 +6,7 @@
import 'dart:convert';
import 'dart:io' as io;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
Future setupTCP() async {
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index ad76a66..1dd5989 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -8,6 +8,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
export 'service_test_common.dart' show IsolateTest, VMTest;
@@ -53,7 +54,7 @@
bool pause_on_exit: false}) async {
if (!pause_on_start) {
if (testeeBefore != null) {
- var result = testeeBefore();
+ final result = testeeBefore();
if (result is Future) {
await result;
}
@@ -61,7 +62,7 @@
print(''); // Print blank line to signal that testeeBefore has run.
}
if (testeeConcurrent != null) {
- var result = testeeConcurrent();
+ final result = testeeConcurrent();
if (result is Future) {
await result;
}
@@ -150,9 +151,9 @@
List<String> executableArgs) {
assert(!_shouldLaunchSkyShell());
- String dartExecutable = Platform.executable;
+ final String dartExecutable = Platform.executable;
- var fullArgs = <String>[];
+ final fullArgs = <String>[];
if (pause_on_start) {
fullArgs.add('--pause-isolates-on-start');
}
@@ -189,10 +190,10 @@
List<String> executableArgs) {
assert(_shouldLaunchSkyShell());
- String dartExecutable = _skyShellPath();
+ final String dartExecutable = _skyShellPath();
- var dartFlags = <String>[];
- var fullArgs = <String>[];
+ final dartFlags = <String>[];
+ final fullArgs = <String>[];
if (pause_on_start) {
dartFlags.add('--pause_isolates_on_start');
fullArgs.add('--start-paused');
@@ -221,8 +222,8 @@
Future<Process> _spawnCommon(String executable, List<String> arguments,
Map<String, String> dartEnvironment) {
- var environment = _TESTEE_SPAWN_ENV;
- var bashEnvironment = new StringBuffer();
+ final environment = _TESTEE_SPAWN_ENV;
+ final bashEnvironment = new StringBuffer();
environment.forEach((k, v) => bashEnvironment.write("$k=$v "));
if (dartEnvironment != null) {
dartEnvironment.forEach((k, v) {
@@ -336,10 +337,11 @@
executableArgs = Platform.executableArguments;
}
- var process = new _ServiceTesteeLauncher();
- bool testsDone = false;
- runZoned(() {
- process
+ final process = new _ServiceTesteeLauncher();
+ final name = Platform.script.pathSegments.last;
+ WebSocketVM vm;
+ setUp(() async {
+ await process
.launch(
pause_on_start,
pause_on_exit,
@@ -351,23 +353,26 @@
executableArgs)
.then((Uri serverAddress) async {
if (mainArgs.contains("--gdb")) {
- var pid = process.process.pid;
- var wait = new Duration(seconds: 10);
+ final pid = process.process.pid;
+ final wait = new Duration(seconds: 10);
print("Testee has pid $pid, waiting $wait before continuing");
sleep(wait);
}
setupAddresses(serverAddress);
- var name = Platform.script.pathSegments.last;
- var vm =
- new WebSocketVM(new WebSocketVMTarget(serviceWebsocketAddress));
+ vm = new WebSocketVM(new WebSocketVMTarget(serviceWebsocketAddress));
print('Loading VM...');
await vm.load();
print('Done loading VM');
+ });
+ });
+ test(
+ name,
+ () async {
// Run vm tests.
if (vmTests != null) {
- var testIndex = 1;
- var totalTests = vmTests.length;
+ int testIndex = 1;
+ final totalTests = vmTests.length;
for (var test in vmTests) {
vm.verbose = verbose_vm;
print('Running $name [$testIndex/$totalTests]');
@@ -378,9 +383,9 @@
// Run isolate tests.
if (isolateTests != null) {
- var isolate = await getFirstIsolate(vm);
- var testIndex = 1;
- var totalTests = isolateTests.length;
+ final isolate = await getFirstIsolate(vm);
+ int testIndex = 1;
+ final totalTests = isolateTests.length;
for (var test in isolateTests) {
vm.verbose = verbose_vm;
print('Running $name [$testIndex/$totalTests]');
@@ -388,26 +393,21 @@
await test(isolate);
}
}
+ },
+ retry: 0,
+ // Some service tests run fairly long (e.g., valid_source_locations_test).
+ timeout: Timeout.none,
+ );
- print('All service tests completed successfully.');
- testsDone = true;
- process.requestExit();
- });
- }, onError: (error, stackTrace) {
- if (testsDone) {
- print('Ignoring late exception during process exit:\n'
- '$error\n#stackTrace');
- } else {
- process.requestExit();
- print('Unexpected exception in service tests: $error\n$stackTrace');
- throw error;
- }
+ tearDown(() {
+ print('All service tests completed successfully.');
+ process.requestExit();
});
}
Future<Isolate> getFirstIsolate(WebSocketVM vm) async {
if (vm.isolates.isNotEmpty) {
- var isolate = await vm.isolates.first.load();
+ final isolate = await vm.isolates.first.load();
if (isolate is Isolate) {
return isolate;
}
diff --git a/runtime/observatory/tests/service/type_arguments_test.dart b/runtime/observatory/tests/service/type_arguments_test.dart
index fe3f925..1c2a6ac 100644
--- a/runtime/observatory/tests/service/type_arguments_test.dart
+++ b/runtime/observatory/tests/service/type_arguments_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/typed_data_test.dart b/runtime/observatory/tests/service/typed_data_test.dart
index 1459af5..d96583a 100644
--- a/runtime/observatory/tests/service/typed_data_test.dart
+++ b/runtime/observatory/tests/service/typed_data_test.dart
@@ -6,7 +6,7 @@
import 'dart:typed_data';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var int8List;
diff --git a/runtime/observatory/tests/service/udp_socket_service_test.dart b/runtime/observatory/tests/service/udp_socket_service_test.dart
index 01b88d3..e49aa97 100644
--- a/runtime/observatory/tests/service/udp_socket_service_test.dart
+++ b/runtime/observatory/tests/service/udp_socket_service_test.dart
@@ -6,7 +6,7 @@
import 'dart:convert';
import 'dart:io' as io;
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
Future setupUDP() async {
diff --git a/runtime/observatory/tests/service/verify_http_timeline_test.dart b/runtime/observatory/tests/service/verify_http_timeline_test.dart
index f7809c8..a555b11 100644
--- a/runtime/observatory/tests/service/verify_http_timeline_test.dart
+++ b/runtime/observatory/tests/service/verify_http_timeline_test.dart
@@ -4,11 +4,11 @@
// VMOptions=--timeline_streams=Dart
import 'dart:async';
-import 'dart:developer';
import 'dart:io';
import 'dart:math';
+import 'package:expect/expect.dart';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
@@ -80,8 +80,8 @@
Future<void> testMain() async {
// Ensure there's a chance some requests will be interrupted.
- expect(maxRequestDelayMs > serverShutdownDelayMs, isTrue);
- expect(maxResponseDelayMs < serverShutdownDelayMs, isTrue);
+ Expect.isTrue(maxRequestDelayMs > serverShutdownDelayMs);
+ Expect.isTrue(maxResponseDelayMs < serverShutdownDelayMs);
final server = await startServer();
HttpClient.enableTimelineLogging = true;
diff --git a/runtime/observatory/tests/service/vm_test.dart b/runtime/observatory/tests/service/vm_test.dart
index 55b060a..862e54f 100644
--- a/runtime/observatory/tests/service/vm_test.dart
+++ b/runtime/observatory/tests/service/vm_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/vm_timeline_events_test.dart b/runtime/observatory/tests/service/vm_timeline_events_test.dart
index 9586771..1b77ed1 100644
--- a/runtime/observatory/tests/service/vm_timeline_events_test.dart
+++ b/runtime/observatory/tests/service/vm_timeline_events_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/vm_timeline_flags_test.dart b/runtime/observatory/tests/service/vm_timeline_flags_test.dart
index 5f5365f..32c42b0 100644
--- a/runtime/observatory/tests/service/vm_timeline_flags_test.dart
+++ b/runtime/observatory/tests/service/vm_timeline_flags_test.dart
@@ -4,7 +4,7 @@
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/weak_properties_test.dart b/runtime/observatory/tests/service/weak_properties_test.dart
index e9ba05f..bc08b35 100644
--- a/runtime/observatory/tests/service/weak_properties_test.dart
+++ b/runtime/observatory/tests/service/weak_properties_test.dart
@@ -6,7 +6,7 @@
import 'dart:mirrors';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'test_helper.dart';
class Foo {}
diff --git a/runtime/observatory/tests/service/yield_positions_with_finally_test.dart b/runtime/observatory/tests/service/yield_positions_with_finally_test.dart
index af9643b..9a462b5 100644
--- a/runtime/observatory/tests/service/yield_positions_with_finally_test.dart
+++ b/runtime/observatory/tests/service/yield_positions_with_finally_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:developer';
import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';
diff --git a/runtime/observatory/tests/ui/retainingPath.dart b/runtime/observatory/tests/ui/retainingPath.dart
index 119998d..0a2c30f 100644
--- a/runtime/observatory/tests/ui/retainingPath.dart
+++ b/runtime/observatory/tests/ui/retainingPath.dart
@@ -11,7 +11,7 @@
}
main() {
- var list = new List<Foo>(10);
+ var list = new List<Foo>.filled(10, null);
list[5] = new Foo(42.toString(), new Foo(87.toString(), 17.toString()));
while (true) {}
}
diff --git a/runtime/platform/atomic.h b/runtime/platform/atomic.h
index 5fb1d45..7a966f5 100644
--- a/runtime/platform/atomic.h
+++ b/runtime/platform/atomic.h
@@ -7,13 +7,10 @@
#include <atomic>
-#include "platform/allocation.h"
-#include "platform/globals.h"
-
namespace dart {
// Like std::atomic, but operations default to relaxed ordering instead of
-// acquire-release ordering.
+// sequential consistency.
template <typename T>
class RelaxedAtomic {
public:
@@ -21,29 +18,37 @@
constexpr RelaxedAtomic(T arg) : value_(arg) {} // NOLINT
RelaxedAtomic(const RelaxedAtomic& arg) : value_(arg) {} // NOLINT
- T load() const { return value_.load(std::memory_order_relaxed); }
- void store(T arg) { value_.store(arg, std::memory_order_relaxed); }
-
- T fetch_add(T arg) {
- return value_.fetch_add(arg, std::memory_order_relaxed);
+ T load(std::memory_order order = std::memory_order_relaxed) const {
+ return value_.load(order);
}
- T fetch_sub(T arg) {
- return value_.fetch_sub(arg, std::memory_order_relaxed);
- }
- T fetch_or(T arg) { return value_.fetch_or(arg, std::memory_order_relaxed); }
- T fetch_and(T arg) {
- return value_.fetch_and(arg, std::memory_order_relaxed);
+ void store(T arg, std::memory_order order = std::memory_order_relaxed) {
+ value_.store(arg, order);
}
- bool compare_exchange_weak(T& expected, T desired) { // NOLINT
- return value_.compare_exchange_weak(expected, desired,
- std::memory_order_relaxed,
- std::memory_order_relaxed);
+ T fetch_add(T arg, std::memory_order order = std::memory_order_relaxed) {
+ return value_.fetch_add(arg, order);
}
- bool compare_exchange_strong(T& expected, T desired) { // NOLINT
- return value_.compare_exchange_strong(expected, desired,
- std::memory_order_relaxed,
- std::memory_order_relaxed);
+ T fetch_sub(T arg, std::memory_order order = std::memory_order_relaxed) {
+ return value_.fetch_sub(arg, order);
+ }
+ T fetch_or(T arg, std::memory_order order = std::memory_order_relaxed) {
+ return value_.fetch_or(arg, order);
+ }
+ T fetch_and(T arg, std::memory_order order = std::memory_order_relaxed) {
+ return value_.fetch_and(arg, order);
+ }
+
+ bool compare_exchange_weak(
+ T& expected, // NOLINT
+ T desired,
+ std::memory_order order = std::memory_order_relaxed) {
+ return value_.compare_exchange_weak(expected, desired, order, order);
+ }
+ bool compare_exchange_strong(
+ T& expected, // NOLINT
+ T desired,
+ std::memory_order order = std::memory_order_relaxed) {
+ return value_.compare_exchange_strong(expected, desired, order, order);
}
operator T() const { return load(); }
@@ -63,6 +68,59 @@
std::atomic<T> value_;
};
+// Like std::atomic, but operations default to acquire for load, release for
+// stores, and acquire-release for read-and-updates.
+template <typename T>
+class AcqRelAtomic {
+ public:
+ constexpr AcqRelAtomic() : value_() {}
+ constexpr AcqRelAtomic(T arg) : value_(arg) {} // NOLINT
+ AcqRelAtomic(const AcqRelAtomic& arg) = delete;
+
+ T load(std::memory_order order = std::memory_order_acquire) const {
+ return value_.load(order);
+ }
+ void store(T arg, std::memory_order order = std::memory_order_release) {
+ value_.store(arg, order);
+ }
+
+ T fetch_add(T arg, std::memory_order order = std::memory_order_acq_rel) {
+ return value_.fetch_add(arg, order);
+ }
+ T fetch_sub(T arg, std::memory_order order = std::memory_order_acq_rel) {
+ return value_.fetch_sub(arg, order);
+ }
+ T fetch_or(T arg, std::memory_order order = std::memory_order_acq_rel) {
+ return value_.fetch_or(arg, order);
+ }
+ T fetch_and(T arg, std::memory_order order = std::memory_order_acq_rel) {
+ return value_.fetch_and(arg, order);
+ }
+
+ bool compare_exchange_weak(
+ T& expected, // NOLINT
+ T desired,
+ std::memory_order order = std::memory_order_acq_rel) {
+ return value_.compare_exchange_weak(expected, desired, order, order);
+ }
+ bool compare_exchange_strong(
+ T& expected, // NOLINT
+ T desired,
+ std::memory_order order = std::memory_order_acq_rel) {
+ return value_.compare_exchange_strong(expected, desired, order, order);
+ }
+
+ // Require explicit loads and stores.
+ operator T() const = delete;
+ T operator=(T arg) = delete;
+ T operator=(const AcqRelAtomic& arg) = delete;
+ T operator+=(T arg) = delete;
+ T operator-=(T arg) = delete;
+
+ private:
+ std::atomic<T> value_;
+};
+
} // namespace dart
#endif // RUNTIME_PLATFORM_ATOMIC_H_
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 6501440..50d9527 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -647,7 +647,7 @@
r'^#26 Future._completeError ',
r'^#27 _AsyncAwaitCompleter.completeError ',
r'^#28 allYield ',
- r'^#29 _asyncErrorWrapperHelper.<anonymous closure> ',
+ r'^#29 _asyncErrorWrapperHelper.errorCallback ',
r'^#30 _RootZone.runBinary ',
r'^#31 _FutureListener.handleError ',
r'^#32 Future._propagateToListeners.handleError ',
@@ -655,7 +655,7 @@
r'^#34 Future._completeError ',
r'^#35 _AsyncAwaitCompleter.completeError ',
r'^#36 allYield2 ',
- r'^#37 _asyncErrorWrapperHelper.<anonymous closure> ',
+ r'^#37 _asyncErrorWrapperHelper.errorCallback ',
r'^#38 _RootZone.runBinary ',
r'^#39 _FutureListener.handleError ',
r'^#40 Future._propagateToListeners.handleError ',
@@ -691,7 +691,7 @@
r'^#19 _AsyncAwaitCompleter.complete ',
r'^#20 _completeOnAsyncReturn ',
r'^#21 doTestAwait ',
- r'^#22 _asyncErrorWrapperHelper.<anonymous closure> ',
+ r'^#22 _asyncErrorWrapperHelper.errorCallback ',
r'^#23 _RootZone.runBinary ',
r'^#24 _FutureListener.handleError ',
r'^#25 Future._propagateToListeners.handleError ',
@@ -699,7 +699,7 @@
r'^#27 Future._completeError ',
r'^#28 _AsyncAwaitCompleter.completeError ',
r'^#29 noYields ',
- r'^#30 _asyncErrorWrapperHelper.<anonymous closure> ',
+ r'^#30 _asyncErrorWrapperHelper.errorCallback ',
r'^#31 _RootZone.runBinary ',
r'^#32 _FutureListener.handleError ',
r'^#33 Future._propagateToListeners.handleError ',
@@ -707,7 +707,7 @@
r'^#35 Future._completeError ',
r'^#36 _AsyncAwaitCompleter.completeError ',
r'^#37 noYields2 ',
- r'^#38 _asyncErrorWrapperHelper.<anonymous closure> ',
+ r'^#38 _asyncErrorWrapperHelper.errorCallback ',
r'^#39 _RootZone.runBinary ',
r'^#40 _FutureListener.handleError ',
r'^#41 Future._propagateToListeners.handleError ',
@@ -737,7 +737,7 @@
r'^#19 _AsyncAwaitCompleter.complete ',
r'^#20 _completeOnAsyncReturn ',
r'^#21 doTestAwaitThen ',
- r'^#22 _asyncErrorWrapperHelper.<anonymous closure> ',
+ r'^#22 _asyncErrorWrapperHelper.errorCallback ',
r'^#23 _RootZone.runBinary ',
r'^#24 _FutureListener.handleError ',
r'^#25 Future._propagateToListeners.handleError ',
@@ -745,7 +745,7 @@
r'^#27 Future._completeError ',
r'^#28 _AsyncAwaitCompleter.completeError ',
r'^#29 noYields ',
- r'^#30 _asyncErrorWrapperHelper.<anonymous closure> ',
+ r'^#30 _asyncErrorWrapperHelper.errorCallback ',
r'^#31 _RootZone.runBinary ',
r'^#32 _FutureListener.handleError ',
r'^#33 Future._propagateToListeners.handleError ',
@@ -753,7 +753,7 @@
r'^#35 Future._completeError ',
r'^#36 _AsyncAwaitCompleter.completeError ',
r'^#37 noYields2 ',
- r'^#38 _asyncErrorWrapperHelper.<anonymous closure> ',
+ r'^#38 _asyncErrorWrapperHelper.errorCallback ',
r'^#39 _RootZone.runBinary ',
r'^#40 _FutureListener.handleError ',
r'^#41 Future._propagateToListeners.handleError ',
diff --git a/runtime/tests/vm/dart/regress_39747_test.dart b/runtime/tests/vm/dart/regress_39747_test.dart
index 605198c..0d3d1f7 100644
--- a/runtime/tests/vm/dart/regress_39747_test.dart
+++ b/runtime/tests/vm/dart/regress_39747_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for https://github.com/dart-lang/sdk/issues/39747.
// Verifies that compiler doesn't crash on a particular piece of code.
diff --git a/runtime/tests/vm/dart/regress_39767_test.dart b/runtime/tests/vm/dart/regress_39767_test.dart
index 273023c..24e9b13 100644
--- a/runtime/tests/vm/dart/regress_39767_test.dart
+++ b/runtime/tests/vm/dart/regress_39767_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// VMOptions=--optimization_counter_threshold=1 --deterministic
// Regression test for https://github.com/dart-lang/sdk/issues/39767.
diff --git a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
index 0f1ff19..b0584ca 100644
--- a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
+++ b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
@@ -40,6 +40,11 @@
if (stripFlag) '--strip',
useBare ? '--use-bare-instructions' : '--no-use-bare-instructions',
"--write-v8-snapshot-profile-to=$profilePath",
+ // Regression test for dartbug.com/41149. We don't assume forced
+ // disassembler support in Product mode.
+ if (!const bool.fromEnvironment('dart.vm.product'))
+ '--disassemble',
+ '--ignore-unrecognized-flags',
dillPath,
];
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 261728a..d19460a 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -27,28 +27,27 @@
ASSERT(kInitialCapacity >= kNumPredefinedCids);
capacity_ = kInitialCapacity;
// Note that [calloc] will zero-initialize the memory.
- table_ = reinterpret_cast<RelaxedAtomic<intptr_t>*>(
- calloc(capacity_, sizeof(RelaxedAtomic<intptr_t>)));
+ table_.store(reinterpret_cast<RelaxedAtomic<intptr_t>*>(
+ calloc(capacity_, sizeof(RelaxedAtomic<intptr_t>))));
} else {
// Duplicate the class table from the VM isolate.
auto vm_shared_class_table = Dart::vm_isolate()->group()->class_table();
capacity_ = vm_shared_class_table->capacity_;
// Note that [calloc] will zero-initialize the memory.
- table_ = reinterpret_cast<RelaxedAtomic<intptr_t>*>(
+ RelaxedAtomic<intptr_t>* table = reinterpret_cast<RelaxedAtomic<intptr_t>*>(
calloc(capacity_, sizeof(RelaxedAtomic<intptr_t>)));
// The following cids don't have a corresponding class object in Dart code.
// We therefore need to initialize them eagerly.
for (intptr_t i = kObjectCid; i < kInstanceCid; i++) {
- table_[i] = vm_shared_class_table->SizeAt(i);
+ table[i] = vm_shared_class_table->SizeAt(i);
}
- table_[kTypeArgumentsCid] =
- vm_shared_class_table->SizeAt(kTypeArgumentsCid);
- table_[kFreeListElement] = vm_shared_class_table->SizeAt(kFreeListElement);
- table_[kForwardingCorpse] =
- vm_shared_class_table->SizeAt(kForwardingCorpse);
- table_[kDynamicCid] = vm_shared_class_table->SizeAt(kDynamicCid);
- table_[kVoidCid] = vm_shared_class_table->SizeAt(kVoidCid);
- table_[kNeverCid] = vm_shared_class_table->SizeAt(kNeverCid);
+ table[kTypeArgumentsCid] = vm_shared_class_table->SizeAt(kTypeArgumentsCid);
+ table[kFreeListElement] = vm_shared_class_table->SizeAt(kFreeListElement);
+ table[kForwardingCorpse] = vm_shared_class_table->SizeAt(kForwardingCorpse);
+ table[kDynamicCid] = vm_shared_class_table->SizeAt(kDynamicCid);
+ table[kVoidCid] = vm_shared_class_table->SizeAt(kVoidCid);
+ table[kNeverCid] = vm_shared_class_table->SizeAt(kNeverCid);
+ table_.store(table);
}
#if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
// Note that [calloc] will zero-initialize the memory.
@@ -57,8 +56,8 @@
#endif // defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
#ifndef PRODUCT
// Note that [calloc] will zero-initialize the memory.
- trace_allocation_table_ =
- static_cast<uint8_t*>(calloc(capacity_, sizeof(uint8_t)));
+ trace_allocation_table_.store(
+ static_cast<uint8_t*>(calloc(capacity_, sizeof(uint8_t))));
#endif // !PRODUCT
}
SharedClassTable::~SharedClassTable() {
@@ -66,10 +65,10 @@
FreeOldTables();
delete old_tables_;
}
- free(table_);
+ free(table_.load());
free(unboxed_fields_map_);
- NOT_IN_PRODUCT(free(trace_allocation_table_));
+ NOT_IN_PRODUCT(free(trace_allocation_table_.load()));
}
ClassTable::ClassTable(SharedClassTable* shared_class_table)
@@ -82,24 +81,26 @@
ASSERT(kInitialCapacity >= kNumPredefinedCids);
capacity_ = kInitialCapacity;
// Note that [calloc] will zero-initialize the memory.
- table_ = static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*)));
+ table_.store(static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*))));
} else {
// Duplicate the class table from the VM isolate.
ClassTable* vm_class_table = Dart::vm_isolate()->class_table();
capacity_ = vm_class_table->capacity_;
// Note that [calloc] will zero-initialize the memory.
- table_ = static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*)));
+ RawClass** table =
+ static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*)));
// The following cids don't have a corresponding class object in Dart code.
// We therefore need to initialize them eagerly.
for (intptr_t i = kObjectCid; i < kInstanceCid; i++) {
- table_[i] = vm_class_table->At(i);
+ table[i] = vm_class_table->At(i);
}
- table_[kTypeArgumentsCid] = vm_class_table->At(kTypeArgumentsCid);
- table_[kFreeListElement] = vm_class_table->At(kFreeListElement);
- table_[kForwardingCorpse] = vm_class_table->At(kForwardingCorpse);
- table_[kDynamicCid] = vm_class_table->At(kDynamicCid);
- table_[kVoidCid] = vm_class_table->At(kVoidCid);
- table_[kNeverCid] = vm_class_table->At(kNeverCid);
+ table[kTypeArgumentsCid] = vm_class_table->At(kTypeArgumentsCid);
+ table[kFreeListElement] = vm_class_table->At(kFreeListElement);
+ table[kForwardingCorpse] = vm_class_table->At(kForwardingCorpse);
+ table[kDynamicCid] = vm_class_table->At(kDynamicCid);
+ table[kVoidCid] = vm_class_table->At(kVoidCid);
+ table[kNeverCid] = vm_class_table->At(kNeverCid);
+ table_.store(table);
}
}
@@ -108,7 +109,7 @@
FreeOldTables();
delete old_class_tables_;
}
- free(table_);
+ free(table_.load());
}
void ClassTable::AddOldTable(RawClass** old_class_table) {
@@ -149,8 +150,8 @@
if (index != kIllegalCid) {
ASSERT(index > 0 && index < kNumPredefinedCids && index < top_);
- ASSERT(table_[index] == nullptr);
- table_[index] = cls.raw();
+ ASSERT(table_.load()[index] == nullptr);
+ table_.load()[index] = cls.raw();
} else {
if (top_ == capacity_) {
const intptr_t new_capacity = capacity_ + kCapacityIncrement;
@@ -158,7 +159,7 @@
}
ASSERT(top_ < capacity_);
cls.set_id(top_);
- table_[top_] = cls.raw();
+ table_.load()[top_] = cls.raw();
top_++; // Increment next index.
}
ASSERT(expected_cid == cls.id());
@@ -183,7 +184,7 @@
Grow(new_capacity);
}
ASSERT(top_ < capacity_);
- table_[top_] = size;
+ table_.load()[top_] = size;
return top_++; // Increment next index.
}
}
@@ -198,7 +199,7 @@
Grow(new_capacity);
}
- ASSERT(table_[index] == nullptr);
+ ASSERT(table_.load()[index] == nullptr);
if (index >= top_) {
top_ = index + 1;
}
@@ -210,13 +211,14 @@
void ClassTable::Grow(intptr_t new_capacity) {
ASSERT(new_capacity > capacity_);
+ auto old_table = table_.load();
auto new_table = static_cast<RawClass**>(
malloc(new_capacity * sizeof(RawClass*))); // NOLINT
- memmove(new_table, table_, capacity_ * sizeof(RawClass*));
+ memmove(new_table, old_table, capacity_ * sizeof(RawClass*));
memset(new_table + capacity_, 0,
(new_capacity - capacity_) * sizeof(RawClass*));
- old_class_tables_->Add(table_);
- table_ = new_table; // TODO(koda): This should use atomics.
+ old_class_tables_->Add(old_table);
+ table_.store(new_table);
capacity_ = new_capacity;
}
@@ -230,7 +232,7 @@
Grow(new_capacity);
}
- ASSERT(table_[index] == 0);
+ ASSERT(table_.load()[index] == 0);
if (index >= top_) {
top_ = index + 1;
}
@@ -239,27 +241,28 @@
void SharedClassTable::Grow(intptr_t new_capacity) {
ASSERT(new_capacity >= capacity_);
+ RelaxedAtomic<intptr_t>* old_table = table_.load();
RelaxedAtomic<intptr_t>* new_table =
reinterpret_cast<RelaxedAtomic<intptr_t>*>(
malloc(new_capacity * sizeof(RelaxedAtomic<intptr_t>))); // NOLINT
- memmove(new_table, table_, capacity_ * sizeof(intptr_t));
+ memmove(new_table, old_table, capacity_ * sizeof(intptr_t));
memset(new_table + capacity_, 0,
(new_capacity - capacity_) * sizeof(intptr_t));
#if !defined(PRODUCT)
+ auto old_trace_table = trace_allocation_table_.load();
auto new_trace_table =
static_cast<uint8_t*>(malloc(new_capacity * sizeof(uint8_t))); // NOLINT
- memmove(new_trace_table, trace_allocation_table_,
- capacity_ * sizeof(uint8_t));
+ memmove(new_trace_table, old_trace_table, capacity_ * sizeof(uint8_t));
memset(new_trace_table + capacity_, 0,
(new_capacity - capacity_) * sizeof(uint8_t));
#endif
- old_tables_->Add(table_);
- table_ = new_table; // TODO(koda): This should use atomics.
- NOT_IN_PRODUCT(old_tables_->Add(trace_allocation_table_));
- NOT_IN_PRODUCT(trace_allocation_table_ = new_trace_table);
+ old_tables_->Add(old_table);
+ table_.store(new_table);
+ NOT_IN_PRODUCT(old_tables_->Add(old_trace_table));
+ NOT_IN_PRODUCT(trace_allocation_table_.store(new_trace_table));
#if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
auto new_unboxed_fields_map = static_cast<UnboxedFieldBitmap*>(
@@ -277,11 +280,11 @@
void ClassTable::Unregister(intptr_t index) {
shared_class_table_->Unregister(index);
- table_[index] = nullptr;
+ table_.load()[index] = nullptr;
}
void SharedClassTable::Unregister(intptr_t index) {
- table_[index] = 0;
+ table_.load()[index] = 0;
#if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
unboxed_fields_map_[index].Reset();
#endif // defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
@@ -291,9 +294,10 @@
ASSERT(Thread::Current()->IsAtSafepoint());
const intptr_t num_cids = NumCids();
std::unique_ptr<RawClass*[]> cls_by_old_cid(new RawClass*[num_cids]);
- memmove(cls_by_old_cid.get(), table_, sizeof(RawClass*) * num_cids);
+ auto* table = table_.load();
+ memmove(cls_by_old_cid.get(), table, sizeof(RawClass*) * num_cids);
for (intptr_t i = 0; i < num_cids; i++) {
- table_[old_to_new_cid[i]] = cls_by_old_cid[i];
+ table[old_to_new_cid[i]] = cls_by_old_cid[i];
}
}
@@ -301,11 +305,12 @@
ASSERT(Thread::Current()->IsAtSafepoint());
const intptr_t num_cids = NumCids();
std::unique_ptr<intptr_t[]> size_by_old_cid(new intptr_t[num_cids]);
+ auto* table = table_.load();
for (intptr_t i = 0; i < num_cids; i++) {
- size_by_old_cid[i] = table_[i];
+ size_by_old_cid[i] = table[i];
}
for (intptr_t i = 0; i < num_cids; i++) {
- table_[old_to_new_cid[i]] = size_by_old_cid[i];
+ table[old_to_new_cid[i]] = size_by_old_cid[i];
}
#if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
@@ -323,8 +328,11 @@
void ClassTable::VisitObjectPointers(ObjectPointerVisitor* visitor) {
ASSERT(visitor != NULL);
visitor->set_gc_root_type("class table");
- for (intptr_t i = 0; i < top_; i++) {
- visitor->VisitPointer(reinterpret_cast<RawObject**>(&(table_[i])));
+ if (top_ != 0) {
+ auto* table = table_.load();
+ RawObject** from = reinterpret_cast<RawObject**>(&table[0]);
+ RawObject** to = reinterpret_cast<RawObject**>(&table[top_ - 1]);
+ visitor->VisitPointers(from, to);
}
visitor->clear_gc_root_type();
}
@@ -376,7 +384,7 @@
const intptr_t size =
raw_cls == nullptr ? 0 : Class::host_instance_size(raw_cls);
shared_class_table_->SetSizeAt(index, size);
- table_[index] = raw_cls;
+ table_.load()[index] = raw_cls;
}
#ifndef PRODUCT
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index 3498946..eb5a431 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -71,13 +71,13 @@
// Thread-safe.
intptr_t SizeAt(intptr_t index) const {
ASSERT(IsValidIndex(index));
- return table_[index];
+ return table_.load()[index];
}
bool HasValidClassAt(intptr_t index) const {
ASSERT(IsValidIndex(index));
- ASSERT(table_[index] >= 0);
- return table_[index] != 0;
+ ASSERT(table_.load()[index] >= 0);
+ return table_.load()[index] != 0;
}
void SetSizeAt(intptr_t index, intptr_t size) {
@@ -86,7 +86,7 @@
// Ensure we never change size for a given cid from one non-zero size to
// another non-zero size.
intptr_t old_size = 0;
- if (!table_[index].compare_exchange_strong(old_size, size)) {
+ if (!table_.load()[index].compare_exchange_strong(old_size, size)) {
RELEASE_ASSERT(old_size == size);
}
}
@@ -119,12 +119,12 @@
void SetTraceAllocationFor(intptr_t cid, bool trace) {
ASSERT(cid > 0);
ASSERT(cid < top_);
- trace_allocation_table_[cid] = trace ? 1 : 0;
+ trace_allocation_table_.load()[cid] = trace ? 1 : 0;
}
bool TraceAllocationFor(intptr_t cid) {
ASSERT(cid > 0);
ASSERT(cid < top_);
- return trace_allocation_table_[cid] != 0;
+ return trace_allocation_table_.load()[cid] != 0;
}
#endif // !defined(PRODUCT)
@@ -134,14 +134,14 @@
const intptr_t num_cids = NumCids();
const intptr_t bytes = sizeof(intptr_t) * num_cids;
auto size_table = static_cast<intptr_t*>(malloc(bytes));
- memmove(size_table, table_, sizeof(intptr_t) * num_cids);
+ memmove(size_table, table_.load(), sizeof(intptr_t) * num_cids);
*copy_num_cids = num_cids;
*copy = size_table;
}
void ResetBeforeHotReload() {
// The [IsolateReloadContext] is now source-of-truth for GC.
- memset(table_, 0, sizeof(intptr_t) * top_);
+ memset(table_.load(), 0, sizeof(intptr_t) * top_);
}
void ResetAfterHotReload(intptr_t* old_table,
@@ -151,7 +151,7 @@
// return, so we restore size information for all classes.
if (is_rollback) {
SetNumCids(num_old_cids);
- memmove(table_, old_table, sizeof(intptr_t) * num_old_cids);
+ memmove(table_.load(), old_table, sizeof(intptr_t) * num_old_cids);
}
// Can't free this table immediately as another thread (e.g., concurrent
@@ -207,7 +207,7 @@
#ifndef PRODUCT
// Copy-on-write is used for trace_allocation_table_, with old copies stored
// in old_tables_.
- uint8_t* trace_allocation_table_ = nullptr;
+ AcqRelAtomic<uint8_t*> trace_allocation_table_ = {nullptr};
#endif // !PRODUCT
void AddOldTable(intptr_t* old_table);
@@ -219,7 +219,7 @@
// Copy-on-write is used for table_, with old copies stored in old_tables_.
// Maps the cid to the instance size.
- RelaxedAtomic<intptr_t>* table_ = nullptr;
+ AcqRelAtomic<RelaxedAtomic<intptr_t>*> table_ = {nullptr};
MallocGrowableArray<void*>* old_tables_;
IsolateGroupReloadContext* reload_context_ = nullptr;
@@ -247,7 +247,7 @@
const intptr_t num_cids = NumCids();
const intptr_t bytes = sizeof(RawClass*) * num_cids;
auto class_table = static_cast<RawClass**>(malloc(bytes));
- memmove(class_table, table_, sizeof(RawClass*) * num_cids);
+ memmove(class_table, table_.load(), sizeof(RawClass*) * num_cids);
*copy_num_cids = num_cids;
*copy = class_table;
}
@@ -267,7 +267,7 @@
// return, so we restore size information for all classes.
if (is_rollback) {
SetNumCids(num_old_cids);
- memmove(table_, old_table, sizeof(RawClass*) * num_old_cids);
+ memmove(table_.load(), old_table, sizeof(RawClass*) * num_old_cids);
} else {
CopySizesFromClassObjects();
}
@@ -282,7 +282,7 @@
// Thread-safe.
RawClass* At(intptr_t index) const {
ASSERT(IsValidIndex(index));
- return table_[index];
+ return table_.load()[index];
}
intptr_t SizeAt(intptr_t index) const {
@@ -297,7 +297,7 @@
bool HasValidClassAt(intptr_t index) const {
ASSERT(IsValidIndex(index));
- return table_[index] != nullptr;
+ return table_.load()[index] != nullptr;
}
intptr_t NumCids() const { return shared_class_table_->NumCids(); }
@@ -375,7 +375,7 @@
// Copy-on-write is used for table_, with old copies stored in
// old_class_tables_.
- RawClass** table_;
+ AcqRelAtomic<RawClass**> table_;
MallocGrowableArray<RawClass**>* old_class_tables_;
SharedClassTable* shared_class_table_;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 63b0431..95841cb 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2373,7 +2373,8 @@
// instantiated with a non-nullable type which rejects null.
// In NNBD weak mode or if type parameter is non-nullable or has
// undetermined nullability null instance is correctly handled by TTS.
- if (FLAG_null_safety && (dst_type.IsNullable() || dst_type.IsLegacy())) {
+ if (isolate()->null_safety() &&
+ (dst_type.IsNullable() || dst_type.IsLegacy())) {
__ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
__ BranchIf(EQUAL, done);
}
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index b1bdb6b..deec0f6 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -310,19 +310,14 @@
return GenerateSubtype1TestCacheLookup(
token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
}
- // If one type argument only, check if type argument is Object or dynamic.
+ // If one type argument only, check if type argument is a top type.
if (type_arguments.Length() == 1) {
const AbstractType& tp_argument =
AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
- if (tp_argument.IsType()) {
- ASSERT(tp_argument.HasTypeClass());
- // Check if type argument is dynamic, Object, or void.
- const Type& object_type = Type::Handle(zone(), Type::ObjectType());
- if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
- // Instance class test only necessary.
- return GenerateSubtype1TestCacheLookup(
- token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
- }
+ if (tp_argument.IsTopType()) {
+ // Instance class test only necessary.
+ return GenerateSubtype1TestCacheLookup(
+ token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
}
}
@@ -482,10 +477,12 @@
compiler::target::TypeArguments::type_at_offset(
type_param.index())));
// R3: concrete type of type.
- // Check if type argument is dynamic, Object, or void.
+ // Check if type argument is dynamic, Object?, or void.
__ CompareObject(R3, Object::dynamic_type());
__ b(is_instance_lbl, EQ);
- __ CompareObject(R3, Type::ZoneHandle(zone(), Type::ObjectType()));
+ __ CompareObject(
+ R3, Type::ZoneHandle(
+ zone(), isolate()->object_store()->nullable_object_type()));
__ b(is_instance_lbl, EQ);
__ CompareObject(R3, Object::void_type());
__ b(is_instance_lbl, EQ);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index f4a6885..59c4bb7 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -298,18 +298,14 @@
return GenerateSubtype1TestCacheLookup(
token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
}
- // If one type argument only, check if type argument is Object or dynamic.
+ // If one type argument only, check if type argument is a top type.
if (type_arguments.Length() == 1) {
const AbstractType& tp_argument =
AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
- if (tp_argument.IsType()) {
- // Check if type argument is dynamic, Object, or void.
- const Type& object_type = Type::Handle(zone(), Type::ObjectType());
- if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
- // Instance class test only necessary.
- return GenerateSubtype1TestCacheLookup(
- token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
- }
+ if (tp_argument.IsTopType()) {
+ // Instance class test only necessary.
+ return GenerateSubtype1TestCacheLookup(
+ token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
}
}
// Regular subtype test cache involving instance's type arguments.
@@ -463,10 +459,12 @@
__ LoadFieldFromOffset(R3, kTypeArgumentsReg,
TypeArguments::type_at_offset(type_param.index()));
// R3: concrete type of type.
- // Check if type argument is dynamic, Object, or void.
+ // Check if type argument is dynamic, Object?, or void.
__ CompareObject(R3, Object::dynamic_type());
__ b(is_instance_lbl, EQ);
- __ CompareObject(R3, Type::ZoneHandle(zone(), Type::ObjectType()));
+ __ CompareObject(
+ R3, Type::ZoneHandle(
+ zone(), isolate()->object_store()->nullable_object_type()));
__ b(is_instance_lbl, EQ);
__ CompareObject(R3, Object::void_type());
__ b(is_instance_lbl, EQ);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index d7fcd3e..e5e0a06 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -286,18 +286,14 @@
return GenerateSubtype1TestCacheLookup(
token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
}
- // If one type argument only, check if type argument is Object or dynamic.
+ // If one type argument only, check if type argument is a top type.
if (type_arguments.Length() == 1) {
const AbstractType& tp_argument =
AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
- if (tp_argument.IsType()) {
- // Check if type argument is dynamic, Object, or void.
- const Type& object_type = Type::Handle(zone(), Type::ObjectType());
- if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
- // Instance class test only necessary.
- return GenerateSubtype1TestCacheLookup(
- token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
- }
+ if (tp_argument.IsTopType()) {
+ // Instance class test only necessary.
+ return GenerateSubtype1TestCacheLookup(
+ token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
}
}
// Regular subtype test cache involving instance's type arguments.
@@ -458,10 +454,12 @@
kTypeArgumentsReg,
TypeArguments::type_at_offset(type_param.index())));
// EDI: concrete type of type.
- // Check if type argument is dynamic, Object, or void.
+ // Check if type argument is dynamic, Object?, or void.
__ CompareObject(EDI, Object::dynamic_type());
__ j(EQUAL, is_instance_lbl);
- __ CompareObject(EDI, Type::ZoneHandle(zone(), Type::ObjectType()));
+ __ CompareObject(
+ EDI, Type::ZoneHandle(
+ zone(), isolate()->object_store()->nullable_object_type()));
__ j(EQUAL, is_instance_lbl);
__ CompareObject(EDI, Object::void_type());
__ j(EQUAL, is_instance_lbl);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 3f62944..82fdc74 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -308,19 +308,14 @@
return GenerateSubtype1TestCacheLookup(
token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
}
- // If one type argument only, check if type argument is Object or dynamic.
+ // If one type argument only, check if type argument is a top type.
if (type_arguments.Length() == 1) {
const AbstractType& tp_argument =
AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
- if (tp_argument.IsType()) {
- ASSERT(tp_argument.HasTypeClass());
- // Check if type argument is dynamic, Object, or void.
- const Type& object_type = Type::Handle(zone(), Type::ObjectType());
- if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
- // Instance class test only necessary.
- return GenerateSubtype1TestCacheLookup(
- token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
- }
+ if (tp_argument.IsTopType()) {
+ // Instance class test only necessary.
+ return GenerateSubtype1TestCacheLookup(
+ token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
}
}
@@ -486,11 +481,12 @@
kTypeArgumentsReg,
TypeArguments::type_at_offset(type_param.index())));
// RDI: Concrete type of type.
- // Check if type argument is dynamic, Object, or void.
+ // Check if type argument is dynamic, Object?, or void.
__ CompareObject(RDI, Object::dynamic_type());
__ j(EQUAL, is_instance_lbl);
- const Type& object_type = Type::ZoneHandle(zone(), Type::ObjectType());
- __ CompareObject(RDI, object_type);
+ __ CompareObject(
+ RDI, Type::ZoneHandle(
+ zone(), isolate()->object_store()->nullable_object_type()));
__ j(EQUAL, is_instance_lbl);
__ CompareObject(RDI, Object::void_type());
__ j(EQUAL, is_instance_lbl);
diff --git a/runtime/vm/compiler/frontend/constant_reader.cc b/runtime/vm/compiler/frontend/constant_reader.cc
index 1136484..23a30d3 100644
--- a/runtime/vm/compiler/frontend/constant_reader.cc
+++ b/runtime/vm/compiler/frontend/constant_reader.cc
@@ -104,6 +104,7 @@
RawInstance* ConstantReader::ReadConstantInternal(intptr_t constant_offset) {
// Get reader directly into raw bytes of constant table.
+ bool null_safety = H.thread()->isolate()->null_safety();
KernelReaderHelper reader(Z, &H, script_, H.constants_table(), 0);
reader.ReadUInt(); // skip variable-sized int for adjusted constant offset
reader.SetOffset(reader.ReaderOffset() + constant_offset);
@@ -182,8 +183,9 @@
const auto& list_class =
Class::Handle(Z, corelib.LookupClassAllowPrivate(Symbols::_List()));
// Build type from the raw bytes (needs temporary translator).
- TypeTranslator type_translator(&reader, this, active_class_, true,
- active_class_->RequireLegacyErasure());
+ TypeTranslator type_translator(
+ &reader, this, active_class_, true,
+ active_class_->RequireLegacyErasure(null_safety));
auto& type_arguments =
TypeArguments::Handle(Z, TypeArguments::New(1, Heap::kOld));
AbstractType& type = type_translator.BuildType();
@@ -224,8 +226,9 @@
ASSERT(klass.is_enum_class() || klass.is_const());
instance = Instance::New(klass, Heap::kOld);
// Build type from the raw bytes (needs temporary translator).
- TypeTranslator type_translator(&reader, this, active_class_, true,
- active_class_->RequireLegacyErasure());
+ TypeTranslator type_translator(
+ &reader, this, active_class_, true,
+ active_class_->RequireLegacyErasure(null_safety));
const intptr_t number_of_type_arguments = reader.ReadUInt();
if (klass.NumTypeArguments() > 0) {
auto& type_arguments = TypeArguments::Handle(
@@ -267,8 +270,9 @@
ASSERT(!constant.IsNull());
// Build type from the raw bytes (needs temporary translator).
- TypeTranslator type_translator(&reader, this, active_class_, true,
- active_class_->RequireLegacyErasure());
+ TypeTranslator type_translator(
+ &reader, this, active_class_, true,
+ active_class_->RequireLegacyErasure(null_safety));
const intptr_t number_of_type_arguments = reader.ReadUInt();
ASSERT(number_of_type_arguments > 0);
auto& type_arguments = TypeArguments::Handle(
@@ -301,8 +305,9 @@
}
case kTypeLiteralConstant: {
// Build type from the raw bytes (needs temporary translator).
- TypeTranslator type_translator(&reader, this, active_class_, true,
- active_class_->RequireLegacyErasure());
+ TypeTranslator type_translator(
+ &reader, this, active_class_, true,
+ active_class_->RequireLegacyErasure(null_safety));
instance = type_translator.BuildType().raw();
break;
}
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 6a8b7cd..4b59c97 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -2932,6 +2932,7 @@
BuildTypeArguments(length); // read type arguments.
result_ =
Type::New(klass, type_arguments, TokenPosition::kNoSource, nullability);
+ result_ = result_.NormalizeFutureOrType(Heap::kOld);
if (finalize_) {
ASSERT(active_class_->klass != NULL);
result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 2de2002..4597fb6 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -1294,8 +1294,8 @@
return member->IsFactory();
}
- bool RequireLegacyErasure() const {
- return klass != nullptr && !FLAG_null_safety &&
+ bool RequireLegacyErasure(bool null_safety) const {
+ return klass != nullptr && !null_safety &&
Library::Handle(klass->library()).nnbd_compiled_mode() ==
NNBDCompiledMode::kAgnostic;
}
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index d3367e4..71fff65 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -291,6 +291,7 @@
} else {
ASSERT(num_opt_named_params > 0);
+ bool null_safety = Isolate::Current()->null_safety();
const intptr_t first_name_offset =
compiler::target::ArgumentsDescriptor::first_named_entry_offset() -
compiler::target::Array::data_offset();
@@ -384,7 +385,7 @@
// We had no match. If the param is required, throw a NoSuchMethod error.
// Otherwise just load the default constant.
Fragment not_good(missing);
- if (FLAG_null_safety && function_.IsRequiredAt(opt_param_position[i])) {
+ if (null_safety && function_.IsRequiredAt(opt_param_position[i])) {
not_good += Goto(nsm);
} else {
not_good += Constant(
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 9995ebc..401c96d 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -7,7 +7,6 @@
#include "vm/compiler/assembler/assembler.h"
#include "vm/code_patcher.h"
-#include "vm/compiler/aot/precompiler.h"
#include "vm/compiler/assembler/disassembler.h"
#include "vm/compiler/backend/block_scheduler.h"
#include "vm/compiler/backend/branch_optimizer.h"
@@ -863,10 +862,7 @@
RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) {
#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
- if (FLAG_precompiled_mode) {
- return Precompiler::CompileFunction(
- /* precompiler = */ NULL, thread, thread->zone(), function);
- }
+ RELEASE_ASSERT(!FLAG_precompiled_mode);
#endif
#if defined(DART_PRECOMPILED_RUNTIME)
@@ -1203,9 +1199,11 @@
Function& function = Function::Handle(zone);
{
MonitorLocker ml(&queue_monitor_);
- function = function_queue()->PeekFunction();
+ if (running_) {
+ function = function_queue()->PeekFunction();
+ }
}
- while (running_ && !function.IsNull()) {
+ while (!function.IsNull()) {
if (is_optimizing()) {
Compiler::CompileOptimizedFunction(thread, function,
Compiler::kNoOSRDeoptId);
@@ -1217,7 +1215,7 @@
QueueElement* qelem = NULL;
{
MonitorLocker ml(&queue_monitor_);
- if (function_queue()->IsEmpty()) {
+ if (!running_ || function_queue()->IsEmpty()) {
// We are shutting down, queue was cleared.
function = Function::null();
} else {
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index 3ae65c1..6ab6eee 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -200,6 +200,8 @@
bool is_krait = CpuInfo::FieldContains(kCpuInfoHardware, "QCT APQ8064");
bool is_armada_370xp =
CpuInfo::FieldContains(kCpuInfoHardware, "Marvell Armada 370/XP");
+ bool is_virtual_machine =
+ CpuInfo::FieldContains(kCpuInfoHardware, "Dummy Virtual Machine");
#if defined(HOST_OS_ANDROID)
bool is_android = true;
#else
@@ -217,6 +219,10 @@
integer_division_supported_ = false;
} else if (is_armada_370xp) {
integer_division_supported_ = false;
+ } else if (is_android && !is_arm64 && is_virtual_machine) {
+ // Some Android ARM emulators claim support for integer division in
+ // /proc/cpuinfo but do not actually support it.
+ integer_division_supported_ = false;
} else {
integer_division_supported_ =
(CpuInfo::FieldContains(kCpuInfoFeatures, "idiva") || is_arm64) &&
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index bbf0ea3..77f7ea6 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -907,6 +907,8 @@
#else
#error What architecture?
#endif
+
+ ADD_ISOLATE_FLAG(null_safety, null_safety, FLAG_null_safety);
}
if (Dart::non_nullable_flag()) {
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 498e600..833f9c8 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1339,13 +1339,14 @@
old_space->set_tasks(0);
ml.NotifyAll();
}
-
- spawning_group->Shutdown();
});
}
Thread::ExitIsolateGroupAsHelper(kBypassSafepoint);
}
+
+ spawning_group->Shutdown();
+
Dart_EnterIsolate(Api::CastIsolate(isolate));
ASSERT(Thread::Current()->isolate_group() == isolate->group());
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index a756343..c82582f 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -2283,6 +2283,9 @@
const intptr_t kBufferSize = 100;
void* buffer = malloc(kBufferSize);
+ // The buffer becomes readable by Dart, so ensure it is initialized to
+ // satisfy our eager MSAN check.
+ memset(buffer, 0, kBufferSize);
Dart_Handle byte_data = Dart_NewExternalTypedDataWithFinalizer(
Dart_TypedData_kByteData, buffer, kBufferSize, buffer, kBufferSize,
ByteDataFinalizer);
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 93124b1..3057977 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -358,9 +358,6 @@
// Materializes all deferred objects. Returns the total number of
// artificial arguments used during deoptimization.
intptr_t DeoptContext::MaterializeDeferredObjects() {
- // This region is initialized by a mixture of C++ and generated code.
- MSAN_UNPOISON(dest_frame_, dest_frame_size_ * kWordSize);
-
// Populate slots with references to all unboxed "primitive" values (doubles,
// mints, simd) and deferred objects. Deferred objects are only allocated
// but not filled with data. This is done later because deferred objects
diff --git a/runtime/vm/dwarf.cc b/runtime/vm/dwarf.cc
index be78898..c70ed6a 100644
--- a/runtime/vm/dwarf.cc
+++ b/runtime/vm/dwarf.cc
@@ -124,7 +124,8 @@
ASSERT(name != nullptr);
ASSERT(payload_start >= 0);
auto const virtual_address = elf_->NextMemoryOffset() + payload_start;
- elf_->AddStaticSymbol(elf_->NextSectionIndex(), name, virtual_address);
+ elf_->AddStaticSymbol(elf_->NextSectionIndex(), name, virtual_address,
+ code.Size());
ASSERT(!code.IsNull());
ASSERT(code_to_address_.Lookup(&code) == nullptr);
diff --git a/runtime/vm/elf.cc b/runtime/vm/elf.cc
index 60e9b62..9654d8e 100644
--- a/runtime/vm/elf.cc
+++ b/runtime/vm/elf.cc
@@ -5,10 +5,10 @@
#include "vm/elf.h"
#include "platform/elf.h"
-#include "platform/text_buffer.h"
#include "vm/cpu.h"
#include "vm/hash_map.h"
#include "vm/thread.h"
+#include "vm/zone_text_buffer.h"
namespace dart {
@@ -347,7 +347,7 @@
/*executable=*/false,
/*writable=*/false),
dynamic_(allocate),
- text_(128),
+ text_(Thread::Current()->zone(), 128),
text_indices_() {
text_.AddChar('\0');
text_indices_.Insert({"", 1});
@@ -357,7 +357,7 @@
intptr_t MemorySize() { return dynamic_ ? FileSize() : 0; }
void Write(Elf* stream) {
- stream->WriteBytes(reinterpret_cast<const uint8_t*>(text_.buf()),
+ stream->WriteBytes(reinterpret_cast<const uint8_t*>(text_.buffer()),
text_.length());
}
@@ -371,7 +371,7 @@
}
const bool dynamic_;
- TextBuffer text_;
+ ZoneTextBuffer text_;
// To avoid kNoValue for intptr_t (0), we store an index n as n + 1.
CStringMap<intptr_t> text_indices_;
};
@@ -561,7 +561,7 @@
}
}
- class Entry {
+ class Entry : public ZoneAllocated {
public:
intptr_t tag;
intptr_t value;
@@ -650,7 +650,8 @@
void Elf::AddStaticSymbol(intptr_t section,
const char* name,
- size_t memory_offset) {
+ intptr_t address,
+ intptr_t size) {
// Lazily allocate the static string and symbol tables, as we only add static
// symbols in unstripped ELF files.
if (strtab_ == nullptr) {
@@ -661,8 +662,8 @@
auto const name_index = strtab_->AddString(name);
auto const info = (elf::STB_GLOBAL << 4) | elf::STT_FUNC;
- Symbol* symbol = new (zone_)
- Symbol(name, name_index, info, section, memory_offset, /*size=*/0);
+ Symbol* symbol =
+ new (zone_) Symbol(name, name_index, info, section, address, size);
symtab_->AddSymbol(symbol);
}
diff --git a/runtime/vm/elf.h b/runtime/vm/elf.h
index f270dac..4cd877a 100644
--- a/runtime/vm/elf.h
+++ b/runtime/vm/elf.h
@@ -33,7 +33,8 @@
void AddDebug(const char* name, const uint8_t* bytes, intptr_t size);
void AddStaticSymbol(intptr_t section,
const char* name,
- size_t memory_offset);
+ intptr_t address,
+ intptr_t size);
void Finalize();
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index a421c27..3e3db82 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -332,6 +332,10 @@
if (instr->RnField() == PP) {
// PP is untagged on ARM64.
ASSERT(Utils::IsAligned(offset, 8));
+ // A code object may have an object pool attached in bare instructions
+ // mode if the v8 snapshot profile writer is active, but this pool cannot
+ // be used for object loading.
+ if (FLAG_use_bare_instructions) return false;
intptr_t index = ObjectPool::IndexFromOffset(offset - kHeapObjectTag);
const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
if (!pool.IsNull()) {
diff --git a/runtime/vm/instructions_x64.cc b/runtime/vm/instructions_x64.cc
index d25854f..2225a3e 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -31,6 +31,31 @@
uint8_t* bytes = reinterpret_cast<uint8_t*>(pc);
+ COMPILE_ASSERT(THR == R14);
+ if ((bytes[0] == 0x49) || (bytes[0] == 0x4d)) {
+ if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) { // movq, cmpq
+ if ((bytes[2] & 0xc7) == (0x80 | (THR & 7))) { // [r14+disp32]
+ int32_t offset = *reinterpret_cast<int32_t*>(pc + 3);
+ return Thread::ObjectAtOffset(offset, obj);
+ }
+ if ((bytes[2] & 0xc7) == (0x40 | (THR & 7))) { // [r14+disp8]
+ uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
+ return Thread::ObjectAtOffset(offset, obj);
+ }
+ }
+ }
+
+ if (((bytes[0] == 0x41) && (bytes[1] == 0xff) && (bytes[2] == 0x76))) {
+ // push [r14+disp8]
+ uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
+ return Thread::ObjectAtOffset(offset, obj);
+ }
+
+ // A code object may have an object pool attached in bare instructions mode
+ // if the v8 snapshot profile writer is active, but this pool cannot be used
+ // for object loading.
+ if (FLAG_use_bare_instructions) return false;
+
COMPILE_ASSERT(PP == R15);
if ((bytes[0] == 0x49) || (bytes[0] == 0x4d)) {
if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) { // movq, cmpq
@@ -57,25 +82,6 @@
}
}
- COMPILE_ASSERT(THR == R14);
- if ((bytes[0] == 0x49) || (bytes[0] == 0x4d)) {
- if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) { // movq, cmpq
- if ((bytes[2] & 0xc7) == (0x80 | (THR & 7))) { // [r14+disp32]
- int32_t offset = *reinterpret_cast<int32_t*>(pc + 3);
- return Thread::ObjectAtOffset(offset, obj);
- }
- if ((bytes[2] & 0xc7) == (0x40 | (THR & 7))) { // [r14+disp8]
- uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
- return Thread::ObjectAtOffset(offset, obj);
- }
- }
- }
- if (((bytes[0] == 0x41) && (bytes[1] == 0xff) && (bytes[2] == 0x76))) {
- // push [r14+disp8]
- uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
- return Thread::ObjectAtOffset(offset, obj);
- }
-
return false;
}
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 633d468..bf0ad70 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -267,7 +267,7 @@
}
void IsolateGroup::RunWithLockedGroup(std::function<void()> fun) {
- SafepointReadRwLocker ml(Thread::Current(), isolates_lock_.get());
+ SafepointWriteRwLocker ml(Thread::Current(), isolates_lock_.get());
fun();
}
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 554398b..621dfd2 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -160,6 +160,7 @@
V(NONPRODUCT, use_field_guards, UseFieldGuards, use_field_guards, \
FLAG_use_field_guards) \
V(NONPRODUCT, use_osr, UseOsr, use_osr, FLAG_use_osr) \
+ V(PRODUCT, null_safety, NullSafety, null_safety, FLAG_null_safety) \
V(PRECOMPILER, obfuscate, Obfuscate, obfuscate, false_by_default) \
V(PRODUCT, unsafe_trust_strong_mode_types, UnsafeTrustStrongModeTypes, \
unsafe_trust_strong_mode_types, \
@@ -1258,6 +1259,7 @@
V(UseOsr) \
V(Obfuscate) \
V(ShouldLoadVmService) \
+ V(NullSafety) \
V(UnsafeTrustStrongModeTypes)
// Isolate specific flags.
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index e3cb9c9..67d8ad5 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -2062,7 +2062,10 @@
delayed_function_type_arguments_(TypeArguments::Handle(zone)) {}
void CheckStatics(const GrowableArray<const Field*>& fields) {
- HANDLESCOPE(Thread::Current());
+ Thread* thread = Thread::Current();
+ Isolate* isolate = thread->isolate();
+ bool null_safety = isolate->null_safety();
+ HANDLESCOPE(thread);
instantiator_type_arguments_ = TypeArguments::null();
for (intptr_t i = 0; i < fields.length(); i++) {
const Field& field = *fields[i];
@@ -2074,24 +2077,27 @@
}
value_ = field.StaticValue();
if (value_.raw() != Object::sentinel().raw()) {
- CheckValueType(value_, field);
+ CheckValueType(null_safety, value_, field);
}
}
}
void CheckInstances(const GrowableArray<const Instance*>& instances) {
+ Thread* thread = Thread::Current();
+ Isolate* isolate = thread->isolate();
+ bool null_safety = isolate->null_safety();
for (intptr_t i = 0; i < instances.length(); i++) {
// This handle scope does run very frequently, but is a net-win by
// preventing us from spending too much time in malloc for new handle
// blocks.
- HANDLESCOPE(Thread::Current());
- CheckInstance(*instances[i]);
+ HANDLESCOPE(thread);
+ CheckInstance(null_safety, *instances[i]);
}
}
private:
DART_FORCE_INLINE
- void CheckInstance(const Instance& instance) {
+ void CheckInstance(bool null_safety, const Instance& instance) {
cls_ = instance.clazz();
if (cls_.NumTypeArguments() > 0) {
instantiator_type_arguments_ = instance.GetTypeArguments();
@@ -2105,12 +2111,14 @@
continue;
}
const Field& field = Field::Cast(entry_);
- CheckInstanceField(instance, field);
+ CheckInstanceField(null_safety, instance, field);
}
}
DART_FORCE_INLINE
- void CheckInstanceField(const Instance& instance, const Field& field) {
+ void CheckInstanceField(bool null_safety,
+ const Instance& instance,
+ const Field& field) {
if (field.needs_load_guard()) {
return; // Already guarding.
}
@@ -2121,12 +2129,14 @@
field.set_needs_load_guard(true);
return;
}
- CheckValueType(value_, field);
+ CheckValueType(null_safety, value_, field);
}
DART_FORCE_INLINE
- void CheckValueType(const Instance& value, const Field& field) {
- if (!FLAG_null_safety && value.IsNull()) {
+ void CheckValueType(bool null_safety,
+ const Instance& value,
+ const Field& field) {
+ if (!null_safety && value.IsNull()) {
return;
}
type_ = field.type();
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 845d10e..a326820 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -93,6 +93,7 @@
#if !defined(DART_PRECOMPILER)
api_flags.use_osr = true;
#endif
+ api_flags.null_safety = false;
isolate = reinterpret_cast<Isolate*>(
create_group_callback(KernelIsolate::kName, KernelIsolate::kName, NULL,
@@ -759,7 +760,8 @@
Dart_CObject null_safety;
null_safety.type = Dart_CObject_kBool;
- null_safety.value.as_bool = FLAG_null_safety;
+ null_safety.value.as_bool =
+ isolate != NULL ? isolate->null_safety() : FLAG_null_safety;
intptr_t num_experimental_flags = experimental_flags->length();
Dart_CObject** experimental_flags_array =
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 7771db0..fd193c8 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1030,13 +1030,13 @@
library.set_is_nnbd(library_helper.IsNonNullableByDefault());
const NNBDCompiledMode mode =
library_helper.GetNonNullableByDefaultCompiledMode();
- if (!FLAG_null_safety && mode == NNBDCompiledMode::kStrong) {
+ if (!I->null_safety() && mode == NNBDCompiledMode::kStrong) {
H.ReportError(
"Library '%s' was compiled with null safety (in strong mode) and it "
"requires --null-safety option at runtime",
String::Handle(library.url()).ToCString());
}
- if (FLAG_null_safety && (mode == NNBDCompiledMode::kWeak ||
+ if (I->null_safety() && (mode == NNBDCompiledMode::kWeak ||
mode == NNBDCompiledMode::kDisabled)) {
H.ReportError(
"Library '%s' was compiled without null safety (in weak mode) and it "
@@ -1958,6 +1958,9 @@
(function.is_static() && (library.raw() == Library::InternalLibrary()))) {
function.set_is_reflectable(false);
}
+ if (procedure_helper.IsMemberSignature()) {
+ function.set_is_reflectable(false);
+ }
ActiveMemberScope active_member(&active_class_, &function);
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 895d5d6..75d9cd6 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -269,7 +269,7 @@
} else if (strcmp(command, "is-mutator-in-native") == 0) {
Isolate* const isolate = reinterpret_cast<Isolate*>(arg);
- if (isolate->mutator_thread()->execution_state() ==
+ if (isolate->mutator_thread()->execution_state_cross_thread_for_testing() ==
Thread::kThreadInNative) {
return arg;
} else {
diff --git a/runtime/vm/native_symbol.h b/runtime/vm/native_symbol.h
index 29dda98..84aad3c 100644
--- a/runtime/vm/native_symbol.h
+++ b/runtime/vm/native_symbol.h
@@ -16,7 +16,7 @@
public:
static void Init();
static void Cleanup();
- static char* LookupSymbolName(uintptr_t pc, uintptr_t* start);
+ static char* LookupSymbolName(uword pc, uword* start);
static bool LookupSharedObject(uword pc, uword* dso_base, char** dso_name);
static void FreeSymbolName(char* name);
static void AddSymbols(const char* dso_name, void* buffer, size_t size);
diff --git a/runtime/vm/native_symbol_android.cc b/runtime/vm/native_symbol_android.cc
index 9cfd7cb..34a3492 100644
--- a/runtime/vm/native_symbol_android.cc
+++ b/runtime/vm/native_symbol_android.cc
@@ -17,7 +17,7 @@
void NativeSymbolResolver::Cleanup() {}
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
Dl_info info;
int r = dladdr(reinterpret_cast<void*>(pc), &info);
if (r == 0) {
@@ -27,7 +27,7 @@
return NULL;
}
if (start != NULL) {
- *start = reinterpret_cast<uintptr_t>(info.dli_saddr);
+ *start = reinterpret_cast<uword>(info.dli_saddr);
}
int status = 0;
size_t len = 0;
diff --git a/runtime/vm/native_symbol_fuchsia.cc b/runtime/vm/native_symbol_fuchsia.cc
index 70aa0b5..aed0b2a 100644
--- a/runtime/vm/native_symbol_fuchsia.cc
+++ b/runtime/vm/native_symbol_fuchsia.cc
@@ -100,16 +100,16 @@
}
}
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
Dl_info info;
int r = dladdr(reinterpret_cast<void*>(pc), &info);
if (r == 0) {
return NULL;
}
- const char* dso_name = info.dli_fname;
- uword dso_base = reinterpret_cast<uword>(info.dli_fbase);
- uword dso_offset = pc - dso_base;
+ auto const dso_name = info.dli_fname;
+ const auto dso_base = reinterpret_cast<uword>(info.dli_fbase);
+ const auto dso_offset = pc - dso_base;
for (NativeSymbols* symbols = symbols_; symbols != NULL;
symbols = symbols->next()) {
diff --git a/runtime/vm/native_symbol_linux.cc b/runtime/vm/native_symbol_linux.cc
index a4af553..69fc1df 100644
--- a/runtime/vm/native_symbol_linux.cc
+++ b/runtime/vm/native_symbol_linux.cc
@@ -18,7 +18,7 @@
void NativeSymbolResolver::Cleanup() {}
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
Dl_info info;
int r = dladdr(reinterpret_cast<void*>(pc), &info);
if (r == 0) {
@@ -28,7 +28,7 @@
return NULL;
}
if (start != NULL) {
- *start = reinterpret_cast<uintptr_t>(info.dli_saddr);
+ *start = reinterpret_cast<uword>(info.dli_saddr);
}
int status = 0;
size_t len = 0;
diff --git a/runtime/vm/native_symbol_macos.cc b/runtime/vm/native_symbol_macos.cc
index d3a6489..88af47b 100644
--- a/runtime/vm/native_symbol_macos.cc
+++ b/runtime/vm/native_symbol_macos.cc
@@ -17,7 +17,7 @@
void NativeSymbolResolver::Cleanup() {}
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
Dl_info info;
int r = dladdr(reinterpret_cast<void*>(pc), &info);
if (r == 0) {
@@ -27,7 +27,7 @@
return NULL;
}
if (start != NULL) {
- *start = reinterpret_cast<uintptr_t>(info.dli_saddr);
+ *start = reinterpret_cast<uword>(info.dli_saddr);
}
int status;
char* demangled = abi::__cxa_demangle(info.dli_sname, NULL, NULL, &status);
diff --git a/runtime/vm/native_symbol_win.cc b/runtime/vm/native_symbol_win.cc
index d138ab0..a4f2f45 100644
--- a/runtime/vm/native_symbol_win.cc
+++ b/runtime/vm/native_symbol_win.cc
@@ -49,7 +49,7 @@
}
}
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
static const intptr_t kMaxNameLength = 2048;
static const intptr_t kSymbolInfoSize = sizeof(SYMBOL_INFO); // NOLINT.
static char buffer[kSymbolInfoSize + kMaxNameLength];
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 85b1d32..b841c86 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7499,7 +7499,9 @@
return false;
}
// Verify that all argument names are valid parameter names.
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Isolate* isolate = thread->isolate();
+ Zone* zone = thread->zone();
String& argument_name = String::Handle(zone);
String& parameter_name = String::Handle(zone);
const intptr_t num_positional_args = num_arguments - num_named_arguments;
@@ -7528,7 +7530,7 @@
return false;
}
}
- if (FLAG_null_safety) {
+ if (isolate->null_safety()) {
// Verify that all required named parameters are filled.
for (intptr_t j = num_positional_args; j < num_parameters; j++) {
if (IsRequiredAt(j)) {
@@ -7966,10 +7968,6 @@
return false;
}
}
- // Check the names and types of optional named parameters.
- if (other_num_opt_named_params == 0) {
- return true;
- }
// Check that for each optional named parameter of type T of the other
// function type, there exists an optional named parameter of this function
// type with an identical name and with a type S that is a supertype of T.
@@ -7983,7 +7981,6 @@
for (intptr_t i = other_num_fixed_params; i < other_num_params; i++) {
other_param_name = other.ParameterNameAt(i);
ASSERT(other_param_name.IsSymbol());
- const bool other_is_required = other.IsRequiredAt(i);
found_param_name = false;
for (intptr_t j = num_fixed_params; j < num_params; j++) {
ASSERT(String::Handle(zone, ParameterNameAt(j)).IsSymbol());
@@ -7992,9 +7989,6 @@
if (!IsContravariantParameter(j, other, i, space)) {
return false;
}
- if (FLAG_null_safety && IsRequiredAt(j) && !other_is_required) {
- return false;
- }
break;
}
}
@@ -8002,6 +7996,30 @@
return false;
}
}
+ if (FLAG_null_safety) {
+ // Check that for each required named parameter in this function, there's a
+ // corresponding required named parameter in the other function.
+ String& param_name = other_param_name;
+ for (intptr_t j = num_fixed_params; j < num_params; j++) {
+ if (IsRequiredAt(j)) {
+ param_name = ParameterNameAt(j);
+ ASSERT(param_name.IsSymbol());
+ bool found = false;
+ for (intptr_t i = other_num_fixed_params; i < other_num_params; i++) {
+ ASSERT(String::Handle(zone, other.ParameterNameAt(i)).IsSymbol());
+ if (other.ParameterNameAt(i) == param_name.raw()) {
+ found = true;
+ if (!other.IsRequiredAt(i)) {
+ return false;
+ }
+ }
+ }
+ if (!found) {
+ return false;
+ }
+ }
+ }
+ }
return true;
}
@@ -17629,7 +17647,7 @@
// In weak mode type casts, whether in legacy or opted-in libraries, the null
// instance is detected and handled in inlined code and therefore cannot be
// encountered here as a Dart null receiver.
- ASSERT(FLAG_null_safety || !IsNull());
+ ASSERT(Isolate::Current()->null_safety() || !IsNull());
// In strong mode, compute NNBD_SUBTYPE(runtimeType, other).
// In weak mode, compute LEGACY_SUBTYPE(runtimeType, other).
return RuntimeTypeIsSubtypeOf(other, other_instantiator_type_arguments,
@@ -17671,8 +17689,12 @@
}
bool Instance::NullIsAssignableTo(const AbstractType& other) {
+ Thread* thread = Thread::Current();
+ Isolate* isolate = thread->isolate();
+ Zone* zone = thread->zone();
+
// In weak mode, Null is a bottom type (according to LEGACY_SUBTYPE).
- if (!FLAG_null_safety) {
+ if (!isolate->null_safety()) {
return true;
}
// "Left Null" rule: null is assignable when destination type is either
@@ -17682,7 +17704,8 @@
return true;
}
if (other.IsFutureOrType()) {
- return NullIsAssignableTo(AbstractType::Handle(other.UnwrapFutureOr()));
+ return NullIsAssignableTo(
+ AbstractType::Handle(zone, other.UnwrapFutureOr()));
}
return false;
}
@@ -17699,12 +17722,13 @@
if (other.IsTopType()) {
return true;
}
+ Thread* thread = Thread::Current();
+ Isolate* isolate = thread->isolate();
+ Zone* zone = thread->zone();
// In weak testing mode, Null type is a subtype of any type.
- if (IsNull() && !FLAG_null_safety) {
+ if (IsNull() && !isolate->null_safety()) {
return true;
}
- Thread* thread = Thread::Current();
- Zone* zone = thread->zone();
const Class& cls = Class::Handle(zone, clazz());
if (cls.IsClosureClass()) {
if (other.IsDartFunctionType() || other.IsDartClosureType()) {
@@ -17766,7 +17790,7 @@
return false;
}
if (IsNull()) {
- ASSERT(FLAG_null_safety);
+ ASSERT(isolate->null_safety());
if (instantiated_other.IsNullType()) {
return true;
}
@@ -18062,17 +18086,27 @@
.SetInstantiatedNullability(type_param, space);
}
-RawAbstractType* AbstractType::NormalizeInstantiatedType() const {
+RawAbstractType* AbstractType::NormalizeFutureOrType(Heap::Space space) const {
if (Dart::non_nullable_flag()) {
- // Normalize FutureOr<T>.
if (IsFutureOrType()) {
const AbstractType& unwrapped_type =
AbstractType::Handle(UnwrapFutureOr());
const classid_t cid = unwrapped_type.type_class_id();
- if (cid == kDynamicCid || cid == kVoidCid || cid == kInstanceCid) {
+ if (cid == kDynamicCid || cid == kVoidCid) {
return unwrapped_type.raw();
}
- if (cid == kNeverCid && IsNonNullable()) {
+ if (cid == kInstanceCid) {
+ if (IsNonNullable()) {
+ return unwrapped_type.raw();
+ }
+ if (IsNullable() || unwrapped_type.IsNullable()) {
+ return Type::Cast(unwrapped_type)
+ .ToNullability(Nullability::kNullable, space);
+ }
+ return Type::Cast(unwrapped_type)
+ .ToNullability(Nullability::kLegacy, space);
+ }
+ if (cid == kNeverCid && unwrapped_type.IsNonNullable()) {
ObjectStore* object_store = Isolate::Current()->object_store();
if (object_store->non_nullable_future_never_type() == Type::null()) {
const Class& cls = Class::Handle(object_store->future_class());
@@ -18087,7 +18121,9 @@
type ^= type.Canonicalize();
object_store->set_non_nullable_future_never_type(type);
}
- return object_store->non_nullable_future_never_type();
+ const Type& future_never_type =
+ Type::Handle(object_store->non_nullable_future_never_type());
+ return future_never_type.ToNullability(nullability(), space);
}
if (cid == kNullCid) {
ObjectStore* object_store = Isolate::Current()->object_store();
@@ -18106,6 +18142,10 @@
}
return object_store->nullable_future_null_type();
}
+ if (IsNullable() && unwrapped_type.IsNullable()) {
+ return Type::Cast(*this).ToNullability(Nullability::kNonNullable,
+ space);
+ }
}
}
return raw();
@@ -18449,7 +18489,7 @@
if (cid == kInstanceCid) { // Object type.
// NNBD weak mode uses LEGACY_SUBTYPE for assignability / 'as' tests,
// and non-nullable Object is a top type according to LEGACY_SUBTYPE.
- return !FLAG_null_safety || !IsNonNullable();
+ return !Isolate::Current()->null_safety() || !IsNonNullable();
}
if (cid == kFutureOrCid) {
// FutureOr<T> where T is a top type behaves as a top type.
@@ -18560,6 +18600,7 @@
return Instance::NullIsAssignableTo(other);
}
Thread* thread = Thread::Current();
+ Isolate* isolate = thread->isolate();
Zone* zone = thread->zone();
// Type parameters cannot be handled by Class::IsSubtypeOf().
// When comparing two uninstantiated function types, one returning type
@@ -18596,7 +18637,7 @@
if (other.IsTypeParameter()) {
return false;
}
- if (FLAG_null_safety && IsNullable() && other.IsNonNullable()) {
+ if (isolate->null_safety() && IsNullable() && other.IsNonNullable()) {
return false;
}
const Class& type_cls = Class::Handle(zone, type_class());
@@ -18972,7 +19013,7 @@
}
}
// Canonicalization is not part of instantiation.
- return instantiated_type.NormalizeInstantiatedType();
+ return instantiated_type.NormalizeFutureOrType(space);
}
bool Type::IsEquivalent(const Instance& other,
@@ -19001,8 +19042,12 @@
}
Nullability this_type_nullability = nullability();
Nullability other_type_nullability = other_type.nullability();
+ Thread* thread = Thread::Current();
+ Isolate* isolate = thread->isolate();
+ Zone* zone = thread->zone();
if (kind == TypeEquality::kInSubtypeTest) {
- if (FLAG_null_safety && this_type_nullability == Nullability::kNullable &&
+ if (isolate->null_safety() &&
+ this_type_nullability == Nullability::kNullable &&
other_type_nullability == Nullability::kNonNullable) {
return false;
}
@@ -19028,8 +19073,6 @@
(signature() == other_type.signature())) {
return true;
}
- Thread* thread = Thread::Current();
- Zone* zone = thread->zone();
if (arguments() != other_type.arguments()) {
const Class& cls = Class::Handle(zone, type_class());
const intptr_t num_type_params = cls.NumTypeParameters(thread);
@@ -19722,7 +19765,7 @@
Nullability this_type_param_nullability = nullability();
Nullability other_type_param_nullability = other_type_param.nullability();
if (kind == TypeEquality::kInSubtypeTest) {
- if (FLAG_null_safety &&
+ if (Isolate::Current()->null_safety() &&
(this_type_param_nullability == Nullability::kNullable) &&
(other_type_param_nullability == Nullability::kNonNullable)) {
return false;
@@ -19836,7 +19879,7 @@
AbstractType& result =
AbstractType::Handle(function_type_arguments.TypeAt(index()));
result = result.SetInstantiatedNullability(*this, space);
- return result.NormalizeInstantiatedType();
+ return result.NormalizeFutureOrType(space);
}
ASSERT(IsClassTypeParameter());
if (instantiator_type_arguments.IsNull()) {
@@ -19854,7 +19897,7 @@
AbstractType& result =
AbstractType::Handle(instantiator_type_arguments.TypeAt(index()));
result = result.SetInstantiatedNullability(*this, space);
- return result.NormalizeInstantiatedType();
+ return result.NormalizeFutureOrType(space);
// There is no need to canonicalize the instantiated type parameter, since all
// type arguments are canonicalized at type finalization time. It would be too
// early to canonicalize the returned type argument here, since instantiation
@@ -23432,18 +23475,27 @@
: Code::Cast(code).PayloadStart();
uword return_addr = start + pc_offset;
uword call_addr = return_addr - 1;
+ buffer.Printf(" #%02" Pd " abs %" Pp "", frame_index, call_addr);
uword dso_base;
char* dso_name;
if (NativeSymbolResolver::LookupSharedObject(call_addr, &dso_base,
&dso_name)) {
uword dso_offset = call_addr - dso_base;
- buffer.Printf(" #%02" Pd " abs %" Pp " virt %" Pp " %s\n",
- frame_index, call_addr, dso_offset, dso_name);
+ buffer.Printf(" virt %" Pp "", dso_offset);
+ uword symbol_start;
+ if (auto const symbol_name = NativeSymbolResolver::LookupSymbolName(
+ call_addr, &symbol_start)) {
+ uword symbol_offset = call_addr - symbol_start;
+ buffer.Printf(" %s+0x%" Px "", symbol_name, symbol_offset);
+ NativeSymbolResolver::FreeSymbolName(symbol_name);
+ } else {
+ buffer.Printf(" %s", dso_name);
+ }
NativeSymbolResolver::FreeSymbolName(dso_name);
} else {
- buffer.Printf(" #%02" Pd " abs %" Pp " <unknown>\n", frame_index,
- call_addr);
+ buffer.Printf(" <unknown>");
}
+ buffer.Printf("\n");
frame_index++;
}
}
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 3706d9e..1c620c9 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -7463,7 +7463,7 @@
virtual RawAbstractType* SetInstantiatedNullability(
const TypeParameter& type_param,
Heap::Space space) const;
- virtual RawAbstractType* NormalizeInstantiatedType() const;
+ virtual RawAbstractType* NormalizeFutureOrType(Heap::Space space) const;
virtual bool HasTypeClass() const { return type_class_id() != kIllegalCid; }
virtual classid_t type_class_id() const;
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index a982bb6..e568c4a 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -983,10 +983,10 @@
writer_->WriteUnsigned(writer_->GetObjectId(weak_persistent_handle->raw()));
writer_->WriteUnsigned(weak_persistent_handle->external_size());
// Attempt to include a native symbol name.
- char* name = NativeSymbolResolver::LookupSymbolName(
- reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()), NULL);
- writer_->WriteUtf8((name == NULL) ? "Unknown native function" : name);
- if (name != NULL) {
+ auto const name = NativeSymbolResolver::LookupSymbolName(
+ reinterpret_cast<uword>(weak_persistent_handle->callback()), nullptr);
+ writer_->WriteUtf8((name == nullptr) ? "Unknown native function" : name);
+ if (name != nullptr) {
NativeSymbolResolver::FreeSymbolName(name);
}
}
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 0e09117..69eaf42 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -457,12 +457,12 @@
}
static void DumpStackFrame(intptr_t frame_index, uword pc, uword fp) {
- uintptr_t start = 0;
- char* native_symbol_name = NativeSymbolResolver::LookupSymbolName(pc, &start);
- if (native_symbol_name != NULL) {
- OS::PrintErr(" pc 0x%" Pp " fp 0x%" Pp " %s\n", pc, fp,
- native_symbol_name);
- NativeSymbolResolver::FreeSymbolName(native_symbol_name);
+ uword start = 0;
+ if (auto const name = NativeSymbolResolver::LookupSymbolName(pc, &start)) {
+ uword offset = pc - start;
+ OS::PrintErr(" pc 0x%" Pp " fp 0x%" Pp " %s+0x%" Px "\n", pc, fp, name,
+ offset);
+ NativeSymbolResolver::FreeSymbolName(name);
return;
}
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index c05cd6a..08770d8 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -1424,7 +1424,7 @@
// We haven't seen this pc yet.
// Check NativeSymbolResolver for pc.
- uintptr_t native_start = 0;
+ uword native_start = 0;
char* native_name =
NativeSymbolResolver::LookupSymbolName(pc, &native_start);
if (native_name == NULL) {
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 5821da5..1a097cc 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -799,7 +799,7 @@
ASSERT(!dst_type.IsDynamicType()); // No need to check assignment.
// A null instance is already detected and allowed in inlined code, unless
// strong checking is enabled.
- ASSERT(!src_instance.IsNull() || FLAG_null_safety);
+ ASSERT(!src_instance.IsNull() || isolate->null_safety());
const bool is_instance_of = src_instance.IsAssignableTo(
dst_type, instantiator_type_arguments, function_type_arguments);
@@ -2845,6 +2845,14 @@
static void CopySavedRegisters(uword saved_registers_address,
fpu_register_t** fpu_registers,
intptr_t** cpu_registers) {
+ // Tell MemorySanitizer this region is initialized by generated code. This
+ // region isn't already (fully) unpoisoned by FrameSetIterator::Unpoison
+ // because it is in an exit frame and stack frame iteration doesn't have
+ // access to true SP for exit frames.
+ MSAN_UNPOISON(reinterpret_cast<void*>(saved_registers_address),
+ kNumberOfSavedFpuRegisters * kFpuRegisterSize +
+ kNumberOfSavedCpuRegisters * kWordSize);
+
ASSERT(sizeof(fpu_register_t) == kFpuRegisterSize);
fpu_register_t* fpu_registers_copy =
new fpu_register_t[kNumberOfSavedFpuRegisters];
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 72ce179..2f451ce 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -4155,9 +4155,9 @@
reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()));
// Attempt to include a native symbol name.
char* name = NativeSymbolResolver::LookupSymbolName(
- reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()), NULL);
- obj.AddProperty("callbackSymbolName", (name == NULL) ? "" : name);
- if (name != NULL) {
+ reinterpret_cast<uword>(weak_persistent_handle->callback()), nullptr);
+ obj.AddProperty("callbackSymbolName", (name == nullptr) ? "" : name);
+ if (name != nullptr) {
NativeSymbolResolver::FreeSymbolName(name);
}
obj.AddPropertyF("externalSize", "%" Pd "",
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index 4817ab9..7e084ab 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -346,6 +346,7 @@
Dart_IsolateFlags api_flags;
Isolate::FlagsInitialize(&api_flags);
+ api_flags.null_safety = false;
isolate = reinterpret_cast<Isolate*>(
create_group_callback(ServiceIsolate::kName, ServiceIsolate::kName,
diff --git a/runtime/vm/signal_handler_android.cc b/runtime/vm/signal_handler_android.cc
index f9f6944..cdef00f 100644
--- a/runtime/vm/signal_handler_android.cc
+++ b/runtime/vm/signal_handler_android.cc
@@ -95,11 +95,27 @@
}
void SignalHandler::InstallImpl(SignalAction action) {
+ // Bionic implementation of setjmp temporary mangles SP register
+ // in place which breaks signal delivery on the thread stack - when
+ // kernel tries to deliver SIGPROF and we are in the middle of
+ // setjmp SP value is invalid - might be pointing to random memory
+ // or outside of writable space at all. In the first case we
+ // get memory corruption and in the second case kernel would send
+ // SIGSEGV to the process. See b/152210274 for details.
+ // To work around this issue we are using alternative signal stack
+ // to handle SIGPROF signals.
+ stack_t ss;
+ ss.ss_size = SIGSTKSZ;
+ ss.ss_sp = malloc(ss.ss_size);
+ ss.ss_flags = 0;
+ int r = sigaltstack(&ss, NULL);
+ ASSERT(r == 0);
+
struct sigaction act = {};
act.sa_sigaction = action;
sigemptyset(&act.sa_mask);
- act.sa_flags = SA_RESTART | SA_SIGINFO;
- int r = sigaction(SIGPROF, &act, NULL);
+ act.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK;
+ r = sigaction(SIGPROF, &act, NULL);
ASSERT(r == 0);
}
@@ -111,6 +127,13 @@
sigemptyset(&act.sa_mask);
int r = sigaction(SIGPROF, &act, NULL);
ASSERT(r == 0);
+
+ // Disable and delete alternative signal stack.
+ stack_t ss, old_ss;
+ ss.ss_flags = SS_DISABLE;
+ r = sigaltstack(&ss, &old_ss);
+ ASSERT(r == 0);
+ free(old_ss.ss_sp);
}
} // namespace dart
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index c1b0d03..1132a6e 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -751,6 +751,11 @@
ExecutionState execution_state() const {
return static_cast<ExecutionState>(execution_state_);
}
+ // Normally execution state is only accessed for the current thread.
+ NO_SANITIZE_THREAD
+ ExecutionState execution_state_cross_thread_for_testing() const {
+ return static_cast<ExecutionState>(execution_state_);
+ }
void set_execution_state(ExecutionState state) {
execution_state_ = static_cast<uword>(state);
}
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 07ac698..45ea803 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -92,8 +92,9 @@
const AbstractType& type,
bool lazy_specialize /* = true */) {
if (type.IsTypeRef()) {
- return FLAG_null_safety ? StubCode::DefaultTypeTest().raw()
- : StubCode::DefaultNullableTypeTest().raw();
+ return Isolate::Current()->null_safety()
+ ? StubCode::DefaultTypeTest().raw()
+ : StubCode::DefaultNullableTypeTest().raw();
}
// During bootstrapping we have no access to stubs yet, so we'll just return
@@ -459,7 +460,8 @@
// Weak NNBD mode uses LEGACY_SUBTYPE which ignores nullability.
// We don't need to check nullability of LHS for nullable and legacy RHS
// ("Right Legacy", "Right Nullable" rules).
- if (FLAG_null_safety && !type_arg.IsNullable() && !type_arg.IsLegacy()) {
+ if (Isolate::Current()->null_safety() && !type_arg.IsNullable() &&
+ !type_arg.IsLegacy()) {
compiler::Label skip_nullable_check;
// Nullable type is not a subtype of non-nullable type.
// TODO(dartbug.com/40736): Allocate a register for instance type argument
@@ -623,7 +625,11 @@
if (instantiator_type_arguments_.IsNull()) {
return Type::DynamicType();
}
- return instantiator_type_arguments_.TypeAt(parameter.index());
+ AbstractType& result = AbstractType::Handle(
+ instantiator_type_arguments_.TypeAt(parameter.index()));
+ result = result.SetInstantiatedNullability(TypeParameter::Cast(type),
+ Heap::kOld);
+ return result.NormalizeFutureOrType(Heap::kOld);
} else if (type.IsFunctionType()) {
// No support for function types yet.
UNREACHABLE();
@@ -847,7 +853,7 @@
// eagerly and avoid doing it down inside the loop.
type = Type::DynamicType();
UseTypeInAssertAssignable(type);
- type = Type::ObjectType();
+ type = Type::ObjectType(); // TODO(regis): Add nullable Object?
UseTypeInAssertAssignable(type);
for (intptr_t cid = 0; cid < cid_count; ++cid) {
diff --git a/runtime/vm/version_in.cc b/runtime/vm/version_in.cc
index ae3cff7..b4f1e2d 100644
--- a/runtime/vm/version_in.cc
+++ b/runtime/vm/version_in.cc
@@ -39,7 +39,7 @@
}
const char* Version::snapshot_hash_ = "{{SNAPSHOT_HASH}}";
-const char* Version::str_ = "{{VERSION_STR}} ({{COMMIT_TIME}})";
+const char* Version::str_ = "{{VERSION_STR}} ({{CHANNEL}}) ({{COMMIT_TIME}})";
const char* Version::commit_ = "{{VERSION_STR}}";
} // namespace dart
diff --git a/runtime/vm/zone_text_buffer.cc b/runtime/vm/zone_text_buffer.cc
index c7548eb..446f952 100644
--- a/runtime/vm/zone_text_buffer.cc
+++ b/runtime/vm/zone_text_buffer.cc
@@ -44,6 +44,13 @@
return len;
}
+void ZoneTextBuffer::AddChar(char ch) {
+ EnsureCapacity(sizeof(ch));
+ buffer_[length_] = ch;
+ length_++;
+ buffer_[length_] = '\0';
+}
+
void ZoneTextBuffer::AddString(const char* s) {
Printf("%s", s);
}
diff --git a/runtime/vm/zone_text_buffer.h b/runtime/vm/zone_text_buffer.h
index 3d5207b..f4e2f31 100644
--- a/runtime/vm/zone_text_buffer.h
+++ b/runtime/vm/zone_text_buffer.h
@@ -21,6 +21,7 @@
~ZoneTextBuffer() {}
intptr_t Printf(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
+ void AddChar(char ch);
void AddString(const char* s);
void AddString(const String& s);
diff --git a/samples-dev/samples-dev.status b/samples-dev/samples-dev.status
deleted file mode 100644
index 66ee67b..0000000
--- a/samples-dev/samples-dev.status
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (c) 2014, 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.
-
-[ $compiler == dart2analyzer ]
-swarm/test/swarm_test: StaticWarning
-swarm/test/swarm_ui_lib/layout/layout_test: StaticWarning
-swarm/test/swarm_ui_lib/observable/observable_test: StaticWarning
-swarm/test/swarm_ui_lib/touch/touch_test: StaticWarning
-swarm/test/swarm_ui_lib/util/util_test: StaticWarning
-swarm/test/swarm_ui_lib/view/view_test: StaticWarning
-
-[ $runtime == safari ]
-swarm/test/swarm_test: Pass, Fail # Issue 14523
-
-[ $runtime == vm ]
-swarm: Skip
-
-[ $browser ]
-swarm/test/swarm_ui_lib/touch/touch_test: Fail # This may be related to issue 157, Expectation: Solver. Expect.approxEquals(expected:9, actual:8.990625000000001, tolerance:0.0009) fails
-
-[ $compiler == dart2js && $runtime == chromeOnAndroid ]
-swarm/test/swarm_test: Fail # TODO(kasperl): Please triage.
-swarm/test/swarm_ui_lib/layout/layout_test: Fail # TODO(kasperl): Please triage.
-
-[ $compiler == dart2js && $runtime == ff ]
-swarm/test/swarm_test: Fail # Issue 5633
diff --git a/samples-dev/swarm/test/swarm_test.dart b/samples-dev/swarm/test/swarm_test.dart
deleted file mode 100644
index c7f39f9..0000000
--- a/samples-dev/swarm/test/swarm_test.dart
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (c) 2011, 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.
-
-library swarm_tests;
-
-import 'dart:html';
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import '../swarmlib.dart';
-import '../swarm_ui_lib/base/base.dart';
-import '../swarm_ui_lib/util/utilslib.dart';
-
-// TODO(jmesserly): these would probably be easier to debug if they were written
-// in the WebKit layout test style, so we could easy compare that the DOM is
-// what we expect it to be after performing some simulated user actions.
-
-void main() {
- useHtmlConfiguration();
- Swarm swarm = new Swarm(useCannedData: true);
- UIStateProxy state = new UIStateProxy(swarm.sections);
- swarm.state = state;
- swarm.run();
- // TODO(jmesserly): should be adding the full stylesheet here
- Dom.addStyle('''
- .story-content {
- -webkit-column-width: 300px;
- -webkit-column-gap: 26px; /* 2em */
- }''');
-
- getStoryNode() => swarm.frontView.storyView.node;
-
- getView(Section section) {
- return CollectionUtils.find(
- swarm.frontView.sections.childViews, (view) => view.section == section);
- }
-
- getHistory(Article article) {
- final feed = article.dataSource;
- return {
- 'section': CollectionUtils
- .find(swarm.sections, (s) => s.feeds.indexOf(feed, 0) >= 0)
- .id,
- 'feed': feed.id,
- 'article': article.id
- };
- }
-
- test('BackButton', () {
- _serialInvokeAsync([
- () {
- Expect.equals(null, swarm.frontView.storyView); // verify initial state
-
- // Make sure we've transitioned to the section
- // In the real app, this isn't needed because ConveyorView fires the
- // transition end event before we can click a story.
- SectionView section = getView(swarm.sections[0]);
- section.showSources();
- },
- () {
- final item = swarm.sections[0].feeds[2].articles[1];
- state.loadFromHistory(getHistory(item));
-
- Expect.equals(item, state.currentArticle.value);
-
- Expect.isFalse(getStoryNode().classes.contains(CSS.HIDDEN_STORY));
-
- state.loadFromHistory({});
-
- Expect.equals(null, state.currentArticle.value);
- Expect.isTrue(getStoryNode().classes.contains(CSS.HIDDEN_STORY));
- }
- ]);
- });
-
- test('StoryView', () {
- state.clearHistory();
-
- Expect.isTrue(getStoryNode().classes.contains(CSS.HIDDEN_STORY));
-
- final dataSourceView =
- swarm.frontView.currentSection.dataSourceView.getSubview(0);
- final itemView = dataSourceView.itemsView.getSubview(0);
- // TODO(jacobr): remove this null check. This is likely due to tests
- // running without the correct CSS to size the window so that some items
- // are visible.
- if (itemView != null) {
- click(itemView.node);
- state.expectHistory([getHistory(itemView.item)]);
- }
- });
-
- test('SliderMenu', () {
- Expect.equals(getView(swarm.sections[0]), swarm.frontView.currentSection);
-
- // Find the first slider menu item, and click on the one next after it.
- click(document.querySelectorAll('.${CSS.SM_ITEM}')[1]);
-
- Expect.equals(getView(swarm.sections[1]), swarm.frontView.currentSection);
-
- // Find the first menu item again and click on it.
- click(document.querySelector('.${CSS.SM_ITEM}'));
-
- Expect.equals(getView(swarm.sections[0]), swarm.frontView.currentSection);
- });
-}
-
-/** Triggers the click event, like [http://api.jquery.com/click/] */
-click(Element element) {
- // TODO(rnystrom): This should be on the DOM API somewhere.
- MouseEvent event = new MouseEvent('click');
- element.dispatchEvent(event);
-}
-
-/** A proxy so we can intercept history calls */
-class UIStateProxy extends SwarmState {
- List<Map<String, String>> history;
-
- UIStateProxy(Sections dataModel) : super(dataModel) {
- clearHistory();
- }
-
- void pushToHistory() {
- history.add(toHistory());
- super.pushToHistory();
- }
-
- void clearHistory() {
- history = new List<Map<String, String>>();
- }
-
- void expectHistory(List<Map<String, String>> entries) {
- Expect.equals(entries.length, history.length);
- for (int i = 0; i < entries.length; i++) {
- Map e = entries[i];
- Map h = history[i];
- Expect.equals(e['article'], h['article']);
- }
- clearHistory();
- }
-}
-
-void _serialInvokeAsync(List closures) {
- final length = closures.length;
- if (length > 0) {
- int i = 0;
- void invokeNext() {
- closures[i]();
- i++;
- if (i < length) {
- Timer.run(expectAsync(invokeNext));
- }
- }
-
- Timer.run(expectAsync(invokeNext));
- }
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/css.dart b/samples-dev/swarm/test/swarm_ui_lib/layout/css.dart
deleted file mode 100644
index e066463..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/css.dart
+++ /dev/null
@@ -1,351 +0,0 @@
-// File generated by Dart CSS from source file layout.scss
-// Do not edit.
-
-part of layout_tests;
-
-class AdaptiveLayout {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns': 'auto minmax(min-content, 1fr)',
- 'grid-rows': 'auto minmax(min-content, 1fr) auto',
- },
- '#title': const {
- 'grid-column': '1',
- 'grid-row': '1',
- },
- '#score': const {
- 'grid-column': '1',
- 'grid-row': '3',
- },
- '#stats': const {
- 'grid-column': '1',
- 'grid-row': '2',
- 'grid-row-align': 'start',
- },
- '#board': const {
- 'grid-column': '2',
- 'grid-row': '1',
- 'grid-row-span': '2',
- },
- '#controls': const {
- 'grid-column': '2',
- 'grid-row': '3',
- 'grid-column-align': 'center',
- },
- };
-}
-
-class SourceIndependencePortrait {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-template': '"ta" "sa" "bb" "cc"',
- 'grid-columns': 'auto minmax(min-content, 1fr)',
- 'grid-rows': 'auto auto minmax(min-content, 1fr) auto',
- },
- '#title': const {
- 'grid-cell': '"t"',
- },
- '#score': const {
- 'grid-cell': '"s"',
- },
- '#stats': const {
- 'grid-cell': '"a"',
- },
- '#board': const {
- 'grid-cell': '"b"',
- },
- '#controls': const {
- 'grid-cell': '"c"',
- },
- };
-}
-
-class SourceIndependenceLandscape {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-template': '"tb" "ab" "sc"',
- 'grid-columns': 'auto minmax(min-content, 1fr)',
- 'grid-rows': 'auto minmax(min-content, 1fr) auto',
- },
- '#title': const {
- 'grid-cell': '"t"',
- },
- '#score': const {
- 'grid-cell': '"s"',
- },
- '#stats': const {
- 'grid-cell': '"a"',
- },
- '#board': const {
- 'grid-cell': '"b"',
- },
- '#controls': const {
- 'grid-cell': '"c"',
- },
- };
-}
-
-class GridLayering {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns':
- '"start" auto "track-start" 0.5fr "thumb-start" auto "fill-split" auto "thumb-end" 0.5fr "track-end" auto "end"',
- },
- '#lower-label': const {
- 'grid-column': '"start"',
- },
- '#track': const {
- 'grid-column': '"track-start" "track-end"',
- 'grid-row-align': 'center',
- },
- '#upper-label': const {
- 'grid-column': '"track-end"',
- },
- '#lower-fill': const {
- 'grid-column': '"track-start" "fill-split"',
- 'grid-row-align': 'center',
- 'grid-layer': '5',
- },
- '#upper-fill': const {
- 'grid-column': '"fill-split" "track-end"',
- 'grid-row-align': 'center',
- 'grid-layer': '5',
- },
- '#thumb': const {
- 'grid-column': '"thumb-start" "thumb-end"',
- 'grid-layer': '10',
- },
- };
-}
-
-class GridLines_5 {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns': '150px 1fr',
- 'grid-rows': '50px 1fr 50px',
- },
- '#item1': const {
- 'grid-column': '2',
- 'grid-row': '1 4',
- },
- };
-}
-
-class GridLines_6 {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns': '150px "item1-start" 1fr "item1-end"',
- 'grid-rows': '"item1-start" 50px 1fr 50px "item1-end"',
- },
- '#item1': const {
- 'grid-column': '"item1-start" "item1-end"',
- 'grid-row': '"item1-start" "item1-end"',
- },
- };
-}
-
-class GridCells {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-template': '"ad" "bd" "cd"',
- 'grid-columns': '150px 1fr',
- 'grid-rows': '50px 1fr 50px',
- },
- '#item2': const {
- 'grid-cell': '"b"',
- 'grid-row-align': 'start',
- },
- '#item3': const {
- 'grid-cell': '"b"',
- 'grid-column-align': 'end',
- 'grid-row-align': 'end',
- },
- };
-}
-
-class StartEndingGridlines11a {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns': '50px 1fr',
- 'grid-rows': '"first" 250px 1fr 250px "last"',
- },
- '#item': const {
- 'grid-column': '1 3',
- 'grid-row': '"first" "last"',
- },
- };
-}
-
-class StartEndingGridlines11b {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns': '50px 1fr',
- 'grid-rows': '"first" 250px 1fr 250px "last"',
- },
- '#item': const {
- 'grid-column': 'start end',
- 'grid-row': 'start end',
- },
- };
-}
-
-class RepeatingColumnsRows {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns': '10px ("content" 1fr 10px) [4]',
- 'grid-rows': '1fr',
- },
- '#col2': const {
- 'grid-column': '2',
- },
- '#col4': const {
- 'grid-column': '4',
- },
- '#col6': const {
- 'grid-column': '6',
- },
- '#col8': const {
- 'grid-column': '8',
- },
- };
-}
-
-class AnonymousGridCells {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-rows': '"header" auto "main" 1fr "footer" auto',
- 'grid-columns': '1fr',
- },
- '#header': const {
- 'grid-row': '"header"',
- 'grid-column': 'start',
- },
- '#main': const {
- 'grid-row': '"main"',
- 'grid-column': 'start',
- },
- '#footer': const {
- 'grid-row': '"footer"',
- 'grid-column': 'start',
- },
- };
-}
-
-class ImplicitColumnsRows {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns': '20px',
- 'grid-rows': '20px',
- },
- '#A': const {
- 'grid-column': '1',
- 'grid-row': '1',
- 'grid-column-align': 'start',
- 'grid-row-align': 'start',
- },
- '#B': const {
- 'grid-column': '5',
- 'grid-row': '1',
- 'grid-row-span': '2',
- },
- '#C': const {
- 'grid-column': '1',
- 'grid-row': '2',
- 'grid-column-span': '2',
- },
- };
-}
-
-class AlignGridItems {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns': '1fr 1fr',
- 'grid-rows': '1fr 1fr',
- },
- '#A': const {
- 'grid-column': '1',
- 'grid-row': '1',
- 'grid-column-align': 'start',
- 'grid-row-align': 'start',
- },
- '#B': const {
- 'grid-column': '2',
- 'grid-row': '2',
- 'grid-column-align': 'end',
- 'grid-row-align': 'end',
- },
- };
-}
-
-class DrawOrderGridItems {
- // selector, properties<propertyName, value>
- static const selectors = const {
- '#grid': const {
- 'display': '-dart-grid',
- 'grid-columns': '1fr 1fr',
- 'grid-rows': '1fr 1fr',
- },
- '#A': const {
- 'grid-column': '1',
- 'grid-row': '2',
- 'grid-column-span': '2',
- 'grid-row-align': 'end',
- },
- '#B': const {
- 'grid-column': '1',
- 'grid-row': '1',
- 'grid-layer': '10',
- },
- '#C': const {
- 'grid-column': '2',
- 'grid-row': '1',
- 'grid-row-align': 'start',
- 'margin-left': '-20px',
- },
- '#D': const {
- 'grid-column': '2',
- 'grid-row': '2',
- 'grid-column-align': 'end',
- 'grid-row-align': 'start',
- },
- '#E': const {
- 'grid-column': '1',
- 'grid-row': '1',
- 'grid-column-span': '2',
- 'grid-row-span': '2',
- 'grid-layer': '5',
- 'grid-column-align': 'center',
- 'grid-row-align': 'center',
- },
- };
-}
-
-class CSS {
- // CSS class selectors:
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_examples.dart b/samples-dev/swarm/test/swarm_ui_lib/layout/grid_examples.dart
deleted file mode 100644
index 3db78c7..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_examples.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2011, 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.
-
-part of layout_tests;
-
-/**
- * The examples from the spec: [http://dev.w3.org/csswg/css3-grid-align/]
- */
-// I've omitted examples that are subsumed by other examples, or examples
-// that illustrate features (such as grid-flow) that are currently
-// unsupported.
-class GridExamples {
- // Note: controls is positioned in row 3 in the example. Might be a bug in
- // the example, or they're using flow.
- // TODO(jmesserly): also needed to set "display: inline-block" to get
- // horizontal content sizing to work.
- static const styles = const {
- '1 Adaptive Layouts': AdaptiveLayout.selectors,
- '2a Source Independence: Portrait': SourceIndependencePortrait.selectors,
- '2b Source Independence: Landscape': SourceIndependenceLandscape.selectors,
- '3 Grid Layering of Elements': GridLayering.selectors,
- '5 Grid Lines': GridLines_5.selectors,
- '6 Grid Lines': GridLines_6.selectors,
- '7 Grid Cells': GridCells.selectors,
- '11a Starting and Ending Grid Lines': StartEndingGridlines11a.selectors,
- '11b Starting and Ending Grid Lines': StartEndingGridlines11b.selectors,
- '12 Repeating Columns and Rows': RepeatingColumnsRows.selectors,
- '17 Anonymous Grid Cells': AnonymousGridCells.selectors,
- '20 Implicit Columns and Rows': ImplicitColumnsRows.selectors,
- '22 Grid Item Alignment': AlignGridItems.selectors,
- '23 Drawing Order of Grid Items': DrawOrderGridItems.selectors
- };
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.dart b/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.dart
deleted file mode 100644
index e12f234..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.dart
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright (c) 2011, 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.
-
-part of layout_tests;
-
-/**
- * An app for testing the grid layout system.
- */
-
-/** Creates a grid view structure given the CSS styles. */
-View createGrid(Map<String, Map<String, String>> styles) {
- final gridStyle = styles['#grid'];
-
- final children = new List<MockView>();
- for (final String id in styles.keys) {
- // All selectors in this test are id selectors string the # prefix.
- assert(id.startsWith('#'));
- String elemId = id.substring(1);
- if (elemId != 'grid') {
- children.add(new MockView(elemId, styles[id]));
- }
- }
-
- return new MockCompositeView('grid', gridStyle, children);
-}
-
-void _onLoad() {
- var query = SwarmUri.parsequerySelector(window.location.search)['q'];
- if (query != null && query.length == 1) {
- query = SwarmUri.decodeComponent(query[0]);
- addGridStyles('100%', '100%', 'margin:0px;');
- final view = createGrid(GridExamples.styles[query]);
- view.addToDocument(document.body);
- _addColorStyles();
- printMetrics(query);
- } else {
- final html = new StringBuffer();
- for (String ex in GridExamples.styles.keys) {
- html.write('<div><a href="?q=$ex">Grid Example $ex</a></div>');
- }
- document.body.innerHtml = html.toString();
- }
-}
-
-void addGridStyles(String width, String height, [String margin = '']) {
- // Use monospace font and fixed line-height so the text size is predictable.
- // TODO(jmesserly): only tested on Chromium Mac/Linux
- Dom.addStyle('''
- body { $margin }
- #grid {
- position: absolute;
- width: $width;
- height: $height;
- border-color: black;
- }
- .grid-item {
- border: solid 2px;
- border-radius: 8px;
- font-family:monospace;
- font-size:16px;
- line-height:20px;
- }
- ''');
-}
-
-void _addColorStyles() {
- final grid = document.body.querySelector('#grid');
- final colors = const [
- 'darkred',
- 'darkorange',
- 'darkgoldenrod',
- 'darkgreen',
- 'darkblue',
- 'darkviolet'
- ];
- int c = 0;
- var node = grid.children[0];
- while (node != null) {
- if (node.id != '') {
- node.style.cssText += "color:" + colors[c++];
- }
- node = node.nextElementSibling;
- }
-}
-
-class MockCompositeView extends CompositeView {
- MockCompositeView(String id, Map styles, List childViews) : super('') {
- node.id = id;
- CollectionUtils.copyMap(customStyle, styles);
-
- for (final v in childViews) {
- addChild(v);
- }
- }
-}
-
-class MockView extends View {
- MockView(String id, Map styles)
- : super.fromNode(
- new Element.html('<div class="grid-item">MockView-$id</div>')) {
- node.id = id;
- CollectionUtils.copyMap(customStyle, styles);
- // TODO(jmesserly): this is needed to get horizontal content-sizing to work
- node.style.display = 'inline-block';
- }
-}
-
-void printMetrics(String example) {
- final node = document.body.querySelector('#grid');
- String exampleId = example.split(' ')[0];
- final sb = new StringBuffer();
- sb.write("test('Spec Example $exampleId', () {\n");
- sb.write(" verifyExample('$example', {\n");
- final children = node.children;
-
- scheduleMicrotask(() {
- for (int i = 0; i < children.length; i++) {
- _appendMetrics(sb, children[i], ' ');
- }
- sb.write(' });\n');
- sb.write('});\n\n');
- window.console.log(sb.toString());
- });
-}
-
-void _appendMetrics(StringBuffer sb, Element node, [String indent = '']) {
- String id = node.id;
- num left = node.offsetLeft, top = node.offsetTop;
- num width = node.offsetWidth, height = node.offsetHeight;
- sb.write("${indent}'$id': [$left, $top, $width, $height],\n");
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.html b/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.html
deleted file mode 100644
index 6d199ec..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>Grid Layout Demos</title>
- <style type="text/css">
- </style>
- <script type="application/dart" src="grid_layout_demo.dart"></script>
- </head>
- <body>
- <script src="http://dart.googlecode.com/svn/branches/bleeding_edge/dart/client/dart.js"></script>
- </body>
-</html>
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/layout.css b/samples-dev/swarm/test/swarm_ui_lib/layout/layout.css
deleted file mode 100644
index cc4296e..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/layout.css
+++ /dev/null
@@ -1,18 +0,0 @@
-/* File generated by SCSS from source layout.scss
- * Do not edit.
- */
-
-/* @stylet export as AdaptiveLayout */
-/* @stylet export as SourceIndependencePortrait */
-/* @stylet export as SourceIndependenceLandscape */
-/* @stylet export as GridLayering */
-/* @stylet export as GridLines_5 */
-/* @stylet export as GridLines_6 */
-/* @stylet export as GridCells */
-/* @stylet export as StartEndingGridlines11a */
-/* @stylet export as StartEndingGridlines11b */
-/* @stylet export as RepeatingColumnsRows */
-/* @stylet export as AnonymousGridCells */
-/* @stylet export as ImplicitColumnsRows */
-/* @stylet export as AlignGridItems */
-/* @stylet export as DrawOrderGridItems */
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/layout.scss b/samples-dev/swarm/test/swarm_ui_lib/layout/layout.scss
deleted file mode 100644
index 2bff753..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/layout.scss
+++ /dev/null
@@ -1,316 +0,0 @@
-/* Copyright (c) 2011, 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. */
-
-@stylet AdaptiveLayout {
- #grid {
- display: -dart-grid;
- grid-columns: auto minmax(min-content, 1fr);
- grid-rows: auto minmax(min-content, 1fr) auto;
- }
- #title {
- grid-column: 1;
- grid-row: 1;
- }
- #score {
- grid-column: 1;
- grid-row: 3;
- }
- #stats {
- grid-column: 1;
- grid-row: 2;
- grid-row-align: start;
- }
- #board {
- grid-column: 2;
- grid-row: 1;
- grid-row-span: 2;
- }
- #controls {
- grid-column: 2;
- grid-row: 3;
- grid-column-align: center;
- }
-}
-
-@stylet SourceIndependencePortrait {
- #grid {
- display: -dart-grid;
- grid-template: "ta"
- "sa"
- "bb"
- "cc";
- grid-columns: auto minmax(min-content, 1fr);
- grid-rows: auto auto minmax(min-content, 1fr) auto;
- }
- #title {
- grid-cell: "t";
- }
- #score {
- grid-cell: "s";
- }
- #stats {
- grid-cell: "a";
- }
- #board {
- grid-cell: "b";
- }
- #controls {
- grid-cell: "c";
- }
-}
-
-@stylet SourceIndependenceLandscape {
- #grid {
- display: -dart-grid;
- grid-template: "tb"
- "ab"
- "sc";
- grid-columns: auto minmax(min-content, 1fr);
- grid-rows: auto minmax(min-content, 1fr) auto;
- }
- #title {
- grid-cell: "t";
- }
- #score {
- grid-cell: "s";
- }
- #stats {
- grid-cell: "a";
- }
- #board {
- grid-cell: "b";
- }
- #controls {
- grid-cell: "c";
- }
-}
-
-@stylet GridLayering {
- #grid {
- display: -dart-grid;
- grid-columns: "start" auto
- "track-start" 0.5fr
- "thumb-start" auto
- "fill-split" auto
- "thumb-end" 0.5fr
- "track-end" auto
- "end";
- }
- #lower-label {
- grid-column: "start";
- }
- #track {
- grid-column: "track-start" "track-end";
- grid-row-align: center;
- }
- #upper-label {
- grid-column: "track-end";
- }
- #lower-fill {
- grid-column: "track-start" "fill-split";
- grid-row-align: center; grid-layer: 5;
- }
- #upper-fill {
- grid-column: "fill-split" "track-end";
- grid-row-align: center;
- grid-layer: 5;
- }
- #thumb {
- grid-column: "thumb-start" "thumb-end";
- grid-layer: 10;
- }
-}
-
-@stylet GridLines_5 {
- #grid {
- display: -dart-grid;
- grid-columns: 150px 1fr;
- grid-rows: 50px 1fr 50px;
- }
- #item1 {
- grid-column: 2;
- grid-row: 1 4;
- }
-}
-
-@stylet GridLines_6 {
- #grid {
- display: -dart-grid;
- grid-columns: 150px "item1-start" 1fr "item1-end";
- grid-rows: "item1-start" 50px 1fr 50px "item1-end";
- }
-
- #item1 {
- grid-column: "item1-start" "item1-end";
- grid-row: "item1-start" "item1-end";
- }
-}
-
-@stylet GridCells {
- #grid {
- display: -dart-grid;
- grid-template: "ad"
- "bd"
- "cd";
- grid-columns: 150px 1fr;
- grid-rows: 50px 1fr 50px;
- }
- #item2 {
- grid-cell: "b";
- grid-row-align: start;
- }
- #item3 {
- grid-cell: "b";
- grid-column-align: end;
- grid-row-align: end;
- }
-}
-
-@stylet StartEndingGridlines11a {
- #grid {
- display: -dart-grid;
- grid-columns: 50px 1fr;
- grid-rows: "first" 250px 1fr 250px "last";
- }
- #item {
- grid-column:1 3;
- grid-row: "first" "last";
- }
-}
-
-@stylet StartEndingGridlines11b {
- #grid {
- display: -dart-grid;
- grid-columns: 50px 1fr;
- grid-rows: "first" 250px 1fr 250px "last";
- }
- #item {
- grid-column: start end;
- grid-row: start end;
- }
-}
-
-@stylet RepeatingColumnsRows {
- #grid {
- display: -dart-grid;
- grid-columns: 10px ("content" 1fr 10px)[4];
- grid-rows: 1fr;
- }
- #col2 {
- grid-column: 2;
- }
- #col4 {
- grid-column: 4;
- }
- #col6 {
- grid-column: 6;
- }
- #col8 {
- grid-column: 8;
- }
-}
-
-@stylet AnonymousGridCells {
- #grid {
- display: -dart-grid;
- grid-rows: "header" auto "main" 1fr "footer" auto;
- grid-columns: 1fr;
- }
- #header {
- grid-row: "header";
- grid-column: start;
- }
- #main {
- grid-row: "main";
- grid-column: start;
- }
- #footer {
- grid-row: "footer";
- grid-column: start;
- }
-}
-
-@stylet ImplicitColumnsRows {
- #grid {
- display: -dart-grid;
- grid-columns: 20px;
- grid-rows: 20px;
- }
- #A {
- grid-column: 1;
- grid-row: 1;
- grid-column-align: start;
- grid-row-align: start;
- }
- #B {
- grid-column: 5;
- grid-row: 1;
- grid-row-span: 2;
- }
- #C {
- grid-column: 1;
- grid-row: 2;
- grid-column-span: 2;
- }
-}
-
-@stylet AlignGridItems {
- #grid {
- display: -dart-grid;
- grid-columns: 1fr 1fr;
- grid-rows: 1fr 1fr;
- }
- #A {
- grid-column: 1;
- grid-row: 1;
- grid-column-align: start;
- grid-row-align: start;
- }
- #B {
- grid-column: 2;
- grid-row: 2;
- grid-column-align: end;
- grid-row-align: end;
- }
-}
-
-@stylet DrawOrderGridItems {
- #grid {
- display: -dart-grid;
- grid-columns: 1fr 1fr;
- grid-rows: 1fr 1fr;
- }
- #A {
- grid-column: 1;
- grid-row: 2;
- grid-column-span: 2;
- grid-row-align: end;
- }
- #B {
- grid-column: 1;
- grid-row: 1;
- grid-layer: 10;
- }
- #C {
- grid-column: 2;
- grid-row: 1;
- grid-row-align: start;
- margin-left: -20px;
- }
- #D {
- grid-column: 2;
- grid-row: 2;
- grid-column-align: end;
- grid-row-align: start;
- }
- #E {
- grid-column: 1; grid-row: 1;
- grid-column-span: 2;
- grid-row-span: 2;
- grid-layer: 5;
- grid-column-align: center;
- grid-row-align: center;
- }
- }
-
\ No newline at end of file
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/layout_test.dart b/samples-dev/swarm/test/swarm_ui_lib/layout/layout_test.dart
deleted file mode 100644
index 4b1cf60..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/layout_test.dart
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright (c) 2011, 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.
-
-library layout_tests;
-
-import 'package:expect/expect.dart';
-import 'dart:async';
-import 'dart:html';
-import '../../../swarm_ui_lib/base/base.dart';
-import '../../../swarm_ui_lib/layout/layout.dart';
-import '../../../swarm_ui_lib/view/view.dart';
-import '../../../swarm_ui_lib/util/utilslib.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-
-part 'grid_layout_demo.dart';
-part 'grid_examples.dart';
-part 'css.dart';
-
-// TODO(jmesserly): these tests would be easier to work with if they were WebKit
-// layout tests. The way content shell works is exactly what we want for
-// testing layout: run the example and then print the element tree with metrics.
-// The UnitTestSuite wrapper gets in our way here, because you can't "see" the
-// test layout visually when you're debugging.
-// See these links for more info:
-// http://www.webkit.org/quality/testwriting.html
-// http://www.w3.org/Style/CSS/Test/guidelines.html
-
-// TODO(jmesserly): need parser unit tests, especially error conditions
-
-/**
- * Tests the grid layout. Currently based on examples from the spec at:
- * [http://dev.w3.org/csswg/css3-grid-align/]
- */
-main() {
- useHtmlConfiguration();
- addGridStyles('400px', '400px');
-
- test('Spec Example 1', () {
- return verifyExample('1 Adaptive Layouts', {
- 'title': [0, 0, 144, 24],
- 'score': [0, 376, 144, 24],
- 'stats': [0, 24, 144, 24],
- 'board': [144, 0, 256, 376],
- 'controls': [185, 376, 174, 24],
- });
- });
-
- test('Spec Example 2a', () {
- return verifyExample('2a Source Independence: Portrait', {
- 'title': [0, 0, 144, 24],
- 'score': [0, 24, 144, 24],
- 'stats': [144, 0, 256, 48],
- 'board': [0, 48, 400, 328],
- 'controls': [0, 376, 400, 24],
- });
- });
-
- test('Spec Example 2b', () {
- return verifyExample('2b Source Independence: Landscape', {
- 'title': [0, 0, 144, 24],
- 'score': [0, 376, 144, 24],
- 'stats': [0, 24, 144, 352],
- 'board': [144, 0, 256, 376],
- 'controls': [144, 376, 256, 24],
- });
- });
-
- // Not currently supported, issue with
- // http://dev.w3.org/csswg/css3-grid-layout/#function-CalculateNormalizedFractionBreadth
- //test('Spec Example 3', () {
- // return verifyExample('3 Grid Layering of Elements', {
- // 'lower-label': [0, 0, 204, 24],
- // 'track': [204, 0, 144, 24],
- // 'upper-label': [348, 0, 204, 24],
- // 'lower-fill': [204, 0, 72, 24],
- // 'upper-fill': [276, 0, 72, 24],
- // 'thumb': [204, 0, 144, 24],
- // });
- //});
-
- test('Spec Example 5', () {
- return verifyExample('5 Grid Lines', {
- 'item1': [125, 0, 275, 400],
- });
- });
-
- test('Spec Example 6', () {
- return verifyExample('6 Grid Lines', {
- 'item1': [125, 0, 275, 400],
- });
- });
-
- test('Spec Example 7', () {
- return verifyExample('7 Grid Cells', {
- 'item2': [0, 50, 125, 24],
- 'item3': [-19, 326, 144, 24],
- });
- });
-
- test('Spec Example 11a', () {
- return verifyExample('11a Starting and Ending Grid Lines', {
- 'item': [0, 0, 400, 400],
- });
- });
-
- test('Spec Example 11b', () {
- return verifyExample('11b Starting and Ending Grid Lines', {
- 'item': [0, 0, 400, 400],
- });
- });
-
- test('Spec Example 12', () {
- return verifyExample('12 Repeating Columns and Rows', {
- 'col2': [10, 0, 88, 400],
- 'col4': [108, 0, 87, 400],
- 'col6': [205, 0, 88, 400],
- 'col8': [303, 0, 87, 400],
- });
- });
-
- test('Spec Example 17', () {
- return verifyExample('17 Anonymous Grid Cells', {
- 'header': [0, 0, 400, 24],
- 'main': [0, 24, 400, 352],
- 'footer': [0, 376, 400, 24],
- });
- });
-
- // Not currently supported, issue with
- // http://dev.w3.org/csswg/css3-grid-layout/#function-CalculateNormalizedFractionBreadth
- //test('Spec Example 20', () {
- // return verifyExample('20 Implicit Columns and Rows', {
- // 'A': [0, 0, 104, 24],
- // 'B': [104, 0, 104, 44],
- // 'C': [0, 20, 104, 24],
- // });
- //});
-
- test('Spec Example 22', () {
- return verifyExample('22 Grid Item Alignment', {
- 'A': [0, 0, 104, 24],
- 'B': [296, 376, 104, 24],
- });
- });
-
- test('Spec Example 23', () {
- return verifyExample('23 Drawing Order of Grid Items', {
- 'A': [0, 376, 400, 24],
- 'B': [0, 0, 200, 200],
- 'C': [200, 0, 200, 24],
- 'D': [296, 200, 104, 24],
- 'E': [148, 188, 104, 24],
- });
- });
-}
-
-// Note: to debug failures, best bet is to use GridLayoutDemo to run an
-// individual asyncTest and see the resulting layout.
-
-Future usingGrid(String example, Future test_(View grid)) {
- final grid = createGrid(GridExamples.styles[example]);
- grid.addToDocument(document.body);
- return new Future.delayed(new Duration()).then((_) {
- return test_(grid);
- }).then((_) {
- grid.removeFromDocument();
- });
-}
-
-Future verifyGrid(String example, [Map expected = null]) {
- printMetrics(example);
- if (expected == null) {
- return new Future.value();
- }
-
- for (String name in expected.keys) {
- final values = expected[name];
- final node = document.body.querySelector('#$name');
- Expect.isNotNull(node);
- return new Future.value().then((_) {
- Expect.equals(values[0], node.offsetLeft);
- Expect.equals(values[1], node.offsetTop);
- Expect.equals(values[2], node.offsetWidth);
- Expect.equals(values[3], node.offsetHeight);
- });
- }
-}
-
-Future verifyExample(String example, [Map expected = null]) {
- return usingGrid(example, (grid) => verifyGrid(example, expected));
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/abstract_observable_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/abstract_observable_tests.dart
deleted file mode 100644
index 49c8e85..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/abstract_observable_tests.dart
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2011, 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.
-
-part of observable_tests;
-
-testAbstractObservable() {
- group('addChangeListener()', () {
- test('adding the same listener twice returns false the second time', () {
- final target = new AbstractObservable();
- final listener = (e) {};
-
- expect(target.addChangeListener(listener), isTrue);
- expect(target.addChangeListener(listener), isFalse);
- });
-
- test('modifies listeners list', () {
- // check that add/remove works, see contents of listeners too
- final target = new AbstractObservable();
- final l1 = (e) {};
- final l2 = (e) {};
- final l3 = (e) {};
- final l4 = (e) {};
-
- expect(target.listeners, orderedEquals([]));
-
- target.addChangeListener(l1);
- expect(target.listeners, orderedEquals([l1]));
-
- target.addChangeListener(l2);
- expect(target.listeners, orderedEquals([l1, l2]));
-
- target.addChangeListener(l3);
- target.addChangeListener(l4);
- expect(target.listeners, orderedEquals([l1, l2, l3, l4]));
-
- target.removeChangeListener(l4);
- expect(target.listeners, orderedEquals([l1, l2, l3]));
-
- target.removeChangeListener(l2);
- expect(target.listeners, orderedEquals([l1, l3]));
-
- target.removeChangeListener(l1);
- expect(target.listeners, orderedEquals([l3]));
-
- target.removeChangeListener(l3);
- expect(target.listeners, orderedEquals([]));
- });
- });
-
- test('fires immediately if no batch', () {
- // If no batch is created, a summary should be automatically created and
- // fired on each property change.
- final target = new AbstractObservable();
- EventSummary res = null;
- target.addChangeListener((summary) {
- expect(res, isNull);
- res = summary;
- expect(res, isNotNull);
- });
-
- target.recordPropertyUpdate('pM', 10, 11);
-
- expect(res, isNotNull);
- expect(res.events, hasLength(1));
- validateUpdate(res.events[0], target, 'pM', null, 10, 11);
- res = null;
-
- target.recordPropertyUpdate('pL', '11', '13');
-
- expect(res, isNotNull);
- expect(res.events, hasLength(1));
- validateUpdate(res.events[0], target, 'pL', null, '11', '13');
- });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/change_event_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/change_event_tests.dart
deleted file mode 100644
index 1819fb6..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/change_event_tests.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2011, 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.
-
-part of observable_tests;
-
-testChangeEvent() {
- test('constructor', () {
- // create property, list, global and check the proper initialization.
- final target = new AbstractObservable();
-
- validateUpdate(new ChangeEvent.property(target, 'pK', 33, '12'), target,
- 'pK', null, 33, '12');
-
- validateUpdate(
- new ChangeEvent.list(target, ChangeEvent.UPDATE, 3, 33, '12'),
- target,
- null,
- 3,
- 33,
- '12');
-
- validateInsert(
- new ChangeEvent.list(target, ChangeEvent.INSERT, 3, 33, null),
- target,
- null,
- 3,
- 33);
-
- validateRemove(
- new ChangeEvent.list(target, ChangeEvent.REMOVE, 3, null, '12'),
- target,
- null,
- 3,
- '12');
-
- validateGlobal(
- new ChangeEvent.list(target, ChangeEvent.GLOBAL, null, null, null),
- target);
- });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/event_batch_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/event_batch_tests.dart
deleted file mode 100644
index 0e7a7cc..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/event_batch_tests.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2011, 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.
-
-part of observable_tests;
-
-testEventBatch() {
- test('EventBatch', () {
- // check that all events are fired at the end. Use all record methods
- // in abstract observable
- final target = new AbstractObservable();
- EventSummary res = null;
- target.addChangeListener((summary) {
- expect(res, isNull);
- res = summary;
- expect(res, isNotNull);
- });
-
- final f = EventBatch.wrap((e) {
- target.recordPropertyUpdate('pM', 10, 11);
- target.recordPropertyUpdate('pL', '11', '13');
- target.recordListUpdate(2, 'a', 'b');
- target.recordListInsert(5, 'a');
- target.recordListRemove(4, 'c');
- target.recordGlobalChange();
- });
-
- expect(res, isNull);
- f(null);
- expect(res, isNotNull);
-
- expect(res.events, hasLength(6));
- validateUpdate(res.events[0], target, 'pM', null, 10, 11);
- validateUpdate(res.events[1], target, 'pL', null, '11', '13');
- validateUpdate(res.events[2], target, null, 2, 'a', 'b');
- validateInsert(res.events[3], target, null, 5, 'a');
- validateRemove(res.events[4], target, null, 4, 'c');
- validateGlobal(res.events[5], target);
- });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_list_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/observable_list_tests.dart
deleted file mode 100644
index aaffb92..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_list_tests.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2011, 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.
-
-part of observable_tests;
-
-testObservableList() {
- test('ObservableList', () {
- final arr = new ObservableList<int>();
-
- // Add some initial data before listening
- arr.add(1);
- arr.add(2);
- arr.add(3);
- arr.add(1);
- arr.add(3);
- arr.add(4);
-
- expect(arr, orderedEquals([1, 2, 3, 1, 3, 4]));
-
- // Add a listener that saves the events
- EventSummary res = null;
- arr.addChangeListener((summary) {
- expect(res, isNull);
- res = summary;
- expect(res, isNotNull);
- });
-
- // execute some code with readonly operations only
- expect(res, isNull);
- bool called = false;
- EventBatch.wrap((e) {
- expect(arr, hasLength(6));
- expect(arr[0], equals(1));
- // TODO(sigmund): why we need write startIndex? it should be optional.
- expect(arr.indexOf(4, 0), equals(5));
- expect(arr.indexOf(1, 0), equals(0));
- expect(arr.indexOf(1, 1), equals(3));
- // TODO(rnystrom): Get rid of second arg when lastIndexOf has default.
- expect(arr.lastIndexOf(1, arr.length - 1), equals(3));
- expect(arr.last, equals(4));
- final copy = new List<int>();
- arr.forEach((i) {
- copy.add(i);
- });
- expect(copy, orderedEquals([1, 2, 3, 1, 3, 4]));
- called = true;
- })(null);
- expect(called, isTrue);
- expect(res, isNull); // no change from read-only operators
-
- // execute some code with mutations
- expect(res, isNull);
- called = false;
- expect(arr, orderedEquals([1, 2, 3, 1, 3, 4]));
- EventBatch.wrap((e) {
- arr.add(5); // 1 2 3 1 3 4(5)
- arr.add(6); // 1 2 3 1 3 4 5(6)
- arr[1] = arr[arr.length - 1]; // 1(6)3 1 3 4 5 6
- arr.add(7); // 1 6 3 1 3 4 5 6(7)
- arr[5] = arr[8]; // 1 6 3 1 3(7)5 6 7
- arr.add(42); // 1 6 3 1 3 7 5 6 7(42)
- expect(arr.removeAt(3), equals(1)); // 1 6 3( )3 7 5 6 7 42
- expect(arr.removeFirstElement(3), isTrue); // 1 6( ) 3 7 5 6 7 42
- expect(arr.removeLast(), equals(42)); // 1 6 3 7 5 6 7( )
- expect(arr.removeAllElements(6), equals(2)); // 1( ) 3 7 5( )7
- called = true;
- })(null);
- expect(called, isTrue);
- expect(res, isNotNull);
- expect(res.events, hasLength(11));
- validateInsert(res.events[0], arr, null, 6, 5);
- validateInsert(res.events[1], arr, null, 7, 6);
- validateUpdate(res.events[2], arr, null, 1, 6, 2);
- validateInsert(res.events[3], arr, null, 8, 7);
- validateUpdate(res.events[4], arr, null, 5, 7, 4);
- validateInsert(res.events[5], arr, null, 9, 42);
- validateRemove(res.events[6], arr, null, 3, 1);
- validateRemove(res.events[7], arr, null, 2, 3);
- validateRemove(res.events[8], arr, null, 7, 42);
- validateRemove(res.events[9], arr, null, 1, 6);
- validateRemove(res.events[10], arr, null, 4, 6);
- expect(arr, orderedEquals([1, 3, 7, 5, 7]));
-
- res = null;
- expect(res, isNull);
- called = false;
- // execute global mutations like sort and clear
- EventBatch.wrap((e) {
- arr.add(1);
- arr.add(4);
- arr.add(10);
- arr.add(9);
- arr.sort((int a, int b) {
- return a - b;
- });
- called = true;
- })(null);
- expect(called, isTrue);
- expect(res, isNotNull);
- expect(res.events.length, equals(5));
- validateInsert(res.events[0], arr, null, 5, 1);
- validateInsert(res.events[1], arr, null, 6, 4);
- validateInsert(res.events[2], arr, null, 7, 10);
- validateInsert(res.events[3], arr, null, 8, 9);
- validateGlobal(res.events[4], arr);
- expect(arr, orderedEquals([1, 1, 3, 4, 5, 7, 7, 9, 10]));
-
- res = null;
- expect(res, isNull);
- called = false;
- EventBatch.wrap((e) {
- arr.clear();
- called = true;
- })(null);
- expect(called, isTrue);
- expect(res, isNotNull);
- expect(res.events, hasLength(1));
- validateGlobal(res.events[0], arr);
- expect(arr, orderedEquals([]));
- });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_test.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/observable_test.dart
deleted file mode 100644
index 296ecbe..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_test.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2011, 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.
-
-library observable_tests;
-
-import '../../../swarm_ui_lib/observable/observable.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-
-part 'abstract_observable_tests.dart';
-part 'change_event_tests.dart';
-part 'event_batch_tests.dart';
-part 'observable_list_tests.dart';
-part 'observable_value_tests.dart';
-
-void main() {
- useHtmlConfiguration();
- group('AbstractObservable', testAbstractObservable);
- group('ChangeEvent', testChangeEvent);
- group('EventBatch', testEventBatch);
- group('ObservableList', testObservableList);
- group('ObservableValue', testObservableValue);
-}
-
-void validateEvent(ChangeEvent e, target, pName, index, type, newVal, oldVal) {
- expect(e.target, equals(target));
- expect(e.propertyName, equals(pName));
- expect(e.index, equals(index));
- expect(e.type, equals(type));
- expect(e.newValue, equals(newVal));
- expect(e.oldValue, equals(oldVal));
-}
-
-void validateGlobal(ChangeEvent e, target) {
- validateEvent(e, target, null, null, ChangeEvent.GLOBAL, null, null);
-}
-
-void validateInsert(ChangeEvent e, target, pName, index, newVal) {
- validateEvent(e, target, pName, index, ChangeEvent.INSERT, newVal, null);
-}
-
-void validateRemove(ChangeEvent e, target, pName, index, oldVal) {
- validateEvent(e, target, pName, index, ChangeEvent.REMOVE, null, oldVal);
-}
-
-void validateUpdate(ChangeEvent e, target, pName, index, newVal, oldVal) {
- validateEvent(e, target, pName, index, ChangeEvent.UPDATE, newVal, oldVal);
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_value_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/observable_value_tests.dart
deleted file mode 100644
index 2ee55c1..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_value_tests.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2011, 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.
-
-part of observable_tests;
-
-testObservableValue() {
- test('ObservableValue', () {
- final value = new ObservableValue<String>('initial');
- expect(value.value, equals('initial'));
-
- // Set value.
- value.value = 'new';
- expect(value.value, equals('new'));
-
- // Change event is sent when value is changed.
- EventSummary result = null;
- value.addChangeListener((summary) {
- expect(result, isNull);
- result = summary;
- expect(result, isNotNull);
- });
-
- value.value = 'newer';
-
- expect(result, isNotNull);
- expect(result.events.length, equals(1));
- validateUpdate(result.events[0], value, 'value', null, 'newer', 'new');
- });
-
- test('does not raise event if unchanged', () {
- final value = new ObservableValue<String>('foo');
- expect(value.value, equals('foo'));
-
- bool called = false;
- value.addChangeListener((summary) {
- called = true;
- });
-
- // Set it to the same value.
- value.value = 'foo';
-
- // Should not have gotten an event.
- expect(called, isFalse);
- });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/touch/touch_test.dart b/samples-dev/swarm/test/swarm_ui_lib/touch/touch_test.dart
deleted file mode 100644
index 1bd3436..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/touch/touch_test.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2011, 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.
-
-library touchTests;
-
-import 'dart:html'; // TODO(rnystrom): Only needed to tell architecture.py
-// that this is a web test. Come up with cleaner solution.
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import '../../../swarm_ui_lib/touch/touch.dart';
-
-main() {
- useHtmlConfiguration();
- test('Solver', () {
- expect(Solver.solve((x) => x * x, 81, 10), closeTo(9, 0.1));
- expect(Solver.solve((x) => x * x, 0, 10), closeTo(0, 0.1));
- expect(Solver.solve((x) => x * x, 1.5625, 10), closeTo(1.25, 0.1));
- expect(Solver.solve((x) => 1 / x, 10, 1), closeTo(0.1, 0.1));
- });
-
- group('Momentum', () {
- test('SingleDimensionPhysics', () {
- expect(new SingleDimensionPhysics().solve(0, 0, 1), equals(0));
- expect(new SingleDimensionPhysics().solve(0, 5, 1), equals(0));
- expect(new SingleDimensionPhysics().solve(0, 100, 1), equals(0));
- expect(new SingleDimensionPhysics().solve(0, 100, 0.5), equals(0));
- });
-
- test('TimeoutMomentum()', () {
- final delegate = new TestMomentumDelegate();
- final momentum = new TimeoutMomentum(null);
- });
- });
-}
-
-class TestMomentumDelegate {
- Function onDecelerateCallback;
- Function onDecelerationEndCallback;
-
- void onDecelerate(num x, num y,
- [num duration = 0, String timingFunction = null]) {
- onDecelerateCallback(x, y, duration, timingFunction);
- }
-
- /**
- * Callback for end of deceleration.
- */
- void onDecelerationEnd() {
- onDecelerationEndCallback();
- }
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/util/util_test.dart b/samples-dev/swarm/test/swarm_ui_lib/util/util_test.dart
deleted file mode 100644
index 97b5890..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/util/util_test.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2011, 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.
-
-library util_tests;
-
-import 'dart:html';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import '../../../swarm_ui_lib/util/utilslib.dart';
-
-main() {
- useHtmlConfiguration();
- test('insertAt', () {
- var a = [];
- CollectionUtils.insertAt(a, 0, 1);
- expect(a, orderedEquals([1]));
-
- CollectionUtils.insertAt(a, 0, 2);
- expect(a, orderedEquals([2, 1]));
-
- CollectionUtils.insertAt(a, 0, 5);
- CollectionUtils.insertAt(a, 0, 4);
- CollectionUtils.insertAt(a, 0, 3);
- expect(a, orderedEquals([3, 4, 5, 2, 1]));
-
- a = [];
- CollectionUtils.insertAt(a, 0, 1);
- expect(a, orderedEquals([1]));
-
- CollectionUtils.insertAt(a, 1, 2);
- expect(a, orderedEquals([1, 2]));
-
- CollectionUtils.insertAt(a, 1, 3);
- CollectionUtils.insertAt(a, 3, 4);
- CollectionUtils.insertAt(a, 3, 5);
- expect(a, orderedEquals([1, 3, 2, 5, 4]));
- });
-
- test('defaultString', () {
- expect(StringUtils.defaultString(null), isEmpty);
- expect(StringUtils.defaultString(''), isEmpty);
- expect(StringUtils.defaultString('test'), equals('test'));
- });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart b/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart
deleted file mode 100644
index 663b45b..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright (c) 2011, 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.
-
-library view_tests;
-
-import 'dart:html';
-import '../../../swarm_ui_lib/view/view.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-
-void main() {
- useHtmlConfiguration();
- test('does not render immediately', () {
- final view = new TestView();
- expect(view.isRendered, isFalse);
-
- view.addToDocument(document.body);
- expect(view.isRendered, isTrue);
- });
-
- group('addToDocument()', () {
- test('causes view to render', () {
- final view = new TestView();
- view.addToDocument(document.body);
- expect(view.isRendered, isTrue);
- });
-
- test('calls afterRender()', () {
- var result = '';
- final view = new TestView();
- view.renderFn = () {
- result = '${result}render';
- return new Element.html('<div class="test"></div>');
- };
-
- view.afterRenderFn = (node) {
- result = '${result}after';
- };
-
- view.addToDocument(document.body);
- expect(result, equals('renderafter'));
- });
-
- test('calls enterDocument()', () {
- final view = new TestView();
- bool entered = false;
- view.enterDocumentFn = () {
- entered = true;
- };
-
- view.addToDocument(document.body);
- expect(entered, isTrue);
- });
- });
-
- group('afterRender()', () {
- test('passes rendered node', () {
- final rendered = new Element.html('<div class="node"></div>');
- final view = new TestView();
- view.renderFn = () => rendered;
- view.afterRenderFn = (node) {
- expect(node, equals(rendered));
- };
-
- view.addToDocument(document.body);
- });
- });
-
- group('childViewAdded()', () {
- test('calls enterDocument() if parent is in document', () {
- final parent = new TestView();
- parent.addToDocument(document.body);
-
- bool entered = false;
- final child = new TestView();
- child.enterDocumentFn = () {
- entered = true;
- };
-
- // Add the child.
- parent.childViews = [child];
- parent.childViewAdded(child);
-
- expect(entered, isTrue);
- });
-
- test('does not call enterDocument() if parent is not in document', () {
- final parent = new TestView();
-
- bool entered = false;
- final child = new TestView();
- child.enterDocumentFn = () {
- entered = true;
- };
-
- // Add the child.
- parent.childViews = [child];
- parent.childViewAdded(child);
-
- expect(entered, isFalse);
- });
-
- test('calls enterDocument() each time added', () {
- final parent = new TestView();
- parent.addToDocument(document.body);
-
- var entered = 0;
- final child = new TestView();
- child.enterDocumentFn = () {
- entered++;
- };
-
- // Add the child.
- parent.childViews = [child];
- parent.childViewAdded(child);
- parent.childViewRemoved(child);
- parent.childViewAdded(child);
- parent.childViewRemoved(child);
- parent.childViewAdded(child);
- parent.childViewRemoved(child);
-
- expect(entered, equals(3));
- });
- });
-
- group('childViewRemoved()', () {
- test('calls exitDocument() if parent is in document', () {
- final parent = new TestView();
- parent.addToDocument(document.body);
-
- bool exited = false;
- final child = new TestView();
- child.exitDocumentFn = () {
- exited = true;
- };
-
- // Remove the child.
- parent.childViews = [];
- parent.childViewRemoved(child);
-
- expect(exited, isTrue);
- });
-
- test('does not call exitDocument() if parent is not in document', () {
- final parent = new TestView();
-
- bool exited = false;
- final child = new TestView();
- child.exitDocumentFn = () {
- exited = true;
- };
-
- // Remove the child.
- parent.childViews = [];
- parent.childViewRemoved(child);
-
- expect(exited, isFalse);
- });
-
- test('calls exitDocument() each time removed', () {
- final parent = new TestView();
- parent.addToDocument(document.body);
-
- var exited = 0;
- final child = new TestView();
- child.exitDocumentFn = () {
- exited++;
- };
-
- // Add the child.
- parent.childViews = [child];
- parent.childViewAdded(child);
- parent.childViewRemoved(child);
- parent.childViewAdded(child);
- parent.childViewRemoved(child);
- parent.childViewAdded(child);
- parent.childViewRemoved(child);
-
- expect(exited, equals(3));
- });
- });
-
- group('enterDocument()', () {
- test('children are called before parents', () {
- var result = '';
-
- final parent = new TestView();
- parent.enterDocumentFn = () {
- result = '${result}parent';
- };
-
- final child = new TestView();
- child.enterDocumentFn = () {
- result = '${result}child';
- };
-
- parent.childViews = [child];
-
- parent.addToDocument(document.body);
- expect(result, equals('childparent'));
- });
- });
-}
-
-class TestView extends View {
- Function renderFn;
- Function afterRenderFn;
- Function enterDocumentFn;
- Function exitDocumentFn;
- List<View> childViews;
-
- TestView() : childViews = [] {
- // Default behavior.
- renderFn = () => new Element.html('<div class="test"></div>');
- afterRenderFn = (node) {};
- enterDocumentFn = () {};
- exitDocumentFn = () {};
- }
-
- Element render() => renderFn();
- void afterRender(Element node) {
- afterRenderFn(node);
- }
-
- void enterDocument() {
- enterDocumentFn();
- }
-
- void exitDocument() {
- exitDocumentFn();
- }
-}
diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart
index f841bc5..6883fbc 100644
--- a/sdk/lib/_http/http.dart
+++ b/sdk/lib/_http/http.dart
@@ -753,6 +753,11 @@
* [HeaderValue] can be used to conveniently build and parse header
* values on this form.
*
+ * Parameter values can be omitted, in which case the value is parsed as `null`.
+ * Values can be doubled quoted to allow characters outside of the RFC 7230
+ * token characters and backslash sequences can be used to represent the double
+ * quote and backslash characters themselves.
+ *
* To build an [:accepts:] header with the value
*
* text/plain; q=0.3, text/html
@@ -779,7 +784,8 @@
/**
* Creates a new header value object setting the value and parameters.
*/
- factory HeaderValue([String value = "", Map<String, String> parameters]) {
+ factory HeaderValue(
+ [String value = "", Map<String, String> parameters = const {}]) {
return new _HeaderValue(value, parameters);
}
@@ -892,7 +898,7 @@
* or in `parameters`, will have its value converted to lower-case.
*/
factory ContentType(String primaryType, String subType,
- {String charset, Map<String, String> parameters}) {
+ {String charset, Map<String, String> parameters = const {}}) {
return new _ContentType(primaryType, subType, charset, parameters);
}
diff --git a/sdk/lib/_http/http_headers.dart b/sdk/lib/_http/http_headers.dart
index d152153..e271935 100644
--- a/sdk/lib/_http/http_headers.dart
+++ b/sdk/lib/_http/http_headers.dart
@@ -641,8 +641,8 @@
Map<String, String> _parameters;
Map<String, String> _unmodifiableParameters;
- _HeaderValue([this._value = "", Map<String, String> parameters]) {
- if (parameters != null) {
+ _HeaderValue([this._value = "", Map<String, String> parameters = const {}]) {
+ if (parameters != null && parameters.isNotEmpty) {
_parameters = new HashMap<String, String>.from(parameters);
}
}
@@ -659,18 +659,25 @@
String get value => _value;
- void _ensureParameters() {
- if (_parameters == null) {
- _parameters = new HashMap<String, String>();
- }
- }
+ Map<String, String> _ensureParameters() => _parameters ??= <String, String>{};
- Map<String, String> get parameters {
- _ensureParameters();
- if (_unmodifiableParameters == null) {
- _unmodifiableParameters = new UnmodifiableMapView(_parameters);
+ Map<String, String> get parameters =>
+ _unmodifiableParameters ??= UnmodifiableMapView(_ensureParameters());
+
+ static bool _isToken(String token) {
+ if (token.isEmpty) {
+ return false;
}
- return _unmodifiableParameters;
+ final delimiters = "\"(),/:;<=>?@[\]{}";
+ for (int i = 0; i < token.length; i++) {
+ int codeUnit = token.codeUnitAt(i);
+ if (codeUnit <= 32 ||
+ codeUnit >= 127 ||
+ delimiters.indexOf(token[i]) >= 0) {
+ return false;
+ }
+ }
+ return true;
}
String toString() {
@@ -678,7 +685,27 @@
sb.write(_value);
if (parameters != null && parameters.length > 0) {
_parameters.forEach((String name, String value) {
- sb..write("; ")..write(name)..write("=")..write(value);
+ sb..write("; ")..write(name);
+ if (value != null) {
+ sb.write("=");
+ if (_isToken(value)) {
+ sb.write(value);
+ } else {
+ sb.write('"');
+ int start = 0;
+ for (int i = 0; i < value.length; i++) {
+ // Can use codeUnitAt here instead.
+ int codeUnit = value.codeUnitAt(i);
+ if (codeUnit == 92 /* backslash */ ||
+ codeUnit == 34 /* double quote */) {
+ sb.write(value.substring(start, i));
+ sb.write(r'\');
+ start = i;
+ }
+ }
+ sb..write(value.substring(start))..write('"');
+ }
+ }
});
}
return sb.toString();
@@ -716,8 +743,12 @@
index++;
}
- void maybeExpect(String expected) {
- if (s[index] == expected) index++;
+ bool maybeExpect(String expected) {
+ if (done() || !s.startsWith(expected, index)) {
+ return false;
+ }
+ index++;
+ return true;
}
void parseParameters() {
@@ -753,16 +784,15 @@
index++;
} else if (s[index] == "\"") {
index++;
- break;
+ return sb.toString();
}
sb.write(s[index]);
index++;
}
- return sb.toString();
+ throw new HttpException("Failed to parse header value");
} else {
// Parse non-quoted value.
- var val = parseValue();
- return val == "" ? null : val;
+ return parseValue();
}
}
@@ -771,23 +801,18 @@
if (done()) return;
String name = parseParameterName();
skipWS();
- if (done()) {
+ if (maybeExpect("=")) {
+ skipWS();
+ String value = parseParameterValue();
+ if (name == 'charset' && this is _ContentType) {
+ // Charset parameter of ContentTypes are always lower-case.
+ value = value.toLowerCase();
+ }
+ parameters[name] = value;
+ skipWS();
+ } else if (name.isNotEmpty) {
parameters[name] = null;
- return;
}
- maybeExpect("=");
- skipWS();
- if (done()) {
- parameters[name] = null;
- return;
- }
- String value = parseParameterValue();
- if (name == 'charset' && this is _ContentType && value != null) {
- // Charset parameter of ContentTypes are always lower-case.
- value = value.toLowerCase();
- }
- parameters[name] = value;
- skipWS();
if (done()) return;
// TODO: Implement support for multi-valued parameters.
if (s[index] == valueSeparator) return;
@@ -821,7 +846,7 @@
parameters.forEach((String key, String value) {
String lowerCaseKey = key.toLowerCase();
if (lowerCaseKey == "charset") {
- value = value.toLowerCase();
+ value = value?.toLowerCase();
}
this._parameters[lowerCaseKey] = value;
});
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 890a570..761c12e 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -1760,9 +1760,9 @@
request.headers
..host = host
..port = port
- .._add(HttpHeaders.acceptEncodingHeader, "gzip");
+ ..add(HttpHeaders.acceptEncodingHeader, "gzip");
if (_httpClient.userAgent != null) {
- request.headers._add(HttpHeaders.userAgentHeader, _httpClient.userAgent);
+ request.headers.add(HttpHeaders.userAgentHeader, _httpClient.userAgent);
}
if (proxy.isAuthenticated) {
// If the proxy configuration contains user information use that
@@ -2560,6 +2560,10 @@
outgoing,
_httpServer.defaultResponseHeaders,
_httpServer.serverHeader);
+ // Parser found badRequest and sent out Response.
+ if (incoming.statusCode == HttpStatus.badRequest) {
+ response.statusCode = HttpStatus.badRequest;
+ }
var request = new _HttpRequest(response, incoming, _httpServer, this);
_streamFuture = outgoing.done.then((_) {
response.deadline = null;
diff --git a/sdk/lib/_http/http_parser.dart b/sdk/lib/_http/http_parser.dart
index 0a17e19..6153ffa 100644
--- a/sdk/lib/_http/http_parser.dart
+++ b/sdk/lib/_http/http_parser.dart
@@ -249,6 +249,8 @@
final List<int> _uriOrReasonPhrase = [];
final List<int> _headerField = [];
final List<int> _headerValue = [];
+ // The limit for method, uriOrReasonPhrase, header field and value
+ int _headerSizeLimit = 8 * 1024;
int _httpVersion;
int _transferLength = -1;
@@ -258,9 +260,14 @@
bool _noMessageBody = false;
int _remainingContent = -1;
+ bool _contentLength = false;
+ bool _transferEncoding = false;
_HttpHeaders _headers;
+ // The limit for parsing chunk size
+ int _chunkSizeLimit = 0x7FFFFFFF;
+
// The current incoming connection.
_HttpIncoming _incoming;
StreamSubscription<Uint8List> _socketSubscription;
@@ -433,7 +440,7 @@
if (!_isTokenChar(byte)) {
throw HttpException("Invalid request method");
}
- _method.add(byte);
+ _addWithValidation(_method, byte);
if (!_requestParser) {
throw HttpException("Invalid response line");
}
@@ -458,12 +465,12 @@
} else {
// Did not parse HTTP version. Expect method instead.
for (int i = 0; i < _httpVersionIndex; i++) {
- _method.add(_Const.HTTP[i]);
+ _addWithValidation(_method, _Const.HTTP[i]);
}
if (byte == _CharCode.SP) {
_state = _State.REQUEST_LINE_URI;
} else {
- _method.add(byte);
+ _addWithValidation(_method, byte);
_httpVersion = _HttpVersion.UNDETERMINED;
if (!_requestParser) {
throw HttpException("Invalid response line");
@@ -509,7 +516,7 @@
byte == _CharCode.LF) {
throw HttpException("Invalid request method");
}
- _method.add(byte);
+ _addWithValidation(_method, byte);
}
break;
@@ -524,7 +531,7 @@
if (byte == _CharCode.CR || byte == _CharCode.LF) {
throw HttpException("Invalid request, unexpected $byte in URI");
}
- _uriOrReasonPhrase.add(byte);
+ _addWithValidation(_uriOrReasonPhrase, byte);
}
break;
@@ -591,7 +598,7 @@
throw HttpException(
"Invalid response, unexpected $byte in reason phrase");
}
- _uriOrReasonPhrase.add(byte);
+ _addWithValidation(_uriOrReasonPhrase, byte);
}
break;
@@ -614,7 +621,7 @@
_index--; // Make the new state see the LF again.
} else {
// Start of new header field.
- _headerField.add(_toLowerCaseByte(byte));
+ _addWithValidation(_headerField, _toLowerCaseByte(byte));
_state = _State.HEADER_FIELD;
}
break;
@@ -626,7 +633,7 @@
if (!_isTokenChar(byte)) {
throw HttpException("Invalid header field name, with $byte");
}
- _headerField.add(_toLowerCaseByte(byte));
+ _addWithValidation(_headerField, _toLowerCaseByte(byte));
}
break;
@@ -637,7 +644,7 @@
_state = _State.HEADER_VALUE_FOLD_OR_END;
} else if (byte != _CharCode.SP && byte != _CharCode.HT) {
// Start of new header value.
- _headerValue.add(byte);
+ _addWithValidation(_headerValue, byte);
_state = _State.HEADER_VALUE;
}
break;
@@ -648,7 +655,7 @@
} else if (byte == _CharCode.LF) {
_state = _State.HEADER_VALUE_FOLD_OR_END;
} else {
- _headerValue.add(byte);
+ _addWithValidation(_headerValue, byte);
}
break;
@@ -663,9 +670,21 @@
} else {
String headerField = new String.fromCharCodes(_headerField);
String headerValue = new String.fromCharCodes(_headerValue);
- if (headerField == HttpHeaders.transferEncodingHeader &&
- _caseInsensitiveCompare("chunked".codeUnits, _headerValue)) {
- _chunked = true;
+ if (headerField == HttpHeaders.contentLengthHeader) {
+ // Content Length header should not have more than one occurance
+ // or coexist with Transfer Encoding header.
+ if (_contentLength || _transferEncoding) {
+ _statusCode = HttpStatus.badRequest;
+ }
+ _contentLength = true;
+ } else if (headerField == HttpHeaders.transferEncodingHeader) {
+ _transferEncoding = true;
+ if (_caseInsensitiveCompare("chunked".codeUnits, _headerValue)) {
+ _chunked = true;
+ }
+ if (_contentLength) {
+ _statusCode = HttpStatus.badRequest;
+ }
}
if (headerField == HttpHeaders.connectionHeader) {
List<String> tokens = _tokenizeFieldValue(headerValue);
@@ -680,10 +699,10 @@
(isUpgrade && isResponse && isUpgradeCode)) {
_connectionUpgrade = true;
}
- _headers._add(headerField, tokens[i]);
+ _headers.add(headerField, tokens[i]);
}
} else {
- _headers._add(headerField, headerValue);
+ _headers.add(headerField, headerValue);
}
_headerField.clear();
_headerValue.clear();
@@ -695,8 +714,8 @@
_index--; // Make the new state see the LF again.
} else {
// Start of new header field.
- _headerField.add(_toLowerCaseByte(byte));
_state = _State.HEADER_FIELD;
+ _addWithValidation(_headerField, _toLowerCaseByte(byte));
}
}
break;
@@ -725,6 +744,10 @@
_state = _State.CHUNK_SIZE_EXTENSION;
} else {
int value = _expectHexDigit(byte);
+ // Checks whether (_remaingingContent * 16 + value) overflows.
+ if (_remainingContent > _chunkSizeLimit >> 4) {
+ throw HttpException('Chunk size overflows the integer');
+ }
_remainingContent = _remainingContent * 16 + value;
}
break;
@@ -918,6 +941,9 @@
_noMessageBody = false;
_remainingContent = -1;
+ _contentLength = false;
+ _transferEncoding = false;
+
_headers = null;
}
@@ -990,6 +1016,48 @@
}
}
+ void _addWithValidation(List<int> list, int byte) {
+ if (list.length < _headerSizeLimit) {
+ list.add(byte);
+ } else {
+ _reportSizeLimitError();
+ }
+ }
+
+ void _reportSizeLimitError() {
+ String method = "";
+ switch (_state) {
+ case _State.START:
+ case _State.METHOD_OR_RESPONSE_HTTP_VERSION:
+ case _State.REQUEST_LINE_METHOD:
+ method = "Method";
+ break;
+
+ case _State.REQUEST_LINE_URI:
+ method = "URI";
+ break;
+
+ case _State.RESPONSE_LINE_REASON_PHRASE:
+ method = "Reason phrase";
+ break;
+
+ case _State.HEADER_START:
+ case _State.HEADER_FIELD:
+ method = "Header field";
+ break;
+
+ case _State.HEADER_VALUE_START:
+ case _State.HEADER_VALUE:
+ method = "Header value";
+ break;
+
+ default:
+ throw UnsupportedError("Unexpected state: $_state");
+ break;
+ }
+ throw HttpException("$method exceeds the $_headerSizeLimit size limit");
+ }
+
void _createIncoming(int transferLength) {
assert(_incoming == null);
assert(_bodyController == null);
diff --git a/sdk/lib/_http/websocket.dart b/sdk/lib/_http/websocket.dart
index 77b5008..45cc5117 100644
--- a/sdk/lib/_http/websocket.dart
+++ b/sdk/lib/_http/websocket.dart
@@ -331,11 +331,14 @@
static const int CLOSED = closed;
/**
- * Set and get the interval for sending ping signals. If a ping message is not
- * answered by a pong message from the peer, the `WebSocket` is assumed
- * disconnected and the connection is closed with a
- * [WebSocketStatus.goingAway] close code. When a ping signal is sent, the
- * pong message must be received within [pingInterval].
+ * The interval between ping signals.
+ *
+ * A ping message is sent every [pingInterval], starting at the first
+ * [pingInterval] after a new value has been assigned or a pong message has
+ * been received. If a ping message is not answered by a pong message from the
+ * peer, the `WebSocket` is assumed disconnected and the connection is closed
+ * with a [WebSocketStatus.goingAway] close code. When a ping signal is sent,
+ * the pong message must be received within [pingInterval].
*
* There are never two outstanding pings at any given time, and the next ping
* timer starts when the pong is received.
diff --git a/sdk/lib/_http/websocket_impl.dart b/sdk/lib/_http/websocket_impl.dart
index ce015bb..820dd69 100644
--- a/sdk/lib/_http/websocket_impl.dart
+++ b/sdk/lib/_http/websocket_impl.dart
@@ -1205,8 +1205,12 @@
if (_writeClosed) return;
_consumer.add(new _WebSocketPing());
_pingTimer = new Timer(_pingInterval, () {
+ _closeTimer?.cancel();
// No pong received.
_close(WebSocketStatus.goingAway);
+ _closeCode = _outCloseCode;
+ _closeReason = _outCloseReason;
+ _controller.close();
});
});
}
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
index 2e1587c..0000252 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -72,9 +72,6 @@
@JSExportName('as')
static Object _as_Object(Object o) => o;
-
- @JSExportName('_check')
- static Object _check_Object(Object o) => o;
}
@patch
@@ -89,14 +86,7 @@
static Object _as_Null(Object o) {
// Avoid extra function call to core.Null.is() by manually inlining.
if (o == null) return o;
- return dart.cast(o, dart.unwrapType(Null), false);
- }
-
- @JSExportName('_check')
- static Object _check_Null(Object o) {
- // Avoid extra function call to core.Null.is() by manually inlining.
- if (o == null) return o;
- return dart.cast(o, dart.unwrapType(Null), true);
+ return dart.cast(o, dart.unwrapType(Null));
}
}
@@ -135,14 +125,7 @@
static Object _as_Function(Object o) {
// Avoid extra function call to core.Function.is() by manually inlining.
if (JS<Object>('!', 'typeof $o == "function"') || o == null) return o;
- return dart.cast(o, dart.unwrapType(Function), false);
- }
-
- @JSExportName('_check')
- static Object _check_Function(Object o) {
- // Avoid extra function call to core.Function.is() by manually inlining.
- if (JS<Object>('!', 'typeof $o == "function"') || o == null) return o;
- return dart.cast(o, dart.unwrapType(Function), true);
+ return dart.cast(o, dart.unwrapType(Function));
}
}
@@ -217,17 +200,7 @@
o == null) {
return o;
}
- return dart.cast(o, dart.unwrapType(int), false);
- }
-
- @JSExportName('_check')
- static Object _check_int(Object o) {
- // Avoid extra function call to core.int.is() by manually inlining.
- if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)') ||
- o == null) {
- return o;
- }
- return dart.cast(o, dart.unwrapType(int), true);
+ return dart.cast(o, dart.unwrapType(int));
}
}
@@ -253,14 +226,7 @@
static Object _as_double(o) {
// Avoid extra function call to core.double.is() by manually inlining.
if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
- return dart.cast(o, dart.unwrapType(double), false);
- }
-
- @JSExportName('_check')
- static Object _check_double(o) {
- // Avoid extra function call to core.double.is() by manually inlining.
- if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
- return dart.cast(o, dart.unwrapType(double), true);
+ return dart.cast(o, dart.unwrapType(double));
}
}
@@ -275,14 +241,7 @@
static Object _as_num(o) {
// Avoid extra function call to core.num.is() by manually inlining.
if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
- return dart.cast(o, dart.unwrapType(num), false);
- }
-
- @JSExportName('_check')
- static Object _check_num(o) {
- // Avoid extra function call to core.num.is() by manually inlining.
- if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
- return dart.cast(o, dart.unwrapType(num), true);
+ return dart.cast(o, dart.unwrapType(num));
}
}
@@ -657,14 +616,7 @@
static Object _as_String(Object o) {
// Avoid extra function call to core.String.is() by manually inlining.
if (JS<bool>('!', 'typeof $o == "string"') || o == null) return o;
- return dart.cast(o, dart.unwrapType(String), false);
- }
-
- @JSExportName('_check')
- static Object _check_String(Object o) {
- // Avoid extra function call to core.String.is() by manually inlining.
- if (JS<bool>('!', 'typeof $o == "string"') || o == null) return o;
- return dart.cast(o, dart.unwrapType(String), true);
+ return dart.cast(o, dart.unwrapType(String));
}
}
@@ -695,14 +647,7 @@
static Object _as_bool(Object o) {
// Avoid extra function call to core.bool.is() by manually inlining.
if (JS<bool>("!", '$o === true || $o === false') || o == null) return o;
- return dart.cast(o, dart.unwrapType(bool), false);
- }
-
- @JSExportName('_check')
- static Object _check_bool(Object o) {
- // Avoid extra function call to core.bool.is() by manually inlining.
- if (JS<bool>("!", '$o === true || $o === false') || o == null) return o;
- return dart.cast(o, dart.unwrapType(bool), true);
+ return dart.cast(o, dart.unwrapType(bool));
}
}
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
index 514ffcb..48a0969 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
@@ -406,9 +406,16 @@
}
@patch
- factory InternetAddress(String address) {
+ factory InternetAddress(String address, {InternetAddressType type}) {
throw UnsupportedError("InternetAddress");
}
+
+ @patch
+ factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {InternetAddressType type}) {
+ throw new UnsupportedError("InternetAddress.fromRawAddress");
+ }
+
@patch
static Future<List<InternetAddress>> lookup(String host,
{InternetAddressType type = InternetAddressType.any}) {
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
index 862dd7e..04b4f2f 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
@@ -535,16 +535,7 @@
'',
'''#.as = function as_C(obj) {
if (obj == null || obj[#]) return obj;
- return #(obj, this, false);
- }''',
- ctor,
- isClass,
- cast);
- JS(
- '',
- '''#._check = function check_C(obj) {
- if (obj == null || obj[#]) return obj;
- return #(obj, this, true);
+ return #(obj, this);
}''',
ctor,
isClass,
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
index 4a5813d..699f415 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
@@ -38,11 +38,10 @@
null, Symbol('<Unexpected Null Value>'), null, null, null);
}
-castError(obj, expectedType, [@notNull bool isImplicit = false]) {
+castError(obj, expectedType) {
var actualType = getReifiedType(obj);
var message = _castErrorMessage(actualType, expectedType);
- var error = isImplicit ? TypeErrorImpl(message) : CastErrorImpl(message);
- throw error;
+ throw TypeErrorImpl(message);
}
String _castErrorMessage(from, to) {
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
index 2bd044b..a89ec92 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
@@ -134,7 +134,7 @@
if (f != null) {
var setterType = getSetterType(getType(obj), f);
if (setterType != null) {
- return JS('', '#[#] = #._check(#)', obj, f, setterType, value);
+ return JS('', '#[#] = #.as(#)', obj, f, setterType, value);
}
// Always allow for JS interop objects.
if (isJsInterop(obj)) return JS('', '#[#] = #', obj, f, value);
@@ -179,14 +179,14 @@
}
// Now that we know the signature matches, we can perform type checks.
for (var i = 0; i < requiredCount; ++i) {
- JS('', '#[#]._check(#[#])', required, i, actuals, i);
+ JS('', '#[#].as(#[#])', required, i, actuals, i);
}
for (var i = 0; i < extras; ++i) {
- JS('', '#[#]._check(#[#])', optionals, i, actuals, i + requiredCount);
+ JS('', '#[#].as(#[#])', optionals, i, actuals, i + requiredCount);
}
if (names != null) {
for (var name in names) {
- JS('', '#[#]._check(#[#])', named, name, namedActuals, name);
+ JS('', '#[#].as(#[#])', named, name, namedActuals, name);
}
}
return null;
@@ -397,13 +397,13 @@
}
@JSExportName('as')
-cast(obj, type, @notNull bool isImplicit) {
+cast(obj, type) {
if (obj == null) return obj;
var actual = getReifiedType(obj);
if (isSubtypeOf(actual, type)) {
return obj;
}
- return castError(obj, type, isImplicit);
+ return castError(obj, type);
}
bool test(bool obj) {
@@ -419,7 +419,7 @@
void _throwBooleanConversionError() => throw BooleanConversionAssertionError();
void booleanConversionFailed(obj) {
- var actual = typeName(getReifiedType(test(obj)));
+ var actual = typeName(getReifiedType(obj));
throw TypeErrorImpl("type '$actual' is not a 'bool' in boolean expression");
}
@@ -427,7 +427,7 @@
if (obj == null) return null;
if (JS('!', 'Math.floor(#) != #', obj, obj)) {
- castError(obj, JS('', '#', int), false);
+ castError(obj, JS('', '#', int));
}
return obj;
}
@@ -448,7 +448,7 @@
}
/// No-op without null safety enabled.
-nullCast(x, type, [@notNull bool isImplicit = false]) => x;
+nullCast(x, type) => x;
/// The global constant map table.
final constantMaps = JS('', 'new Map()');
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index a6d17de..b3fad43 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -46,10 +46,9 @@
///
/// T.is(o): Implements 'o is T'.
/// T.as(o): Implements 'o as T'.
-/// T._check(o): Implements the type assertion of 'T x = o;'
///
/// By convention, we used named JavaScript functions for these methods with the
-/// name 'is_X', 'as_X' and 'check_X' for various X to indicate the type or the
+/// name 'is_X' and 'as_X' for various X to indicate the type or the
/// implementation strategy for the test (e.g 'is_String', 'is_G' for generic
/// types, etc.)
// TODO(jmesserly): we shouldn't implement Type here. It should be moved down
@@ -63,10 +62,7 @@
bool is_T(object) => instanceOf(object, this);
@JSExportName('as')
- as_T(object) => cast(object, this, false);
-
- @JSExportName('_check')
- check_T(object) => cast(object, this, true);
+ as_T(object) => cast(object, this);
}
class DynamicType extends DartType {
@@ -77,9 +73,6 @@
@JSExportName('as')
as_T(object) => object;
-
- @JSExportName('_check')
- check_T(object) => object;
}
@notNull
@@ -178,10 +171,7 @@
bool is_T(obj) => isRawJSType(obj) || instanceOf(obj, this);
@JSExportName('as')
- as_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this, false);
-
- @JSExportName('_check')
- check_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this, true);
+ as_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this);
}
/// An anonymous JS type
@@ -196,10 +186,7 @@
bool is_T(obj) => _isJsObject(obj) || instanceOf(obj, this);
@JSExportName('as')
- as_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this, false);
-
- @JSExportName('_check')
- check_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this, true);
+ as_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this);
}
void _warn(arg) {
@@ -486,7 +473,7 @@
}
@JSExportName('as')
- as_T(obj, [@notNull bool isImplicit = false]) {
+ as_T(obj) {
if (obj == null) return obj;
if (JS('!', 'typeof # == "function"', obj)) {
var actual = JS('', '#[#]', obj, _runtimeType);
@@ -496,11 +483,8 @@
return obj;
}
}
- return castError(obj, this, isImplicit);
+ return castError(obj, this);
}
-
- @JSExportName('_check')
- check_T(obj) => as_T(obj, true);
}
/// A type variable, used by [GenericFunctionType] to represent a type formal.
@@ -677,13 +661,7 @@
@JSExportName('as')
as_T(obj) {
if (obj == null || is_T(obj)) return obj;
- return castError(obj, this, false);
- }
-
- @JSExportName('_check')
- check_T(obj) {
- if (obj == null || is_T(obj)) return obj;
- return castError(obj, this, true);
+ return castError(obj, this);
}
}
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index 480a17b..3da215e 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -205,7 +205,8 @@
}
}
- void completeError(e, [st]) {
+ void completeError(Object e, [StackTrace st]) {
+ st ??= AsyncError.defaultStackTrace(e);
if (isSync) {
_future._completeError(e, st);
} else {
diff --git a/sdk/lib/_internal/js_runtime/lib/io_patch.dart b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
index 37aa15c..146776c 100644
--- a/sdk/lib/_internal/js_runtime/lib/io_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
@@ -406,9 +406,16 @@
}
@patch
- factory InternetAddress(String address) {
+ factory InternetAddress(String address, {InternetAddressType type}) {
throw new UnsupportedError("InternetAddress");
}
+
+ @patch
+ factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {InternetAddressType type}) {
+ throw new UnsupportedError("InternetAddress.fromRawAddress");
+ }
+
@patch
static Future<List<InternetAddress>> lookup(String host,
{InternetAddressType type: InternetAddressType.any}) {
diff --git a/sdk/lib/_internal/js_runtime/lib/rti.dart b/sdk/lib/_internal/js_runtime/lib/rti.dart
index d7764df..22af777 100644
--- a/sdk/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/rti.dart
@@ -55,12 +55,6 @@
@pragma('dart2js:noElision')
dynamic _as;
- /// JavaScript method for type check. The method is called from generated
- /// code, e.g. parameter check for `T param` generates something like
- /// `rtiForT._check(param)`.
- @pragma('dart2js:noElision')
- dynamic _check;
-
/// JavaScript method for 'is' test. The method is called from generated
/// code, e.g. `o is T` generates something like `rtiForT._is(o)`.
@pragma('dart2js:noElision')
@@ -70,10 +64,6 @@
rti._as = fn;
}
- static void _setTypeCheckFunction(Rti rti, fn) {
- rti._check = fn;
- }
-
static void _setIsTestFunction(Rti rti, fn) {
rti._is = fn;
}
@@ -837,12 +827,10 @@
if (isObjectType(testRti)) {
isFn = RAW_DART_FUNCTION_REF(_isObject);
Rti._setAsCheckFunction(testRti, RAW_DART_FUNCTION_REF(_asObject));
- Rti._setTypeCheckFunction(testRti, RAW_DART_FUNCTION_REF(_checkObject));
} else if (isTopType(testRti)) {
isFn = RAW_DART_FUNCTION_REF(_isTop);
var asFn = RAW_DART_FUNCTION_REF(_asTop);
Rti._setAsCheckFunction(testRti, asFn);
- Rti._setTypeCheckFunction(testRti, asFn);
} else if (_Utils.isIdentical(testRti, TYPE_REF<int>())) {
isFn = RAW_DART_FUNCTION_REF(_isInt);
} else if (_Utils.isIdentical(testRti, TYPE_REF<double>())) {
@@ -924,23 +912,6 @@
Rti objectRti = instanceOrFunctionType(object, testRti);
String message =
_Error.compose(object, objectRti, _rtiToString(testRti, null));
- throw _CastError.fromMessage(message);
-}
-
-/// Called from generated code.
-_generalTypeCheckImplementation(object) {
- // This static method is installed on an Rti object as a JavaScript instance
- // method. The Rti object is 'this'.
- Rti testRti = _castToRti(JS('', 'this'));
- if (object == null) {
- if (JS_GET_FLAG('LEGACY') || isNullable(testRti)) return object;
- } else {
- if (Rti._isCheck(testRti, object)) return object;
- }
-
- Rti objectRti = instanceOrFunctionType(object, testRti);
- String message =
- _Error.compose(object, objectRti, _rtiToString(testRti, null));
throw _TypeError.fromMessage(message);
}
@@ -953,7 +924,7 @@
throw _TypeError.fromMessage(message);
}
-/// Base class to _CastError and _TypeError.
+/// Base class to _TypeError.
class _Error extends Error {
final String _message;
_Error(this._message);
@@ -971,14 +942,6 @@
String toString() => _message;
}
-class _CastError extends _Error implements CastError, TypeError {
- _CastError.fromMessage(String message) : super('TypeError: $message');
-
- factory _CastError.forType(object, String type) {
- return _CastError.fromMessage(_Error.compose(object, null, type));
- }
-}
-
class _TypeError extends _Error implements TypeError, CastError {
_TypeError.fromMessage(String message) : super('TypeError: $message');
@@ -992,7 +955,7 @@
// Specializations.
//
-// Specializations can be placed on Rti objects as the _as, _check and _is
+// Specializations can be placed on Rti objects as the _as and _is
// 'methods'. They can also be called directly called from generated code.
/// Specialization for 'is Object'.
@@ -1005,13 +968,6 @@
/// Called from generated code via Rti `_as` method.
dynamic _asObject(object) {
if (JS_GET_FLAG('LEGACY') || object != null) return object;
- throw _CastError.forType(object, 'Object');
-}
-
-/// Specialization for check on 'Object'.
-/// Called from generated code via Rti `_check` method.
-dynamic _checkObject(object) {
- if (JS_GET_FLAG('LEGACY') || object != null) return object;
throw _TypeError.forType(object, 'Object');
}
@@ -1022,7 +978,7 @@
}
/// Specialization for 'as dynamic' and other top types.
-/// Called from generated code via Rti `_as` and `_check` methods.
+/// Called from generated code via Rti `_as` methods.
dynamic _asTop(object) {
return object;
}
@@ -1038,14 +994,6 @@
bool /*?*/ _asBoolNullable(object) {
if (_isBool(object)) return _Utils.asBool(object);
if (object == null) return object;
- throw _CastError.forType(object, 'bool');
-}
-
-/// Specialization for check on 'bool?'.
-/// Called from generated code.
-bool /*?*/ _checkBoolNullable(object) {
- if (_isBool(object)) return _Utils.asBool(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'bool');
}
@@ -1054,14 +1002,6 @@
double /*?*/ _asDoubleNullable(object) {
if (_isNum(object)) return _Utils.asDouble(object);
if (object == null) return object;
- throw _CastError.forType(object, 'double');
-}
-
-/// Specialization for check on 'double?'.
-/// Called from generated code.
-double /*?*/ _checkDoubleNullable(object) {
- if (_isNum(object)) return _Utils.asDouble(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'double');
}
@@ -1077,14 +1017,6 @@
int /*?*/ _asIntNullable(object) {
if (_isInt(object)) return _Utils.asInt(object);
if (object == null) return object;
- throw _CastError.forType(object, 'int');
-}
-
-/// Specialization for check on 'int?'.
-/// Called from generated code.
-int /*?*/ _checkIntNullable(object) {
- if (_isInt(object)) return _Utils.asInt(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'int');
}
@@ -1099,14 +1031,6 @@
num /*?*/ _asNumNullable(object) {
if (_isNum(object)) return _Utils.asNum(object);
if (object == null) return object;
- throw _CastError.forType(object, 'num');
-}
-
-/// Specialization for check on 'num?'.
-/// Called from generated code.
-num /*?*/ _checkNumNullable(object) {
- if (_isNum(object)) return _Utils.asNum(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'num');
}
@@ -1121,14 +1045,6 @@
String /*?*/ _asStringNullable(object) {
if (_isString(object)) return _Utils.asString(object);
if (object == null) return object;
- throw _CastError.forType(object, 'String');
-}
-
-/// Specialization for check on 'String?'.
-/// Called from generated code.
-String /*?*/ _checkStringNullable(object) {
- if (_isString(object)) return _Utils.asString(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'String');
}
@@ -1596,15 +1512,12 @@
}
static Rti _installTypeTests(Object universe, Rti rti) {
- // Set up methods to perform type tests. The general as-check / type-check
- // methods use the is-test method. The is-test method on first use
- // overwrites itself, and possibly the as-check / type-check methods, with a
- // specialized version.
- var checkFn = RAW_DART_FUNCTION_REF(_generalTypeCheckImplementation);
+ // Set up methods to perform type tests. The general as-check methods use
+ // the is-test method. The is-test method on first use overwrites itself,
+ // and possibly the as-check method, with a specialized version.
var asFn = RAW_DART_FUNCTION_REF(_generalAsCheckImplementation);
var isFn = RAW_DART_FUNCTION_REF(_installSpecializedIsTest);
Rti._setAsCheckFunction(rti, asFn);
- Rti._setTypeCheckFunction(rti, checkFn);
Rti._setIsTestFunction(rti, isFn);
return rti;
}
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index 8d5bbe3..3fe415d 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -71,8 +71,14 @@
}
@patch
- factory InternetAddress(String address) {
- return new _InternetAddress.parse(address);
+ factory InternetAddress(String address, {InternetAddressType type}) {
+ return _InternetAddress.fromString(address, type: type);
+ }
+
+ @patch
+ factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {InternetAddressType type}) {
+ return _InternetAddress.fromRawAddress(rawAddress, type: type);
}
@patch
@@ -140,10 +146,7 @@
final String _host;
final Uint8List _in_addr;
final int _scope_id;
-
- InternetAddressType get type => _in_addr.length == _IPv4AddrLength
- ? InternetAddressType.IPv4
- : InternetAddressType.IPv6;
+ final InternetAddressType type;
String get host => _host != null ? _host : address;
@@ -159,6 +162,9 @@
if (_in_addr[i] != 0) return false;
}
return _in_addr[_IPv6AddrLength - 1] == 1;
+
+ case InternetAddressType.unix:
+ return false;
}
}
@@ -171,6 +177,9 @@
case InternetAddressType.IPv6:
// Checking for fe80::/10.
return _in_addr[0] == 0xFE && (_in_addr[1] & 0xB0) == 0x80;
+
+ case InternetAddressType.unix:
+ return false;
}
}
@@ -183,57 +192,103 @@
case InternetAddressType.IPv6:
// Checking for ff00::/8.
return _in_addr[0] == 0xFF;
+
+ case InternetAddressType.unix:
+ return false;
}
}
- Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this);
+ Future<InternetAddress> reverse() {
+ if (type == InternetAddressType.unix) {
+ return Future.value(this);
+ }
+ return _NativeSocket.reverseLookup(this);
+ }
- _InternetAddress(this.address, this._host, this._in_addr,
+ _InternetAddress(this.type, this.address, this._host, this._in_addr,
[this._scope_id = 0]);
- factory _InternetAddress.parse(String address) {
- if (address is! String) {
- throw new ArgumentError("Invalid internet address $address");
+ factory _InternetAddress.fromString(String address,
+ {InternetAddressType type}) {
+ if (type == InternetAddressType.unix) {
+ ArgumentError.checkNotNull(address, 'address');
+ var rawAddress = FileSystemEntity._toUtf8Array(address);
+ return _InternetAddress(
+ InternetAddressType.unix, address, null, rawAddress);
+ } else {
+ if (address is! String) {
+ throw ArgumentError("Invalid internet address $address");
+ }
+ var in_addr = _parse(address);
+ if (in_addr == null) {
+ throw ArgumentError("Invalid internet address $address");
+ }
+ InternetAddressType type = in_addr.length == _IPv4AddrLength
+ ? InternetAddressType.IPv4
+ : InternetAddressType.IPv6;
+ return _InternetAddress(type, address, null, in_addr);
}
- var in_addr = _parse(address);
- if (in_addr == null) {
- throw new ArgumentError("Invalid internet address $address");
+ }
+
+ factory _InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {InternetAddressType type}) {
+ if (type == InternetAddressType.unix) {
+ ArgumentError.checkNotNull(rawAddress, 'rawAddress');
+ var rawPath = FileSystemEntity._toNullTerminatedUtf8Array(rawAddress);
+ var address = FileSystemEntity._toStringFromUtf8Array(rawAddress);
+ return _InternetAddress(InternetAddressType.unix, address, null, rawPath);
+ } else {
+ int type = -1;
+ if (rawAddress.length == _IPv4AddrLength) {
+ type = 0;
+ } else {
+ if (rawAddress.length != _IPv6AddrLength) {
+ throw ArgumentError("Invalid internet address ${rawAddress}");
+ }
+ type = 1;
+ }
+ var address = _rawAddrToString(rawAddress);
+ return _InternetAddress(
+ InternetAddressType._from(type), address, null, rawAddress);
}
- return new _InternetAddress(address, null, in_addr);
}
factory _InternetAddress.fixed(int id) {
switch (id) {
case _addressLoopbackIPv4:
- var in_addr = new Uint8List(_IPv4AddrLength);
+ var in_addr = Uint8List(_IPv4AddrLength);
in_addr[0] = 127;
in_addr[_IPv4AddrLength - 1] = 1;
- return new _InternetAddress("127.0.0.1", null, in_addr);
+ return _InternetAddress(
+ InternetAddressType.IPv4, "127.0.0.1", null, in_addr);
case _addressLoopbackIPv6:
- var in_addr = new Uint8List(_IPv6AddrLength);
+ var in_addr = Uint8List(_IPv6AddrLength);
in_addr[_IPv6AddrLength - 1] = 1;
- return new _InternetAddress("::1", null, in_addr);
+ return _InternetAddress(InternetAddressType.IPv6, "::1", null, in_addr);
case _addressAnyIPv4:
- var in_addr = new Uint8List(_IPv4AddrLength);
- return new _InternetAddress("0.0.0.0", "0.0.0.0", in_addr);
+ var in_addr = Uint8List(_IPv4AddrLength);
+ return _InternetAddress(
+ InternetAddressType.IPv4, "0.0.0.0", "0.0.0.0", in_addr);
case _addressAnyIPv6:
- var in_addr = new Uint8List(_IPv6AddrLength);
- return new _InternetAddress("::", "::", in_addr);
+ var in_addr = Uint8List(_IPv6AddrLength);
+ return _InternetAddress(InternetAddressType.IPv6, "::", "::", in_addr);
default:
assert(false);
- throw new ArgumentError();
+ throw ArgumentError();
}
}
// Create a clone of this _InternetAddress replacing the host.
_InternetAddress _cloneWithNewHost(String host) {
- return new _InternetAddress(
- address, host, new Uint8List.fromList(_in_addr));
+ return _InternetAddress(type, address, host, Uint8List.fromList(_in_addr));
}
bool operator ==(other) {
if (!(other is _InternetAddress)) return false;
if (other.type != type) return false;
+ if (type == InternetAddressType.unix) {
+ return address == other.address;
+ }
bool equals = true;
for (int i = 0; i < _in_addr.length && equals; i++) {
equals = other._in_addr[i] == _in_addr[i];
@@ -242,6 +297,9 @@
}
int get hashCode {
+ if (type == InternetAddressType.unix) {
+ return address.hashCode;
+ }
int result = 1;
for (int i = 0; i < _in_addr.length; i++) {
result = (result * 31 + _in_addr[i]) & 0x3FFFFFFF;
@@ -253,6 +311,9 @@
return "InternetAddress('$address', ${type.name})";
}
+ static String _rawAddrToString(Uint8List address)
+ native "InternetAddress_RawAddrToString";
+
static Uint8List _parse(String address) native "InternetAddress_Parse";
}
@@ -394,8 +455,8 @@
throw createError(response, "Failed host lookup: '$host'");
} else {
return response.skip(1).map<InternetAddress>((result) {
- var type = new InternetAddressType._from(result[0]);
- return new _InternetAddress(result[1], host, result[2], result[3]);
+ var type = InternetAddressType._from(result[0]);
+ return _InternetAddress(type, result[1], host, result[2], result[3]);
}).toList();
}
});
@@ -423,10 +484,10 @@
} else {
var map = response.skip(1).fold(new Map<String, NetworkInterface>(),
(map, result) {
- var type = new InternetAddressType._from(result[0]);
+ var type = InternetAddressType._from(result[0]);
var name = result[3];
var index = result[4];
- var address = new _InternetAddress(result[1], "", result[2]);
+ var address = _InternetAddress(type, result[1], "", result[2]);
if (!includeLinkLocal && address.isLinkLocal) return map;
if (!includeLoopback && address.isLoopback) return map;
map.putIfAbsent(name, () => new _NetworkInterface(name, index));
@@ -505,12 +566,23 @@
socket.localAddress = address;
var result;
if (sourceAddress == null) {
- result = socket.nativeCreateConnect(
- address._in_addr, port, address._scope_id);
+ if (address.type == InternetAddressType.unix) {
+ result = socket.nativeCreateUnixDomainConnect(
+ address.address, _Namespace._namespace);
+ } else {
+ result = socket.nativeCreateConnect(
+ address._in_addr, port, address._scope_id);
+ }
} else {
assert(sourceAddress is _InternetAddress);
- result = socket.nativeCreateBindConnect(address._in_addr, port,
- sourceAddress._in_addr, address._scope_id);
+ if (address.type == InternetAddressType.unix) {
+ assert(sourceAddress.type == InternetAddressType.unix);
+ result = socket.nativeCreateUnixDomainBindConnect(
+ address.address, sourceAddress.address, _Namespace._namespace);
+ } else {
+ result = socket.nativeCreateBindConnect(address._in_addr, port,
+ sourceAddress._in_addr, address._scope_id);
+ }
}
if (result is OSError) {
// Keep first error, if present.
@@ -642,8 +714,18 @@
var socket = new _NativeSocket.listen();
socket.localAddress = address;
- var result = socket.nativeCreateBindListen(
- address._in_addr, port, backlog, v6Only, shared, address._scope_id);
+ var result;
+ if (address.type == InternetAddressType.unix) {
+ var path = address.address;
+ if (FileSystemEntity.isLinkSync(path)) {
+ path = Link(path).targetSync();
+ }
+ result = socket.nativeCreateUnixDomainBindListen(
+ path, backlog, shared, _Namespace._namespace);
+ } else {
+ result = socket.nativeCreateBindListen(
+ address._in_addr, port, backlog, v6Only, shared, address._scope_id);
+ }
if (result is OSError) {
throw new SocketException("Failed to create server socket",
osError: result, address: address, port: port);
@@ -885,12 +967,14 @@
}
int get port {
+ if (localAddress.type == InternetAddressType.unix) return 0;
if (localPort != 0) return localPort;
if (isClosing || isClosed) throw const SocketException.closed();
return localPort = nativeGetPort();
}
int get remotePort {
+ if (localAddress.type == InternetAddressType.unix) return 0;
if (isClosing || isClosed) throw const SocketException.closed();
return nativeGetRemotePeer()[1];
}
@@ -902,7 +986,11 @@
var result = nativeGetRemotePeer();
var addr = result[0];
var type = new InternetAddressType._from(addr[0]);
- return new _InternetAddress(addr[1], null, addr[2]);
+ if (type == InternetAddressType.unix) {
+ return _InternetAddress.fromString(addr[1],
+ type: InternetAddressType.unix);
+ }
+ return _InternetAddress(type, addr[1], null, addr[2]);
}
void issueReadEvent() {
@@ -1247,11 +1335,17 @@
int port) native "Socket_SendTo";
nativeCreateConnect(Uint8List addr, int port, int scope_id)
native "Socket_CreateConnect";
+ nativeCreateUnixDomainConnect(String addr, _Namespace namespace)
+ native "Socket_CreateUnixDomainConnect";
nativeCreateBindConnect(Uint8List addr, int port, Uint8List sourceAddr,
int scope_id) native "Socket_CreateBindConnect";
+ nativeCreateUnixDomainBindConnect(String addr, String sourceAddr,
+ _Namespace namespace) native "Socket_CreateUnixDomainBindConnect";
bool isBindError(int errorNumber) native "SocketBase_IsBindError";
nativeCreateBindListen(Uint8List addr, int port, int backlog, bool v6Only,
bool shared, int scope_id) native "ServerSocket_CreateBindListen";
+ nativeCreateUnixDomainBindListen(String addr, int backlog, bool shared,
+ _Namespace namespace) native "ServerSocket_CreateUnixDomainBindListen";
nativeCreateBindDatagram(Uint8List addr, int port, bool reuseAddress,
bool reusePort, int ttl) native "Socket_CreateBindDatagram";
bool nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
@@ -2090,6 +2184,9 @@
@pragma("vm:entry-point", "call")
Datagram _makeDatagram(
- Uint8List data, String address, Uint8List in_addr, int port) {
- return new Datagram(data, new _InternetAddress(address, null, in_addr), port);
+ Uint8List data, String address, Uint8List in_addr, int port, int type) {
+ return new Datagram(
+ data,
+ _InternetAddress(InternetAddressType._from(type), address, null, in_addr),
+ port);
}
diff --git a/sdk/lib/_internal/vm/bin/sync_socket_patch.dart b/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
index d98649e..bccdd4f 100644
--- a/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
@@ -144,7 +144,12 @@
throw result;
}
var addr = result[0];
- return new _InternetAddress(addr[1], null, addr[2]);
+ var type = InternetAddressType._from(addr[0]);
+ if (type == InternetAddressType.unix) {
+ return _InternetAddress.fromString(addr[1],
+ type: InternetAddressType.unix);
+ }
+ return _InternetAddress(type, addr[1], null, addr[2]);
}
int get remotePort {
@@ -188,7 +193,8 @@
new List<_InternetAddress>(response.length);
for (int i = 0; i < response.length; ++i) {
var result = response[i];
- addresses[i] = new _InternetAddress(result[1], host, result[2]);
+ var type = InternetAddressType._from(result[0]);
+ addresses[i] = _InternetAddress(type, result[1], host, result[2]);
}
return addresses;
}
diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart
index 85de9dc..9d730ab 100644
--- a/sdk/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk/lib/_internal/vm/lib/async_patch.dart
@@ -35,7 +35,8 @@
}
}
- void completeError(e, [st]) {
+ void completeError(Object e, [StackTrace st]) {
+ st ??= AsyncError.defaultStackTrace(e);
if (isSync) {
_future._completeError(e, st);
} else {
@@ -79,7 +80,7 @@
// parameter to the continuation. See vm/ast_transformer.cc for usage.
Function _asyncErrorWrapperHelper(continuation) {
// See comments of `_asyncThenWrapperHelper`.
- var errorCallback = (e, s) => continuation(null, e, s);
+ void errorCallback(Object e, StackTrace s) => continuation(null, e, s);
if (Zone.current == Zone.root) return errorCallback;
return Zone.current.registerBinaryCallback(errorCallback);
}
diff --git a/sdk/lib/_internal/vm/lib/compact_hash.dart b/sdk/lib/_internal/vm/lib/compact_hash.dart
index 112b9ba..da431134 100644
--- a/sdk/lib/_internal/vm/lib/compact_hash.dart
+++ b/sdk/lib/_internal/vm/lib/compact_hash.dart
@@ -468,6 +468,7 @@
}
// Set implementation, analogous to _CompactLinkedHashMap.
+@pragma('vm:entry-point')
class _CompactLinkedHashSet<E> extends _HashFieldBase
with _HashBase, _OperatorEqualsAndHashCode, SetMixin<E>
implements LinkedHashSet<E> {
diff --git a/sdk/lib/async/broadcast_stream_controller.dart b/sdk/lib/async/broadcast_stream_controller.dart
index 09ab783..6a62e0b 100644
--- a/sdk/lib/async/broadcast_stream_controller.dart
+++ b/sdk/lib/async/broadcast_stream_controller.dart
@@ -260,6 +260,7 @@
error = _nonNullError(replacement.error);
stackTrace = replacement.stackTrace;
}
+ stackTrace ??= AsyncError.defaultStackTrace(error);
_sendError(error, stackTrace);
}
@@ -481,6 +482,7 @@
void addError(Object error, [StackTrace stackTrace]) {
ArgumentError.checkNotNull(error, "error");
+ stackTrace ??= AsyncError.defaultStackTrace(error);
if (!isClosed && _isFiring) {
_addPendingEvent(new _DelayedError(error, stackTrace));
return;
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index a0e35b5..19bb7c4 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -280,6 +280,7 @@
stackTrace = replacement.stackTrace;
}
}
+ stackTrace ??= AsyncError.defaultStackTrace(error);
return new _Future<T>.immediateError(error, stackTrace);
}
@@ -363,7 +364,7 @@
// Handle an error from any of the futures.
// TODO(jmesserly): use `void` return type once it can be inferred for the
// `then` call below.
- handleError(theError, StackTrace theStackTrace) {
+ handleError(Object theError, StackTrace theStackTrace) {
remaining--;
if (values != null) {
if (cleanUp != null) {
@@ -905,13 +906,14 @@
}
// Helper function completing a _Future with error, but checking the zone
-// for error replacement first.
+// for error replacement first and missing stack trace.
void _completeWithErrorCallback(_Future result, error, StackTrace stackTrace) {
AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
if (replacement != null) {
error = _nonNullError(replacement.error);
stackTrace = replacement.stackTrace;
}
+ stackTrace ??= AsyncError.defaultStackTrace(error);
result._completeError(error, stackTrace);
}
@@ -923,6 +925,7 @@
error = _nonNullError(replacement.error);
stackTrace = replacement.stackTrace;
}
+ stackTrace ??= AsyncError.defaultStackTrace(error);
result._asyncCompleteError(error, stackTrace);
}
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index e2b548b..c7cefce 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -26,6 +26,7 @@
error = _nonNullError(replacement.error);
stackTrace = replacement.stackTrace;
}
+ stackTrace ??= AsyncError.defaultStackTrace(error);
_completeError(error, stackTrace);
}
@@ -229,7 +230,7 @@
_setValue(value);
}
- _Future.immediateError(var error, [StackTrace stackTrace])
+ _Future.immediateError(var error, StackTrace stackTrace)
: _zone = Zone.current {
_asyncCompleteError(error, stackTrace);
}
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 203178a..21bc370 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -156,7 +156,7 @@
factory Stream.error(Object error, [StackTrace stackTrace]) {
ArgumentError.checkNotNull(error, "error");
return (_AsyncStreamController<T>(null, null, null, null)
- .._addError(error, stackTrace)
+ .._addError(error, stackTrace ?? AsyncError.defaultStackTrace(error))
.._closeUnchecked())
.stream;
}
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index b54ddac..3b5694f 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -611,6 +611,7 @@
error = _nonNullError(replacement.error);
stackTrace = replacement.stackTrace;
}
+ stackTrace ??= AsyncError.defaultStackTrace(error);
_addError(error, stackTrace);
}
diff --git a/sdk/lib/async/stream_transformers.dart b/sdk/lib/async/stream_transformers.dart
index 41c963f..243e934 100644
--- a/sdk/lib/async/stream_transformers.dart
+++ b/sdk/lib/async/stream_transformers.dart
@@ -18,7 +18,7 @@
}
void addError(error, [StackTrace stackTrace]) {
- _sink._addError(error, stackTrace);
+ _sink._addError(error, stackTrace ?? AsyncError.defaultStackTrace(error));
}
void close() {
@@ -239,6 +239,7 @@
throw StateError("Sink is closed");
}
if (_handleError != null) {
+ stackTrace ??= AsyncError.defaultStackTrace(error);
_handleError(error, stackTrace, _sink);
} else {
_sink.addError(error, stackTrace);
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index 83c0a80..82626a6 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -43,10 +43,24 @@
final Object error;
final StackTrace stackTrace;
- AsyncError(this.error, this.stackTrace) {
+ AsyncError(this.error, StackTrace stackTrace)
+ : stackTrace = stackTrace ?? defaultStackTrace(error) {
ArgumentError.checkNotNull(error, "error");
}
+ /// A default stack trace for an error.
+ ///
+ /// If [error] is an [Error] and it has an [Error.stackTrace],
+ /// that stack trace is returned.
+ /// If not, the [StackTrace.empty] default stack trace is returned.
+ static StackTrace defaultStackTrace(Object error) {
+ if (error is Error) {
+ var stackTrace = error.stackTrace;
+ if (stackTrace != null) return stackTrace;
+ }
+ return StackTrace.empty;
+ }
+
String toString() => '$error';
}
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index bb12431..e1a2672 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -184,10 +184,16 @@
/**
* Throws if [argument] is `null`.
+ *
+ * If [name] is supplied, it is used as the parameter name
+ * in the error message.
+ *
+ * Returns the [argument] if it is not null.
*/
@Since("2.1")
- static void checkNotNull(Object argument, [String name]) {
+ static T checkNotNull<@Since("2.8") T>(T argument, [String name]) {
if (argument == null) throw ArgumentError.notNull(name);
+ return argument;
}
// Helper functions for toString overridden in subclasses.
@@ -279,30 +285,42 @@
[String name, String message, int length]) = IndexError;
/**
- * Check that a [value] lies in a specific interval.
+ * Check that an integer [value] lies in a specific interval.
*
* Throws if [value] is not in the interval.
* The interval is from [minValue] to [maxValue], both inclusive.
+ *
+ * If [name] or [message] are provided, they are used as the parameter
+ * name and message text of the thrown error.
+ *
+ * Returns [value] if it is in the interval.
*/
- static void checkValueInInterval(int value, int minValue, int maxValue,
+ static int checkValueInInterval(int value, int minValue, int maxValue,
[String name, String message]) {
if (value < minValue || value > maxValue) {
throw RangeError.range(value, minValue, maxValue, name, message);
}
+ return value;
}
/**
- * Check that a value is a valid index into an indexable object.
+ * Check that [index] is a valid index into an indexable object.
*
* Throws if [index] is not a valid index into [indexable].
*
* An indexable object is one that has a `length` and a and index-operator
* `[]` that accepts an index if `0 <= index < length`.
*
+ * If [name] or [message] are provided, they are used as the parameter
+ * name and message text of the thrown error. If [name] is omitted, it
+ * defaults to `"index"`.
+ *
* If [length] is provided, it is used as the length of the indexable object,
* otherwise the length is found as `indexable.length`.
+ *
+ * Returns [index] if it is a valid index.
*/
- static void checkValidIndex(int index, dynamic indexable,
+ static int checkValidIndex(int index, dynamic indexable,
[String name, int length, String message]) {
length ??= indexable.length;
// Comparing with `0` as receiver produces better dart2js type inference.
@@ -310,6 +328,7 @@
name ??= "index";
throw RangeError.index(index, indexable, name, message, length);
}
+ return index;
}
/**
@@ -347,12 +366,19 @@
}
/**
- * Check that an integer value isn't negative.
+ * Check that an integer value is non-negative.
*
* Throws if the value is negative.
+ *
+ * If [name] or [message] are provided, they are used as the parameter
+ * name and message text of the thrown error. If [name] is omitted, it
+ * defaults to `index`.
+ *
+ * Returns [value] if it is not negative.
*/
- static void checkNotNegative(int value, [String name, String message]) {
+ static int checkNotNegative(int value, [String name, String message]) {
if (value < 0) throw RangeError.range(value, 0, null, name, message);
+ return value;
}
String get _errorName => "RangeError";
diff --git a/sdk/lib/core/stacktrace.dart b/sdk/lib/core/stacktrace.dart
index ed5f85d..3715730 100644
--- a/sdk/lib/core/stacktrace.dart
+++ b/sdk/lib/core/stacktrace.dart
@@ -16,6 +16,13 @@
* them programmatically.
*/
abstract class StackTrace {
+ /// A stack trace object with no information.
+ ///
+ /// This stack trace is used as the default in situations where
+ /// a stack trace is required, but the user has not supplied one.
+ @Since("2.8")
+ static const empty = const _StringStackTrace("");
+
StackTrace(); // In case existing classes extend StackTrace.
/**
@@ -57,6 +64,6 @@
class _StringStackTrace implements StackTrace {
final String _stackTrace;
- _StringStackTrace(this._stackTrace);
+ const _StringStackTrace(this._stackTrace);
String toString() => _stackTrace;
}
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index e09b761..3f8332f 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -13770,6 +13770,14 @@
if (!(element.attributes instanceof NamedNodeMap)) {
return true;
}
+ // If something has corrupted the traversal we want to detect
+ // these on not only the children (tested below) but on the node itself
+ // in case it was bypassed.
+ if (element["id"] == 'lastChild' || element["name"] == 'lastChild' ||
+ element["id"] == 'previousSibling' || element["name"] == 'previousSibling' ||
+ element["id"] == 'children' || element["name"] == 'children') {
+ return true;
+ }
var childNodes = element.childNodes;
if (element.lastChild &&
element.lastChild !== childNodes[childNodes.length -1]) {
@@ -13795,6 +13803,7 @@
// allowing us to check for clobbering that may show up in other accesses.
if (child["id"] == 'attributes' || child["name"] == 'attributes' ||
child["id"] == 'lastChild' || child["name"] == 'lastChild' ||
+ child["id"] == 'previousSibling' || child["name"] == 'previousSibling' ||
child["id"] == 'children' || child["name"] == 'children') {
return true;
}
@@ -40773,6 +40782,9 @@
*/
class _ValidatingTreeSanitizer implements NodeTreeSanitizer {
NodeValidator validator;
+
+ /// Did we modify the tree by removing anything.
+ bool modifiedTree = false;
_ValidatingTreeSanitizer(this.validator) {}
void sanitizeTree(Node node) {
@@ -40781,11 +40793,15 @@
var child = node.lastChild;
while (null != child) {
- var nextChild;
+ Node nextChild;
try {
- // Child may be removed during the walk, and we may not
- // even be able to get its previousNode.
+ // Child may be removed during the walk, and we may not even be able
+ // to get its previousNode. But it's also possible that previousNode
+ // (i.e. previousSibling) is being spoofed, so double-check it.
nextChild = child.previousNode;
+ if (nextChild != null && nextChild.nextNode != child) {
+ throw StateError("Corrupt HTML");
+ }
} catch (e) {
// Child appears bad, remove it. We want to check the rest of the
// children of node and, but we have no way of getting to the next
@@ -40799,7 +40815,12 @@
}
}
+ modifiedTree = false;
walk(node, null);
+ while (modifiedTree) {
+ modifiedTree = false;
+ walk(node, null);
+ }
}
/// Aggressively try to remove node.
@@ -40807,7 +40828,8 @@
// If we have the parent, it's presumably already passed more sanitization
// or is the fragment, so ask it to remove the child. And if that fails
// try to set the outer html.
- if (parent == null) {
+ modifiedTree = true;
+ if (parent == null || parent != node.parentNode) {
node.remove();
} else {
parent._removeChild(node);
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 2b7edeb..283a30a 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -8,11 +8,15 @@
/**
* [InternetAddressType] is the type an [InternetAddress]. Currently,
- * IP version 4 (IPv4) and IP version 6 (IPv6) are supported.
+ * IP version 4 (IPv4), IP version 6 (IPv6) and Unix domain address are
+ * supported. Unix domain sockets are available only on Linux, MacOS and
+ * Android.
*/
class InternetAddressType {
static const InternetAddressType IPv4 = const InternetAddressType._(0);
static const InternetAddressType IPv6 = const InternetAddressType._(1);
+ @Since("2.8")
+ static const InternetAddressType unix = const InternetAddressType._(2);
static const InternetAddressType any = const InternetAddressType._(-1);
@Deprecated("Use IPv4 instead")
@@ -27,8 +31,9 @@
const InternetAddressType._(this._value);
factory InternetAddressType._from(int value) {
- if (value == 0) return IPv4;
- if (value == 1) return IPv6;
+ if (value == IPv4._value) return IPv4;
+ if (value == IPv6._value) return IPv6;
+ if (value == unix._value) return unix;
throw new ArgumentError("Invalid type: $value");
}
@@ -43,6 +48,8 @@
return "IPv4";
case 1:
return "IPv6";
+ case 2:
+ return "Unix";
default:
throw new ArgumentError("Invalid InternetAddress");
}
@@ -52,7 +59,7 @@
}
/**
- * An internet address.
+ * An internet address or a Unix domain address.
*
* This object holds an internet address. If this internet address
* is the result of a DNS lookup, the address also holds the hostname
@@ -95,27 +102,35 @@
external static InternetAddress get ANY_IP_V6;
/**
- * The [type] of the [InternetAddress] specified what IP protocol.
+ * The address family of the [InternetAddress].
*/
InternetAddressType get type;
/**
- * The numeric address of the host. For IPv4 addresses this is using
- * the dotted-decimal notation. For IPv6 it is using the
- * hexadecimal representation.
+ * The numeric address of the host.
+ *
+ * For IPv4 addresses this is using the dotted-decimal notation.
+ * For IPv6 it is using the hexadecimal representation.
+ * For Unix domain addresses, this is a file path.
*/
String get address;
/**
- * The host used to lookup the address. If there is no host
- * associated with the address this returns the numeric address.
+ * The host used to lookup the address.
+ *
+ * If there is no host associated with the address this returns the [address].
*/
String get host;
/**
- * Get the raw address of this [InternetAddress]. The result is either a
- * 4 or 16 byte long list. The returned list is a copy, making it possible
- * to change the list without modifying the [InternetAddress].
+ * The raw address of this [InternetAddress].
+ *
+ * For an IP address, the result is either a 4 or 16 byte long list.
+ * For a Unix domain address, UTF-8 encoded byte sequences that represents
+ * [address] is returned.
+ *
+ * The returned list is a fresh copy, making it possible to change the list without
+ * modifying the [InternetAddress].
*/
Uint8List get rawAddress;
@@ -135,17 +150,48 @@
bool get isMulticast;
/**
- * Creates a new [InternetAddress] from a numeric address.
+ * Creates a new [InternetAddress] from a numeric address or a file path.
*
- * If the address in [address] is not a numeric IPv4
- * (dotted-decimal notation) or IPv6 (hexadecimal representation).
- * address [ArgumentError] is thrown.
+ * If [type] is [InternetAddressType.IPv4], [address] must be a numeric IPv4
+ * address (dotted-decimal notation).
+ * If [type] is [InternetAddressType.IPv6], [address] must be a numeric IPv6
+ * address (hexadecimal notation).
+ * If [type] is [InternetAddressType.unix], [address] must be a a valid file
+ * path.
+ * If [type] is omitted, [address] must be either a numeric IPv4 or IPv6
+ * address and the type is inferred from the format.
+ *
+ * To create a Unix domain address, [type] should be
+ * [InternetAddressType.unix] and [address] should be a string.
*/
- external factory InternetAddress(String address);
+ external factory InternetAddress(String address,
+ {@Since("2.8") InternetAddressType type});
/**
- * Perform a reverse dns lookup on the [address], creating a new
- * [InternetAddress] where the host field set to the result.
+ * Creates a new [InternetAddress] from the provided raw address bytes.
+ *
+ * If the [type] is [InternetAddressType.IPv4], the [rawAddress] must have
+ * length 4.
+ * If the [type] is [InternetAddressType.IPv6], the [rawAddress] must have
+ * length 16.
+ * If the [type] is [InternetAddressType.IPv4], the [rawAddress] must be a
+ * valid UTF-8 encoded file path.
+ *
+ * If [type] is omitted, the [rawAddress] must have a length of either 4 or
+ * 16, in which case the type defaults to [InternetAddress.IPv4] or
+ * [InternetAddress.IPv6] respectively.
+ */
+ external factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {@Since("2.8") InternetAddressType type});
+
+ /**
+ * Perform a reverse DNS lookup on this [address]
+ *
+ * Returns a new [InternetAddress] with the same address, but where the [host]
+ * field set to the result of the lookup.
+ *
+ * If this address is Unix domain addresses, no lookup is performed and this
+ * address is returned directly.
*/
Future<InternetAddress> reverse();
@@ -826,28 +872,30 @@
void setRawOption(RawSocketOption option);
/**
- * Returns the port used by this socket.
+ * The port used by this socket.
*
* Throws a [SocketException] if the socket is closed.
+ * The port is 0 if the socket is a Unix domain socket.
*/
int get port;
/**
- * Returns the remote port connected to by this socket.
+ * The remote port connected to by this socket.
*
* Throws a [SocketException] if the socket is closed.
+ * The port is 0 if the socket is a Unix domain socket.
*/
int get remotePort;
/**
- * Returns the [InternetAddress] used to connect this socket.
+ * The [InternetAddress] used to connect this socket.
*
* Throws a [SocketException] if the socket is closed.
*/
InternetAddress get address;
/**
- * Returns the remote [InternetAddress] connected to by this socket.
+ * The remote [InternetAddress] connected to by this socket.
*
* Throws a [SocketException] if the socket is closed.
*/
diff --git a/sdk_nnbd/lib/_http/http.dart b/sdk_nnbd/lib/_http/http.dart
index fb662c6..551ab65 100644
--- a/sdk_nnbd/lib/_http/http.dart
+++ b/sdk_nnbd/lib/_http/http.dart
@@ -142,7 +142,8 @@
*
* The default value is `null`.
*/
- String? serverHeader;
+ String? get serverHeader;
+ void set serverHeader(String? newServerHeader);
/**
* Default set of headers added to all response objects.
@@ -169,7 +170,8 @@
* The default value is `false` (compression disabled).
* To enable, set `autoCompress` to `true`.
*/
- bool autoCompress;
+ bool get autoCompress;
+ void set autoCompress(bool newAutoCompress);
/**
* Gets or sets the timeout used for idle keep-alive connections. If no
@@ -183,7 +185,8 @@
*
* To disable, set [idleTimeout] to `null`.
*/
- Duration? idleTimeout;
+ Duration? get idleTimeout;
+ void set idleTimeout(Duration? newIdleTimeout);
/**
* Starts listening for HTTP requests on the specified [address] and
@@ -772,6 +775,11 @@
* [HeaderValue] can be used to conveniently build and parse header
* values on this form.
*
+ * Parameter values can be omitted, in which case the value is parsed as `null`.
+ * Values can be doubled quoted to allow characters outside of the RFC 7230
+ * token characters and backslash sequences can be used to represent the double
+ * quote and backslash characters themselves.
+ *
* To build an "accepts" header with the value
*
* text/plain; q=0.3, text/html
@@ -798,7 +806,8 @@
/**
* Creates a new header value object setting the value and parameters.
*/
- factory HeaderValue([String value = "", Map<String, String>? parameters]) {
+ factory HeaderValue(
+ [String value = "", Map<String, String?> parameters = const {}]) {
return new _HeaderValue(value, parameters);
}
@@ -826,7 +835,7 @@
*
* This map cannot be modified.
*/
- Map<String, String> get parameters;
+ Map<String, String?> get parameters;
/**
* Returns the formatted string representation in the form:
@@ -916,7 +925,7 @@
* or in `parameters`, will have its value converted to lower-case.
*/
factory ContentType(String primaryType, String subType,
- {String? charset, Map<String, String>? parameters}) {
+ {String? charset, Map<String, String?> parameters = const {}}) {
return new _ContentType(primaryType, subType, charset, parameters);
}
@@ -988,7 +997,8 @@
* `(`, `)`, `<`, `>`, `@`, `,`, `;`, `:`, `\`, `"`, `/`, `[`, `]`, `?`, `=`,
* `{`, and `}`.
*/
- String name;
+ String get name;
+ void set name(String newName);
/**
* The value of the cookie.
@@ -1001,39 +1011,46 @@
* Cookie values may be wrapped in a single pair of double quotes
* (U+0022, `"`).
*/
- String value;
+ String get value;
+ void set value(String newValue);
/**
* The time at which the cookie expires.
*/
- DateTime? expires;
+ DateTime? get expires;
+ void set expires(DateTime? newExpires);
/**
* The number of seconds until the cookie expires. A zero or negative value
* means the cookie has expired.
*/
- int? maxAge;
+ int? get maxAge;
+ void set maxAge(int? newMaxAge);
/**
* The domain that the cookie applies to.
*/
- String? domain;
+ String? get domain;
+ void set domain(String? newDomain);
/**
* The path within the [domain] that the cookie applies to.
*/
- String? path;
+ String? get path;
+ void set path(String? newPath);
/**
* Whether to only send this cookie on secure connections.
*/
- bool secure;
+ bool get secure;
+ void set secure(bool newSecure);
/**
* Whether the cookie is only sent in the HTTP request and is not made
* available to client side scripts.
*/
- bool httpOnly;
+ bool get httpOnly;
+ void set httpOnly(bool newHttpOnly);
/**
* Creates a new cookie setting the name and value.
@@ -1490,7 +1507,8 @@
/// connections.
///
/// The default value is 15 seconds.
- Duration idleTimeout;
+ Duration get idleTimeout;
+ void set idleTimeout(Duration newIdleTimeout);
/// Gets and sets the connection timeout.
///
@@ -1500,7 +1518,8 @@
///
/// When this is `null`, the OS default timeout is used. The default is
/// `null`.
- Duration? connectionTimeout;
+ Duration? get connectionTimeout;
+ void set connectionTimeout(Duration? newConnectionTimeout);
/**
* Gets and sets the maximum number of live connections, to a single host.
@@ -1512,7 +1531,8 @@
*
* Default is `null`.
*/
- int? maxConnectionsPerHost;
+ int? get maxConnectionsPerHost;
+ void set maxConnectionsPerHost(int? newMaxConnectionsPerHost);
/**
* Gets and sets whether the body of a response will be automatically
@@ -1540,7 +1560,8 @@
*
* Default is `true`.
*/
- bool autoUncompress;
+ bool get autoUncompress;
+ void set autoUncompress(bool newAutoUncompress);
/// Gets and sets the default value of the `User-Agent` header for all requests
/// generated by this [HttpClient].
@@ -1549,7 +1570,8 @@
///
/// If the userAgent is set to `null`, no default `User-Agent` header will be
/// added to each request.
- String? userAgent;
+ String? get userAgent;
+ void set userAgent(String? newUserAgent);
factory HttpClient({SecurityContext? context}) {
HttpOverrides? overrides = HttpOverrides.current;
diff --git a/sdk_nnbd/lib/_http/http_headers.dart b/sdk_nnbd/lib/_http/http_headers.dart
index 3fcdbe7..db3d7aa 100644
--- a/sdk_nnbd/lib/_http/http_headers.dart
+++ b/sdk_nnbd/lib/_http/http_headers.dart
@@ -648,12 +648,14 @@
class _HeaderValue implements HeaderValue {
String _value;
- Map<String, String>? _parameters;
- Map<String, String>? _unmodifiableParameters;
+ Map<String, String?>? _parameters;
+ Map<String, String?>? _unmodifiableParameters;
- _HeaderValue([this._value = "", Map<String, String>? parameters]) {
- if (parameters != null) {
- _parameters = new HashMap<String, String>.from(parameters);
+ _HeaderValue([this._value = "", Map<String, String?> parameters = const {}]) {
+ // TODO(40614): Remove once non-nullability is sound.
+ Map<String, String?>? nullableParameters = parameters;
+ if (nullableParameters != null && nullableParameters.isNotEmpty) {
+ _parameters = new HashMap<String, String?>.from(nullableParameters);
}
}
@@ -669,23 +671,55 @@
String get value => _value;
- Map<String, String> _ensureParameters() =>
- _parameters ??= HashMap<String, String>();
+ Map<String, String?> _ensureParameters() =>
+ _parameters ??= <String, String?>{};
- Map<String, String> get parameters =>
+ Map<String, String?> get parameters =>
_unmodifiableParameters ??= UnmodifiableMapView(_ensureParameters());
+ static bool _isToken(String token) {
+ if (token.isEmpty) {
+ return false;
+ }
+ final delimiters = "\"(),/:;<=>?@[\]{}";
+ for (int i = 0; i < token.length; i++) {
+ int codeUnit = token.codeUnitAt(i);
+ if (codeUnit <= 32 ||
+ codeUnit >= 127 ||
+ delimiters.indexOf(token[i]) >= 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
String toString() {
StringBuffer sb = new StringBuffer();
sb.write(_value);
var parameters = this._parameters;
if (parameters != null && parameters.length > 0) {
- parameters.forEach((String name, String value) {
- sb
- ..write("; ")
- ..write(name)
- ..write("=")
- ..write(value == "" ? '""' : value);
+ parameters.forEach((String name, String? value) {
+ sb..write("; ")..write(name);
+ if (value != null) {
+ sb.write("=");
+ if (_isToken(value)) {
+ sb.write(value);
+ } else {
+ sb.write('"');
+ int start = 0;
+ for (int i = 0; i < value.length; i++) {
+ // Can use codeUnitAt here instead.
+ int codeUnit = value.codeUnitAt(i);
+ if (codeUnit == 92 /* backslash */ ||
+ codeUnit == 34 /* double quote */) {
+ sb.write(value.substring(start, i));
+ sb.write(r'\');
+ start = i;
+ }
+ }
+ sb..write(value.substring(start))..write('"');
+ }
+ }
});
}
return sb.toString();
@@ -724,8 +758,12 @@
index++;
}
- void maybeExpect(String expected) {
- if (s[index] == expected) index++;
+ bool maybeExpect(String expected) {
+ if (done() || !s.startsWith(expected, index)) {
+ return false;
+ }
+ index++;
+ return true;
}
void parseParameters() {
@@ -762,13 +800,13 @@
index++;
} else if (char == "\"") {
index++;
- break;
+ return sb.toString();
}
char = s[index];
sb.write(char);
index++;
}
- return sb.toString();
+ throw new HttpException("Failed to parse header value");
} else {
// Parse non-quoted value.
return parseValue();
@@ -780,23 +818,18 @@
if (done()) return;
String name = parseParameterName();
skipWS();
- if (done()) {
- parameters[name] = "";
- return;
+ if (maybeExpect("=")) {
+ skipWS();
+ String value = parseParameterValue();
+ if (name == 'charset' && this is _ContentType) {
+ // Charset parameter of ContentTypes are always lower-case.
+ value = value.toLowerCase();
+ }
+ parameters[name] = value;
+ skipWS();
+ } else if (name.isNotEmpty) {
+ parameters[name] = null;
}
- maybeExpect("=");
- skipWS();
- if (done()) {
- parameters[name] = "";
- return;
- }
- String value = parseParameterValue();
- if (name == 'charset' && this is _ContentType) {
- // Charset parameter of ContentTypes are always lower-case.
- value = value.toLowerCase();
- }
- parameters[name] = value;
- skipWS();
if (done()) return;
// TODO: Implement support for multi-valued parameters.
if (s[index] == valueSeparator) return;
@@ -805,7 +838,7 @@
}
skipWS();
- _value = parseValue(); // TODO(39784): No _validateValue?
+ _value = parseValue();
skipWS();
if (done()) return;
maybeExpect(parameterSeparator);
@@ -818,17 +851,23 @@
String _subType = "";
_ContentType(String primaryType, String subType, String? charset,
- Map<String, String>? parameters)
+ Map<String, String?> parameters)
: _primaryType = primaryType,
_subType = subType,
super("") {
+ // TODO(40614): Remove once non-nullability is sound.
+ String emptyIfNull(String? string) => string ?? "";
+ _primaryType = emptyIfNull(_primaryType);
+ _subType = emptyIfNull(_subType);
_value = "$_primaryType/$_subType";
- if (parameters != null) {
+ // TODO(40614): Remove once non-nullability is sound.
+ Map<String, String?>? nullableParameters = parameters;
+ if (nullableParameters != null) {
var parameterMap = _ensureParameters();
- parameters.forEach((String key, String value) {
+ nullableParameters.forEach((String key, String? value) {
String lowerCaseKey = key.toLowerCase();
if (lowerCaseKey == "charset") {
- value = value.toLowerCase();
+ value = value?.toLowerCase();
}
parameterMap[lowerCaseKey] = value;
});
diff --git a/sdk_nnbd/lib/_http/http_impl.dart b/sdk_nnbd/lib/_http/http_impl.dart
index 5b9782a..aeacfa3 100644
--- a/sdk_nnbd/lib/_http/http_impl.dart
+++ b/sdk_nnbd/lib/_http/http_impl.dart
@@ -666,7 +666,7 @@
}
}
- void _completeDoneError(Object error, StackTrace? stackTrace) {
+ void _completeDoneError(Object error, StackTrace stackTrace) {
if (!_doneCompleter.isCompleted) {
_hasError = true;
_doneCompleter.completeError(error, stackTrace);
@@ -693,7 +693,7 @@
// No new stream, .close was called. Close _target.
_closeTarget();
}
- }, onError: (Object error, StackTrace? stackTrace) {
+ }, onError: (Object error, StackTrace stackTrace) {
if (_isBound) {
// A new stream takes over - forward errors to that stream.
_controllerCompleter!.completeError(error, stackTrace);
@@ -1715,7 +1715,7 @@
if (incoming.statusCode == 100) {
incoming.drain().then((_) {
_subscription!.resume();
- }).catchError((error, [StackTrace? stackTrace]) {
+ }).catchError((dynamic error, StackTrace stackTrace) {
_nextResponseCompleter!.completeError(
new HttpException(error.message, uri: _currentUri), stackTrace);
_nextResponseCompleter = null;
@@ -1724,7 +1724,7 @@
_nextResponseCompleter!.complete(incoming);
_nextResponseCompleter = null;
}
- }, onError: (error, [StackTrace? stackTrace]) {
+ }, onError: (dynamic error, StackTrace stackTrace) {
_nextResponseCompleter?.completeError(
new HttpException(error.message, uri: _currentUri), stackTrace);
_nextResponseCompleter = null;
@@ -1758,9 +1758,9 @@
request.headers
..host = host
..port = port
- .._add(HttpHeaders.acceptEncodingHeader, "gzip");
+ ..add(HttpHeaders.acceptEncodingHeader, "gzip");
if (_httpClient.userAgent != null) {
- request.headers._add(HttpHeaders.userAgentHeader, _httpClient.userAgent);
+ request.headers.add(HttpHeaders.userAgentHeader, _httpClient.userAgent!);
}
if (proxy.isAuthenticated) {
// If the proxy configuration contains user information use that
@@ -2557,6 +2557,10 @@
outgoing,
_httpServer.defaultResponseHeaders,
_httpServer.serverHeader);
+ // Parser found badRequest and sent out Response.
+ if (incoming.statusCode == HttpStatus.badRequest) {
+ response.statusCode = HttpStatus.badRequest;
+ }
var request = new _HttpRequest(response, incoming, _httpServer, this);
_streamFuture = outgoing.done.then((_) {
response.deadline = null;
diff --git a/sdk_nnbd/lib/_http/http_parser.dart b/sdk_nnbd/lib/_http/http_parser.dart
index c5a480c..36a8a1a 100644
--- a/sdk_nnbd/lib/_http/http_parser.dart
+++ b/sdk_nnbd/lib/_http/http_parser.dart
@@ -246,6 +246,8 @@
final List<int> _uriOrReasonPhrase = [];
final List<int> _headerField = [];
final List<int> _headerValue = [];
+ // The limit for method, uriOrReasonPhrase, header field and value
+ int _headerSizeLimit = 8 * 1024;
int _httpVersion = _HttpVersion.UNDETERMINED;
int _transferLength = -1;
@@ -255,9 +257,14 @@
bool _noMessageBody = false;
int _remainingContent = -1;
+ bool _contentLength = false;
+ bool _transferEncoding = false;
_HttpHeaders? _headers;
+ // The limit for parsing chunk size
+ int _chunkSizeLimit = 0x7FFFFFFF;
+
// The current incoming connection.
_HttpIncoming? _incoming;
StreamSubscription<Uint8List>? _socketSubscription;
@@ -429,7 +436,7 @@
if (!_isTokenChar(byte)) {
throw HttpException("Invalid request method");
}
- _method.add(byte);
+ _addWithValidation(_method, byte);
if (!_requestParser) {
throw HttpException("Invalid response line");
}
@@ -455,12 +462,12 @@
} else {
// Did not parse HTTP version. Expect method instead.
for (int i = 0; i < httpVersionIndex; i++) {
- _method.add(_Const.HTTP[i]);
+ _addWithValidation(_method, _Const.HTTP[i]);
}
if (byte == _CharCode.SP) {
_state = _State.REQUEST_LINE_URI;
} else {
- _method.add(byte);
+ _addWithValidation(_method, byte);
_httpVersion = _HttpVersion.UNDETERMINED;
if (!_requestParser) {
throw HttpException("Invalid response line");
@@ -507,7 +514,7 @@
byte == _CharCode.LF) {
throw HttpException("Invalid request method");
}
- _method.add(byte);
+ _addWithValidation(_method, byte);
}
break;
@@ -522,7 +529,7 @@
if (byte == _CharCode.CR || byte == _CharCode.LF) {
throw HttpException("Invalid request, unexpected $byte in URI");
}
- _uriOrReasonPhrase.add(byte);
+ _addWithValidation(_uriOrReasonPhrase, byte);
}
break;
@@ -590,7 +597,7 @@
throw HttpException(
"Invalid response, unexpected $byte in reason phrase");
}
- _uriOrReasonPhrase.add(byte);
+ _addWithValidation(_uriOrReasonPhrase, byte);
}
break;
@@ -613,7 +620,7 @@
_index = _index - 1; // Make the new state see the LF again.
} else {
// Start of new header field.
- _headerField.add(_toLowerCaseByte(byte));
+ _addWithValidation(_headerField, _toLowerCaseByte(byte));
_state = _State.HEADER_FIELD;
}
break;
@@ -625,7 +632,7 @@
if (!_isTokenChar(byte)) {
throw HttpException("Invalid header field name, with $byte");
}
- _headerField.add(_toLowerCaseByte(byte));
+ _addWithValidation(_headerField, _toLowerCaseByte(byte));
}
break;
@@ -636,7 +643,7 @@
_state = _State.HEADER_VALUE_FOLD_OR_END;
} else if (byte != _CharCode.SP && byte != _CharCode.HT) {
// Start of new header value.
- _headerValue.add(byte);
+ _addWithValidation(_headerValue, byte);
_state = _State.HEADER_VALUE;
}
break;
@@ -647,7 +654,7 @@
} else if (byte == _CharCode.LF) {
_state = _State.HEADER_VALUE_FOLD_OR_END;
} else {
- _headerValue.add(byte);
+ _addWithValidation(_headerValue, byte);
}
break;
@@ -662,9 +669,21 @@
} else {
String headerField = new String.fromCharCodes(_headerField);
String headerValue = new String.fromCharCodes(_headerValue);
- if (headerField == HttpHeaders.transferEncodingHeader &&
- _caseInsensitiveCompare("chunked".codeUnits, _headerValue)) {
- _chunked = true;
+ if (headerField == HttpHeaders.contentLengthHeader) {
+ // Content Length header should not have more than one occurance
+ // or coexist with Transfer Encoding header.
+ if (_contentLength || _transferEncoding) {
+ _statusCode = HttpStatus.badRequest;
+ }
+ _contentLength = true;
+ } else if (headerField == HttpHeaders.transferEncodingHeader) {
+ _transferEncoding = true;
+ if (_caseInsensitiveCompare("chunked".codeUnits, _headerValue)) {
+ _chunked = true;
+ }
+ if (_contentLength) {
+ _statusCode = HttpStatus.badRequest;
+ }
}
var headers = _headers!;
if (headerField == HttpHeaders.connectionHeader) {
@@ -680,10 +699,10 @@
(isUpgrade && isResponse && isUpgradeCode)) {
_connectionUpgrade = true;
}
- headers._add(headerField, tokens[i]);
+ headers.add(headerField, tokens[i]);
}
} else {
- headers._add(headerField, headerValue);
+ headers.add(headerField, headerValue);
}
_headerField.clear();
_headerValue.clear();
@@ -695,8 +714,8 @@
_index = _index - 1; // Make the new state see the LF again.
} else {
// Start of new header field.
- _headerField.add(_toLowerCaseByte(byte));
_state = _State.HEADER_FIELD;
+ _addWithValidation(_headerField, _toLowerCaseByte(byte));
}
}
break;
@@ -725,6 +744,10 @@
_state = _State.CHUNK_SIZE_EXTENSION;
} else {
int value = _expectHexDigit(byte);
+ // Checks whether (_remaingingContent * 16 + value) overflows.
+ if (_remainingContent > _chunkSizeLimit >> 4) {
+ throw HttpException('Chunk size overflows the integer');
+ }
_remainingContent = _remainingContent * 16 + value;
}
break;
@@ -924,6 +947,9 @@
_noMessageBody = false;
_remainingContent = -1;
+ _contentLength = false;
+ _transferEncoding = false;
+
_headers = null;
}
@@ -996,6 +1022,48 @@
}
}
+ void _addWithValidation(List<int> list, int byte) {
+ if (list.length < _headerSizeLimit) {
+ list.add(byte);
+ } else {
+ _reportSizeLimitError();
+ }
+ }
+
+ void _reportSizeLimitError() {
+ String method = "";
+ switch (_state) {
+ case _State.START:
+ case _State.METHOD_OR_RESPONSE_HTTP_VERSION:
+ case _State.REQUEST_LINE_METHOD:
+ method = "Method";
+ break;
+
+ case _State.REQUEST_LINE_URI:
+ method = "URI";
+ break;
+
+ case _State.RESPONSE_LINE_REASON_PHRASE:
+ method = "Reason phrase";
+ break;
+
+ case _State.HEADER_START:
+ case _State.HEADER_FIELD:
+ method = "Header field";
+ break;
+
+ case _State.HEADER_VALUE_START:
+ case _State.HEADER_VALUE:
+ method = "Header value";
+ break;
+
+ default:
+ throw UnsupportedError("Unexpected state: $_state");
+ break;
+ }
+ throw HttpException("$method exceeds the $_headerSizeLimit size limit");
+ }
+
_HttpIncoming _createIncoming(int transferLength) {
assert(_incoming == null);
assert(_bodyController == null);
diff --git a/sdk_nnbd/lib/_http/websocket.dart b/sdk_nnbd/lib/_http/websocket.dart
index 5e6ec02..c9c6246 100644
--- a/sdk_nnbd/lib/_http/websocket.dart
+++ b/sdk_nnbd/lib/_http/websocket.dart
@@ -326,11 +326,14 @@
static const int CLOSED = closed;
/**
- * Set and get the interval for sending ping signals. If a ping message is not
- * answered by a pong message from the peer, the `WebSocket` is assumed
- * disconnected and the connection is closed with a
- * [WebSocketStatus.goingAway] close code. When a ping signal is sent, the
- * pong message must be received within [pingInterval].
+ * The interval between ping signals.
+ *
+ * A ping message is sent every [pingInterval], starting at the first
+ * [pingInterval] after a new value has been assigned or a pong message has
+ * been received. If a ping message is not answered by a pong message from the
+ * peer, the `WebSocket` is assumed disconnected and the connection is closed
+ * with a [WebSocketStatus.goingAway] close code. When a ping signal is sent,
+ * the pong message must be received within [pingInterval].
*
* There are never two outstanding pings at any given time, and the next ping
* timer starts when the pong is received.
diff --git a/sdk_nnbd/lib/_http/websocket_impl.dart b/sdk_nnbd/lib/_http/websocket_impl.dart
index 64eb1eb..68d0f29 100644
--- a/sdk_nnbd/lib/_http/websocket_impl.dart
+++ b/sdk_nnbd/lib/_http/websocket_impl.dart
@@ -901,7 +901,7 @@
socket.addStream(stream).then((_) {
_done();
_closeCompleter.complete(webSocket);
- }, onError: (Object error, StackTrace? stackTrace) {
+ }, onError: (Object error, StackTrace stackTrace) {
_closed = true;
_cancel();
if (error is ArgumentError) {
@@ -1144,7 +1144,7 @@
} else {
_controller.add(data);
}
- }, onError: (Object error, StackTrace? stackTrace) {
+ }, onError: (Object error, StackTrace stackTrace) {
_closeTimer?.cancel();
if (error is FormatException) {
_close(WebSocketStatus.invalidFramePayloadData);
@@ -1203,8 +1203,12 @@
if (_writeClosed) return;
_consumer.add(new _WebSocketPing());
_pingTimer = new Timer(interval, () {
+ _closeTimer?.cancel();
// No pong received.
_close(WebSocketStatus.goingAway);
+ _closeCode = _outCloseCode;
+ _closeReason = _outCloseReason;
+ _controller.close();
});
});
}
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart
index dbba91e..64f3983 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart
@@ -196,7 +196,7 @@
}
@patch
-void _rethrow(Object error, StackTrace? stackTrace) {
+void _rethrow(Object error, StackTrace stackTrace) {
JS('', 'throw #', dart.createErrorWithStack(error, stackTrace));
}
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
index 13c2f4c..d2c62cf 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -69,12 +69,8 @@
static bool _is_Object(Object? o) => o != null;
@JSExportName('as')
- static Object _as_Object(Object? o) =>
- o == null ? dart.cast(o, dart.unwrapType(Object), false) : o;
-
- @JSExportName('_check')
- static Object _check_Object(Object? o) =>
- o == null ? dart.cast(o, dart.unwrapType(Object), true) : o;
+ static Object? _as_Object(Object? o) =>
+ o == null ? dart.cast(o, dart.unwrapType(Object)) : o;
}
@patch
@@ -89,14 +85,7 @@
static Object? _as_Null(Object? o) {
// Avoid extra function call to core.Null.is() by manually inlining.
if (o == null) return o;
- return dart.cast(o, dart.unwrapType(Null), false);
- }
-
- @JSExportName('_check')
- static Object? _check_Null(Object? o) {
- // Avoid extra function call to core.Null.is() by manually inlining.
- if (o == null) return o;
- return dart.cast(o, dart.unwrapType(Null), true);
+ return dart.cast(o, dart.unwrapType(Null));
}
}
@@ -135,14 +124,7 @@
static Object? _as_Function(Object? o) {
// Avoid extra function call to core.Function.is() by manually inlining.
if (JS<bool>('!', 'typeof $o == "function"')) return o;
- return dart.cast(o, dart.unwrapType(Function), false);
- }
-
- @JSExportName('_check')
- static Object? _check_Function(Object? o) {
- // Avoid extra function call to core.Function.is() by manually inlining.
- if (JS<bool>('!', 'typeof $o == "function"')) return o;
- return dart.cast(o, dart.unwrapType(Function), true);
+ return dart.cast(o, dart.unwrapType(Function));
}
}
@@ -218,16 +200,7 @@
if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)')) {
return o;
}
- return dart.cast(o, dart.unwrapType(int), false);
- }
-
- @JSExportName('_check')
- static Object? _check_int(Object? o) {
- // Avoid extra function call to core.int.is() by manually inlining.
- if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)')) {
- return o;
- }
- return dart.cast(o, dart.unwrapType(int), true);
+ return dart.cast(o, dart.unwrapType(int));
}
}
@@ -253,14 +226,7 @@
static Object? _as_double(Object? o) {
// Avoid extra function call to core.double.is() by manually inlining.
if (JS<bool>('!', 'typeof $o == "number"')) return o;
- return dart.cast(o, dart.unwrapType(double), false);
- }
-
- @JSExportName('_check')
- static Object? _check_double(Object? o) {
- // Avoid extra function call to core.double.is() by manually inlining.
- if (JS<bool>('!', 'typeof $o == "number"')) return o;
- return dart.cast(o, dart.unwrapType(double), true);
+ return dart.cast(o, dart.unwrapType(double));
}
}
@@ -275,14 +241,7 @@
static Object? _as_num(Object? o) {
// Avoid extra function call to core.num.is() by manually inlining.
if (JS<bool>('!', 'typeof $o == "number"')) return o;
- return dart.cast(o, dart.unwrapType(num), false);
- }
-
- @JSExportName('_check')
- static Object? _check_num(Object? o) {
- // Avoid extra function call to core.num.is() by manually inlining.
- if (JS<bool>('!', 'typeof $o == "number"')) return o;
- return dart.cast(o, dart.unwrapType(num), true);
+ return dart.cast(o, dart.unwrapType(num));
}
}
@@ -672,14 +631,7 @@
static Object? _as_String(Object? o) {
// Avoid extra function call to core.String.is() by manually inlining.
if (JS<bool>('!', 'typeof $o == "string"')) return o;
- return dart.cast(o, dart.unwrapType(String), false);
- }
-
- @JSExportName('_check')
- static Object? _check_String(Object? o) {
- // Avoid extra function call to core.String.is() by manually inlining.
- if (JS<bool>('!', 'typeof $o == "string"')) return o;
- return dart.cast(o, dart.unwrapType(String), true);
+ return dart.cast(o, dart.unwrapType(String));
}
}
@@ -710,14 +662,7 @@
static Object? _as_bool(Object? o) {
// Avoid extra function call to core.bool.is() by manually inlining.
if (JS<bool>("!", '$o === true || $o === false')) return o;
- return dart.cast(o, dart.unwrapType(bool), false);
- }
-
- @JSExportName('_check')
- static Object? _check_bool(Object? o) {
- // Avoid extra function call to core.bool.is() by manually inlining.
- if (JS<bool>("!", '$o === true || $o === false')) return o;
- return dart.cast(o, dart.unwrapType(bool), true);
+ return dart.cast(o, dart.unwrapType(bool));
}
}
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart
index cd854ce..ceee3d4 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart
@@ -404,9 +404,16 @@
}
@patch
- factory InternetAddress(String address) {
+ factory InternetAddress(String address, {InternetAddressType? type}) {
throw UnsupportedError("InternetAddress");
}
+
+ @patch
+ factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {InternetAddressType? type}) {
+ throw new UnsupportedError("InternetAddress.fromRawAddress");
+ }
+
@patch
static Future<List<InternetAddress>> lookup(String host,
{InternetAddressType type = InternetAddressType.any}) {
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
index 48d41f9..bb58063 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
@@ -551,16 +551,7 @@
'',
'''#.as = function as_C(obj) {
if (obj != null && obj[#]) return obj;
- return #(obj, this, false);
- }''',
- ctor,
- isClass,
- cast);
- JS(
- '',
- '''#._check = function check_C(obj) {
- if (obj != null && obj[#]) return obj;
- return #(obj, this, true);
+ return #(obj, this);
}''',
ctor,
isClass,
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
index 0d62265..5696d69 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
@@ -56,30 +56,30 @@
throw NoSuchMethodError(null, Symbol('<Unexpected Null Value>'), null, null);
}
-castError(obj, expectedType, [@notNull bool isImplicit = false]) {
+castError(obj, expectedType) {
var actualType = getReifiedType(obj);
var message = _castErrorMessage(actualType, expectedType);
- var error = isImplicit ? TypeErrorImpl(message) : CastErrorImpl(message);
- throw error;
+ throw TypeErrorImpl(message);
}
String _castErrorMessage(from, to) {
// If both types are generic classes, see if we can infer generic type
// arguments for `from` that would allow the subtype relation to work.
- var fromClass = getGenericClass(from);
- if (fromClass != null) {
- var fromTypeFormals = getGenericTypeFormals(fromClass);
- var fromType = instantiateClass(fromClass, fromTypeFormals);
- var inferrer = _TypeInferrer(fromTypeFormals);
- if (inferrer.trySubtypeMatch(fromType, to)) {
- var inferredTypes = inferrer.getInferredTypes();
- if (inferredTypes != null) {
- var inferred = instantiateClass(fromClass, inferredTypes);
- return "Type '${typeName(from)}' should be '${typeName(inferred)}' "
- "to implement expected type '${typeName(to)}'.";
- }
- }
- }
+ // TODO(#40326) Fix suggested type or remove this code if no longer needed.
+ // var fromClass = getGenericClass(from);
+ // if (fromClass != null) {
+ // var fromTypeFormals = getGenericTypeFormals(fromClass);
+ // var fromType = instantiateClass(fromClass, fromTypeFormals);
+ // var inferrer = _TypeInferrer(fromTypeFormals);
+ // if (inferrer.trySubtypeMatch(fromType, to)) {
+ // var inferredTypes = inferrer.getInferredTypes();
+ // if (inferredTypes != null) {
+ // var inferred = instantiateClass(fromClass, inferredTypes);
+ // return "Type '${typeName(from)}' should be '${typeName(inferred)}' "
+ // "to implement expected type '${typeName(to)}'.";
+ // }
+ // }
+ // }
return "Expected a value of type '${typeName(to)}', "
"but got one of type '${typeName(from)}'";
}
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
index 12a41a0..20555fb 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
@@ -130,7 +130,7 @@
if (f != null) {
var setterType = getSetterType(getType(obj), f);
if (setterType != null) {
- return JS('', '#[#] = #._check(#)', obj, f, setterType, value);
+ return JS('', '#[#] = #.as(#)', obj, f, setterType, value);
}
// Always allow for JS interop objects.
if (isJsInterop(obj)) return JS('', '#[#] = #', obj, f, value);
@@ -194,14 +194,14 @@
}
// Now that we know the signature matches, we can perform type checks.
for (var i = 0; i < requiredCount; ++i) {
- JS('', '#[#]._check(#[#])', required, i, actuals, i);
+ JS('', '#[#].as(#[#])', required, i, actuals, i);
}
for (var i = 0; i < extras; ++i) {
- JS('', '#[#]._check(#[#])', optionals, i, actuals, i + requiredCount);
+ JS('', '#[#].as(#[#])', optionals, i, actuals, i + requiredCount);
}
if (names != null) {
for (var name in names) {
- JS('', '(#[#] || #[#])._check(#[#])', named, name, requiredNamed, name,
+ JS('', '(#[#] || #[#]).as(#[#])', named, name, requiredNamed, name,
namedActuals, name);
}
}
@@ -427,7 +427,7 @@
/// directly on types, but any query that requires checking subtyping relations
/// is handled here.
@JSExportName('as')
-cast(obj, type, @notNull bool isImplicit) {
+cast(obj, type) {
// We hoist the common case where null is checked against another type here
// for better performance.
if (obj == null && !_strictSubtypeChecks) {
@@ -439,7 +439,7 @@
if (isSubtypeOf(actual, type)) return obj;
}
- return castError(obj, type, isImplicit);
+ return castError(obj, type);
}
bool test(bool? obj) {
@@ -455,7 +455,7 @@
void _throwBooleanConversionError() => throw BooleanConversionAssertionError();
void booleanConversionFailed(obj) {
- var actual = typeName(getReifiedType(test(obj)));
+ var actual = typeName(getReifiedType(obj));
throw TypeErrorImpl("type '$actual' is not a 'bool' in boolean expression");
}
@@ -466,7 +466,7 @@
_nullWarnOnType(JS('', '#', int));
return null;
} else {
- castError(obj, JS('', '#', int), false);
+ castError(obj, JS('', '#', int));
}
}
return obj;
@@ -493,12 +493,12 @@
/// or emits a runtime warning (otherwise). This is only used by the
/// compiler when casting from nullable to non-nullable variants of the
/// same type.
-nullCast(x, type, [@notNull bool isImplicit = false]) {
+nullCast(x, type) {
if (x == null) {
if (!_strictSubtypeChecks) {
_nullWarnOnType(type);
} else {
- castError(x, type, isImplicit);
+ castError(x, type);
}
}
return x;
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index d424a31..d71922a 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -54,10 +54,9 @@
///
/// T.is(o): Implements 'o is T'.
/// T.as(o): Implements 'o as T'.
-/// T._check(o): Implements the type assertion of 'T x = o;'
///
/// By convention, we used named JavaScript functions for these methods with the
-/// name 'is_X', 'as_X' and 'check_X' for various X to indicate the type or the
+/// name 'is_X' and 'as_X' for various X to indicate the type or the
/// implementation strategy for the test (e.g 'is_String', 'is_G' for generic
/// types, etc.)
// TODO(jmesserly): we shouldn't implement Type here. It should be moved down
@@ -71,10 +70,7 @@
bool is_T(object) => instanceOf(object, this);
@JSExportName('as')
- as_T(object) => cast(object, this, false);
-
- @JSExportName('_check')
- check_T(object) => cast(object, this, true);
+ as_T(object) => cast(object, this);
DartType() {
// Every instance of a DartType requires a set of type caches.
@@ -91,9 +87,6 @@
@JSExportName('as')
Object? as_T(Object? object) => object;
-
- @JSExportName('_check')
- Object? check_T(Object? object) => object;
}
@notNull
@@ -119,10 +112,10 @@
Expando<Function> _assertInteropExpando = Expando<Function>();
@NoReifyGeneric()
-F tearoffInterop<F extends Function>(F f) {
+F tearoffInterop<F extends Function?>(F f) {
// Wrap a JS function with a closure that ensures all function arguments are
// native JS functions.
- if (!_isJsObject(f)) return f;
+ if (!_isJsObject(f) || f == null) return f;
var ret = _assertInteropExpando[f];
if (ret == null) {
ret = JS(
@@ -194,10 +187,7 @@
bool is_T(obj) => isRawJSType(obj) || instanceOf(obj, this);
@JSExportName('as')
- as_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this, false);
-
- @JSExportName('_check')
- check_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this, true);
+ as_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this);
}
/// An anonymous JS type
@@ -212,10 +202,7 @@
bool is_T(obj) => _isJsObject(obj) || instanceOf(obj, this);
@JSExportName('as')
- as_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this, false);
-
- @JSExportName('_check')
- check_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this, true);
+ as_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this);
}
void _warn(arg) {
@@ -362,12 +349,7 @@
@JSExportName('as')
as_T(obj) => obj == null || JS<bool>('!', '#.is(#)', type, obj)
? obj
- : cast(obj, this, false);
-
- @JSExportName('_check')
- check_T(obj) => obj == null || JS<bool>('!', '#.is(#)', type, obj)
- ? obj
- : cast(obj, this, true);
+ : cast(obj, this);
}
/// A wrapper to identify a legacy (star, *) type of the form [type]*.
@@ -395,15 +377,10 @@
@JSExportName('as')
as_T(obj) => obj == null || JS<bool>('!', '#.is(#)', type, obj)
? obj
- : cast(obj, this, false);
-
- @JSExportName('_check')
- check_T(obj) => obj == null || JS<bool>('!', '#.is(#)', type, obj)
- ? obj
- : cast(obj, this, true);
+ : cast(obj, this);
}
-// TODO(nshahan) Add override optimizations for is, as and _check?
+// TODO(nshahan) Add override optimizations for is and as?
class NeverType extends DartType {
@override
toString() => 'Never';
@@ -424,9 +401,6 @@
@JSExportName('as')
Object? as_T(Object? object) => object;
-
- @JSExportName('_check')
- Object? check_T(Object? object) => object;
}
@JSExportName('void')
@@ -786,7 +760,8 @@
var typeNameString = typeName(JS('', '#[#[#]]', named, names, i));
buffer += '$typeNameString ${JS('', '#[#]', names, i)}';
}
- if (JS('!', 'Object.keys(#).length > 0', requiredNamed)) buffer += ', ';
+ if (JS('!', 'Object.keys(#).length > 0 && #.length > 0', requiredNamed,
+ names)) buffer += ', ';
names = getOwnPropertyNames(requiredNamed);
JS('', '#.sort()', names);
for (var i = 0; JS<bool>('!', '# < #.length', i, names); i++) {
@@ -817,7 +792,7 @@
}
@JSExportName('as')
- as_T(obj, [@notNull bool isImplicit = false]) {
+ as_T(obj) {
if (JS('!', 'typeof # == "function"', obj)) {
var actual = JS('', '#[#]', obj, _runtimeType);
// If there's no actual type, it's a JS function.
@@ -826,11 +801,8 @@
return obj;
}
}
- return castError(obj, this, isImplicit);
+ return castError(obj, this);
}
-
- @JSExportName('_check')
- check_T(obj) => as_T(obj, true);
}
/// A type variable, used by [GenericFunctionType] to represent a type formal.
@@ -1047,13 +1019,7 @@
@JSExportName('as')
as_T(obj) {
if (is_T(obj)) return obj;
- return castError(obj, this, false);
- }
-
- @JSExportName('_check')
- check_T(obj) {
- if (is_T(obj)) return obj;
- return castError(obj, this, true);
+ return castError(obj, this);
}
}
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/foreign_helper.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/foreign_helper.dart
index 357047e..7f11505 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/foreign_helper.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/foreign_helper.dart
@@ -106,7 +106,7 @@
*/
// Add additional optional arguments if needed. The method is treated internally
// as a variable argument method.
-T JS<T extends Object?>(String typeDescription, String codeTemplate,
+external T JS<T extends Object?>(String typeDescription, String codeTemplate,
[arg0,
arg1,
arg2,
@@ -126,7 +126,7 @@
arg16,
arg17,
arg18,
- arg19]) {}
+ arg19]);
/// Annotates the compiled Js name for fields and methods.
/// Similar behaviour to `JS` from `package:js/js.dart` (but usable from runtime
@@ -159,73 +159,73 @@
/**
* Returns the prefix used for generated is checks on classes.
*/
-String JS_OPERATOR_IS_PREFIX() {}
+external String JS_OPERATOR_IS_PREFIX();
/**
* Returns the prefix used for generated type argument substitutions on classes.
*/
-String JS_OPERATOR_AS_PREFIX() {}
+external String JS_OPERATOR_AS_PREFIX();
/// Returns the name of the class `Object` in the generated code.
-String JS_OBJECT_CLASS_NAME() {}
+external String JS_OBJECT_CLASS_NAME();
/// Returns the name of the class `Null` in the generated code.
-String JS_NULL_CLASS_NAME() {}
+external String JS_NULL_CLASS_NAME();
/// Returns the name of the class `Function` in the generated code.
-String JS_FUNCTION_CLASS_NAME() {}
+external String JS_FUNCTION_CLASS_NAME();
/**
* Returns the field name used for determining if an object or its
* interceptor has JavaScript indexing behavior.
*/
-String JS_IS_INDEXABLE_FIELD_NAME() {}
+external String JS_IS_INDEXABLE_FIELD_NAME();
/// Returns the name used for generated function types on classes and methods.
-String JS_SIGNATURE_NAME() {}
+external String JS_SIGNATURE_NAME();
/// Returns the name used to tag typedefs.
-String JS_TYPEDEF_TAG() {}
+external String JS_TYPEDEF_TAG();
/// Returns the name used to tag function type representations in JavaScript.
-String JS_FUNCTION_TYPE_TAG() {}
+external String JS_FUNCTION_TYPE_TAG();
/**
* Returns the name used to tag void return in function type representations
* in JavaScript.
*/
-String JS_FUNCTION_TYPE_VOID_RETURN_TAG() {}
+external String JS_FUNCTION_TYPE_VOID_RETURN_TAG();
/**
* Returns the name used to tag return types in function type representations
* in JavaScript.
*/
-String JS_FUNCTION_TYPE_RETURN_TYPE_TAG() {}
+external String JS_FUNCTION_TYPE_RETURN_TYPE_TAG();
/**
* Returns the name used to tag required parameters in function type
* representations in JavaScript.
*/
-String JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG() {}
+external String JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG();
/**
* Returns the name used to tag optional parameters in function type
* representations in JavaScript.
*/
-String JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG() {}
+external String JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG();
/**
* Returns the name used to tag named parameters in function type
* representations in JavaScript.
*/
-String JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG() {}
+external String JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG();
/// Returns the JS name for [name] from the Namer.
-String JS_GET_NAME(String name) {}
+external String JS_GET_NAME(String name);
/// Returns the state of a flag that is determined by the state of the compiler
/// when the program has been analyzed.
-bool JS_GET_FLAG(String name) {}
+external bool JS_GET_FLAG(String name);
/**
* Pretend [code] is executed. Generates no executable code. This is used to
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart
index 15f64ac..dfc4707 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart
@@ -203,7 +203,8 @@
}
}
- void completeError(e, [st]) {
+ void completeError(Object e, [StackTrace? st]) {
+ st ??= AsyncError.defaultStackTrace(e);
if (isSync) {
_future._completeError(e, st);
} else {
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart
index 347b20b..0f673d8 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart
@@ -54,7 +54,7 @@
String toString() => MapBase.mapToString(this);
- static void _throwUnmodifiable() {
+ static Never _throwUnmodifiable() {
throw new UnsupportedError('Cannot modify unmodifiable Map');
}
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart
index a6121c9..da7ebc7 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart
@@ -404,9 +404,16 @@
}
@patch
- factory InternetAddress(String address) {
+ factory InternetAddress(String address, {InternetAddressType? type}) {
throw new UnsupportedError("InternetAddress");
}
+
+ @patch
+ factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {InternetAddressType? type}) {
+ throw new UnsupportedError("InternetAddress.fromRawAddress");
+ }
+
@patch
static Future<List<InternetAddress>> lookup(String host,
{InternetAddressType type: InternetAddressType.any}) {
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
index 0a8a274..36a0510 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
@@ -2696,6 +2696,7 @@
return JS('String', '#', name);
}
}
+ throw new ArgumentError("Field name $fieldName not found.");
}
}
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/js_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/js_patch.dart
index 99f9016..1ff2e55 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/js_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/js_patch.dart
@@ -14,7 +14,7 @@
@patch
JsObject get context => _context;
-final JsObject _context = _wrapToDart(JS('', 'self'));
+final JsObject _context = _castToJsObject(_wrapToDart(JS('', 'self')));
_convertDartFunction(Function f, {bool captureThis: false}) {
return JS(
@@ -54,37 +54,39 @@
factory JsObject(JsFunction constructor, [List? arguments]) {
var ctor = _convertToJS(constructor);
if (arguments == null) {
- return _wrapToDart(JS('', 'new #()', ctor));
+ return _castToJsObject(_wrapToDart(JS('', 'new #()', ctor)));
}
if (JS('bool', '# instanceof Array', arguments)) {
int argumentCount = JS('int', '#.length', arguments);
switch (argumentCount) {
case 0:
- return _wrapToDart(JS('', 'new #()', ctor));
+ return _castToJsObject(_wrapToDart(JS('', 'new #()', ctor)));
case 1:
var arg0 = _convertToJS(JS('', '#[0]', arguments));
- return _wrapToDart(JS('', 'new #(#)', ctor, arg0));
+ return _castToJsObject(_wrapToDart(JS('', 'new #(#)', ctor, arg0)));
case 2:
var arg0 = _convertToJS(JS('', '#[0]', arguments));
var arg1 = _convertToJS(JS('', '#[1]', arguments));
- return _wrapToDart(JS('', 'new #(#, #)', ctor, arg0, arg1));
+ return _castToJsObject(
+ _wrapToDart(JS('', 'new #(#, #)', ctor, arg0, arg1)));
case 3:
var arg0 = _convertToJS(JS('', '#[0]', arguments));
var arg1 = _convertToJS(JS('', '#[1]', arguments));
var arg2 = _convertToJS(JS('', '#[2]', arguments));
- return _wrapToDart(JS('', 'new #(#, #, #)', ctor, arg0, arg1, arg2));
+ return _castToJsObject(
+ _wrapToDart(JS('', 'new #(#, #, #)', ctor, arg0, arg1, arg2)));
case 4:
var arg0 = _convertToJS(JS('', '#[0]', arguments));
var arg1 = _convertToJS(JS('', '#[1]', arguments));
var arg2 = _convertToJS(JS('', '#[2]', arguments));
var arg3 = _convertToJS(JS('', '#[3]', arguments));
- return _wrapToDart(
- JS('', 'new #(#, #, #, #)', ctor, arg0, arg1, arg2, arg3));
+ return _castToJsObject(_wrapToDart(
+ JS('', 'new #(#, #, #, #)', ctor, arg0, arg1, arg2, arg3)));
}
}
@@ -103,7 +105,7 @@
// object for which there is an interceptor
var jsObj = JS('', 'new #()', factoryFunction);
- return _wrapToDart(jsObj);
+ return _castToJsObject(_wrapToDart(jsObj));
// TODO(sra): Investigate:
//
@@ -118,7 +120,7 @@
if (object is num || object is String || object is bool || object == null) {
throw ArgumentError("object cannot be a num, string, bool, or null");
}
- return _wrapToDart(_convertToJS(object));
+ return _castToJsObject(_wrapToDart(_convertToJS(object)));
}
@patch
@@ -126,7 +128,7 @@
if ((object is! Map) && (object is! Iterable)) {
throw ArgumentError("object must be a Map or Iterable");
}
- return _wrapToDart(_convertDataTree(object));
+ return _castToJsObject(_wrapToDart(_convertDataTree(object)));
}
static _convertDataTree(Object data) {
@@ -367,6 +369,9 @@
const _JS_FUNCTION_PROPERTY_NAME = r'$dart_jsFunction';
const _JS_FUNCTION_PROPERTY_NAME_CAPTURE_THIS = r'_$dart_jsFunctionCaptureThis';
+@pragma('dart2js:tryInline')
+JsObject _castToJsObject(o) => JS<JsObject>('', '#', o);
+
bool _defineProperty(o, String name, value) {
try {
if (_isExtensible(o) &&
@@ -445,7 +450,7 @@
// converts a Dart object to a reference to a native JS object
// which might be a DartObject JS->Dart proxy
-Object _convertToDart(o) {
+Object? _convertToDart(o) {
if (JS('bool', '# == null', o) ||
JS('bool', 'typeof # == "string"', o) ||
JS('bool', 'typeof # == "number"', o) ||
@@ -465,7 +470,7 @@
}
}
-JsObject _wrapToDart(o) {
+Object _wrapToDart(o) {
if (JS('bool', 'typeof # == "function"', o)) {
return _getDartProxy(
o, DART_CLOSURE_PROPERTY_NAME, (o) => JsFunction._fromJs(o));
@@ -478,8 +483,8 @@
o, _DART_OBJECT_PROPERTY_NAME, (o) => JsObject._fromJs(o));
}
-JsObject _getDartProxy(o, String propertyName, JsObject createProxy(o)) {
- var dartProxy = _getOwnProperty(o, propertyName) as JsObject;
+Object _getDartProxy(o, String propertyName, JsObject createProxy(o)) {
+ var dartProxy = _getOwnProperty(o, propertyName);
// Temporary fix for dartbug.com/15193
// In some cases it's possible to see a JavaScript object that
// came from a different context and was previously proxied to
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
index 690efb3..a3494f2 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
@@ -53,12 +53,6 @@
@pragma('dart2js:noElision')
dynamic _as;
- /// JavaScript method for type check. The method is called from generated
- /// code, e.g. parameter check for `T param` generates something like
- /// `rtiForT._check(param)`.
- @pragma('dart2js:noElision')
- dynamic _check;
-
/// JavaScript method for 'is' test. The method is called from generated
/// code, e.g. `o is T` generates something like `rtiForT._is(o)`.
@pragma('dart2js:noElision')
@@ -68,10 +62,6 @@
rti._as = fn;
}
- static void _setTypeCheckFunction(Rti rti, fn) {
- rti._check = fn;
- }
-
static void _setIsTestFunction(Rti rti, fn) {
rti._is = fn;
}
@@ -835,12 +825,10 @@
if (isObjectType(testRti)) {
isFn = RAW_DART_FUNCTION_REF(_isObject);
Rti._setAsCheckFunction(testRti, RAW_DART_FUNCTION_REF(_asObject));
- Rti._setTypeCheckFunction(testRti, RAW_DART_FUNCTION_REF(_checkObject));
} else if (isTopType(testRti)) {
isFn = RAW_DART_FUNCTION_REF(_isTop);
var asFn = RAW_DART_FUNCTION_REF(_asTop);
Rti._setAsCheckFunction(testRti, asFn);
- Rti._setTypeCheckFunction(testRti, asFn);
} else if (_Utils.isIdentical(testRti, TYPE_REF<int>())) {
isFn = RAW_DART_FUNCTION_REF(_isInt);
} else if (_Utils.isIdentical(testRti, TYPE_REF<double>())) {
@@ -921,23 +909,6 @@
Rti objectRti = instanceOrFunctionType(object, testRti);
String message =
_Error.compose(object, objectRti, _rtiToString(testRti, null));
- throw _CastError.fromMessage(message);
-}
-
-/// Called from generated code.
-_generalTypeCheckImplementation(object) {
- // This static method is installed on an Rti object as a JavaScript instance
- // method. The Rti object is 'this'.
- Rti testRti = _castToRti(JS('', 'this'));
- if (object == null) {
- if (JS_GET_FLAG('LEGACY') || isNullable(testRti)) return object;
- } else {
- if (Rti._isCheck(testRti, object)) return object;
- }
-
- Rti objectRti = instanceOrFunctionType(object, testRti);
- String message =
- _Error.compose(object, objectRti, _rtiToString(testRti, null));
throw _TypeError.fromMessage(message);
}
@@ -950,7 +921,7 @@
throw _TypeError.fromMessage(message);
}
-/// Base class to _CastError and _TypeError.
+/// Base class to _TypeError.
class _Error extends Error {
final String _message;
_Error(this._message);
@@ -968,14 +939,6 @@
String toString() => _message;
}
-class _CastError extends _Error implements CastError, TypeError {
- _CastError.fromMessage(String message) : super('TypeError: $message');
-
- factory _CastError.forType(object, String type) {
- return _CastError.fromMessage(_Error.compose(object, null, type));
- }
-}
-
class _TypeError extends _Error implements TypeError, CastError {
_TypeError.fromMessage(String message) : super('TypeError: $message');
@@ -989,7 +952,7 @@
// Specializations.
//
-// Specializations can be placed on Rti objects as the _as, _check and _is
+// Specializations can be placed on Rti objects as the _as and _is
// 'methods'. They can also be called directly called from generated code.
/// Specialization for 'is Object'.
@@ -1002,13 +965,6 @@
/// Called from generated code via Rti `_as` method.
dynamic _asObject(object) {
if (JS_GET_FLAG('LEGACY') || object != null) return object;
- throw _CastError.forType(object, 'Object');
-}
-
-/// Specialization for check on 'Object'.
-/// Called from generated code via Rti `_check` method.
-dynamic _checkObject(object) {
- if (JS_GET_FLAG('LEGACY') || object != null) return object;
throw _TypeError.forType(object, 'Object');
}
@@ -1019,7 +975,7 @@
}
/// Specialization for 'as dynamic' and other top types.
-/// Called from generated code via Rti `_as` and `_check` methods.
+/// Called from generated code via Rti `_as` methods.
dynamic _asTop(object) {
return object;
}
@@ -1035,14 +991,6 @@
bool? _asBoolNullable(object) {
if (_isBool(object)) return _Utils.asBool(object);
if (object == null) return object;
- throw _CastError.forType(object, 'bool');
-}
-
-/// Specialization for check on 'bool?'.
-/// Called from generated code.
-bool? _checkBoolNullable(object) {
- if (_isBool(object)) return _Utils.asBool(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'bool');
}
@@ -1051,14 +999,6 @@
double? _asDoubleNullable(object) {
if (_isNum(object)) return _Utils.asDouble(object);
if (object == null) return object;
- throw _CastError.forType(object, 'double');
-}
-
-/// Specialization for check on 'double?'.
-/// Called from generated code.
-double? _checkDoubleNullable(object) {
- if (_isNum(object)) return _Utils.asDouble(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'double');
}
@@ -1074,14 +1014,6 @@
int? _asIntNullable(object) {
if (_isInt(object)) return _Utils.asInt(object);
if (object == null) return object;
- throw _CastError.forType(object, 'int');
-}
-
-/// Specialization for check on 'int?'.
-/// Called from generated code.
-int? _checkIntNullable(object) {
- if (_isInt(object)) return _Utils.asInt(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'int');
}
@@ -1096,14 +1028,6 @@
num? _asNumNullable(object) {
if (_isNum(object)) return _Utils.asNum(object);
if (object == null) return object;
- throw _CastError.forType(object, 'num');
-}
-
-/// Specialization for check on 'num?'.
-/// Called from generated code.
-num? _checkNumNullable(object) {
- if (_isNum(object)) return _Utils.asNum(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'num');
}
@@ -1118,14 +1042,6 @@
String? _asStringNullable(object) {
if (_isString(object)) return _Utils.asString(object);
if (object == null) return object;
- throw _CastError.forType(object, 'String');
-}
-
-/// Specialization for check on 'String?'.
-/// Called from generated code.
-String? _checkStringNullable(object) {
- if (_isString(object)) return _Utils.asString(object);
- if (object == null) return object;
throw _TypeError.forType(object, 'String');
}
@@ -1594,15 +1510,12 @@
}
static Rti _installTypeTests(Object universe, Rti rti) {
- // Set up methods to perform type tests. The general as-check / type-check
- // methods use the is-test method. The is-test method on first use
- // overwrites itself, and possibly the as-check / type-check methods, with a
- // specialized version.
- var checkFn = RAW_DART_FUNCTION_REF(_generalTypeCheckImplementation);
+ // Set up methods to perform type tests. The general as-check methods use
+ // the is-test method. The is-test method on first use overwrites itself,
+ // and possibly the as-check methods, with a specialized version.
var asFn = RAW_DART_FUNCTION_REF(_generalAsCheckImplementation);
var isFn = RAW_DART_FUNCTION_REF(_installSpecializedIsTest);
Rti._setAsCheckFunction(rti, asFn);
- Rti._setTypeCheckFunction(rti, checkFn);
Rti._setIsTestFunction(rti, isFn);
return rti;
}
diff --git a/sdk_nnbd/lib/_internal/vm/bin/file_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/file_patch.dart
index 8c50129..354f809 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/file_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/file_patch.dart
@@ -193,7 +193,7 @@
// Called when a watcher is no longer needed.
void _doneWatcher() {}
// Called when a new path is being watched.
- Stream _pathWatched() {}
+ Stream _pathWatched();
// Called when a path is no longer being watched.
void _donePathWatched() {}
diff --git a/sdk_nnbd/lib/_internal/vm/bin/process_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/process_patch.dart
index 2df7ef9..467bdc6 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/process_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/process_patch.dart
@@ -76,7 +76,7 @@
@patch
static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.sigterm]) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(signal, "signal");
return _ProcessUtils._killPid(pid, signal._signalNumber);
}
@@ -216,7 +216,7 @@
bool runInShell,
this._mode)
: super() {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(path, "path");
ArgumentError.checkNotNull(arguments, "arguments");
for (int i = 0; i < arguments.length; i++) {
@@ -518,7 +518,7 @@
_exitCode?.future ?? (throw StateError("Process is detached"));
bool kill([ProcessSignal signal = ProcessSignal.sigterm]) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(kill, "kill");
assert(_started);
if (_ended) return false;
diff --git a/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart
index 8b5638d..8a954e8 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart
@@ -68,8 +68,14 @@
}
@patch
- factory InternetAddress(String address) {
- return new _InternetAddress.parse(address);
+ factory InternetAddress(String address, {InternetAddressType? type}) {
+ return _InternetAddress.fromString(address, type: type);
+ }
+
+ @patch
+ factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {InternetAddressType? type}) {
+ return _InternetAddress.fromRawAddress(rawAddress, type: type);
}
@patch
@@ -107,7 +113,7 @@
}
void _throwOnBadPort(int port) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(port, "port");
if ((port < 0) || (port > 0xFFFF)) {
throw new ArgumentError("Invalid port $port");
@@ -115,7 +121,7 @@
}
void _throwOnBadTtl(int ttl) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(ttl, "ttl");
if (ttl < 1 || ttl > 255) {
throw new ArgumentError('Invalid ttl $ttl');
@@ -141,10 +147,7 @@
final String? _host;
final Uint8List _in_addr;
final int _scope_id;
-
- InternetAddressType get type => _in_addr.length == _IPv4AddrLength
- ? InternetAddressType.IPv4
- : InternetAddressType.IPv6;
+ final InternetAddressType type;
String get host => _host ?? address;
@@ -160,7 +163,11 @@
if (_in_addr[i] != 0) return false;
}
return _in_addr[_IPv6AddrLength - 1] == 1;
+
+ case InternetAddressType.unix:
+ return false;
}
+ throw new UnsupportedError("Unexpected address type $type");
}
bool get isLinkLocal {
@@ -172,7 +179,11 @@
case InternetAddressType.IPv6:
// Checking for fe80::/10.
return _in_addr[0] == 0xFE && (_in_addr[1] & 0xB0) == 0x80;
+
+ case InternetAddressType.unix:
+ return false;
}
+ throw new UnsupportedError("Unexpected address type $type");
}
bool get isMulticast {
@@ -184,56 +195,102 @@
case InternetAddressType.IPv6:
// Checking for ff00::/8.
return _in_addr[0] == 0xFF;
+
+ case InternetAddressType.unix:
+ return false;
+ }
+ throw new UnsupportedError("Unexpected address type $type");
+ }
+
+ Future<InternetAddress> reverse() {
+ if (type == InternetAddressType.unix) {
+ return Future.value(this);
+ }
+ return _NativeSocket.reverseLookup(this);
+ }
+
+ _InternetAddress(this.type, this.address, this._host, this._in_addr,
+ [this._scope_id = 0]);
+
+ factory _InternetAddress.fromString(String address,
+ {InternetAddressType? type}) {
+ // TODO(40614): Remove once non-nullability is sound.
+ ArgumentError.checkNotNull(address, 'address');
+ if (type == InternetAddressType.unix) {
+ var rawAddress = FileSystemEntity._toUtf8Array(address);
+ return _InternetAddress(
+ InternetAddressType.unix, address, null, rawAddress);
+ } else {
+ var in_addr = _parse(address);
+ if (in_addr == null) {
+ throw ArgumentError("Invalid internet address $address");
+ }
+ InternetAddressType type = in_addr.length == _IPv4AddrLength
+ ? InternetAddressType.IPv4
+ : InternetAddressType.IPv6;
+ return _InternetAddress(type, address, null, in_addr);
}
}
- Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this);
-
- _InternetAddress(this.address, this._host, this._in_addr,
- [this._scope_id = 0]);
-
- factory _InternetAddress.parse(String address) {
- // TODO: Remove once non-nullability is sound.
- ArgumentError.checkNotNull(address, "address");
- var in_addr = _parse(address);
- if (in_addr == null) {
- throw new ArgumentError("Invalid internet address $address");
+ factory _InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {InternetAddressType? type}) {
+ if (type == InternetAddressType.unix) {
+ ArgumentError.checkNotNull(rawAddress, 'rawAddress');
+ var rawPath = FileSystemEntity._toNullTerminatedUtf8Array(rawAddress);
+ var address = FileSystemEntity._toStringFromUtf8Array(rawAddress);
+ return _InternetAddress(InternetAddressType.unix, address, null, rawPath);
+ } else {
+ int type = -1;
+ if (rawAddress.length == _IPv4AddrLength) {
+ type = 0;
+ } else {
+ if (rawAddress.length != _IPv6AddrLength) {
+ throw ArgumentError("Invalid internet address ${rawAddress}");
+ }
+ type = 1;
+ }
+ var address = _rawAddrToString(rawAddress);
+ return _InternetAddress(
+ InternetAddressType._from(type), address, null, rawAddress);
}
- return new _InternetAddress(address, null, in_addr);
}
factory _InternetAddress.fixed(int id) {
switch (id) {
case _addressLoopbackIPv4:
- var in_addr = new Uint8List(_IPv4AddrLength);
+ var in_addr = Uint8List(_IPv4AddrLength);
in_addr[0] = 127;
in_addr[_IPv4AddrLength - 1] = 1;
- return new _InternetAddress("127.0.0.1", null, in_addr);
+ return _InternetAddress(
+ InternetAddressType.IPv4, "127.0.0.1", null, in_addr);
case _addressLoopbackIPv6:
- var in_addr = new Uint8List(_IPv6AddrLength);
+ var in_addr = Uint8List(_IPv6AddrLength);
in_addr[_IPv6AddrLength - 1] = 1;
- return new _InternetAddress("::1", null, in_addr);
+ return _InternetAddress(InternetAddressType.IPv6, "::1", null, in_addr);
case _addressAnyIPv4:
- var in_addr = new Uint8List(_IPv4AddrLength);
- return new _InternetAddress("0.0.0.0", "0.0.0.0", in_addr);
+ var in_addr = Uint8List(_IPv4AddrLength);
+ return _InternetAddress(
+ InternetAddressType.IPv4, "0.0.0.0", "0.0.0.0", in_addr);
case _addressAnyIPv6:
- var in_addr = new Uint8List(_IPv6AddrLength);
- return new _InternetAddress("::", "::", in_addr);
+ var in_addr = Uint8List(_IPv6AddrLength);
+ return _InternetAddress(InternetAddressType.IPv6, "::", "::", in_addr);
default:
assert(false);
- throw new ArgumentError();
+ throw ArgumentError();
}
}
// Create a clone of this _InternetAddress replacing the host.
_InternetAddress _cloneWithNewHost(String host) {
- return new _InternetAddress(
- address, host, new Uint8List.fromList(_in_addr));
+ return _InternetAddress(type, address, host, Uint8List.fromList(_in_addr));
}
bool operator ==(other) {
if (!(other is _InternetAddress)) return false;
if (other.type != type) return false;
+ if (type == InternetAddressType.unix) {
+ return address == other.address;
+ }
bool equals = true;
for (int i = 0; i < _in_addr.length && equals; i++) {
equals = other._in_addr[i] == _in_addr[i];
@@ -242,6 +299,9 @@
}
int get hashCode {
+ if (type == InternetAddressType.unix) {
+ return address.hashCode;
+ }
int result = 1;
for (int i = 0; i < _in_addr.length; i++) {
result = (result * 31 + _in_addr[i]) & 0x3FFFFFFF;
@@ -253,6 +313,9 @@
return "InternetAddress('$address', ${type.name})";
}
+ static String _rawAddrToString(Uint8List address)
+ native "InternetAddress_RawAddrToString";
+
static Uint8List? _parse(String address) native "InternetAddress_Parse";
}
@@ -394,8 +457,8 @@
throw createError(response, "Failed host lookup: '$host'");
} else {
return response.skip(1).map<InternetAddress>((result) {
- var type = new InternetAddressType._from(result[0]);
- return new _InternetAddress(result[1], host, result[2], result[3]);
+ var type = InternetAddressType._from(result[0]);
+ return _InternetAddress(type, result[1], host, result[2], result[3]);
}).toList();
}
});
@@ -423,10 +486,10 @@
} else {
var map = response.skip(1).fold(new Map<String, NetworkInterface>(),
(map, result) {
- var type = new InternetAddressType._from(result[0]);
+ var type = InternetAddressType._from(result[0]);
var name = result[3];
var index = result[4];
- var address = new _InternetAddress(result[1], "", result[2]);
+ var address = _InternetAddress(type, result[1], "", result[2]);
if (!includeLinkLocal && address.isLinkLocal) return map;
if (!includeLoopback && address.isLoopback) return map;
map.putIfAbsent(name, () => new _NetworkInterface(name, index));
@@ -505,12 +568,23 @@
socket.localAddress = address;
var result;
if (sourceAddress == null) {
- result = socket.nativeCreateConnect(
- address._in_addr, port, address._scope_id);
+ if (address.type == InternetAddressType.unix) {
+ result = socket.nativeCreateUnixDomainConnect(
+ address.address, _Namespace._namespace);
+ } else {
+ result = socket.nativeCreateConnect(
+ address._in_addr, port, address._scope_id);
+ }
} else {
assert(sourceAddress is _InternetAddress);
- result = socket.nativeCreateBindConnect(address._in_addr, port,
- sourceAddress._in_addr, address._scope_id);
+ if (address.type == InternetAddressType.unix) {
+ assert(sourceAddress.type == InternetAddressType.unix);
+ result = socket.nativeCreateUnixDomainBindConnect(
+ address.address, sourceAddress.address, _Namespace._namespace);
+ } else {
+ result = socket.nativeCreateBindConnect(address._in_addr, port,
+ sourceAddress._in_addr, address._scope_id);
+ }
}
if (result is OSError) {
// Keep first error, if present.
@@ -641,8 +715,18 @@
var socket = new _NativeSocket.listen();
socket.localAddress = address;
- var result = socket.nativeCreateBindListen(
- address._in_addr, port, backlog, v6Only, shared, address._scope_id);
+ var result;
+ if (address.type == InternetAddressType.unix) {
+ var path = address.address;
+ if (FileSystemEntity.isLinkSync(path)) {
+ path = Link(path).targetSync();
+ }
+ result = socket.nativeCreateUnixDomainBindListen(
+ path, backlog, shared, _Namespace._namespace);
+ } else {
+ result = socket.nativeCreateBindListen(
+ address._in_addr, port, backlog, v6Only, shared, address._scope_id);
+ }
if (result is OSError) {
throw new SocketException("Failed to create server socket",
osError: result, address: address, port: port);
@@ -799,7 +883,7 @@
static int _fixOffset(int? offset) => offset ?? 0;
int write(List<int> buffer, int offset, int? bytes) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
offset = _fixOffset(offset);
if (bytes == null) {
if (offset > buffer.length) {
@@ -905,12 +989,14 @@
}
int get port {
+ if (localAddress.type == InternetAddressType.unix) return 0;
if (localPort != 0) return localPort;
if (isClosing || isClosed) throw const SocketException.closed();
return localPort = nativeGetPort();
}
int get remotePort {
+ if (localAddress.type == InternetAddressType.unix) return 0;
if (isClosing || isClosed) throw const SocketException.closed();
return nativeGetRemotePeer()[1];
}
@@ -922,7 +1008,11 @@
var result = nativeGetRemotePeer();
var addr = result[0];
var type = new InternetAddressType._from(addr[0]);
- return new _InternetAddress(addr[1], null, addr[2]);
+ if (type == InternetAddressType.unix) {
+ return _InternetAddress.fromString(addr[1],
+ type: InternetAddressType.unix);
+ }
+ return _InternetAddress(type, addr[1], null, addr[2]);
}
void issueReadEvent() {
@@ -1195,7 +1285,7 @@
}
dynamic getOption(SocketOption option) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(option, "option");
var result = nativeGetOption(option._value, address.type._value);
if (result is OSError) throw result;
@@ -1203,14 +1293,14 @@
}
bool setOption(SocketOption option, value) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(option, "option");
nativeSetOption(option._value, address.type._value, value);
return true;
}
Uint8List getRawOption(RawSocketOption option) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(option, "option");
ArgumentError.checkNotNull(option.value, "option.value");
nativeGetRawOption(option.level, option.option, option.value);
@@ -1218,7 +1308,7 @@
}
void setRawOption(RawSocketOption option) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(option, "option");
ArgumentError.checkNotNull(option.value, "option.value");
nativeSetRawOption(option.level, option.option, option.value);
@@ -1274,11 +1364,17 @@
int port) native "Socket_SendTo";
nativeCreateConnect(Uint8List addr, int port, int scope_id)
native "Socket_CreateConnect";
+ nativeCreateUnixDomainConnect(String addr, _Namespace namespace)
+ native "Socket_CreateUnixDomainConnect";
nativeCreateBindConnect(Uint8List addr, int port, Uint8List sourceAddr,
int scope_id) native "Socket_CreateBindConnect";
+ nativeCreateUnixDomainBindConnect(String addr, String sourceAddr,
+ _Namespace namespace) native "Socket_CreateUnixDomainBindConnect";
bool isBindError(int errorNumber) native "SocketBase_IsBindError";
nativeCreateBindListen(Uint8List addr, int port, int backlog, bool v6Only,
bool shared, int scope_id) native "ServerSocket_CreateBindListen";
+ nativeCreateUnixDomainBindListen(String addr, int backlog, bool shared,
+ _Namespace namespace) native "ServerSocket_CreateUnixDomainBindListen";
nativeCreateBindDatagram(Uint8List addr, int port, bool reuseAddress,
bool reusePort, int ttl) native "Socket_CreateBindDatagram";
bool nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
@@ -2122,6 +2218,9 @@
@pragma("vm:entry-point", "call")
Datagram _makeDatagram(
- Uint8List data, String address, Uint8List in_addr, int port) {
- return new Datagram(data, new _InternetAddress(address, null, in_addr), port);
+ Uint8List data, String address, Uint8List in_addr, int port, int type) {
+ return new Datagram(
+ data,
+ _InternetAddress(InternetAddressType._from(type), address, null, in_addr),
+ port);
}
diff --git a/sdk_nnbd/lib/_internal/vm/bin/stdio_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/stdio_patch.dart
index d820733..bc32221 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/stdio_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/stdio_patch.dart
@@ -22,6 +22,7 @@
case _stdioHandleTypeFile:
return new Stdin._(new _FileStream.forStdin(), fd);
}
+ throw new UnsupportedError("Unexpected handle type $type");
}
@patch
diff --git a/sdk_nnbd/lib/_internal/vm/bin/sync_socket_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/sync_socket_patch.dart
index cf16b88..e2ced70 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/sync_socket_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/sync_socket_patch.dart
@@ -142,7 +142,12 @@
throw result;
}
var addr = result[0];
- return new _InternetAddress(addr[1], null, addr[2]);
+ var type = InternetAddressType._from(addr[0]);
+ if (type == InternetAddressType.unix) {
+ return _InternetAddress.fromString(addr[1],
+ type: InternetAddressType.unix);
+ }
+ return _InternetAddress(type, addr[1], null, addr[2]);
}
int get remotePort {
@@ -184,12 +189,13 @@
}
return <_InternetAddress>[
for (int i = 0; i < response.length; ++i)
- new _InternetAddress(response[i][1], host, response[i][2]),
+ new _InternetAddress(InternetAddressType._from(response[i][0]),
+ response[i][1], host, response[i][2]),
];
}
int readIntoSync(List<int> buffer, int start, int? end) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(buffer, "buffer");
ArgumentError.checkNotNull(start, "start");
_checkAvailable();
@@ -279,7 +285,7 @@
}
void writeFromSync(List<int> buffer, int start, int? end) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(buffer, "buffer");
ArgumentError.checkNotNull(start, "start");
_checkAvailable();
diff --git a/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart
index 9e180a2..1de3219 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart
@@ -33,7 +33,8 @@
}
}
- void completeError(e, [st]) {
+ void completeError(Object e, [StackTrace? st]) {
+ st ??= AsyncError.defaultStackTrace(e);
if (isSync) {
_future._completeError(e, st);
} else {
@@ -77,7 +78,7 @@
// parameter to the continuation. See vm/ast_transformer.cc for usage.
Function _asyncErrorWrapperHelper(continuation) {
// See comments of `_asyncThenWrapperHelper`.
- var errorCallback = (e, s) => continuation(null, e, s);
+ void errorCallback(Object e, StackTrace s) => continuation(null, e, s);
if (Zone.current == Zone.root) return errorCallback;
return Zone.current.registerBinaryCallback(errorCallback);
}
diff --git a/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart b/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart
index 7f3984d..64fff0b 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart
@@ -471,6 +471,7 @@
}
// Set implementation, analogous to _CompactLinkedHashMap.
+@pragma('vm:entry-point')
class _CompactLinkedHashSet<E> extends _HashFieldBase
with _HashBase, _OperatorEqualsAndHashCode, SetMixin<E>
implements LinkedHashSet<E> {
diff --git a/sdk_nnbd/lib/_internal/vm/lib/identical_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/identical_patch.dart
index 9847491..4b57430 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/identical_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/identical_patch.dart
@@ -10,5 +10,4 @@
@patch
@pragma("vm:entry-point", "call")
-int identityHashCode(Object? object) =>
- object == null ? null.hashCode : object._identityHashCode;
+int identityHashCode(Object? object) => object._identityHashCode;
diff --git a/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart
index e4000a4..075e001 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart
@@ -60,7 +60,7 @@
_namedArguments ??= const {};
}
- Symbol _setMemberNameAndType() {
+ void _setMemberNameAndType() {
final funcName = _functionName!;
if (_type == _UNINITIALIZED) {
_type = 0;
diff --git a/sdk_nnbd/lib/_internal/vm/lib/mirror_reference.dart b/sdk_nnbd/lib/_internal/vm/lib/mirror_reference.dart
index d203953..0cb1e37 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/mirror_reference.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/mirror_reference.dart
@@ -10,5 +10,5 @@
throw "Unreachable";
}
- bool operator ==(other) native "MirrorReference_equals";
+ bool operator ==(Object other) native "MirrorReference_equals";
}
diff --git a/sdk_nnbd/lib/async/async_error.dart b/sdk_nnbd/lib/async/async_error.dart
index 17abfed..a7172bd 100644
--- a/sdk_nnbd/lib/async/async_error.dart
+++ b/sdk_nnbd/lib/async/async_error.dart
@@ -5,7 +5,7 @@
part of dart.async;
_invokeErrorHandler(
- Function errorHandler, Object error, StackTrace? stackTrace) {
+ Function errorHandler, Object error, StackTrace stackTrace) {
var handler = errorHandler; // Rename to avoid promotion.
if (handler is ZoneBinaryCallback<dynamic, Never, Never>) {
// Dynamic invocation because we don't know the actual type of the
diff --git a/sdk_nnbd/lib/async/broadcast_stream_controller.dart b/sdk_nnbd/lib/async/broadcast_stream_controller.dart
index 9a80aab..3684a7c 100644
--- a/sdk_nnbd/lib/async/broadcast_stream_controller.dart
+++ b/sdk_nnbd/lib/async/broadcast_stream_controller.dart
@@ -23,8 +23,11 @@
_BroadcastSubscription<T>? _next;
_BroadcastSubscription<T>? _previous;
- _BroadcastSubscription(_StreamControllerLifecycle<T> controller,
- void onData(T data)?, Function? onError, void onDone()?,
+ _BroadcastSubscription(
+ _StreamControllerLifecycle<T> controller,
+ void onData(T data)?,
+ Function? onError,
+ void onDone()?,
bool cancelOnError)
: super(controller, onData, onError, onDone, cancelOnError) {
_next = _previous = this;
@@ -255,7 +258,10 @@
if (replacement != null) {
error = replacement.error;
stackTrace = replacement.stackTrace;
+ } else {
+ stackTrace ??= AsyncError.defaultStackTrace(error);
}
+ if (stackTrace == null) throw "unreachable"; // TODO(40088)
_sendError(error, stackTrace);
}
@@ -287,7 +293,7 @@
_sendData(data);
}
- void _addError(Object error, StackTrace? stackTrace) {
+ void _addError(Object error, StackTrace stackTrace) {
_sendError(error, stackTrace);
}
@@ -386,7 +392,7 @@
});
}
- void _sendError(Object error, StackTrace? stackTrace) {
+ void _sendError(Object error, StackTrace stackTrace) {
if (_isEmpty) return;
_forEachListener((_BufferingStreamSubscription<T> subscription) {
subscription._addError(error, stackTrace);
@@ -419,7 +425,7 @@
}
}
- void _sendError(Object error, StackTrace? stackTrace) {
+ void _sendError(Object error, StackTrace stackTrace) {
for (var subscription = _firstSubscription;
subscription != null;
subscription = subscription._next) {
@@ -480,6 +486,7 @@
void addError(Object error, [StackTrace? stackTrace]) {
// TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(error, "error");
+ stackTrace ??= AsyncError.defaultStackTrace(error);
if (!isClosed && _isFiring) {
_addPendingEvent(new _DelayedError(error, stackTrace));
return;
diff --git a/sdk_nnbd/lib/async/future.dart b/sdk_nnbd/lib/async/future.dart
index 62aef45..d1273aa 100644
--- a/sdk_nnbd/lib/async/future.dart
+++ b/sdk_nnbd/lib/async/future.dart
@@ -282,6 +282,7 @@
stackTrace = replacement.stackTrace;
}
}
+ stackTrace ??= AsyncError.defaultStackTrace(error);
return new _Future<T>.immediateError(error, stackTrace);
}
@@ -364,13 +365,13 @@
final _Future<List<T>> result = new _Future<List<T>>();
List<T?>? values; // Collects the values. Set to null on error.
int remaining = 0; // How many futures are we waiting for.
- Object? error; // The first error from a future.
- StackTrace? stackTrace; // The stackTrace that came with the error.
+ late Object error; // The first error from a future.
+ late StackTrace stackTrace; // The stackTrace that came with the error.
// Handle an error from any of the futures.
// TODO(jmesserly): use `void` return type once it can be inferred for the
// `then` call below.
- handleError(theError, StackTrace? theStackTrace) {
+ handleError(Object theError, StackTrace theStackTrace) {
remaining--;
List<T?>? valueList = values;
if (valueList != null) {
@@ -393,7 +394,7 @@
stackTrace = theStackTrace;
}
} else if (remaining == 0 && !eagerError) {
- result._completeError(error!, stackTrace);
+ result._completeError(error, stackTrace);
}
}
@@ -411,7 +412,7 @@
result._completeWithValue(List<T>.from(valueList));
}
} else {
- // An error has occurred earlier.
+ // Forced read of error to assert that it has occurred earlier.
assert(error != null);
if (cleanUp != null && value != null) {
// Ensure errors from cleanUp are uncaught.
@@ -420,7 +421,7 @@
});
}
if (remaining == 0 && !eagerError) {
- result._completeError(error!, stackTrace);
+ result._completeError(error, stackTrace);
}
}
}, onError: handleError);
@@ -470,12 +471,14 @@
*/
static Future<T> any<T>(Iterable<Future<T>> futures) {
var completer = new Completer<T>.sync();
- var onValue = (T value) {
+ void onValue(T value) {
if (!completer.isCompleted) completer.complete(value);
- };
- var onError = (Object error, StackTrace? stack) {
+ }
+
+ void onError(Object error, StackTrace stack) {
if (!completer.isCompleted) completer.completeError(error, stack);
- };
+ }
+
for (var future in futures) {
future.then(onValue, onError: onError);
}
@@ -649,7 +652,7 @@
*/
// The `Function` below stands for one of two types:
// - (dynamic) -> FutureOr<T>
- // - (dynamic, StackTrace?) -> FutureOr<T>
+ // - (dynamic, StackTrace) -> FutureOr<T>
// Given that there is a `test` function that is usually used to do an
// `isCheck` we should also expect functions that take a specific argument.
Future<T> catchError(Function onError, {bool test(Object error)?});
@@ -919,14 +922,17 @@
}
// Helper function completing a _Future with error, but checking the zone
-// for error replacement first.
+// for error replacement and missing stack trace first.
void _completeWithErrorCallback(
_Future result, Object error, StackTrace? stackTrace) {
AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
if (replacement != null) {
error = replacement.error;
stackTrace = replacement.stackTrace;
+ } else {
+ stackTrace ??= AsyncError.defaultStackTrace(error);
}
+ if (stackTrace == null) throw "unreachable"; // TODO(40088).
result._completeError(error, stackTrace);
}
@@ -937,6 +943,11 @@
if (replacement != null) {
error = replacement.error;
stackTrace = replacement.stackTrace;
+ } else {
+ stackTrace ??= AsyncError.defaultStackTrace(error);
+ }
+ if (stackTrace == null) {
+ throw "unreachable"; // TODO(lrn): Remove when type promotion works.
}
result._asyncCompleteError(error, stackTrace);
}
diff --git a/sdk_nnbd/lib/async/future_impl.dart b/sdk_nnbd/lib/async/future_impl.dart
index e469175..b23bfdb0 100644
--- a/sdk_nnbd/lib/async/future_impl.dart
+++ b/sdk_nnbd/lib/async/future_impl.dart
@@ -24,11 +24,14 @@
if (replacement != null) {
error = replacement.error;
stackTrace = replacement.stackTrace;
+ } else {
+ stackTrace ??= AsyncError.defaultStackTrace(error);
}
+ if (stackTrace == null) throw "unreachable"; // TODO(40088)
_completeError(error, stackTrace);
}
- void _completeError(Object error, StackTrace? stackTrace);
+ void _completeError(Object error, StackTrace stackTrace);
// The future's _isComplete doesn't take into account pending completions.
// We therefore use _mayComplete.
@@ -41,7 +44,7 @@
future._asyncComplete(value as FutureOr<T>);
}
- void _completeError(Object error, StackTrace? stackTrace) {
+ void _completeError(Object error, StackTrace stackTrace) {
future._asyncCompleteError(error, stackTrace);
}
}
@@ -52,7 +55,7 @@
future._complete(value as FutureOr<T>);
}
- void _completeError(Object error, StackTrace? stackTrace) {
+ void _completeError(Object error, StackTrace stackTrace) {
future._completeError(error, stackTrace);
}
}
@@ -150,8 +153,8 @@
var errorCallback = this.errorCallback; // To enable promotion.
// If the errorCallback returns something which is not a FutureOr<T>,
// this return statement throws, and the caller handles the error.
- if (errorCallback is dynamic Function(Object, StackTrace?)) {
- return _zone.runBinary<dynamic, Object, StackTrace?>(
+ if (errorCallback is dynamic Function(Object, StackTrace)) {
+ return _zone.runBinary<dynamic, Object, StackTrace>(
errorCallback, asyncError.error, asyncError.stackTrace);
} else {
return _zone.runUnary<dynamic, Object>(
@@ -229,7 +232,7 @@
_setValue(value);
}
- _Future.immediateError(var error, [StackTrace? stackTrace])
+ _Future.immediateError(var error, StackTrace stackTrace)
: _zone = Zone._current {
_asyncCompleteError(error, stackTrace);
}
@@ -353,7 +356,7 @@
_resultOrListeners = error;
}
- void _setError(Object error, StackTrace? stackTrace) {
+ void _setError(Object error, StackTrace stackTrace) {
_setErrorObject(new AsyncError(error, stackTrace));
}
@@ -465,12 +468,7 @@
// so use _complete instead of _completeWithValue.
target._clearPendingComplete(); // Clear this first, it's set again.
target._complete(value);
- },
- // TODO(floitsch): eventually we would like to make this non-optional
- // and dependent on the listeners of the target future. If none of
- // the target future's listeners want to have the stack trace we don't
- // need a trace.
- onError: (Object error, [StackTrace? stackTrace]) {
+ }, onError: (Object error, StackTrace stackTrace) {
assert(target._isPendingComplete);
target._completeError(error, stackTrace);
});
@@ -528,7 +526,7 @@
_propagateToListeners(this, listeners);
}
- void _completeError(Object error, [StackTrace? stackTrace]) {
+ void _completeError(Object error, StackTrace stackTrace) {
assert(!_isComplete);
_FutureListener? listeners = _removeListeners();
@@ -577,7 +575,7 @@
_chainForeignFuture(value, this);
}
- void _asyncCompleteError(Object error, StackTrace? stackTrace) {
+ void _asyncCompleteError(Object error, StackTrace stackTrace) {
assert(!_isComplete);
_setPendingComplete();
@@ -767,7 +765,8 @@
if (onTimeout == null) {
timer = new Timer(timeLimit, () {
result._completeError(
- new TimeoutException("Future not completed", timeLimit));
+ new TimeoutException("Future not completed", timeLimit),
+ StackTrace.empty);
});
} else {
Zone zone = Zone.current;
@@ -787,7 +786,7 @@
timer.cancel();
result._completeWithValue(v);
}
- }, onError: (Object e, StackTrace? s) {
+ }, onError: (Object e, StackTrace s) {
if (timer.isActive) {
timer.cancel();
result._completeError(e, s);
diff --git a/sdk_nnbd/lib/async/stream.dart b/sdk_nnbd/lib/async/stream.dart
index c35d8a8..d504a42 100644
--- a/sdk_nnbd/lib/async/stream.dart
+++ b/sdk_nnbd/lib/async/stream.dart
@@ -154,7 +154,7 @@
// TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(error, "error");
return (_AsyncStreamController<T>(null, null, null, null)
- .._addError(error, stackTrace)
+ .._addError(error, stackTrace ?? AsyncError.defaultStackTrace(error))
.._closeUnchecked())
.stream;
}
@@ -203,18 +203,20 @@
// Declare these as variables holding closures instead of as
// function declarations.
// This avoids creating a new closure from the functions for each future.
- var onValue = (T value) {
+ void onValue(T value) {
if (!controller.isClosed) {
controller._add(value);
if (--count == 0) controller._closeUnchecked();
}
- };
- var onError = (Object error, StackTrace? stack) {
+ }
+
+ void onError(Object error, StackTrace stack) {
if (!controller.isClosed) {
controller._addError(error, stack);
if (--count == 0) controller._closeUnchecked();
}
- };
+ }
+
// The futures are already running, so start listening to them immediately
// (instead of waiting for the stream to be listened on).
// If we wait, we might not catch errors in the futures in time.
@@ -411,7 +413,7 @@
* error object and possibly a stack trace.
*
* The [onError] callback must be of type `void onError(Object error)` or
- * `void onError(Object error, StackTrace? stackTrace)`. If [onError] accepts
+ * `void onError(Object error, StackTrace stackTrace)`. If [onError] accepts
* two arguments it is called with the error object and the stack trace
* (which could be `null` if this stream itself received an error without
* stack trace).
@@ -508,6 +510,7 @@
}
final addError = controller._addError;
+ final resume = subscription.resume;
subscription.onData((T event) {
FutureOr<E> newValue;
try {
@@ -518,9 +521,7 @@
}
if (newValue is Future<E>) {
subscription.pause();
- newValue
- .then(add, onError: addError)
- .whenComplete(subscription.resume);
+ newValue.then(add, onError: addError).whenComplete(resume);
} else {
if (newValue is! E) {
throw "unreachable"; // TODO(lrn): Remove when type promotion works.
@@ -532,7 +533,7 @@
if (!isBroadcast) {
controller
..onPause = subscription.pause
- ..onResume = subscription.resume;
+ ..onResume = resume;
}
};
return controller.stream;
@@ -598,7 +599,7 @@
* by the [onError] function.
*
* The [onError] callback must be of type `void onError(Object error)` or
- * `void onError(Object error, StackTrace? stackTrace)`.
+ * `void onError(Object error, StackTrace stackTrace)`.
* The function type determines whether [onError] is invoked with a stack
* trace argument.
* The stack trace argument may be `null` if this stream received an error
@@ -1471,7 +1472,8 @@
subscription =
this.listen(null, onError: result._completeError, onDone: () {
result._completeError(
- new RangeError.index(index, this, "index", null, elementIndex));
+ new RangeError.index(index, this, "index", null, elementIndex),
+ StackTrace.empty);
}, cancelOnError: true);
subscription.onData((T value) {
if (index == elementIndex) {
@@ -1555,7 +1557,7 @@
// issue: https://github.com/dart-lang/sdk/issues/37565
controller.add(event);
})
- ..onError((Object error, StackTrace? stackTrace) {
+ ..onError((Object error, StackTrace stackTrace) {
timer.cancel();
timer = zone.createTimer(timeLimit, timeoutCallback);
controller._addError(
@@ -2048,8 +2050,7 @@
*/
factory StreamTransformer.fromHandlers(
{void handleData(S data, EventSink<T> sink)?,
- void handleError(
- Object error, StackTrace? stackTrace, EventSink<T> sink)?,
+ void handleError(Object error, StackTrace stackTrace, EventSink<T> sink)?,
void handleDone(EventSink<T> sink)?}) = _StreamHandlerTransformer<S, T>;
/**
diff --git a/sdk_nnbd/lib/async/stream_controller.dart b/sdk_nnbd/lib/async/stream_controller.dart
index 3f3f461..8b7d786 100644
--- a/sdk_nnbd/lib/async/stream_controller.dart
+++ b/sdk_nnbd/lib/async/stream_controller.dart
@@ -607,7 +607,10 @@
if (replacement != null) {
error = replacement.error;
stackTrace = replacement.stackTrace;
+ } else {
+ stackTrace ??= AsyncError.defaultStackTrace(error);
}
+ if (stackTrace == null) throw "unreachable"; // TODO(40088)
_addError(error, stackTrace);
}
@@ -654,7 +657,7 @@
}
}
- void _addError(Object error, StackTrace? stackTrace) {
+ void _addError(Object error, StackTrace stackTrace) {
if (hasListener) {
_sendError(error, stackTrace);
} else if (_isInitialState) {
@@ -780,7 +783,7 @@
_subscription._add(data);
}
- void _sendError(Object error, StackTrace? stackTrace) {
+ void _sendError(Object error, StackTrace stackTrace) {
_subscription._addError(error, stackTrace);
}
@@ -795,7 +798,7 @@
_subscription._addPending(_DelayedData<T>(data));
}
- void _sendError(Object error, StackTrace? stackTrace) {
+ void _sendError(Object error, StackTrace stackTrace) {
_subscription._addPending(_DelayedError(error, stackTrace));
}
@@ -903,7 +906,7 @@
onDone: controller._close,
cancelOnError: cancelOnError);
- static makeErrorHandler(_EventSink controller) => (Object e, StackTrace? s) {
+ static makeErrorHandler(_EventSink controller) => (Object e, StackTrace s) {
controller._addError(e, s);
controller._close();
};
diff --git a/sdk_nnbd/lib/async/stream_impl.dart b/sdk_nnbd/lib/async/stream_impl.dart
index a817ac9..4404d78 100644
--- a/sdk_nnbd/lib/async/stream_impl.dart
+++ b/sdk_nnbd/lib/async/stream_impl.dart
@@ -7,7 +7,7 @@
/** Abstract and private interface for a place to put events. */
abstract class _EventSink<T> {
void _add(T data);
- void _addError(Object error, StackTrace? stackTrace);
+ void _addError(Object error, StackTrace stackTrace);
void _close();
}
@@ -20,7 +20,7 @@
*/
abstract class _EventDispatch<T> {
void _sendData(T data);
- void _sendError(Object error, StackTrace? stackTrace);
+ void _sendError(Object error, StackTrace stackTrace);
void _sendDone();
}
@@ -153,9 +153,9 @@
static Function _registerErrorHandler(Zone zone, Function? handleError) {
// TODO(lrn): Consider whether we need to register the null handler.
handleError ??= _nullErrorHandler;
- if (handleError is void Function(Object, StackTrace?)) {
+ if (handleError is void Function(Object, StackTrace)) {
return zone
- .registerBinaryCallback<dynamic, Object, StackTrace?>(handleError);
+ .registerBinaryCallback<dynamic, Object, StackTrace>(handleError);
}
if (handleError is void Function(Object)) {
return zone.registerUnaryCallback<dynamic, Object>(handleError);
@@ -220,7 +220,7 @@
_onDone = () {
result._complete(resultValue);
};
- _onError = (Object error, StackTrace? stackTrace) {
+ _onError = (Object error, StackTrace stackTrace) {
Future cancelFuture = cancel();
if (!identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(() {
@@ -283,7 +283,7 @@
}
}
- void _addError(Object error, StackTrace? stackTrace) {
+ void _addError(Object error, StackTrace stackTrace) {
if (_isCanceled) return;
if (_canFire) {
_sendError(error, stackTrace); // Reports cancel after sending.
@@ -352,7 +352,7 @@
_checkState(wasInputPaused);
}
- void _sendError(Object error, StackTrace? stackTrace) {
+ void _sendError(Object error, StackTrace stackTrace) {
assert(!_isCanceled);
assert(!_isPaused);
assert(!_inCallback);
@@ -365,8 +365,8 @@
_state |= _STATE_IN_CALLBACK;
// TODO(floitsch): this dynamic should be 'void'.
var onError = _onError;
- if (onError is void Function(Object, StackTrace?)) {
- _zone.runBinaryGuarded<Object, StackTrace?>(onError, error, stackTrace);
+ if (onError is void Function(Object, StackTrace)) {
+ _zone.runBinaryGuarded<Object, StackTrace>(onError, error, stackTrace);
} else {
_zone.runUnaryGuarded<Object>(_onError as void Function(Object), error);
}
@@ -581,7 +581,7 @@
void _nullDataHandler(dynamic value) {}
/** Default error handler, reports the error to the current zone's handler. */
-void _nullErrorHandler(Object error, [StackTrace? stackTrace]) {
+void _nullErrorHandler(Object error, StackTrace stackTrace) {
Zone.current.handleUncaughtError(error, stackTrace);
}
@@ -608,7 +608,7 @@
/** A delayed error event. */
class _DelayedError extends _DelayedEvent {
final Object error;
- final StackTrace? stackTrace;
+ final StackTrace stackTrace;
_DelayedError(this.error, this.stackTrace);
void perform(_EventDispatch dispatch) {
@@ -990,8 +990,7 @@
/// completed.
bool _isPaused = false;
- _StreamIterator(final Stream<T> stream)
- : _stateData = stream {
+ _StreamIterator(final Stream<T> stream) : _stateData = stream {
ArgumentError.checkNotNull(stream, "stream");
}
@@ -1060,7 +1059,7 @@
if (_isPaused) _subscription?.pause();
}
- void _onError(Object error, [StackTrace? stackTrace]) {
+ void _onError(Object error, StackTrace stackTrace) {
assert(_subscription != null && !_isPaused);
var moveNextFuture = _stateData as _Future<bool>;
_subscription = null;
diff --git a/sdk_nnbd/lib/async/stream_pipe.dart b/sdk_nnbd/lib/async/stream_pipe.dart
index b307ed6..fd20228 100644
--- a/sdk_nnbd/lib/async/stream_pipe.dart
+++ b/sdk_nnbd/lib/async/stream_pipe.dart
@@ -5,8 +5,8 @@
part of dart.async;
/** Runs user code and takes actions depending on success or failure. */
-_runUserCode<T>(
- T userCode(), onSuccess(T value), onError(Object error, StackTrace? stackTrace)) {
+_runUserCode<T>(T userCode(), onSuccess(T value),
+ onError(Object error, StackTrace stackTrace)) {
try {
onSuccess(userCode());
} catch (e, s) {
@@ -24,7 +24,7 @@
/** Helper function to cancel a subscription and wait for the potential future,
before completing with an error. */
void _cancelAndError(StreamSubscription subscription, _Future future,
- Object error, StackTrace? stackTrace) {
+ Object error, StackTrace stackTrace) {
var cancelFuture = subscription.cancel();
if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(() => future._completeError(error, stackTrace));
@@ -34,7 +34,7 @@
}
void _cancelAndErrorWithReplacement(StreamSubscription subscription,
- _Future future, Object error, StackTrace? stackTrace) {
+ _Future future, Object error, StackTrace stackTrace) {
AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
if (replacement != null) {
error = replacement.error;
@@ -43,12 +43,10 @@
_cancelAndError(subscription, future, error, stackTrace);
}
-typedef void _ErrorCallback(Object error, StackTrace? stackTrace);
-
/** Helper function to make an onError argument to [_runUserCode]. */
-_ErrorCallback _cancelAndErrorClosure(
+void Function(Object error, StackTrace stackTrace) _cancelAndErrorClosure(
StreamSubscription subscription, _Future future) {
- return (Object error, StackTrace? stackTrace) {
+ return (Object error, StackTrace stackTrace) {
_cancelAndError(subscription, future, error, stackTrace);
};
}
@@ -95,7 +93,7 @@
void _handleData(S data, _EventSink<T> sink);
- void _handleError(Object error, StackTrace? stackTrace, _EventSink<T> sink) {
+ void _handleError(Object error, StackTrace stackTrace, _EventSink<T> sink) {
sink._addError(error, stackTrace);
}
@@ -129,7 +127,7 @@
super._add(data);
}
- void _addError(Object error, StackTrace? stackTrace) {
+ void _addError(Object error, StackTrace stackTrace) {
if (_isClosed) return;
super._addError(error, stackTrace);
}
@@ -159,7 +157,7 @@
_stream._handleData(data, this);
}
- void _handleError(error, StackTrace? stackTrace) {
+ void _handleError(error, StackTrace stackTrace) {
_stream._handleError(error, stackTrace, this);
}
@@ -173,7 +171,7 @@
// -------------------------------------------------------------------
void _addErrorWithReplacement(
- _EventSink sink, Object error, StackTrace? stackTrace) {
+ _EventSink sink, Object error, StackTrace stackTrace) {
AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
if (replacement != null) {
error = replacement.error;
@@ -268,7 +266,7 @@
sink._add(data);
}
- void _handleError(Object error, StackTrace? stackTrace, _EventSink<T> sink) {
+ void _handleError(Object error, StackTrace stackTrace, _EventSink<T> sink) {
bool matches = true;
var test = _test;
if (test != null) {
diff --git a/sdk_nnbd/lib/async/stream_transformers.dart b/sdk_nnbd/lib/async/stream_transformers.dart
index b445d66..ca7934c 100644
--- a/sdk_nnbd/lib/async/stream_transformers.dart
+++ b/sdk_nnbd/lib/async/stream_transformers.dart
@@ -16,7 +16,7 @@
}
void addError(Object error, [StackTrace? stackTrace]) {
- _sink._addError(error, stackTrace);
+ _sink._addError(error, stackTrace ?? AsyncError.defaultStackTrace(error));
}
void close() {
@@ -76,7 +76,7 @@
* events when the stream is already closed. Report them as state
* error.
*/
- void _addError(Object error, StackTrace? stackTrace) {
+ void _addError(Object error, StackTrace stackTrace) {
if (_isClosed) {
throw new StateError("Stream is already closed");
}
@@ -124,7 +124,7 @@
}
}
- void _handleError(Object error, StackTrace? stackTrace) {
+ void _handleError(Object error, StackTrace stackTrace) {
try {
_transformerSink.addError(error, stackTrace);
} catch (e, s) {
@@ -193,7 +193,7 @@
/// Error-handler coming from [StreamTransformer.fromHandlers].
typedef void _TransformErrorHandler<T>(
- Object error, StackTrace? stackTrace, EventSink<T> sink);
+ Object error, StackTrace stackTrace, EventSink<T> sink);
/// Done-handler coming from [StreamTransformer.fromHandlers].
typedef void _TransformDoneHandler<T>(EventSink<T> sink);
@@ -236,6 +236,7 @@
throw StateError("Sink is closed");
}
var handleError = _handleError;
+ stackTrace ??= AsyncError.defaultStackTrace(error);
if (handleError != null) {
handleError(error, stackTrace, sink);
} else {
@@ -264,8 +265,7 @@
class _StreamHandlerTransformer<S, T> extends _StreamSinkTransformer<S, T> {
_StreamHandlerTransformer(
{void handleData(S data, EventSink<T> sink)?,
- void handleError(
- Object error, StackTrace? stackTrace, EventSink<T> sink)?,
+ void handleError(Object error, StackTrace stackTrace, EventSink<T> sink)?,
void handleDone(EventSink<T> sink)?})
: super((EventSink<T> outputSink) {
return new _HandlerEventSink<S, T>(
diff --git a/sdk_nnbd/lib/async/zone.dart b/sdk_nnbd/lib/async/zone.dart
index 2fc47b8..53ad166 100644
--- a/sdk_nnbd/lib/async/zone.dart
+++ b/sdk_nnbd/lib/async/zone.dart
@@ -9,7 +9,7 @@
typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2);
typedef HandleUncaughtErrorHandler = void Function(Zone self,
- ZoneDelegate parent, Zone zone, Object error, StackTrace? stackTrace);
+ ZoneDelegate parent, Zone zone, Object error, StackTrace stackTrace);
typedef RunHandler = R Function<R>(
Zone self, ZoneDelegate parent, Zone zone, R Function() f);
typedef RunUnaryHandler = R Function<R, T>(
@@ -39,13 +39,27 @@
/** Pair of error and stack trace. Returned by [Zone.errorCallback]. */
class AsyncError implements Error {
final Object error;
- final StackTrace? stackTrace;
+ final StackTrace stackTrace;
- AsyncError(this.error, this.stackTrace) {
+ AsyncError(this.error, StackTrace? stackTrace)
+ : stackTrace = stackTrace ?? defaultStackTrace(error) {
// TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(error, "error");
}
+ /// A default stack trace for an error.
+ ///
+ /// If [error] is an [Error] and it has an [Error.stackTrace],
+ /// that stack trace is returned.
+ /// If not, the [StackTrace.empty] default stack trace is returned.
+ static StackTrace defaultStackTrace(Object error) {
+ if (error is Error) {
+ var stackTrace = error.stackTrace;
+ if (stackTrace != null) return stackTrace;
+ }
+ return StackTrace.empty;
+ }
+
String toString() => '$error';
}
@@ -205,7 +219,7 @@
* to skip zones that would just delegate to their parents.
*/
abstract class ZoneDelegate {
- void handleUncaughtError(Zone zone, Object error, StackTrace? stackTrace);
+ void handleUncaughtError(Zone zone, Object error, StackTrace stackTrace);
R run<R>(Zone zone, R f());
R runUnary<R, T>(Zone zone, R f(T arg), T arg);
R runBinary<R, T1, T2>(Zone zone, R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2);
@@ -312,7 +326,7 @@
* By default, when handled by the root zone, uncaught asynchronous errors are
* treated like uncaught synchronous exceptions.
*/
- void handleUncaughtError(Object error, StackTrace? stackTrace);
+ void handleUncaughtError(Object error, StackTrace stackTrace);
/**
* The parent zone of the this zone.
@@ -694,7 +708,7 @@
_ZoneDelegate(this._delegationTarget);
- void handleUncaughtError(Zone zone, Object error, StackTrace? stackTrace) {
+ void handleUncaughtError(Zone zone, Object error, StackTrace stackTrace) {
var implementation = _delegationTarget._handleUncaughtError;
_Zone implZone = implementation.zone;
HandleUncaughtErrorHandler handler = implementation.function;
@@ -1019,7 +1033,7 @@
// Methods that can be customized by the zone specification.
- void handleUncaughtError(Object error, StackTrace? stackTrace) {
+ void handleUncaughtError(Object error, StackTrace stackTrace) {
var implementation = this._handleUncaughtError;
ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
HandleUncaughtErrorHandler handler = implementation.function;
@@ -1120,14 +1134,13 @@
}
void _rootHandleUncaughtError(Zone? self, ZoneDelegate? parent, Zone zone,
- Object error, StackTrace? stackTrace) {
+ Object error, StackTrace stackTrace) {
_schedulePriorityAsyncCallback(() {
- if (stackTrace == null) throw error;
_rethrow(error, stackTrace);
});
}
-external void _rethrow(Object error, StackTrace? stackTrace);
+external void _rethrow(Object error, StackTrace stackTrace);
R _rootRun<R>(Zone? self, ZoneDelegate? parent, Zone zone, R f()) {
if (identical(Zone._current, zone)) return f();
@@ -1383,7 +1396,7 @@
// Methods that can be customized by the zone specification.
- void handleUncaughtError(Object error, StackTrace? stackTrace) {
+ void handleUncaughtError(Object error, StackTrace stackTrace) {
_rootHandleUncaughtError(null, null, this, error, stackTrace);
}
@@ -1487,8 +1500,8 @@
return _runZoned<R>(body, zoneValues, zoneSpecification);
}
void Function(Object)? unaryOnError;
- void Function(Object, StackTrace?)? binaryOnError;
- if (onError is void Function(Object, StackTrace?)) {
+ void Function(Object, StackTrace)? binaryOnError;
+ if (onError is void Function(Object, StackTrace)) {
binaryOnError = onError;
} else if (onError is void Function(Object)) {
unaryOnError = onError;
@@ -1498,7 +1511,7 @@
}
_Zone parentZone = Zone._current;
HandleUncaughtErrorHandler errorHandler = (Zone self, ZoneDelegate parent,
- Zone zone, Object error, StackTrace? stackTrace) {
+ Zone zone, Object error, StackTrace stackTrace) {
try {
if (binaryOnError != null) {
parentZone.runBinary(binaryOnError, error, stackTrace);
diff --git a/sdk_nnbd/lib/collection/list.dart b/sdk_nnbd/lib/collection/list.dart
index a47ca1b..94124c5 100644
--- a/sdk_nnbd/lib/collection/list.dart
+++ b/sdk_nnbd/lib/collection/list.dart
@@ -358,12 +358,7 @@
return ListMapView<E>(this);
}
- List<E> operator +(List<E> other) {
- var result = <E>[]..length = (this.length + other.length);
- result.setRange(0, this.length, this);
- result.setRange(this.length, result.length, other);
- return result;
- }
+ List<E> operator +(List<E> other) => [...this, ...other];
List<E> sublist(int start, [int? end]) {
int listLength = this.length;
diff --git a/sdk_nnbd/lib/collection/splay_tree.dart b/sdk_nnbd/lib/collection/splay_tree.dart
index 6eda337..b81a034 100644
--- a/sdk_nnbd/lib/collection/splay_tree.dart
+++ b/sdk_nnbd/lib/collection/splay_tree.dart
@@ -6,36 +6,38 @@
typedef _Predicate<T> = bool Function(T value);
-class _SplayTreeNodeBase<K> {
- _SplayTreeNode<K>? left;
- _SplayTreeNode<K>? right;
-}
-
/// A node in a splay tree. It holds the sorting key and the left
/// and right children in the tree.
-class _SplayTreeNode<K> extends _SplayTreeNodeBase<K> {
- final K key;
+class _SplayTreeNode<K> {
+ // The key is nullable to be able to create a dummy node.
+ final K? _key;
- _SplayTreeNode(this.key);
-}
+ _SplayTreeNode<K>? left;
+ _SplayTreeNode<K>? right;
-class _DummySplayTreeNode<K> extends _SplayTreeNodeBase<K>
- implements _SplayTreeNode<K> {
- K get key => throw UnsupportedError("");
+ _SplayTreeNode(this._key);
+
+ K get key {
+ // TODO(dartbug.com/40892): replace with '_key as K'
+ K? localKey = _key;
+ return (localKey != null) ? localKey : localKey as K;
+ }
}
/// A node in a splay tree based map.
///
/// A [_SplayTreeNode] that also contains a value
class _SplayTreeMapNode<K, V> extends _SplayTreeNode<K> {
- V value;
- _SplayTreeMapNode(K key, this.value) : super(key);
-}
+ // The value is nullable to be able to create a dummy node.
+ V? _value;
-class _DummySplayTreeMapNode<K, V> extends _DummySplayTreeNode<K>
- implements _SplayTreeMapNode<K, V> {
- V get value => throw UnsupportedError("");
- set value(V v) => throw UnsupportedError("");
+ _SplayTreeMapNode(K? key, this._value) : super(key);
+
+ V get value {
+ // TODO(dartbug.com/40892): replace with '_value as V'
+ V? localValue = _value;
+ return (localValue != null) ? localValue : localValue as V;
+ }
}
/// A splay tree is a self-balancing binary search tree.
@@ -264,7 +266,7 @@
class SplayTreeMap<K, V> extends _SplayTree<K, _SplayTreeMapNode<K, V>>
with MapMixin<K, V> {
_SplayTreeMapNode<K, V>? _root;
- final _SplayTreeMapNode<K, V> _dummy = _DummySplayTreeMapNode<K, V>();
+ final _SplayTreeMapNode<K, V> _dummy = _SplayTreeMapNode<K, V>(null, null);
Comparator<K> _comparator;
_Predicate _validKey;
@@ -359,7 +361,7 @@
// the key to the root of the tree.
int comp = _splay(key);
if (comp == 0) {
- _root!.value = value;
+ _root!._value = value;
return;
}
_addNewRoot(_SplayTreeMapNode(key, value), comp);
@@ -652,7 +654,7 @@
class SplayTreeSet<E> extends _SplayTree<E, _SplayTreeNode<E>>
with IterableMixin<E>, SetMixin<E> {
_SplayTreeNode<E>? _root;
- final _SplayTreeNode<E> _dummy = _DummySplayTreeNode<E>();
+ final _SplayTreeNode<E> _dummy = _SplayTreeNode<E>(null);
Comparator<E> _comparator;
_Predicate _validKey;
diff --git a/sdk_nnbd/lib/core/errors.dart b/sdk_nnbd/lib/core/errors.dart
index 8a87c8b..005cb84 100644
--- a/sdk_nnbd/lib/core/errors.dart
+++ b/sdk_nnbd/lib/core/errors.dart
@@ -182,10 +182,16 @@
/**
* Throws if [argument] is `null`.
+ *
+ * If [name] is supplied, it is used as the parameter name
+ * in the error message.
+ *
+ * Returns the [argument] if it is not null.
*/
@Since("2.1")
- static void checkNotNull(Object? argument, [String? name]) {
+ static T checkNotNull<@Since("2.8") T>(T? argument, [String? name]) {
if (argument == null) throw ArgumentError.notNull(name);
+ return argument;
}
// Helper functions for toString overridden in subclasses.
@@ -274,30 +280,42 @@
[String? name, String? message, int? length]) = IndexError;
/**
- * Check that a [value] lies in a specific interval.
+ * Check that an integer [value] lies in a specific interval.
*
* Throws if [value] is not in the interval.
* The interval is from [minValue] to [maxValue], both inclusive.
+ *
+ * If [name] or [message] are provided, they are used as the parameter
+ * name and message text of the thrown error.
+ *
+ * Returns [value] if it is in the interval.
*/
- static void checkValueInInterval(int value, int minValue, int maxValue,
+ static int checkValueInInterval(int value, int minValue, int maxValue,
[String? name, String? message]) {
if (value < minValue || value > maxValue) {
throw RangeError.range(value, minValue, maxValue, name, message);
}
+ return value;
}
/**
- * Check that a value is a valid index into an indexable object.
+ * Check that [index] is a valid index into an indexable object.
*
* Throws if [index] is not a valid index into [indexable].
*
* An indexable object is one that has a `length` and a and index-operator
* `[]` that accepts an index if `0 <= index < length`.
*
+ * If [name] or [message] are provided, they are used as the parameter
+ * name and message text of the thrown error. If [name] is omitted, it
+ * defaults to `"index"`.
+ *
* If [length] is provided, it is used as the length of the indexable object,
* otherwise the length is found as `indexable.length`.
+ *
+ * Returns [index] if it is a valid index.
*/
- static void checkValidIndex(int index, dynamic indexable,
+ static int checkValidIndex(int index, dynamic indexable,
[String? name, int? length, String? message]) {
length ??= (indexable.length as int);
// Comparing with `0` as receiver produces better dart2js type inference.
@@ -305,6 +323,7 @@
name ??= "index";
throw RangeError.index(index, indexable, name, message, length);
}
+ return index;
}
/**
@@ -342,12 +361,19 @@
}
/**
- * Check that an integer value isn't negative.
+ * Check that an integer value is non-negative.
*
* Throws if the value is negative.
+ *
+ * If [name] or [message] are provided, they are used as the parameter
+ * name and message text of the thrown error. If [name] is omitted, it
+ * defaults to `index`.
+ *
+ * Returns [value] if it is not negative.
*/
- static void checkNotNegative(int value, [String? name, String? message]) {
+ static int checkNotNegative(int value, [String? name, String? message]) {
if (value < 0) throw RangeError.range(value, 0, null, name, message);
+ return value;
}
String get _errorName => "RangeError";
diff --git a/sdk_nnbd/lib/core/stacktrace.dart b/sdk_nnbd/lib/core/stacktrace.dart
index 2eb1493..ef08f71 100644
--- a/sdk_nnbd/lib/core/stacktrace.dart
+++ b/sdk_nnbd/lib/core/stacktrace.dart
@@ -14,6 +14,13 @@
* them programmatically.
*/
abstract class StackTrace {
+ /// A stack trace object with no information.
+ ///
+ /// This stack trace is used as the default in situations where
+ /// a stack trace is required, but the user has not supplied one.
+ @Since("2.8")
+ static const empty = const _StringStackTrace("");
+
StackTrace(); // In case existing classes extend StackTrace.
/**
@@ -55,6 +62,6 @@
class _StringStackTrace implements StackTrace {
final String _stackTrace;
- _StringStackTrace(this._stackTrace);
+ const _StringStackTrace(this._stackTrace);
String toString() => _stackTrace;
}
diff --git a/sdk_nnbd/lib/html/dart2js/html_dart2js.dart b/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
index c16628a..f8ed144 100644
--- a/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
+++ b/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
@@ -13788,6 +13788,14 @@
if (!(element.attributes instanceof NamedNodeMap)) {
return true;
}
+ // If something has corrupted the traversal we want to detect
+ // these on not only the children (tested below) but on the node itself
+ // in case it was bypassed.
+ if (element["id"] == 'lastChild' || element["name"] == 'lastChild' ||
+ element["id"] == 'previousSibling' || element["name"] == 'previousSibling' ||
+ element["id"] == 'children' || element["name"] == 'children') {
+ return true;
+ }
var childNodes = element.childNodes;
if (element.lastChild &&
element.lastChild !== childNodes[childNodes.length -1]) {
@@ -13813,6 +13821,7 @@
// allowing us to check for clobbering that may show up in other accesses.
if (child["id"] == 'attributes' || child["name"] == 'attributes' ||
child["id"] == 'lastChild' || child["name"] == 'lastChild' ||
+ child["id"] == 'previousSibling' || child["name"] == 'previousSibling' ||
child["id"] == 'children' || child["name"] == 'children') {
return true;
}
@@ -40830,6 +40839,9 @@
*/
class _ValidatingTreeSanitizer implements NodeTreeSanitizer {
NodeValidator validator;
+
+ /// Did we modify the tree by removing anything.
+ bool modifiedTree = false;
_ValidatingTreeSanitizer(this.validator) {}
void sanitizeTree(Node node) {
@@ -40838,11 +40850,15 @@
var child = node.lastChild;
while (null != child) {
- var nextChild;
+ Node? nextChild;
try {
- // Child may be removed during the walk, and we may not
- // even be able to get its previousNode.
+ // Child may be removed during the walk, and we may not even be able
+ // to get its previousNode. But it's also possible that previousNode
+ // (i.e. previousSibling) is being spoofed, so double-check it.
nextChild = child.previousNode;
+ if (nextChild != null && nextChild.nextNode != child) {
+ throw StateError("Corrupt HTML");
+ }
} catch (e) {
// Child appears bad, remove it. We want to check the rest of the
// children of node and, but we have no way of getting to the next
@@ -40856,7 +40872,12 @@
}
}
+ modifiedTree = false;
walk(node, null);
+ while (modifiedTree) {
+ modifiedTree = false;
+ walk(node, null);
+ }
}
/// Aggressively try to remove node.
@@ -40864,7 +40885,8 @@
// If we have the parent, it's presumably already passed more sanitization
// or is the fragment, so ask it to remove the child. And if that fails
// try to set the outer html.
- if (parent == null) {
+ modifiedTree = true;
+ if (parent == null || parent != node.parentNode) {
node.remove();
} else {
parent._removeChild(node);
diff --git a/sdk_nnbd/lib/internal/async_cast.dart b/sdk_nnbd/lib/internal/async_cast.dart
index 677f303..306ada8 100644
--- a/sdk_nnbd/lib/internal/async_cast.dart
+++ b/sdk_nnbd/lib/internal/async_cast.dart
@@ -50,9 +50,9 @@
_source.onError(handleError);
if (handleError == null) {
_handleError = null;
- } else if (handleError is void Function(Object, StackTrace?)) {
+ } else if (handleError is void Function(Object, StackTrace)) {
_handleError = _zone
- .registerBinaryCallback<dynamic, Object, StackTrace?>(handleError);
+ .registerBinaryCallback<dynamic, Object, StackTrace>(handleError);
} else if (handleError is void Function(Object)) {
_handleError = _zone.registerUnaryCallback<dynamic, Object>(handleError);
} else {
@@ -74,8 +74,8 @@
var handleError = _handleError;
if (handleError == null) {
_zone.handleUncaughtError(error, stack);
- } else if (handleError is void Function(Object, StackTrace?)) {
- _zone.runBinaryGuarded<Object, StackTrace?>(handleError, error, stack);
+ } else if (handleError is void Function(Object, StackTrace)) {
+ _zone.runBinaryGuarded<Object, StackTrace>(handleError, error, stack);
} else {
_zone.runUnaryGuarded<Object>(
handleError as void Function(Object), error);
diff --git a/sdk_nnbd/lib/io/common.dart b/sdk_nnbd/lib/io/common.dart
index f8fda15..e6a56bc 100644
--- a/sdk_nnbd/lib/io/common.dart
+++ b/sdk_nnbd/lib/io/common.dart
@@ -105,7 +105,7 @@
int j = start;
for (int i = 0; i < length; i++) {
int value = buffer[j];
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(value, "buffer[]");
newBuffer[i] = value;
j++;
diff --git a/sdk_nnbd/lib/io/data_transformer.dart b/sdk_nnbd/lib/io/data_transformer.dart
index 81fe195..4346a1a 100644
--- a/sdk_nnbd/lib/io/data_transformer.dart
+++ b/sdk_nnbd/lib/io/data_transformer.dart
@@ -598,7 +598,7 @@
}
void addSlice(List<int> data, int start, int end, bool isLast) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(end, "end");
if (_closed) return;
RangeError.checkValidRange(start, end, data.length);
diff --git a/sdk_nnbd/lib/io/directory_impl.dart b/sdk_nnbd/lib/io/directory_impl.dart
index 06777e7..9ca5b6c 100644
--- a/sdk_nnbd/lib/io/directory_impl.dart
+++ b/sdk_nnbd/lib/io/directory_impl.dart
@@ -213,7 +213,7 @@
}
Directory renameSync(String newPath) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(newPath, "newPath");
var result = _rename(_Namespace._namespace, _rawPath, newPath);
if (result is OSError) {
@@ -236,7 +236,7 @@
List<FileSystemEntity> listSync(
{bool recursive: false, bool followLinks: true}) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(recursive, "recursive");
ArgumentError.checkNotNull(followLinks, "followLinks");
var result = <FileSystemEntity>[];
diff --git a/sdk_nnbd/lib/io/file_system_entity.dart b/sdk_nnbd/lib/io/file_system_entity.dart
index 737d673..0741583 100644
--- a/sdk_nnbd/lib/io/file_system_entity.dart
+++ b/sdk_nnbd/lib/io/file_system_entity.dart
@@ -825,7 +825,7 @@
// TODO(bkonyi): find a way to do this with raw paths.
static String _trimTrailingPathSeparators(String path) {
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(path, "path");
if (Platform.isWindows) {
while (path.length > 1 &&
diff --git a/sdk_nnbd/lib/io/io_sink.dart b/sdk_nnbd/lib/io/io_sink.dart
index 38296b8..d4a3ec8 100644
--- a/sdk_nnbd/lib/io/io_sink.dart
+++ b/sdk_nnbd/lib/io/io_sink.dart
@@ -31,7 +31,8 @@
* The [Encoding] used when writing strings. Depending on the
* underlying consumer this property might be mutable.
*/
- Encoding encoding;
+ Encoding get encoding;
+ void set encoding(Encoding newEncoding);
/**
* Adds byte [data] to the target consumer, ignoring [encoding].
diff --git a/sdk_nnbd/lib/io/secure_socket.dart b/sdk_nnbd/lib/io/secure_socket.dart
index 857d8b2..fef9d16 100644
--- a/sdk_nnbd/lib/io/secure_socket.dart
+++ b/sdk_nnbd/lib/io/secure_socket.dart
@@ -581,12 +581,12 @@
if (host is! String && host is! InternetAddress) {
throw new ArgumentError("host is not a String or an InternetAddress");
}
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(requestedPort, "requestedPort");
if (requestedPort < 0 || requestedPort > 65535) {
throw ArgumentError("requestedPort is not in the range 0..65535");
}
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
ArgumentError.checkNotNull(
requestClientCertificate, "requestClientCertificate");
ArgumentError.checkNotNull(
@@ -698,7 +698,7 @@
throw new ArgumentError(
"Invalid bytes parameter in SecureSocket.read (bytes: $bytes)");
}
- // TODO: Remove once non-nullability is sound.
+ // TODO(40614): Remove once non-nullability is sound.
offset = _fixOffset(offset);
if (offset < 0) {
throw new ArgumentError(
diff --git a/sdk_nnbd/lib/io/socket.dart b/sdk_nnbd/lib/io/socket.dart
index dc92d8b..bf1e209 100644
--- a/sdk_nnbd/lib/io/socket.dart
+++ b/sdk_nnbd/lib/io/socket.dart
@@ -6,11 +6,15 @@
/**
* [InternetAddressType] is the type an [InternetAddress]. Currently,
- * IP version 4 (IPv4) and IP version 6 (IPv6) are supported.
+ * IP version 4 (IPv4), IP version 6 (IPv6) and Unix domain address are
+ * supported. Unix domain sockets are available only on Linux, MacOS and
+ * Android.
*/
class InternetAddressType {
static const InternetAddressType IPv4 = const InternetAddressType._(0);
static const InternetAddressType IPv6 = const InternetAddressType._(1);
+ @Since("2.8")
+ static const InternetAddressType unix = const InternetAddressType._(2);
static const InternetAddressType any = const InternetAddressType._(-1);
@Deprecated("Use IPv4 instead")
@@ -25,8 +29,9 @@
const InternetAddressType._(this._value);
factory InternetAddressType._from(int value) {
- if (value == 0) return IPv4;
- if (value == 1) return IPv6;
+ if (value == IPv4._value) return IPv4;
+ if (value == IPv6._value) return IPv6;
+ if (value == unix._value) return unix;
throw new ArgumentError("Invalid type: $value");
}
@@ -41,6 +46,8 @@
return "IPv4";
case 1:
return "IPv6";
+ case 2:
+ return "Unix";
default:
throw new ArgumentError("Invalid InternetAddress");
}
@@ -50,7 +57,7 @@
}
/**
- * An internet address.
+ * An internet address or a Unix domain address.
*
* This object holds an internet address. If this internet address
* is the result of a DNS lookup, the address also holds the hostname
@@ -93,27 +100,35 @@
external static InternetAddress get ANY_IP_V6;
/**
- * The [type] of the [InternetAddress] specified what IP protocol.
+ * The address family of the [InternetAddress].
*/
InternetAddressType get type;
/**
- * The numeric address of the host. For IPv4 addresses this is using
- * the dotted-decimal notation. For IPv6 it is using the
- * hexadecimal representation.
+ * The numeric address of the host.
+ *
+ * For IPv4 addresses this is using the dotted-decimal notation.
+ * For IPv6 it is using the hexadecimal representation.
+ * For Unix domain addresses, this is a file path.
*/
String get address;
/**
- * The host used to lookup the address. If there is no host
- * associated with the address this returns the numeric address.
+ * The host used to lookup the address.
+ *
+ * If there is no host associated with the address this returns the [address].
*/
String get host;
/**
- * Get the raw address of this [InternetAddress]. The result is either a
- * 4 or 16 byte long list. The returned list is a copy, making it possible
- * to change the list without modifying the [InternetAddress].
+ * The raw address of this [InternetAddress].
+ *
+ * For an IP address, the result is either a 4 or 16 byte long list.
+ * For a Unix domain address, UTF-8 encoded byte sequences that represents
+ * [address] is returned.
+ *
+ * The returned list is a fresh copy, making it possible to change the list without
+ * modifying the [InternetAddress].
*/
Uint8List get rawAddress;
@@ -133,17 +148,48 @@
bool get isMulticast;
/**
- * Creates a new [InternetAddress] from a numeric address.
+ * Creates a new [InternetAddress] from a numeric address or a file path.
*
- * If the address in [address] is not a numeric IPv4
- * (dotted-decimal notation) or IPv6 (hexadecimal representation).
- * address [ArgumentError] is thrown.
+ * If [type] is [InternetAddressType.IPv4], [address] must be a numeric IPv4
+ * address (dotted-decimal notation).
+ * If [type] is [InternetAddressType.IPv6], [address] must be a numeric IPv6
+ * address (hexadecimal notation).
+ * If [type] is [InternetAddressType.unix], [address] must be a a valid file
+ * path.
+ * If [type] is omitted, [address] must be either a numeric IPv4 or IPv6
+ * address and the type is inferred from the format.
+ *
+ * To create a Unix domain address, [type] should be
+ * [InternetAddressType.unix] and [address] should be a string.
*/
- external factory InternetAddress(String address);
+ external factory InternetAddress(String address,
+ {@Since("2.8") InternetAddressType? type});
/**
- * Perform a reverse dns lookup on the [address], creating a new
- * [InternetAddress] where the host field set to the result.
+ * Creates a new [InternetAddress] from the provided raw address bytes.
+ *
+ * If the [type] is [InternetAddressType.IPv4], the [rawAddress] must have
+ * length 4.
+ * If the [type] is [InternetAddressType.IPv6], the [rawAddress] must have
+ * length 16.
+ * If the [type] is [InternetAddressType.IPv4], the [rawAddress] must be a
+ * valid UTF-8 encoded file path.
+ *
+ * If [type] is omitted, the [rawAddress] must have a length of either 4 or
+ * 16, in which case the type defaults to [InternetAddress.IPv4] or
+ * [InternetAddress.IPv6] respectively.
+ */
+ external factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+ {@Since("2.8") InternetAddressType? type});
+
+ /**
+ * Perform a reverse DNS lookup on this [address]
+ *
+ * Returns a new [InternetAddress] with the same address, but where the [host]
+ * field set to the result of the lookup.
+ *
+ * If this address is Unix domain addresses, no lookup is performed and this
+ * address is returned directly.
*/
Future<InternetAddress> reverse();
@@ -817,28 +863,30 @@
void setRawOption(RawSocketOption option);
/**
- * Returns the port used by this socket.
+ * The port used by this socket.
*
* Throws a [SocketException] if the socket is closed.
+ * The port is 0 if the socket is a Unix domain socket.
*/
int get port;
/**
- * Returns the remote port connected to by this socket.
+ * The remote port connected to by this socket.
*
* Throws a [SocketException] if the socket is closed.
+ * The port is 0 if the socket is a Unix domain socket.
*/
int get remotePort;
/**
- * Returns the [InternetAddress] used to connect this socket.
+ * The [InternetAddress] used to connect this socket.
*
* Throws a [SocketException] if the socket is closed.
*/
InternetAddress get address;
/**
- * Returns the remote [InternetAddress] connected to by this socket.
+ * The remote [InternetAddress] connected to by this socket.
*
* Throws a [SocketException] if the socket is closed.
*/
diff --git a/sdk_nnbd/lib/mirrors/mirrors.dart b/sdk_nnbd/lib/mirrors/mirrors.dart
index baec2f4..95a8aff 100644
--- a/sdk_nnbd/lib/mirrors/mirrors.dart
+++ b/sdk_nnbd/lib/mirrors/mirrors.dart
@@ -226,7 +226,7 @@
* 2. the isolate being reflected by this mirror is the same isolate being
* reflected by [other].
*/
- bool operator ==(other);
+ bool operator ==(Object other);
/**
* Loads the library at the given uri into this isolate.
@@ -545,7 +545,7 @@
* b. the remote objects reflected by this mirror and by [other] are
* identical.
*/
- bool operator ==(other);
+ bool operator ==(Object other);
}
/**
@@ -630,7 +630,7 @@
* 2. The library being reflected by this mirror and the library being
* reflected by [other] are the same library in the same isolate.
*/
- bool operator ==(other);
+ bool operator ==(Object other);
/**
* Returns a list of the imports and exports in this library;
@@ -888,7 +888,7 @@
* Note that if the reflected class is an invocation of a generic class, 2.
* implies that the reflected class and [other] have equal type arguments.
*/
- bool operator ==(other);
+ bool operator ==(Object other);
/**
* Returns whether the class denoted by the receiver is a subclass of the
@@ -948,7 +948,7 @@
* 1. [other] is a mirror of the same kind, and
* 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
*/
- bool operator ==(other);
+ bool operator ==(Object other);
}
/**
@@ -1081,7 +1081,7 @@
* 1. [other] is a mirror of the same kind, and
* 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
*/
- bool operator ==(other);
+ bool operator ==(Object other);
}
/**
@@ -1127,7 +1127,7 @@
* 1. [other] is a mirror of the same kind, and
* 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
*/
- bool operator ==(other);
+ bool operator ==(Object other);
}
/**
diff --git a/tests/angular/.blazeproject b/tests/angular/.blazeproject
deleted file mode 100644
index 8ca3309..0000000
--- a/tests/angular/.blazeproject
+++ /dev/null
@@ -1,7 +0,0 @@
-directories:
- ads/acx2/testing/angular
-
-targets:
- //ads/acx2/testing/angular/...:all
-additional_languages:
- dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/analyses/analysis_helper.dart b/tests/compiler/dart2js/analyses/analysis_helper.dart
index b422f84..d70a4bc 100644
--- a/tests/compiler/dart2js/analyses/analysis_helper.dart
+++ b/tests/compiler/dart2js/analyses/analysis_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:convert' as json;
import 'dart:io';
diff --git a/tests/compiler/dart2js/analyses/analyze_test.dart b/tests/compiler/dart2js/analyses/analyze_test.dart
index 27e50dd..b0f6832 100644
--- a/tests/compiler/dart2js/analyses/analyze_test.dart
+++ b/tests/compiler/dart2js/analyses/analyze_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:testing/src/run_tests.dart" as testing show main;
main() {
diff --git a/tests/compiler/dart2js/analyses/api_dynamic_test.dart b/tests/compiler/dart2js/analyses/api_dynamic_test.dart
index e06471d..d9a0bf7 100644
--- a/tests/compiler/dart2js/analyses/api_dynamic_test.dart
+++ b/tests/compiler/dart2js/analyses/api_dynamic_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'analysis_helper.dart';
diff --git a/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart b/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
index b65a57f..e435e6d 100644
--- a/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
+++ b/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'analysis_helper.dart';
diff --git a/tests/compiler/dart2js/analyses/static_type_visitor_test.dart b/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
index 6d59f72..9fb7a2b 100644
--- a/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
+++ b/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/ir/static_type.dart';
diff --git a/tests/compiler/dart2js/annotations/annotations_test.dart b/tests/compiler/dart2js/annotations/annotations_test.dart
index 38b6bf5..82c35a0 100644
--- a/tests/compiler/dart2js/annotations/annotations_test.dart
+++ b/tests/compiler/dart2js/annotations/annotations_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/annotations/data/basic.dart b/tests/compiler/dart2js/annotations/data/basic.dart
index c60693b..c7f29c9 100644
--- a/tests/compiler/dart2js/annotations/data/basic.dart
+++ b/tests/compiler/dart2js/annotations/data/basic.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
noInline();
tryInline();
diff --git a/tests/compiler/dart2js/annotations/data/directives.dart b/tests/compiler/dart2js/annotations/data/directives.dart
index dbebee2..fadf7d8 100644
--- a/tests/compiler/dart2js/annotations/data/directives.dart
+++ b/tests/compiler/dart2js/annotations/data/directives.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
typesTrust();
typesCheck();
diff --git a/tests/compiler/dart2js/annotations/data/errors.dart b/tests/compiler/dart2js/annotations/data/errors.dart
index c170331..ce12b6b 100644
--- a/tests/compiler/dart2js/annotations/data/errors.dart
+++ b/tests/compiler/dart2js/annotations/data/errors.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
unknown();
noInlineField;
diff --git a/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart b/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
index 111e57d..2307c08 100644
--- a/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
+++ b/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:compiler/src/js/js.dart";
import "package:compiler/src/js/rewrite_async.dart";
diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart
index a92c1dc..0701d19 100644
--- a/tests/compiler/dart2js/closure/closure_test.dart
+++ b/tests/compiler/dart2js/closure/closure_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io' hide Link;
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:_fe_analyzer_shared/src/util/link.dart' show Link;
diff --git a/tests/compiler/dart2js/closure/data/captured_variable.dart b/tests/compiler/dart2js/closure/data/captured_variable.dart
index 409184d..edc1add 100644
--- a/tests/compiler/dart2js/closure/data/captured_variable.dart
+++ b/tests/compiler/dart2js/closure/data/captured_variable.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: boxedLoopVariableExample:*/
boxedLoopVariableExample() {
var input = [1, 2, 3];
diff --git a/tests/compiler/dart2js/closure/data/generic.dart b/tests/compiler/dart2js/closure/data/generic.dart
index c1a3f5d..a2f552d 100644
--- a/tests/compiler/dart2js/closure/data/generic.dart
+++ b/tests/compiler/dart2js/closure/data/generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class1<T> {
/*member: Class1.field:hasThis*/
var field = /*fields=[T],free=[T],hasThis*/ () => T;
diff --git a/tests/compiler/dart2js/closure/data/instantiation.dart b/tests/compiler/dart2js/closure/data/instantiation.dart
index 8f95b60..19949ff 100644
--- a/tests/compiler/dart2js/closure/data/instantiation.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation.dart
@@ -2,6 +2,8 @@
// 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.7
+
T id<T>(T t) => t;
method<S>(S s) {
diff --git a/tests/compiler/dart2js/closure/data/instantiation1.dart b/tests/compiler/dart2js/closure/data/instantiation1.dart
index e8ba217..3f31e41 100644
--- a/tests/compiler/dart2js/closure/data/instantiation1.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation1.dart
@@ -2,6 +2,8 @@
// 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.7
+
int f<T>(T a) => null;
typedef int F<R>(R a);
diff --git a/tests/compiler/dart2js/closure/data/instantiation2.dart b/tests/compiler/dart2js/closure/data/instantiation2.dart
index d3a616f..8e75f09 100644
--- a/tests/compiler/dart2js/closure/data/instantiation2.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation2.dart
@@ -2,6 +2,8 @@
// 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.7
+
bool f<T>(T a) => a is T;
typedef bool F<R>(R a);
diff --git a/tests/compiler/dart2js/closure/data/instantiation3.dart b/tests/compiler/dart2js/closure/data/instantiation3.dart
index aeeee92..2157d67 100644
--- a/tests/compiler/dart2js/closure/data/instantiation3.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation3.dart
@@ -2,6 +2,8 @@
// 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.7
+
int f<T>(T a) => null;
typedef int F<R>(R a);
diff --git a/tests/compiler/dart2js/closure/data/instantiation4.dart b/tests/compiler/dart2js/closure/data/instantiation4.dart
index 957eca0..05b8caf 100644
--- a/tests/compiler/dart2js/closure/data/instantiation4.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation4.dart
@@ -2,6 +2,8 @@
// 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.7
+
bool f<T>(T a) => a is T;
typedef bool F<R>(R a);
diff --git a/tests/compiler/dart2js/closure/data/list_literal_class.dart b/tests/compiler/dart2js/closure/data/list_literal_class.dart
index 080bb77..8ce3e2e 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_class.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_class.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*member: A.:hasThis*/
diff --git a/tests/compiler/dart2js/closure/data/list_literal_method.dart b/tests/compiler/dart2js/closure/data/list_literal_method.dart
index 03a05c8..2a93a2d 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_method.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
index a20f0b8..516b390 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*member: A.:hasThis*/
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
index 87a5673..42e8cf2 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/closure/data/map_literal_class.dart b/tests/compiler/dart2js/closure/data/map_literal_class.dart
index f6f1f0c..f41747b 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_class.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_class.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*member: A.:hasThis*/
diff --git a/tests/compiler/dart2js/closure/data/map_literal_method.dart b/tests/compiler/dart2js/closure/data/map_literal_method.dart
index 51f99a9..de83643 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_method.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
index da671a3..6ee00d3 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*member: A.:hasThis*/
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
index 27c33a2..d2adfbb 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/closure/data/mixed.dart b/tests/compiler/dart2js/closure/data/mixed.dart
index 20fdcbe..a9a0635 100644
--- a/tests/compiler/dart2js/closure/data/mixed.dart
+++ b/tests/compiler/dart2js/closure/data/mixed.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that free variables aren't mixed between capturing and non-capturing
// closures.
diff --git a/tests/compiler/dart2js/closure/data/mutations.dart b/tests/compiler/dart2js/closure/data/mutations.dart
index 8516ba3..03597b5 100644
--- a/tests/compiler/dart2js/closure/data/mutations.dart
+++ b/tests/compiler/dart2js/closure/data/mutations.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that captured variables are boxed regardless of where they are mutated.
/*member: mutateUnused:*/
diff --git a/tests/compiler/dart2js/closure/data/nested_closures.dart b/tests/compiler/dart2js/closure/data/nested_closures.dart
index 2f2cb12..c061cb6 100644
--- a/tests/compiler/dart2js/closure/data/nested_closures.dart
+++ b/tests/compiler/dart2js/closure/data/nested_closures.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Test boxing/captures for nested closures.
/*member: useOne:box=(box0 which holds [b1])*/ useOne(/*boxed*/ b1) {
diff --git a/tests/compiler/dart2js/closure/data/parameter_in_try.dart b/tests/compiler/dart2js/closure/data/parameter_in_try.dart
index bf4cb90..65a4e81 100644
--- a/tests/compiler/dart2js/closure/data/parameter_in_try.dart
+++ b/tests/compiler/dart2js/closure/data/parameter_in_try.dart
@@ -2,6 +2,8 @@
// 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.7
+
readParameterInFinally(/*inTry*/ parameter) {
try {
if (parameter) {
diff --git a/tests/compiler/dart2js/closure/data/test_type_class.dart b/tests/compiler/dart2js/closure/data/test_type_class.dart
index 222ca14..ead1797 100644
--- a/tests/compiler/dart2js/closure/data/test_type_class.dart
+++ b/tests/compiler/dart2js/closure/data/test_type_class.dart
@@ -2,6 +2,8 @@
// 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.7
+
////////////////////////////////////////////////////////////////////////////////
/// Explicit is-test is always required.
////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/closure/data/test_type_method.dart b/tests/compiler/dart2js/closure/data/test_type_method.dart
index bab82c3..faad952 100644
--- a/tests/compiler/dart2js/closure/data/test_type_method.dart
+++ b/tests/compiler/dart2js/closure/data/test_type_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
////////////////////////////////////////////////////////////////////////////////
/// Explicit is-test is always required.
////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/closure/data/two_local_functions.dart b/tests/compiler/dart2js/closure/data/two_local_functions.dart
index a7ecf9c..b90d407 100644
--- a/tests/compiler/dart2js/closure/data/two_local_functions.dart
+++ b/tests/compiler/dart2js/closure/data/two_local_functions.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/**/ local1() {}
/*fields=[local1],free=[local1]*/ local2() => local1();
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_class.dart b/tests/compiler/dart2js/closure/data/type_annotations_class.dart
index 853ffd6..1732242 100644
--- a/tests/compiler/dart2js/closure/data/type_annotations_class.dart
+++ b/tests/compiler/dart2js/closure/data/type_annotations_class.dart
@@ -2,6 +2,8 @@
// 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.7
+
////////////////////////////////////////////////////////////////////////////////
/// A sound initialization of a local variable doesn't capture the type
/// variable.
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_method.dart b/tests/compiler/dart2js/closure/data/type_annotations_method.dart
index 878e3bd..4bf4396 100644
--- a/tests/compiler/dart2js/closure/data/type_annotations_method.dart
+++ b/tests/compiler/dart2js/closure/data/type_annotations_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
////////////////////////////////////////////////////////////////////////////////
/// A sound assignment to a local variable doesn't capture the type variable.
////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/closure/data/type_arguments_class.dart b/tests/compiler/dart2js/closure/data/type_arguments_class.dart
index 2340013..4ba386d 100644
--- a/tests/compiler/dart2js/closure/data/type_arguments_class.dart
+++ b/tests/compiler/dart2js/closure/data/type_arguments_class.dart
@@ -2,6 +2,8 @@
// 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.7
+
////////////////////////////////////////////////////////////////////////////////
/// A constructor invocation to a class that needs type arguments captures the
/// type variables.
diff --git a/tests/compiler/dart2js/closure/data/type_arguments_method.dart b/tests/compiler/dart2js/closure/data/type_arguments_method.dart
index ad35ada..21bf745 100644
--- a/tests/compiler/dart2js/closure/data/type_arguments_method.dart
+++ b/tests/compiler/dart2js/closure/data/type_arguments_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
////////////////////////////////////////////////////////////////////////////////
/// A constructor invocation for a class that needs type arguments captures the
/// type variables.
diff --git a/tests/compiler/dart2js/closure/data/type_variables.dart b/tests/compiler/dart2js/closure/data/type_variables.dart
index 1521b3a..ea99255 100644
--- a/tests/compiler/dart2js/closure/data/type_variables.dart
+++ b/tests/compiler/dart2js/closure/data/type_variables.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class1<T> {
/*member: Class1.field:hasThis*/
var field = /*fields=[T],free=[T],hasThis*/ () => T;
diff --git a/tests/compiler/dart2js/closure/show.dart b/tests/compiler/dart2js/closure/show.dart
index e300f74..535a18b 100644
--- a/tests/compiler/dart2js/closure/show.dart
+++ b/tests/compiler/dart2js/closure/show.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Helper program that shows the closure data on a dart program.
import 'package:args/args.dart';
diff --git a/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
index 35f344f..210f2f1 100644
--- a/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
+++ b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2014, 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.
+
+// @dart = 2.7
// Test constant folding on numbers.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/array_static_intercept_test.dart b/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
index ee3c87a..4f02ed5 100644
--- a/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/builtin_equals_test.dart b/tests/compiler/dart2js/codegen/builtin_equals_test.dart
index 29d1577..d5281f8 100644
--- a/tests/compiler/dart2js/codegen/builtin_equals_test.dart
+++ b/tests/compiler/dart2js/codegen/builtin_equals_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart b/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
index 36e15f7..b1c6312 100644
--- a/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
+++ b/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/class_codegen2_test.dart b/tests/compiler/dart2js/codegen/class_codegen2_test.dart
index 213c5f3..788ba2d 100644
--- a/tests/compiler/dart2js/codegen/class_codegen2_test.dart
+++ b/tests/compiler/dart2js/codegen/class_codegen2_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2012, 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.
+
+// @dart = 2.7
// Test that parameters keep their names in the output.
import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/class_codegen_test.dart b/tests/compiler/dart2js/codegen/class_codegen_test.dart
index d46135e..a4f0c3d 100644
--- a/tests/compiler/dart2js/codegen/class_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/class_codegen_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2012, 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.
+
+// @dart = 2.7
// Test that parameters keep their names in the output.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/class_order_test.dart b/tests/compiler/dart2js/codegen/class_order_test.dart
index 28fc7f2..b5f8b8d 100644
--- a/tests/compiler/dart2js/codegen/class_order_test.dart
+++ b/tests/compiler/dart2js/codegen/class_order_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2011, 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.
+
+// @dart = 2.7
// Test that parameters keep their names in the output.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart b/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart
index 74d86f6..9695510 100644
--- a/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart
+++ b/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/closure_codegen_test.dart b/tests/compiler/dart2js/codegen/closure_codegen_test.dart
index 83119ac..516d526 100644
--- a/tests/compiler/dart2js/codegen/closure_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/closure_codegen_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2012, 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.
+
+// @dart = 2.7
// Test that parameters keep their names in the output.
import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/code_motion_test.dart b/tests/compiler/dart2js/codegen/code_motion_test.dart
index d0f1e59..bd374f0 100644
--- a/tests/compiler/dart2js/codegen/code_motion_test.dart
+++ b/tests/compiler/dart2js/codegen/code_motion_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
index 465bc32..a821884 100644
--- a/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2014, 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.
+
+// @dart = 2.7
// Test constant folding on numbers.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/constant_folding_test.dart b/tests/compiler/dart2js/codegen/constant_folding_test.dart
index 227d97b..06d09ad 100644
--- a/tests/compiler/dart2js/codegen/constant_folding_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_folding_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2012, 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.
+
+// @dart = 2.7
// Test constant folding on numbers.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/constant_namer_test.dart b/tests/compiler/dart2js/codegen/constant_namer_test.dart
index 8893422..b24c281 100644
--- a/tests/compiler/dart2js/codegen/constant_namer_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_namer_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/dead_code_test.dart b/tests/compiler/dart2js/codegen/dead_code_test.dart
index c7ffd88..9b7f749 100644
--- a/tests/compiler/dart2js/codegen/dead_code_test.dart
+++ b/tests/compiler/dart2js/codegen/dead_code_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart b/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
index 49de078..dc56466 100644
--- a/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/declare_once_test.dart b/tests/compiler/dart2js/codegen/declare_once_test.dart
index 849b1bf..9e8be8d 100644
--- a/tests/compiler/dart2js/codegen/declare_once_test.dart
+++ b/tests/compiler/dart2js/codegen/declare_once_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2013, 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.
+
+// @dart = 2.7
// Test that parameters keep their names in the output.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart b/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
index 67102fe..a7aaaa9 100644
--- a/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
+++ b/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Check that calls through fields elide the call-through stub. This
// optimization is done by the simplifier, so inlining does not need to be
// enabled.
diff --git a/tests/compiler/dart2js/codegen/emit_const_fields_test.dart b/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
index fbfa9f4..82c8571 100644
--- a/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
+++ b/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2013, 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.
+
+// @dart = 2.7
// Test that unused static consts are not emitted.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/equals_test.dart b/tests/compiler/dart2js/codegen/equals_test.dart
index 45bbf50..7aa71ad 100644
--- a/tests/compiler/dart2js/codegen/equals_test.dart
+++ b/tests/compiler/dart2js/codegen/equals_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library equals_test;
import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/expect_annotations2_test.dart b/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
index fad77c6..b4d1338 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import 'package:compiler/compiler_new.dart';
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
index 8775d9c..f25bec8 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/codegen/field_codegen_test.dart b/tests/compiler/dart2js/codegen/field_codegen_test.dart
index 76eea98..eeb446c7b 100644
--- a/tests/compiler/dart2js/codegen/field_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/field_codegen_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2012, 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.
+
+// @dart = 2.7
// Test that parameters keep their names in the output.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/field_update_test.dart b/tests/compiler/dart2js/codegen/field_update_test.dart
index 995ce95..81c5e53 100644
--- a/tests/compiler/dart2js/codegen/field_update_test.dart
+++ b/tests/compiler/dart2js/codegen/field_update_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/for_in_test.dart b/tests/compiler/dart2js/codegen/for_in_test.dart
index 6c5cb0e..340ffc0 100644
--- a/tests/compiler/dart2js/codegen/for_in_test.dart
+++ b/tests/compiler/dart2js/codegen/for_in_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/forloop_box_test.dart b/tests/compiler/dart2js/codegen/forloop_box_test.dart
index aa90153..486e862 100644
--- a/tests/compiler/dart2js/codegen/forloop_box_test.dart
+++ b/tests/compiler/dart2js/codegen/forloop_box_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart b/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
index 334ecc4..77acbf8 100644
--- a/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
+++ b/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
index 6695ad2..48ceec8 100644
--- a/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2012, 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.
+
+// @dart = 2.7
// Test that dart2js gvns dynamic getters that don't have side
// effects.
diff --git a/tests/compiler/dart2js/codegen/gvn_test.dart b/tests/compiler/dart2js/codegen/gvn_test.dart
index f8ce1a1..d359896 100644
--- a/tests/compiler/dart2js/codegen/gvn_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/identity_test.dart b/tests/compiler/dart2js/codegen/identity_test.dart
index 03ef1ba..26f9dd9 100644
--- a/tests/compiler/dart2js/codegen/identity_test.dart
+++ b/tests/compiler/dart2js/codegen/identity_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/if_do_while_test.dart b/tests/compiler/dart2js/codegen/if_do_while_test.dart
index 06c963c..e8688b6 100644
--- a/tests/compiler/dart2js/codegen/if_do_while_test.dart
+++ b/tests/compiler/dart2js/codegen/if_do_while_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart b/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
index ee6c404..53bc1f5 100644
--- a/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
+++ b/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/interceptor_test.dart b/tests/compiler/dart2js/codegen/interceptor_test.dart
index cba680f..beb8ba3 100644
--- a/tests/compiler/dart2js/codegen/interceptor_test.dart
+++ b/tests/compiler/dart2js/codegen/interceptor_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/interpolation_folding_test.dart b/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
index 4b88d9d..1877ff8 100644
--- a/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
+++ b/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/inverse_operator_test.dart b/tests/compiler/dart2js/codegen/inverse_operator_test.dart
index 5d5e1d2..e9c45c0 100644
--- a/tests/compiler/dart2js/codegen/inverse_operator_test.dart
+++ b/tests/compiler/dart2js/codegen/inverse_operator_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/is_function_test.dart b/tests/compiler/dart2js/codegen/is_function_test.dart
index 73b2d2f..aa03396 100644
--- a/tests/compiler/dart2js/codegen/is_function_test.dart
+++ b/tests/compiler/dart2js/codegen/is_function_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Test that checks that we are not added $isFunction properties on closure
/// classes.
diff --git a/tests/compiler/dart2js/codegen/is_inference2_test.dart b/tests/compiler/dart2js/codegen/is_inference2_test.dart
index 4117a99..c524a8a 100644
--- a/tests/compiler/dart2js/codegen/is_inference2_test.dart
+++ b/tests/compiler/dart2js/codegen/is_inference2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/is_inference_test.dart b/tests/compiler/dart2js/codegen/is_inference_test.dart
index 195e02c..8ea721b 100644
--- a/tests/compiler/dart2js/codegen/is_inference_test.dart
+++ b/tests/compiler/dart2js/codegen/is_inference_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
index f24357b..4b75ecd 100644
--- a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
+++ b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that `length` access in JSArray.indexOf is encoding using `.length` and
// not `.get$length()`.
diff --git a/tests/compiler/dart2js/codegen/licm_test.dart b/tests/compiler/dart2js/codegen/licm_test.dart
index 32f889c..4ee5013 100644
--- a/tests/compiler/dart2js/codegen/licm_test.dart
+++ b/tests/compiler/dart2js/codegen/licm_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Check that we hoist instructions in a loop condition, even if that
// condition involves control flow.
diff --git a/tests/compiler/dart2js/codegen/list_tracer_length_test.dart b/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
index 7f97bb9..7b81c20 100644
--- a/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
+++ b/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// TODO(johnniwinther): Currently this only works with the mock compiler.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
index 1aa5c2a..b192a95 100644
--- a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/literal_list_test.dart b/tests/compiler/dart2js/codegen/literal_list_test.dart
index ae346c3..e514901 100644
--- a/tests/compiler/dart2js/codegen/literal_list_test.dart
+++ b/tests/compiler/dart2js/codegen/literal_list_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/literal_map_test.dart b/tests/compiler/dart2js/codegen/literal_map_test.dart
index b5db2aa..99c7d0c 100644
--- a/tests/compiler/dart2js/codegen/literal_map_test.dart
+++ b/tests/compiler/dart2js/codegen/literal_map_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/load_elimination_test.dart b/tests/compiler/dart2js/codegen/load_elimination_test.dart
index 822a582..16305c0 100644
--- a/tests/compiler/dart2js/codegen/load_elimination_test.dart
+++ b/tests/compiler/dart2js/codegen/load_elimination_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/logical_expression_test.dart b/tests/compiler/dart2js/codegen/logical_expression_test.dart
index 2108602..90dba52 100644
--- a/tests/compiler/dart2js/codegen/logical_expression_test.dart
+++ b/tests/compiler/dart2js/codegen/logical_expression_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that logical or-expressions don't introduce unnecessary nots.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/loop_test.dart b/tests/compiler/dart2js/codegen/loop_test.dart
index acd1d88..5fdc5e8 100644
--- a/tests/compiler/dart2js/codegen/loop_test.dart
+++ b/tests/compiler/dart2js/codegen/loop_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
index 197f77c..aee5156 100644
--- a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
+++ b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2011, 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.
+
+// @dart = 2.7
// Test that parameters keep their names in the output.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/model_data/capture.dart b/tests/compiler/dart2js/codegen/model_data/capture.dart
index 251c751..7e47ed8 100644
--- a/tests/compiler/dart2js/codegen/model_data/capture.dart
+++ b/tests/compiler/dart2js/codegen/model_data/capture.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method1:params=0*/
@pragma('dart2js:noInline')
method1([a]) => /*access=[a],params=0*/ () => a;
diff --git a/tests/compiler/dart2js/codegen/model_data/constant_folding.dart b/tests/compiler/dart2js/codegen/model_data/constant_folding.dart
index ce74ab7..4b0d8c2 100644
--- a/tests/compiler/dart2js/codegen/model_data/constant_folding.dart
+++ b/tests/compiler/dart2js/codegen/model_data/constant_folding.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Derived from dart2js_extra/constant_folding_test
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/model_data/constructors.dart b/tests/compiler/dart2js/codegen/model_data/constructors.dart
index 6d25ce6..d5b81b4 100644
--- a/tests/compiler/dart2js/codegen/model_data/constructors.dart
+++ b/tests/compiler/dart2js/codegen/model_data/constructors.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
/*member: Class.constructor1:params=0*/
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
index 427eb7a..8a32b6e 100644
--- a/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:calls=*,params=0*/
main() {
method1(new Class1a());
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
index 546d97c..e5afcba 100644
--- a/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:calls=*,params=0*/
main() {
method1(new Class1a()..field1);
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart
index 0c1fa05..053a59c 100644
--- a/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:calls=*,params=0*/
main() {
method1(new Class1a());
diff --git a/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart b/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart
index 39e6f1e..aab00a0 100644
--- a/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart
+++ b/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*member: _field4:params=0*/
diff --git a/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart b/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart
index ec053ae..311b717 100644
--- a/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart
+++ b/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart
@@ -2,6 +2,8 @@
// 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.7
+
enum Enum {
a,
b,
diff --git a/tests/compiler/dart2js/codegen/model_data/field_set.dart b/tests/compiler/dart2js/codegen/model_data/field_set.dart
index 1bc4366..d5df0bd 100644
--- a/tests/compiler/dart2js/codegen/model_data/field_set.dart
+++ b/tests/compiler/dart2js/codegen/model_data/field_set.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:access=*,calls=*,params=0*/
main() {
method1(new Class1a());
diff --git a/tests/compiler/dart2js/codegen/model_data/fields.dart b/tests/compiler/dart2js/codegen/model_data/fields.dart
index 5f08845..187ca78 100644
--- a/tests/compiler/dart2js/codegen/model_data/fields.dart
+++ b/tests/compiler/dart2js/codegen/model_data/fields.dart
@@ -2,6 +2,8 @@
// 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.7
+
var field1a;
var field1b;
diff --git a/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart b/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart
index 4834159..d70dadf 100644
--- a/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart
+++ b/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
/*member: Class.method1:params=0*/
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/codegen/model_data/native.dart b/tests/compiler/dart2js/codegen/model_data/native.dart
index 02cae6f..366dd16 100644
--- a/tests/compiler/dart2js/codegen/model_data/native.dart
+++ b/tests/compiler/dart2js/codegen/model_data/native.dart
@@ -2,6 +2,8 @@
// 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.7
+
// ignore: import_internal_library
import 'dart:_js_helper';
diff --git a/tests/compiler/dart2js/codegen/model_data/native_inlined.dart b/tests/compiler/dart2js/codegen/model_data/native_inlined.dart
index 63d5cd6..5e13fba 100644
--- a/tests/compiler/dart2js/codegen/model_data/native_inlined.dart
+++ b/tests/compiler/dart2js/codegen/model_data/native_inlined.dart
@@ -2,6 +2,8 @@
// 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.7
+
// ignore: import_internal_library
import 'dart:_js_helper';
diff --git a/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart b/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart
index 33e8453..ddc05ff 100644
--- a/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart
+++ b/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart
@@ -2,6 +2,8 @@
// 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.7
+
// ignore: import_internal_library
import 'dart:_js_helper';
diff --git a/tests/compiler/dart2js/codegen/model_data/regress_36222.dart b/tests/compiler/dart2js/codegen/model_data/regress_36222.dart
index 6b2143d..6a5dbe9 100644
--- a/tests/compiler/dart2js/codegen/model_data/regress_36222.dart
+++ b/tests/compiler/dart2js/codegen/model_data/regress_36222.dart
@@ -2,6 +2,8 @@
// 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.7
+
typedef int BinaryFunc(int x, int y);
class A {
diff --git a/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart b/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart
index 31b2433..31a25e2 100644
--- a/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart
+++ b/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method1:params=0*/
@pragma('dart2js:noInline')
method1() {}
diff --git a/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart b/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
index 5720592..e26d48d 100644
--- a/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
+++ b/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
@@ -2,6 +2,8 @@
// 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.7
+
class I1 {}
class I2 {}
diff --git a/tests/compiler/dart2js/codegen/model_test.dart b/tests/compiler/dart2js/codegen/model_test.dart
index 34aaff1..95dedea 100644
--- a/tests/compiler/dart2js/codegen/model_test.dart
+++ b/tests/compiler/dart2js/codegen/model_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/modulo_remainder_test.dart b/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
index 7faffa0..68b5b74 100644
--- a/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
+++ b/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart b/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
index f3ac6fd..417887d 100644
--- a/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
+++ b/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/new_rti_is_test.dart b/tests/compiler/dart2js/codegen/new_rti_is_test.dart
index 06a3604..b22f311 100644
--- a/tests/compiler/dart2js/codegen/new_rti_is_test.dart
+++ b/tests/compiler/dart2js/codegen/new_rti_is_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library new_rti_is_test;
import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/no_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
index 7edc700..ae1a9f6 100644
--- a/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
+++ b/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
index cd9f5a7..b92f872 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import '../helpers/compiler_helper.dart';
import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
index 8d18091..a69550c 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
index 98db5e4..c414ad0 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/null_check_test.dart b/tests/compiler/dart2js/codegen/null_check_test.dart
index 63d226e..e97d18a 100644
--- a/tests/compiler/dart2js/codegen/null_check_test.dart
+++ b/tests/compiler/dart2js/codegen/null_check_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import '../helpers/compiler_helper.dart';
import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/codegen/null_type_test.dart b/tests/compiler/dart2js/codegen/null_type_test.dart
index 0a23eaf..c3b54ed 100644
--- a/tests/compiler/dart2js/codegen/null_type_test.dart
+++ b/tests/compiler/dart2js/codegen/null_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/number_output_test.dart b/tests/compiler/dart2js/codegen/number_output_test.dart
index 317b5ad..fa212c9 100644
--- a/tests/compiler/dart2js/codegen/number_output_test.dart
+++ b/tests/compiler/dart2js/codegen/number_output_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:expect/expect.dart';
import 'package:compiler/compiler_new.dart';
diff --git a/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart b/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
index 5c9aa95..c15c58d 100644
--- a/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
+++ b/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test. Failed due to trying to detach an HLocal twice.
// VMOptions=--enable_asserts
diff --git a/tests/compiler/dart2js/codegen/pragma_annotations_test.dart b/tests/compiler/dart2js/codegen/pragma_annotations_test.dart
index a4487ec..6dc0c9c 100644
--- a/tests/compiler/dart2js/codegen/pragma_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/pragma_annotations_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/codegen/pretty_parameter_test.dart b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
index 882be84..1e2257d 100644
--- a/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
+++ b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2011, 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.
+
+// @dart = 2.7
// Test that parameters keep their names in the output.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart b/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
index 210c142..a27d420 100644
--- a/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/regress_10231_test.dart b/tests/compiler/dart2js/codegen/regress_10231_test.dart
index 9133791..7c795ff 100644
--- a/tests/compiler/dart2js/codegen/regress_10231_test.dart
+++ b/tests/compiler/dart2js/codegen/regress_10231_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/10231.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
index 2648985..aed03d0 100644
--- a/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
+++ b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart b/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
index eece082..dd2bdaf 100644
--- a/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
+++ b/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that simple function subtype checks use predicates.
library simple_function_subtype_test;
diff --git a/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart b/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
index 21bb5d0..319c652 100644
--- a/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
+++ b/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// TODO(johnniwinther): Port this test to use the equivalence framework.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
index 7799586..6814800 100644
--- a/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2012, 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.
+
+// @dart = 2.7
// Test that parameters keep their names in the output.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/static_closure_test.dart b/tests/compiler/dart2js/codegen/static_closure_test.dart
index 7b3947d..b1697c2 100644
--- a/tests/compiler/dart2js/codegen/static_closure_test.dart
+++ b/tests/compiler/dart2js/codegen/static_closure_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that static functions are closurized as expected.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/strength_eq_test.dart b/tests/compiler/dart2js/codegen/strength_eq_test.dart
index 196776b..9db0cc4 100644
--- a/tests/compiler/dart2js/codegen/strength_eq_test.dart
+++ b/tests/compiler/dart2js/codegen/strength_eq_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2014, 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.
+
+// @dart = 2.7
// Test constant folding on numbers.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/string_add_test.dart b/tests/compiler/dart2js/codegen/string_add_test.dart
index 2b64f35..656b94d 100644
--- a/tests/compiler/dart2js/codegen/string_add_test.dart
+++ b/tests/compiler/dart2js/codegen/string_add_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/string_escapes_test.dart b/tests/compiler/dart2js/codegen/string_escapes_test.dart
index 9e774d2..d51d3e2 100644
--- a/tests/compiler/dart2js/codegen/string_escapes_test.dart
+++ b/tests/compiler/dart2js/codegen/string_escapes_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/string_interpolation_test.dart b/tests/compiler/dart2js/codegen/string_interpolation_test.dart
index c36f45e..712b35c 100644
--- a/tests/compiler/dart2js/codegen/string_interpolation_test.dart
+++ b/tests/compiler/dart2js/codegen/string_interpolation_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/switch_empty_default_test.dart b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
index 0ba4272..e4c9759 100644
--- a/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
+++ b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2014, 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.
+
+// @dart = 2.7
// Test constant folding on numbers.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/tdiv_test.dart b/tests/compiler/dart2js/codegen/tdiv_test.dart
index 2a212c7..ff52396 100644
--- a/tests/compiler/dart2js/codegen/tdiv_test.dart
+++ b/tests/compiler/dart2js/codegen/tdiv_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library tdiv_test;
import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart b/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
index 5868d23..0437ea1 100644
--- a/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
+++ b/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/tree_shaking_test.dart b/tests/compiler/dart2js/codegen/tree_shaking_test.dart
index 518851d..3b17476 100644
--- a/tests/compiler/dart2js/codegen/tree_shaking_test.dart
+++ b/tests/compiler/dart2js/codegen/tree_shaking_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
index 6cd1e63..09b1437 100644
--- a/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import "package:async_helper/async_helper.dart";
import '../helpers/memory_compiler.dart';
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
index 5937b0d..99ac443 100644
--- a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import "package:async_helper/async_helper.dart";
import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart b/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
index 35f1617..28b06c9 100644
--- a/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
+++ b/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/type_inference2_test.dart b/tests/compiler/dart2js/codegen/type_inference2_test.dart
index 77366de..549c627 100644
--- a/tests/compiler/dart2js/codegen/type_inference2_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/type_inference3_test.dart b/tests/compiler/dart2js/codegen/type_inference3_test.dart
index 0580e9e..b8e7ebf 100644
--- a/tests/compiler/dart2js/codegen/type_inference3_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/type_inference4_test.dart b/tests/compiler/dart2js/codegen/type_inference4_test.dart
index 754f094..7b63410 100644
--- a/tests/compiler/dart2js/codegen/type_inference4_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/type_inference5_test.dart b/tests/compiler/dart2js/codegen/type_inference5_test.dart
index e478856..7b70e4b 100644
--- a/tests/compiler/dart2js/codegen/type_inference5_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/type_inference8_test.dart b/tests/compiler/dart2js/codegen/type_inference8_test.dart
index 9150a65..382ef35 100644
--- a/tests/compiler/dart2js/codegen/type_inference8_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference8_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// TODO(johnniwinther): Move this test to the codegen folder.
import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart b/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
index d327223..b6d0db1 100644
--- a/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
+++ b/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/unused_empty_map_test.dart b/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
index cf3fa88..c705b09 100644
--- a/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
+++ b/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Ensure that unused empty HashMap nodes are dropped from the output.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/use_checks_test.dart b/tests/compiler/dart2js/codegen/use_checks_test.dart
index 6f95ee9..69fc215 100644
--- a/tests/compiler/dart2js/codegen/use_checks_test.dart
+++ b/tests/compiler/dart2js/codegen/use_checks_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/use_strict_test.dart b/tests/compiler/dart2js/codegen/use_strict_test.dart
index 9dfe0f5..4407f33 100644
--- a/tests/compiler/dart2js/codegen/use_strict_test.dart
+++ b/tests/compiler/dart2js/codegen/use_strict_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/compiler_new.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
index d8738ea..2cb17b7 100644
--- a/tests/compiler/dart2js/codegen/value_range2_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:compiler/src/inferrer/abstract_value_domain.dart";
import "package:compiler/src/ssa/nodes.dart";
diff --git a/tests/compiler/dart2js/codegen/value_range3_test.dart b/tests/compiler/dart2js/codegen/value_range3_test.dart
index 73491c1..3ccce34 100644
--- a/tests/compiler/dart2js/codegen/value_range3_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that global analysis in dart2js propagates positive integers.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/value_range_test.dart b/tests/compiler/dart2js/codegen/value_range_test.dart
index a50b20e..0676cd7 100644
--- a/tests/compiler/dart2js/codegen/value_range_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/variance_subtype_cast_test.dart b/tests/compiler/dart2js/codegen/variance_subtype_cast_test.dart
index fcf0d17..f77cd3b 100644
--- a/tests/compiler/dart2js/codegen/variance_subtype_cast_test.dart
+++ b/tests/compiler/dart2js/codegen/variance_subtype_cast_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/deferred/closures_test.dart b/tests/compiler/dart2js/deferred/closures_test.dart
index 3f6d36d..5969125 100644
--- a/tests/compiler/dart2js/deferred/closures_test.dart
+++ b/tests/compiler/dart2js/deferred/closures_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Ensures that closures are in the output unit of their enclosing element.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/deferred/constant_emission_test_helper.dart b/tests/compiler/dart2js/deferred/constant_emission_test_helper.dart
index 7f8b97e..ce54b1b 100644
--- a/tests/compiler/dart2js/deferred/constant_emission_test_helper.dart
+++ b/tests/compiler/dart2js/deferred/constant_emission_test_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the additional runtime type support is output to the right
// Files when using deferred loading.
diff --git a/tests/compiler/dart2js/deferred/custom_element_test.dart b/tests/compiler/dart2js/deferred/custom_element_test.dart
index 46acd96..3d363b8 100644
--- a/tests/compiler/dart2js/deferred/custom_element_test.dart
+++ b/tests/compiler/dart2js/deferred/custom_element_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test of the graph segmentation algorithm used by deferred loading
// to determine which elements can be deferred and which libraries
// much be included in the initial download (loaded eagerly).
diff --git a/tests/compiler/dart2js/deferred/data/deferred_helper.dart b/tests/compiler/dart2js/deferred/data/deferred_helper.dart
index 9df96ab..b2e8813 100644
--- a/tests/compiler/dart2js/deferred/data/deferred_helper.dart
+++ b/tests/compiler/dart2js/deferred/data/deferred_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'deferred_lib.dart' deferred as lib;
main() async {
diff --git a/tests/compiler/dart2js/deferred/data/deferred_lib.dart b/tests/compiler/dart2js/deferred/data/deferred_lib.dart
index 7a88c95..cc5015c 100644
--- a/tests/compiler/dart2js/deferred/data/deferred_lib.dart
+++ b/tests/compiler/dart2js/deferred/data/deferred_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
method() => 'Class.method';
}
diff --git a/tests/compiler/dart2js/deferred/deferred_constant3_test.dart b/tests/compiler/dart2js/deferred/deferred_constant3_test.dart
index 7dda970..ab08819 100644
--- a/tests/compiler/dart2js/deferred/deferred_constant3_test.dart
+++ b/tests/compiler/dart2js/deferred/deferred_constant3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the additional runtime type support is output to the right
// Files when using deferred loading.
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
index 0bac9fa..284a1f5 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the additional runtime type support is output to the right
// Files when using deferred loading.
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
index 3948747..1c3ac30 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the additional runtime type support is output to the right
// Files when using deferred loading.
diff --git a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
index b26555b..38150fc 100644
--- a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the additional runtime type support is output to the right
// Files when using deferred loading.
diff --git a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
index e4b5593..b277092 100644
--- a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that constants depended on by other constants are correctly deferred.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
index c2ce726..600d455 100644
--- a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart' as dart2js;
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
index 70df323..7432ea3 100644
--- a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
+++ b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that we do not accidentally leak code from deferred libraries but do
// allow inlining of empty functions and from main.
diff --git a/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
index 07b6308..e579680 100644
--- a/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test of the graph segmentation algorithm used by deferred loading
// to determine which elements can be deferred and which libraries
// much be included in the initial download (loaded eagerly).
diff --git a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
index 4d0589c..3dc7942 100644
--- a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test of the graph segmentation algorithm used by deferred loading
// to determine which elements can be deferred and which libraries
// much be included in the initial download (loaded eagerly).
diff --git a/tests/compiler/dart2js/deferred/load_mapping_test.dart b/tests/compiler/dart2js/deferred/load_mapping_test.dart
index 74c0c43..4e6e9af 100644
--- a/tests/compiler/dart2js/deferred/load_mapping_test.dart
+++ b/tests/compiler/dart2js/deferred/load_mapping_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/compiler_new.dart';
diff --git a/tests/compiler/dart2js/deferred/not_in_main_test.dart b/tests/compiler/dart2js/deferred/not_in_main_test.dart
index 35ac334..d66079a 100644
--- a/tests/compiler/dart2js/deferred/not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred/not_in_main_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test of the graph segmentation algorithm used by deferred loading
// to determine which elements can be deferred and which libraries
// much be included in the initial download (loaded eagerly).
diff --git a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
index 7f5ccaa..c097f10 100644
--- a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
+++ b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that no parts are emitted when deferred loading isn't used.
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/deferred_loading/data/basic_deferred/lib.dart b/tests/compiler/dart2js/deferred_loading/data/basic_deferred/lib.dart
index d0d4c5d..3120bea 100644
--- a/tests/compiler/dart2js/deferred_loading/data/basic_deferred/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/basic_deferred/lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: defaultArg:OutputUnit(1, {lib})*/
defaultArg() => "";
diff --git a/tests/compiler/dart2js/deferred_loading/data/basic_deferred/main.dart b/tests/compiler/dart2js/deferred_loading/data/basic_deferred/main.dart
index 2e1b3d3..11d445d 100644
--- a/tests/compiler/dart2js/deferred_loading/data/basic_deferred/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/basic_deferred/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib.dart' deferred as lib;
/*member: main:
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_class/lib.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_class/lib.dart
index 73a68a9..7e98e7b 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_class/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_class/lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Imported by main.dart.
library deferred_class_library;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_class/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_class/main.dart
index 0656d4a..90fd81f 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_class/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_class/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib.dart' deferred as lib;
/*member: main:OutputUnit(main, {})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib1.dart
index 6843b34..8687ed6 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
library deferred_constants1_lib1;
export 'lib3.dart' show C, C1;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib2.dart
index ed8ffce..7897534 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
library deferred_constants1_lib2;
export 'lib3.dart' show C2, C3, C4, C5, C6, C7;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib3.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib3.dart
index 297fe55..8283665 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib3.dart
@@ -2,6 +2,8 @@
// 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.7
+
library deferred_constants1_lib3;
/*class: C:OutputUnit(main, {})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/main.dart
index 721461b..0f40d1c 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib1.dart';
import 'lib2.dart' deferred as lib2;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/lib.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/lib.dart
index 1e897c6..db36de5 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
library deferred_constants2_lib;
/*class: Constant:OutputUnit(1, {lib})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/main.dart
index 96002d1..a35addc 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'lib.dart' deferred as lib;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib1.dart
index 1b52c4b..061d9d1 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'shared.dart';
import 'lib2.dart' deferred as l2;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib2.dart
index 44df89d..71db665 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'shared.dart';
const c3 = const C(1);
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/main.dart
index b006d1e..da731a5 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'shared.dart';
import 'lib1.dart' deferred as l1;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/shared.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/shared.dart
index 5ce79ac..401e946 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/shared.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/shared.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: C:OutputUnit(main, {})*/
class C {
const C(this.x);
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/lib.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/lib.dart
index e2bccb3..8cab462 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: foo:OutputUnit(1, {lib})*/
foo() {
return "loaded";
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/main.dart
index 2d2d2bb..67201ca 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that when a deferred import fails to load, it is possible to retry.
import 'lib.dart' deferred as lib;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_function/lib.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_function/lib.dart
index 5f88684..8406ca6 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_function/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_function/lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Imported by main.dart and
library deferred_function_library;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_function/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_function/main.dart
index 19a41af..cf774ed 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_function/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_function/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that loading of a library (with top-level functions only) can
// be deferred.
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/deferred_overlapping_lib3.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/deferred_overlapping_lib3.dart
index 43a1071..839af93 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/deferred_overlapping_lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/deferred_overlapping_lib3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: C3:OutputUnit(1, {lib1, lib2})*/
/*member: C3.:OutputUnit(1, {lib1, lib2})*/
class C3 {}
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib1.dart
index 47d7393..6172db7 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "deferred_overlapping_lib3.dart";
/*class: C1:OutputUnit(2, {lib1})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib2.dart
index 10073a0..c8cd0e6 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "deferred_overlapping_lib3.dart";
/*class: C2:OutputUnit(3, {lib2})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/main.dart
index ce926d1..b766437 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib1.dart' deferred as lib1;
import 'lib2.dart' deferred as lib2;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/lib1.dart
index da54242..f5a9c26 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: M:OutputUnit(1, {lib})*/
class M {}
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/main.dart
index 109f67e..f31c25c 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib1.dart' deferred as lib;
/*member: main:
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/lib1.dart
index c219ae7..a5bc5f9 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
library deferred_typedef_lib1;
/*class: C:OutputUnit(1, {lib1})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/main.dart
index b6bd66b..a5bccc8 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib1.dart' deferred as lib1;
/*member: main:OutputUnit(main, {}),constants=[ConstructedConstant(C(a=TypeConstant(void Function()),b=FunctionConstant(topLevelMethod)))=OutputUnit(1, {lib1}),TypeConstant(void Function())=OutputUnit(1, {lib1})]*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/exported_main.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/exported_main.dart
index 6a9d208..35834d4 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/exported_main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/exported_main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib1.dart' deferred as lib1;
import 'lib2.dart' deferred as lib2;
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib1.dart
index b0aacb1..8e5690c 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'exported_main.dart' show C;
import 'exported_main.dart' as main;
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib2.dart
index 050070b..cacae15 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'exported_main.dart' show C;
import 'exported_main.dart' as main;
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/main.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/main.dart
index 6afae7d..e55be81 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// TODO(sigmund): remove this indirection and move the main code here. This is
// needed because of the id-equivalence frameworks overrides the entrypoint URI.
export 'exported_main.dart';
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/lib.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/lib.dart
index 262c084..18fced0 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: finalVar:OutputUnit(1, {lib})*/
final finalVar = "string1";
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/main.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/main.dart
index 964342f..22cbcb4 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib.dart' deferred as lib;
/*member: main:OutputUnit(main, {})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/future_or/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/future_or/lib1.dart
index 63d79e5..9c001ff 100644
--- a/tests/compiler/dart2js/deferred_loading/data/future_or/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/future_or/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib2.dart';
const dynamic field = const A();
diff --git a/tests/compiler/dart2js/deferred_loading/data/future_or/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/future_or/lib2.dart
index d8401d3..fde4bbc 100644
--- a/tests/compiler/dart2js/deferred_loading/data/future_or/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/future_or/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:OutputUnit(main, {})*/
class A {
const A();
diff --git a/tests/compiler/dart2js/deferred_loading/data/future_or/main.dart b/tests/compiler/dart2js/deferred_loading/data/future_or/main.dart
index 9b185a1..deb3dc9 100644
--- a/tests/compiler/dart2js/deferred_loading/data/future_or/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/future_or/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'lib1.dart' deferred as lib1;
import 'lib2.dart' as lib2;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart
index fee884e..6828e57 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(1, {b})*/
T getFoo<T>(T v) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation0/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation0/main.dart
index aac590a..07c483a 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation0/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation0/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test instantiation used only in a deferred library.
/*class: global#Instantiation:OutputUnit(1, {b})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart
index b9d2704..4ca1497 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(1, {b})*/
T getFoo<T>(T v) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart
index 3836503..00caeb1 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(3, {c})*/
T getFoo<T, S>(T v, S w) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation1/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation1/main.dart
index 8478533..8f40a89 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation1/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation1/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test instantiations with different type argument count used only in two
// deferred libraries.
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart
index 449b9d5..89d5d6d 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(2, {b})*/
T getFoo<T>(T v) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart
index 9263737..d7a9c46 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(3, {c})*/
T getFoo<T>(T v) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation2/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation2/main.dart
index b2b6cfc..9c4fb76 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation2/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation2/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test instantiations with the same type argument count used only in two
// deferred libraries.
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation3/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation3/lib1.dart
index a49b089..7f641b8 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation3/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation3/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(1, {b})*/
T getFoo<T>(T v) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation3/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation3/main.dart
index 6d22b9a..dad30c1 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation3/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation3/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test instantiation used only in a deferred library.
/*class: global#Instantiation:OutputUnit(1, {b})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib1.dart
index a49b089..7f641b8 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(1, {b})*/
T getFoo<T>(T v) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib2.dart
index 3c506bb..b346bb4 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(3, {c})*/
T getFoo<T, S>(T v, S w) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation4/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation4/main.dart
index 6bcbdc5..302e331 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation4/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation4/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test instantiations with different type argument count used only in two
// deferred libraries.
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib1.dart
index fc0d440..76cebb1 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(2, {b})*/
T getFoo<T>(T v) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib2.dart
index a30cb28..ee8d5ab 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getFoo:OutputUnit(3, {c})*/
T getFoo<T>(T v) => v;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation5/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation5/main.dart
index b3730ff..ba9004e 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation5/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation5/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test instantiations with the same type argument count used only in two
// deferred libraries.
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_a.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_a.dart
index a2bd8dc..174c5a5 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_a.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_a.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'shared.dart' deferred as s1;
/*member: doA:
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_b.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_b.dart
index aa58162..814bff6 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_b.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_b.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'shared.dart' deferred as s2;
/*member: doB:
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_c.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_c.dart
index f6b3783..ffc3796 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_c.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_c.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: C:OutputUnit(1, {s1, s2})*/
class C {
const C();
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/main.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/main.dart
index 6cdd211..00dffbc 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression test for issue https://github.com/dart-lang/sdk/issues/31306.
///
/// When 1 constant was imported in two libraries by using the same exact
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/shared.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/shared.dart
index 1281b4b..be86a09 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/shared.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/shared.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib_c.dart';
const constant = const C();
diff --git a/tests/compiler/dart2js/deferred_loading/data/static_separate/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/static_separate/lib1.dart
index 00ab4d3..c9489f7 100644
--- a/tests/compiler/dart2js/deferred_loading/data/static_separate/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/static_separate/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
library lib1;
/*class: ConstClass:OutputUnit(2, {lib1, lib2})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/static_separate/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/static_separate/lib2.dart
index f5f029d..016ba07 100644
--- a/tests/compiler/dart2js/deferred_loading/data/static_separate/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/static_separate/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
library lib2;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/deferred_loading/data/static_separate/main.dart b/tests/compiler/dart2js/deferred_loading/data/static_separate/main.dart
index 0ba29ee..eb82cbf 100644
--- a/tests/compiler/dart2js/deferred_loading/data/static_separate/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/static_separate/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// The class lib1.C is referenced via lib1
// The static function lib1.C.foo is referenced via lib2
// Dart2js will put them in separate hunks.
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib1.dart
index d905a5e..4ef7683 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib2.dart';
/*member: doCast:OutputUnit(main, {})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib2.dart
index 452d66e..bfa82bf 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:OutputUnit(main, {})*/
class A {
/*member: A.:OutputUnit(1, {c})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/main.dart b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/main.dart
index 1e231be..70024a3 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib1.dart';
import 'lib2.dart' deferred as c;
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib1.dart
index a55af13..052d852 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib3.dart';
/*class: A:OutputUnit(1, {lib1})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib2.dart
index c7672bb..f2d4c91 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: C:OutputUnit(main, {})*/
class C<T> {
const C();
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib3.dart b/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib3.dart
index c7aad0d..d9e5e24 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: E:OutputUnit(3, {lib3})*/
class E<T> {
const E();
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_arguments/main.dart b/tests/compiler/dart2js/deferred_loading/data/type_arguments/main.dart
index 2f6795e..d9b4bac 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_arguments/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_arguments/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib1.dart' deferred as lib1;
import 'lib2.dart' as lib2;
import 'lib3.dart' deferred as lib3;
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index 2a1c31c..96b7600 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io' hide Link;
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/end_to_end/all_native_test.dart b/tests/compiler/dart2js/end_to_end/all_native_test.dart
index f85b144..3917078 100644
--- a/tests/compiler/dart2js/end_to_end/all_native_test.dart
+++ b/tests/compiler/dart2js/end_to_end/all_native_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
index c03dfd1..404b675 100644
--- a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
+++ b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "dart:async";
import "dart:io";
diff --git a/tests/compiler/dart2js/end_to_end/bad_output_io_test.dart b/tests/compiler/dart2js/end_to_end/bad_output_io_test.dart
index ba55341..ccacc18 100644
--- a/tests/compiler/dart2js/end_to_end/bad_output_io_test.dart
+++ b/tests/compiler/dart2js/end_to_end/bad_output_io_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// TODO(johnniwinther): Port this test to use '--use-kernel'.
// Test that the compiler can handle imports when package root has not been set.
diff --git a/tests/compiler/dart2js/end_to_end/command_line_split_test.dart b/tests/compiler/dart2js/end_to_end/command_line_split_test.dart
index f4a2f43..74f41e2 100644
--- a/tests/compiler/dart2js/end_to_end/command_line_split_test.dart
+++ b/tests/compiler/dart2js/end_to_end/command_line_split_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import 'package:compiler/src/util/command_line.dart';
diff --git a/tests/compiler/dart2js/end_to_end/command_line_test.dart b/tests/compiler/dart2js/end_to_end/command_line_test.dart
index 076b918..57d4161 100644
--- a/tests/compiler/dart2js/end_to_end/command_line_test.dart
+++ b/tests/compiler/dart2js/end_to_end/command_line_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test the command line options of dart2js.
import 'dart:async';
diff --git a/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart b/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
index 96717ad..0f00751 100644
--- a/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:convert';
import 'dart:io';
diff --git a/tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart b/tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart
index 9447b3a..ade191a 100644
--- a/tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:convert';
import 'dart:io';
diff --git a/tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart b/tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart
index e63be3b..6dee480 100644
--- a/tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart
+++ b/tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart
@@ -2,6 +2,8 @@
// 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.7
+
// ignore: UNDEFINED_ANNOTATION
@notExisting
var x;
diff --git a/tests/compiler/dart2js/end_to_end/data/hello_world.dart b/tests/compiler/dart2js/end_to_end/data/hello_world.dart
index 3e3c4d4..435410d 100644
--- a/tests/compiler/dart2js/end_to_end/data/hello_world.dart
+++ b/tests/compiler/dart2js/end_to_end/data/hello_world.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
print("Hello World!");
}
diff --git a/tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart b/tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart
index a04734f..15fb27e 100644
--- a/tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart
+++ b/tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
library dart2js.diagnostic_reporter.helper;
import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
diff --git a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart b/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
index 92ea4ef..81cbfb7 100644
--- a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import '../helpers/memory_compiler.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/apiimpl.dart' show CompilerImpl;
diff --git a/tests/compiler/dart2js/end_to_end/dump_info2_test.dart b/tests/compiler/dart2js/end_to_end/dump_info2_test.dart
index 7d27bf0..d7c74d6 100644
--- a/tests/compiler/dart2js/end_to_end/dump_info2_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dump_info2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:convert';
import 'package:compiler/compiler_new.dart';
diff --git a/tests/compiler/dart2js/end_to_end/dump_info_test.dart b/tests/compiler/dart2js/end_to_end/dump_info_test.dart
index 19a4cfe..642bb2d 100644
--- a/tests/compiler/dart2js/end_to_end/dump_info_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dump_info_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that dump-info has no effect on the compiler output.
import 'dart:io';
diff --git a/tests/compiler/dart2js/end_to_end/exit_code_test.dart b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
index 969a3fe..4a045ee 100644
--- a/tests/compiler/dart2js/end_to_end/exit_code_test.dart
+++ b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test the exit code of dart2js in case of exceptions, errors, warnings, etc.
import 'dart:async';
diff --git a/tests/compiler/dart2js/end_to_end/generate_code_with_compile_time_errors_test.dart b/tests/compiler/dart2js/end_to_end/generate_code_with_compile_time_errors_test.dart
index 8521dd5..d195707 100644
--- a/tests/compiler/dart2js/end_to_end/generate_code_with_compile_time_errors_test.dart
+++ b/tests/compiler/dart2js/end_to_end/generate_code_with_compile_time_errors_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the compiler can generates code with compile time error according
// to the compiler options.
diff --git a/tests/compiler/dart2js/end_to_end/launch_helper.dart b/tests/compiler/dart2js/end_to_end/launch_helper.dart
index 4e4df85..7d5a2c5 100644
--- a/tests/compiler/dart2js/end_to_end/launch_helper.dart
+++ b/tests/compiler/dart2js/end_to_end/launch_helper.dart
@@ -1,3 +1,9 @@
+// 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.
+
+// @dart = 2.7
+
import 'dart:async';
import 'dart:io';
import 'package:path/path.dart' as path;
diff --git a/tests/compiler/dart2js/end_to_end/library_env_test.dart b/tests/compiler/dart2js/end_to_end/library_env_test.dart
index 45421c4..996bedf 100644
--- a/tests/compiler/dart2js/end_to_end/library_env_test.dart
+++ b/tests/compiler/dart2js/end_to_end/library_env_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Check that 'dart:' libraries have their corresponding dart.library.X
/// environment variable set.
diff --git a/tests/compiler/dart2js/end_to_end/modular_loader_test.dart b/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
index 1f79ed0..506d5de 100644
--- a/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
+++ b/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import '../helpers/memory_compiler.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/apiimpl.dart' show CompilerImpl;
diff --git a/tests/compiler/dart2js/end_to_end/no_platform_test.dart b/tests/compiler/dart2js/end_to_end/no_platform_test.dart
index cf6766d..5699366 100644
--- a/tests/compiler/dart2js/end_to_end/no_platform_test.dart
+++ b/tests/compiler/dart2js/end_to_end/no_platform_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
diff --git a/tests/compiler/dart2js/end_to_end/output_type_test.dart b/tests/compiler/dart2js/end_to_end/output_type_test.dart
index 93726a9..150e8f4 100644
--- a/tests/compiler/dart2js/end_to_end/output_type_test.dart
+++ b/tests/compiler/dart2js/end_to_end/output_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Test that the expected output targets are generated for various compiler
/// options.
diff --git a/tests/compiler/dart2js/end_to_end/show_package_warnings_test.dart b/tests/compiler/dart2js/end_to_end/show_package_warnings_test.dart
index 3811a01..dd7c73b 100644
--- a/tests/compiler/dart2js/end_to_end/show_package_warnings_test.dart
+++ b/tests/compiler/dart2js/end_to_end/show_package_warnings_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the '--show-package-warnings' option works as intended.
import 'dart:async';
diff --git a/tests/compiler/dart2js/end_to_end/user_crash_test.dart b/tests/compiler/dart2js/end_to_end/user_crash_test.dart
index 1f21642..3154873 100644
--- a/tests/compiler/dart2js/end_to_end/user_crash_test.dart
+++ b/tests/compiler/dart2js/end_to_end/user_crash_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/equivalence/check_functions.dart b/tests/compiler/dart2js/equivalence/check_functions.dart
index 149894a..0059119 100644
--- a/tests/compiler/dart2js/equivalence/check_functions.dart
+++ b/tests/compiler/dart2js/equivalence/check_functions.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Equivalence test functions for data objects.
library dart2js.equivalence.functions;
diff --git a/tests/compiler/dart2js/equivalence/check_helpers.dart b/tests/compiler/dart2js/equivalence/check_helpers.dart
index 08e6379..ea9cf9b 100644
--- a/tests/compiler/dart2js/equivalence/check_helpers.dart
+++ b/tests/compiler/dart2js/equivalence/check_helpers.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// General equivalence test functions.
library dart2js.equivalence.helpers;
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence.dart b/tests/compiler/dart2js/equivalence/id_equivalence.dart
index a78c587..31ece9d 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:_fe_analyzer_shared/src/testing/id.dart';
import 'package:compiler/src/common.dart';
import 'package:compiler/src/ir/util.dart';
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 341dd6e..20e6173 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:io';
diff --git a/tests/compiler/dart2js/equivalence/id_testing_test.dart b/tests/compiler/dart2js/equivalence/id_testing_test.dart
index e8c4022..bf8b007 100644
--- a/tests/compiler/dart2js/equivalence/id_testing_test.dart
+++ b/tests/compiler/dart2js/equivalence/id_testing_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index eb9a4f3..754f2e2 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Helper program that shows the equivalence-based data on a dart program.
import 'dart:io';
diff --git a/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart b/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart
index c25d59e..4c7031d 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
print(const Class1().field1);
print(const Class2(field2: true).field2);
diff --git a/tests/compiler/dart2js/field_analysis/jdata/dynamic_set.dart b/tests/compiler/dart2js/field_analysis/jdata/dynamic_set.dart
index fad3d3b..6548d67 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/dynamic_set.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/dynamic_set.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
method1(new Class1a());
method2(new Class2a<int>());
diff --git a/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart b/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
index 22c3126..1bb9851 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
@@ -2,6 +2,8 @@
// 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.7
+
enum Enum {
a,
diff --git a/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart
index f56c73f..fd6efb2 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
var c = new Class1.a();
c.field3a = null;
diff --git a/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart b/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart
index 3e0cbf5..1cc064b 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
var c1a = new Class1a(0);
new Class1a(0, 1);
diff --git a/tests/compiler/dart2js/field_analysis/jdata/regress_36222.dart b/tests/compiler/dart2js/field_analysis/jdata/regress_36222.dart
index a719c2e..2fcbc02 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/regress_36222.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/regress_36222.dart
@@ -2,6 +2,8 @@
// 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.7
+
typedef int BinaryFunc(int x, int y);
class A {
diff --git a/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
index 0a7fe28..63c45ec 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
use1(new Class1());
use2(new Class2());
diff --git a/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
index 831dd9c..1b4fdf6 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
print(field1a);
print(field1b);
diff --git a/tests/compiler/dart2js/field_analysis/jdata/unused_constructors.dart b/tests/compiler/dart2js/field_analysis/jdata/unused_constructors.dart
index cc189f1..848d3c1 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/unused_constructors.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/unused_constructors.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class1 {
/*member: Class1.field:constant=IntConstant(87)*/
final int field;
diff --git a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
index 55f3014..e301643 100644
--- a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/field_analysis/kdata/constant_fields.dart b/tests/compiler/dart2js/field_analysis/kdata/constant_fields.dart
index a8fd083..6adc061 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/constant_fields.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/constant_fields.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
print(const Class1().field1);
print(const Class2(field2: true).field2);
diff --git a/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart
index e00b39c..0c09f02 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
new Class1.a();
new Class1.b();
diff --git a/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart b/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart
index 8a9d632..b31c78a 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
new Class1(0);
new Class1(0, 1);
diff --git a/tests/compiler/dart2js/field_analysis/kdata/regress_36222.dart b/tests/compiler/dart2js/field_analysis/kdata/regress_36222.dart
index 2641396..4341b32 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/regress_36222.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/regress_36222.dart
@@ -2,6 +2,8 @@
// 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.7
+
typedef int BinaryFunc(int x, int y);
class A {
diff --git a/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart b/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart
index e65028c..129a600 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
new Class1();
}
diff --git a/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
index 24d5f93..929cb4c 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
new Class1();
new Class2();
diff --git a/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
index 9da6e56..c8f2471 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
print(field1a);
print(field1b);
diff --git a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
index 7e3d8de..3a8f113 100644
--- a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
index a8cfd0e..b82a36d1 100644
--- a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
+++ b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
index 76ef8a7..e9cd93a 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
index 410f5fc..ef4dfc5 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart b/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
index f8c3281..8c9f5fe 100644
--- a/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
+++ b/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/generic_methods/world_test.dart b/tests/compiler/dart2js/generic_methods/world_test.dart
index d0edbe1..05cf5da 100644
--- a/tests/compiler/dart2js/generic_methods/world_test.dart
+++ b/tests/compiler/dart2js/generic_methods/world_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/universe/call_structure.dart';
diff --git a/tests/compiler/dart2js/helpers/args_helper.dart b/tests/compiler/dart2js/helpers/args_helper.dart
index 0a63876..b4b4883 100644
--- a/tests/compiler/dart2js/helpers/args_helper.dart
+++ b/tests/compiler/dart2js/helpers/args_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:_fe_analyzer_shared/src/util/filenames.dart';
import 'package:args/args.dart';
import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/helpers/compiler_helper.dart b/tests/compiler/dart2js/helpers/compiler_helper.dart
index c19cda5..9c40a59 100644
--- a/tests/compiler/dart2js/helpers/compiler_helper.dart
+++ b/tests/compiler/dart2js/helpers/compiler_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
library compiler_helper;
import 'dart:async';
diff --git a/tests/compiler/dart2js/helpers/d8_helper.dart b/tests/compiler/dart2js/helpers/d8_helper.dart
index f358775..50edff3 100644
--- a/tests/compiler/dart2js/helpers/d8_helper.dart
+++ b/tests/compiler/dart2js/helpers/d8_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Partial test that the closed world computed from [WorldImpact]s derived from
// kernel is equivalent to the original computed from resolution.
library dart2js.kernel.compiler_helper;
diff --git a/tests/compiler/dart2js/helpers/diagnostic_helper.dart b/tests/compiler/dart2js/helpers/diagnostic_helper.dart
index d45306a..68a34ff 100644
--- a/tests/compiler/dart2js/helpers/diagnostic_helper.dart
+++ b/tests/compiler/dart2js/helpers/diagnostic_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
library dart2js.test.diagnostic_helper;
import 'dart:collection';
diff --git a/tests/compiler/dart2js/helpers/element_lookup.dart b/tests/compiler/dart2js/helpers/element_lookup.dart
index a0c97ba..e72f0f6 100644
--- a/tests/compiler/dart2js/helpers/element_lookup.dart
+++ b/tests/compiler/dart2js/helpers/element_lookup.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:compiler/src/common_elements.dart' show JElementEnvironment;
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/helpers/ir_types.dart b/tests/compiler/dart2js/helpers/ir_types.dart
index 64f44a4..a777fab 100644
--- a/tests/compiler/dart2js/helpers/ir_types.dart
+++ b/tests/compiler/dart2js/helpers/ir_types.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:kernel/ast.dart' as ir;
import 'package:kernel/class_hierarchy.dart' as ir;
import 'package:kernel/core_types.dart' as ir;
diff --git a/tests/compiler/dart2js/helpers/link_helper.dart b/tests/compiler/dart2js/helpers/link_helper.dart
index 53d20d4..2290e63 100644
--- a/tests/compiler/dart2js/helpers/link_helper.dart
+++ b/tests/compiler/dart2js/helpers/link_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
library link_helper;
import 'package:_fe_analyzer_shared/src/util/link.dart';
diff --git a/tests/compiler/dart2js/helpers/memory_compiler.dart b/tests/compiler/dart2js/helpers/memory_compiler.dart
index 4f7b01f..fb7a7da 100644
--- a/tests/compiler/dart2js/helpers/memory_compiler.dart
+++ b/tests/compiler/dart2js/helpers/memory_compiler.dart
@@ -2,6 +2,8 @@
// 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.7
+
library dart2js.test.memory_compiler;
import 'dart:async';
diff --git a/tests/compiler/dart2js/helpers/memory_source_file_helper.dart b/tests/compiler/dart2js/helpers/memory_source_file_helper.dart
index 7fada85..865d20e 100644
--- a/tests/compiler/dart2js/helpers/memory_source_file_helper.dart
+++ b/tests/compiler/dart2js/helpers/memory_source_file_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
library dart2js.test.memory_source_file_helper;
import 'dart:async' show Future;
diff --git a/tests/compiler/dart2js/helpers/output_collector.dart b/tests/compiler/dart2js/helpers/output_collector.dart
index 30b62be..3b47963 100644
--- a/tests/compiler/dart2js/helpers/output_collector.dart
+++ b/tests/compiler/dart2js/helpers/output_collector.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Output provider that collects the output in string buffers.
library output_collector;
diff --git a/tests/compiler/dart2js/helpers/program_lookup.dart b/tests/compiler/dart2js/helpers/program_lookup.dart
index 54124aa..0ded799 100644
--- a/tests/compiler/dart2js/helpers/program_lookup.dart
+++ b/tests/compiler/dart2js/helpers/program_lookup.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/deferred_load.dart';
diff --git a/tests/compiler/dart2js/helpers/shared_helper.dart b/tests/compiler/dart2js/helpers/shared_helper.dart
index 7f69eda..65ca216 100644
--- a/tests/compiler/dart2js/helpers/shared_helper.dart
+++ b/tests/compiler/dart2js/helpers/shared_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:compiler/src/constants/values.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/helpers/stats_test.dart b/tests/compiler/dart2js/helpers/stats_test.dart
index 9254ee9..af0e96a 100644
--- a/tests/compiler/dart2js/helpers/stats_test.dart
+++ b/tests/compiler/dart2js/helpers/stats_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:compiler/src/helpers/helpers.dart';
diff --git a/tests/compiler/dart2js/helpers/text_helpers.dart b/tests/compiler/dart2js/helpers/text_helpers.dart
index e9723d2..cab50ac 100644
--- a/tests/compiler/dart2js/helpers/text_helpers.dart
+++ b/tests/compiler/dart2js/helpers/text_helpers.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Compares [text1] and [text2] line-by-line. If a mismatch is found, a diff
/// of the [windowSize] lines before and after are printed and the mismatch line
/// number is returned. If identical, nothing is printed and `null` is returned.
diff --git a/tests/compiler/dart2js/helpers/type_test_helper.dart b/tests/compiler/dart2js/helpers/type_test_helper.dart
index 35b4dbe..92ce751 100644
--- a/tests/compiler/dart2js/helpers/type_test_helper.dart
+++ b/tests/compiler/dart2js/helpers/type_test_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
library type_test_helper;
import 'dart:async';
diff --git a/tests/compiler/dart2js/impact/data/as.dart b/tests/compiler/dart2js/impact/data/as.dart
index 80bbc69f..059a86a 100644
--- a/tests/compiler/dart2js/impact/data/as.dart
+++ b/tests/compiler/dart2js/impact/data/as.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:static=[explicitAs(1),implicitAs(1),promoted(1)],type=[inst:JSNull]*/
main() {
explicitAs(null);
@@ -9,14 +11,14 @@
promoted(null);
}
-/*member: explicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
+/*member: explicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
explicitAs(String i) {
i.length;
// ignore: unnecessary_cast
return i as String;
}
-/*member: implicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
+/*member: implicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
String implicitAs(String i) {
dynamic j = i;
i.length;
@@ -24,7 +26,7 @@
return j;
}
-/*member: promoted:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:String]*/
+/*member: promoted:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:String]*/
String promoted(dynamic i) {
if (i is! String) return null;
i.length;
diff --git a/tests/compiler/dart2js/impact/data/async.dart b/tests/compiler/dart2js/impact/data/async.dart
index 41172c1..2cc6b7d 100644
--- a/tests/compiler/dart2js/impact/data/async.dart
+++ b/tests/compiler/dart2js/impact/data/async.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:
static=[
testAnonymousAsync(0),
@@ -217,13 +219,13 @@
return () async* {};
}
-/*member: testAsyncForIn:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testAsyncForIn:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
testAsyncForIn(o) async {
// ignore: UNUSED_LOCAL_VARIABLE
await for (var e in o) {}
}
-/*member: testAsyncForInTyped:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testAsyncForInTyped:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
testAsyncForInTyped(o) async {
// ignore: UNUSED_LOCAL_VARIABLE
await for (int e in o) {}
diff --git a/tests/compiler/dart2js/impact/data/classes.dart b/tests/compiler/dart2js/impact/data/classes.dart
index 925f979..09be0cd 100644
--- a/tests/compiler/dart2js/impact/data/classes.dart
+++ b/tests/compiler/dart2js/impact/data/classes.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:
static=[
testAbstractClassWithField(0),
@@ -137,7 +139,7 @@
testForwardingConstructor() => new ForwardingConstructorClass(null);
class ForwardingConstructorTypedSuperClass {
- /*member: ForwardingConstructorTypedSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
+ /*member: ForwardingConstructorTypedSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
ForwardingConstructorTypedSuperClass(int arg);
}
@@ -151,7 +153,7 @@
testForwardingConstructorTyped() => new ForwardingConstructorTypedClass(null);
class ForwardingConstructorGenericSuperClass<T> {
- /*member: ForwardingConstructorGenericSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ForwardingConstructorGenericSuperClass.T]*/
+ /*member: ForwardingConstructorGenericSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ForwardingConstructorGenericSuperClass.T]*/
ForwardingConstructorGenericSuperClass(T arg);
}
@@ -181,7 +183,7 @@
*/
testEnum() => Enum.A;
-/*member: staticGenericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,inst:List<staticGenericMethod.T>,param:Object,param:staticGenericMethod.T]*/
+/*member: staticGenericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,inst:List<staticGenericMethod.T>,param:Object,param:staticGenericMethod.T]*/
List<T> staticGenericMethod<T>(T arg) => [arg];
/*member: testStaticGenericMethod:
@@ -228,7 +230,7 @@
class GenericClass<X, Y> {
const GenericClass.generative();
- /*member: GenericClass.genericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,inst:Map<GenericClass.X,genericMethod.T>,param:Object,param:genericMethod.T]*/
+ /*member: GenericClass.genericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,inst:Map<GenericClass.X,genericMethod.T>,param:Object,param:genericMethod.T]*/
Map<X, T> genericMethod<T>(T arg) => {null: arg};
}
diff --git a/tests/compiler/dart2js/impact/data/constants/lib.dart b/tests/compiler/dart2js/impact/data/constants/lib.dart
index 5e0bb96..1eeb5d1 100644
--- a/tests/compiler/dart2js/impact/data/constants/lib.dart
+++ b/tests/compiler/dart2js/impact/data/constants/lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
const dynamic nullLiteralField = null;
const dynamic boolLiteralField = true;
@@ -42,7 +44,7 @@
const typeLiteralField = String;
-/*member: id:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Object,param:id.T]*/
+/*member: id:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Object,param:id.T]*/
T id<T>(T t) => t;
const int Function(int) _instantiation = id;
diff --git a/tests/compiler/dart2js/impact/data/constants/main.dart b/tests/compiler/dart2js/impact/data/constants/main.dart
index 81913aa..1b959de 100644
--- a/tests/compiler/dart2js/impact/data/constants/main.dart
+++ b/tests/compiler/dart2js/impact/data/constants/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'lib.dart';
import 'lib.dart' deferred as defer;
diff --git a/tests/compiler/dart2js/impact/data/constructors.dart b/tests/compiler/dart2js/impact/data/constructors.dart
index a56a258..c3262ba 100644
--- a/tests/compiler/dart2js/impact/data/constructors.dart
+++ b/tests/compiler/dart2js/impact/data/constructors.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:
static=[
testConstRedirectingFactoryInvoke(0),
@@ -152,7 +154,7 @@
/*member: GenericClass.generative:static=[Object.(0)]*/
const GenericClass.generative();
- /*member: GenericClass.fact:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Object]*/
+ /*member: GenericClass.fact:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Object]*/
factory GenericClass.fact() => null;
const factory GenericClass.redirect() = GenericClass<X, Y>.generative;
diff --git a/tests/compiler/dart2js/impact/data/effectively_final.dart b/tests/compiler/dart2js/impact/data/effectively_final.dart
index 281b098..9384140 100644
--- a/tests/compiler/dart2js/impact/data/effectively_final.dart
+++ b/tests/compiler/dart2js/impact/data/effectively_final.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:
static=[
effectivelyFinalList(0),
@@ -67,7 +69,7 @@
/*member: _method1:type=[inst:JSNull]*/
num _method1() => null;
-/*member: effectivelyFinalPromoted:dynamic=[int.+,num.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method1(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSUInt31,inst:JSUInt32,is:int]*/
+/*member: effectivelyFinalPromoted:dynamic=[int.+,num.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method1(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSUInt31,inst:JSUInt32,is:int]*/
effectivelyFinalPromoted() {
dynamic c = _method1();
c + 0;
@@ -79,7 +81,7 @@
/*member: _method2:type=[inst:JSNull]*/
String _method2() => null;
-/*member: effectivelyFinalPromotedInvalid:dynamic=[String.+,int.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method2(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSString,inst:JSUInt31,inst:JSUInt32,is:int]*/
+/*member: effectivelyFinalPromotedInvalid:dynamic=[String.+,int.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method2(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSString,inst:JSUInt31,inst:JSUInt32,is:int]*/
effectivelyFinalPromotedInvalid() {
dynamic c = _method2();
c + '';
diff --git a/tests/compiler/dart2js/impact/data/exact.dart b/tests/compiler/dart2js/impact/data/exact.dart
index 1c6a6aa..19e18c6 100644
--- a/tests/compiler/dart2js/impact/data/exact.dart
+++ b/tests/compiler/dart2js/impact/data/exact.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: A.:static=[Object.(0)]*/
class A {
method1() {}
diff --git a/tests/compiler/dart2js/impact/data/expressions.dart b/tests/compiler/dart2js/impact/data/expressions.dart
index 3976aee..c15c49c 100644
--- a/tests/compiler/dart2js/impact/data/expressions.dart
+++ b/tests/compiler/dart2js/impact/data/expressions.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:static=[
testAs(1),
testAsGeneric(1),
@@ -105,58 +107,58 @@
*/
testPreDec(o) => --o;
-/*member: testIs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
+/*member: testIs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
testIs() => null is Class;
-/*member: testIsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
+/*member: testIsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
testIsGeneric() => null is GenericClass<int, String>;
-/*member: testIsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
testIsGenericRaw() => null is GenericClass;
-/*member: testIsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
testIsGenericDynamic() => null is GenericClass<dynamic, dynamic>;
-/*member: testIsNot:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
+/*member: testIsNot:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
testIsNot() => null is! Class;
-/*member: testIsNotGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
+/*member: testIsNotGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
testIsNotGeneric() => null is! GenericClass<int, String>;
-/*member: testIsNotGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsNotGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
testIsNotGenericRaw() => null is! GenericClass;
-/*member: testIsNotGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsNotGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
testIsNotGenericDynamic() => null is! GenericClass<dynamic, dynamic>;
-/*member: testIsTypedef:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function()]*/
+/*member: testIsTypedef:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function()]*/
testIsTypedef() => null is Typedef;
-/*member: testIsTypedefGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:int Function(String)]*/
+/*member: testIsTypedefGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:int Function(String)]*/
testIsTypedefGeneric() => null is GenericTypedef<int, String>;
-/*member: testIsTypedefGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
+/*member: testIsTypedefGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
testIsTypedefGenericRaw() => null is GenericTypedef;
-/*member: testIsTypedefGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
+/*member: testIsTypedefGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
testIsTypedefGenericDynamic() => null is GenericTypedef<dynamic, dynamic>;
-/*member: testIsTypedefDeep:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:List<int Function(dynamic Function(dynamic))>]*/
+/*member: testIsTypedefDeep:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:List<int Function(dynamic Function(dynamic))>]*/
testIsTypedefDeep() => null is List<GenericTypedef<int, GenericTypedef>>;
-/*member: testAs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:Class,inst:Closure,inst:JSBool]*/
+/*member: testAs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:Class,inst:Closure,inst:JSBool]*/
// ignore: UNNECESSARY_CAST
testAs(dynamic o) => o as Class;
-/*member: testAsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2),throwRuntimeError(1)],type=[as:GenericClass<int,String>,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>]*/
+/*member: testAsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2),throwRuntimeError(1)],type=[as:GenericClass<int,String>,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>]*/
// ignore: UNNECESSARY_CAST
testAsGeneric(dynamic o) => o as GenericClass<int, String>;
-/*member: testAsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
+/*member: testAsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
// ignore: UNNECESSARY_CAST
testAsGenericRaw(dynamic o) => o as GenericClass;
-/*member: testAsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
+/*member: testAsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
// ignore: UNNECESSARY_CAST
testAsGenericDynamic(dynamic o) => o as GenericClass<dynamic, dynamic>;
@@ -168,7 +170,7 @@
/*member: testIfNotNull:dynamic=[Object.==,foo],type=[inst:JSNull]*/
testIfNotNull(o) => o?.foo;
-/*member: testTypedIfNotNull:dynamic=[Class.==,Class.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class]*/
+/*member: testTypedIfNotNull:dynamic=[Class.==,Class.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class]*/
testTypedIfNotNull(Class o) => o?.field;
/*member: testIfNotNullSet:dynamic=[Object.==,foo=],type=[inst:JSBool,inst:JSNull]*/
diff --git a/tests/compiler/dart2js/impact/data/extract_type_arguments.dart b/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
index d498017..3c9b8f3 100644
--- a/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
+++ b/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// ignore: IMPORT_INTERNAL_LIBRARY
import 'dart:_internal';
@@ -12,10 +14,10 @@
/*member: C.:static=[Object.(0)]*/
class C implements A<int>, B<String, bool> {}
-/*member: testA:dynamic=[call<A.T>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<A<dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:A<dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:A<A.T>]*/
+/*member: testA:dynamic=[call<A.T>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<A<dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:A<dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:A<A.T>]*/
testA(c, f) => extractTypeArguments<A>(c, f);
-/*member: testB:dynamic=[call<B.S,B.U>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<B<dynamic,dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:B<dynamic,dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:B<B.S,B.U>]*/
+/*member: testB:dynamic=[call<B.S,B.U>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<B<dynamic,dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:B<dynamic,dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:B<B.S,B.U>]*/
testB(c, f) => extractTypeArguments<B>(c, f);
/*member: main:static=[C.(0),testA(2),testB(2)],type=[inst:JSNull]*/
diff --git a/tests/compiler/dart2js/impact/data/future_or.dart b/tests/compiler/dart2js/impact/data/future_or.dart
index acf5373..336fdef 100644
--- a/tests/compiler/dart2js/impact/data/future_or.dart
+++ b/tests/compiler/dart2js/impact/data/future_or.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "dart:async";
/*member: main:dynamic=[runtimeType],runtimeType=[unknown:FutureOr<int>],static=[Future.value(1),checkTypeBound(4),print(1),throwTypeError(1)],type=[inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSUInt31,inst:JSUInt32]*/
diff --git a/tests/compiler/dart2js/impact/data/initializers.dart b/tests/compiler/dart2js/impact/data/initializers.dart
index 778c065..631eb49 100644
--- a/tests/compiler/dart2js/impact/data/initializers.dart
+++ b/tests/compiler/dart2js/impact/data/initializers.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:
static=[
testDefaultValuesNamed(0),
@@ -28,10 +30,10 @@
testGenericClass();
}
-/*member: testDefaultValuesPositional:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
+/*member: testDefaultValuesPositional:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
testDefaultValuesPositional([bool value = false]) {}
-/*member: testDefaultValuesNamed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
+/*member: testDefaultValuesNamed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
testDefaultValuesNamed({bool value: false}) {}
class ClassFieldInitializer1 {
@@ -84,7 +86,7 @@
/*member: ClassInstanceFieldWithInitializer.:static=[Object.(0)]*/
class ClassInstanceFieldWithInitializer {
- /*member: ClassInstanceFieldWithInitializer.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
+ /*member: ClassInstanceFieldWithInitializer.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
var field = false;
}
@@ -93,7 +95,7 @@
/*member: ClassInstanceFieldTyped.:static=[Object.(0)]*/
class ClassInstanceFieldTyped {
- /*member: ClassInstanceFieldTyped.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
+ /*member: ClassInstanceFieldTyped.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
int field;
}
@@ -120,7 +122,7 @@
testSuperInitializer() => new ClassSuperInitializer();
class ClassGeneric<T> {
- /*member: ClassGeneric.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ClassGeneric.T]*/
+ /*member: ClassGeneric.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ClassGeneric.T]*/
ClassGeneric(T arg);
}
diff --git a/tests/compiler/dart2js/impact/data/injected_cast.dart b/tests/compiler/dart2js/impact/data/injected_cast.dart
index 7ff1527..a1ced47 100644
--- a/tests/compiler/dart2js/impact/data/injected_cast.dart
+++ b/tests/compiler/dart2js/impact/data/injected_cast.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {}
class B {}
@@ -14,11 +16,11 @@
/*member: Class1.:static=[Object.(0)]*/
class Class1 {
- /*member: Class1.field1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A]*/
+ /*member: Class1.field1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A]*/
A field1;
}
-/*member: method1:dynamic=[Class1.field1=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class1]*/
+/*member: method1:dynamic=[Class1.field1=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class1]*/
method1(dynamic o, dynamic value) {
if (o is! Class1) return;
o.field1 = value;
@@ -48,11 +50,11 @@
/*member: Class3.:static=[Object.(0)]*/
class Class3 {
- /*member: Class3.method3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
+ /*member: Class3.method3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
method3(A a, [B b, C c]) {}
}
-/*member: method3:dynamic=[Class3.method3(3)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class3,param:B]*/
+/*member: method3:dynamic=[Class3.method3(3)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class3,param:B]*/
method3(dynamic o, dynamic a, B b, dynamic c) {
if (o is! Class3) return;
o.method3(a, b, c);
@@ -60,11 +62,11 @@
/*member: Class4.:static=[Object.(0)]*/
class Class4 {
- /*member: Class4.method4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
+ /*member: Class4.method4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
method4(A a, {B b, C c}) {}
}
-/*member: method4:dynamic=[Class4.method4(1,b,c)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class4,param:B]*/
+/*member: method4:dynamic=[Class4.method4(1,b,c)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class4,param:B]*/
method4(dynamic o, dynamic a, B b, dynamic c) {
if (o is! Class4) return;
o.method4(a, c: c, b: b);
@@ -142,7 +144,7 @@
A Function(A) get f => null;
}
-/*member: method7:dynamic=[Class7.f(1),call(1)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class7]*/
+/*member: method7:dynamic=[Class7.f(1),call(1)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class7]*/
method7(dynamic o, dynamic a) {
if (o is! Class7) return;
o.f(a);
@@ -170,7 +172,7 @@
return g.method(iterable);
}
-/*member: method9:dynamic=[G.field=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:int,inst:Closure,inst:JSBool,inst:JSNull,is:G,param:num]*/
+/*member: method9:dynamic=[G.field=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:int,inst:Closure,inst:JSBool,inst:JSNull,is:G,param:num]*/
method9(dynamic g, num value) {
if (g is! G) return null;
return g.field = value;
diff --git a/tests/compiler/dart2js/impact/data/invokes.dart b/tests/compiler/dart2js/impact/data/invokes.dart
index ec1ce07..2e93818 100644
--- a/tests/compiler/dart2js/impact/data/invokes.dart
+++ b/tests/compiler/dart2js/impact/data/invokes.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:
static=[
testClosure(0),
@@ -115,13 +117,13 @@
topLevelFunction3(15, c: 16, b: 17);
}
-/*member: topLevelFunction1Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
+/*member: topLevelFunction1Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
void topLevelFunction1Typed(int a) {}
-/*member: topLevelFunction2Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:String,param:double,param:num]*/
+/*member: topLevelFunction2Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:String,param:double,param:num]*/
int topLevelFunction2Typed(String a, [num b, double c]) => null;
-/*member: topLevelFunction3Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:List<int>,param:Map<String,bool>,param:bool]*/
+/*member: topLevelFunction3Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:List<int>,param:Map<String,bool>,param:bool]*/
double topLevelFunction3Typed(bool a, {List<int> b, Map<String, bool> c}) {
return null;
}
@@ -162,16 +164,16 @@
topLevelFunction3Typed(false, c: {'16': false}, b: [17]);
}
-/*member: topLevelFunctionTyped1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num)]*/
+/*member: topLevelFunctionTyped1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num)]*/
topLevelFunctionTyped1(void a(num b)) {}
-/*member: topLevelFunctionTyped2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,[String])]*/
+/*member: topLevelFunctionTyped2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,[String])]*/
topLevelFunctionTyped2(void a(num b, [String c])) {}
-/*member: topLevelFunctionTyped3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{String c,int d})]*/
+/*member: topLevelFunctionTyped3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{String c,int d})]*/
topLevelFunctionTyped3(void a(num b, {String c, int d})) {}
-/*member: topLevelFunctionTyped4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{int c,String d})]*/
+/*member: topLevelFunctionTyped4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{int c,String d})]*/
topLevelFunctionTyped4(void a(num b, {String d, int c})) {}
/*member: testTopLevelFunctionTyped:
@@ -210,7 +212,7 @@
/*member: testTopLevelSetterSet:static=[set:topLevelSetter],type=[inst:JSNull]*/
testTopLevelSetterSet() => topLevelSetter = null;
-/*member: topLevelSetterTyped=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
+/*member: topLevelSetterTyped=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
void set topLevelSetterTyped(int value) {}
/*member: testTopLevelSetterSetTyped:static=[set:topLevelSetterTyped],type=[inst:JSNull]*/
@@ -239,25 +241,25 @@
/*member: testTopLevelFieldFinal:static=[topLevelFieldFinal]*/
testTopLevelFieldFinal() => topLevelFieldFinal;
-/*member: topLevelFieldTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
+/*member: topLevelFieldTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
int topLevelFieldTyped;
/*member: testTopLevelFieldTyped:static=[topLevelFieldTyped]*/
testTopLevelFieldTyped() => topLevelFieldTyped;
-/*member: topLevelFieldGeneric1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
+/*member: topLevelFieldGeneric1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
GenericClass topLevelFieldGeneric1;
/*member: testTopLevelFieldGeneric1:static=[topLevelFieldGeneric1]*/
testTopLevelFieldGeneric1() => topLevelFieldGeneric1;
-/*member: topLevelFieldGeneric2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
+/*member: topLevelFieldGeneric2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
GenericClass<dynamic, dynamic> topLevelFieldGeneric2;
/*member: testTopLevelFieldGeneric2:static=[topLevelFieldGeneric2]*/
testTopLevelFieldGeneric2() => topLevelFieldGeneric2;
-/*member: topLevelFieldGeneric3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:GenericClass<int,String>]*/
+/*member: topLevelFieldGeneric3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:GenericClass<int,String>]*/
GenericClass<int, String> topLevelFieldGeneric3;
/*member: testTopLevelFieldGeneric3:static=[topLevelFieldGeneric3]*/
@@ -382,7 +384,7 @@
localFunction() {}
}
-/*member: testLocalFunctionTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),computeSignature(3),def:localFunction,findType(1),getRuntimeTypeArguments(3),getRuntimeTypeInfo(1),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:Function,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:String]*/
+/*member: testLocalFunctionTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),computeSignature(3),def:localFunction,findType(1),getRuntimeTypeArguments(3),getRuntimeTypeInfo(1),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:Function,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:String]*/
testLocalFunctionTyped() {
// ignore: UNUSED_ELEMENT
int localFunction(String a) => null;
diff --git a/tests/compiler/dart2js/impact/data/jsinterop.dart b/tests/compiler/dart2js/impact/data/jsinterop.dart
index 6dce2cd..efddfaa 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop.dart
@@ -2,6 +2,8 @@
// 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.7
+
@JS()
library jsinterop;
@@ -59,7 +61,7 @@
/*member: GenericClass.:static=[JavaScriptObject.(0)]*/
@JS()
class GenericClass<T> {
- /*member: GenericClass.method:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:void Function(GenericClass.T)]*/
+ /*member: GenericClass.method:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:void Function(GenericClass.T)]*/
external GenericClass method([Callback<T> callback]);
}
diff --git a/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart b/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart
index 379e8e9..d60cd83 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart
@@ -2,6 +2,8 @@
// 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.7
+
@JS()
library main;
@@ -9,11 +11,11 @@
import 'package:js/js.dart';
-/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:Function]*/
+/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:Function]*/
@JS()
external set foo(Function f);
-/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
+/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
void _doStuff(String name, File file) {
if (file == null) {
print('OK');
diff --git a/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart b/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart
index 4fdac09..2d7eb7f 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart
@@ -2,6 +2,8 @@
// 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.7
+
@JS()
library main;
@@ -9,11 +11,11 @@
import 'package:js/js.dart';
-/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:File,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:void Function(String,File)]*/
+/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:File,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:void Function(String,File)]*/
@JS()
external set foo(void Function(String, File) f);
-/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
+/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
void _doStuff(String name, File file) {
if (file == null) {
print('OK');
diff --git a/tests/compiler/dart2js/impact/data/literals.dart b/tests/compiler/dart2js/impact/data/literals.dart
index 987e646..4edd315 100644
--- a/tests/compiler/dart2js/impact/data/literals.dart
+++ b/tests/compiler/dart2js/impact/data/literals.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:static=[
testBoolFromEnvironment(0),
testComplexConstSymbol(0),
diff --git a/tests/compiler/dart2js/impact/data/native.dart b/tests/compiler/dart2js/impact/data/native.dart
index a759f7f..ecbaf89 100644
--- a/tests/compiler/dart2js/impact/data/native.dart
+++ b/tests/compiler/dart2js/impact/data/native.dart
@@ -2,6 +2,8 @@
// 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.7
+
// ignore: IMPORT_INTERNAL_LIBRARY
import 'dart:_foreign_helper' as foreign show JS;
// ignore: IMPORT_INTERNAL_LIBRARY
@@ -56,7 +58,7 @@
@Native("NativeClass")
class NativeClass {
- /*member: NativeClass.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,native:JSExtendableArray<JSExtendableArray.E>,native:Object,native:String,native:bool,native:double,native:int,param:Object]*/
+ /*member: NativeClass.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,native:JSExtendableArray<JSExtendableArray.E>,native:Object,native:String,native:bool,native:double,native:int,param:Object]*/
@annotation_Creates_SerializedScriptValue
final Object field;
@@ -65,5 +67,5 @@
}
}
-/*member: testNativeField:dynamic=[NativeClass.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:NativeClass]*/
+/*member: testNativeField:dynamic=[NativeClass.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:NativeClass]*/
testNativeField(NativeClass c) => c.field;
diff --git a/tests/compiler/dart2js/impact/data/promotion.dart b/tests/compiler/dart2js/impact/data/promotion.dart
index e0513e7..69a6b93 100644
--- a/tests/compiler/dart2js/impact/data/promotion.dart
+++ b/tests/compiler/dart2js/impact/data/promotion.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {}
class SubClass extends Class {
@@ -37,17 +39,17 @@
dynamicToNoSuchMethodTearOff(null);
}
-/*member: positiveTyped:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass,param:Class]*/
+/*member: positiveTyped:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass,param:Class]*/
positiveTyped(Class cls) {
if (cls is SubClass) cls.method();
}
-/*member: positiveDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
+/*member: positiveDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
positiveDynamic(dynamic cls) {
if (cls is SubClass) cls.method();
}
-/*member: negativeDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
+/*member: negativeDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
negativeDynamic(dynamic cls) {
if (cls is! SubClass) return;
cls.method();
diff --git a/tests/compiler/dart2js/impact/data/runtime_type.dart b/tests/compiler/dart2js/impact/data/runtime_type.dart
index 7b1ca18..204aadf 100644
--- a/tests/compiler/dart2js/impact/data/runtime_type.dart
+++ b/tests/compiler/dart2js/impact/data/runtime_type.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: Class1a.:static=[Object.(0)]*/
class Class1a<T> {
/*member: Class1a.==:
@@ -60,88 +62,88 @@
/*member: Class4.:static=[Object.(0)]*/
class Class4 {}
-/*member: toString1:dynamic=[Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString1:dynamic=[Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
toString1(Class2<int> c) => '${c.runtimeType}';
-/*member: toString2:dynamic=[Class2.==,Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString2:dynamic=[Class2.==,Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
toString2(Class2<int> c) => '${c?.runtimeType}';
-/*member: toString3:dynamic=[Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString3:dynamic=[Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
toString3(Class2<int> c) => c.runtimeType.toString();
-/*member: toString4:dynamic=[Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString4:dynamic=[Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
toString4(Class2<int> c) => c.runtimeType?.toString();
-/*member: toString5:dynamic=[Class2.==,Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString5:dynamic=[Class2.==,Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
toString5(Class2<int> c) => c?.runtimeType?.toString();
-/*member: toString6:dynamic=[Class2.==,Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString6:dynamic=[Class2.==,Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
toString6(Class2<int> c) => c?.runtimeType.toString();
-/*member: unknown:dynamic=[Class2.runtimeType],runtimeType=[unknown:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: unknown:dynamic=[Class2.runtimeType],runtimeType=[unknown:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
unknown(Class2<int> c) => c.runtimeType;
-/*member: equals1:dynamic=[Class1a.==,Class1a.runtimeType,Class1d.==,Class1d.runtimeType,Type.==],runtimeType=[equals:Class1a<int>/Class1d<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class1a<int>,param:Class1d<int>]*/
+/*member: equals1:dynamic=[Class1a.==,Class1a.runtimeType,Class1d.==,Class1d.runtimeType,Type.==],runtimeType=[equals:Class1a<int>/Class1d<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class1a<int>,param:Class1d<int>]*/
equals1(Class1a<int> a, Class1d<int> b) => a?.runtimeType == b?.runtimeType;
-/*member: almostEquals1:dynamic=[Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals1:dynamic=[Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals1(Class3 a) => a.runtimeType == null;
-/*member: almostEquals2:dynamic=[Class3.==,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals2:dynamic=[Class3.==,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals2(Class3 a) => a?.runtimeType == null;
-/*member: almostEquals3:dynamic=[Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals3:dynamic=[Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals3(Class3 a) => null == a.runtimeType;
-/*member: almostEquals4:dynamic=[Class3.==,Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals4:dynamic=[Class3.==,Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals4(Class3 a) => null == a?.runtimeType;
-/*member: almostEquals5:dynamic=[Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
+/*member: almostEquals5:dynamic=[Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
almostEquals5(Class3 a) => a.runtimeType == a.field;
-/*member: almostEquals6:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals6:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals6(Class3 a) => a?.runtimeType == a.field;
-/*member: almostEquals7:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals7:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals7(Class3 a) => a.runtimeType == a?.field;
-/*member: almostEquals8:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals8:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals8(Class3 a) => a?.runtimeType == a?.field;
-/*member: almostEquals9:dynamic=[Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
+/*member: almostEquals9:dynamic=[Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
almostEquals9(Class3 a) => a.field == a.runtimeType;
-/*member: almostEquals10:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals10:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals10(Class3 a) => a?.field == a.runtimeType;
-/*member: almostEquals11:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals11:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals11(Class3 a) => a.field == a?.runtimeType;
-/*member: almostEquals12:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals12:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostEquals12(Class3 a) => a?.field == a?.runtimeType;
-/*member: almostToString1:dynamic=[Class3.runtimeType,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
+/*member: almostToString1:dynamic=[Class3.runtimeType,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
almostToString1(Class3 a) => a.runtimeType.toString;
-/*member: almostToString2:dynamic=[Class3.==,Class3.runtimeType,Type.==,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostToString2:dynamic=[Class3.==,Class3.runtimeType,Type.==,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostToString2(Class3 a) => a?.runtimeType?.toString;
-/*member: almostToString3:dynamic=[Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostToString3:dynamic=[Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostToString3(Class3 a) => a.runtimeType.noSuchMethod(null);
-/*member: almostToString4:dynamic=[Class3.==,Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostToString4:dynamic=[Class3.==,Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
almostToString4(Class3 a) => a?.runtimeType.noSuchMethod(null);
-/*member: notEquals1:dynamic=[Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3,param:Class4]*/
+/*member: notEquals1:dynamic=[Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3,param:Class4]*/
notEquals1(Class3 a, Class4 b) => a.runtimeType != b.runtimeType;
-/*member: notEquals2:dynamic=[Class3.==,Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
+/*member: notEquals2:dynamic=[Class3.==,Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
notEquals2(Class3 a, Class4 b) => a?.runtimeType != b.runtimeType;
-/*member: notEquals3:dynamic=[Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
+/*member: notEquals3:dynamic=[Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
notEquals3(Class3 a, Class4 b) => a.runtimeType != b?.runtimeType;
-/*member: notEquals4:dynamic=[Class3.==,Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
+/*member: notEquals4:dynamic=[Class3.==,Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
notEquals4(Class3 a, Class4 b) => a?.runtimeType != b?.runtimeType;
/*member: main:dynamic=[exact:Class1a.==],static=[Class1a.(0),Class1b.(0),Class1c.(0),Class1d.(0),Class2.(0),Class3.(0),Class4.(0),almostEquals1(1),almostEquals10(1),almostEquals11(1),almostEquals12(1),almostEquals2(1),almostEquals3(1),almostEquals4(1),almostEquals5(1),almostEquals6(1),almostEquals7(1),almostEquals8(1),almostEquals9(1),almostToString1(1),almostToString2(1),almostToString3(1),almostToString4(1),checkTypeBound(4),equals1(2),notEquals1(2),notEquals2(2),notEquals3(2),notEquals4(2),print(1),throwTypeError(1),toString1(1),toString2(1),toString3(1),toString4(1),toString5(1),toString6(1),unknown(1)]*/
diff --git a/tests/compiler/dart2js/impact/data/statements.dart b/tests/compiler/dart2js/impact/data/statements.dart
index 15a28cf..f5b41a2 100644
--- a/tests/compiler/dart2js/impact/data/statements.dart
+++ b/tests/compiler/dart2js/impact/data/statements.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:
static=[
testAssert(0),
@@ -65,13 +67,13 @@
return 1;
}
-/*member: testForIn:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testForIn:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
testForIn(o) {
// ignore: UNUSED_LOCAL_VARIABLE
for (var e in o) {}
}
-/*member: testForInTyped:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testForInTyped:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
testForInTyped(o) {
// ignore: UNUSED_LOCAL_VARIABLE
for (int e in o) {}
@@ -87,7 +89,7 @@
try {} catch (e) {}
}
-/*member: testTryCatchOn:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),unwrapException(1)],type=[catch:String,inst:Closure,inst:JSBool,inst:PlainJavaScriptObject,inst:UnknownJavaScriptObject]*/
+/*member: testTryCatchOn:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),unwrapException(1)],type=[catch:String,inst:Closure,inst:JSBool,inst:PlainJavaScriptObject,inst:UnknownJavaScriptObject]*/
testTryCatchOn() {
// ignore: UNUSED_CATCH_CLAUSE
try {} on String catch (e) {}
diff --git a/tests/compiler/dart2js/impact/data/this.dart b/tests/compiler/dart2js/impact/data/this.dart
index f06504e..d526987 100644
--- a/tests/compiler/dart2js/impact/data/this.dart
+++ b/tests/compiler/dart2js/impact/data/this.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: Class.:static=[Object.(0)]*/
class Class {
/*member: Class.field1:type=[inst:JSNull]*/
diff --git a/tests/compiler/dart2js/impact/impact_test.dart b/tests/compiler/dart2js/impact/impact_test.dart
index 09a1566..1ae3981 100644
--- a/tests/compiler/dart2js/impact/impact_test.dart
+++ b/tests/compiler/dart2js/impact/impact_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/inference/callers/field_access.dart b/tests/compiler/dart2js/inference/callers/field_access.dart
index 4cad4a1..403a14f 100644
--- a/tests/compiler/dart2js/inference/callers/field_access.dart
+++ b/tests/compiler/dart2js/inference/callers/field_access.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: B.:[main]*/
class A {
/*member: A.field:[main]*/
diff --git a/tests/compiler/dart2js/inference/callers_test.dart b/tests/compiler/dart2js/inference/callers_test.dart
index 5a6a719..421ff24 100644
--- a/tests/compiler/dart2js/inference/callers_test.dart
+++ b/tests/compiler/dart2js/inference/callers_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/inference/data/abstract_method.dart b/tests/compiler/dart2js/inference/data/abstract_method.dart
index b6076c4..81dd471 100644
--- a/tests/compiler/dart2js/inference/data/abstract_method.dart
+++ b/tests/compiler/dart2js/inference/data/abstract_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
abstractEquals();
diff --git a/tests/compiler/dart2js/inference/data/and_or.dart b/tests/compiler/dart2js/inference/data/and_or.dart
index 1f51c64..a312110 100644
--- a/tests/compiler/dart2js/inference/data/and_or.dart
+++ b/tests/compiler/dart2js/inference/data/and_or.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: X.:[exact=X]*/
class X {}
diff --git a/tests/compiler/dart2js/inference/data/as.dart b/tests/compiler/dart2js/inference/data/as.dart
index 3a66972..319f83f 100644
--- a/tests/compiler/dart2js/inference/data/as.dart
+++ b/tests/compiler/dart2js/inference/data/as.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
asIntWithString();
diff --git a/tests/compiler/dart2js/inference/data/assert.dart b/tests/compiler/dart2js/inference/data/assert.dart
index 8f470ae..ff409e0 100644
--- a/tests/compiler/dart2js/inference/data/assert.dart
+++ b/tests/compiler/dart2js/inference/data/assert.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// This file contains tests of assertions when assertions are _disabled_. The
/// file 'assert_ea.dart' contains similar tests for when assertions are
/// _enabled_.
diff --git a/tests/compiler/dart2js/inference/data/assert_ea.dart b/tests/compiler/dart2js/inference/data/assert_ea.dart
index 5faff4e..99f4550 100644
--- a/tests/compiler/dart2js/inference/data/assert_ea.dart
+++ b/tests/compiler/dart2js/inference/data/assert_ea.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// This file contains tests of assertions when assertions are _enabled_. The
/// file 'assert.dart' contains similar tests for when assertions are
/// _disabled_.
diff --git a/tests/compiler/dart2js/inference/data/assert_message_throw.dart b/tests/compiler/dart2js/inference/data/assert_message_throw.dart
index 1115952..095a1a3 100644
--- a/tests/compiler/dart2js/inference/data/assert_message_throw.dart
+++ b/tests/compiler/dart2js/inference/data/assert_message_throw.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// This file contains tests of assertions when assertions are _disabled_. The
/// file 'assert_message_throw_ea.dart' contains similar tests for when
/// assertions are _enabled_.
diff --git a/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart b/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart
index 72e4618..ed29bb3 100644
--- a/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart
+++ b/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// This file contains tests of assertions when assertions are _enabled_. The
/// file 'assert_message_throw.dart' contains similar tests for when assertions
/// are _disabled_.
diff --git a/tests/compiler/dart2js/inference/data/assign_op.dart b/tests/compiler/dart2js/inference/data/assign_op.dart
index 94d63dc..d658ac3 100644
--- a/tests/compiler/dart2js/inference/data/assign_op.dart
+++ b/tests/compiler/dart2js/inference/data/assign_op.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
assignPlus();
diff --git a/tests/compiler/dart2js/inference/data/async_marker.dart b/tests/compiler/dart2js/inference/data/async_marker.dart
index 97a9464..001fed5 100644
--- a/tests/compiler/dart2js/inference/data/async_marker.dart
+++ b/tests/compiler/dart2js/inference/data/async_marker.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
asyncMethod();
diff --git a/tests/compiler/dart2js/inference/data/await.dart b/tests/compiler/dart2js/inference/data/await.dart
index 1f7bfea..5fb5d91 100644
--- a/tests/compiler/dart2js/inference/data/await.dart
+++ b/tests/compiler/dart2js/inference/data/await.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
/*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/break_continue.dart b/tests/compiler/dart2js/inference/data/break_continue.dart
index 989c474..9fbb86e 100644
--- a/tests/compiler/dart2js/inference/data/break_continue.dart
+++ b/tests/compiler/dart2js/inference/data/break_continue.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
breakInWhile();
diff --git a/tests/compiler/dart2js/inference/data/call_in_loop.dart b/tests/compiler/dart2js/inference/data/call_in_loop.dart
index b948889..5827401 100644
--- a/tests/compiler/dart2js/inference/data/call_in_loop.dart
+++ b/tests/compiler/dart2js/inference/data/call_in_loop.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression test for [ClosureCallSiteTypeInformation] in loops.
/*member: Class.:[exact=Class]*/
diff --git a/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart b/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart
index 52d6d13..23487e5 100644
--- a/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart
+++ b/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test based on language_2/call_method_function_typed_value_test/04
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/inference/data/call_site.dart b/tests/compiler/dart2js/inference/data/call_site.dart
index c945208..ac2b579 100644
--- a/tests/compiler/dart2js/inference/data/call_site.dart
+++ b/tests/compiler/dart2js/inference/data/call_site.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
test1();
diff --git a/tests/compiler/dart2js/inference/data/catch.dart b/tests/compiler/dart2js/inference/data/catch.dart
index d87f53a..243100d 100644
--- a/tests/compiler/dart2js/inference/data/catch.dart
+++ b/tests/compiler/dart2js/inference/data/catch.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
catchUntyped();
diff --git a/tests/compiler/dart2js/inference/data/closure.dart b/tests/compiler/dart2js/inference/data/closure.dart
index e4f2243..2e14eff 100644
--- a/tests/compiler/dart2js/inference/data/closure.dart
+++ b/tests/compiler/dart2js/inference/data/closure.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
returnInClosure();
diff --git a/tests/compiler/dart2js/inference/data/closure2.dart b/tests/compiler/dart2js/inference/data/closure2.dart
index 5d03f44..0e6335d 100644
--- a/tests/compiler/dart2js/inference/data/closure2.dart
+++ b/tests/compiler/dart2js/inference/data/closure2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: returnInt1:[exact=JSUInt31]*/
returnInt1() {
var a = 42;
diff --git a/tests/compiler/dart2js/inference/data/closure_tracer.dart b/tests/compiler/dart2js/inference/data/closure_tracer.dart
index 7aa62d9..08105f7 100644
--- a/tests/compiler/dart2js/inference/data/closure_tracer.dart
+++ b/tests/compiler/dart2js/inference/data/closure_tracer.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: testFunctionStatement:[null|exact=JSUInt31]*/
testFunctionStatement() {
var res;
@@ -45,7 +47,7 @@
var res;
/*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
var a = new A(closure);
- a. /*invoke: [exact=A]*/ field(42);
+ a.field /*invoke: [exact=A]*/ (42);
return res;
}
diff --git a/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
index 011b9ed..b93f472 100644
--- a/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
+++ b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for issue 28919.
/*member: foo1:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/closurization_instance.dart b/tests/compiler/dart2js/inference/data/closurization_instance.dart
index 810e71f..5ffcc5d 100644
--- a/tests/compiler/dart2js/inference/data/closurization_instance.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_instance.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/closurization_instance_call.dart b/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
index d5eabac..f716040 100644
--- a/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/closurization_local_call.dart b/tests/compiler/dart2js/inference/data/closurization_local_call.dart
index 19c5758..2b5c6fc 100644
--- a/tests/compiler/dart2js/inference/data/closurization_local_call.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_local_call.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/closurization_static.dart b/tests/compiler/dart2js/inference/data/closurization_static.dart
index deea1db..f053673 100644
--- a/tests/compiler/dart2js/inference/data/closurization_static.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_static.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/closurization_static_call.dart b/tests/compiler/dart2js/inference/data/closurization_static_call.dart
index 575f68d..1da1648 100644
--- a/tests/compiler/dart2js/inference/data/closurization_static_call.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_static_call.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/conditional.dart b/tests/compiler/dart2js/inference/data/conditional.dart
index e8af4fe..3e16c64 100644
--- a/tests/compiler/dart2js/inference/data/conditional.dart
+++ b/tests/compiler/dart2js/inference/data/conditional.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
simpleConditional();
diff --git a/tests/compiler/dart2js/inference/data/const_closure.dart b/tests/compiler/dart2js/inference/data/const_closure.dart
index ca22d2e..24ef0af 100644
--- a/tests/compiler/dart2js/inference/data/const_closure.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method1:[exact=JSUInt31]*/
method1() {
return 42;
diff --git a/tests/compiler/dart2js/inference/data/const_closure2.dart b/tests/compiler/dart2js/inference/data/const_closure2.dart
index 64f75e3..d647115 100644
--- a/tests/compiler/dart2js/inference/data/const_closure2.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method:Union([exact=JSDouble], [exact=JSUInt31])*/
// Called via [foo] with integer then double.
method(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/const_closure3.dart b/tests/compiler/dart2js/inference/data/const_closure3.dart
index 31bcc35..f0ce02b 100644
--- a/tests/compiler/dart2js/inference/data/const_closure3.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method:[exact=JSUInt31]*/
// Called only via [foo2] with a small integer.
method(/*[exact=JSUInt31]*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/const_closure4.dart b/tests/compiler/dart2js/inference/data/const_closure4.dart
index 64f75e3..d647115 100644
--- a/tests/compiler/dart2js/inference/data/const_closure4.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure4.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method:Union([exact=JSDouble], [exact=JSUInt31])*/
// Called via [foo] with integer then double.
method(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/const_closure5.dart b/tests/compiler/dart2js/inference/data/const_closure5.dart
index 36b822d..76887e5 100644
--- a/tests/compiler/dart2js/inference/data/const_closure5.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure5.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method:Union([exact=JSDouble], [exact=JSUInt31])*/
// Called only via [foo2] with a small integer.
method(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/const_closure_default.dart b/tests/compiler/dart2js/inference/data/const_closure_default.dart
index 135ed2a..5b60f7b 100644
--- a/tests/compiler/dart2js/inference/data/const_closure_default.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure_default.dart
@@ -2,6 +2,8 @@
// 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.7
+
// [defaultFn_i] is called only via [foo_i]'s default value with a small integer.
/*member: defaultFn1:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/container_mask_equal.dart b/tests/compiler/dart2js/inference/data/container_mask_equal.dart
index c4830df..e1bde05 100644
--- a/tests/compiler/dart2js/inference/data/container_mask_equal.dart
+++ b/tests/compiler/dart2js/inference/data/container_mask_equal.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for dart2js that used to have a bogus
// implementation of var.== and var.hashCode.
diff --git a/tests/compiler/dart2js/inference/data/default_value.dart b/tests/compiler/dart2js/inference/data/default_value.dart
index b08d14f..ac5aea5 100644
--- a/tests/compiler/dart2js/inference/data/default_value.dart
+++ b/tests/compiler/dart2js/inference/data/default_value.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
positionalWithoutDefaultOnLocal();
diff --git a/tests/compiler/dart2js/inference/data/deferred_load.dart b/tests/compiler/dart2js/inference/data/deferred_load.dart
index 41ee085..9d7caf1 100644
--- a/tests/compiler/dart2js/inference/data/deferred_load.dart
+++ b/tests/compiler/dart2js/inference/data/deferred_load.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart' deferred as expect;
/*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/deferred_load_get.dart b/tests/compiler/dart2js/inference/data/deferred_load_get.dart
index d77937c..1e46768 100644
--- a/tests/compiler/dart2js/inference/data/deferred_load_get.dart
+++ b/tests/compiler/dart2js/inference/data/deferred_load_get.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart' deferred as expect;
// Synthetic getter added by kernel.
diff --git a/tests/compiler/dart2js/inference/data/dictionary_types.dart b/tests/compiler/dart2js/inference/data/dictionary_types.dart
index c514566..b2c5aa1 100644
--- a/tests/compiler/dart2js/inference/data/dictionary_types.dart
+++ b/tests/compiler/dart2js/inference/data/dictionary_types.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
test1();
diff --git a/tests/compiler/dart2js/inference/data/do.dart b/tests/compiler/dart2js/inference/data/do.dart
index 5a7ffac..47c116f 100644
--- a/tests/compiler/dart2js/inference/data/do.dart
+++ b/tests/compiler/dart2js/inference/data/do.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
simpleDo();
diff --git a/tests/compiler/dart2js/inference/data/enum.dart b/tests/compiler/dart2js/inference/data/enum.dart
index 6e288fa..5f650f3 100644
--- a/tests/compiler/dart2js/inference/data/enum.dart
+++ b/tests/compiler/dart2js/inference/data/enum.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
enumValue();
diff --git a/tests/compiler/dart2js/inference/data/expose_this.dart b/tests/compiler/dart2js/inference/data/expose_this.dart
index 26a5d7a..1c7ec3f 100644
--- a/tests/compiler/dart2js/inference/data/expose_this.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
exposeThis1();
diff --git a/tests/compiler/dart2js/inference/data/expose_this_closure.dart b/tests/compiler/dart2js/inference/data/expose_this_closure.dart
index da43183..f042cbb 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_closure.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_closure.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
exposeThis1();
diff --git a/tests/compiler/dart2js/inference/data/expose_this_field.dart b/tests/compiler/dart2js/inference/data/expose_this_field.dart
index aa3b384..de31884 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_field.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_field.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
exposeThis1();
diff --git a/tests/compiler/dart2js/inference/data/expose_this_mask.dart b/tests/compiler/dart2js/inference/data/expose_this_mask.dart
index 7dd84bb..693de3c 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_mask.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_mask.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Check that exposure of this is correctly restricted through the receiver
/// mask.
@@ -243,7 +245,7 @@
/*member: Class7.:[exact=Class7]*/
Class7() : field7a = 42 {
- /*invoke: [subclass=Class7]*/ field7b(/*[subclass=Class7]*/ field7a);
+ field7b /*invoke: [subclass=Class7]*/ (/*[subclass=Class7]*/ field7a);
}
}
diff --git a/tests/compiler/dart2js/inference/data/expose_this_super.dart b/tests/compiler/dart2js/inference/data/expose_this_super.dart
index cb7b1cc..73116b8 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_super.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_super.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
exposeThis1();
diff --git a/tests/compiler/dart2js/inference/data/factory.dart b/tests/compiler/dart2js/inference/data/factory.dart
index 60a789c..c7ef2d0 100644
--- a/tests/compiler/dart2js/inference/data/factory.dart
+++ b/tests/compiler/dart2js/inference/data/factory.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
/*member: A.generative:[exact=A]*/
A.generative();
diff --git a/tests/compiler/dart2js/inference/data/field_type.dart b/tests/compiler/dart2js/inference/data/field_type.dart
index 48ec69b..e74c6e5 100644
--- a/tests/compiler/dart2js/inference/data/field_type.dart
+++ b/tests/compiler/dart2js/inference/data/field_type.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
test1();
diff --git a/tests/compiler/dart2js/inference/data/fields.dart b/tests/compiler/dart2js/inference/data/fields.dart
index 3fbf03a..14eff79 100644
--- a/tests/compiler/dart2js/inference/data/fields.dart
+++ b/tests/compiler/dart2js/inference/data/fields.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
fieldGetUnset();
diff --git a/tests/compiler/dart2js/inference/data/final_field.dart b/tests/compiler/dart2js/inference/data/final_field.dart
index c0558d0..ef65501 100644
--- a/tests/compiler/dart2js/inference/data/final_field.dart
+++ b/tests/compiler/dart2js/inference/data/final_field.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
/*member: A.intField:[exact=JSUInt31]*/
final intField;
diff --git a/tests/compiler/dart2js/inference/data/final_field2.dart b/tests/compiler/dart2js/inference/data/final_field2.dart
index d4ee03f..6e1e01d 100644
--- a/tests/compiler/dart2js/inference/data/final_field2.dart
+++ b/tests/compiler/dart2js/inference/data/final_field2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that a non-used generative constructor does not prevent
// inferring types for fields.
diff --git a/tests/compiler/dart2js/inference/data/final_field3.dart b/tests/compiler/dart2js/inference/data/final_field3.dart
index 87925cb..a87aa96 100644
--- a/tests/compiler/dart2js/inference/data/final_field3.dart
+++ b/tests/compiler/dart2js/inference/data/final_field3.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that we are analyzing field parameters correctly.
class A {
diff --git a/tests/compiler/dart2js/inference/data/finalized_type_variable.dart b/tests/compiler/dart2js/inference/data/finalized_type_variable.dart
index a3eb54c..1d81014 100644
--- a/tests/compiler/dart2js/inference/data/finalized_type_variable.dart
+++ b/tests/compiler/dart2js/inference/data/finalized_type_variable.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: AppView.:[subclass=AppView]*/
abstract class AppView<T> {
/*member: AppView.ctx:Union(null, [exact=CardComponent2], [exact=CardComponent])*/
diff --git a/tests/compiler/dart2js/inference/data/for.dart b/tests/compiler/dart2js/inference/data/for.dart
index 5af242e..e36b2ca 100644
--- a/tests/compiler/dart2js/inference/data/for.dart
+++ b/tests/compiler/dart2js/inference/data/for.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
simpleFor();
diff --git a/tests/compiler/dart2js/inference/data/for_in.dart b/tests/compiler/dart2js/inference/data/for_in.dart
index 301bcf7..b57661a 100644
--- a/tests/compiler/dart2js/inference/data/for_in.dart
+++ b/tests/compiler/dart2js/inference/data/for_in.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
forInDirect();
diff --git a/tests/compiler/dart2js/inference/data/foreign.dart b/tests/compiler/dart2js/inference/data/foreign.dart
index 8c07276..2f304f7 100644
--- a/tests/compiler/dart2js/inference/data/foreign.dart
+++ b/tests/compiler/dart2js/inference/data/foreign.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// ignore: IMPORT_INTERNAL_LIBRARY
import 'dart:_foreign_helper';
diff --git a/tests/compiler/dart2js/inference/data/general.dart b/tests/compiler/dart2js/inference/data/general.dart
index f858024..209f884 100644
--- a/tests/compiler/dart2js/inference/data/general.dart
+++ b/tests/compiler/dart2js/inference/data/general.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: returnNum1:Union([exact=JSDouble], [exact=JSUInt31])*/
returnNum1(/*Value([exact=JSBool], value: true)*/ a) {
if (a)
@@ -654,7 +656,7 @@
}
/*member: testReturnInvokeDynamicGetter:[null|subclass=Object]*/
-testReturnInvokeDynamicGetter() => new A(). /*invoke: [exact=A]*/ myFactory();
+testReturnInvokeDynamicGetter() => new A().myFactory /*invoke: [exact=A]*/ ();
/*member: topLevelConstList:Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/
var topLevelConstList = const [42];
diff --git a/tests/compiler/dart2js/inference/data/general6.dart b/tests/compiler/dart2js/inference/data/general6.dart
index fab306e..b6c045c 100644
--- a/tests/compiler/dart2js/inference/data/general6.dart
+++ b/tests/compiler/dart2js/inference/data/general6.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: foo:[exact=JSUInt31]*/
foo() {
var a = [1, 2, 3];
diff --git a/tests/compiler/dart2js/inference/data/general7.dart b/tests/compiler/dart2js/inference/data/general7.dart
index bd8da3f3..80bfbf8 100644
--- a/tests/compiler/dart2js/inference/data/general7.dart
+++ b/tests/compiler/dart2js/inference/data/general7.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// This file contains tests of assertions when assertions are _disabled_. The
/// file 'general7_ea.dart' contains similar tests for when assertions are
/// _enabled_.
diff --git a/tests/compiler/dart2js/inference/data/general7_ea.dart b/tests/compiler/dart2js/inference/data/general7_ea.dart
index 733c016..fe01ac9 100644
--- a/tests/compiler/dart2js/inference/data/general7_ea.dart
+++ b/tests/compiler/dart2js/inference/data/general7_ea.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// This file contains tests of assertions when assertions are _enabled_. The
/// file 'general7.dart' contains similar tests for when assertions are
/// _disabled_.
diff --git a/tests/compiler/dart2js/inference/data/general8a.dart b/tests/compiler/dart2js/inference/data/general8a.dart
index 8f3815a..c21a00d 100644
--- a/tests/compiler/dart2js/inference/data/general8a.dart
+++ b/tests/compiler/dart2js/inference/data/general8a.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: foo:Value([exact=JSBool], value: false)*/
foo(/*Value([exact=JSBool], value: false)*/ x) {
return x;
diff --git a/tests/compiler/dart2js/inference/data/general8b.dart b/tests/compiler/dart2js/inference/data/general8b.dart
index baed070..2fd6381 100644
--- a/tests/compiler/dart2js/inference/data/general8b.dart
+++ b/tests/compiler/dart2js/inference/data/general8b.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: foo:[exact=JSBool]*/
foo(/*[exact=JSUInt31]*/ x) {
if (x /*invoke: [exact=JSUInt31]*/ > 3) return true;
diff --git a/tests/compiler/dart2js/inference/data/global_field_closure.dart b/tests/compiler/dart2js/inference/data/global_field_closure.dart
index 616c6f1..cdd3751 100644
--- a/tests/compiler/dart2js/inference/data/global_field_closure.dart
+++ b/tests/compiler/dart2js/inference/data/global_field_closure.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method1:[exact=JSUInt31]*/
method1() {
return 42;
diff --git a/tests/compiler/dart2js/inference/data/global_field_closure2.dart b/tests/compiler/dart2js/inference/data/global_field_closure2.dart
index 42991dc..15a70d3 100644
--- a/tests/compiler/dart2js/inference/data/global_field_closure2.dart
+++ b/tests/compiler/dart2js/inference/data/global_field_closure2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method:[exact=JSUInt31]*/
// Called only via [foo] with a small integer.
method(/*[exact=JSUInt31]*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/if.dart b/tests/compiler/dart2js/inference/data/if.dart
index ecb1a6f..b9ffbb7 100644
--- a/tests/compiler/dart2js/inference/data/if.dart
+++ b/tests/compiler/dart2js/inference/data/if.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
simpleIfThen();
diff --git a/tests/compiler/dart2js/inference/data/if_null.dart b/tests/compiler/dart2js/inference/data/if_null.dart
index 988f649..a079f65 100644
--- a/tests/compiler/dart2js/inference/data/if_null.dart
+++ b/tests/compiler/dart2js/inference/data/if_null.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
ifNull();
diff --git a/tests/compiler/dart2js/inference/data/index.dart b/tests/compiler/dart2js/inference/data/index.dart
index 255a5be..4a00271 100644
--- a/tests/compiler/dart2js/inference/data/index.dart
+++ b/tests/compiler/dart2js/inference/data/index.dart
@@ -2,6 +2,8 @@
// 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.7
+
////////////////////////////////////////////////////////////////////////////////
// Lookup into a singleton list.
////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/inference/data/index_call.dart b/tests/compiler/dart2js/inference/data/index_call.dart
index a2c6006..4454632 100644
--- a/tests/compiler/dart2js/inference/data/index_call.dart
+++ b/tests/compiler/dart2js/inference/data/index_call.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
listIndexCall();
diff --git a/tests/compiler/dart2js/inference/data/index_postfix.dart b/tests/compiler/dart2js/inference/data/index_postfix.dart
index a861cfb..157177a 100644
--- a/tests/compiler/dart2js/inference/data/index_postfix.dart
+++ b/tests/compiler/dart2js/inference/data/index_postfix.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
listIndexPostfixIncrement();
diff --git a/tests/compiler/dart2js/inference/data/index_set.dart b/tests/compiler/dart2js/inference/data/index_set.dart
index b31b947..883962c 100644
--- a/tests/compiler/dart2js/inference/data/index_set.dart
+++ b/tests/compiler/dart2js/inference/data/index_set.dart
@@ -2,6 +2,8 @@
// 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.7
+
////////////////////////////////////////////////////////////////////////////////
// Update to a singleton list.
////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/inference/data/init_get.dart b/tests/compiler/dart2js/inference/data/init_get.dart
index e940e1e..949a313 100644
--- a/tests/compiler/dart2js/inference/data/init_get.dart
+++ b/tests/compiler/dart2js/inference/data/init_get.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: getter:[exact=JSUInt31]*/
get getter => 42;
diff --git a/tests/compiler/dart2js/inference/data/initializer.dart b/tests/compiler/dart2js/inference/data/initializer.dart
index b059fef..df596c8 100644
--- a/tests/compiler/dart2js/inference/data/initializer.dart
+++ b/tests/compiler/dart2js/inference/data/initializer.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
initializingFormal();
diff --git a/tests/compiler/dart2js/inference/data/instance.dart b/tests/compiler/dart2js/inference/data/instance.dart
index 9559f1ba..d883fea 100644
--- a/tests/compiler/dart2js/inference/data/instance.dart
+++ b/tests/compiler/dart2js/inference/data/instance.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
thisExact();
diff --git a/tests/compiler/dart2js/inference/data/issue13354.dart b/tests/compiler/dart2js/inference/data/issue13354.dart
index a0c669e..ab10e3a 100644
--- a/tests/compiler/dart2js/inference/data/issue13354.dart
+++ b/tests/compiler/dart2js/inference/data/issue13354.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for issue 13354.
/*member: bar:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/js_interop.dart b/tests/compiler/dart2js/inference/data/js_interop.dart
index 2a0f3f9..bc4f653 100644
--- a/tests/compiler/dart2js/inference/data/js_interop.dart
+++ b/tests/compiler/dart2js/inference/data/js_interop.dart
@@ -2,6 +2,8 @@
// 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.7
+
@JS()
library js_interop;
diff --git a/tests/compiler/dart2js/inference/data/list.dart b/tests/compiler/dart2js/inference/data/list.dart
index eb14295..aa419a3 100644
--- a/tests/compiler/dart2js/inference/data/list.dart
+++ b/tests/compiler/dart2js/inference/data/list.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:typed_data';
/*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/list_huge.dart b/tests/compiler/dart2js/inference/data/list_huge.dart
index d2a23ce..967b704 100644
--- a/tests/compiler/dart2js/inference/data/list_huge.dart
+++ b/tests/compiler/dart2js/inference/data/list_huge.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test for Container type for Lists with huge or negative sizes.
/*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/list_tracer2.dart b/tests/compiler/dart2js/inference/data/list_tracer2.dart
index 37e2e2c..001ebc6 100644
--- a/tests/compiler/dart2js/inference/data/list_tracer2.dart
+++ b/tests/compiler/dart2js/inference/data/list_tracer2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// We used to always nullify the element type of a list we are tracing in
// the presence of a fixed length list constructor call.
diff --git a/tests/compiler/dart2js/inference/data/list_tracer3.dart b/tests/compiler/dart2js/inference/data/list_tracer3.dart
index 2c56101..a8212aa 100644
--- a/tests/compiler/dart2js/inference/data/list_tracer3.dart
+++ b/tests/compiler/dart2js/inference/data/list_tracer3.dart
@@ -2,6 +2,8 @@
// 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.7
+
// We used to always nullify the element type of a list we are tracing in
// the presence of a fixed length list constructor call.
diff --git a/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart b/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart
index 460ca33..9624438 100644
--- a/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart
+++ b/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:typed_data';
// TODO(johnniwinther): Fix inference for strong mode. List elements should not
diff --git a/tests/compiler/dart2js/inference/data/local_functions.dart b/tests/compiler/dart2js/inference/data/local_functions.dart
index 6d08b0a..b5f06cb 100644
--- a/tests/compiler/dart2js/inference/data/local_functions.dart
+++ b/tests/compiler/dart2js/inference/data/local_functions.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
namedLocalFunctionInvoke();
diff --git a/tests/compiler/dart2js/inference/data/local_functions_call.dart b/tests/compiler/dart2js/inference/data/local_functions_call.dart
index 42cc5b1..cd55038 100644
--- a/tests/compiler/dart2js/inference/data/local_functions_call.dart
+++ b/tests/compiler/dart2js/inference/data/local_functions_call.dart
@@ -2,6 +2,8 @@
// 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.7
+
// This is the same test as `closureCallToString` in 'local_functions.dart' but
// with a different expectancy because the closed world contains less '.call'
// methods.
diff --git a/tests/compiler/dart2js/inference/data/locals.dart b/tests/compiler/dart2js/inference/data/locals.dart
index bf0f271..92d1021 100644
--- a/tests/compiler/dart2js/inference/data/locals.dart
+++ b/tests/compiler/dart2js/inference/data/locals.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
uninitializedLocal();
diff --git a/tests/compiler/dart2js/inference/data/locals_trust.dart b/tests/compiler/dart2js/inference/data/locals_trust.dart
index 0580621..a391bd5 100644
--- a/tests/compiler/dart2js/inference/data/locals_trust.dart
+++ b/tests/compiler/dart2js/inference/data/locals_trust.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
trustLocals();
diff --git a/tests/compiler/dart2js/inference/data/logical.dart b/tests/compiler/dart2js/inference/data/logical.dart
index ed24935..6503fd9f0 100644
--- a/tests/compiler/dart2js/inference/data/logical.dart
+++ b/tests/compiler/dart2js/inference/data/logical.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
returnTrue();
diff --git a/tests/compiler/dart2js/inference/data/logical_if.dart b/tests/compiler/dart2js/inference/data/logical_if.dart
index ba19f3a..613dde8 100644
--- a/tests/compiler/dart2js/inference/data/logical_if.dart
+++ b/tests/compiler/dart2js/inference/data/logical_if.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
promotedIfThen();
diff --git a/tests/compiler/dart2js/inference/data/map.dart b/tests/compiler/dart2js/inference/data/map.dart
index bef703b..d39c7eb 100644
--- a/tests/compiler/dart2js/inference/data/map.dart
+++ b/tests/compiler/dart2js/inference/data/map.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
emptyMap();
diff --git a/tests/compiler/dart2js/inference/data/map_tracer_const.dart b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
index f238ad0..3ff4fbb 100644
--- a/tests/compiler/dart2js/inference/data/map_tracer_const.dart
+++ b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: closure:[exact=JSUInt31]*/
int closure(
int
diff --git a/tests/compiler/dart2js/inference/data/map_tracer_keys.dart b/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
index 0b817a2..20e469e 100644
--- a/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
+++ b/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
test1();
diff --git a/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/lib.dart b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/lib.dart
index f734696..b759f52 100644
--- a/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/lib.dart
+++ b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
class _SECRET {
/*member: _SECRET.:[exact=_SECRET]*/
const _SECRET();
diff --git a/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/main.dart b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/main.dart
index eb3692a..5138cbb 100644
--- a/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/main.dart
+++ b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/main.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Ensure that the inferrer looks at default values for parameters in
// synthetic constructors using the correct context. If the constructor call
// to D without optional parameters is inferred using D's context, the default
diff --git a/tests/compiler/dart2js/inference/data/narrowing.dart b/tests/compiler/dart2js/inference/data/narrowing.dart
index 27c041d..04545e9 100644
--- a/tests/compiler/dart2js/inference/data/narrowing.dart
+++ b/tests/compiler/dart2js/inference/data/narrowing.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression test for Issue #33761: is-checks and null-checks were assumed to
/// be true even in nested non-condition contexts.
diff --git a/tests/compiler/dart2js/inference/data/native.dart b/tests/compiler/dart2js/inference/data/native.dart
index a1bfd75..4cca54b 100644
--- a/tests/compiler/dart2js/inference/data/native.dart
+++ b/tests/compiler/dart2js/inference/data/native.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
nativeMethod();
diff --git a/tests/compiler/dart2js/inference/data/native2.dart b/tests/compiler/dart2js/inference/data/native2.dart
index e9b712c..88ae547 100644
--- a/tests/compiler/dart2js/inference/data/native2.dart
+++ b/tests/compiler/dart2js/inference/data/native2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// ignore: IMPORT_INTERNAL_LIBRARY
import 'dart:_foreign_helper' as foreign show JS;
import 'dart:html';
diff --git a/tests/compiler/dart2js/inference/data/native3.dart b/tests/compiler/dart2js/inference/data/native3.dart
index f2e7167..9ce9612 100644
--- a/tests/compiler/dart2js/inference/data/native3.dart
+++ b/tests/compiler/dart2js/inference/data/native3.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:html';
/*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/new.dart b/tests/compiler/dart2js/inference/data/new.dart
index fb9e9ff..aea17cd 100644
--- a/tests/compiler/dart2js/inference/data/new.dart
+++ b/tests/compiler/dart2js/inference/data/new.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
generativeConstructorCall();
diff --git a/tests/compiler/dart2js/inference/data/no_such_method.dart b/tests/compiler/dart2js/inference/data/no_such_method.dart
index af9d00a..daa1bdd 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method.dart
@@ -1,6 +1,8 @@
/*member: main:[null]*/
main() {
missingGetter();
+
+// @dart = 2.7
missingMethod();
closureThroughMissingMethod();
closureThroughMissingSetter();
diff --git a/tests/compiler/dart2js/inference/data/no_such_method1.dart b/tests/compiler/dart2js/inference/data/no_such_method1.dart
index 0c38fde..f2bac32 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method1.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: A.:[exact=A]*/
class A {
/*member: A.noSuchMethod:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/no_such_method2.dart b/tests/compiler/dart2js/inference/data/no_such_method2.dart
index 6b1c548..8f56a10 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method2.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: A.:[subclass=B]*/
abstract class A {
/*member: A.noSuchMethod:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/no_such_method3.dart b/tests/compiler/dart2js/inference/data/no_such_method3.dart
index 0ba1d1e..06a8679 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method3.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: A.:[exact=A]*/
class A {
// We may ignore this for type inference because syntactically it always
diff --git a/tests/compiler/dart2js/inference/data/no_such_method4.dart b/tests/compiler/dart2js/inference/data/no_such_method4.dart
index 7e489ec..0538869 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method4.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method4.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: A.:[exact=A]*/
class A {
// We may ignore this for type inference because it forwards to a default
diff --git a/tests/compiler/dart2js/inference/data/non_null.dart b/tests/compiler/dart2js/inference/data/non_null.dart
index 96be59d..d93cd29 100644
--- a/tests/compiler/dart2js/inference/data/non_null.dart
+++ b/tests/compiler/dart2js/inference/data/non_null.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
nonNullStaticField();
diff --git a/tests/compiler/dart2js/inference/data/null.dart b/tests/compiler/dart2js/inference/data/null.dart
index 05fd76b..985c372 100644
--- a/tests/compiler/dart2js/inference/data/null.dart
+++ b/tests/compiler/dart2js/inference/data/null.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
ifThenNullCheck(0);
diff --git a/tests/compiler/dart2js/inference/data/optimizer_hints.dart b/tests/compiler/dart2js/inference/data/optimizer_hints.dart
index c51ce4f..673b6a4 100644
--- a/tests/compiler/dart2js/inference/data/optimizer_hints.dart
+++ b/tests/compiler/dart2js/inference/data/optimizer_hints.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
assumeDynamic();
diff --git a/tests/compiler/dart2js/inference/data/parameters_trust.dart b/tests/compiler/dart2js/inference/data/parameters_trust.dart
index 63fbb49..3cdb9d4 100644
--- a/tests/compiler/dart2js/inference/data/parameters_trust.dart
+++ b/tests/compiler/dart2js/inference/data/parameters_trust.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/postfix.dart b/tests/compiler/dart2js/inference/data/postfix.dart
index 8cba579..8059eac 100644
--- a/tests/compiler/dart2js/inference/data/postfix.dart
+++ b/tests/compiler/dart2js/inference/data/postfix.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
localPostfixInc();
diff --git a/tests/compiler/dart2js/inference/data/postfix_prefix.dart b/tests/compiler/dart2js/inference/data/postfix_prefix.dart
index 9342997..881b489 100644
--- a/tests/compiler/dart2js/inference/data/postfix_prefix.dart
+++ b/tests/compiler/dart2js/inference/data/postfix_prefix.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: index:[empty]*/
dynamic get index => throw '';
diff --git a/tests/compiler/dart2js/inference/data/prefix.dart b/tests/compiler/dart2js/inference/data/prefix.dart
index 544ae70..bb1cfb1 100644
--- a/tests/compiler/dart2js/inference/data/prefix.dart
+++ b/tests/compiler/dart2js/inference/data/prefix.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
localPrefixInc();
diff --git a/tests/compiler/dart2js/inference/data/refine_captured_locals.dart b/tests/compiler/dart2js/inference/data/refine_captured_locals.dart
index 5a13864..fcaecf2 100644
--- a/tests/compiler/dart2js/inference/data/refine_captured_locals.dart
+++ b/tests/compiler/dart2js/inference/data/refine_captured_locals.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
refineBeforeCapture();
diff --git a/tests/compiler/dart2js/inference/data/refine_locals.dart b/tests/compiler/dart2js/inference/data/refine_locals.dart
index 1da00f4..6dd425a 100644
--- a/tests/compiler/dart2js/inference/data/refine_locals.dart
+++ b/tests/compiler/dart2js/inference/data/refine_locals.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
refineToClass();
diff --git a/tests/compiler/dart2js/inference/data/refine_order.dart b/tests/compiler/dart2js/inference/data/refine_order.dart
index 1a0b93e..cef03af 100644
--- a/tests/compiler/dart2js/inference/data/refine_order.dart
+++ b/tests/compiler/dart2js/inference/data/refine_order.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: Class.:[exact=Class]*/
class Class {
/*member: Class.field:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/return.dart b/tests/compiler/dart2js/inference/data/return.dart
index 01a574f..72bef6f 100644
--- a/tests/compiler/dart2js/inference/data/return.dart
+++ b/tests/compiler/dart2js/inference/data/return.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
return null;
diff --git a/tests/compiler/dart2js/inference/data/simple.dart b/tests/compiler/dart2js/inference/data/simple.dart
index ada01a1..0fc4b6f 100644
--- a/tests/compiler/dart2js/inference/data/simple.dart
+++ b/tests/compiler/dart2js/inference/data/simple.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
zero();
diff --git a/tests/compiler/dart2js/inference/data/static.dart b/tests/compiler/dart2js/inference/data/static.dart
index e3edc37..f641d1a 100644
--- a/tests/compiler/dart2js/inference/data/static.dart
+++ b/tests/compiler/dart2js/inference/data/static.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
simpleStaticCall();
diff --git a/tests/compiler/dart2js/inference/data/static_get.dart b/tests/compiler/dart2js/inference/data/static_get.dart
index 0a3bf8a..4228594 100644
--- a/tests/compiler/dart2js/inference/data/static_get.dart
+++ b/tests/compiler/dart2js/inference/data/static_get.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
getTopLevelFieldUninitialized();
diff --git a/tests/compiler/dart2js/inference/data/static_set.dart b/tests/compiler/dart2js/inference/data/static_set.dart
index 80c95eb..f585a7a 100644
--- a/tests/compiler/dart2js/inference/data/static_set.dart
+++ b/tests/compiler/dart2js/inference/data/static_set.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
setTopLevelFieldUninitialized();
diff --git a/tests/compiler/dart2js/inference/data/static_type.dart b/tests/compiler/dart2js/inference/data/static_type.dart
index d9b0e0b..3e698f1 100644
--- a/tests/compiler/dart2js/inference/data/static_type.dart
+++ b/tests/compiler/dart2js/inference/data/static_type.dart
@@ -2,6 +2,8 @@
// 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.7
+
class C<T> {
/*member: C.field:Union([exact=JSString], [exact=JSUInt31])*/
final T field;
@@ -237,19 +239,19 @@
/*member: fixedFieldInvoke:[null|subclass=JSInt]*/
fixedFieldInvoke() {
C<int> c = new C<int>(0);
- return c. /*invoke: [exact=C]*/ fixedFunctionField();
+ return c.fixedFunctionField /*invoke: [exact=C]*/ ();
}
/*member: fieldInvoke1:[null|subclass=JSInt]*/
fieldInvoke1() {
C<int> c = new C<int>(0);
- return c. /*invoke: [exact=C]*/ functionField();
+ return c.functionField /*invoke: [exact=C]*/ ();
}
/*member: fieldInvoke2:[null|exact=JSString]*/
fieldInvoke2() {
C<String> c = new C<String>('');
- return c. /*invoke: [exact=C]*/ functionField();
+ return c.functionField /*invoke: [exact=C]*/ ();
}
/*member: methodInvoke1:[exact=JSUInt31]*/
@@ -279,7 +281,7 @@
/*member: fixedGetterInvoke:[null|subclass=JSInt]*/
fixedGetterInvoke() {
C<int> c = new C<int>(0);
- return c. /*invoke: [exact=C]*/ fixedFunctionGetter();
+ return c.fixedFunctionGetter /*invoke: [exact=C]*/ ();
}
/*member: getterAccess1:[exact=JSUInt31]*/
@@ -297,25 +299,25 @@
/*member: getterInvoke1:[null|subclass=JSInt]*/
getterInvoke1() {
C<int> c = new C<int>(0);
- return c. /*invoke: [exact=C]*/ functionGetter();
+ return c.functionGetter /*invoke: [exact=C]*/ ();
}
/*member: getterInvoke2:[null|exact=JSString]*/
getterInvoke2() {
C<String> c = new C<String>('');
- return c. /*invoke: [exact=C]*/ functionGetter();
+ return c.functionGetter /*invoke: [exact=C]*/ ();
}
/*member: genericFieldInvoke1:[null|exact=JSString]*/
genericFieldInvoke1() {
C<int> c = new C<int>(0);
- return c. /*invoke: [exact=C]*/ genericFunctionField('');
+ return c.genericFunctionField /*invoke: [exact=C]*/ ('');
}
/*member: genericFieldInvoke2:[null|subclass=JSInt]*/
genericFieldInvoke2() {
C<String> c = new C<String>('');
- return c. /*invoke: [exact=C]*/ genericFunctionField(0);
+ return c.genericFunctionField /*invoke: [exact=C]*/ (0);
}
/*member: genericMethodInvoke1:[exact=JSString]*/
@@ -333,11 +335,11 @@
/*member: genericGetterInvoke1:[null|exact=JSString]*/
genericGetterInvoke1() {
C<int> c = new C<int>(0);
- return c. /*invoke: [exact=C]*/ genericFunctionGetter('');
+ return c.genericFunctionGetter /*invoke: [exact=C]*/ ('');
}
/*member: genericGetterInvoke2:[null|subclass=JSInt]*/
genericGetterInvoke2() {
C<String> c = new C<String>('');
- return c. /*invoke: [exact=C]*/ genericFunctionGetter(0);
+ return c.genericFunctionGetter /*invoke: [exact=C]*/ (0);
}
diff --git a/tests/compiler/dart2js/inference/data/super_get.dart b/tests/compiler/dart2js/inference/data/super_get.dart
index 680d080..ed04287 100644
--- a/tests/compiler/dart2js/inference/data/super_get.dart
+++ b/tests/compiler/dart2js/inference/data/super_get.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
superFieldAccess();
diff --git a/tests/compiler/dart2js/inference/data/super_invoke.dart b/tests/compiler/dart2js/inference/data/super_invoke.dart
index 8392f1d..9521e0b 100644
--- a/tests/compiler/dart2js/inference/data/super_invoke.dart
+++ b/tests/compiler/dart2js/inference/data/super_invoke.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
superMethodInvoke();
diff --git a/tests/compiler/dart2js/inference/data/super_set.dart b/tests/compiler/dart2js/inference/data/super_set.dart
index 1365c01..ffa6c73 100644
--- a/tests/compiler/dart2js/inference/data/super_set.dart
+++ b/tests/compiler/dart2js/inference/data/super_set.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
superFieldUpdate();
diff --git a/tests/compiler/dart2js/inference/data/switch.dart b/tests/compiler/dart2js/inference/data/switch.dart
index 83468c6..df79306 100644
--- a/tests/compiler/dart2js/inference/data/switch.dart
+++ b/tests/compiler/dart2js/inference/data/switch.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
switchWithoutDefault();
diff --git a/tests/compiler/dart2js/inference/data/switch1.dart b/tests/compiler/dart2js/inference/data/switch1.dart
index a9f9e32..3d5f76d 100644
--- a/tests/compiler/dart2js/inference/data/switch1.dart
+++ b/tests/compiler/dart2js/inference/data/switch1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: foo:[exact=JSString]*/
foo(int /*[subclass=JSInt]*/ x) {
var a = "one";
diff --git a/tests/compiler/dart2js/inference/data/switch2.dart b/tests/compiler/dart2js/inference/data/switch2.dart
index c2aaa71..7783107 100644
--- a/tests/compiler/dart2js/inference/data/switch2.dart
+++ b/tests/compiler/dart2js/inference/data/switch2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: foo:Value([null|exact=JSString], value: "two")*/
foo(int /*[subclass=JSInt]*/ x) {
var a;
diff --git a/tests/compiler/dart2js/inference/data/switch5.dart b/tests/compiler/dart2js/inference/data/switch5.dart
index 3263b55..666a285 100644
--- a/tests/compiler/dart2js/inference/data/switch5.dart
+++ b/tests/compiler/dart2js/inference/data/switch5.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: foo:[null|exact=JSUInt31]*/
foo(int /*[subclass=JSInt]*/ x) {
var a;
diff --git a/tests/compiler/dart2js/inference/data/switch6.dart b/tests/compiler/dart2js/inference/data/switch6.dart
index 2155d6f..cb2f0ae 100644
--- a/tests/compiler/dart2js/inference/data/switch6.dart
+++ b/tests/compiler/dart2js/inference/data/switch6.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: foo:[null|exact=JSUInt31]*/
foo(int /*[subclass=JSInt]*/ x) {
var a;
diff --git a/tests/compiler/dart2js/inference/data/throw.dart b/tests/compiler/dart2js/inference/data/throw.dart
index e844463..b40e3d8 100644
--- a/tests/compiler/dart2js/inference/data/throw.dart
+++ b/tests/compiler/dart2js/inference/data/throw.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
unconditionalThrow();
diff --git a/tests/compiler/dart2js/inference/data/try.dart b/tests/compiler/dart2js/inference/data/try.dart
index 2668f73..5f43edf 100644
--- a/tests/compiler/dart2js/inference/data/try.dart
+++ b/tests/compiler/dart2js/inference/data/try.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
emptyTryCatch();
diff --git a/tests/compiler/dart2js/inference/data/try_catch.dart b/tests/compiler/dart2js/inference/data/try_catch.dart
index 9dfe310..0a41400 100644
--- a/tests/compiler/dart2js/inference/data/try_catch.dart
+++ b/tests/compiler/dart2js/inference/data/try_catch.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: returnInt1:[exact=JSUInt31]*/
returnInt1() {
var a = 42;
diff --git a/tests/compiler/dart2js/inference/data/type_literal.dart b/tests/compiler/dart2js/inference/data/type_literal.dart
index 48f1ce8..ab67c1c 100644
--- a/tests/compiler/dart2js/inference/data/type_literal.dart
+++ b/tests/compiler/dart2js/inference/data/type_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
typeLiteral();
diff --git a/tests/compiler/dart2js/inference/data/unregister_call.dart b/tests/compiler/dart2js/inference/data/unregister_call.dart
index b07989b..00bbbed 100644
--- a/tests/compiler/dart2js/inference/data/unregister_call.dart
+++ b/tests/compiler/dart2js/inference/data/unregister_call.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: a:Value([exact=JSString], value: "")*/
var a = '';
diff --git a/tests/compiler/dart2js/inference/data/use_static_types.dart b/tests/compiler/dart2js/inference/data/use_static_types.dart
index f701b6d..2011369 100644
--- a/tests/compiler/dart2js/inference/data/use_static_types.dart
+++ b/tests/compiler/dart2js/inference/data/use_static_types.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: A.:[exact=A]*/
class A {}
@@ -224,29 +226,29 @@
/*member: invokeFunctionTypedInstanceGetter1:[null|subclass=A]*/
invokeFunctionTypedInstanceGetter1(
GenericClass<A> /*[exact=GenericClass]*/ c) =>
- c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
+ c.functionTypedGetter /*invoke: [exact=GenericClass]*/ ();
/*member: invokeFunctionTypedInstanceGetter2:[null|exact=B]*/
invokeFunctionTypedInstanceGetter2(
GenericClass<B> /*[exact=GenericClass]*/ c) =>
- c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
+ c.functionTypedGetter /*invoke: [exact=GenericClass]*/ ();
/*member: invokeFunctionTypedInstanceGetter3:[null|exact=C]*/
invokeFunctionTypedInstanceGetter3(
GenericClass<C> /*[exact=GenericClass]*/ c) =>
- c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
+ c.functionTypedGetter /*invoke: [exact=GenericClass]*/ ();
/*member: invokeFunctionTypedInstanceField1:[null|subclass=A]*/
invokeFunctionTypedInstanceField1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
- c. /*invoke: [exact=GenericClass]*/ functionTypedField();
+ c.functionTypedField /*invoke: [exact=GenericClass]*/ ();
/*member: invokeFunctionTypedInstanceField2:[null|exact=B]*/
invokeFunctionTypedInstanceField2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
- c. /*invoke: [exact=GenericClass]*/ functionTypedField();
+ c.functionTypedField /*invoke: [exact=GenericClass]*/ ();
/*member: invokeFunctionTypedInstanceField3:[null|exact=C]*/
invokeFunctionTypedInstanceField3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
- c. /*invoke: [exact=GenericClass]*/ functionTypedField();
+ c.functionTypedField /*invoke: [exact=GenericClass]*/ ();
/*member: invokeFunctionTypedSuperMethod1:[null|subclass=Object]*/
invokeFunctionTypedSuperMethod1(
diff --git a/tests/compiler/dart2js/inference/data/while.dart b/tests/compiler/dart2js/inference/data/while.dart
index 73b214e..9fe86ef 100644
--- a/tests/compiler/dart2js/inference/data/while.dart
+++ b/tests/compiler/dart2js/inference/data/while.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
simpleWhile();
diff --git a/tests/compiler/dart2js/inference/data/yield.dart b/tests/compiler/dart2js/inference/data/yield.dart
index 3f89f21..0575c7a 100644
--- a/tests/compiler/dart2js/inference/data/yield.dart
+++ b/tests/compiler/dart2js/inference/data/yield.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[null]*/
main() {
yieldZero();
diff --git a/tests/compiler/dart2js/inference/inference0_test.dart b/tests/compiler/dart2js/inference/inference0_test.dart
index 3f3ae82..7871c11 100644
--- a/tests/compiler/dart2js/inference/inference0_test.dart
+++ b/tests/compiler/dart2js/inference/inference0_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'inference_test_helper.dart';
main(List<String> args) {
diff --git a/tests/compiler/dart2js/inference/inference1_test.dart b/tests/compiler/dart2js/inference/inference1_test.dart
index ba475ac..7da4878 100644
--- a/tests/compiler/dart2js/inference/inference1_test.dart
+++ b/tests/compiler/dart2js/inference/inference1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'inference_test_helper.dart';
main(List<String> args) {
diff --git a/tests/compiler/dart2js/inference/inference2_test.dart b/tests/compiler/dart2js/inference/inference2_test.dart
index 68b3c20..2f38c10 100644
--- a/tests/compiler/dart2js/inference/inference2_test.dart
+++ b/tests/compiler/dart2js/inference/inference2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'inference_test_helper.dart';
main(List<String> args) {
diff --git a/tests/compiler/dart2js/inference/inference3_test.dart b/tests/compiler/dart2js/inference/inference3_test.dart
index 6161412..596df54 100644
--- a/tests/compiler/dart2js/inference/inference3_test.dart
+++ b/tests/compiler/dart2js/inference/inference3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'inference_test_helper.dart';
main(List<String> args) {
diff --git a/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart b/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
index 884773e..7c98ca6 100644
--- a/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
+++ b/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
staticCalledInForLoop();
staticCalledInForInLoop();
diff --git a/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart b/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
index 9c516ba..51862bd 100644
--- a/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
+++ b/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
noThrows();
noInline();
diff --git a/tests/compiler/dart2js/inference/inference_data/function_apply.dart b/tests/compiler/dart2js/inference/inference_data/function_apply.dart
index a74ae06..a253f10 100644
--- a/tests/compiler/dart2js/inference/inference_data/function_apply.dart
+++ b/tests/compiler/dart2js/inference/inference_data/function_apply.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
directCall();
indirectCall();
diff --git a/tests/compiler/dart2js/inference/inference_data_test.dart b/tests/compiler/dart2js/inference/inference_data_test.dart
index e89e33e..48392cd 100644
--- a/tests/compiler/dart2js/inference/inference_data_test.dart
+++ b/tests/compiler/dart2js/inference/inference_data_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index d0b6caa..5e70947 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/inference/list_tracer_test.dart b/tests/compiler/dart2js/inference/list_tracer_test.dart
index 9377f4b..f63d8c1 100644
--- a/tests/compiler/dart2js/inference/list_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/inference/load_deferred_library_test.dart b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
index 716d334..aad3724 100644
--- a/tests/compiler/dart2js/inference/load_deferred_library_test.dart
+++ b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/inference/map_tracer_test.dart b/tests/compiler/dart2js/inference/map_tracer_test.dart
index 7e2b849..77f899e 100644
--- a/tests/compiler/dart2js/inference/map_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/map_tracer_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/entities.dart';
diff --git a/tests/compiler/dart2js/inference/show.dart b/tests/compiler/dart2js/inference/show.dart
index 725f6dc..d0ab85f 100644
--- a/tests/compiler/dart2js/inference/show.dart
+++ b/tests/compiler/dart2js/inference/show.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Helper program that shows the inferrer data on a dart program.
import 'package:args/args.dart';
diff --git a/tests/compiler/dart2js/inference/side_effects/annotations.dart b/tests/compiler/dart2js/inference/side_effects/annotations.dart
index a7d5f65..293ccdc 100644
--- a/tests/compiler/dart2js/inference/side_effects/annotations.dart
+++ b/tests/compiler/dart2js/inference/side_effects/annotations.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Static field used in tests below.
var field;
diff --git a/tests/compiler/dart2js/inference/side_effects/foreign.dart b/tests/compiler/dart2js/inference/side_effects/foreign.dart
index ab10b35..d73e3a4 100644
--- a/tests/compiler/dart2js/inference/side_effects/foreign.dart
+++ b/tests/compiler/dart2js/inference/side_effects/foreign.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// ignore: IMPORT_INTERNAL_LIBRARY
import 'dart:_foreign_helper';
diff --git a/tests/compiler/dart2js/inference/side_effects/local_functions.dart b/tests/compiler/dart2js/inference/side_effects/local_functions.dart
index b6a53a0..01ff04a 100644
--- a/tests/compiler/dart2js/inference/side_effects/local_functions.dart
+++ b/tests/compiler/dart2js/inference/side_effects/local_functions.dart
@@ -2,6 +2,8 @@
// 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.7
+
var field;
/*member: anonymousClosureUnused:SideEffects(reads nothing; writes nothing)*/
diff --git a/tests/compiler/dart2js/inference/side_effects/methods.dart b/tests/compiler/dart2js/inference/side_effects/methods.dart
index 99a0278..c1e33a7 100644
--- a/tests/compiler/dart2js/inference/side_effects/methods.dart
+++ b/tests/compiler/dart2js/inference/side_effects/methods.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Static field used in tests below.
var field;
diff --git a/tests/compiler/dart2js/inference/side_effects/out_of_order.dart b/tests/compiler/dart2js/inference/side_effects/out_of_order.dart
index c8501e3..58f4f3d 100644
--- a/tests/compiler/dart2js/inference/side_effects/out_of_order.dart
+++ b/tests/compiler/dart2js/inference/side_effects/out_of_order.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test the capability of the side effects computation based on
// [SideEffectsBuilder].
//
diff --git a/tests/compiler/dart2js/inference/side_effects/string_interpolation.dart b/tests/compiler/dart2js/inference/side_effects/string_interpolation.dart
index e85be1f..444f3f1 100644
--- a/tests/compiler/dart2js/inference/side_effects/string_interpolation.dart
+++ b/tests/compiler/dart2js/inference/side_effects/string_interpolation.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: stringInterpolation:SideEffects(reads nothing; writes anything)*/
stringInterpolation() => '${null}';
diff --git a/tests/compiler/dart2js/inference/side_effects_test.dart b/tests/compiler/dart2js/inference/side_effects_test.dart
index 09f0bb4..f6b92f1 100644
--- a/tests/compiler/dart2js/inference/side_effects_test.dart
+++ b/tests/compiler/dart2js/inference/side_effects_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart b/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart
index 6a8f389..6929dfd 100644
--- a/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart
+++ b/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:args/args.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/inference/type_combination_test.dart b/tests/compiler/dart2js/inference/type_combination_test.dart
index cc65647..e7f96a5 100644
--- a/tests/compiler/dart2js/inference/type_combination_test.dart
+++ b/tests/compiler/dart2js/inference/type_combination_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/inference/type_mask2_test.dart b/tests/compiler/dart2js/inference/type_mask2_test.dart
index ac8afe8..c4d5bef 100644
--- a/tests/compiler/dart2js/inference/type_mask2_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library type_mask2_test;
import 'dart:async';
diff --git a/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart b/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
index ab1ab7a..13732c5 100644
--- a/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/inference/type_mask_test.dart b/tests/compiler/dart2js/inference/type_mask_test.dart
index 53e6077..d11d26d 100644
--- a/tests/compiler/dart2js/inference/type_mask_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/inference/type_mask_test_helper.dart b/tests/compiler/dart2js/inference/type_mask_test_helper.dart
index 6da6a0d..3225032 100644
--- a/tests/compiler/dart2js/inference/type_mask_test_helper.dart
+++ b/tests/compiler/dart2js/inference/type_mask_test_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
library type_mask_test_helper;
import 'package:compiler/src/inferrer/typemasks/masks.dart';
diff --git a/tests/compiler/dart2js/inference/union_type_test.dart b/tests/compiler/dart2js/inference/union_type_test.dart
index e938293..83e86fd 100644
--- a/tests/compiler/dart2js/inference/union_type_test.dart
+++ b/tests/compiler/dart2js/inference/union_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
import 'package:compiler/src/inferrer/typemasks/masks.dart';
diff --git a/tests/compiler/dart2js/inlining/data/conditional.dart b/tests/compiler/dart2js/inlining/data/conditional.dart
index c19404f..1e08d9c 100644
--- a/tests/compiler/dart2js/inlining/data/conditional.dart
+++ b/tests/compiler/dart2js/inlining/data/conditional.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Tests for the heuristics on conditional expression whose condition is a
// parameter for which the max, instead of the sum, of the branch sizes is used.
diff --git a/tests/compiler/dart2js/inlining/data/constructor.dart b/tests/compiler/dart2js/inlining/data/constructor.dart
index d60a569..f9e0070 100644
--- a/tests/compiler/dart2js/inlining/data/constructor.dart
+++ b/tests/compiler/dart2js/inlining/data/constructor.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
forceInlineConstructor();
diff --git a/tests/compiler/dart2js/inlining/data/dynamic.dart b/tests/compiler/dart2js/inlining/data/dynamic.dart
index 0810edd..c3b0eff 100644
--- a/tests/compiler/dart2js/inlining/data/dynamic.dart
+++ b/tests/compiler/dart2js/inlining/data/dynamic.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
forceInlineDynamic();
diff --git a/tests/compiler/dart2js/inlining/data/external.dart b/tests/compiler/dart2js/inlining/data/external.dart
index e943165..b144d42 100644
--- a/tests/compiler/dart2js/inlining/data/external.dart
+++ b/tests/compiler/dart2js/inlining/data/external.dart
@@ -2,6 +2,8 @@
// 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.7
+
@JS()
library lib;
diff --git a/tests/compiler/dart2js/inlining/data/force_inline.dart b/tests/compiler/dart2js/inlining/data/force_inline.dart
index 4bc1627..3e83f54 100644
--- a/tests/compiler/dart2js/inlining/data/force_inline.dart
+++ b/tests/compiler/dart2js/inlining/data/force_inline.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
forceInlineOnce();
diff --git a/tests/compiler/dart2js/inlining/data/force_inline_loops.dart b/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
index c9c09a7..9c21b25 100644
--- a/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
+++ b/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
forceInlineLoops();
diff --git a/tests/compiler/dart2js/inlining/data/heuristics.dart b/tests/compiler/dart2js/inlining/data/heuristics.dart
index d9f0c2c..c4a30d8 100644
--- a/tests/compiler/dart2js/inlining/data/heuristics.dart
+++ b/tests/compiler/dart2js/inlining/data/heuristics.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
outsideLoopNoArgsCalledOnce();
diff --git a/tests/compiler/dart2js/inlining/data/map.dart b/tests/compiler/dart2js/inlining/data/map.dart
index 9063caa..4187816 100644
--- a/tests/compiler/dart2js/inlining/data/map.dart
+++ b/tests/compiler/dart2js/inlining/data/map.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
passMapToNull();
diff --git a/tests/compiler/dart2js/inlining/data/meta.dart b/tests/compiler/dart2js/inlining/data/meta.dart
index fe47d1d..ee65e0d 100644
--- a/tests/compiler/dart2js/inlining/data/meta.dart
+++ b/tests/compiler/dart2js/inlining/data/meta.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
tryInlineOnce();
diff --git a/tests/compiler/dart2js/inlining/data/native.dart b/tests/compiler/dart2js/inlining/data/native.dart
index 8b4c1cff..761e40d 100644
--- a/tests/compiler/dart2js/inlining/data/native.dart
+++ b/tests/compiler/dart2js/inlining/data/native.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:html';
/*member: main:[]*/
diff --git a/tests/compiler/dart2js/inlining/data/nested.dart b/tests/compiler/dart2js/inlining/data/nested.dart
index 0c98ef2..e735510 100644
--- a/tests/compiler/dart2js/inlining/data/nested.dart
+++ b/tests/compiler/dart2js/inlining/data/nested.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
nestedGenericInlining();
diff --git a/tests/compiler/dart2js/inlining/data/setter.dart b/tests/compiler/dart2js/inlining/data/setter.dart
index 2c255fba..fa56868 100644
--- a/tests/compiler/dart2js/inlining/data/setter.dart
+++ b/tests/compiler/dart2js/inlining/data/setter.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
inlineSetter();
diff --git a/tests/compiler/dart2js/inlining/data/static_initializer.dart b/tests/compiler/dart2js/inlining/data/static_initializer.dart
index 9c812c3..91880ca 100644
--- a/tests/compiler/dart2js/inlining/data/static_initializer.dart
+++ b/tests/compiler/dart2js/inlining/data/static_initializer.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
_var1;
diff --git a/tests/compiler/dart2js/inlining/data/switch.dart b/tests/compiler/dart2js/inlining/data/switch.dart
index 37a0c3d..ab91910 100644
--- a/tests/compiler/dart2js/inlining/data/switch.dart
+++ b/tests/compiler/dart2js/inlining/data/switch.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
switchThrowing();
diff --git a/tests/compiler/dart2js/inlining/data/too_difficult.dart b/tests/compiler/dart2js/inlining/data/too_difficult.dart
index b545095..013d844 100644
--- a/tests/compiler/dart2js/inlining/data/too_difficult.dart
+++ b/tests/compiler/dart2js/inlining/data/too_difficult.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
asyncMethod();
diff --git a/tests/compiler/dart2js/inlining/data/type_variables.dart b/tests/compiler/dart2js/inlining/data/type_variables.dart
index 93c0c21..14a1ce3 100644
--- a/tests/compiler/dart2js/inlining/data/type_variables.dart
+++ b/tests/compiler/dart2js/inlining/data/type_variables.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: main:[]*/
main() {
inlineTypeTests();
diff --git a/tests/compiler/dart2js/inlining/inlining_test.dart b/tests/compiler/dart2js/inlining/inlining_test.dart
index bb4dcd2..717045f 100644
--- a/tests/compiler/dart2js/inlining/inlining_test.dart
+++ b/tests/compiler/dart2js/inlining/inlining_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/inlining/inlining_viewer.dart b/tests/compiler/dart2js/inlining/inlining_viewer.dart
index 902deaf..8fdcb62 100644
--- a/tests/compiler/dart2js/inlining/inlining_viewer.dart
+++ b/tests/compiler/dart2js/inlining/inlining_viewer.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Helper program that shows the inlining data on a dart program.
import '../equivalence/show_helper.dart';
diff --git a/tests/compiler/dart2js/inlining/meta_annotations2_test.dart b/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
index d809601..8c3d0da 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Functional test of 'noInline' annotation from package:meta/dart2js.dart.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/inlining/meta_annotations3_test.dart b/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
index ca5024a..ad71d47 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Functional test of 'tryInline' annotation from package:meta/dart2js.dart.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/inlining/meta_annotations_test.dart b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
index 074e384..4d59a1d 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/js/js_constant_test.dart b/tests/compiler/dart2js/js/js_constant_test.dart
index 6d0613e..872c58b 100644
--- a/tests/compiler/dart2js/js/js_constant_test.dart
+++ b/tests/compiler/dart2js/js/js_constant_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/js/js_parser_statements_test.dart b/tests/compiler/dart2js/js/js_parser_statements_test.dart
index cc8c378..195b38b 100644
--- a/tests/compiler/dart2js/js/js_parser_statements_test.dart
+++ b/tests/compiler/dart2js/js/js_parser_statements_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:compiler/src/js/js.dart' as jsAst;
import 'package:compiler/src/js/js.dart' show js;
diff --git a/tests/compiler/dart2js/js/js_parser_test.dart b/tests/compiler/dart2js/js/js_parser_test.dart
index 8c82b34..7e7ac3f 100644
--- a/tests/compiler/dart2js/js/js_parser_test.dart
+++ b/tests/compiler/dart2js/js/js_parser_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:compiler/src/js/js.dart' as jsAst;
import 'package:compiler/src/js/js.dart' show js;
diff --git a/tests/compiler/dart2js/js/js_safety_test.dart b/tests/compiler/dart2js/js/js_safety_test.dart
index 9a2df54..8620bec 100644
--- a/tests/compiler/dart2js/js/js_safety_test.dart
+++ b/tests/compiler/dart2js/js/js_safety_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:compiler/src/js/js.dart' as js;
import 'package:compiler/src/js/placeholder_safety.dart';
diff --git a/tests/compiler/dart2js/js/js_spec_optimization_test.dart b/tests/compiler/dart2js/js/js_spec_optimization_test.dart
index 004030c..c7c928d 100644
--- a/tests/compiler/dart2js/js/js_spec_optimization_test.dart
+++ b/tests/compiler/dart2js/js/js_spec_optimization_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/js/js_spec_string_test.dart b/tests/compiler/dart2js/js/js_spec_string_test.dart
index a3245e4..8332491 100644
--- a/tests/compiler/dart2js/js/js_spec_string_test.dart
+++ b/tests/compiler/dart2js/js/js_spec_string_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Unit test of the [NativeBehavior.processSpecString] method.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/js/js_throw_behavior_test.dart b/tests/compiler/dart2js/js/js_throw_behavior_test.dart
index 0c3ecea..21872e1 100644
--- a/tests/compiler/dart2js/js/js_throw_behavior_test.dart
+++ b/tests/compiler/dart2js/js/js_throw_behavior_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:compiler/src/native/behavior.dart';
import 'package:compiler/src/native/js.dart';
diff --git a/tests/compiler/dart2js/jsinterop/declaration_test.dart b/tests/compiler/dart2js/jsinterop/declaration_test.dart
index 6c94aab..72c7d23 100644
--- a/tests/compiler/dart2js/jsinterop/declaration_test.dart
+++ b/tests/compiler/dart2js/jsinterop/declaration_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library jsinterop.abstract_test;
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart b/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
index 62512f6..ded9c90 100644
--- a/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
+++ b/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library tests.dart2js.interop_anonymous_unreachable_test;
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index d1626de..bc495ac 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library jsinterop.world_test;
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/jumps/data/complex_loops.dart b/tests/compiler/dart2js/jumps/data/complex_loops.dart
index d5f73e2..7c43054 100644
--- a/tests/compiler/dart2js/jumps/data/complex_loops.dart
+++ b/tests/compiler/dart2js/jumps/data/complex_loops.dart
@@ -2,6 +2,8 @@
// 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.7
+
simpleForInLoopWithContinue(list) {
/*0@continue*/ for (int i in list) {
if (i % 2 == 0) /*target=0*/ continue;
diff --git a/tests/compiler/dart2js/jumps/data/labeled_statements.dart b/tests/compiler/dart2js/jumps/data/labeled_statements.dart
index 0d430c7..465060d 100644
--- a/tests/compiler/dart2js/jumps/data/labeled_statements.dart
+++ b/tests/compiler/dart2js/jumps/data/labeled_statements.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
breakFromIf(true);
breakFromBlock(true);
diff --git a/tests/compiler/dart2js/jumps/data/nested_loops.dart b/tests/compiler/dart2js/jumps/data/nested_loops.dart
index 2b1783d..146de48 100644
--- a/tests/compiler/dart2js/jumps/data/nested_loops.dart
+++ b/tests/compiler/dart2js/jumps/data/nested_loops.dart
@@ -2,6 +2,8 @@
// 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.7
+
nestedForLoopWithBreakAndContinue(count) {
/*0@continue*/ for (int i = 0; i < count; i = i + 1) {
/*1@break*/ for (int j = 0; j < count; j = j + 1) {
diff --git a/tests/compiler/dart2js/jumps/data/simple_loops.dart b/tests/compiler/dart2js/jumps/data/simple_loops.dart
index 3e683ba..e77341b 100644
--- a/tests/compiler/dart2js/jumps/data/simple_loops.dart
+++ b/tests/compiler/dart2js/jumps/data/simple_loops.dart
@@ -2,6 +2,8 @@
// 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.7
+
simpleForLoop(count) {
for (int i = 0; i < count; i++) {
print(i);
diff --git a/tests/compiler/dart2js/jumps/data/switch.dart b/tests/compiler/dart2js/jumps/data/switch.dart
index ec716cd..7ea9ccb 100644
--- a/tests/compiler/dart2js/jumps/data/switch.dart
+++ b/tests/compiler/dart2js/jumps/data/switch.dart
@@ -2,6 +2,8 @@
// 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.7
+
void simpleSwitch(e) {
/*0@break*/ switch (e) {
case 0:
diff --git a/tests/compiler/dart2js/jumps/jump_test.dart b/tests/compiler/dart2js/jumps/jump_test.dart
index 5d3320a..35b67d1 100644
--- a/tests/compiler/dart2js/jumps/jump_test.dart
+++ b/tests/compiler/dart2js/jumps/jump_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common.dart';
diff --git a/tests/compiler/dart2js/member_usage/data/constant_folding.dart b/tests/compiler/dart2js/member_usage/data/constant_folding.dart
index 4c601de..89dd97f 100644
--- a/tests/compiler/dart2js/member_usage/data/constant_folding.dart
+++ b/tests/compiler/dart2js/member_usage/data/constant_folding.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Derived from dart2js_extra/constant_folding_test
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/member_usage/data/constructors.dart b/tests/compiler/dart2js/member_usage/data/constructors.dart
index 39d4566..e568cb2 100644
--- a/tests/compiler/dart2js/member_usage/data/constructors.dart
+++ b/tests/compiler/dart2js/member_usage/data/constructors.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
/*member: Class.constructor1:invoke*/
Class.constructor1() {}
diff --git a/tests/compiler/dart2js/member_usage/data/fields.dart b/tests/compiler/dart2js/member_usage/data/fields.dart
index 9bdacad..7ec7120 100644
--- a/tests/compiler/dart2js/member_usage/data/fields.dart
+++ b/tests/compiler/dart2js/member_usage/data/fields.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: field1a:init,read*/
var field1a;
diff --git a/tests/compiler/dart2js/member_usage/data/general.dart b/tests/compiler/dart2js/member_usage/data/general.dart
index 8e86d99..a8b6f61 100644
--- a/tests/compiler/dart2js/member_usage/data/general.dart
+++ b/tests/compiler/dart2js/member_usage/data/general.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: A.:invoke*/
class A {
/*member: A.method1:invoke*/
diff --git a/tests/compiler/dart2js/member_usage/data/generic.dart b/tests/compiler/dart2js/member_usage/data/generic.dart
index 7ae48a3..ebe650f 100644
--- a/tests/compiler/dart2js/member_usage/data/generic.dart
+++ b/tests/compiler/dart2js/member_usage/data/generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: Class.:invoke*/
class Class {
// The type parameter is never provided but needed nonetheless.
diff --git a/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart b/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart
index 0e9ad65..1f658fa 100644
--- a/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart
+++ b/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: Class.:invoke*/
class Class {
/*member: Class.method1:invoke*/
diff --git a/tests/compiler/dart2js/member_usage/data/native.dart b/tests/compiler/dart2js/member_usage/data/native.dart
index 691562b..b4a4875c 100644
--- a/tests/compiler/dart2js/member_usage/data/native.dart
+++ b/tests/compiler/dart2js/member_usage/data/native.dart
@@ -2,6 +2,8 @@
// 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.7
+
// ignore: import_internal_library
import 'dart:_js_helper';
diff --git a/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart b/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart
index 5548810..c5ab899 100644
--- a/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart
+++ b/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: method1:invoke*/
method1() {}
diff --git a/tests/compiler/dart2js/member_usage/data/super.dart b/tests/compiler/dart2js/member_usage/data/super.dart
index 50e3547..4ff349c 100644
--- a/tests/compiler/dart2js/member_usage/data/super.dart
+++ b/tests/compiler/dart2js/member_usage/data/super.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Super {
/*member: Super.field1:init,read=super*/
var field1;
diff --git a/tests/compiler/dart2js/member_usage/member_usage_test.dart b/tests/compiler/dart2js/member_usage/member_usage_test.dart
index 2e09a07..834cd14 100644
--- a/tests/compiler/dart2js/member_usage/member_usage_test.dart
+++ b/tests/compiler/dart2js/member_usage/member_usage_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/model/call_structure_namer_test.dart b/tests/compiler/dart2js/model/call_structure_namer_test.dart
index 4c1826a..4bc9a7b 100644
--- a/tests/compiler/dart2js/model/call_structure_namer_test.dart
+++ b/tests/compiler/dart2js/model/call_structure_namer_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/js_backend/namer.dart';
import 'package:compiler/src/universe/call_structure.dart';
diff --git a/tests/compiler/dart2js/model/cfe_annotations_test.dart b/tests/compiler/dart2js/model/cfe_annotations_test.dart
index c82f0c5..2dde603 100644
--- a/tests/compiler/dart2js/model/cfe_annotations_test.dart
+++ b/tests/compiler/dart2js/model/cfe_annotations_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:args/args.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart b/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
index eddb490..a3c182f 100644
--- a/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
+++ b/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library dart2js.constants.expressions.evaluate_test;
import 'dart:async';
diff --git a/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart b/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart
index 5a8997b..474766e 100644
--- a/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart
+++ b/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:args/args.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/model/cfe_constant_test.dart b/tests/compiler/dart2js/model/cfe_constant_test.dart
index 3430988..ab872b3 100644
--- a/tests/compiler/dart2js/model/cfe_constant_test.dart
+++ b/tests/compiler/dart2js/model/cfe_constant_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index ea78222..d884344 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test for iterators on for [SubclassNode].
library class_set_test;
diff --git a/tests/compiler/dart2js/model/constant_value_test.dart b/tests/compiler/dart2js/model/constant_value_test.dart
index aebfbb3..9822945 100644
--- a/tests/compiler/dart2js/model/constant_value_test.dart
+++ b/tests/compiler/dart2js/model/constant_value_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library dart2js.constants.values.test;
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/model/enqueuer_test.dart b/tests/compiler/dart2js/model/enqueuer_test.dart
index 99f5f4d..797896c 100644
--- a/tests/compiler/dart2js/model/enqueuer_test.dart
+++ b/tests/compiler/dart2js/model/enqueuer_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the enqueuers are not dependent upon in which order impacts are
// applied.
diff --git a/tests/compiler/dart2js/model/enumset_test.dart b/tests/compiler/dart2js/model/enumset_test.dart
index 92ab39c..1664113 100644
--- a/tests/compiler/dart2js/model/enumset_test.dart
+++ b/tests/compiler/dart2js/model/enumset_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library enumset.test;
import 'package:compiler/src/util/enumset.dart';
diff --git a/tests/compiler/dart2js/model/forwarding_stub_test.dart b/tests/compiler/dart2js/model/forwarding_stub_test.dart
index 1784cf3..0035c58 100644
--- a/tests/compiler/dart2js/model/forwarding_stub_test.dart
+++ b/tests/compiler/dart2js/model/forwarding_stub_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/future_or_test.dart b/tests/compiler/dart2js/model/future_or_test.dart
index 9dc81d5..87d52be 100644
--- a/tests/compiler/dart2js/model/future_or_test.dart
+++ b/tests/compiler/dart2js/model/future_or_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/model/in_user_code_test.dart b/tests/compiler/dart2js/model/in_user_code_test.dart
index 1e65ecb..81bee9c 100644
--- a/tests/compiler/dart2js/model/in_user_code_test.dart
+++ b/tests/compiler/dart2js/model/in_user_code_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the helper [Compiler.inUserCode] works as intended.
import 'dart:async';
diff --git a/tests/compiler/dart2js/model/indentation_test.dart b/tests/compiler/dart2js/model/indentation_test.dart
index 1730fd1..98a4f41 100644
--- a/tests/compiler/dart2js/model/indentation_test.dart
+++ b/tests/compiler/dart2js/model/indentation_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import 'package:compiler/src/util/util.dart' show Indentation;
diff --git a/tests/compiler/dart2js/model/instantiated_classes_test.dart b/tests/compiler/dart2js/model/instantiated_classes_test.dart
index 60cb1cc..610d9b1 100644
--- a/tests/compiler/dart2js/model/instantiated_classes_test.dart
+++ b/tests/compiler/dart2js/model/instantiated_classes_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library instantiated_classes_test;
import 'dart:async';
diff --git a/tests/compiler/dart2js/model/link_test.dart b/tests/compiler/dart2js/model/link_test.dart
index 9b2b00e..1854db3 100644
--- a/tests/compiler/dart2js/model/link_test.dart
+++ b/tests/compiler/dart2js/model/link_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:_fe_analyzer_shared/src/util/link.dart' show Link;
import "package:expect/expect.dart";
import '../helpers/link_helper.dart';
diff --git a/tests/compiler/dart2js/model/maplet_test.dart b/tests/compiler/dart2js/model/maplet_test.dart
index 687622e..1a6e66e 100644
--- a/tests/compiler/dart2js/model/maplet_test.dart
+++ b/tests/compiler/dart2js/model/maplet_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "package:compiler/src/util/maplet.dart";
diff --git a/tests/compiler/dart2js/model/mixin_typevariable_test.dart b/tests/compiler/dart2js/model/mixin_typevariable_test.dart
index 01c7a90..c2d4e4d 100644
--- a/tests/compiler/dart2js/model/mixin_typevariable_test.dart
+++ b/tests/compiler/dart2js/model/mixin_typevariable_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library mixin_typevariable_test;
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/model/native_test.dart b/tests/compiler/dart2js/model/native_test.dart
index b0b227a..fda3805 100644
--- a/tests/compiler/dart2js/model/native_test.dart
+++ b/tests/compiler/dart2js/model/native_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/model/needs_no_such_method_test.dart b/tests/compiler/dart2js/model/needs_no_such_method_test.dart
index 219d946..a9311a2 100644
--- a/tests/compiler/dart2js/model/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/model/needs_no_such_method_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/model/no_such_method_enabled_test.dart b/tests/compiler/dart2js/model/no_such_method_enabled_test.dart
index 7e45417..df08980 100644
--- a/tests/compiler/dart2js/model/no_such_method_enabled_test.dart
+++ b/tests/compiler/dart2js/model/no_such_method_enabled_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart b/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
index 27bece5..7535b2d 100644
--- a/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
+++ b/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/entities.dart';
diff --git a/tests/compiler/dart2js/model/open_world_test.dart b/tests/compiler/dart2js/model/open_world_test.dart
index 35e992d..49c37fb 100644
--- a/tests/compiler/dart2js/model/open_world_test.dart
+++ b/tests/compiler/dart2js/model/open_world_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/receiver_type_test.dart b/tests/compiler/dart2js/model/receiver_type_test.dart
index 3ad5042..d7567dc 100644
--- a/tests/compiler/dart2js/model/receiver_type_test.dart
+++ b/tests/compiler/dart2js/model/receiver_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart';
diff --git a/tests/compiler/dart2js/model/setlet_test.dart b/tests/compiler/dart2js/model/setlet_test.dart
index f27cbcb..a58f6ce 100644
--- a/tests/compiler/dart2js/model/setlet_test.dart
+++ b/tests/compiler/dart2js/model/setlet_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import 'dart:collection';
import 'package:compiler/src/util/setlet.dart';
diff --git a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
index a94eaad..6ee0535 100644
--- a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
+++ b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/strong_mode_impact_test.dart b/tests/compiler/dart2js/model/strong_mode_impact_test.dart
index 79fc030..bb7c914 100644
--- a/tests/compiler/dart2js/model/strong_mode_impact_test.dart
+++ b/tests/compiler/dart2js/model/strong_mode_impact_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common.dart';
diff --git a/tests/compiler/dart2js/model/subtype_test.dart b/tests/compiler/dart2js/model/subtype_test.dart
index 914d75a..f166770 100644
--- a/tests/compiler/dart2js/model/subtype_test.dart
+++ b/tests/compiler/dart2js/model/subtype_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library subtype_test;
import 'dart:async';
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index dda257b..f16f4c9 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test for iterators on for [SubclassNode].
library subtypeset_test;
diff --git a/tests/compiler/dart2js/model/supermixin_test.dart b/tests/compiler/dart2js/model/supermixin_test.dart
index fab668d..f1fed6e 100644
--- a/tests/compiler/dart2js/model/supermixin_test.dart
+++ b/tests/compiler/dart2js/model/supermixin_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/model/token_naming_test.dart b/tests/compiler/dart2js/model/token_naming_test.dart
index 03702d0..beb5f66 100644
--- a/tests/compiler/dart2js/model/token_naming_test.dart
+++ b/tests/compiler/dart2js/model/token_naming_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:compiler/src/js_backend/js_backend.dart" show TokenScope;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/model/type_substitution_test.dart b/tests/compiler/dart2js/model/type_substitution_test.dart
index 9c25617..d5db6b3 100644
--- a/tests/compiler/dart2js/model/type_substitution_test.dart
+++ b/tests/compiler/dart2js/model/type_substitution_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library type_substitution_test;
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/model/world_test.dart b/tests/compiler/dart2js/model/world_test.dart
index b2106a8..bf49a4f 100644
--- a/tests/compiler/dart2js/model/world_test.dart
+++ b/tests/compiler/dart2js/model/world_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library world_test;
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/optimization/data/arithmetic.dart b/tests/compiler/dart2js/optimization/data/arithmetic.dart
index cd984e6..bc1843b 100644
--- a/tests/compiler/dart2js/optimization/data/arithmetic.dart
+++ b/tests/compiler/dart2js/optimization/data/arithmetic.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
negate(1);
negateNum(1);
diff --git a/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart b/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart
index dad0dcc..71b6f09 100644
--- a/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart
+++ b/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test constant folding on numbers.
@pragma('dart2js:assumeDynamic')
diff --git a/tests/compiler/dart2js/optimization/data/bit.dart b/tests/compiler/dart2js/optimization/data/bit.dart
index 49364cf..fb42214 100644
--- a/tests/compiler/dart2js/optimization/data/bit.dart
+++ b/tests/compiler/dart2js/optimization/data/bit.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
bitNot(1);
bitNotNum(1);
diff --git a/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart b/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart
index 6e14bb9..55f7152 100644
--- a/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart
+++ b/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class Class1 {
diff --git a/tests/compiler/dart2js/optimization/data/field_get.dart b/tests/compiler/dart2js/optimization/data/field_get.dart
index 301efeb..eb78b81 100644
--- a/tests/compiler/dart2js/optimization/data/field_get.dart
+++ b/tests/compiler/dart2js/optimization/data/field_get.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
method1(new Class1a());
method2(new Class2a());
diff --git a/tests/compiler/dart2js/optimization/data/field_set.dart b/tests/compiler/dart2js/optimization/data/field_set.dart
index a7e1cbb..d21b818 100644
--- a/tests/compiler/dart2js/optimization/data/field_set.dart
+++ b/tests/compiler/dart2js/optimization/data/field_set.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
method1(new Class1a());
method2(new Class2a());
diff --git a/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart b/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
index 9b64132..865a2d0 100644
--- a/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
+++ b/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
@@ -2,6 +2,8 @@
// 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.7
+
abstract class AppView<T> {
T ctx;
}
diff --git a/tests/compiler/dart2js/optimization/data/index.dart b/tests/compiler/dart2js/optimization/data/index.dart
index a38b22c..7b95043 100644
--- a/tests/compiler/dart2js/optimization/data/index.dart
+++ b/tests/compiler/dart2js/optimization/data/index.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:collection';
/*member: dynamicIndex:Specializer=[!Index]*/
diff --git a/tests/compiler/dart2js/optimization/data/index_assign.dart b/tests/compiler/dart2js/optimization/data/index_assign.dart
index d2ac26d..45a88e4 100644
--- a/tests/compiler/dart2js/optimization/data/index_assign.dart
+++ b/tests/compiler/dart2js/optimization/data/index_assign.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: dynamicIndexAssign:Specializer=[!IndexAssign]*/
@pragma('dart2js:noInline')
dynamicIndexAssign(var list) {
diff --git a/tests/compiler/dart2js/optimization/data/modulo_remainder.dart b/tests/compiler/dart2js/optimization/data/modulo_remainder.dart
index d2d909cc..57da5b3 100644
--- a/tests/compiler/dart2js/optimization/data/modulo_remainder.dart
+++ b/tests/compiler/dart2js/optimization/data/modulo_remainder.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: mod1:Specializer=[Modulo]*/
@pragma('dart2js:noInline')
mod1(param) {
diff --git a/tests/compiler/dart2js/optimization/optimization_test.dart b/tests/compiler/dart2js/optimization/optimization_test.dart
index ed894c7..e2687f6 100644
--- a/tests/compiler/dart2js/optimization/optimization_test.dart
+++ b/tests/compiler/dart2js/optimization/optimization_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/rti/backend_type_helper_test.dart b/tests/compiler/dart2js/rti/backend_type_helper_test.dart
index 95dc812..53ec0ad 100644
--- a/tests/compiler/dart2js/rti/backend_type_helper_test.dart
+++ b/tests/compiler/dart2js/rti/backend_type_helper_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/rti/bound_check_test.dart b/tests/compiler/dart2js/rti/bound_check_test.dart
index b0729aa..ce5f817 100644
--- a/tests/compiler/dart2js/rti/bound_check_test.dart
+++ b/tests/compiler/dart2js/rti/bound_check_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import '../helpers/d8_helper.dart';
diff --git a/tests/compiler/dart2js/rti/data/as.dart b/tests/compiler/dart2js/rti/data/as.dart
index b84f239..1b2e5b5 100644
--- a/tests/compiler/dart2js/rti/data/as.dart
+++ b/tests/compiler/dart2js/rti/data/as.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Derived from dart2js_extra/generic_type_error_message_test.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/data/async_foreach.dart b/tests/compiler/dart2js/rti/data/async_foreach.dart
index b847743..22efbe0 100644
--- a/tests/compiler/dart2js/rti/data/async_foreach.dart
+++ b/tests/compiler/dart2js/rti/data/async_foreach.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
/*omit.class: Class:needsArgs*/
class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
index 4afe488..7c27624 100644
--- a/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
+++ b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
/*omit.class: Class:*/
class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/async_local.dart b/tests/compiler/dart2js/rti/data/async_local.dart
index 10f865a..14bd0d2 100644
--- a/tests/compiler/dart2js/rti/data/async_local.dart
+++ b/tests/compiler/dart2js/rti/data/async_local.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() async {
// With the `is dynamic Function(Object,StackTrace)` test in the async
// implementation the closure, with type `dynamic Function(dynamic, dynamic)`,
diff --git a/tests/compiler/dart2js/rti/data/async_local_nonasync.dart b/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
index b18d28a..e07c33e7 100644
--- a/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
+++ b/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
// If any method was `async`, this would have triggered the need for the
// signature on this closure. See the 'async_local.dart' test.
diff --git a/tests/compiler/dart2js/rti/data/async_local_typed.dart b/tests/compiler/dart2js/rti/data/async_local_typed.dart
index 5d4c863..5154e91 100644
--- a/tests/compiler/dart2js/rti/data/async_local_typed.dart
+++ b/tests/compiler/dart2js/rti/data/async_local_typed.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class:explicit=[Class<int>],needsArgs*/
/*omit.class: Class:*/
class Class<T> {}
diff --git a/tests/compiler/dart2js/rti/data/call_typed.dart b/tests/compiler/dart2js/rti/data/call_typed.dart
index 7de1bdc..720048e 100644
--- a/tests/compiler/dart2js/rti/data/call_typed.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class A {
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic.dart b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
index 6e7e075..3cf8ad8 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/closure.dart b/tests/compiler/dart2js/rti/data/closure.dart
index aeb2742..4804c14 100644
--- a/tests/compiler/dart2js/rti/data/closure.dart
+++ b/tests/compiler/dart2js/rti/data/closure.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*omit.class: A:needsArgs*/
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
class A<T> {
diff --git a/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
index ec6a531..6fd577d 100644
--- a/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*omit.class: A:*/
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
class A<T> {
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
index ec6a531..6fd577d 100644
--- a/tests/compiler/dart2js/rti/data/closure_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*omit.class: A:*/
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
class A<T> {
diff --git a/tests/compiler/dart2js/rti/data/dependency.dart b/tests/compiler/dart2js/rti/data/dependency.dart
index 8dac33c..4c2ff6f 100644
--- a/tests/compiler/dart2js/rti/data/dependency.dart
+++ b/tests/compiler/dart2js/rti/data/dependency.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A<T> {
m() => new B<T>();
}
diff --git a/tests/compiler/dart2js/rti/data/direct.dart b/tests/compiler/dart2js/rti/data/direct.dart
index f2069f6..e7a05cf 100644
--- a/tests/compiler/dart2js/rti/data/direct.dart
+++ b/tests/compiler/dart2js/rti/data/direct.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:explicit=[A<int>],needsArgs*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is.dart b/tests/compiler/dart2js/rti/data/dynamic_is.dart
index 3918c53..9edf610 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
/*member: A.instanceMethod:direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
instanceMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is2.dart b/tests/compiler/dart2js/rti/data/dynamic_is2.dart
index b9c6996..09f291b 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*omit.class: A:*/
/*strong.class: A:explicit=[A]*/
class A {
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is_closure.dart b/tests/compiler/dart2js/rti/data/dynamic_is_closure.dart
index 100e0b6..e224bf8 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is_closure.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is_closure.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
/*member: A.instanceMethod:direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
instanceMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart b/tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart
index 95b4516..26842e1 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
/*member: A.instanceMethod:deps=[local],direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
instanceMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not.dart b/tests/compiler/dart2js/rti/data/dynamic_not.dart
index 15e708a..b4db411 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
/*member: A.instanceMethod:*/
instanceMethod<T>(t) => t;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not2.dart b/tests/compiler/dart2js/rti/data/dynamic_not2.dart
index aa043a6..c8f9f6e 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: A:explicit=[A]*/
class A {
/*member: A.instanceMethod:deps=[B.instanceMethod]*/
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not_closure.dart b/tests/compiler/dart2js/rti/data/dynamic_not_closure.dart
index 9049c26..add82db 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not_closure.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not_closure.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
/*member: A.instanceMethod:*/
instanceMethod<T>(t) => t;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart b/tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart
index d06c360..e37987e 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
/*member: A.instanceMethod:deps=[local]*/
instanceMethod<T>(t) => t;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off.dart
index 191ab7a..d69f33e 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: staticMethod:direct,explicit=[staticMethod.T],needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
staticMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart
index b018072..af93d70 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: staticMethod:deps=[B.instanceMethod],direct,explicit=[staticMethod.T],needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
staticMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
index 807f356..74625dd 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*omit.class: A:*/
/*strong.class: A:explicit=[A]*/
class A {
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart
index 2f04620..a7a7b5e 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: staticMethod1:deps=[staticMethod2],direct,explicit=[staticMethod1.T],needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
staticMethod1<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_type_literal.dart b/tests/compiler/dart2js/rti/data/dynamic_type_literal.dart
index b13dccd..df04a74 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_type_literal.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_type_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
/*member: A.instanceMethod:exp,needsArgs,selectors=[Selector(call, instanceMethod, arity=0, types=1)]*/
instanceMethod<T>() => T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart b/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
index 2f0ab7a..7bf6ce1 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: A:explicit=[A]*/
class A {
/*member: A.instanceMethod:deps=[B.instanceMethod],exp,needsArgs,selectors=[Selector(call, instanceMethod, arity=0, types=1)]*/
diff --git a/tests/compiler/dart2js/rti/data/explicit_as.dart b/tests/compiler/dart2js/rti/data/explicit_as.dart
index a90140a..8bb7f30 100644
--- a/tests/compiler/dart2js/rti/data/explicit_as.dart
+++ b/tests/compiler/dart2js/rti/data/explicit_as.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
/*omit.class: C:*/
class C<T> {
diff --git a/tests/compiler/dart2js/rti/data/function_subtype_local5.dart b/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
index 3d1b80c..8d429b8 100644
--- a/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
+++ b/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2013, 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.
+
+// @dart = 2.7
// Dart test program for constructors and initializers.
// Check function subtyping for local functions on generic type against generic
diff --git a/tests/compiler/dart2js/rti/data/future_or.dart b/tests/compiler/dart2js/rti/data/future_or.dart
index f39c148..bffc174 100644
--- a/tests/compiler/dart2js/rti/data/future_or.dart
+++ b/tests/compiler/dart2js/rti/data/future_or.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
/*class: global#Future:implicit=[Future<A>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/future_or_future_or.dart b/tests/compiler/dart2js/rti/data/future_or_future_or.dart
index 4f825b0..095ea3d 100644
--- a/tests/compiler/dart2js/rti/data/future_or_future_or.dart
+++ b/tests/compiler/dart2js/rti/data/future_or_future_or.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
/*class: global#Future:implicit=[Future<A>,Future<FutureOr<A>>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart b/tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart
index 32b28d9..3cc54d6e 100644
--- a/tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
/*class: global#Future:deps=[A],implicit=[Future<B<A.T>>,Future<C>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/future_or_generic.dart b/tests/compiler/dart2js/rti/data/future_or_generic.dart
index 84291b90..901b5bf 100644
--- a/tests/compiler/dart2js/rti/data/future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/data/future_or_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
/*class: global#Future:deps=[A],implicit=[Future<A.T>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/future_or_generic2.dart b/tests/compiler/dart2js/rti/data/future_or_generic2.dart
index 8e588cf..e80d9a0 100644
--- a/tests/compiler/dart2js/rti/data/future_or_generic2.dart
+++ b/tests/compiler/dart2js/rti/data/future_or_generic2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
/*class: global#Future:deps=[A],implicit=[Future<B<A.T>>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_bounds.dart b/tests/compiler/dart2js/rti/data/generic_bounds.dart
index 4bbc2de..dcfdfbc 100644
--- a/tests/compiler/dart2js/rti/data/generic_bounds.dart
+++ b/tests/compiler/dart2js/rti/data/generic_bounds.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: Class1a:explicit=[Class1a]*/
diff --git a/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
index 65a7e4d..937ee3e 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:explicit=[B<A>]*/
class A {}
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is.dart b/tests/compiler/dart2js/rti/data/generic_class_is.dart
index fce7f39..46f569d 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:implicit=[A]*/
class A {}
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is2.dart b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
index 7c15011..1f60af6 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:implicit=[List<A<C2>>,List<A<C>>]*/
diff --git a/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
index cf9db9c..907fc44 100644
--- a/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:explicit=[B<A>]*/
class A {}
diff --git a/tests/compiler/dart2js/rti/data/generic_creation.dart b/tests/compiler/dart2js/rti/data/generic_creation.dart
index b46fc2f..d0a90fa 100644
--- a/tests/compiler/dart2js/rti/data/generic_creation.dart
+++ b/tests/compiler/dart2js/rti/data/generic_creation.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
/*class: A:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_instanceof4.dart b/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
index 84470da..afc5297 100644
--- a/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
+++ b/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:deps=[B],direct,explicit=[A.T],needsArgs*/
class A<T> {
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart b/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart
index 7efc3c1..54d013f 100644
--- a/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart
+++ b/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:deps=[B],direct,explicit=[A.T],needsArgs*/
class A<T> {
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/data/generic_method1.dart b/tests/compiler/dart2js/rti/data/generic_method1.dart
index bad6514..6af8aa1 100644
--- a/tests/compiler/dart2js/rti/data/generic_method1.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
/*class: A:deps=[method2],direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method2.dart b/tests/compiler/dart2js/rti/data/generic_method2.dart
index bfa88fd..7d4afea 100644
--- a/tests/compiler/dart2js/rti/data/generic_method2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
/*class: A:deps=[B],direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method3.dart b/tests/compiler/dart2js/rti/data/generic_method3.dart
index 8fceecc..9aa3794 100644
--- a/tests/compiler/dart2js/rti/data/generic_method3.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method3.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
/*class: A:deps=[method2],direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method4.dart b/tests/compiler/dart2js/rti/data/generic_method4.dart
index 7c7fa24..2f6f471 100644
--- a/tests/compiler/dart2js/rti/data/generic_method4.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method4.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
/*class: A:deps=[C.method2],direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
index 8404071..3599e85 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:explicit=[B<A>]*/
class A {}
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is.dart b/tests/compiler/dart2js/rti/data/generic_method_is.dart
index 2012cdf..8f24a5d 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_is.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_is.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.member: method:direct,explicit=[method.T],needsArgs*/
/*omit.member: method:direct,explicit=[method.T],needsArgs*/
method<T>(T t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is2.dart b/tests/compiler/dart2js/rti/data/generic_method_is2.dart
index a415e06..de364f3 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_is2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A1:implicit=[A1]*/
class A1 {}
diff --git a/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart b/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart
index 421d6bd..5fff48f 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart
@@ -2,6 +2,8 @@
// 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.7
+
T method1a<T>() => null;
T method1b<T>() => null;
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
index 4a666a0..13c5edd 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test derived from language_2/generic_methods_dynamic_test/05
/*omit.class: global#JSArray:deps=[List],explicit=[JSArray],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
index ea8041b..e0575e5 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Reduced version of generic_methods_dynamic_05a_strong.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/rti/data/implicit_as.dart b/tests/compiler/dart2js/rti/data/implicit_as.dart
index 59db5dc..6c76287 100644
--- a/tests/compiler/dart2js/rti/data/implicit_as.dart
+++ b/tests/compiler/dart2js/rti/data/implicit_as.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
/*omit.class: C:*/
class C<T> {
diff --git a/tests/compiler/dart2js/rti/data/indirect_through_static.dart b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
index 95fb0c3..f1cc990 100644
--- a/tests/compiler/dart2js/rti/data/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: A:implicit=[A]*/
/*omit.class: A:implicit=[A]*/
abstract class A {}
diff --git a/tests/compiler/dart2js/rti/data/indirect_type_literal.dart b/tests/compiler/dart2js/rti/data/indirect_type_literal.dart
index bd9a39f..087d10f 100644
--- a/tests/compiler/dart2js/rti/data/indirect_type_literal.dart
+++ b/tests/compiler/dart2js/rti/data/indirect_type_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/data/instantiation1.dart b/tests/compiler/dart2js/rti/data/instantiation1.dart
index 930c1ff..bd638dc 100644
--- a/tests/compiler/dart2js/rti/data/instantiation1.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
/*omit.member: f:deps=[B]*/
int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js/rti/data/instantiation2.dart b/tests/compiler/dart2js/rti/data/instantiation2.dart
index 777fcc0..8c040bc 100644
--- a/tests/compiler/dart2js/rti/data/instantiation2.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
/*omit.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
bool f<T>(T a) => a is T;
diff --git a/tests/compiler/dart2js/rti/data/instantiation3.dart b/tests/compiler/dart2js/rti/data/instantiation3.dart
index f426821..19899d9 100644
--- a/tests/compiler/dart2js/rti/data/instantiation3.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
/*omit.member: f:deps=[B]*/
int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js/rti/data/instantiation4.dart b/tests/compiler/dart2js/rti/data/instantiation4.dart
index 34948b9..c40ca9c 100644
--- a/tests/compiler/dart2js/rti/data/instantiation4.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation4.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
/*omit.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
bool f<T>(T a) => a is T;
diff --git a/tests/compiler/dart2js/rti/data/instantiation5.dart b/tests/compiler/dart2js/rti/data/instantiation5.dart
index 5cde8c6..8f3fb60 100644
--- a/tests/compiler/dart2js/rti/data/instantiation5.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation5.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
/*omit.member: f:deps=[method]*/
int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js/rti/data/instantiation6.dart b/tests/compiler/dart2js/rti/data/instantiation6.dart
index 3ce71b5..212557f 100644
--- a/tests/compiler/dart2js/rti/data/instantiation6.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation6.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
/*omit.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
bool f<T>(T a) => a is T;
diff --git a/tests/compiler/dart2js/rti/data/instantiation7.dart b/tests/compiler/dart2js/rti/data/instantiation7.dart
index 87aabd6..2786071 100644
--- a/tests/compiler/dart2js/rti/data/instantiation7.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation7.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.member: f1:deps=[method],direct,explicit=[f1.T],needsArgs,needsInst=[<method.X>]*/
/*omit.member: f1:deps=[method]*/
int f1<T>(T a, T b, T c) => null;
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable.dart b/tests/compiler/dart2js/rti/data/is_type_variable.dart
index 7002e52..7d38ee1 100644
--- a/tests/compiler/dart2js/rti/data/is_type_variable.dart
+++ b/tests/compiler/dart2js/rti/data/is_type_variable.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:direct,explicit=[A.T],needsArgs*/
class A<T> {
m(T t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable_super.dart b/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
index 912c9df..6f168e3 100644
--- a/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
+++ b/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A<T> {}
/*class: B:direct,explicit=[B.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart b/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
index 6c526d7..fd30e1b 100644
--- a/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
+++ b/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A<T> {}
/*class: B:direct,explicit=[B.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/list_literal.dart b/tests/compiler/dart2js/rti/data/list_literal.dart
index 1b2d499..b5caf11 100644
--- a/tests/compiler/dart2js/rti/data/list_literal.dart
+++ b/tests/compiler/dart2js/rti/data/list_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: global#List:deps=[Class.m],explicit=[List,List<String>],indirect,needsArgs*/
/*omit.class: global#List:deps=[Class.m],explicit=[List],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/list_to_set.dart b/tests/compiler/dart2js/rti/data/list_to_set.dart
index c448ab9..d5457ee 100644
--- a/tests/compiler/dart2js/rti/data/list_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/list_to_set.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: global#List:deps=[Class],explicit=[List,List<String>],indirect,needsArgs*/
/*omit.class: global#List:deps=[Class],explicit=[List],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/local_function_generic.dart b/tests/compiler/dart2js/rti/data/local_function_generic.dart
index 10e9a2f..99ea166 100644
--- a/tests/compiler/dart2js/rti/data/local_function_generic.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
method1() {
diff --git a/tests/compiler/dart2js/rti/data/local_function_list_literal.dart b/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
index 190c4c5..585ab8b 100644
--- a/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.member: method:implicit=[method.T],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/local_function_map_literal.dart b/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
index 6edee72..2aea2bb 100644
--- a/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/local_function_signature2.dart b/tests/compiler/dart2js/rti/data/local_function_signature2.dart
index dd0c838..9d38877 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signature2.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signature2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures.dart b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
index 705a077..f963ae0 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart b/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
index 80eed74..0f38f17 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/map_literal.dart b/tests/compiler/dart2js/rti/data/map_literal.dart
index 2c7349d..3472e19 100644
--- a/tests/compiler/dart2js/rti/data/map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/map_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*omit.class: global#Map:*/
/*strong.class: global#Map:explicit=[Map],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/map_to_set.dart b/tests/compiler/dart2js/rti/data/map_to_set.dart
index 28e5bf2..127552a 100644
--- a/tests/compiler/dart2js/rti/data/map_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/map_to_set.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*omit.class: global#Map:deps=[Class],needsArgs*/
/*strong.class: global#Map:deps=[Class],explicit=[Map],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/method_signatures.dart b/tests/compiler/dart2js/rti/data/method_signatures.dart
index e393181..b8332d1 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/method_signatures_generic.dart b/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
index e356581..eb0efc1 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/no_such_method1.dart b/tests/compiler/dart2js/rti/data/no_such_method1.dart
index da65384..93be16b 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method1.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method1.dart
@@ -2,6 +2,8 @@
// 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.7
+
class C {
/*member: C.noSuchMethod:needsArgs,selectors=[Selector(call, call, arity=0, types=2),Selector(call, foo, arity=0, types=2)]*/
noSuchMethod(i) => i.typeArguments;
diff --git a/tests/compiler/dart2js/rti/data/no_such_method2.dart b/tests/compiler/dart2js/rti/data/no_such_method2.dart
index 8b27c38..0d22825 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method2.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method2.dart
@@ -2,6 +2,8 @@
// 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.7
+
class C {
/*member: C.noSuchMethod:needsArgs,selectors=[Selector(call, call, arity=0, types=2),Selector(call, foo, arity=0, types=2)]*/
noSuchMethod(i) => i.typeArguments;
diff --git a/tests/compiler/dart2js/rti/data/no_such_method3.dart b/tests/compiler/dart2js/rti/data/no_such_method3.dart
index a6ba3c7..f25295b 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method3.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method3.dart
@@ -2,6 +2,8 @@
// 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.7
+
class C {
/*member: C.noSuchMethod:*/
noSuchMethod(i) => null;
diff --git a/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart b/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart
index 1d245c1..51c3d8b 100644
--- a/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart
+++ b/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
var c = new Class();
c.method1a(null);
diff --git a/tests/compiler/dart2js/rti/data/pragma_directives_static.dart b/tests/compiler/dart2js/rti/data/pragma_directives_static.dart
index b923edb..4a44a16 100644
--- a/tests/compiler/dart2js/rti/data/pragma_directives_static.dart
+++ b/tests/compiler/dart2js/rti/data/pragma_directives_static.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
method1a(null);
method1b(null);
diff --git a/tests/compiler/dart2js/rti/data/private_dynamic.dart b/tests/compiler/dart2js/rti/data/private_dynamic.dart
index fb5ca94..135d54c 100644
--- a/tests/compiler/dart2js/rti/data/private_dynamic.dart
+++ b/tests/compiler/dart2js/rti/data/private_dynamic.dart
@@ -2,6 +2,8 @@
// 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.7
+
class C {
/*member: C._private:direct,explicit=[_private.T],needsArgs,selectors=[Selector(call, _private, arity=1, types=1)]*/
_private<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/private_dynamic2.dart b/tests/compiler/dart2js/rti/data/private_dynamic2.dart
index 5612fbf..d682df3 100644
--- a/tests/compiler/dart2js/rti/data/private_dynamic2.dart
+++ b/tests/compiler/dart2js/rti/data/private_dynamic2.dart
@@ -2,6 +2,8 @@
// 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.7
+
class C {
/*member: C._private:deps=[D._private2],direct,explicit=[_private.T],needsArgs,selectors=[Selector(call, _private, arity=1, types=1)]*/
_private<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
index 08cc7bf..a42deee 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: Class:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
index c7cc1f4..c44c1f7 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: Class:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
index e586484..230f46f 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
String method() => null;
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
index d219396..43358cb 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: Class1:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
index 62858b0..e2cd3bd 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*omit.class: Class1:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
index f469a25..77593d4 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.member: method1a:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
index db76621..198424c 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*member: method1a:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
index a7b639a..5656b34 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: Class1:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
index a1acdd3..cc64617 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class:*/
/*omit.class: Class:*/
class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
index 041b311..e79d08a 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class:*/
/*omit.class: Class:*/
class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
index 9d80812..d1d3744 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
index f4511ea..cb5ab6e 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: Class1:*/
class Class1 {
/*member: Class1.:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
index 20026ba..ef8ea71 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class:*/
/*omit.class: Class:*/
class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
index fa6db4d..1e1bce8 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: Class:*/
class Class<T> {
/*member: Class.:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
index bf0d3e2..cc6dfc5 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: Class1a:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
index 77b9099..77abea4 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: Class1a:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
index c290ac6..5b030ba 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: Class1a:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
index 5e77f79..9892440 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: Class1a:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
index c1db9ed..b7b1d2c 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: Class1a:explicit=[Class1a]*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
index f0cca27..8482f3d 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: Class1a:explicit=[Class1a],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
index 8639733..980f832 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: Class1a:explicit=[Class1a]*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart
index 282d501..36de144 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: global#instantiate1:needsArgs*/
main() {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart
index 22ddfb3..2b1fc09 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: global#instantiate1:needsArgs*/
/*strong.member: id:direct,explicit=[id.T],needsArgs,needsInst=[<int>]*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart
index 222eb2b..0060b4c 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*member: global#instantiate1:needsArgs*/
class Class {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
index 70f0f95..33499d6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class1:*/
/*omit.class: Class1:*/
class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
index d8efa16..b2f2adb 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
index baf98d4..2fa2623 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
index 77babb9..75ce88e 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
index 235b8be..520fbb6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
index b312960..8272616 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
index 70f0f95..33499d6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: Class1:*/
/*omit.class: Class1:*/
class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/subclass.dart b/tests/compiler/dart2js/rti/data/subclass.dart
index 2631e8e..d6b8a6e 100644
--- a/tests/compiler/dart2js/rti/data/subclass.dart
+++ b/tests/compiler/dart2js/rti/data/subclass.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:explicit=[A<int>],needsArgs*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/data/subclass_fixed.dart b/tests/compiler/dart2js/rti/data/subclass_fixed.dart
index 3dcf303..df179af 100644
--- a/tests/compiler/dart2js/rti/data/subclass_fixed.dart
+++ b/tests/compiler/dart2js/rti/data/subclass_fixed.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:explicit=[A<int>],needsArgs*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/data/subtype_named_args.dart b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
index 5e6bbe2..905ab05 100644
--- a/tests/compiler/dart2js/rti/data/subtype_named_args.dart
+++ b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
@@ -2,6 +2,8 @@
// 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.7
+
// From co19/Language/Types/Function_Types/subtype_named_args_t02.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/data/subtype_named_args1.dart b/tests/compiler/dart2js/rti/data/subtype_named_args1.dart
index 5af335e..dc140e4 100644
--- a/tests/compiler/dart2js/rti/data/subtype_named_args1.dart
+++ b/tests/compiler/dart2js/rti/data/subtype_named_args1.dart
@@ -2,6 +2,8 @@
// 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.7
+
// From co19/Language/Types/Function_Types/subtype_named_args_t01.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/rti/data/superclass.dart b/tests/compiler/dart2js/rti/data/superclass.dart
index bc3c6ff..9dfda6e 100644
--- a/tests/compiler/dart2js/rti/data/superclass.dart
+++ b/tests/compiler/dart2js/rti/data/superclass.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A<T> {}
/*class: B:explicit=[B<int>],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/tear_off.dart b/tests/compiler/dart2js/rti/data/tear_off.dart
index f2c56b1..b2ae3a3 100644
--- a/tests/compiler/dart2js/rti/data/tear_off.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:*/
class A<T> {
/*member: A.m:*/
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic.dart b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
index b3689bb..fea635a 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
/*omit.class: A:*/
class A<T> {
diff --git a/tests/compiler/dart2js/rti/data/type_argument_substitution.dart b/tests/compiler/dart2js/rti/data/type_argument_substitution.dart
index 635ad13..869bbdf 100644
--- a/tests/compiler/dart2js/rti/data/type_argument_substitution.dart
+++ b/tests/compiler/dart2js/rti/data/type_argument_substitution.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that substitutions are emitted for classes that are only used as
// type arguments.
diff --git a/tests/compiler/dart2js/rti/data/type_literal.dart b/tests/compiler/dart2js/rti/data/type_literal.dart
index 972268e..fcce34e 100644
--- a/tests/compiler/dart2js/rti/data/type_literal.dart
+++ b/tests/compiler/dart2js/rti/data/type_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:exp,needsArgs*/
class A<T> {
instanceMethod() => T;
diff --git a/tests/compiler/dart2js/rti/data/type_literal2.dart b/tests/compiler/dart2js/rti/data/type_literal2.dart
index a1e3e6b..687bca2 100644
--- a/tests/compiler/dart2js/rti/data/type_literal2.dart
+++ b/tests/compiler/dart2js/rti/data/type_literal2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:deps=[B],exp,needsArgs*/
class A<T> {
method1() => T;
diff --git a/tests/compiler/dart2js/rti/data/type_literal_generic.dart b/tests/compiler/dart2js/rti/data/type_literal_generic.dart
index dde4860..66d98f0 100644
--- a/tests/compiler/dart2js/rti/data/type_literal_generic.dart
+++ b/tests/compiler/dart2js/rti/data/type_literal_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:exp,needsArgs*/
class A<T> {
instanceMethod() => T;
diff --git a/tests/compiler/dart2js/rti/data/type_variable_function_type.dart b/tests/compiler/dart2js/rti/data/type_variable_function_type.dart
index b4a7f70..e40a848 100644
--- a/tests/compiler/dart2js/rti/data/type_variable_function_type.dart
+++ b/tests/compiler/dart2js/rti/data/type_variable_function_type.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Based on tests\language_2\type_variable_function_type_test.dart
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/disable_rti_test.dart b/tests/compiler/dart2js/rti/disable_rti_test.dart
index e02891c..6bbeb2f 100644
--- a/tests/compiler/dart2js/rti/disable_rti_test.dart
+++ b/tests/compiler/dart2js/rti/disable_rti_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/rti/emission/arguments.dart b/tests/compiler/dart2js/rti/emission/arguments.dart
index 04e10ed..215e20c 100644
--- a/tests/compiler/dart2js/rti/emission/arguments.dart
+++ b/tests/compiler/dart2js/rti/emission/arguments.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedTypeArgument,checks=[],typeArgument*/
class A {}
diff --git a/tests/compiler/dart2js/rti/emission/call.dart b/tests/compiler/dart2js/rti/emission/call.dart
index 44f562a..921de31 100644
--- a/tests/compiler/dart2js/rti/emission/call.dart
+++ b/tests/compiler/dart2js/rti/emission/call.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/call_typed.dart b/tests/compiler/dart2js/rti/emission/call_typed.dart
index 9688991..ab3dbfe 100644
--- a/tests/compiler/dart2js/rti/emission/call_typed.dart
+++ b/tests/compiler/dart2js/rti/emission/call_typed.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/call_typed_generic.dart b/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
index 1d3bfea..c80f395 100644
--- a/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/closure_function.dart b/tests/compiler/dart2js/rti/emission/closure_function.dart
index 86101d9..d478691 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function.dart
@@ -2,6 +2,8 @@
// 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.7
+
@pragma('dart2js:noInline')
test(o) => o is Function;
diff --git a/tests/compiler/dart2js/rti/emission/closure_function_type.dart b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
index 374d99e..6436a12 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function_type.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
@@ -2,6 +2,8 @@
// 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.7
+
@pragma('dart2js:noInline')
test(o) => o is Function();
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature.dart b/tests/compiler/dart2js/rti/emission/closure_signature.dart
index 8a4589a..ca68239 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checks=[],instance*/
class A<T> {
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
index c292b18..28e2660 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checks=[],instance*/
class A<T> {
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart b/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
index 97c2abe..097a0ce9 100644
--- a/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
+++ b/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: A1:checkedInstance,checks=[],instance*/
/*omit.class: A1:checks=[],instance*/
class A1 {}
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_instance.dart b/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
index 3f455c0..0f3a503 100644
--- a/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
+++ b/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: B:checkedInstance,checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart b/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
index c3270bb..6837723 100644
--- a/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checkedInstance,checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart b/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart
index 66d91cf..0d26a10 100644
--- a/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: global#Type:checks=[],instance,typeLiteral*/
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/rti/emission/event_callback.dart b/tests/compiler/dart2js/rti/emission/event_callback.dart
index 4273b86..288d1da 100644
--- a/tests/compiler/dart2js/rti/emission/event_callback.dart
+++ b/tests/compiler/dart2js/rti/emission/event_callback.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:html';
/*strong.class: global#Event:checkedInstance,checkedTypeArgument,checks=[$isEvent],instance,typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart b/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart
index 0d862eb..e636027 100644
--- a/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
/*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
class A {}
diff --git a/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart b/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart
index a7f3624..b5bdbee 100644
--- a/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart
+++ b/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that we emit the relation between B and A even when B is only live
// as a type argument through the supertype of D.
diff --git a/tests/compiler/dart2js/rti/emission/function_type_argument.dart b/tests/compiler/dart2js/rti/emission/function_type_argument.dart
index 3b1ae5d..f674415 100644
--- a/tests/compiler/dart2js/rti/emission/function_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/function_type_argument.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: C:checkedInstance,checks=[],instance,typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/function_typed_arguments.dart b/tests/compiler/dart2js/rti/emission/function_typed_arguments.dart
index 60796eb..58d5f14 100644
--- a/tests/compiler/dart2js/rti/emission/function_typed_arguments.dart
+++ b/tests/compiler/dart2js/rti/emission/function_typed_arguments.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checkedInstance,checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/future_or.dart b/tests/compiler/dart2js/rti/emission/future_or.dart
index 4e5bf95..61a2b8d 100644
--- a/tests/compiler/dart2js/rti/emission/future_or.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart b/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
index 837f824..2b718e3 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
/*class: global#Future:checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/future_or_future_or.dart b/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
index dfd18b3..55abe4b 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart b/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
index 5a6b425..db1eceb 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/emission/future_or_generic.dart b/tests/compiler/dart2js/rti/emission/future_or_generic.dart
index b97e5e2..95dd12f 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/emission/future_or_generic2.dart b/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
index 68eca4a..bd21431 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart b/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
index 756d26f..e5db913 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart b/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart
index 6d2b263..c228394 100644
--- a/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart
+++ b/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checks=[],instance*/
class A<T> {
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
index 947dcca..0241ff4 100644
--- a/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
+++ b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Based on language/generic_methods_dynamic_test/02
library generic_methods_dynamic_test;
diff --git a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
index 3571daa..5a70d24 100644
--- a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: A:checkedInstance,checks=[],typeArgument*/
/*omit.class: A:checkedInstance,checks=[],typeArgument*/
abstract class A {}
diff --git a/tests/compiler/dart2js/rti/emission/inherited_is.dart b/tests/compiler/dart2js/rti/emission/inherited_is.dart
index e240c7d..608ae74 100644
--- a/tests/compiler/dart2js/rti/emission/inherited_is.dart
+++ b/tests/compiler/dart2js/rti/emission/inherited_is.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checkedInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/inherited_is2.dart b/tests/compiler/dart2js/rti/emission/inherited_is2.dart
index 95c1993..c63bcad 100644
--- a/tests/compiler/dart2js/rti/emission/inherited_is2.dart
+++ b/tests/compiler/dart2js/rti/emission/inherited_is2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checkedInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop.dart b/tests/compiler/dart2js/rti/emission/jsinterop.dart
index 9cadf45..422ece1 100644
--- a/tests/compiler/dart2js/rti/emission/jsinterop.dart
+++ b/tests/compiler/dart2js/rti/emission/jsinterop.dart
@@ -2,6 +2,8 @@
// 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.7
+
@JS()
library jsinterop;
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart b/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart
index 1a38ffe..60ab4ae 100644
--- a/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
@JS()
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart b/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
index cd2577a..65a16f8 100644
--- a/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
+++ b/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
@JS()
diff --git a/tests/compiler/dart2js/rti/emission/list.dart b/tests/compiler/dart2js/rti/emission/list.dart
index 6dc93d8..6efdf08 100644
--- a/tests/compiler/dart2js/rti/emission/list.dart
+++ b/tests/compiler/dart2js/rti/emission/list.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
/*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
/*strong.class: global#JSArray:checkedInstance,checks=[$isIterable],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart b/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
index a873118..7573410 100644
--- a/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*strong.class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart b/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
index 080f72b..03ec2a1 100644
--- a/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: global#JsLinkedHashMap:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/map_literal.dart b/tests/compiler/dart2js/rti/emission/map_literal.dart
index 66a1309..273331d 100644
--- a/tests/compiler/dart2js/rti/emission/map_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/map_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: global#Map:instance*/
/*class: global#LinkedHashMap:*/
diff --git a/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart b/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart
index 578d0e1..fb95f94 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
/*class: M:checks=[]*/
diff --git a/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart b/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
index 0831234..e77b220 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
/*class: I:checkedInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/mixin_subtype.dart b/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
index 2fe7a05..168c6da 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Derived from language_2/mixin_declaration/mixin_declaration_subtype_test.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/rti/emission/mixin_type_arguments.dart b/tests/compiler/dart2js/rti/emission/mixin_type_arguments.dart
index 044ba38..8a62cab 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_type_arguments.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_type_arguments.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart' show Expect;
/*class: A:checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/native.dart b/tests/compiler/dart2js/rti/emission/native.dart
index 02698ba..6e75a73 100644
--- a/tests/compiler/dart2js/rti/emission/native.dart
+++ b/tests/compiler/dart2js/rti/emission/native.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// ignore: import_internal_library
import 'dart:_js_helper' show Native;
diff --git a/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart b/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart
index c241513..08e2dbbd 100644
--- a/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart
+++ b/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart
@@ -2,6 +2,8 @@
// 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.7
+
@pragma('dart2js:noInline')
@pragma('dart2js:assumeDynamic')
value(o) => o;
diff --git a/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart b/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
index 379ea28..36f671d 100644
--- a/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
+++ b/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
@@ -2,6 +2,8 @@
// 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.7
+
@pragma('dart2js:noInline')
@pragma('dart2js:assumeDynamic')
value(o) => o;
diff --git a/tests/compiler/dart2js/rti/emission/regress_18713.dart b/tests/compiler/dart2js/rti/emission/regress_18713.dart
index 212e67b..6bd17d3 100644
--- a/tests/compiler/dart2js/rti/emission/regress_18713.dart
+++ b/tests/compiler/dart2js/rti/emission/regress_18713.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
/*class: T:checks=[],indirectInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart b/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
index 778a75e..6d75642 100644
--- a/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
+++ b/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
// This class is inlined away.
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type.dart b/tests/compiler/dart2js/rti/emission/runtime_type.dart
index 8e7fd19..2d2b913 100644
--- a/tests/compiler/dart2js/rti/emission/runtime_type.dart
+++ b/tests/compiler/dart2js/rti/emission/runtime_type.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checks=[],instance*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart
index dc43c4b..668a859 100644
--- a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*strong.checks=[$signature],instance*/
/*omit.checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart
index 2847c31..ab00cba 100644
--- a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart
@@ -2,6 +2,8 @@
// 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.7
+
T id<T>(T t) => t;
main() {
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart
index df259f2..326ed8f 100644
--- a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: Class:checks=[],instance*/
class Class {
T id<T>(T t) => t;
diff --git a/tests/compiler/dart2js/rti/emission/self.dart b/tests/compiler/dart2js/rti/emission/self.dart
index 07fdeea..bab2585 100644
--- a/tests/compiler/dart2js/rti/emission/self.dart
+++ b/tests/compiler/dart2js/rti/emission/self.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: C:checks=[],instance,typeLiteral*/
class C {}
diff --git a/tests/compiler/dart2js/rti/emission/self_generic.dart b/tests/compiler/dart2js/rti/emission/self_generic.dart
index 0d45939..3deb93e 100644
--- a/tests/compiler/dart2js/rti/emission/self_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/self_generic.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: C:checkedInstance,checks=[],instance*/
class C<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/static_argument.dart b/tests/compiler/dart2js/rti/emission/static_argument.dart
index f90c477..4230400 100644
--- a/tests/compiler/dart2js/rti/emission/static_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/static_argument.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*strong.class: I1:*/
/*omit.class: I1:*/
class I1 {}
diff --git a/tests/compiler/dart2js/rti/emission/subtype_named_args.dart b/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
index cb83d5e..def20ab 100644
--- a/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
+++ b/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
@@ -2,6 +2,8 @@
// 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.7
+
// From co19/Language/Types/Function_Types/subtype_named_args_t02.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/emission/superclass.dart b/tests/compiler/dart2js/rti/emission/superclass.dart
index 0559160..74aa29f 100644
--- a/tests/compiler/dart2js/rti/emission/superclass.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: B:checks=[],indirectInstance,typeLiteral*/
class B {}
diff --git a/tests/compiler/dart2js/rti/emission/superclass_as.dart b/tests/compiler/dart2js/rti/emission/superclass_as.dart
index d6366d3..01f4a3e 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_as.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_as.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checkedInstance,checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclass_complex.dart b/tests/compiler/dart2js/rti/emission/superclass_complex.dart
index d7c93bd..4513fda 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_complex.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedTypeArgument,checks=[],typeArgument*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/superclass_fixed.dart b/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
index 8470cd4..1e5c3cf 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: B:checkedInstance,checks=[],indirectInstance*/
class B<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
index c9ffe06..3f5b8e6 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checks=[],indirectInstance*/
class A {}
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
index d69c0d4..b6a325b 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedTypeArgument,checks=[],typeArgument*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
index b6ee559..af0c86f 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checks=[],indirectInstance*/
class A {}
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
index 9affb57..26f33ee 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checks=[],indirectInstance*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/superclass_trivial.dart b/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
index d89f74f..ec80fe7 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: B:checkedInstance,checks=[],indirectInstance*/
class B<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart b/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
index 3d58258..8f50450 100644
--- a/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedInstance,checks=[],indirectInstance*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart b/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
index 19ba5cf..b2f9615 100644
--- a/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedInstance,checks=[],indirectInstance*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/supertype.dart b/tests/compiler/dart2js/rti/emission/supertype.dart
index 9eb815b..a1d2918 100644
--- a/tests/compiler/dart2js/rti/emission/supertype.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: B:checkedInstance*/
class B {}
diff --git a/tests/compiler/dart2js/rti/emission/supertype_complex.dart b/tests/compiler/dart2js/rti/emission/supertype_complex.dart
index 5a4b458..d51cf38 100644
--- a/tests/compiler/dart2js/rti/emission/supertype_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype_complex.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedTypeArgument,checks=[],typeArgument*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/supertype_fixed.dart b/tests/compiler/dart2js/rti/emission/supertype_fixed.dart
index 2470677..ae2b93a 100644
--- a/tests/compiler/dart2js/rti/emission/supertype_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype_fixed.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: B:checkedInstance*/
class B<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/supertype_trivial.dart b/tests/compiler/dart2js/rti/emission/supertype_trivial.dart
index 6f44e13..241fa50 100644
--- a/tests/compiler/dart2js/rti/emission/supertype_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype_trivial.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: B:checkedInstance*/
class B<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
index 2629ef4..08420e0 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedInstance*/
class A {}
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart
index 0c59cc3..d109f6c 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedInstance*/
class A {}
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
index 77dc0cb..060f825 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedInstance*/
class A {}
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_implements.dart b/tests/compiler/dart2js/rti/emission/supertypes_implements.dart
index f481105..12578da 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_implements.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_implements.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedInstance*/
class A {}
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart b/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
index 04106c5..465a34e 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedInstance,checks=[],indirectInstance*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart b/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
index 04429d2..e1f7976 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*class: A:checkedInstance,checks=[],indirectInstance*/
class A<T> {}
diff --git a/tests/compiler/dart2js/rti/emission/tear_off_types.dart b/tests/compiler/dart2js/rti/emission/tear_off_types.dart
index e3b0d2c..4381d93 100644
--- a/tests/compiler/dart2js/rti/emission/tear_off_types.dart
+++ b/tests/compiler/dart2js/rti/emission/tear_off_types.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
main() {
diff --git a/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart b/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
index 1d38ef6..8ff02c5 100644
--- a/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
+++ b/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checkedTypeArgument,checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/type_argument_static.dart b/tests/compiler/dart2js/rti/emission/type_argument_static.dart
index f1c6b64..d4d889b 100644
--- a/tests/compiler/dart2js/rti/emission/type_argument_static.dart
+++ b/tests/compiler/dart2js/rti/emission/type_argument_static.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: A:checkedTypeArgument,checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/type_literal.dart b/tests/compiler/dart2js/rti/emission/type_literal.dart
index e46e083..f14bb65 100644
--- a/tests/compiler/dart2js/rti/emission/type_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/type_literal.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/*class: Class1:checks=[],typeLiteral*/
diff --git a/tests/compiler/dart2js/rti/emission/type_variable_function_type.dart b/tests/compiler/dart2js/rti/emission/type_variable_function_type.dart
index 44d0e88..5509423 100644
--- a/tests/compiler/dart2js/rti/emission/type_variable_function_type.dart
+++ b/tests/compiler/dart2js/rti/emission/type_variable_function_type.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Based on tests/language_2/type_variable_function_type_test.dart
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/factory_call_test.dart b/tests/compiler/dart2js/rti/factory_call_test.dart
index 803b0be..e77adc2 100644
--- a/tests/compiler/dart2js/rti/factory_call_test.dart
+++ b/tests/compiler/dart2js/rti/factory_call_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/rti/instance_call_test.dart b/tests/compiler/dart2js/rti/instance_call_test.dart
index 16f5538..6b123c3 100644
--- a/tests/compiler/dart2js/rti/instance_call_test.dart
+++ b/tests/compiler/dart2js/rti/instance_call_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/rti/is_test_with_type_parameters_test.dart b/tests/compiler/dart2js/rti/is_test_with_type_parameters_test.dart
index aeb8c3d..d174f9a 100644
--- a/tests/compiler/dart2js/rti/is_test_with_type_parameters_test.dart
+++ b/tests/compiler/dart2js/rti/is_test_with_type_parameters_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Tests that is-tests are also available for superclasses if the class is
diff --git a/tests/compiler/dart2js/rti/rti_emission_test.dart b/tests/compiler/dart2js/rti/rti_emission_test.dart
index 6a920a4..66364a9 100644
--- a/tests/compiler/dart2js/rti/rti_emission_test.dart
+++ b/tests/compiler/dart2js/rti/rti_emission_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/rti/rti_need0_test.dart b/tests/compiler/dart2js/rti/rti_need0_test.dart
index 1ffa110..43c8681 100644
--- a/tests/compiler/dart2js/rti/rti_need0_test.dart
+++ b/tests/compiler/dart2js/rti/rti_need0_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'rti_need_test_helper.dart';
main(List<String> args) {
diff --git a/tests/compiler/dart2js/rti/rti_need1_test.dart b/tests/compiler/dart2js/rti/rti_need1_test.dart
index a2d42f4..6c181e7 100644
--- a/tests/compiler/dart2js/rti/rti_need1_test.dart
+++ b/tests/compiler/dart2js/rti/rti_need1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'rti_need_test_helper.dart';
main(List<String> args) {
diff --git a/tests/compiler/dart2js/rti/rti_need_test_helper.dart b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
index 168a383..faa8983 100644
--- a/tests/compiler/dart2js/rti/rti_need_test_helper.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/features.dart';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/rti/runtime_type_hint_test.dart b/tests/compiler/dart2js/rti/runtime_type_hint_test.dart
index 99b6e00..b261627 100644
--- a/tests/compiler/dart2js/rti/runtime_type_hint_test.dart
+++ b/tests/compiler/dart2js/rti/runtime_type_hint_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/diagnostics/messages.dart';
diff --git a/tests/compiler/dart2js/rti/show.dart b/tests/compiler/dart2js/rti/show.dart
index a2e9056..f6ffb3a 100644
--- a/tests/compiler/dart2js/rti/show.dart
+++ b/tests/compiler/dart2js/rti/show.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Helper program that shows the rti data on a dart program.
import 'package:args/args.dart';
diff --git a/tests/compiler/dart2js/rti/type_representation_test.dart b/tests/compiler/dart2js/rti/type_representation_test.dart
index c2f1a34..5258d04 100644
--- a/tests/compiler/dart2js/rti/type_representation_test.dart
+++ b/tests/compiler/dart2js/rti/type_representation_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// TODO(johnniwinther): Port this test to be frontend agnostic.
library type_representation_test;
diff --git a/tests/compiler/dart2js/serialization/data/const_literals.dart b/tests/compiler/dart2js/serialization/data/const_literals.dart
index fb8128a..80443cb 100644
--- a/tests/compiler/dart2js/serialization/data/const_literals.dart
+++ b/tests/compiler/dart2js/serialization/data/const_literals.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
mapConstLiteral();
dictionaryConstLiteral();
diff --git a/tests/compiler/dart2js/serialization/data/constructor_name.dart b/tests/compiler/dart2js/serialization/data/constructor_name.dart
index dc1e3b2..f7f66f7 100644
--- a/tests/compiler/dart2js/serialization/data/constructor_name.dart
+++ b/tests/compiler/dart2js/serialization/data/constructor_name.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class1 {
var foo;
Class1.foo();
diff --git a/tests/compiler/dart2js/serialization/data/continue.dart b/tests/compiler/dart2js/serialization/data/continue.dart
index 5d8c3ec..e5bc2c9 100644
--- a/tests/compiler/dart2js/serialization/data/continue.dart
+++ b/tests/compiler/dart2js/serialization/data/continue.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
continueInClosure();
}
diff --git a/tests/compiler/dart2js/serialization/data/custom_types.dart b/tests/compiler/dart2js/serialization/data/custom_types.dart
index a301473..1190293 100644
--- a/tests/compiler/dart2js/serialization/data/custom_types.dart
+++ b/tests/compiler/dart2js/serialization/data/custom_types.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
method() {
Object c = this;
diff --git a/tests/compiler/dart2js/serialization/data/deferred.dart b/tests/compiler/dart2js/serialization/data/deferred.dart
index b0ea93c..a161d36 100644
--- a/tests/compiler/dart2js/serialization/data/deferred.dart
+++ b/tests/compiler/dart2js/serialization/data/deferred.dart
@@ -2,6 +2,8 @@
// 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.7
+
import '../libs/deferred_lib1.dart';
import '../libs/deferred_lib2.dart' deferred as lib2;
diff --git a/tests/compiler/dart2js/serialization/data/jsinterop.dart b/tests/compiler/dart2js/serialization/data/jsinterop.dart
index 208b2a9..eef8fd6 100644
--- a/tests/compiler/dart2js/serialization/data/jsinterop.dart
+++ b/tests/compiler/dart2js/serialization/data/jsinterop.dart
@@ -2,6 +2,8 @@
// 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.7
+
@JS()
library lib;
diff --git a/tests/compiler/dart2js/serialization/data/labels.dart b/tests/compiler/dart2js/serialization/data/labels.dart
index 4ba9f05..7919351 100644
--- a/tests/compiler/dart2js/serialization/data/labels.dart
+++ b/tests/compiler/dart2js/serialization/data/labels.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
label:
{
diff --git a/tests/compiler/dart2js/serialization/data/maps.dart b/tests/compiler/dart2js/serialization/data/maps.dart
index ca45d28..3226303 100644
--- a/tests/compiler/dart2js/serialization/data/maps.dart
+++ b/tests/compiler/dart2js/serialization/data/maps.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
createMap();
createDictionary();
diff --git a/tests/compiler/dart2js/serialization/data/switch.dart b/tests/compiler/dart2js/serialization/data/switch.dart
index fc9bc83..035db96 100644
--- a/tests/compiler/dart2js/serialization/data/switch.dart
+++ b/tests/compiler/dart2js/serialization/data/switch.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
switchCaseWithContinue(null);
}
diff --git a/tests/compiler/dart2js/serialization/data/typedef.dart b/tests/compiler/dart2js/serialization/data/typedef.dart
index 01d991b..9036918 100644
--- a/tests/compiler/dart2js/serialization/data/typedef.dart
+++ b/tests/compiler/dart2js/serialization/data/typedef.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
c;
}
diff --git a/tests/compiler/dart2js/serialization/in_memory_split_test.dart b/tests/compiler/dart2js/serialization/in_memory_split_test.dart
index 33a7912..7f4be63 100644
--- a/tests/compiler/dart2js/serialization/in_memory_split_test.dart
+++ b/tests/compiler/dart2js/serialization/in_memory_split_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:args/args.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/serialization/strategies.dart';
diff --git a/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart b/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart
index 361b0fd..d34fd39 100644
--- a/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart
+++ b/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
library deferred_constants1_lib1;
export 'deferred_lib3.dart' show C, C1;
diff --git a/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart b/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart
index 379239d..081d463 100644
--- a/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart
+++ b/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
library deferred_constants1_lib2;
export 'deferred_lib3.dart' show C2, C3, C4, C5, C6, C7;
diff --git a/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart b/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart
index 708a79a..4309703 100644
--- a/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart
+++ b/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart
@@ -2,6 +2,8 @@
// 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.7
+
library deferred_constants1_lib3;
import 'dart:async';
diff --git a/tests/compiler/dart2js/serialization/on_disk_split_test.dart b/tests/compiler/dart2js/serialization/on_disk_split_test.dart
index 163efa5..618eeb9 100644
--- a/tests/compiler/dart2js/serialization/on_disk_split_test.dart
+++ b/tests/compiler/dart2js/serialization/on_disk_split_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/serialization/serialization_test.dart b/tests/compiler/dart2js/serialization/serialization_test.dart
index 75dcb9a..139dde5 100644
--- a/tests/compiler/dart2js/serialization/serialization_test.dart
+++ b/tests/compiler/dart2js/serialization/serialization_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/serialization/serialization_test_helper.dart b/tests/compiler/dart2js/serialization/serialization_test_helper.dart
index 9f48d01..389d370 100644
--- a/tests/compiler/dart2js/serialization/serialization_test_helper.dart
+++ b/tests/compiler/dart2js/serialization/serialization_test_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:compiler/compiler_new.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/inferrer/types.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart b/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart
index 36ab917..0c93e47 100644
--- a/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:io';
diff --git a/tests/compiler/dart2js/sourcemaps/data/async.dart b/tests/compiler/dart2js/sourcemaps/data/async.dart
index 1cbc013..14a3b30 100644
--- a/tests/compiler/dart2js/sourcemaps/data/async.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/async.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
asyncReturn();
asyncThrow();
diff --git a/tests/compiler/dart2js/sourcemaps/data/invokes.dart b/tests/compiler/dart2js/sourcemaps/data/invokes.dart
index 11fad4d..37f04ff 100644
--- a/tests/compiler/dart2js/sourcemaps/data/invokes.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/invokes.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test file for testing source mappings of invocations.
var counter = 0;
diff --git a/tests/compiler/dart2js/sourcemaps/data/operators.dart b/tests/compiler/dart2js/sourcemaps/data/operators.dart
index 11888e110..66ce0d4 100644
--- a/tests/compiler/dart2js/sourcemaps/data/operators.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/operators.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test file for testing source mappings of operations.
var counter = 0;
diff --git a/tests/compiler/dart2js/sourcemaps/data/others.dart b/tests/compiler/dart2js/sourcemaps/data/others.dart
index 86ead71..76e2756 100644
--- a/tests/compiler/dart2js/sourcemaps/data/others.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/others.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test file for testing source mappings of various expression and statements.
main() {
diff --git a/tests/compiler/dart2js/sourcemaps/data/super.dart b/tests/compiler/dart2js/sourcemaps/data/super.dart
index e94a564..3b8e30c 100644
--- a/tests/compiler/dart2js/sourcemaps/data/super.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/super.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Super {
var field = 0;
diff --git a/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart b/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart
index 12d983d..3da203d 100644
--- a/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/colors.dart b/tests/compiler/dart2js/sourcemaps/helpers/colors.dart
index f3d435d..70578aa 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/colors.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/colors.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Utility library for creating web colors.
library sourcemaps.colors;
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/diff.dart b/tests/compiler/dart2js/sourcemaps/helpers/diff.dart
index 012679e..1f5ed6a 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/diff.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/diff.dart
@@ -2,6 +2,8 @@
// 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.7
+
library sourcemap.diff;
import 'package:compiler/src/io/source_file.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart b/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart
index ad951bc..eae6992 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart
@@ -2,6 +2,8 @@
// 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.7
+
library sourcemap.html_parts;
import 'sourcemap_html_helper.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart b/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart
index aa234a1..f515b73 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart
@@ -2,6 +2,8 @@
// 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.7
+
library sourcemap.js_tracer;
import 'package:compiler/src/io/source_information.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/lax_json.dart b/tests/compiler/dart2js/sourcemaps/helpers/lax_json.dart
index 405ecfb..58e5f6c 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/lax_json.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/lax_json.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Decode a lax JSON encoded text, that is, JSON with Dart-like comments and
/// trailing commas.
///
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart b/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart
index ddfd8c9..be586f6 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart
@@ -2,6 +2,8 @@
// 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.7
+
library sourcemap.output_structure;
import 'dart:math' as Math;
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
index aab0969..158276b 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'dart:convert';
import 'dart:async';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
index 058750c..f5e0509 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
library sourcemap.helper;
import 'dart:async';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart
index 57869ca..9f312d4 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Helper for creating HTML visualization of the source map information
/// generated by a [SourceMapProcessor].
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_templates.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_templates.dart
index e99ec4e..f0b53f0 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_templates.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_templates.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Templates used for the HTML visualization of source map information.
library sourcemap.html.templates;
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/trace_graph.dart b/tests/compiler/dart2js/sourcemaps/helpers/trace_graph.dart
index d4481f8..31d5d31b 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/trace_graph.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/trace_graph.dart
@@ -2,6 +2,8 @@
// 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.7
+
library sourcemap.trace_graph;
import 'dart:collection';
diff --git a/tests/compiler/dart2js/sourcemaps/lax_json_test.dart b/tests/compiler/dart2js/sourcemaps/lax_json_test.dart
index ac532c7..abbbea1 100644
--- a/tests/compiler/dart2js/sourcemaps/lax_json_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/lax_json_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'helpers/lax_json.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/load_save_test.dart b/tests/compiler/dart2js/sourcemaps/load_save_test.dart
index 3666fb1..3355040 100644
--- a/tests/compiler/dart2js/sourcemaps/load_save_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/load_save_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:convert';
import 'package:expect/expect.dart';
import 'package:source_maps/source_maps.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/location_collector_test.dart b/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
index b5ebf2a..7352c31 100644
--- a/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Unittest for the [LocationCollector].
import 'package:compiler/src/io/code_output.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/mapping_test.dart b/tests/compiler/dart2js/sourcemaps/mapping_test.dart
index ada9f65..bbff333 100644
--- a/tests/compiler/dart2js/sourcemaps/mapping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/mapping_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:io';
diff --git a/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property.dart b/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property.dart
index 497cfd2..aecd6b6 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Error pattern: Cannot read property '([^']*)' of null
// Kind of minified name: instance
// Expected deobfuscated name: method
diff --git a/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property2.dart b/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property2.dart
index b1321a4..b189bf8 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property2.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Error pattern: Cannot read property '([^']*)' of null
// Kind of minified name: instance
// Expected deobfuscated name: method
diff --git a/tests/compiler/dart2js/sourcemaps/minified/instance.dart b/tests/compiler/dart2js/sourcemaps/minified/instance.dart
index 6a2f831..798c249 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/instance.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/instance.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Error pattern: Instance of '([^']*)'
// Kind of minified name: global
// Expected deobfuscated name: MyClass
diff --git a/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart b/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart
index 92087cd..01a3a36 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart
@@ -2,6 +2,8 @@
// 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.7
+
// TODO(sigmund): should this be handled as "other"? (the identifier appears
// direclty in the line producing the error).
//
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
index 88383df..115a11b 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Error pattern: NoSuchMethodError: method not found: '([^']*)'\r?\nReceiver: Instance of '[^']*'
// Kind of minified name: instance
// Expected deobfuscated name: m1
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
index c169326..5d18472 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Error pattern: NoSuchMethodError: method not found: '[^']*'\r?\nReceiver: Instance of '([^']*)'
// Kind of minified name: global
// Expected deobfuscated name: B
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
index 5ba0000..c5a7c5d 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Error pattern: NoSuchMethodError: method not found: '([^']*)' .*
// Kind of minified name: instance
// Expected deobfuscated name: g1
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
index 9a4fdf6..83fb952 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Error pattern: NoSuchMethodError: method not found: '([^']*)' .*
// Kind of minified name: instance
// Expected deobfuscated name: g1=
diff --git a/tests/compiler/dart2js/sourcemaps/minified_names_test.dart b/tests/compiler/dart2js/sourcemaps/minified_names_test.dart
index 8761edc..674f151 100644
--- a/tests/compiler/dart2js/sourcemaps/minified_names_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified_names_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:io';
import 'dart:convert';
diff --git a/tests/compiler/dart2js/sourcemaps/name_test.dart b/tests/compiler/dart2js/sourcemaps/name_test.dart
index b6ecce8..5f2e197 100644
--- a/tests/compiler/dart2js/sourcemaps/name_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/name_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library source_map_name_test;
import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/nomapping_test.dart b/tests/compiler/dart2js/sourcemaps/nomapping_test.dart
index b38c1c6..7889b64 100644
--- a/tests/compiler/dart2js/sourcemaps/nomapping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/nomapping_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:io';
diff --git a/tests/compiler/dart2js/sourcemaps/source_map_test.dart b/tests/compiler/dart2js/sourcemaps/source_map_test.dart
index ddb75bf..2afead7 100644
--- a/tests/compiler/dart2js/sourcemaps/source_map_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_map_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that options '--source-map' and '--out' correctly adds
// `sourceMappingURL` and "file" attributes to source file and source map file.
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart
index 2aa8ee8e..77fbf1a 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'tools/source_mapping_tester.dart';
void main() {
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart
index cbddf96..8c2ee61 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'tools/source_mapping_tester.dart';
void main() {
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart
index 78c9d5e..fa6d5f9 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'helpers/sourcemap_helper.dart';
import 'tools/source_mapping_tester.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart
index 1b30119..0e969bb 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart
@@ -2,6 +2,8 @@
// 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.7
+
class MyClass {}
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/extension_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/extension_method.dart
index b2fe04f..1da9d2f 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/extension_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/extension_method.dart
@@ -1,6 +1,8 @@
class MyClass {
MyClass();
+
+// @dart = 2.7
@pragma('dart2js:noInline')
set internalSetter(int v) {
/*7:MyClass.internalSetter*/ throw "error";
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart
index 4e7aec1..c5ab11c 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart
@@ -1,3 +1,9 @@
+// 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.
+
+// @dart = 2.7
+
class MyClass {
int fieldName;
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_1.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_1.dart
index 40d9dc5..95a5bac 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_1.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_1.dart
@@ -1,3 +1,9 @@
+// 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.
+
+// @dart = 2.7
+
class MyClass {
int fieldName;
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_2.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_2.dart
index 9fc9e55..609c7c7 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_2.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_2.dart
@@ -1,3 +1,9 @@
+// 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.
+
+// @dart = 2.7
+
@pragma('dart2js:noInline')
String confuse(String x) => x;
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_3.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_3.dart
index 82996ca..f29039b 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_3.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_3.dart
@@ -1,3 +1,9 @@
+// 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.
+
+// @dart = 2.7
+
class MyClass {
int fieldName;
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_1.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_1.dart
index 67fa7e9..aeb32d0 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_1.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_1.dart
@@ -1,3 +1,9 @@
+// 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.
+
+// @dart = 2.7
+
class MyClass {
int fieldName;
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_2.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_2.dart
index 383d27d..8dc3a73 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_2.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_2.dart
@@ -1,3 +1,9 @@
+// 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.
+
+// @dart = 2.7
+
class MyClass {
int fieldName;
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart
index b9a347f..f47dcaa 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*1:main*/ test(new Class());
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart
index 768d1f0..6089cd8 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*1:main*/ test(new Class());
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart
index 08a8072..c91a150 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart
@@ -2,6 +2,8 @@
// 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.7
+
class MyType {
get length => 3; // ensures we build an interceptor for `.length`
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_receiver_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_receiver_inlining.dart
index f822e35..9684ef0 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_receiver_inlining.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/null_receiver_inlining.dart
@@ -1,3 +1,9 @@
+// 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
+
+// @dart = 2.7
+
class MyClass {
int fieldName;
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
index 4321fea..9a85e70 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
var c = new Class();
c. /*1:main*/ instancePositional1(0);
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart
index b8cbd75..26b944d 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
var c = new Class();
c. /*1:main*/ instancePositional1(0);
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart
index d1edabc..c6d733c 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*1:main*/ test();
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart
index fa567c1..ed9b291 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart
@@ -2,6 +2,8 @@
// 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.7
+
class MyClass {
int fieldName;
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
index 3c17f40..f89ba6d 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
// This call is on the stack when the error is thrown.
/*1:main*/ test();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
index 46ec972..8d1ae16 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
// This call is on the stack when the error is thrown.
/*1:main*/ test1();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
index be6c6b18..d9af125 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*1:main*/ test();
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
index 1ed8fd4..23b08e9 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*1:main*/ test1();
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart
index fe10b93..24cfc8b 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
// This call is no longer on the stack when the error is thrown.
/*:main*/ test();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart
index b9762fd..552ab2b 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
test1();
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart
index 6912e7c..95eb4e5 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
// ignore: UNUSED_LOCAL_VARIABLE
var c = new /*1:main*/ Class();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart
index ae6b2aa..aecbdb8 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
// This call is no longer on the stack when the error is thrown.
/*:main*/ test();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart
index 1accc99..f55170f 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
var c = new Class();
c. /*1:main*/ test();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_main.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_main.dart
index f43b4d4..24cfa64 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_main.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_main.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*1:main*/ throw '>ExceptionMarker<';
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart
index a86c5df..53c814b 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
Class. /*1:main*/ test();
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart
index e740ca8..778fae8 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*1:main*/ test();
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart
index 5b315c6..ff81e33 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
test1();
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart
index 59ff684..107681e 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*1:main*/ test();
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart
index c802027..6277450 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*1:main*/ test();
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
index b38553d..6006fb4 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:io';
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/print.dart b/tests/compiler/dart2js/sourcemaps/stepping/print.dart
index 934bbc9..84d3cee 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping/print.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping/print.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*bl*/
/*s:1*/ print("Hello, World!");
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart b/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart
index dec796a..9fec4d5 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart
@@ -2,6 +2,8 @@
// 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.7
+
/*Debugger:stepOver*/
main() {
/*bl*/
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart b/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart
index 147fa73..affce87 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
print(/*bc:1*/ foo());
}
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart b/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart
index 7108d8e..a336da4 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
/*bl*/
/*s:1*/ foo();
diff --git a/tests/compiler/dart2js/sourcemaps/stepping_test.dart b/tests/compiler/dart2js/sourcemaps/stepping_test.dart
index e1688e1..311d462 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:io';
diff --git a/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_file.dart b/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_file.dart
index 7a0202e..3740e93 100644
--- a/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_file.dart
+++ b/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_file.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'deferred_validator_test_lib.dart' deferred as def;
void main() {
diff --git a/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_lib.dart b/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_lib.dart
index 9ce7323..6b2dd89 100644
--- a/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_lib.dart
+++ b/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
class HelloClass {
void printHello() {
() {
diff --git a/tests/compiler/dart2js/sourcemaps/test_files/validator_test_file.dart b/tests/compiler/dart2js/sourcemaps/test_files/validator_test_file.dart
index 4df2443..8dfd626 100644
--- a/tests/compiler/dart2js/sourcemaps/test_files/validator_test_file.dart
+++ b/tests/compiler/dart2js/sourcemaps/test_files/validator_test_file.dart
@@ -2,6 +2,8 @@
// 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.7
+
class HelloClass {
void printHello() {
() {
diff --git a/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart b/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
index 945604cd..9f68323 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
@@ -2,6 +2,8 @@
// 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.7
+
library sourcemap.diff_view;
import 'dart:async';
diff --git a/tests/compiler/dart2js/sourcemaps/tools/load.dart b/tests/compiler/dart2js/sourcemaps/tools/load.dart
index a5acb30..bc8a460 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/load.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/load.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Loads a source map file and outputs a human-readable version of it.
library load;
diff --git a/tests/compiler/dart2js/sourcemaps/tools/save.dart b/tests/compiler/dart2js/sourcemaps/tools/save.dart
index be09f20..ac860f4 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/save.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/save.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Loads a human-readable source map and outputs the source map file for it.
library save;
diff --git a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_test_viewer.dart b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_test_viewer.dart
index 5d617fe..903a260 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_test_viewer.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_test_viewer.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Visualization of source mappings generated and tested in
/// 'source_mapping_test.dart'.
diff --git a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
index 9b49361..7041370 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:io';
import 'package:_fe_analyzer_shared/src/util/filenames.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/tools/sourcemap_visualizer.dart b/tests/compiler/dart2js/sourcemaps/tools/sourcemap_visualizer.dart
index b4761af..7919e58 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/sourcemap_visualizer.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/sourcemap_visualizer.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Tool for visualizing the source mapped parts of a generated JS file.
import 'dart:convert';
diff --git a/tests/compiler/dart2js/sourcemaps/tools/translate_dart2js_stacktrace.dart b/tests/compiler/dart2js/sourcemaps/tools/translate_dart2js_stacktrace.dart
index 3ed514e..c54f9a3 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/translate_dart2js_stacktrace.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/translate_dart2js_stacktrace.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:args/args.dart';
import 'package:http/http.dart' as http;
diff --git a/tests/compiler/dart2js/static_type/data/assert.dart b/tests/compiler/dart2js/static_type/data/assert.dart
index 54f2a34..39ecf52 100644
--- a/tests/compiler/dart2js/static_type/data/assert.dart
+++ b/tests/compiler/dart2js/static_type/data/assert.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Class next;
}
diff --git a/tests/compiler/dart2js/static_type/data/assert_ea.dart b/tests/compiler/dart2js/static_type/data/assert_ea.dart
index c28215d..e178bbc 100644
--- a/tests/compiler/dart2js/static_type/data/assert_ea.dart
+++ b/tests/compiler/dart2js/static_type/data/assert_ea.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Class next;
}
diff --git a/tests/compiler/dart2js/static_type/data/cascade.dart b/tests/compiler/dart2js/static_type/data/cascade.dart
index 4f2f6a5..2b06eb3 100644
--- a/tests/compiler/dart2js/static_type/data/cascade.dart
+++ b/tests/compiler/dart2js/static_type/data/cascade.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
promotedCascade(null);
}
diff --git a/tests/compiler/dart2js/static_type/data/closure.dart b/tests/compiler/dart2js/static_type/data/closure.dart
index f24f209..9c3eff8 100644
--- a/tests/compiler/dart2js/static_type/data/closure.dart
+++ b/tests/compiler/dart2js/static_type/data/closure.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Class next;
}
diff --git a/tests/compiler/dart2js/static_type/data/do.dart b/tests/compiler/dart2js/static_type/data/do.dart
index 0d0952b..072fb39 100644
--- a/tests/compiler/dart2js/static_type/data/do.dart
+++ b/tests/compiler/dart2js/static_type/data/do.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Class next;
}
diff --git a/tests/compiler/dart2js/static_type/data/effectively_final.dart b/tests/compiler/dart2js/static_type/data/effectively_final.dart
index a50cdaf..1dde98e 100644
--- a/tests/compiler/dart2js/static_type/data/effectively_final.dart
+++ b/tests/compiler/dart2js/static_type/data/effectively_final.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
effectivelyFinalList();
notEffectivelyFinalList();
diff --git a/tests/compiler/dart2js/static_type/data/for.dart b/tests/compiler/dart2js/static_type/data/for.dart
index 3d4bb82..1128ac9 100644
--- a/tests/compiler/dart2js/static_type/data/for.dart
+++ b/tests/compiler/dart2js/static_type/data/for.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Class next;
}
diff --git a/tests/compiler/dart2js/static_type/data/for_in.dart b/tests/compiler/dart2js/static_type/data/for_in.dart
index a97c74b..c8072cc 100644
--- a/tests/compiler/dart2js/static_type/data/for_in.dart
+++ b/tests/compiler/dart2js/static_type/data/for_in.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Iterable<Class> next;
}
diff --git a/tests/compiler/dart2js/static_type/data/generic_method.dart b/tests/compiler/dart2js/static_type/data/generic_method.dart
index 8026b3c..4474f55 100644
--- a/tests/compiler/dart2js/static_type/data/generic_method.dart
+++ b/tests/compiler/dart2js/static_type/data/generic_method.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class1 {
T method<T>(T t) => t;
}
diff --git a/tests/compiler/dart2js/static_type/data/if.dart b/tests/compiler/dart2js/static_type/data/if.dart
index 20c3f9b..d3bd63f 100644
--- a/tests/compiler/dart2js/static_type/data/if.dart
+++ b/tests/compiler/dart2js/static_type/data/if.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Class next;
}
diff --git a/tests/compiler/dart2js/static_type/data/null.dart b/tests/compiler/dart2js/static_type/data/null.dart
index dcbe522..5fd9622 100644
--- a/tests/compiler/dart2js/static_type/data/null.dart
+++ b/tests/compiler/dart2js/static_type/data/null.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Class next;
}
diff --git a/tests/compiler/dart2js/static_type/data/null_access.dart b/tests/compiler/dart2js/static_type/data/null_access.dart
index c21b149..b1cdab4 100644
--- a/tests/compiler/dart2js/static_type/data/null_access.dart
+++ b/tests/compiler/dart2js/static_type/data/null_access.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
test1();
test2();
diff --git a/tests/compiler/dart2js/static_type/data/switch.dart b/tests/compiler/dart2js/static_type/data/switch.dart
index 7b88d11..d25b1a4 100644
--- a/tests/compiler/dart2js/static_type/data/switch.dart
+++ b/tests/compiler/dart2js/static_type/data/switch.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Class next;
}
diff --git a/tests/compiler/dart2js/static_type/data/try_catch.dart b/tests/compiler/dart2js/static_type/data/try_catch.dart
index b4680d7..06992f9 100644
--- a/tests/compiler/dart2js/static_type/data/try_catch.dart
+++ b/tests/compiler/dart2js/static_type/data/try_catch.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Iterable<Class> next;
}
diff --git a/tests/compiler/dart2js/static_type/data/try_finally.dart b/tests/compiler/dart2js/static_type/data/try_finally.dart
index 62d0822..98ede49 100644
--- a/tests/compiler/dart2js/static_type/data/try_finally.dart
+++ b/tests/compiler/dart2js/static_type/data/try_finally.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Iterable<Class> next;
}
diff --git a/tests/compiler/dart2js/static_type/data/while.dart b/tests/compiler/dart2js/static_type/data/while.dart
index b21dee0..671d6da 100644
--- a/tests/compiler/dart2js/static_type/data/while.dart
+++ b/tests/compiler/dart2js/static_type/data/while.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Class {
Class next;
}
diff --git a/tests/compiler/dart2js/static_type/show.dart b/tests/compiler/dart2js/static_type/show.dart
index 59f85ee..a9e34bd 100644
--- a/tests/compiler/dart2js/static_type/show.dart
+++ b/tests/compiler/dart2js/static_type/show.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Helper program that shows the static type data on a dart program.
import 'package:args/args.dart';
diff --git a/tests/compiler/dart2js/static_type/static_type_test.dart b/tests/compiler/dart2js/static_type/static_type_test.dart
index 18ab90c..250f450 100644
--- a/tests/compiler/dart2js/static_type/static_type_test.dart
+++ b/tests/compiler/dart2js/static_type/static_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart b/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart
index 1c94829..3388fab 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {}
main() {
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/closure.dart b/tests/compiler/dart2js/static_type/type_promotion_data/closure.dart
index f50db9d..9fc2835 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/closure.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/closure.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
closure6(null);
closure7();
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart b/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart
index 17df94a..cd6ec3c 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart
@@ -2,6 +2,8 @@
// 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.7
+
bool equals(e1, e2, bool unordered) {
if (/*{}*/ e1 is Set) {
return /*{e1:[{true:Set<dynamic>}|Set<dynamic>]}*/
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/if.dart b/tests/compiler/dart2js/static_type/type_promotion_data/if.dart
index 5c54faa..b12571b 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/if.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/if.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {}
class B {}
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/null.dart b/tests/compiler/dart2js/static_type/type_promotion_data/null.dart
index 02a3697..40d6e7a 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/null.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/null.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
ifNull(null);
ifNullElse(null);
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/sequence.dart b/tests/compiler/dart2js/static_type/type_promotion_data/sequence.dart
index 71cc004..ebb2549 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/sequence.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/sequence.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {}
class B {}
diff --git a/tests/compiler/dart2js/static_type/type_promotion_test.dart b/tests/compiler/dart2js/static_type/type_promotion_test.dart
index fe2b259..06c6bf3 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_test.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js_extra/10216a_test.dart b/tests/compiler/dart2js_extra/10216a_test.dart
index 5032123..f3d151cb 100644
--- a/tests/compiler/dart2js_extra/10216a_test.dart
+++ b/tests/compiler/dart2js_extra/10216a_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Tests codegen of methods reached only via mixin.
diff --git a/tests/compiler/dart2js_extra/10216b_test.dart b/tests/compiler/dart2js_extra/10216b_test.dart
index a2ad8bb..cf8031b 100644
--- a/tests/compiler/dart2js_extra/10216b_test.dart
+++ b/tests/compiler/dart2js_extra/10216b_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Tests codegen of methods reached only via mixin.
diff --git a/tests/compiler/dart2js_extra/11673_test.dart b/tests/compiler/dart2js_extra/11673_test.dart
index 47aa416..3be867a 100644
--- a/tests/compiler/dart2js_extra/11673_test.dart
+++ b/tests/compiler/dart2js_extra/11673_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Tests codegen of methods reached only via interface implemented by mixin
diff --git a/tests/compiler/dart2js_extra/12320_test.dart b/tests/compiler/dart2js_extra/12320_test.dart
index d47c05a..9be0b41 100644
--- a/tests/compiler/dart2js_extra/12320_test.dart
+++ b/tests/compiler/dart2js_extra/12320_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Regression test for Issue 12320, Issue 12363.
diff --git a/tests/compiler/dart2js_extra/12_test.dart b/tests/compiler/dart2js_extra/12_test.dart
index 80a758a..069d26c 100644
--- a/tests/compiler/dart2js_extra/12_test.dart
+++ b/tests/compiler/dart2js_extra/12_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
print(3 + 4 + 5);
}
diff --git a/tests/compiler/dart2js_extra/16400_test.dart b/tests/compiler/dart2js_extra/16400_test.dart
index 7902f07..64b820b 100644
--- a/tests/compiler/dart2js_extra/16400_test.dart
+++ b/tests/compiler/dart2js_extra/16400_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
L:
{
diff --git a/tests/compiler/dart2js_extra/16407_test.dart b/tests/compiler/dart2js_extra/16407_test.dart
index aff1ba3..a84b9a4 100644
--- a/tests/compiler/dart2js_extra/16407_test.dart
+++ b/tests/compiler/dart2js_extra/16407_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Regression test for Issue 16407.
diff --git a/tests/compiler/dart2js_extra/16967_test.dart b/tests/compiler/dart2js_extra/16967_test.dart
index 26d9df7..6185102 100644
--- a/tests/compiler/dart2js_extra/16967_test.dart
+++ b/tests/compiler/dart2js_extra/16967_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
// Regression test for http://dartbug.com/16967
diff --git a/tests/compiler/dart2js_extra/17094_test.dart b/tests/compiler/dart2js_extra/17094_test.dart
index 41fba87..66fe00e 100644
--- a/tests/compiler/dart2js_extra/17094_test.dart
+++ b/tests/compiler/dart2js_extra/17094_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Interpolation effect analysis test.
diff --git a/tests/compiler/dart2js_extra/17645_test.dart b/tests/compiler/dart2js_extra/17645_test.dart
index 7469a6c..15f7e15 100644
--- a/tests/compiler/dart2js_extra/17645_test.dart
+++ b/tests/compiler/dart2js_extra/17645_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Regression test for issue 17645.
diff --git a/tests/compiler/dart2js_extra/17856_test.dart b/tests/compiler/dart2js_extra/17856_test.dart
index aa5a243..4b0f552 100644
--- a/tests/compiler/dart2js_extra/17856_test.dart
+++ b/tests/compiler/dart2js_extra/17856_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Regression test for Issue 17856.
diff --git a/tests/compiler/dart2js_extra/18383_test.dart b/tests/compiler/dart2js_extra/18383_test.dart
index e15526b..a059dc4 100644
--- a/tests/compiler/dart2js_extra/18383_test.dart
+++ b/tests/compiler/dart2js_extra/18383_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/18383
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/19191_test.dart b/tests/compiler/dart2js_extra/19191_test.dart
index cf2bd24..f986781 100644
--- a/tests/compiler/dart2js_extra/19191_test.dart
+++ b/tests/compiler/dart2js_extra/19191_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/19191
class A {
diff --git a/tests/compiler/dart2js_extra/21351_test.dart b/tests/compiler/dart2js_extra/21351_test.dart
index f3c0e53..e9538b6 100644
--- a/tests/compiler/dart2js_extra/21351_test.dart
+++ b/tests/compiler/dart2js_extra/21351_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
bool _flag = false;
bool get flag => _flag;
diff --git a/tests/compiler/dart2js_extra/21579_test.dart b/tests/compiler/dart2js_extra/21579_test.dart
index a7b3079..13869b7 100644
--- a/tests/compiler/dart2js_extra/21579_test.dart
+++ b/tests/compiler/dart2js_extra/21579_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/21579
//
// Fails for --trust-type-annotations:
diff --git a/tests/compiler/dart2js_extra/22487_test.dart b/tests/compiler/dart2js_extra/22487_test.dart
index 4bf5426..8e60015 100644
--- a/tests/compiler/dart2js_extra/22487_test.dart
+++ b/tests/compiler/dart2js_extra/22487_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/22487
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/22776_test.dart b/tests/compiler/dart2js_extra/22776_test.dart
index 135f505..62d7f8a 100644
--- a/tests/compiler/dart2js_extra/22776_test.dart
+++ b/tests/compiler/dart2js_extra/22776_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/22776
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/22868_test.dart b/tests/compiler/dart2js_extra/22868_test.dart
index 71907def..62b4837 100644
--- a/tests/compiler/dart2js_extra/22868_test.dart
+++ b/tests/compiler/dart2js_extra/22868_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/22868 and http://dartbug.com/22895
// Ensure that the closure tracer properly handles await.
diff --git a/tests/compiler/dart2js_extra/22917_test.dart b/tests/compiler/dart2js_extra/22917_test.dart
index 35a629a..0619095 100644
--- a/tests/compiler/dart2js_extra/22917_test.dart
+++ b/tests/compiler/dart2js_extra/22917_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/22917
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/23404_test.dart b/tests/compiler/dart2js_extra/23404_test.dart
index 699e63d..a3080c1 100644
--- a/tests/compiler/dart2js_extra/23404_test.dart
+++ b/tests/compiler/dart2js_extra/23404_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/23404
//
// Dart2js crashed when the global metadata had escaped characters. That
diff --git a/tests/compiler/dart2js_extra/23432_test.dart b/tests/compiler/dart2js_extra/23432_test.dart
index bbb32ff..e8bdff6 100644
--- a/tests/compiler/dart2js_extra/23432_test.dart
+++ b/tests/compiler/dart2js_extra/23432_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/23432. Test that the receiver of a
// NoSuchMethodError is correct on an intercepted method. The bug (issue 23432)
// is that the interceptor is captured instead of the receiver.
diff --git a/tests/compiler/dart2js_extra/23486_helper.dart b/tests/compiler/dart2js_extra/23486_helper.dart
index c15d826..7822865 100644
--- a/tests/compiler/dart2js_extra/23486_helper.dart
+++ b/tests/compiler/dart2js_extra/23486_helper.dart
@@ -2,4 +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.7
+
int x = 1;
diff --git a/tests/compiler/dart2js_extra/23486_test.dart b/tests/compiler/dart2js_extra/23486_test.dart
index 1d41e26..cff32df 100644
--- a/tests/compiler/dart2js_extra/23486_test.dart
+++ b/tests/compiler/dart2js_extra/23486_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/23486
//
// Dart2js used to crash when using `super` and prefixes inside parenthesized
diff --git a/tests/compiler/dart2js_extra/23804_test.dart b/tests/compiler/dart2js_extra/23804_test.dart
index 32bb00b..843af23 100644
--- a/tests/compiler/dart2js_extra/23804_test.dart
+++ b/tests/compiler/dart2js_extra/23804_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/23804
//
// Inference incorrectly assumed that `any` and `every` didn't escape the values
diff --git a/tests/compiler/dart2js_extra/23828_test.dart b/tests/compiler/dart2js_extra/23828_test.dart
index e2fbf7d..eb5f0c2 100644
--- a/tests/compiler/dart2js_extra/23828_test.dart
+++ b/tests/compiler/dart2js_extra/23828_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/23828
// Used to fail when methods contain a name starting with `get`
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/26243_test.dart b/tests/compiler/dart2js_extra/26243_test.dart
index 7f09cf3..d637c03 100644
--- a/tests/compiler/dart2js_extra/26243_test.dart
+++ b/tests/compiler/dart2js_extra/26243_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
var trace = [];
diff --git a/tests/compiler/dart2js_extra/27198_test.dart b/tests/compiler/dart2js_extra/27198_test.dart
index 721476e..bab3d07 100644
--- a/tests/compiler/dart2js_extra/27198_test.dart
+++ b/tests/compiler/dart2js_extra/27198_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// From co19/Language/Types/Parameterized_Types/Actual_Type_of_Declaration/actual_type_t05.dart
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/27199_test.dart b/tests/compiler/dart2js_extra/27199_test.dart
index b2d2fd5..8ac518d 100644
--- a/tests/compiler/dart2js_extra/27199_test.dart
+++ b/tests/compiler/dart2js_extra/27199_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/27199 in --checked mode.
// Typedefs must be unaliased at some point before codegen to have the correct
diff --git a/tests/compiler/dart2js_extra/27323_test.dart b/tests/compiler/dart2js_extra/27323_test.dart
index c8439ec..7186e29 100644
--- a/tests/compiler/dart2js_extra/27323_test.dart
+++ b/tests/compiler/dart2js_extra/27323_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/27354_test.dart b/tests/compiler/dart2js_extra/27354_test.dart
index 942dc49..c64a621 100644
--- a/tests/compiler/dart2js_extra/27354_test.dart
+++ b/tests/compiler/dart2js_extra/27354_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for Issue 27354.
int total = 1;
diff --git a/tests/compiler/dart2js_extra/28749_test.dart b/tests/compiler/dart2js_extra/28749_test.dart
index 0735aa7..8b151d8 100644
--- a/tests/compiler/dart2js_extra/28749_test.dart
+++ b/tests/compiler/dart2js_extra/28749_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
// Regression test for http://dartbug.com/28749.
diff --git a/tests/compiler/dart2js_extra/28919_test.dart b/tests/compiler/dart2js_extra/28919_test.dart
index e9b7106..e95f996 100644
--- a/tests/compiler/dart2js_extra/28919_test.dart
+++ b/tests/compiler/dart2js_extra/28919_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/28919.
//
// This would crash at runtime because the type of closure parameter 'x' was
diff --git a/tests/compiler/dart2js_extra/29130_test.dart b/tests/compiler/dart2js_extra/29130_test.dart
index e4daa34..76f91c7 100644
--- a/tests/compiler/dart2js_extra/29130_test.dart
+++ b/tests/compiler/dart2js_extra/29130_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// This is a regression test from issue #29310. The global type-inferrer does
/// tracing of closures including allocated classes that implement a `call`
/// method. We incorrectly considered also classes with invoked factory
diff --git a/tests/compiler/dart2js_extra/31803_test.dart b/tests/compiler/dart2js_extra/31803_test.dart
index 03c1f7c..88403e3 100644
--- a/tests/compiler/dart2js_extra/31803_test.dart
+++ b/tests/compiler/dart2js_extra/31803_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
// Tests that the compiler doesn't crash on an annotation with fields
diff --git a/tests/compiler/dart2js_extra/32770a_test.dart b/tests/compiler/dart2js_extra/32770a_test.dart
index 24aeb60..adc3bd6 100644
--- a/tests/compiler/dart2js_extra/32770a_test.dart
+++ b/tests/compiler/dart2js_extra/32770a_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
// Regression test for issue 32770.
diff --git a/tests/compiler/dart2js_extra/32770b_test.dart b/tests/compiler/dart2js_extra/32770b_test.dart
index f58bcf5..beac842 100644
--- a/tests/compiler/dart2js_extra/32770b_test.dart
+++ b/tests/compiler/dart2js_extra/32770b_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
// Regression test for issue 32770.
diff --git a/tests/compiler/dart2js_extra/32770c_test.dart b/tests/compiler/dart2js_extra/32770c_test.dart
index 15ac166..fefd82b 100644
--- a/tests/compiler/dart2js_extra/32770c_test.dart
+++ b/tests/compiler/dart2js_extra/32770c_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
// Regression test for issue 32770.
diff --git a/tests/compiler/dart2js_extra/32774_test.dart b/tests/compiler/dart2js_extra/32774_test.dart
index fbf3199..a117d86 100644
--- a/tests/compiler/dart2js_extra/32774_test.dart
+++ b/tests/compiler/dart2js_extra/32774_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/32828_test.dart b/tests/compiler/dart2js_extra/32828_test.dart
index c56a904..7e0b22b 100644
--- a/tests/compiler/dart2js_extra/32828_test.dart
+++ b/tests/compiler/dart2js_extra/32828_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
class A {
diff --git a/tests/compiler/dart2js_extra/32853_test.dart b/tests/compiler/dart2js_extra/32853_test.dart
index ccf8dab..f90fb71 100644
--- a/tests/compiler/dart2js_extra/32853_test.dart
+++ b/tests/compiler/dart2js_extra/32853_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
// Regression test for issue 32853.
diff --git a/tests/compiler/dart2js_extra/32928_test.dart b/tests/compiler/dart2js_extra/32928_test.dart
index 549909b..ef392df 100644
--- a/tests/compiler/dart2js_extra/32928_test.dart
+++ b/tests/compiler/dart2js_extra/32928_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
/// Regression test for issue 32928.
diff --git a/tests/compiler/dart2js_extra/32969_test.dart b/tests/compiler/dart2js_extra/32969_test.dart
index 8599b3f..8f1e892 100644
--- a/tests/compiler/dart2js_extra/32969_test.dart
+++ b/tests/compiler/dart2js_extra/32969_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
@JS()
diff --git a/tests/compiler/dart2js_extra/32997a_lib.dart b/tests/compiler/dart2js_extra/32997a_lib.dart
index 54e4f54..5c7566d 100644
--- a/tests/compiler/dart2js_extra/32997a_lib.dart
+++ b/tests/compiler/dart2js_extra/32997a_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
T getFoo<T>(T v) => v;
typedef dynamic G<T>(T v);
diff --git a/tests/compiler/dart2js_extra/32997a_test.dart b/tests/compiler/dart2js_extra/32997a_test.dart
index 4e2b00a..6a0ec97 100644
--- a/tests/compiler/dart2js_extra/32997a_test.dart
+++ b/tests/compiler/dart2js_extra/32997a_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import '32997a_lib.dart' deferred as b;
diff --git a/tests/compiler/dart2js_extra/32997b_lib.dart b/tests/compiler/dart2js_extra/32997b_lib.dart
index 62eee11..4d532d0 100644
--- a/tests/compiler/dart2js_extra/32997b_lib.dart
+++ b/tests/compiler/dart2js_extra/32997b_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
T getFoo<T>(T v) => v;
typedef dynamic G<T>(T v);
diff --git a/tests/compiler/dart2js_extra/32997b_test.dart b/tests/compiler/dart2js_extra/32997b_test.dart
index 7783285..3041932 100644
--- a/tests/compiler/dart2js_extra/32997b_test.dart
+++ b/tests/compiler/dart2js_extra/32997b_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import '32997b_lib.dart' deferred as b; //# 01: compile-time error
diff --git a/tests/compiler/dart2js_extra/33296_test.dart b/tests/compiler/dart2js_extra/33296_test.dart
index 7d06619..0b8e814 100644
--- a/tests/compiler/dart2js_extra/33296_test.dart
+++ b/tests/compiler/dart2js_extra/33296_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:js';
import 'dart:html'; // TODO(33316): Remove.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/33572_test.dart b/tests/compiler/dart2js_extra/33572_test.dart
index 2721bf7..4ae5b51 100644
--- a/tests/compiler/dart2js_extra/33572_test.dart
+++ b/tests/compiler/dart2js_extra/33572_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for issue 32853.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/33_test.dart b/tests/compiler/dart2js_extra/33_test.dart
index 0d55209..286ff35 100644
--- a/tests/compiler/dart2js_extra/33_test.dart
+++ b/tests/compiler/dart2js_extra/33_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
print(3 + 4 * 10 - 8 / 2 - 19 ~/ 3);
}
diff --git a/tests/compiler/dart2js_extra/34156_test.dart b/tests/compiler/dart2js_extra/34156_test.dart
index f4dbb81..2d216aa 100644
--- a/tests/compiler/dart2js_extra/34156_test.dart
+++ b/tests/compiler/dart2js_extra/34156_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
@pragma('dart2js:tryInline')
diff --git a/tests/compiler/dart2js_extra/34701_test.dart b/tests/compiler/dart2js_extra/34701_test.dart
index 708024f..10f83ee 100644
--- a/tests/compiler/dart2js_extra/34701_test.dart
+++ b/tests/compiler/dart2js_extra/34701_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--omit-implicit-checks
/// Regression test for issue 34701.
diff --git a/tests/compiler/dart2js_extra/35341_test.dart b/tests/compiler/dart2js_extra/35341_test.dart
index 80310f0..ce527af 100644
--- a/tests/compiler/dart2js_extra/35341_test.dart
+++ b/tests/compiler/dart2js_extra/35341_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for issue 35341.
import "dart:async";
diff --git a/tests/compiler/dart2js_extra/35356_test.dart b/tests/compiler/dart2js_extra/35356_test.dart
index 13dc082..a6b768b 100644
--- a/tests/compiler/dart2js_extra/35356_test.dart
+++ b/tests/compiler/dart2js_extra/35356_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
bool b = true & true;
b |= true;
diff --git a/tests/compiler/dart2js_extra/35853_test.dart b/tests/compiler/dart2js_extra/35853_test.dart
index 3fe033ac..e3cebb6 100644
--- a/tests/compiler/dart2js_extra/35853_test.dart
+++ b/tests/compiler/dart2js_extra/35853_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
typedef F1 = int Function(int);
diff --git a/tests/compiler/dart2js_extra/35965a_test.dart b/tests/compiler/dart2js_extra/35965a_test.dart
index 56a3d7a..332aa20 100644
--- a/tests/compiler/dart2js_extra/35965a_test.dart
+++ b/tests/compiler/dart2js_extra/35965a_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for issue 35965.
//
// The combination of generator bodies on mixin methods with super-calls caused
diff --git a/tests/compiler/dart2js_extra/37494_test.dart b/tests/compiler/dart2js_extra/37494_test.dart
index d2d8283..a0abceb 100644
--- a/tests/compiler/dart2js_extra/37494_test.dart
+++ b/tests/compiler/dart2js_extra/37494_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/37494
import 'dart:collection';
diff --git a/tests/compiler/dart2js_extra/37576_test.dart b/tests/compiler/dart2js_extra/37576_test.dart
index b243963..4d797e8 100644
--- a/tests/compiler/dart2js_extra/37576_test.dart
+++ b/tests/compiler/dart2js_extra/37576_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:js/js.dart';
@JS('jsFun')
diff --git a/tests/compiler/dart2js_extra/38005_test.dart b/tests/compiler/dart2js_extra/38005_test.dart
index 2789b31..e5a4bb5 100644
--- a/tests/compiler/dart2js_extra/38005_test.dart
+++ b/tests/compiler/dart2js_extra/38005_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {}
diff --git a/tests/compiler/dart2js_extra/38949_test.dart b/tests/compiler/dart2js_extra/38949_test.dart
index 4b0ceba..814b004 100644
--- a/tests/compiler/dart2js_extra/38949_test.dart
+++ b/tests/compiler/dart2js_extra/38949_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
abstract class Foo<A, B> {
diff --git a/tests/compiler/dart2js_extra/3_test.dart b/tests/compiler/dart2js_extra/3_test.dart
index 520d8a8..aad263a 100644
--- a/tests/compiler/dart2js_extra/3_test.dart
+++ b/tests/compiler/dart2js_extra/3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
int main() {
return 3;
}
diff --git a/tests/compiler/dart2js_extra/40152a_test.dart b/tests/compiler/dart2js_extra/40152a_test.dart
index 76e0698..68dc8ae 100644
--- a/tests/compiler/dart2js_extra/40152a_test.dart
+++ b/tests/compiler/dart2js_extra/40152a_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Partial regression test for #40152.
import 'package:js/js.dart';
diff --git a/tests/compiler/dart2js_extra/40296_test.dart b/tests/compiler/dart2js_extra/40296_test.dart
index 989b6f7..4e40bcc 100644
--- a/tests/compiler/dart2js_extra/40296_test.dart
+++ b/tests/compiler/dart2js_extra/40296_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
@JS()
library test;
diff --git a/tests/compiler/dart2js_extra/40902_test.dart b/tests/compiler/dart2js_extra/40902_test.dart
index d62c769..e992476 100644
--- a/tests/compiler/dart2js_extra/40902_test.dart
+++ b/tests/compiler/dart2js_extra/40902_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class Foo {
diff --git a/tests/compiler/dart2js_extra/43_test.dart b/tests/compiler/dart2js_extra/43_test.dart
index 2a85bb1..055815e 100644
--- a/tests/compiler/dart2js_extra/43_test.dart
+++ b/tests/compiler/dart2js_extra/43_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
print(3 + 4 * 10);
}
diff --git a/tests/compiler/dart2js_extra/7_test.dart b/tests/compiler/dart2js_extra/7_test.dart
index 742ca65..48631e0f 100644
--- a/tests/compiler/dart2js_extra/7_test.dart
+++ b/tests/compiler/dart2js_extra/7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
print(3 + 4);
}
diff --git a/tests/compiler/dart2js_extra/881_test.dart b/tests/compiler/dart2js_extra/881_test.dart
index 5be849c..04a8f10 100644
--- a/tests/compiler/dart2js_extra/881_test.dart
+++ b/tests/compiler/dart2js_extra/881_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for DartPad issue 881.
@pragma('dart2js:disableFinal')
diff --git a/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart b/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart
index 3ca943b..31703f8 100644
--- a/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart
+++ b/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Test derived from a broken co19 test
/// (LayoutTests/fast/mediastream/getusermedia_t01.dart). Caused dart2js to
/// crash.
diff --git a/tests/compiler/dart2js_extra/assert_with_message_test.dart b/tests/compiler/dart2js_extra/assert_with_message_test.dart
index 993ab11..4cda95f 100644
--- a/tests/compiler/dart2js_extra/assert_with_message_test.dart
+++ b/tests/compiler/dart2js_extra/assert_with_message_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
@pragma('dart2js:assumeDynamic')
diff --git a/tests/compiler/dart2js_extra/async_helper.dart b/tests/compiler/dart2js_extra/async_helper.dart
index b7ee2fd..72418f7 100644
--- a/tests/compiler/dart2js_extra/async_helper.dart
+++ b/tests/compiler/dart2js_extra/async_helper.dart
@@ -2,6 +2,8 @@
// 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.7
+
library async_helper;
/**
diff --git a/tests/compiler/dart2js_extra/async_stacktrace_test.dart b/tests/compiler/dart2js_extra/async_stacktrace_test.dart
index 708706b..1e2733a 100644
--- a/tests/compiler/dart2js_extra/async_stacktrace_test.dart
+++ b/tests/compiler/dart2js_extra/async_stacktrace_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "dart:async";
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/big_allocation_expression_test.dart b/tests/compiler/dart2js_extra/big_allocation_expression_test.dart
index 30653a3..d405a4d 100644
--- a/tests/compiler/dart2js_extra/big_allocation_expression_test.dart
+++ b/tests/compiler/dart2js_extra/big_allocation_expression_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// This program crashes the SSA backend. http://dartbug.com/24635.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/block_expression_on_field_test.dart b/tests/compiler/dart2js_extra/block_expression_on_field_test.dart
index 7b6449f..7e4f1e4 100644
--- a/tests/compiler/dart2js_extra/block_expression_on_field_test.dart
+++ b/tests/compiler/dart2js_extra/block_expression_on_field_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression test for #36864
///
/// Block expressions in top-level fields used to crash the compiler.
diff --git a/tests/compiler/dart2js_extra/boolean_conversion_test.dart b/tests/compiler/dart2js_extra/boolean_conversion_test.dart
index 64cd441..2c51dfc 100644
--- a/tests/compiler/dart2js_extra/boolean_conversion_test.dart
+++ b/tests/compiler/dart2js_extra/boolean_conversion_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--omit-implicit-checks
// Note: --omit-implicit-checks causes Expect.isNull to misbehave, so we use
diff --git a/tests/compiler/dart2js_extra/bound_closure_interceptor_methods_test.dart b/tests/compiler/dart2js_extra/bound_closure_interceptor_methods_test.dart
index f17b647..45c1b78 100644
--- a/tests/compiler/dart2js_extra/bound_closure_interceptor_methods_test.dart
+++ b/tests/compiler/dart2js_extra/bound_closure_interceptor_methods_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/bound_closure_interceptor_type_test.dart b/tests/compiler/dart2js_extra/bound_closure_interceptor_type_test.dart
index 7d4ea10..39271c3 100644
--- a/tests/compiler/dart2js_extra/bound_closure_interceptor_type_test.dart
+++ b/tests/compiler/dart2js_extra/bound_closure_interceptor_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Test for type checks against tear-off closures generated in different
diff --git a/tests/compiler/dart2js_extra/bounded_type_literal_test.dart b/tests/compiler/dart2js_extra/bounded_type_literal_test.dart
index ad0fbe8..c5683d6 100644
--- a/tests/compiler/dart2js_extra/bounded_type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/bounded_type_literal_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check1a_test.dart b/tests/compiler/dart2js_extra/bounds_check1a_test.dart
index b42ca0d..781f088 100644
--- a/tests/compiler/dart2js_extra/bounds_check1a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check1a_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check1b_test.dart b/tests/compiler/dart2js_extra/bounds_check1b_test.dart
index 8fad189..739449e 100644
--- a/tests/compiler/dart2js_extra/bounds_check1b_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check1b_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check2a_test.dart b/tests/compiler/dart2js_extra/bounds_check2a_test.dart
index 654c71b..f2000f6 100644
--- a/tests/compiler/dart2js_extra/bounds_check2a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check2a_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check2b_test.dart b/tests/compiler/dart2js_extra/bounds_check2b_test.dart
index 07cd595..373fa7c 100644
--- a/tests/compiler/dart2js_extra/bounds_check2b_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check2b_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check3a_test.dart b/tests/compiler/dart2js_extra/bounds_check3a_test.dart
index 482b8ed..64c9a52 100644
--- a/tests/compiler/dart2js_extra/bounds_check3a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check3a_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check3b_test.dart b/tests/compiler/dart2js_extra/bounds_check3b_test.dart
index af34397..fba0553 100644
--- a/tests/compiler/dart2js_extra/bounds_check3b_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check3b_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check3c_test.dart b/tests/compiler/dart2js_extra/bounds_check3c_test.dart
index 696afdd..54a5ddb 100644
--- a/tests/compiler/dart2js_extra/bounds_check3c_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check3c_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
main() {
diff --git a/tests/compiler/dart2js_extra/bounds_check4a_test.dart b/tests/compiler/dart2js_extra/bounds_check4a_test.dart
index 49e8d42..7b8af1d 100644
--- a/tests/compiler/dart2js_extra/bounds_check4a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check4a_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check4b_test.dart b/tests/compiler/dart2js_extra/bounds_check4b_test.dart
index fdb7863..06d3056 100644
--- a/tests/compiler/dart2js_extra/bounds_check4b_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check4b_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check_test.dart b/tests/compiler/dart2js_extra/bounds_check_test.dart
index 99223c8..50ed0f1 100644
--- a/tests/compiler/dart2js_extra/bounds_check_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
var a = [0, 1];
a[-1]; // //# 01: runtime error
diff --git a/tests/compiler/dart2js_extra/break_test.dart b/tests/compiler/dart2js_extra/break_test.dart
index 830fe73..8758d05 100644
--- a/tests/compiler/dart2js_extra/break_test.dart
+++ b/tests/compiler/dart2js_extra/break_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
break1(int x, int y, int ew, int ez) {
diff --git a/tests/compiler/dart2js_extra/call_is_function_test.dart b/tests/compiler/dart2js_extra/call_is_function_test.dart
index 8907cad..d824b04 100644
--- a/tests/compiler/dart2js_extra/call_is_function_test.dart
+++ b/tests/compiler/dart2js_extra/call_is_function_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class A {
diff --git a/tests/compiler/dart2js_extra/call_signature_test.dart b/tests/compiler/dart2js_extra/call_signature_test.dart
index 20978d5..014d136 100644
--- a/tests/compiler/dart2js_extra/call_signature_test.dart
+++ b/tests/compiler/dart2js_extra/call_signature_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test. Crash occurred when trying to create a signature function
// for the non-live 'call' method on the live class 'A'.
diff --git a/tests/compiler/dart2js_extra/call_uninlined_test.dart b/tests/compiler/dart2js_extra/call_uninlined_test.dart
index ab0e750..3cdeaa7 100644
--- a/tests/compiler/dart2js_extra/call_uninlined_test.dart
+++ b/tests/compiler/dart2js_extra/call_uninlined_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class H {
diff --git a/tests/compiler/dart2js_extra/cfe_instance_constant_test.dart b/tests/compiler/dart2js_extra/cfe_instance_constant_test.dart
index 0c202c1..187b91a 100644
--- a/tests/compiler/dart2js_extra/cfe_instance_constant_test.dart
+++ b/tests/compiler/dart2js_extra/cfe_instance_constant_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for CFE constant evaluation. The evaluation of [Class9.field]
// assumed that its initializer did not hold an unevaluated constant.
diff --git a/tests/compiler/dart2js_extra/checked_setter_test.dart b/tests/compiler/dart2js_extra/checked_setter_test.dart
index 60ca4fa..4b0e323 100644
--- a/tests/compiler/dart2js_extra/checked_setter_test.dart
+++ b/tests/compiler/dart2js_extra/checked_setter_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class A {
diff --git a/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart b/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart
index 1cd8ebb..ef71e57 100644
--- a/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart
+++ b/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2017, 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.
+
+// @dart = 2.7
import 'package:expect/expect.dart';
class A {}
diff --git a/tests/compiler/dart2js_extra/closure2_test.dart b/tests/compiler/dart2js_extra/closure2_test.dart
index fd8e726..22a577f 100644
--- a/tests/compiler/dart2js_extra/closure2_test.dart
+++ b/tests/compiler/dart2js_extra/closure2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
closure0() {
diff --git a/tests/compiler/dart2js_extra/closure3_test.dart b/tests/compiler/dart2js_extra/closure3_test.dart
index daea300..fcd846a 100644
--- a/tests/compiler/dart2js_extra/closure3_test.dart
+++ b/tests/compiler/dart2js_extra/closure3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
main() {
diff --git a/tests/compiler/dart2js_extra/closure4_test.dart b/tests/compiler/dart2js_extra/closure4_test.dart
index 08e00bd..2824079 100644
--- a/tests/compiler/dart2js_extra/closure4_test.dart
+++ b/tests/compiler/dart2js_extra/closure4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
closure0() {
diff --git a/tests/compiler/dart2js_extra/closure5_test.dart b/tests/compiler/dart2js_extra/closure5_test.dart
index f135346..b241a97 100644
--- a/tests/compiler/dart2js_extra/closure5_test.dart
+++ b/tests/compiler/dart2js_extra/closure5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/closure6_test.dart b/tests/compiler/dart2js_extra/closure6_test.dart
index a49b187..168c570 100644
--- a/tests/compiler/dart2js_extra/closure6_test.dart
+++ b/tests/compiler/dart2js_extra/closure6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/closure7_test.dart b/tests/compiler/dart2js_extra/closure7_test.dart
index bae471e..8d8fc62 100644
--- a/tests/compiler/dart2js_extra/closure7_test.dart
+++ b/tests/compiler/dart2js_extra/closure7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
var foo;
diff --git a/tests/compiler/dart2js_extra/closure_capture2_test.dart b/tests/compiler/dart2js_extra/closure_capture2_test.dart
index 4d22b10..3a11798 100644
--- a/tests/compiler/dart2js_extra/closure_capture2_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
closure0() {
diff --git a/tests/compiler/dart2js_extra/closure_capture3_test.dart b/tests/compiler/dart2js_extra/closure_capture3_test.dart
index f74f7f5..63b10c5 100644
--- a/tests/compiler/dart2js_extra/closure_capture3_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class Closure {
diff --git a/tests/compiler/dart2js_extra/closure_capture4_test.dart b/tests/compiler/dart2js_extra/closure_capture4_test.dart
index a16cb07..be66533 100644
--- a/tests/compiler/dart2js_extra/closure_capture4_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
closure0() {
diff --git a/tests/compiler/dart2js_extra/closure_capture5_test.dart b/tests/compiler/dart2js_extra/closure_capture5_test.dart
index c95bbc6..f01d655 100644
--- a/tests/compiler/dart2js_extra/closure_capture5_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
closure0() {
diff --git a/tests/compiler/dart2js_extra/closure_capture6_test.dart b/tests/compiler/dart2js_extra/closure_capture6_test.dart
index 06f593f..547d9e7 100644
--- a/tests/compiler/dart2js_extra/closure_capture6_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Simple test for free variable in two nested scopes.
diff --git a/tests/compiler/dart2js_extra/closure_capture7_test.dart b/tests/compiler/dart2js_extra/closure_capture7_test.dart
index 045f6a5..5ec52d4 100644
--- a/tests/compiler/dart2js_extra/closure_capture7_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A<T> {
List<List> xs;
diff --git a/tests/compiler/dart2js_extra/closure_capture_test.dart b/tests/compiler/dart2js_extra/closure_capture_test.dart
index cc12c58..acea026 100644
--- a/tests/compiler/dart2js_extra/closure_capture_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
closure0() {
diff --git a/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart b/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart
index 88534c7..037743a 100644
--- a/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart
+++ b/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class A<T> {
diff --git a/tests/compiler/dart2js_extra/closure_test.dart b/tests/compiler/dart2js_extra/closure_test.dart
index 5ad4247..c3f1448 100644
--- a/tests/compiler/dart2js_extra/closure_test.dart
+++ b/tests/compiler/dart2js_extra/closure_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
closure0() {
diff --git a/tests/compiler/dart2js_extra/code_motion_exception_test.dart b/tests/compiler/dart2js_extra/code_motion_exception_test.dart
index 95ed395..0bd675bd 100644
--- a/tests/compiler/dart2js_extra/code_motion_exception_test.dart
+++ b/tests/compiler/dart2js_extra/code_motion_exception_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Test for correct order of exceptions in code with checks that could be moved
diff --git a/tests/compiler/dart2js_extra/compile_time_constant4_test.dart b/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
index 2349dc1..f2497bf 100644
--- a/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
+++ b/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
const x = "foo";
diff --git a/tests/compiler/dart2js_extra/compound_operator_index_test.dart b/tests/compiler/dart2js_extra/compound_operator_index_test.dart
index 508a9e0..4c3d6f3 100644
--- a/tests/compiler/dart2js_extra/compound_operator_index_test.dart
+++ b/tests/compiler/dart2js_extra/compound_operator_index_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/conditional_rewrite_test.dart b/tests/compiler/dart2js_extra/conditional_rewrite_test.dart
index 57b0a42..936e03c 100644
--- a/tests/compiler/dart2js_extra/conditional_rewrite_test.dart
+++ b/tests/compiler/dart2js_extra/conditional_rewrite_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Test that dart2js does not rewrite conditional into logical operators
diff --git a/tests/compiler/dart2js_extra/conditional_send_test.dart b/tests/compiler/dart2js_extra/conditional_send_test.dart
index d1a27c1..86c29f0c 100644
--- a/tests/compiler/dart2js_extra/conditional_send_test.dart
+++ b/tests/compiler/dart2js_extra/conditional_send_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// SharedOptions=--enable-null-aware-operators
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/conditional_test.dart b/tests/compiler/dart2js_extra/conditional_test.dart
index 13cf988..0cbbd7d 100644
--- a/tests/compiler/dart2js_extra/conditional_test.dart
+++ b/tests/compiler/dart2js_extra/conditional_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
getZero() {
diff --git a/tests/compiler/dart2js_extra/conflict_index_test.dart b/tests/compiler/dart2js_extra/conflict_index_test.dart
index 46c74ea..e0ed5f0 100644
--- a/tests/compiler/dart2js_extra/conflict_index_test.dart
+++ b/tests/compiler/dart2js_extra/conflict_index_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
main() {
diff --git a/tests/compiler/dart2js_extra/consistent_add_error_test.dart b/tests/compiler/dart2js_extra/consistent_add_error_test.dart
index fd5840f..792fabd 100644
--- a/tests/compiler/dart2js_extra/consistent_add_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_add_error_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Test that optimized '+' and slow path '+' produce the same error.
diff --git a/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart b/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart
index 536279b..e43c0c4 100644
--- a/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Test that optimized codeUnitAt and slow path codeUnitAt produce the same
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart
index 6afa8a9..aba6fbe 100644
--- a/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "dart:typed_data";
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart
index 45155ff..935de54 100644
--- a/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "dart:typed_data";
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart
index bf198c6..7646c4a 100644
--- a/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "dart:typed_data";
diff --git a/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart b/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart
index 64ad07d..2ab6ce5 100644
--- a/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Test that optimized 'null + x' and slow path '+' produce the same error.
diff --git a/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart b/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart
index a847937..6cba5c8 100644
--- a/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// dart2jsOptions=--omit-implicit-checks
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/consistent_type_error_test.dart b/tests/compiler/dart2js_extra/consistent_type_error_test.dart
index e687ba4..d8287aa 100644
--- a/tests/compiler/dart2js_extra/consistent_type_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_type_error_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that type checks give consistent errors for the same types. In minified
// mode this checks that the minified class names are consistently tagged.
diff --git a/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart b/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart
index aab61d7..bb3057d 100644
--- a/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart
+++ b/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2012, 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.
+
+// @dart = 2.7
// This test is making sure we don't try to constant fold numbers
// where the semantics differ at compile-time (Dart) and runtime (JS).
diff --git a/tests/compiler/dart2js_extra/constant_folding_test.dart b/tests/compiler/dart2js_extra/constant_folding_test.dart
index b9b050b..927ac28 100644
--- a/tests/compiler/dart2js_extra/constant_folding_test.dart
+++ b/tests/compiler/dart2js_extra/constant_folding_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void main() {
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
index 6ca6693..858d88b 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Make sure we use JavaScript semantics when compiling compile-time constants.
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
index 2cdf6b0..bfbfd8c 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Make sure we use JavaScript semantics when compiling compile-time constants.
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics4_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics4_test.dart
index 9d19957..a3b26d4 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics4_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Make sure we use JavaScript semantics when compiling compile-time constants.
// In checked mode, this return will not fail. If the compiler thinks
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
index 1a09423..5f31542 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Make sure we use JavaScript semantics when compiling compile-time constants.
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics_test5.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics_test5.dart
index e2275ea..94041a4 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics_test5.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics_test5.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Make sure we can assert(const Foo() != null) in const initializers.
diff --git a/tests/compiler/dart2js_extra/crash_library_metadata.dart b/tests/compiler/dart2js_extra/crash_library_metadata.dart
index b274687..5b74d23 100644
--- a/tests/compiler/dart2js_extra/crash_library_metadata.dart
+++ b/tests/compiler/dart2js_extra/crash_library_metadata.dart
@@ -2,6 +2,8 @@
// 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.7
+
@Constant()
library foo;
diff --git a/tests/compiler/dart2js_extra/data_uri_test.dart b/tests/compiler/dart2js_extra/data_uri_test.dart
index 90191c2..1d1ef1e 100644
--- a/tests/compiler/dart2js_extra/data_uri_test.dart
+++ b/tests/compiler/dart2js_extra/data_uri_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "data:,var%20x=#_a._b;var%20y=#a._b;var%20z=#_b;";
main() {
diff --git a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib1.dart b/tests/compiler/dart2js_extra/deferred/34219_bounds_lib1.dart
index 81bf0ae..7b7c8b8 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_bounds_lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Part of 34219_bounds_test.dart
import '34219_bounds_lib2.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib2.dart b/tests/compiler/dart2js_extra/deferred/34219_bounds_lib2.dart
index 7726460..cb96b0e 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_bounds_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Part of 34219_bounds_test.dart
class GeneratedMessage {}
diff --git a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib3.dart b/tests/compiler/dart2js_extra/deferred/34219_bounds_lib3.dart
index a567162..4221d51 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_bounds_lib3.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Part of 34219_bounds_test.dart
//
// This library places GeneratedMessage into a different partition to
diff --git a/tests/compiler/dart2js_extra/deferred/34219_bounds_test.dart b/tests/compiler/dart2js_extra/deferred/34219_bounds_test.dart
index 67b77d9..1247f33 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_bounds_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_bounds_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2018, 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.
+
+// @dart = 2.7
// dart2jsOptions=--omit-implicit-checks
// Tests that generic function type bounds are walked as dependencies of a
diff --git a/tests/compiler/dart2js_extra/deferred/34219_signature_lib1.dart b/tests/compiler/dart2js_extra/deferred/34219_signature_lib1.dart
index b3493bd..8788765 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_signature_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_signature_lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Part of 34219_signature_test.dart
import '34219_signature_lib2.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/34219_signature_lib2.dart b/tests/compiler/dart2js_extra/deferred/34219_signature_lib2.dart
index e702fe6..b801bb9 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_signature_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_signature_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Part of 34219_signature_test.dart
class GeneratedMessage {}
diff --git a/tests/compiler/dart2js_extra/deferred/34219_signature_lib3.dart b/tests/compiler/dart2js_extra/deferred/34219_signature_lib3.dart
index 35915d5..1d12aa6 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_signature_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_signature_lib3.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Part of 34219_signature_test.dart
//
// This library places GeneratedMessage into a different partition to
diff --git a/tests/compiler/dart2js_extra/deferred/34219_signature_test.dart b/tests/compiler/dart2js_extra/deferred/34219_signature_test.dart
index d6c2c05..fc5d240 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_signature_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_signature_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2018, 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.
+
+// @dart = 2.7
// dart2jsOptions=--omit-implicit-checks
// Tests that closure signatures are walked as dependencies of a closure. If the
diff --git a/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_lib.dart b/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_lib.dart
index b3e8677..6be58fd 100644
--- a/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_lib.dart
@@ -2,5 +2,7 @@
// 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.7
+
defaultArg() => "";
myFunction([argumentName = defaultArg]) => argumentName();
diff --git a/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_test.dart b/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_test.dart
index 64c0c20..7e3d96c 100644
--- a/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression test for https://github.com/dart-lang/sdk/issues/30002.
///
/// The compiler used to keep all metadata (other than type information) in one
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_class_library.dart b/tests/compiler/dart2js_extra/deferred/deferred_class_library.dart
index 03dad35..46ee69d 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_class_library.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_class_library.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Imported by deferred_class_test.dart.
library deferred_class_library;
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_class_library2.dart b/tests/compiler/dart2js_extra/deferred/deferred_class_library2.dart
index fecca53..e09654f 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_class_library2.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_class_library2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Imported by deferred_class_test.dart.
library deferred_class_library2;
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
index eb6c836..15698aa 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant2_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant2_test.dart
index 6ea3752..d8f0f11 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant2_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant3_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant3_test.dart
index 14add53..b91934f 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant3_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant4_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant4_test.dart
index af903f4..b14f649 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant4_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant_dependency_evaluation_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant_dependency_evaluation_test.dart
index 49d9558..449773b 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant_dependency_evaluation_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant_dependency_evaluation_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// This is a regression test for dartbug.com/26406. We test that the deferred
// loader analyzer doesn't trip over constant expression evaluation.
//
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_function_library.dart b/tests/compiler/dart2js_extra/deferred/deferred_function_library.dart
index 0eaebc7..120c4a3 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_function_library.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_function_library.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Imported by deferred_function_test.dart and
// deferred_semantics_test.dart.
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
index 88fcbaf..d8e550c 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that loading of a library (with top-level functions only) can
// be deferred.
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_metadata_lib.dart b/tests/compiler/dart2js_extra/deferred/deferred_metadata_lib.dart
index 2bb5573..b973458 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_metadata_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_metadata_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Annotation {
final annotationField;
const Annotation([this.annotationField]);
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_metadata_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_metadata_test.dart
index 03c1b50..62cac10 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_metadata_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_metadata_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression tests to ensure that member metadata is not considered by the
/// deferred loading algorithm, unless mirrors are available.
///
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib2.dart b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib2.dart
index 93f32a0..2e3a238 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
library lib2;
import 'deferred_mirrors2_lazy.dart' deferred as admin;
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib4.dart b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib4.dart
index 2ab9a2a..accf125 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib4.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib4.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'deferred_mirrors2_lib5.dart' show Injectable;
@Injectable()
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib5.dart b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib5.dart
index f970ed0..f449e4d 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib5.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib5.dart
@@ -2,6 +2,8 @@
// 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.7
+
class Injectable {
const Injectable();
}
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib1.dart b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib1.dart
index 7b2bac9..53b0e50 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "deferred_overlapping_lib3.dart";
class C1 extends C3 {}
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib2.dart b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib2.dart
index 5937171..1771c90 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "deferred_overlapping_lib3.dart";
class C2 extends C3 {}
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib3.dart b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib3.dart
index 7a87b7b..5f2e7c7 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib3.dart
@@ -2,4 +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.7
+
class C3 {}
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_test.dart
index f626d58..4703ba7 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "deferred_overlapping_lib1.dart" deferred as lib1;
import "deferred_overlapping_lib2.dart" deferred as lib2;
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart
index 95da996..3719601 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that deferred loader analyzer doesn't trip over unused classes.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/deferred/interface_type_variable_lib.dart b/tests/compiler/dart2js_extra/deferred/interface_type_variable_lib.dart
index fb18b05..fecdc82 100644
--- a/tests/compiler/dart2js_extra/deferred/interface_type_variable_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/interface_type_variable_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {}
class I<T> {}
diff --git a/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart b/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart
index db4b4f2..98af6f7 100644
--- a/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'interface_type_variable_lib.dart' deferred as lib;
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib1.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib1.dart
index 01480aa..3b9163d 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib1.dart
@@ -2,6 +2,8 @@
import 'load_in_correct_order_lib5.dart';
import 'load_in_correct_order_lib7.dart';
+// @dart = 2.7
+
class C1 {
final a;
final b;
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib2.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib2.dart
index 4beadab..92b26b4 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib2.dart
@@ -2,6 +2,8 @@
import 'load_in_correct_order_lib6.dart';
import 'load_in_correct_order_lib7.dart';
+// @dart = 2.7
+
class C2 {
final c;
final d;
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib3.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib3.dart
index 1676e8f..1320396 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib3.dart
@@ -2,6 +2,8 @@
import 'load_in_correct_order_lib6.dart';
import 'load_in_correct_order_lib7.dart';
+// @dart = 2.7
+
class C3 {
final e;
final f;
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib4.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib4.dart
index eed0c5b..e94a037 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib4.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib4.dart
@@ -1,6 +1,8 @@
class C4 {
final value = 499;
const C4();
+
+// @dart = 2.7
}
const c4 = const C4();
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib5.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib5.dart
index 2212525..ca4085f 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib5.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib5.dart
@@ -1,6 +1,8 @@
class C5 {
final value = 500;
const C5();
+
+// @dart = 2.7
}
const c5 = const C5();
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib6.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib6.dart
index 8ee64e7..32f0093 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib6.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib6.dart
@@ -1,6 +1,8 @@
class C6 {
final value = 501;
const C6();
+
+// @dart = 2.7
}
const c6 = const C6();
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib7.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib7.dart
index 8c6f9b5..8056e2f 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib7.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib7.dart
@@ -1,6 +1,8 @@
class C7 {
final value = 502;
const C7();
+
+// @dart = 2.7
}
const c7 = const C7();
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_test.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_test.dart
index dc6727d..9bbf5f9 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// This test creates a scenario to simulate what happens if hunks are loaded
/// out of order. The compiler should initialize hunks in order regardless, but
/// may do so in parallel while some hunks are not loaded yet.
diff --git a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib1.dart b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib1.dart
index 32ed7e6..2f654fe 100644
--- a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
defaultArg1() => 1;
defaultArg2() => 2;
myFunction1({argumentName1: defaultArg1, argumentName2: defaultArg2}) =>
diff --git a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib2.dart b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib2.dart
index eff81f4..62b487e 100644
--- a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
defaultArg3() => 3;
defaultArg4() => 4;
myFunction2({argumentName3: defaultArg3, argumentName4: defaultArg4}) =>
diff --git a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib3.dart b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib3.dart
index dab89a4..1fb289c 100644
--- a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib3.dart
@@ -2,6 +2,8 @@
// 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.7
+
defaultArg3() => "3b";
defaultArg4() => "4b";
myFunction3(positional1, positional2,
diff --git a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_test.dart b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_test.dart
index 37681b9..f356e77 100644
--- a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// This test is indirectly testing invariants of the generated code of dart2js.
/// It ensures that indices to metadata information from **multiple** deferred
/// fragments is kept separate, but that when they are loaded (and the metadata
diff --git a/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib1.dart b/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib1.dart
index 89e8e90..5ae2bbc 100644
--- a/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
topLevelF() => 1;
@MetaA("one")
diff --git a/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib2.dart b/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib2.dart
index 1c46957..930436f 100644
--- a/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
@MetaB("lib")
library foo;
diff --git a/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib1.dart b/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib1.dart
index e87a387..7f4aba9 100644
--- a/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib1.dart
@@ -2,5 +2,7 @@
// 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.7
+
defaultArg1() => 1;
myFunction1([argumentName1 = defaultArg1]) => argumentName1();
diff --git a/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib2.dart b/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib2.dart
index f35642a..22cfd11 100644
--- a/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib2.dart
@@ -2,5 +2,7 @@
// 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.7
+
defaultArg2() => 2;
myFunction2([argumentName2 = defaultArg2]) => argumentName2();
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart
index 388f0d3..d5520d5 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'shared_constant_shared.dart' deferred as d;
doA() async {
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart
index 177f50e..655a93b 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'shared_constant_shared.dart' deferred as d;
doB() async {
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart
index b64972e..aef7eff 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart
@@ -2,6 +2,8 @@
// 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.7
+
class C {
const C();
method() => print("1");
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart
index a801718..cc3bc23 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'shared_constant_c.dart';
const constant = const C(); // using `var` eludes the problem.
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart
index 3614147..d01b67f 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression test for issue https://github.com/dart-lang/sdk/issues/31306.
///
/// When 1 constant was imported in two libraries by using the same exact
diff --git a/tests/compiler/dart2js_extra/deferred/type_literal_lib.dart b/tests/compiler/dart2js_extra/deferred/type_literal_lib.dart
index 867c399..105162f 100644
--- a/tests/compiler/dart2js_extra/deferred/type_literal_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/type_literal_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {}
class B {}
diff --git a/tests/compiler/dart2js_extra/deferred/type_literal_test.dart b/tests/compiler/dart2js_extra/deferred/type_literal_test.dart
index 25e2c32..79c7b29 100644
--- a/tests/compiler/dart2js_extra/deferred/type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/type_literal_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for Issue #33890.
//
// This fails if type literal constants are not deferred, but their RTI
diff --git a/tests/compiler/dart2js_extra/deferred/typedef_lib.dart b/tests/compiler/dart2js_extra/deferred/typedef_lib.dart
index 2bccab5..70b7740 100644
--- a/tests/compiler/dart2js_extra/deferred/typedef_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/typedef_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {}
class B {}
diff --git a/tests/compiler/dart2js_extra/deferred/typedef_test.dart b/tests/compiler/dart2js_extra/deferred/typedef_test.dart
index fa4cc1f..3c45d81 100644
--- a/tests/compiler/dart2js_extra/deferred/typedef_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/typedef_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for Issue #33890.
//
// This fails if type literal constants are not deferred, but their RTI
diff --git a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_lib.dart b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_lib.dart
index 2af788d..4780e81 100644
--- a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
// All of these types are considered instantiated because we create an instance
// of [C].
diff --git a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart
index 3bd8b77..1d6c2f2 100644
--- a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'uninstantiated_type_variable_lib.dart' deferred as lib;
diff --git a/tests/compiler/dart2js_extra/deferred_custom_loader_lib.dart b/tests/compiler/dart2js_extra/deferred_custom_loader_lib.dart
index e863607..4cf1b9d 100644
--- a/tests/compiler/dart2js_extra/deferred_custom_loader_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_custom_loader_lib.dart
@@ -2,4 +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.7
+
foo() => 499;
diff --git a/tests/compiler/dart2js_extra/deferred_custom_loader_test.dart b/tests/compiler/dart2js_extra/deferred_custom_loader_test.dart
index d1f358e..50c9e97 100644
--- a/tests/compiler/dart2js_extra/deferred_custom_loader_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_custom_loader_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'dart:_foreign_helper' show JS;
diff --git a/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart b/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart
index 48fbce6..606c26e 100644
--- a/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
foo() {
return "loaded";
}
diff --git a/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart b/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart
index 5dc34c5..23a6caa 100644
--- a/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that when a deferred import fails to load, it is possible to retry.
import "deferred_fail_and_retry_lib.dart" deferred as lib;
diff --git a/tests/compiler/dart2js_extra/deferred_function_types1_test.dart b/tests/compiler/dart2js_extra/deferred_function_types1_test.dart
index 91c9075..2e853e1 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types1_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types2_test.dart b/tests/compiler/dart2js_extra/deferred_function_types2_test.dart
index 4336421..586e1b8 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types2_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types3_test.dart b/tests/compiler/dart2js_extra/deferred_function_types3_test.dart
index 98a6de8..10d69f4 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types3_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types4_test.dart b/tests/compiler/dart2js_extra/deferred_function_types4_test.dart
index fc78d96..27fedbc 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types4_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types5_test.dart b/tests/compiler/dart2js_extra/deferred_function_types5_test.dart
index 998d678..75b04e3 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types5_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types6_test.dart b/tests/compiler/dart2js_extra/deferred_function_types6_test.dart
index 2423b52..0a1b2a7 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types6_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types7_test.dart b/tests/compiler/dart2js_extra/deferred_function_types7_test.dart
index fe7c49e..ba16f2e 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types7_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types8_test.dart b/tests/compiler/dart2js_extra/deferred_function_types8_test.dart
index 7222ef5..f6624a1 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types8_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types8_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types_lib1.dart b/tests/compiler/dart2js_extra/deferred_function_types_lib1.dart
index 8a3a06f..da32827 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types_lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
method1() {
return (int i) => i;
}
diff --git a/tests/compiler/dart2js_extra/deferred_function_types_lib2.dart b/tests/compiler/dart2js_extra/deferred_function_types_lib2.dart
index a209dac..2ab9a1c 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
method2() {
return (String s) => s;
}
diff --git a/tests/compiler/dart2js_extra/deferred_inheritance_test.dart b/tests/compiler/dart2js_extra/deferred_inheritance_test.dart
index 2443682..0373907 100644
--- a/tests/compiler/dart2js_extra/deferred_inheritance_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_inheritance_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression test for --fast-startup. The compiler used to emit inherit calls
/// on each fragment even for classes that were already loaded on a different
/// fragment. As a result, the inheritance chain was overwritten in non-chrome
diff --git a/tests/compiler/dart2js_extra/deferred_split_lib1.dart b/tests/compiler/dart2js_extra/deferred_split_lib1.dart
index 195357a..9f80990 100644
--- a/tests/compiler/dart2js_extra/deferred_split_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred_split_lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Library loaded eagerly by deferred_split_test.dart
class A<T> {}
diff --git a/tests/compiler/dart2js_extra/deferred_split_lib2.dart b/tests/compiler/dart2js_extra/deferred_split_lib2.dart
index d690e31..a97fef1 100644
--- a/tests/compiler/dart2js_extra/deferred_split_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred_split_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Deferred library loaded by deferred_split_test.dart
import 'deferred_split_lib1.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_split_test.dart b/tests/compiler/dart2js_extra/deferred_split_test.dart
index 0459349..9b47f7d 100644
--- a/tests/compiler/dart2js_extra/deferred_split_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_split_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression for issue 23853: we used to incorrectly split and put a type in a
/// deferred hunk if the type was used explicitly in the deferred library and
/// was used only in a generic type in the main library.
diff --git a/tests/compiler/dart2js_extra/deferred_tearoff_load_library_lib.dart b/tests/compiler/dart2js_extra/deferred_tearoff_load_library_lib.dart
index 472c977..76dc8d1 100644
--- a/tests/compiler/dart2js_extra/deferred_tearoff_load_library_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_tearoff_load_library_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
foo() {
return "loaded";
}
diff --git a/tests/compiler/dart2js_extra/deferred_tearoff_load_library_test.dart b/tests/compiler/dart2js_extra/deferred_tearoff_load_library_test.dart
index 5dbcf88..f4510e9 100644
--- a/tests/compiler/dart2js_extra/deferred_tearoff_load_library_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_tearoff_load_library_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that tearoffs of `loadLibrary` work properly.
//
// The CFE chooses a non identifier name for `loadLibrary` methods, this test
diff --git a/tests/compiler/dart2js_extra/deferred_with_cross_origin_lib.dart b/tests/compiler/dart2js_extra/deferred_with_cross_origin_lib.dart
index 48fbce6..606c26e 100644
--- a/tests/compiler/dart2js_extra/deferred_with_cross_origin_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_cross_origin_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
foo() {
return "loaded";
}
diff --git a/tests/compiler/dart2js_extra/deferred_with_cross_origin_test.dart b/tests/compiler/dart2js_extra/deferred_with_cross_origin_test.dart
index 51c10cf..76a85b4 100644
--- a/tests/compiler/dart2js_extra/deferred_with_cross_origin_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_cross_origin_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that code loaded via deferred imports uses the same crossorigin value as
// the main page.
diff --git a/tests/compiler/dart2js_extra/deferred_with_csp_nonce2_test.dart b/tests/compiler/dart2js_extra/deferred_with_csp_nonce2_test.dart
index 5d6f596..b21858e 100644
--- a/tests/compiler/dart2js_extra/deferred_with_csp_nonce2_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_csp_nonce2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that code loaded via deferred imports uses the same nonce value as the
// main page.
diff --git a/tests/compiler/dart2js_extra/deferred_with_csp_nonce_lib.dart b/tests/compiler/dart2js_extra/deferred_with_csp_nonce_lib.dart
index 48fbce6..606c26e 100644
--- a/tests/compiler/dart2js_extra/deferred_with_csp_nonce_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_csp_nonce_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
foo() {
return "loaded";
}
diff --git a/tests/compiler/dart2js_extra/deferred_with_csp_nonce_test.dart b/tests/compiler/dart2js_extra/deferred_with_csp_nonce_test.dart
index 2725df8..8409c2b 100644
--- a/tests/compiler/dart2js_extra/deferred_with_csp_nonce_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_csp_nonce_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that code loaded via deferred imports uses the same nonce value as the
// main page.
diff --git a/tests/compiler/dart2js_extra/do_test.dart b/tests/compiler/dart2js_extra/do_test.dart
index 2b7abc0..ecc3ce9 100644
--- a/tests/compiler/dart2js_extra/do_test.dart
+++ b/tests/compiler/dart2js_extra/do_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void do1() {
diff --git a/tests/compiler/dart2js_extra/dummy_compiler_test.dart b/tests/compiler/dart2js_extra/dummy_compiler_test.dart
index 0c13dbb..0505deb 100644
--- a/tests/compiler/dart2js_extra/dummy_compiler_test.dart
+++ b/tests/compiler/dart2js_extra/dummy_compiler_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Tests that the dart2js compiler can be run in a js engine. This ensures that
// the internal compiler APIs have no dependency on dart:io.
library dummy_compiler;
diff --git a/tests/compiler/dart2js_extra/dynamic_bounds_check_test.dart b/tests/compiler/dart2js_extra/dynamic_bounds_check_test.dart
index 9593aea..fb443f8 100644
--- a/tests/compiler/dart2js_extra/dynamic_bounds_check_test.dart
+++ b/tests/compiler/dart2js_extra/dynamic_bounds_check_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class Foo {}
diff --git a/tests/compiler/dart2js_extra/dynamic_invocation_test.dart b/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
index 28bfdb3..a234108 100644
--- a/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
+++ b/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class C1 {
diff --git a/tests/compiler/dart2js_extra/dynamic_type_literal_test.dart b/tests/compiler/dart2js_extra/dynamic_type_literal_test.dart
index 3231717..e78d113 100644
--- a/tests/compiler/dart2js_extra/dynamic_type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/dynamic_type_literal_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks
// Test generation of 'dynamic' type literals.
diff --git a/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart b/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart
index 6c9c18b..78a87bb 100644
--- a/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart
+++ b/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
_field4() => 4;
diff --git a/tests/compiler/dart2js_extra/effectively_constant_instance_field_test.dart b/tests/compiler/dart2js_extra/effectively_constant_instance_field_test.dart
index 94020a2..fa1b315 100644
--- a/tests/compiler/dart2js_extra/effectively_constant_instance_field_test.dart
+++ b/tests/compiler/dart2js_extra/effectively_constant_instance_field_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--omit-implicit-checks
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/empty_method_test.dart b/tests/compiler/dart2js_extra/empty_method_test.dart
index 7bd2791..7bc26bb 100644
--- a/tests/compiler/dart2js_extra/empty_method_test.dart
+++ b/tests/compiler/dart2js_extra/empty_method_test.dart
@@ -2,4 +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.7
+
void main() {}
diff --git a/tests/compiler/dart2js_extra/eof_line_ending_test.dart b/tests/compiler/dart2js_extra/eof_line_ending_test.dart
index dafba6c..6ff3098 100644
--- a/tests/compiler/dart2js_extra/eof_line_ending_test.dart
+++ b/tests/compiler/dart2js_extra/eof_line_ending_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2018, 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.
+
+// @dart = 2.7
// Regression test derived from language/issue_1578_test.dart with Windows
// line encoding.
diff --git a/tests/compiler/dart2js_extra/equals_test.dart b/tests/compiler/dart2js_extra/equals_test.dart
index c4a5309..e19f6df 100644
--- a/tests/compiler/dart2js_extra/equals_test.dart
+++ b/tests/compiler/dart2js_extra/equals_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
var x = 3;
if (x == x) {
diff --git a/tests/compiler/dart2js_extra/expose_this1_test.dart b/tests/compiler/dart2js_extra/expose_this1_test.dart
index 84d3e70..363820e 100644
--- a/tests/compiler/dart2js_extra/expose_this1_test.dart
+++ b/tests/compiler/dart2js_extra/expose_this1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for dart2js inference. Class.field6b should be known to be
// potentially `null`.
diff --git a/tests/compiler/dart2js_extra/expose_this2_test.dart b/tests/compiler/dart2js_extra/expose_this2_test.dart
index d83abda..cc1424d 100644
--- a/tests/compiler/dart2js_extra/expose_this2_test.dart
+++ b/tests/compiler/dart2js_extra/expose_this2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for dart2js inference. Class9.field9b should be known to be
// potentially `null`.
diff --git a/tests/compiler/dart2js_extra/extract_type_arguments_1_test.dart b/tests/compiler/dart2js_extra/extract_type_arguments_1_test.dart
index 74d5081..16852f0 100644
--- a/tests/compiler/dart2js_extra/extract_type_arguments_1_test.dart
+++ b/tests/compiler/dart2js_extra/extract_type_arguments_1_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2018, 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.
+
+// @dart = 2.7
// dart2jsOptions=--omit-implicit-checks
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/extract_type_arguments_2_test.dart b/tests/compiler/dart2js_extra/extract_type_arguments_2_test.dart
index bf8c2f9..da7548c 100644
--- a/tests/compiler/dart2js_extra/extract_type_arguments_2_test.dart
+++ b/tests/compiler/dart2js_extra/extract_type_arguments_2_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2018, 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.
+
+// @dart = 2.7
// dart2jsOptions=--omit-implicit-checks
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/extract_type_arguments_3_test.dart b/tests/compiler/dart2js_extra/extract_type_arguments_3_test.dart
index 10fa04a..c6ef560 100644
--- a/tests/compiler/dart2js_extra/extract_type_arguments_3_test.dart
+++ b/tests/compiler/dart2js_extra/extract_type_arguments_3_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2018, 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.
+
+// @dart = 2.7
// dart2jsOptions=--omit-implicit-checks
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/field_access_test.dart b/tests/compiler/dart2js_extra/field_access_test.dart
index 044baf4..18ec93a 100644
--- a/tests/compiler/dart2js_extra/field_access_test.dart
+++ b/tests/compiler/dart2js_extra/field_access_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test the all variants of field/property access/update are emitted.
//
// This is needed because getter/setters are now registered as read from and
diff --git a/tests/compiler/dart2js_extra/field_in_constructor_test.dart b/tests/compiler/dart2js_extra/field_in_constructor_test.dart
index 29d1d66..895a80e 100644
--- a/tests/compiler/dart2js_extra/field_in_constructor_test.dart
+++ b/tests/compiler/dart2js_extra/field_in_constructor_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/field_initializer_test.dart b/tests/compiler/dart2js_extra/field_initializer_test.dart
index b06f763..31efa81 100644
--- a/tests/compiler/dart2js_extra/field_initializer_test.dart
+++ b/tests/compiler/dart2js_extra/field_initializer_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/fields_test.dart b/tests/compiler/dart2js_extra/fields_test.dart
index 95c2ca3..bb773d7 100644
--- a/tests/compiler/dart2js_extra/fields_test.dart
+++ b/tests/compiler/dart2js_extra/fields_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart b/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart
index 06e43bd..92637ae 100644
--- a/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart
+++ b/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Check that Type instances work with maps. This behavior is not required by
diff --git a/tests/compiler/dart2js_extra/fixed_type_argument_implements_test.dart b/tests/compiler/dart2js_extra/fixed_type_argument_implements_test.dart
index f0c397e..cd3b180 100644
--- a/tests/compiler/dart2js_extra/fixed_type_argument_implements_test.dart
+++ b/tests/compiler/dart2js_extra/fixed_type_argument_implements_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that we emit the relation between B and A even when B is only live
// as a type argument through the supertype of D.
diff --git a/tests/compiler/dart2js_extra/fixed_type_argument_test.dart b/tests/compiler/dart2js_extra/fixed_type_argument_test.dart
index 74ac892..384c76b 100644
--- a/tests/compiler/dart2js_extra/fixed_type_argument_test.dart
+++ b/tests/compiler/dart2js_extra/fixed_type_argument_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that we emit the relation between B and A even when B is only live
// as a type argument through the superclass of D.
diff --git a/tests/compiler/dart2js_extra/foo7_test.dart b/tests/compiler/dart2js_extra/foo7_test.dart
index dc93acf..97dcbfd 100644
--- a/tests/compiler/dart2js_extra/foo7_test.dart
+++ b/tests/compiler/dart2js_extra/foo7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
print(foo());
}
diff --git a/tests/compiler/dart2js_extra/for_in_test.dart b/tests/compiler/dart2js_extra/for_in_test.dart
index 8f0eb15..023d5ae 100644
--- a/tests/compiler/dart2js_extra/for_in_test.dart
+++ b/tests/compiler/dart2js_extra/for_in_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "dart:collection";
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/for_test.dart b/tests/compiler/dart2js_extra/for_test.dart
index fc910be..a585bfb 100644
--- a/tests/compiler/dart2js_extra/for_test.dart
+++ b/tests/compiler/dart2js_extra/for_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void for1() {
diff --git a/tests/compiler/dart2js_extra/function_parameters_test.dart b/tests/compiler/dart2js_extra/function_parameters_test.dart
index 1632fb6..377fc66 100644
--- a/tests/compiler/dart2js_extra/function_parameters_test.dart
+++ b/tests/compiler/dart2js_extra/function_parameters_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
print(foo(3) + foo(4));
}
diff --git a/tests/compiler/dart2js_extra/function_typed_arguments_test.dart b/tests/compiler/dart2js_extra/function_typed_arguments_test.dart
index f18daee..a441003 100644
--- a/tests/compiler/dart2js_extra/function_typed_arguments_test.dart
+++ b/tests/compiler/dart2js_extra/function_typed_arguments_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--omit-implicit-checks
// Test type tests of function types used a type argument.
diff --git a/tests/compiler/dart2js_extra/generator_elided_parameter_test.dart b/tests/compiler/dart2js_extra/generator_elided_parameter_test.dart
index 60bf18b..169940d 100644
--- a/tests/compiler/dart2js_extra/generator_elided_parameter_test.dart
+++ b/tests/compiler/dart2js_extra/generator_elided_parameter_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Test that optional arguments of methods with a generator are forwarded
/// properly when optional parameters are elided.
///
diff --git a/tests/compiler/dart2js_extra/generic_bounds_test.dart b/tests/compiler/dart2js_extra/generic_bounds_test.dart
index 0b9cacb..b23d8df 100644
--- a/tests/compiler/dart2js_extra/generic_bounds_test.dart
+++ b/tests/compiler/dart2js_extra/generic_bounds_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_class_is_test.dart b/tests/compiler/dart2js_extra/generic_class_is_test.dart
index 6026b8d..3db6f87 100644
--- a/tests/compiler/dart2js_extra/generic_class_is_test.dart
+++ b/tests/compiler/dart2js_extra/generic_class_is_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class A<T> {}
diff --git a/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart b/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart
index 6018432..045d314 100644
--- a/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart
+++ b/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Ensure that we prepare type variables for inlined mixin fields.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_in_redirect_test.dart b/tests/compiler/dart2js_extra/generic_in_redirect_test.dart
index 35e4564..fd289bf 100644
--- a/tests/compiler/dart2js_extra/generic_in_redirect_test.dart
+++ b/tests/compiler/dart2js_extra/generic_in_redirect_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Ensure that we prepare type variables for inlined redirecting constructor
// calls.
diff --git a/tests/compiler/dart2js_extra/generic_in_super_test.dart b/tests/compiler/dart2js_extra/generic_in_super_test.dart
index 79bc8c9..77f6856 100644
--- a/tests/compiler/dart2js_extra/generic_in_super_test.dart
+++ b/tests/compiler/dart2js_extra/generic_in_super_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Ensure that we prepare type variables for inlined super constructor calls.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_instantiation1_test.dart b/tests/compiler/dart2js_extra/generic_instantiation1_test.dart
index fcfb79f..c790136 100644
--- a/tests/compiler/dart2js_extra/generic_instantiation1_test.dart
+++ b/tests/compiler/dart2js_extra/generic_instantiation1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js_extra/generic_instantiation2_test.dart b/tests/compiler/dart2js_extra/generic_instantiation2_test.dart
index 047d221..886b69a 100644
--- a/tests/compiler/dart2js_extra/generic_instantiation2_test.dart
+++ b/tests/compiler/dart2js_extra/generic_instantiation2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks
int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js_extra/generic_instantiation3_test.dart b/tests/compiler/dart2js_extra/generic_instantiation3_test.dart
index 3152565..8ab46fd 100644
--- a/tests/compiler/dart2js_extra/generic_instantiation3_test.dart
+++ b/tests/compiler/dart2js_extra/generic_instantiation3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_instantiation4_test.dart b/tests/compiler/dart2js_extra/generic_instantiation4_test.dart
index d5f8eb9..3091874 100644
--- a/tests/compiler/dart2js_extra/generic_instantiation4_test.dart
+++ b/tests/compiler/dart2js_extra/generic_instantiation4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart b/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart
index ff95b2b..474114a 100644
--- a/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart
+++ b/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class A {}
diff --git a/tests/compiler/dart2js_extra/generic_method_dynamic_type_test.dart b/tests/compiler/dart2js_extra/generic_method_dynamic_type_test.dart
index ab7221d..6912246 100644
--- a/tests/compiler/dart2js_extra/generic_method_dynamic_type_test.dart
+++ b/tests/compiler/dart2js_extra/generic_method_dynamic_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class C<CT> {
diff --git a/tests/compiler/dart2js_extra/generic_method_static_is_test.dart b/tests/compiler/dart2js_extra/generic_method_static_is_test.dart
index c05be8c..dfa6211 100644
--- a/tests/compiler/dart2js_extra/generic_method_static_is_test.dart
+++ b/tests/compiler/dart2js_extra/generic_method_static_is_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class A {}
diff --git a/tests/compiler/dart2js_extra/generic_type_error_message_test.dart b/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
index e9ff104..c09fbf0 100644
--- a/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
+++ b/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generics_factories_test.dart b/tests/compiler/dart2js_extra/generics_factories_test.dart
index 5ca2d59..e36626e 100644
--- a/tests/compiler/dart2js_extra/generics_factories_test.dart
+++ b/tests/compiler/dart2js_extra/generics_factories_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that factories are marked as needing rti.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/generics_is_check1_test.dart b/tests/compiler/dart2js_extra/generics_is_check1_test.dart
index 24d01e5..6921c3f 100644
--- a/tests/compiler/dart2js_extra/generics_is_check1_test.dart
+++ b/tests/compiler/dart2js_extra/generics_is_check1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class Hest<X> {}
diff --git a/tests/compiler/dart2js_extra/getter_element_test.dart b/tests/compiler/dart2js_extra/getter_element_test.dart
index 9238e8f..92939c0 100644
--- a/tests/compiler/dart2js_extra/getter_element_test.dart
+++ b/tests/compiler/dart2js_extra/getter_element_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/getters_setters_test.dart b/tests/compiler/dart2js_extra/getters_setters_test.dart
index 139f366..7a43760 100644
--- a/tests/compiler/dart2js_extra/getters_setters_test.dart
+++ b/tests/compiler/dart2js_extra/getters_setters_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class GettersSettersTest {
diff --git a/tests/compiler/dart2js_extra/hash_code_test.dart b/tests/compiler/dart2js_extra/hash_code_test.dart
index cb6789c..219fe34 100644
--- a/tests/compiler/dart2js_extra/hash_code_test.dart
+++ b/tests/compiler/dart2js_extra/hash_code_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// dart2js specific test to make sure hashCode on intercepted types behaves as
diff --git a/tests/compiler/dart2js_extra/identical_trace_test.dart b/tests/compiler/dart2js_extra/identical_trace_test.dart
index 8fc86cb..6b24f02f 100644
--- a/tests/compiler/dart2js_extra/identical_trace_test.dart
+++ b/tests/compiler/dart2js_extra/identical_trace_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
main() {
diff --git a/tests/compiler/dart2js_extra/if_in_loop_test.dart b/tests/compiler/dart2js_extra/if_in_loop_test.dart
index af3590d..98603bd 100644
--- a/tests/compiler/dart2js_extra/if_in_loop_test.dart
+++ b/tests/compiler/dart2js_extra/if_in_loop_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Test for bug in code generation of if-with-aborting-branch-inside-loop.
diff --git a/tests/compiler/dart2js_extra/if_null2_test.dart b/tests/compiler/dart2js_extra/if_null2_test.dart
index a9923a8..907799a 100644
--- a/tests/compiler/dart2js_extra/if_null2_test.dart
+++ b/tests/compiler/dart2js_extra/if_null2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression for #24134: inference was not tracking ??= correctly.
library tests.compiler.dart2js_extra.if_null2_test;
diff --git a/tests/compiler/dart2js_extra/if_null3_test.dart b/tests/compiler/dart2js_extra/if_null3_test.dart
index dac99e0..49383c1 100644
--- a/tests/compiler/dart2js_extra/if_null3_test.dart
+++ b/tests/compiler/dart2js_extra/if_null3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression for #24135: inference was not tracking `[]??=` correctly.
library tests.compiler.dart2js_extra.if_null3_test;
diff --git a/tests/compiler/dart2js_extra/if_null_test.dart b/tests/compiler/dart2js_extra/if_null_test.dart
index 8b16c6b..b7f28a9 100644
--- a/tests/compiler/dart2js_extra/if_null_test.dart
+++ b/tests/compiler/dart2js_extra/if_null_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js_extra/if_test.dart b/tests/compiler/dart2js_extra/if_test.dart
index 3c1670b..cead13c 100644
--- a/tests/compiler/dart2js_extra/if_test.dart
+++ b/tests/compiler/dart2js_extra/if_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
int if1() {
diff --git a/tests/compiler/dart2js_extra/index_test.dart b/tests/compiler/dart2js_extra/index_test.dart
index 890d71a..5e7af77 100644
--- a/tests/compiler/dart2js_extra/index_test.dart
+++ b/tests/compiler/dart2js_extra/index_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
main() {
diff --git a/tests/compiler/dart2js_extra/indirect_type_literal_test.dart b/tests/compiler/dart2js_extra/indirect_type_literal_test.dart
index 8929796..c1b27cb 100644
--- a/tests/compiler/dart2js_extra/indirect_type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/indirect_type_literal_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/inference_super_set_call_test.dart b/tests/compiler/dart2js_extra/inference_super_set_call_test.dart
index 19e1a06..be138ad 100644
--- a/tests/compiler/dart2js_extra/inference_super_set_call_test.dart
+++ b/tests/compiler/dart2js_extra/inference_super_set_call_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for dart2js: we incorrectly modeled `super.x = rhs` as a
// call and not an assignment, so the type of the expression was incorrectly
// assumed to be the return type of the setter rather than the type of the rhs.
diff --git a/tests/compiler/dart2js_extra/inferrer_is_int_test.dart b/tests/compiler/dart2js_extra/inferrer_is_int_test.dart
index fe3e397..056fec6 100644
--- a/tests/compiler/dart2js_extra/inferrer_is_int_test.dart
+++ b/tests/compiler/dart2js_extra/inferrer_is_int_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that dart2js's inferrer and code optimizers know a double
// literal might become an int at runtime.
diff --git a/tests/compiler/dart2js_extra/injected_cast_test.dart b/tests/compiler/dart2js_extra/injected_cast_test.dart
index 3ab671c..b2c8334 100644
--- a/tests/compiler/dart2js_extra/injected_cast_test.dart
+++ b/tests/compiler/dart2js_extra/injected_cast_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
var field;
diff --git a/tests/compiler/dart2js_extra/inline_generic_test.dart b/tests/compiler/dart2js_extra/inline_generic_test.dart
index a5a8c38..aa621b6 100644
--- a/tests/compiler/dart2js_extra/inline_generic_test.dart
+++ b/tests/compiler/dart2js_extra/inline_generic_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Test that inlining of constructors with `double` as type argument registers
/// that double is need for checking passed values.
diff --git a/tests/compiler/dart2js_extra/inline_position_crash_source.dart b/tests/compiler/dart2js_extra/inline_position_crash_source.dart
index 67194b8..ca43679 100644
--- a/tests/compiler/dart2js_extra/inline_position_crash_source.dart
+++ b/tests/compiler/dart2js_extra/inline_position_crash_source.dart
@@ -2,6 +2,8 @@
// 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.7
+
part of inline_position_crash_test;
/*******************************************************************************
diff --git a/tests/compiler/dart2js_extra/inline_position_crash_test.dart b/tests/compiler/dart2js_extra/inline_position_crash_test.dart
index 54f58b2..6f5d182 100644
--- a/tests/compiler/dart2js_extra/inline_position_crash_test.dart
+++ b/tests/compiler/dart2js_extra/inline_position_crash_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library inline_position_crash_test;
part 'inline_position_crash_source.dart';
diff --git a/tests/compiler/dart2js_extra/instantiation_stub_2_test.dart b/tests/compiler/dart2js_extra/instantiation_stub_2_test.dart
index 49dfcaf..7c83a4c 100644
--- a/tests/compiler/dart2js_extra/instantiation_stub_2_test.dart
+++ b/tests/compiler/dart2js_extra/instantiation_stub_2_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2018, 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.
+
+// @dart = 2.7
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/instantiation_stub_test.dart b/tests/compiler/dart2js_extra/instantiation_stub_test.dart
index 23003bc..8522498 100644
--- a/tests/compiler/dart2js_extra/instantiation_stub_test.dart
+++ b/tests/compiler/dart2js_extra/instantiation_stub_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/int_index_test.dart b/tests/compiler/dart2js_extra/int_index_test.dart
index 629338b..d3f07e6 100644
--- a/tests/compiler/dart2js_extra/int_index_test.dart
+++ b/tests/compiler/dart2js_extra/int_index_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
main() {
var a = [0, 1];
a[1.2]; // //# 01: compile-time error
diff --git a/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart b/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart
index 407ac93..46d709c 100644
--- a/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart
+++ b/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the proper one-shot interceptor is used for different
// combinations of named arguments.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/interface_type_optimization_test.dart b/tests/compiler/dart2js_extra/interface_type_optimization_test.dart
index 0beb4f4..a2963a9 100644
--- a/tests/compiler/dart2js_extra/interface_type_optimization_test.dart
+++ b/tests/compiler/dart2js_extra/interface_type_optimization_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
main() {
diff --git a/tests/compiler/dart2js_extra/invalid_annotation_test.dart b/tests/compiler/dart2js_extra/invalid_annotation_test.dart
index fe68503..0e23538 100644
--- a/tests/compiler/dart2js_extra/invalid_annotation_test.dart
+++ b/tests/compiler/dart2js_extra/invalid_annotation_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for http://dartbug.com/23893
//
// Because annotations are parsed lazily, dart2js used to crash when an
diff --git a/tests/compiler/dart2js_extra/invoke_dynamic_test.dart b/tests/compiler/dart2js_extra/invoke_dynamic_test.dart
index 65239f6..26616b2 100644
--- a/tests/compiler/dart2js_extra/invoke_dynamic_test.dart
+++ b/tests/compiler/dart2js_extra/invoke_dynamic_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/is_check_instanceof_test.dart b/tests/compiler/dart2js_extra/is_check_instanceof_test.dart
index 7e9c8a4..8db9f12 100644
--- a/tests/compiler/dart2js_extra/is_check_instanceof_test.dart
+++ b/tests/compiler/dart2js_extra/is_check_instanceof_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// It is sometimes possible to compile is-checks to 'instanceof', when the class
diff --git a/tests/compiler/dart2js_extra/is_operator_test.dart b/tests/compiler/dart2js_extra/is_operator_test.dart
index bc18d7b9..8c4c714 100644
--- a/tests/compiler/dart2js_extra/is_operator_test.dart
+++ b/tests/compiler/dart2js_extra/is_operator_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {}
diff --git a/tests/compiler/dart2js_extra/issue36562_test.dart b/tests/compiler/dart2js_extra/issue36562_test.dart
index cd43f16..eac7cb4 100644
--- a/tests/compiler/dart2js_extra/issue36562_test.dart
+++ b/tests/compiler/dart2js_extra/issue36562_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
const int x = 0;
const List<int> l = const [
diff --git a/tests/compiler/dart2js_extra/js_array_index_error_test.dart b/tests/compiler/dart2js_extra/js_array_index_error_test.dart
index 8af893a..5975a0b 100644
--- a/tests/compiler/dart2js_extra/js_array_index_error_test.dart
+++ b/tests/compiler/dart2js_extra/js_array_index_error_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that optimized JSArray indexers generate the same error as dynamically
// dispatched calls.
diff --git a/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart b/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart
index 5241f55..9ea4d8e 100644
--- a/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart
+++ b/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that optimized JSArray removeLast() calls generate the same error as
// dynamically dispatched calls.
diff --git a/tests/compiler/dart2js_extra/js_array_sort_default_test.dart b/tests/compiler/dart2js_extra/js_array_sort_default_test.dart
index 8f4e161..94f2a4d 100644
--- a/tests/compiler/dart2js_extra/js_array_sort_default_test.dart
+++ b/tests/compiler/dart2js_extra/js_array_sort_default_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Tests that the default comparable function in JSArray.sort has a valid
/// strong-mode type.
void main() {
diff --git a/tests/compiler/dart2js_extra/js_interop_cast_test.dart b/tests/compiler/dart2js_extra/js_interop_cast_test.dart
index 28c018a..7ce0d63 100644
--- a/tests/compiler/dart2js_extra/js_interop_cast_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_cast_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that we don't crash on computing js-interop classes when metadata
// constants contain implicit casts.
//
diff --git a/tests/compiler/dart2js_extra/js_interop_implements_test.dart b/tests/compiler/dart2js_extra/js_interop_implements_test.dart
index a4c8a72..6c22db8 100644
--- a/tests/compiler/dart2js_extra/js_interop_implements_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_implements_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that methods implemented (not extended) in js-interop classes are still
// considered live.
diff --git a/tests/compiler/dart2js_extra/js_interop_no_elide_optional_arg_test.dart b/tests/compiler/dart2js_extra/js_interop_no_elide_optional_arg_test.dart
index 5d6d913..aa43f70 100644
--- a/tests/compiler/dart2js_extra/js_interop_no_elide_optional_arg_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_no_elide_optional_arg_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Test that optional arguments of js-interop factory constructors are not
/// elided.
/// This is a regression test for issue 35916
diff --git a/tests/compiler/dart2js_extra/js_interop_optional_arg_test.dart b/tests/compiler/dart2js_extra/js_interop_optional_arg_test.dart
index 4c50389..9547374 100644
--- a/tests/compiler/dart2js_extra/js_interop_optional_arg_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_optional_arg_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Test that optional arguments of js-interop constructors are not passed
/// explicitly when missing.
///
diff --git a/tests/compiler/dart2js_extra/js_interop_test.dart b/tests/compiler/dart2js_extra/js_interop_test.dart
index 77478b1..9de19d3 100644
--- a/tests/compiler/dart2js_extra/js_interop_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:js/js.dart";
import "package:expect/expect.dart";
import "dart:js" as js;
diff --git a/tests/compiler/dart2js_extra/jsinterop_test.dart b/tests/compiler/dart2js_extra/jsinterop_test.dart
index 07798e5..b9fb820 100644
--- a/tests/compiler/dart2js_extra/jsinterop_test.dart
+++ b/tests/compiler/dart2js_extra/jsinterop_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// TODO(johnniwinther): Share this test with ddc.
// Test for positive and negative uses of js-interop declarations in a library
diff --git a/tests/compiler/dart2js_extra/label_test.dart b/tests/compiler/dart2js_extra/label_test.dart
index d31cb35..3fbd81d 100644
--- a/tests/compiler/dart2js_extra/label_test.dart
+++ b/tests/compiler/dart2js_extra/label_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// A break label must be declared where it's used.
undeclaredBreakLabel1() {
foo: { break bar; break foo; } // //# 01: compile-time error
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart
index 8f9836f..5c5fc20 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart
index 56afe25..2471193 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart
index 673211e..1db6646 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart
index 73b72b3..2a7eee3 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart
index ecad991..91a02a9 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart
index 23641eb..1283d49 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart
index 129dcca..5677d21 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart
index 7a1142d..578f043 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
index 40b9f69..fccddbf 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
index 6425113..1fb26ab 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart
index 1d244c0..bc1f41e 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string --experiment-new-rti
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart
index c95cf29..1dc36ae 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart
index cd87fa4..98d2063 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart
index 899a217..c197058 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart
index 6d77543..2fe0294 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart
index 6ef574d..02638dc 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart
index 0883581..c37c733 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart
index c9911a5..92fc4af 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart
index bf77141..99218fb 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
index 26ba4e8..0e4d623 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/list_factory_test.dart b/tests/compiler/dart2js_extra/list_factory_test.dart
index b58c925..3f1885d 100644
--- a/tests/compiler/dart2js_extra/list_factory_test.dart
+++ b/tests/compiler/dart2js_extra/list_factory_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
main() {
diff --git a/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart b/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart
index e30bce9..737b2ab 100644
--- a/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart
+++ b/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Note: This test relies on LF line endings in the source file.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/literals_test.dart b/tests/compiler/dart2js_extra/literals_test.dart
index 0de857c..b77b5cc 100644
--- a/tests/compiler/dart2js_extra/literals_test.dart
+++ b/tests/compiler/dart2js_extra/literals_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
print(3 + 4 + 5);
print(3.0 + 4.0 + 5.0);
diff --git a/tests/compiler/dart2js_extra/local_function_call2_test.dart b/tests/compiler/dart2js_extra/local_function_call2_test.dart
index 3199e66..8c6f373 100644
--- a/tests/compiler/dart2js_extra/local_function_call2_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_call2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for issue 31333.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/local_function_call_test.dart b/tests/compiler/dart2js_extra/local_function_call_test.dart
index 8075492..fa1d126 100644
--- a/tests/compiler/dart2js_extra/local_function_call_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_call_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that global type inference computes the correct type for .call on
// a closure.
diff --git a/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart b/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
index b622a6a..c299c04 100644
--- a/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart b/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
index f1df515..f49cf52 100644
--- a/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/local_function_signatures_test.dart b/tests/compiler/dart2js_extra/local_function_signatures_test.dart
index 11bfb83..af68ab9 100644
--- a/tests/compiler/dart2js_extra/local_function_signatures_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_signatures_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/local_signature_test.dart b/tests/compiler/dart2js_extra/local_signature_test.dart
index eac7ab0..b47f40a 100644
--- a/tests/compiler/dart2js_extra/local_signature_test.dart
+++ b/tests/compiler/dart2js_extra/local_signature_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js_extra/locals_test.dart b/tests/compiler/dart2js_extra/locals_test.dart
index 3169124..a635995 100644
--- a/tests/compiler/dart2js_extra/locals_test.dart
+++ b/tests/compiler/dart2js_extra/locals_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
dynamic hello = 'Hello';
dynamic world = 'world';
diff --git a/tests/compiler/dart2js_extra/logical_and_test.dart b/tests/compiler/dart2js_extra/logical_and_test.dart
index 6337969..14a3fbb 100644
--- a/tests/compiler/dart2js_extra/logical_and_test.dart
+++ b/tests/compiler/dart2js_extra/logical_and_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void and1() {
diff --git a/tests/compiler/dart2js_extra/logical_or_test.dart b/tests/compiler/dart2js_extra/logical_or_test.dart
index b5923f0..f844613 100644
--- a/tests/compiler/dart2js_extra/logical_or_test.dart
+++ b/tests/compiler/dart2js_extra/logical_or_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void or1() {
diff --git a/tests/compiler/dart2js_extra/loop_if_phi_test.dart b/tests/compiler/dart2js_extra/loop_if_phi_test.dart
index 044c40a..a209873 100644
--- a/tests/compiler/dart2js_extra/loop_if_phi_test.dart
+++ b/tests/compiler/dart2js_extra/loop_if_phi_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void main() {
diff --git a/tests/compiler/dart2js_extra/many_constants_test.dart b/tests/compiler/dart2js_extra/many_constants_test.dart
index f28e2ff..43157c2 100644
--- a/tests/compiler/dart2js_extra/many_constants_test.dart
+++ b/tests/compiler/dart2js_extra/many_constants_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// This program has many similar constants that should all have distinct
// identities. They are sufficiently similar to have name collisions and need
// ordering by constant value.
diff --git a/tests/compiler/dart2js_extra/many_fields_test.dart b/tests/compiler/dart2js_extra/many_fields_test.dart
index 360ae34..5a25590 100644
--- a/tests/compiler/dart2js_extra/many_fields_test.dart
+++ b/tests/compiler/dart2js_extra/many_fields_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// A plain class that implements many fields.
diff --git a/tests/compiler/dart2js_extra/many_instantiations_test.dart b/tests/compiler/dart2js_extra/many_instantiations_test.dart
index 9ba578a..90f3d81 100644
--- a/tests/compiler/dart2js_extra/many_instantiations_test.dart
+++ b/tests/compiler/dart2js_extra/many_instantiations_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test generic instantiation with many type arguments.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/map_to_set_test.dart b/tests/compiler/dart2js_extra/map_to_set_test.dart
index 1bad856..b4bc1b7 100644
--- a/tests/compiler/dart2js_extra/map_to_set_test.dart
+++ b/tests/compiler/dart2js_extra/map_to_set_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for a missing RTI dependency between Map and JsLinkedHashMap.
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/math_lib_prefix_test.dart b/tests/compiler/dart2js_extra/math_lib_prefix_test.dart
index 318c0cf..7399764 100644
--- a/tests/compiler/dart2js_extra/math_lib_prefix_test.dart
+++ b/tests/compiler/dart2js_extra/math_lib_prefix_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library math_lib_prefix_test;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/math_lib_test.dart b/tests/compiler/dart2js_extra/math_lib_test.dart
index a8124d1..a6531e9 100644
--- a/tests/compiler/dart2js_extra/math_lib_test.dart
+++ b/tests/compiler/dart2js_extra/math_lib_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library math_lib_test;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/member_namespace_test.dart b/tests/compiler/dart2js_extra/member_namespace_test.dart
index ff65d20..892cb9d 100644
--- a/tests/compiler/dart2js_extra/member_namespace_test.dart
+++ b/tests/compiler/dart2js_extra/member_namespace_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/method_signatures_strong_test.dart b/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
index 3e3f256..7d18fe3 100644
--- a/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
+++ b/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/method_signatures_test.dart b/tests/compiler/dart2js_extra/method_signatures_test.dart
index 79d0c7f..0126fc4 100644
--- a/tests/compiler/dart2js_extra/method_signatures_test.dart
+++ b/tests/compiler/dart2js_extra/method_signatures_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/minus_zero2_test.dart b/tests/compiler/dart2js_extra/minus_zero2_test.dart
index 02cf9f0..88c9502 100644
--- a/tests/compiler/dart2js_extra/minus_zero2_test.dart
+++ b/tests/compiler/dart2js_extra/minus_zero2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for issue 17210.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/minus_zero_test.dart b/tests/compiler/dart2js_extra/minus_zero_test.dart
index bc3c0b6..0a4d5b4 100644
--- a/tests/compiler/dart2js_extra/minus_zero_test.dart
+++ b/tests/compiler/dart2js_extra/minus_zero_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for issue 17210.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/mixin_subtype_test.dart b/tests/compiler/dart2js_extra/mixin_subtype_test.dart
index 287776c..2509513c 100644
--- a/tests/compiler/dart2js_extra/mixin_subtype_test.dart
+++ b/tests/compiler/dart2js_extra/mixin_subtype_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {}
diff --git a/tests/compiler/dart2js_extra/mixin_type_variable_test.dart b/tests/compiler/dart2js_extra/mixin_type_variable_test.dart
index 750e58d..407e9a0 100644
--- a/tests/compiler/dart2js_extra/mixin_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/mixin_type_variable_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
abstract class Bar<C> {
final List<C> _one = new List<C>();
diff --git a/tests/compiler/dart2js_extra/mock_libraries.dart b/tests/compiler/dart2js_extra/mock_libraries.dart
index 1667032..b05e665 100644
--- a/tests/compiler/dart2js_extra/mock_libraries.dart
+++ b/tests/compiler/dart2js_extra/mock_libraries.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Library for creating mock versions of platform and internal libraries.
library mock_libraries;
diff --git a/tests/compiler/dart2js_extra/multi_global_def_single_instantiation_test.dart b/tests/compiler/dart2js_extra/multi_global_def_single_instantiation_test.dart
index f118b61..e296868 100644
--- a/tests/compiler/dart2js_extra/multi_global_def_single_instantiation_test.dart
+++ b/tests/compiler/dart2js_extra/multi_global_def_single_instantiation_test.dart
@@ -2,5 +2,7 @@
// 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.7
+
var y, w, z, x = [], q, r = [];
main() => [x, r];
diff --git a/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart b/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart
index 9059803..96c0dcb 100644
--- a/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart
+++ b/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
abstract class A {}
diff --git a/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart b/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart
index 4a4f817..688894c 100644
--- a/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart
+++ b/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
oneOptionalArgument(a, {b}) {
diff --git a/tests/compiler/dart2js_extra/named_parameter_test.dart b/tests/compiler/dart2js_extra/named_parameter_test.dart
index a5f0cf8..b9cbc47 100644
--- a/tests/compiler/dart2js_extra/named_parameter_test.dart
+++ b/tests/compiler/dart2js_extra/named_parameter_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/nan_negate_test.dart b/tests/compiler/dart2js_extra/nan_negate_test.dart
index 06adfd1..e1ef301 100644
--- a/tests/compiler/dart2js_extra/nan_negate_test.dart
+++ b/tests/compiler/dart2js_extra/nan_negate_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Don't convert !(a op b) to (a neg-op b) when a or b might be NaN.
diff --git a/tests/compiler/dart2js_extra/new_from_env_test.dart b/tests/compiler/dart2js_extra/new_from_env_test.dart
index 86f62dd..7138c6b 100644
--- a/tests/compiler/dart2js_extra/new_from_env_test.dart
+++ b/tests/compiler/dart2js_extra/new_from_env_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
/// Dart2js only supports the const constructor for `?.fromEnvironment`. The
@@ -9,7 +11,7 @@
/// `new` instead of `const`.
main() {
Expect.isFalse(const bool.fromEnvironment('X'));
- Expect.isNull(const String.fromEnvironment('X'));
+ Expect.equals('', const String.fromEnvironment('X', defaultValue: ''));
Expect.equals(const int.fromEnvironment('X', defaultValue: 0), 0);
Expect.throws(() => new bool.fromEnvironment('X'));
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart
index c09441f..095d383 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong11_lib.dart b/tests/compiler/dart2js_extra/no_such_method_strong11_lib.dart
index a1f1e15..7d8d5d4 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong11_lib.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong11_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
abstract class I {
// ignore: unused_element
int _m1();
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart
index d16c31c..0631e598 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
// Regression test checking that nsm-forwarders do not get installed for private
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong12_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong12_test.dart
index b097966..c90e8bb 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong12_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong12_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart
index 62b6c60..6d6251d 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart
index e42f388..fdd7adc 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart
index 5353d7b..53fbcc1 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart
index 1ec9499..e491795 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart
index 94f1531..63f04e8 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart
index 0018b85..a9e4741fb 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart
index 7f3925f..d389d99 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart
index a98447b..f87769d 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart
index 25ccc7e..9303797 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_test.dart b/tests/compiler/dart2js_extra/no_such_method_test.dart
index 38375d3..f5d3f33 100644
--- a/tests/compiler/dart2js_extra/no_such_method_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class NoSuchMethodInfo {
diff --git a/tests/compiler/dart2js_extra/non_jsinterop_test.dart b/tests/compiler/dart2js_extra/non_jsinterop_test.dart
index e66c5d5..abf7672 100644
--- a/tests/compiler/dart2js_extra/non_jsinterop_test.dart
+++ b/tests/compiler/dart2js_extra/non_jsinterop_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// TODO(johnniwinther): Share this test with ddc.
// Test for positive and negative uses of js-interop declarations in a library
diff --git a/tests/compiler/dart2js_extra/non_trivial_substitution_test.dart b/tests/compiler/dart2js_extra/non_trivial_substitution_test.dart
index 2a4ebf00..6c4fd3e 100644
--- a/tests/compiler/dart2js_extra/non_trivial_substitution_test.dart
+++ b/tests/compiler/dart2js_extra/non_trivial_substitution_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {}
diff --git a/tests/compiler/dart2js_extra/not_equals_test.dart b/tests/compiler/dart2js_extra/not_equals_test.dart
index 58003d6..6546736 100644
--- a/tests/compiler/dart2js_extra/not_equals_test.dart
+++ b/tests/compiler/dart2js_extra/not_equals_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
var x = 3;
if (x != x) {
diff --git a/tests/compiler/dart2js_extra/not_test.dart b/tests/compiler/dart2js_extra/not_test.dart
index e75f2ca..250838c 100644
--- a/tests/compiler/dart2js_extra/not_test.dart
+++ b/tests/compiler/dart2js_extra/not_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void not1() {
diff --git a/tests/compiler/dart2js_extra/null_stacktrace_test.dart b/tests/compiler/dart2js_extra/null_stacktrace_test.dart
index 6e95443..fa4e7b1 100644
--- a/tests/compiler/dart2js_extra/null_stacktrace_test.dart
+++ b/tests/compiler/dart2js_extra/null_stacktrace_test.dart
@@ -2,14 +2,16 @@
// 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.
-/// Regression test: stack trace can be null when using async-await.
+// @dart = 2.7
+
+/// Regression test: stack trace could be null when using async-await.
import 'dart:async';
import 'package:expect/expect.dart';
main() async {
C value = await test();
- Expect.equals("[[null]]", "$value");
+ Expect.identical(StackTrace.empty, value._s);
}
Future<C> test() async {
@@ -17,7 +19,7 @@
await throwInFuture();
return C(StackTrace.fromString("no-throw"));
} on MyException catch (e, s) {
- return C(s); // Note: s is null
+ return C(s); // Note: s is *no longer* null
}
}
diff --git a/tests/compiler/dart2js_extra/null_test.dart b/tests/compiler/dart2js_extra/null_test.dart
index 2378a91..c0a4670 100644
--- a/tests/compiler/dart2js_extra/null_test.dart
+++ b/tests/compiler/dart2js_extra/null_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
null1() {
diff --git a/tests/compiler/dart2js_extra/operator2_test.dart b/tests/compiler/dart2js_extra/operator2_test.dart
index 7d43fb0..f187e7e 100644
--- a/tests/compiler/dart2js_extra/operator2_test.dart
+++ b/tests/compiler/dart2js_extra/operator2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
int zero() {
diff --git a/tests/compiler/dart2js_extra/operator3_test.dart b/tests/compiler/dart2js_extra/operator3_test.dart
index 04ceec8..be9ec13 100644
--- a/tests/compiler/dart2js_extra/operator3_test.dart
+++ b/tests/compiler/dart2js_extra/operator3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
int zero() {
diff --git a/tests/compiler/dart2js_extra/operator_equals_test.dart b/tests/compiler/dart2js_extra/operator_equals_test.dart
index 6d73309..595775a 100644
--- a/tests/compiler/dart2js_extra/operator_equals_test.dart
+++ b/tests/compiler/dart2js_extra/operator_equals_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class AlwaysTrue {
diff --git a/tests/compiler/dart2js_extra/operator_test.dart b/tests/compiler/dart2js_extra/operator_test.dart
index 65edd95..5664537 100644
--- a/tests/compiler/dart2js_extra/operator_test.dart
+++ b/tests/compiler/dart2js_extra/operator_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
@pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js_extra/optional_parameter_test.dart b/tests/compiler/dart2js_extra/optional_parameter_test.dart
index 48418fb..790f638 100644
--- a/tests/compiler/dart2js_extra/optional_parameter_test.dart
+++ b/tests/compiler/dart2js_extra/optional_parameter_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/panda_lib.dart b/tests/compiler/dart2js_extra/panda_lib.dart
index 1d20b03..9210361 100644
--- a/tests/compiler/dart2js_extra/panda_lib.dart
+++ b/tests/compiler/dart2js_extra/panda_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
library panda_lib;
class Panda {
diff --git a/tests/compiler/dart2js_extra/panda_test.dart b/tests/compiler/dart2js_extra/panda_test.dart
index 2afaee6..a825aa7 100644
--- a/tests/compiler/dart2js_extra/panda_test.dart
+++ b/tests/compiler/dart2js_extra/panda_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library panda_test;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/phi_elimination_test.dart b/tests/compiler/dart2js_extra/phi_elimination_test.dart
index fe3f33f..8584939 100644
--- a/tests/compiler/dart2js_extra/phi_elimination_test.dart
+++ b/tests/compiler/dart2js_extra/phi_elimination_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void bar() {
diff --git a/tests/compiler/dart2js_extra/phi_gvn_test.dart b/tests/compiler/dart2js_extra/phi_gvn_test.dart
index 558ce8b..e2cf05f 100644
--- a/tests/compiler/dart2js_extra/phi_gvn_test.dart
+++ b/tests/compiler/dart2js_extra/phi_gvn_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
foo(x) {}
diff --git a/tests/compiler/dart2js_extra/phi_test.dart b/tests/compiler/dart2js_extra/phi_test.dart
index 14ca2be..f9b5dda 100644
--- a/tests/compiler/dart2js_extra/phi_test.dart
+++ b/tests/compiler/dart2js_extra/phi_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void phi1() {
diff --git a/tests/compiler/dart2js_extra/private_symbol_literal_test.dart b/tests/compiler/dart2js_extra/private_symbol_literal_test.dart
index 1f12b06..0b1a3c3 100644
--- a/tests/compiler/dart2js_extra/private_symbol_literal_test.dart
+++ b/tests/compiler/dart2js_extra/private_symbol_literal_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test symbol literals with underscores.
// These are currently unsupported by dart2js.
diff --git a/tests/compiler/dart2js_extra/recursive_metadata_test.dart b/tests/compiler/dart2js_extra/recursive_metadata_test.dart
index 1c46209..0172403 100644
--- a/tests/compiler/dart2js_extra/recursive_metadata_test.dart
+++ b/tests/compiler/dart2js_extra/recursive_metadata_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
// Tests that the compiler doesn't crash resolving annotations that refer
diff --git a/tests/compiler/dart2js_extra/regress/4434_lib.dart b/tests/compiler/dart2js_extra/regress/4434_lib.dart
index a2ac7c4..f2ecb97 100644
--- a/tests/compiler/dart2js_extra/regress/4434_lib.dart
+++ b/tests/compiler/dart2js_extra/regress/4434_lib.dart
@@ -2,6 +2,8 @@
// 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.7
+
library lib_a;
class A {
diff --git a/tests/compiler/dart2js_extra/regress/4434_test.dart b/tests/compiler/dart2js_extra/regress/4434_test.dart
index 72582f7..fea2b7a 100644
--- a/tests/compiler/dart2js_extra/regress/4434_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4434_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library lib_b;
import '4434_lib.dart';
diff --git a/tests/compiler/dart2js_extra/regress/4492_test.dart b/tests/compiler/dart2js_extra/regress/4492_test.dart
index 2b3d6c8..ec93b4d 100644
--- a/tests/compiler/dart2js_extra/regress/4492_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4492_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/regress/4515_1_test.dart b/tests/compiler/dart2js_extra/regress/4515_1_test.dart
index 8c758b0..08c00f1 100644
--- a/tests/compiler/dart2js_extra/regress/4515_1_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4515_1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/regress/4515_2_test.dart b/tests/compiler/dart2js_extra/regress/4515_2_test.dart
index 3411648..580a676 100644
--- a/tests/compiler/dart2js_extra/regress/4515_2_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4515_2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/regress/4515_3_test.dart b/tests/compiler/dart2js_extra/regress/4515_3_test.dart
index 23438ad..80c7f57 100644
--- a/tests/compiler/dart2js_extra/regress/4515_3_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4515_3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/regress/4562_test.dart b/tests/compiler/dart2js_extra/regress/4562_test.dart
index 61ba859..ba1b145 100644
--- a/tests/compiler/dart2js_extra/regress/4562_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4562_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
var foo = new Foo();
var bar = new Bar(); //# 01: compile-time error
diff --git a/tests/compiler/dart2js_extra/regress/4639_test.dart b/tests/compiler/dart2js_extra/regress/4639_test.dart
index 2aa9308..87dde61 100644
--- a/tests/compiler/dart2js_extra/regress/4639_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4639_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/regress/regression_type_variables_is_test.dart b/tests/compiler/dart2js_extra/regress/regression_type_variables_is_test.dart
index 9826cf4..c511808 100644
--- a/tests/compiler/dart2js_extra/regress/regression_type_variables_is_test.dart
+++ b/tests/compiler/dart2js_extra/regress/regression_type_variables_is_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class Bar<X> implements Baz {}
diff --git a/tests/compiler/dart2js_extra/regress_32069_test.dart b/tests/compiler/dart2js_extra/regress_32069_test.dart
index 23a0aff..05499c8 100644
--- a/tests/compiler/dart2js_extra/regress_32069_test.dart
+++ b/tests/compiler/dart2js_extra/regress_32069_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
main() {
diff --git a/tests/compiler/dart2js_extra/regress_36222_test.dart b/tests/compiler/dart2js_extra/regress_36222_test.dart
index f030833..97ac586 100644
--- a/tests/compiler/dart2js_extra/regress_36222_test.dart
+++ b/tests/compiler/dart2js_extra/regress_36222_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
typedef int BinaryFunc(int x, int y);
class A {
diff --git a/tests/compiler/dart2js_extra/regress_40349_test.dart b/tests/compiler/dart2js_extra/regress_40349_test.dart
index 796688d..50316bc 100644
--- a/tests/compiler/dart2js_extra/regress_40349_test.dart
+++ b/tests/compiler/dart2js_extra/regress_40349_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Regression test for Issue #40349:
///
/// Before the fix, this code was accidentally generating a type check twice.
diff --git a/tests/compiler/dart2js_extra/regress_null_aware_test.dart b/tests/compiler/dart2js_extra/regress_null_aware_test.dart
index 4ef8dc3..68cbcdc 100644
--- a/tests/compiler/dart2js_extra/regress_null_aware_test.dart
+++ b/tests/compiler/dart2js_extra/regress_null_aware_test.dart
@@ -2,6 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
+// @dart = 2.7
+
// Regression test for failure on CFE null-aware encoding.
class Class {
diff --git a/tests/compiler/dart2js_extra/regression_2913_test.dart b/tests/compiler/dart2js_extra/regression_2913_test.dart
index 85b0916..51a9902 100644
--- a/tests/compiler/dart2js_extra/regression_2913_test.dart
+++ b/tests/compiler/dart2js_extra/regression_2913_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
main() {
diff --git a/tests/compiler/dart2js_extra/replaced_type_variable_test.dart b/tests/compiler/dart2js_extra/replaced_type_variable_test.dart
index e95ea81..f9c7e7e 100644
--- a/tests/compiler/dart2js_extra/replaced_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/replaced_type_variable_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
// This class is inlined away.
diff --git a/tests/compiler/dart2js_extra/return_setter_test.dart b/tests/compiler/dart2js_extra/return_setter_test.dart
index a938b71..2d56e67 100644
--- a/tests/compiler/dart2js_extra/return_setter_test.dart
+++ b/tests/compiler/dart2js_extra/return_setter_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/round_constant_folding_test.dart b/tests/compiler/dart2js_extra/round_constant_folding_test.dart
index 2c786dd..8303723 100644
--- a/tests/compiler/dart2js_extra/round_constant_folding_test.dart
+++ b/tests/compiler/dart2js_extra/round_constant_folding_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
const double PD1 = 0.0;
diff --git a/tests/compiler/dart2js_extra/rti/bind_test.dart b/tests/compiler/dart2js_extra/rti/bind_test.dart
index 4e38ba6..f2b8bab 100644
--- a/tests/compiler/dart2js_extra/rti/bind_test.dart
+++ b/tests/compiler/dart2js_extra/rti/bind_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_rti' as rti;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/rti/bound_environment_test.dart b/tests/compiler/dart2js_extra/rti/bound_environment_test.dart
index 67f8ec3..6545b43 100644
--- a/tests/compiler/dart2js_extra/rti/bound_environment_test.dart
+++ b/tests/compiler/dart2js_extra/rti/bound_environment_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_rti' as rti;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/rti/canonical_recipe_test.dart b/tests/compiler/dart2js_extra/rti/canonical_recipe_test.dart
index 856ca7a..3be6427 100644
--- a/tests/compiler/dart2js_extra/rti/canonical_recipe_test.dart
+++ b/tests/compiler/dart2js_extra/rti/canonical_recipe_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_rti' as rti;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/rti/class_environment_test.dart b/tests/compiler/dart2js_extra/rti/class_environment_test.dart
index 4cf7d9e..aa1079b 100644
--- a/tests/compiler/dart2js_extra/rti/class_environment_test.dart
+++ b/tests/compiler/dart2js_extra/rti/class_environment_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_rti' as rti;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/rti/constant_type_test.dart b/tests/compiler/dart2js_extra/rti/constant_type_test.dart
index 6281f06..fa2d560 100644
--- a/tests/compiler/dart2js_extra/rti/constant_type_test.dart
+++ b/tests/compiler/dart2js_extra/rti/constant_type_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2019, 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.
+
+// @dart = 2.7
//
// dart2jsOptions=--experiment-new-rti --no-minify
diff --git a/tests/compiler/dart2js_extra/rti/recipe_syntax_test.dart b/tests/compiler/dart2js_extra/rti/recipe_syntax_test.dart
index 7d4be33..bb7979d 100644
--- a/tests/compiler/dart2js_extra/rti/recipe_syntax_test.dart
+++ b/tests/compiler/dart2js_extra/rti/recipe_syntax_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_recipe_syntax';
main() {
diff --git a/tests/compiler/dart2js_extra/rti/runtime_type_1_test.dart b/tests/compiler/dart2js_extra/rti/runtime_type_1_test.dart
index 1eb67ab..acf914b 100644
--- a/tests/compiler/dart2js_extra/rti/runtime_type_1_test.dart
+++ b/tests/compiler/dart2js_extra/rti/runtime_type_1_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2019, 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.
+
+// @dart = 2.7
//
// dart2jsOptions=--experiment-new-rti --no-minify
diff --git a/tests/compiler/dart2js_extra/rti/runtime_type_2_test.dart b/tests/compiler/dart2js_extra/rti/runtime_type_2_test.dart
index 69b352a..9a3511b 100644
--- a/tests/compiler/dart2js_extra/rti/runtime_type_2_test.dart
+++ b/tests/compiler/dart2js_extra/rti/runtime_type_2_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2019, 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.
+
+// @dart = 2.7
//
// dart2jsOptions=--experiment-new-rti --no-minify
diff --git a/tests/compiler/dart2js_extra/rti/runtime_type_3_test.dart b/tests/compiler/dart2js_extra/rti/runtime_type_3_test.dart
index 7d8d51e..1423ff4 100644
--- a/tests/compiler/dart2js_extra/rti/runtime_type_3_test.dart
+++ b/tests/compiler/dart2js_extra/rti/runtime_type_3_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2019, 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.
+
+// @dart = 2.7
//
// dart2jsOptions=--experiment-new-rti --no-minify
diff --git a/tests/compiler/dart2js_extra/rti/simple_2_test.dart b/tests/compiler/dart2js_extra/rti/simple_2_test.dart
index e195451..1ea3c71 100644
--- a/tests/compiler/dart2js_extra/rti/simple_2_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_rti' as rti;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart
index 1ed2045..44603a0 100644
--- a/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2019, 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.
+
+// @dart = 2.7
//
// dart2jsOptions=--experiment-new-rti
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart
index 9843216..747d5f8 100644
--- a/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2019, 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.
+
+// @dart = 2.7
//
// dart2jsOptions=--experiment-new-rti
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart
index d87c89c..e63e4b5 100644
--- a/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2019, 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.
+
+// @dart = 2.7
//
// dart2jsOptions=--experiment-new-rti
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_test.dart
index 7c7aafa..2d27065 100644
--- a/tests/compiler/dart2js_extra/rti/simple_is_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_is_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2019, 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.
+
+// @dart = 2.7
//
// dart2jsOptions=--experiment-new-rti --no-minify
diff --git a/tests/compiler/dart2js_extra/rti/simple_test.dart b/tests/compiler/dart2js_extra/rti/simple_test.dart
index 13a893e..4d9c956 100644
--- a/tests/compiler/dart2js_extra/rti/simple_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_rti' as rti;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/rti/simple_type_bound_test.dart b/tests/compiler/dart2js_extra/rti/simple_type_bound_test.dart
index 064327f..cc0a860 100644
--- a/tests/compiler/dart2js_extra/rti/simple_type_bound_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_type_bound_test.dart
@@ -1,6 +1,8 @@
// Copyright (c) 2019, 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.
+
+// @dart = 2.7
//
// dart2jsOptions=--experiment-new-rti
diff --git a/tests/compiler/dart2js_extra/rti/subtype_test.dart b/tests/compiler/dart2js_extra/rti/subtype_test.dart
index e7fff6d..0d34f3f 100644
--- a/tests/compiler/dart2js_extra/rti/subtype_test.dart
+++ b/tests/compiler/dart2js_extra/rti/subtype_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_foreign_helper' show JS, JS_GET_NAME, TYPE_REF;
import 'dart:_js_embedded_names' show JsGetName;
import 'dart:_rti' as rti;
diff --git a/tests/compiler/dart2js_extra/rti/subtype_utils.dart b/tests/compiler/dart2js_extra/rti/subtype_utils.dart
index dc4f608..e520a86 100644
--- a/tests/compiler/dart2js_extra/rti/subtype_utils.dart
+++ b/tests/compiler/dart2js_extra/rti/subtype_utils.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_rti' as rti;
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/rti/variance_subtype_test.dart b/tests/compiler/dart2js_extra/rti/variance_subtype_test.dart
index a42ab3f..e0d3258 100644
--- a/tests/compiler/dart2js_extra/rti/variance_subtype_test.dart
+++ b/tests/compiler/dart2js_extra/rti/variance_subtype_test.dart
@@ -2,7 +2,9 @@
// 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.
-// dart2jsOptions= --enable-experiment=variance
+// @dart = 2.7
+
+// SharedOptions=--enable-experiment=variance
import 'dart:_foreign_helper' show JS;
import 'dart:_rti' as rti;
diff --git a/tests/compiler/dart2js_extra/rti_need_for_closure_signature_test.dart b/tests/compiler/dart2js_extra/rti_need_for_closure_signature_test.dart
index 61fda79..362930f 100644
--- a/tests/compiler/dart2js_extra/rti_need_for_closure_signature_test.dart
+++ b/tests/compiler/dart2js_extra/rti_need_for_closure_signature_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// User-facing regression test: ensure we correctly record when a closure needs
/// runtime type information for a type parameter that may be used or
/// .runtimeType.
diff --git a/tests/compiler/dart2js_extra/rti_need_for_runtime_type_test.dart b/tests/compiler/dart2js_extra/rti_need_for_runtime_type_test.dart
index 48c20e4..d4697ae 100644
--- a/tests/compiler/dart2js_extra/rti_need_for_runtime_type_test.dart
+++ b/tests/compiler/dart2js_extra/rti_need_for_runtime_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// User-facing regression test: ensure we correctly record when a closure needs
/// runtime type information for a type parameter that may be used or
/// .runtimeType.
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart
index 5defc5e..7a0d823 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart
index 86fe4b2..22aa514 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart
index ffcd03f..6ed0c0d 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart
index 967b5f6..7b17bb1 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart
index 1b19f8d..fd2616e 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart
index 5090f04..3cb0589 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart
index 73348c9..860f25c 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart
index 5f03539..9cfe492 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart
index f625055..5f20dfa 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart
index ce93178..f73ced5 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart
index f412f86..3d909c4 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart
index 4a1c8d9..8aa0647 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart
index cd6926e..532deb9 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class Class1 {
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart
index af98ea6..f71999f 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart
index 0d2727b..bf1460f 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart
index 145ceae..31f9f8e 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_int_test.dart b/tests/compiler/dart2js_extra/runtime_type_int_test.dart
index d98484a..71ac242 100644
--- a/tests/compiler/dart2js_extra/runtime_type_int_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_int_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that in dart2js, the constant system matches the runtime
// handling of numbers.
diff --git a/tests/compiler/dart2js_extra/runtime_type_test.dart b/tests/compiler/dart2js_extra/runtime_type_test.dart
index f127dbe..9cd1bee 100644
--- a/tests/compiler/dart2js_extra/runtime_type_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
// Test that Type.toString returns nice strings for native classes with
diff --git a/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart b/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
index d61335f..611c16f 100644
--- a/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string --experiment-new-rti
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/send_test.dart b/tests/compiler/dart2js_extra/send_test.dart
index 3c98c51..c37b5eb 100644
--- a/tests/compiler/dart2js_extra/send_test.dart
+++ b/tests/compiler/dart2js_extra/send_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
int foo() {
return 42;
diff --git a/tests/compiler/dart2js_extra/simple_string_constant_test.dart b/tests/compiler/dart2js_extra/simple_string_constant_test.dart
index 746e4d2..51b980b 100644
--- a/tests/compiler/dart2js_extra/simple_string_constant_test.dart
+++ b/tests/compiler/dart2js_extra/simple_string_constant_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
const String m = "\u{21}";
diff --git a/tests/compiler/dart2js_extra/source_mapping_crash_source.dart b/tests/compiler/dart2js_extra/source_mapping_crash_source.dart
index 78f15e3..470204de 100644
--- a/tests/compiler/dart2js_extra/source_mapping_crash_source.dart
+++ b/tests/compiler/dart2js_extra/source_mapping_crash_source.dart
@@ -2,6 +2,8 @@
// 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.7
+
part of source_mapping_crash_test;
/*******************************************************************************
diff --git a/tests/compiler/dart2js_extra/source_mapping_crash_test.dart b/tests/compiler/dart2js_extra/source_mapping_crash_test.dart
index 38ca4c6..8700f37 100644
--- a/tests/compiler/dart2js_extra/source_mapping_crash_test.dart
+++ b/tests/compiler/dart2js_extra/source_mapping_crash_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library source_mapping_crash_test;
part 'source_mapping_crash_source.dart';
diff --git a/tests/compiler/dart2js_extra/statements_test.dart b/tests/compiler/dart2js_extra/statements_test.dart
index 7e45397..8bc5323 100644
--- a/tests/compiler/dart2js_extra/statements_test.dart
+++ b/tests/compiler/dart2js_extra/statements_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
print(3);
print(4);
diff --git a/tests/compiler/dart2js_extra/static_field2_test.dart b/tests/compiler/dart2js_extra/static_field2_test.dart
index d2f5cc7..fe0b891 100644
--- a/tests/compiler/dart2js_extra/static_field2_test.dart
+++ b/tests/compiler/dart2js_extra/static_field2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/static_field_test.dart b/tests/compiler/dart2js_extra/static_field_test.dart
index 63c96af..a449c5d 100644
--- a/tests/compiler/dart2js_extra/static_field_test.dart
+++ b/tests/compiler/dart2js_extra/static_field_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/static_method2_test.dart b/tests/compiler/dart2js_extra/static_method2_test.dart
index ab6517f..43c55dd 100644
--- a/tests/compiler/dart2js_extra/static_method2_test.dart
+++ b/tests/compiler/dart2js_extra/static_method2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/static_method_test.dart b/tests/compiler/dart2js_extra/static_method_test.dart
index a65e0b6..aa14749 100644
--- a/tests/compiler/dart2js_extra/static_method_test.dart
+++ b/tests/compiler/dart2js_extra/static_method_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart b/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart
index e6cb720..d03a222 100644
--- a/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart
+++ b/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
int one;
diff --git a/tests/compiler/dart2js_extra/static_var_test.dart b/tests/compiler/dart2js_extra/static_var_test.dart
index 1b3a9fc..56c2591 100644
--- a/tests/compiler/dart2js_extra/static_var_test.dart
+++ b/tests/compiler/dart2js_extra/static_var_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
int one = 1;
diff --git a/tests/compiler/dart2js_extra/string_escape_test.dart b/tests/compiler/dart2js_extra/string_escape_test.dart
index 3bd1b99..0ee8d16 100644
--- a/tests/compiler/dart2js_extra/string_escape_test.dart
+++ b/tests/compiler/dart2js_extra/string_escape_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Test that string escapes work correctly.
diff --git a/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart b/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart
index 115f070..304f024 100644
--- a/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart
+++ b/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart
Binary files differ
diff --git a/tests/compiler/dart2js_extra/string_interpolation_opt1_test.dart b/tests/compiler/dart2js_extra/string_interpolation_opt1_test.dart
index 60e92d4..e0a63dd 100644
--- a/tests/compiler/dart2js_extra/string_interpolation_opt1_test.dart
+++ b/tests/compiler/dart2js_extra/string_interpolation_opt1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import 'dart:math';
diff --git a/tests/compiler/dart2js_extra/string_interpolation_test.dart b/tests/compiler/dart2js_extra/string_interpolation_test.dart
index 027128a..e6c9562 100644
--- a/tests/compiler/dart2js_extra/string_interpolation_test.dart
+++ b/tests/compiler/dart2js_extra/string_interpolation_test.dart
Binary files differ
diff --git a/tests/compiler/dart2js_extra/super_call_test.dart b/tests/compiler/dart2js_extra/super_call_test.dart
index c9f777f..a5b46da 100644
--- a/tests/compiler/dart2js_extra/super_call_test.dart
+++ b/tests/compiler/dart2js_extra/super_call_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/super_constructor1_test.dart b/tests/compiler/dart2js_extra/super_constructor1_test.dart
index a0aaf86..8c5a760 100644
--- a/tests/compiler/dart2js_extra/super_constructor1_test.dart
+++ b/tests/compiler/dart2js_extra/super_constructor1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
String message;
diff --git a/tests/compiler/dart2js_extra/super_constructor2_test.dart b/tests/compiler/dart2js_extra/super_constructor2_test.dart
index 73ac20a..8fbe812 100644
--- a/tests/compiler/dart2js_extra/super_constructor2_test.dart
+++ b/tests/compiler/dart2js_extra/super_constructor2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin10_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin10_test.dart
index 361e98b..f0ac915 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin10_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin10_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart
index efd86c0..538391f 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA1 {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart
index 81fa7f29..2765557 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart
index 142e893..99311fe 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart
index 224baa4..4e10577 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart
index a2df040..006d1c9 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart
index 09e0267..612990e 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA1 {}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
index 14aa9e3..f85910c 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class S {}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
index d29409c..bd52195 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class S {}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin1_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin1_test.dart
index 6f6d16a..23fb6be 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin1_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin2_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin2_test.dart
index 846fe88..edf6d4a 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin2_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin3_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin3_test.dart
index c5bfca0..f5d2ac5 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin3_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin4_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin4_test.dart
index a450c76..0f9e418 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin4_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin5_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin5_test.dart
index 41ea90c..316ab8d 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin5_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin6_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin6_test.dart
index 86a998f..1d94b58 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin6_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin7_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin7_test.dart
index 80e0a17..b9ab301 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin7_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin7_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA<T> {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin8_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin8_test.dart
index 42af785..b93aac6 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin8_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin8_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA<T, S> {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin9_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin9_test.dart
index 41a688f..24c6b12 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin9_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin9_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
class SuperA<T> {
diff --git a/tests/compiler/dart2js_extra/switch_equals_test.dart b/tests/compiler/dart2js_extra/switch_equals_test.dart
index 72030e6..b628863 100644
--- a/tests/compiler/dart2js_extra/switch_equals_test.dart
+++ b/tests/compiler/dart2js_extra/switch_equals_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
class SuperClass {
const SuperClass();
@@ -21,19 +23,29 @@
}
main() {
- switch (null) {
+ // This test verifies that when overriding `==` it is a compile time error to
+ // use that class as a key in a switch, but only if the override provides a
+ // body. However, with NNBD, all of these switches became compile time errors
+ // so now we cast `null` as `dynamic` to get these first two switches past
+ // the compiler.
+ switch (null as dynamic) {
case const SuperClass():
break;
default:
}
- switch (null) {
+ switch (null as dynamic) {
case const Class():
break;
default:
}
- switch (null) {
+ switch (null as dynamic) {
case const SubClass(): //# 01: compile-time error
break; //# 01: continued
default:
}
+ switch (null) {
+ case null:
+ break;
+ default:
+ }
}
diff --git a/tests/compiler/dart2js_extra/switch_test.dart b/tests/compiler/dart2js_extra/switch_test.dart
index 9e5eef1..517d4eb 100644
--- a/tests/compiler/dart2js_extra/switch_test.dart
+++ b/tests/compiler/dart2js_extra/switch_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
switcher(val) {
diff --git a/tests/compiler/dart2js_extra/tear_off_types_test.dart b/tests/compiler/dart2js_extra/tear_off_types_test.dart
index d7f6c41..59aef28 100644
--- a/tests/compiler/dart2js_extra/tear_off_types_test.dart
+++ b/tests/compiler/dart2js_extra/tear_off_types_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--omit-implicit-checks
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/this_phi_elimination_test.dart b/tests/compiler/dart2js_extra/this_phi_elimination_test.dart
index 80f7bb0..95679f8 100644
--- a/tests/compiler/dart2js_extra/this_phi_elimination_test.dart
+++ b/tests/compiler/dart2js_extra/this_phi_elimination_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart b/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart
index feeedd4..32a5fce 100644
--- a/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart
+++ b/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
// Confirm that redirecting named constructors are properly resolved.
diff --git a/tests/compiler/dart2js_extra/this_test.dart b/tests/compiler/dart2js_extra/this_test.dart
index e0804e7..3bc167a 100644
--- a/tests/compiler/dart2js_extra/this_test.dart
+++ b/tests/compiler/dart2js_extra/this_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/compiler/dart2js_extra/throw1_test.dart b/tests/compiler/dart2js_extra/throw1_test.dart
index b91485c..aa79f9f 100644
--- a/tests/compiler/dart2js_extra/throw1_test.dart
+++ b/tests/compiler/dart2js_extra/throw1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void main() {
throw "foo"; // //# 01: runtime error
}
diff --git a/tests/compiler/dart2js_extra/throw2_test.dart b/tests/compiler/dart2js_extra/throw2_test.dart
index 350ec72..89c7c45 100644
--- a/tests/compiler/dart2js_extra/throw2_test.dart
+++ b/tests/compiler/dart2js_extra/throw2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
void throw1() {
throw "foo";
}
diff --git a/tests/compiler/dart2js_extra/timer_test.dart b/tests/compiler/dart2js_extra/timer_test.dart
index 818a6ae..578b5b3 100644
--- a/tests/compiler/dart2js_extra/timer_test.dart
+++ b/tests/compiler/dart2js_extra/timer_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'dart:isolate';
diff --git a/tests/compiler/dart2js_extra/to_string_test.dart b/tests/compiler/dart2js_extra/to_string_test.dart
index 7157548..de328f1 100644
--- a/tests/compiler/dart2js_extra/to_string_test.dart
+++ b/tests/compiler/dart2js_extra/to_string_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
class A extends Object {}
diff --git a/tests/compiler/dart2js_extra/truncation_errors_test.dart b/tests/compiler/dart2js_extra/truncation_errors_test.dart
index 92532f2..a4b24f7 100644
--- a/tests/compiler/dart2js_extra/truncation_errors_test.dart
+++ b/tests/compiler/dart2js_extra/truncation_errors_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Check that exception messages for truncating operations contains the
// operands.
diff --git a/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart b/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart
index 36dd8eb..8726cf3 100644
--- a/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart
+++ b/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// A regression test for a dart2js crash.
library type.argument.factory.crash.test;
diff --git a/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart b/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart
index 1708b04..580cebd 100644
--- a/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart
+++ b/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// A regression test for a dart2js crash.
library type.argument.factory.nocrash.test;
diff --git a/tests/compiler/dart2js_extra/type_argument_optimization_test.dart b/tests/compiler/dart2js_extra/type_argument_optimization_test.dart
index 21b41c5..a80b370 100644
--- a/tests/compiler/dart2js_extra/type_argument_optimization_test.dart
+++ b/tests/compiler/dart2js_extra/type_argument_optimization_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for issue 37267.
typedef UpdateShouldNotify<T> = bool Function(T previous, T current);
diff --git a/tests/compiler/dart2js_extra/type_constant_switch_test.dart b/tests/compiler/dart2js_extra/type_constant_switch_test.dart
index 875c9d8..f3a45b0 100644
--- a/tests/compiler/dart2js_extra/type_constant_switch_test.dart
+++ b/tests/compiler/dart2js_extra/type_constant_switch_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that switching on type literals leads to a compile time error in
// dart2js since its implementation of [Type] implements 'operator =='.
diff --git a/tests/compiler/dart2js_extra/type_error_message_test.dart b/tests/compiler/dart2js_extra/type_error_message_test.dart
index 6f34931..30de186 100644
--- a/tests/compiler/dart2js_extra/type_error_message_test.dart
+++ b/tests/compiler/dart2js_extra/type_error_message_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that the error message for a failing subtype test includes type
// arguments.
diff --git a/tests/compiler/dart2js_extra/type_literal2_test.dart b/tests/compiler/dart2js_extra/type_literal2_test.dart
index 53d06a3..dd0580c 100644
--- a/tests/compiler/dart2js_extra/type_literal2_test.dart
+++ b/tests/compiler/dart2js_extra/type_literal2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:async';
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/type_literal_test.dart b/tests/compiler/dart2js_extra/type_literal_test.dart
index 4426847..3712300 100644
--- a/tests/compiler/dart2js_extra/type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/type_literal_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--strong
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/typevariable_factory_test.dart b/tests/compiler/dart2js_extra/typevariable_factory_test.dart
index 2f977cf..3c51f03 100644
--- a/tests/compiler/dart2js_extra/typevariable_factory_test.dart
+++ b/tests/compiler/dart2js_extra/typevariable_factory_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test to ensure that we can use type variable in factories.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/typevariable_substitution_test.dart b/tests/compiler/dart2js_extra/typevariable_substitution_test.dart
index dd5e75f..723b098 100644
--- a/tests/compiler/dart2js_extra/typevariable_substitution_test.dart
+++ b/tests/compiler/dart2js_extra/typevariable_substitution_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test to ensure that we substitute type variables in is-tests.
import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/typevariable_typedef_test.dart b/tests/compiler/dart2js_extra/typevariable_typedef_test.dart
index 5dc6d2b..6ac736e 100644
--- a/tests/compiler/dart2js_extra/typevariable_typedef_test.dart
+++ b/tests/compiler/dart2js_extra/typevariable_typedef_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
typedef T Func<T>(T x);
diff --git a/tests/compiler/dart2js_extra/unconditional_dartio_import_test.dart b/tests/compiler/dart2js_extra/unconditional_dartio_import_test.dart
index d6c869a..fd07b70 100644
--- a/tests/compiler/dart2js_extra/unconditional_dartio_import_test.dart
+++ b/tests/compiler/dart2js_extra/unconditional_dartio_import_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
/// Tests that dart2js allows to import dart:io for web clients, but it
/// continues to indicate that it is not supported (so config-specific imports
/// continue to have the same semantics as before).
diff --git a/tests/compiler/dart2js_extra/unused_local_const_test.dart b/tests/compiler/dart2js_extra/unused_local_const_test.dart
index 5829129..77ef3f1 100644
--- a/tests/compiler/dart2js_extra/unused_local_const_test.dart
+++ b/tests/compiler/dart2js_extra/unused_local_const_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
class A {
const A();
diff --git a/tests/compiler/dart2js_extra/useful_error_message_1_test.dart b/tests/compiler/dart2js_extra/useful_error_message_1_test.dart
index 7fbaa6b..07e8dcd 100644
--- a/tests/compiler/dart2js_extra/useful_error_message_1_test.dart
+++ b/tests/compiler/dart2js_extra/useful_error_message_1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that closures have a useful string that identifies the function by name
// in error messages.
diff --git a/tests/compiler/dart2js_extra/while_test.dart b/tests/compiler/dart2js_extra/while_test.dart
index 4ac3ec3..ce18e73 100644
--- a/tests/compiler/dart2js_extra/while_test.dart
+++ b/tests/compiler/dart2js_extra/while_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
void while1() {
diff --git a/tests/compiler/dart2js_native/abstract_class_test.dart b/tests/compiler/dart2js_native/abstract_class_test.dart
index 6773385..988157c 100644
--- a/tests/compiler/dart2js_native/abstract_class_test.dart
+++ b/tests/compiler/dart2js_native/abstract_class_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Native classes can have subclasses that are not declared to the program. The
diff --git a/tests/compiler/dart2js_native/bound_closure_super_test.dart b/tests/compiler/dart2js_native/bound_closure_super_test.dart
index d97d8e1..67c36ed 100644
--- a/tests/compiler/dart2js_native/bound_closure_super_test.dart
+++ b/tests/compiler/dart2js_native/bound_closure_super_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test calling convention of property extraction closures (super edition).
library bound_closure_super_test;
diff --git a/tests/compiler/dart2js_native/bound_closure_test.dart b/tests/compiler/dart2js_native/bound_closure_test.dart
index 3509722..09bc341 100644
--- a/tests/compiler/dart2js_native/bound_closure_test.dart
+++ b/tests/compiler/dart2js_native/bound_closure_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Test calling convention of property extraction closures.
diff --git a/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart b/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart
index bfd62f5..01fb0fe 100644
--- a/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart
+++ b/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test for dartNativeDispatchHooksTransformer, getTag hook.
diff --git a/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart b/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart
index 779b72a..1f1e0fc 100644
--- a/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart
+++ b/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test for dartNativeDispatchHooksTransformer, getTag hook.
diff --git a/tests/compiler/dart2js_native/browser_compat_2_test.dart b/tests/compiler/dart2js_native/browser_compat_2_test.dart
index aa8f131..349c9a7 100644
--- a/tests/compiler/dart2js_native/browser_compat_2_test.dart
+++ b/tests/compiler/dart2js_native/browser_compat_2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test for dartNativeDispatchHooksTransformer
diff --git a/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart b/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart
index cf9f528..e9b4ad1 100644
--- a/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart
+++ b/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Try throwing a javascript null, and getting a stack-trace from it.
diff --git a/tests/compiler/dart2js_native/compiler_test_internals.dart b/tests/compiler/dart2js_native/compiler_test_internals.dart
index 08e96d0..c7b0218 100644
--- a/tests/compiler/dart2js_native/compiler_test_internals.dart
+++ b/tests/compiler/dart2js_native/compiler_test_internals.dart
@@ -2,6 +2,8 @@
// 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.7
+
library compiler_test_internals;
export 'dart:_js_helper' show NoSideEffects, NoThrows, NoInline;
diff --git a/tests/compiler/dart2js_native/compute_this_script_test.dart b/tests/compiler/dart2js_native/compute_this_script_test.dart
index ee5c855..45f26cc 100644
--- a/tests/compiler/dart2js_native/compute_this_script_test.dart
+++ b/tests/compiler/dart2js_native/compute_this_script_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test of _computeThisScript().
import 'dart:_js_helper' show thisScript;
diff --git a/tests/compiler/dart2js_native/core_type_check_native_test.dart b/tests/compiler/dart2js_native/core_type_check_native_test.dart
index 6356192..a7b6d8b 100644
--- a/tests/compiler/dart2js_native/core_type_check_native_test.dart
+++ b/tests/compiler/dart2js_native/core_type_check_native_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
@Native("A")
diff --git a/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart b/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart
index 4e4ed95..d5c90b7 100644
--- a/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart
+++ b/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test for initialization of dispatchPropertyName.
import 'native_testing.dart';
diff --git a/tests/compiler/dart2js_native/downcast_test.dart b/tests/compiler/dart2js_native/downcast_test.dart
index ab74f5f..f479b77 100644
--- a/tests/compiler/dart2js_native/downcast_test.dart
+++ b/tests/compiler/dart2js_native/downcast_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test for downcasts on native classes.
import "native_testing.dart";
diff --git a/tests/compiler/dart2js_native/error_safeToString_test.dart b/tests/compiler/dart2js_native/error_safeToString_test.dart
index 115c908..8b9acce0 100644
--- a/tests/compiler/dart2js_native/error_safeToString_test.dart
+++ b/tests/compiler/dart2js_native/error_safeToString_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
import 'dart:_foreign_helper' show JS_INTERCEPTOR_CONSTANT;
import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/event_loop_test.dart b/tests/compiler/dart2js_native/event_loop_test.dart
index e69d542..1fc7b1d 100644
--- a/tests/compiler/dart2js_native/event_loop_test.dart
+++ b/tests/compiler/dart2js_native/event_loop_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "dart:async";
import "package:async_helper/async_helper.dart";
import "native_testing.dart";
diff --git a/tests/compiler/dart2js_native/fake_thing_2_test.dart b/tests/compiler/dart2js_native/fake_thing_2_test.dart
index f630746..7209073 100644
--- a/tests/compiler/dart2js_native/fake_thing_2_test.dart
+++ b/tests/compiler/dart2js_native/fake_thing_2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Test that native objects cannot accidentally or maliciously be mistaken for
diff --git a/tests/compiler/dart2js_native/fake_thing_test.dart b/tests/compiler/dart2js_native/fake_thing_test.dart
index 0131821..8e1ca18 100644
--- a/tests/compiler/dart2js_native/fake_thing_test.dart
+++ b/tests/compiler/dart2js_native/fake_thing_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "package:expect/expect.dart";
import "dart:_foreign_helper" show JS;
diff --git a/tests/compiler/dart2js_native/field_type2_test.dart b/tests/compiler/dart2js_native/field_type2_test.dart
index 3bc2e10..abf0d94 100644
--- a/tests/compiler/dart2js_native/field_type2_test.dart
+++ b/tests/compiler/dart2js_native/field_type2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that a closure call on a native field is recognized by the
// type inferrer.
diff --git a/tests/compiler/dart2js_native/field_type_test.dart b/tests/compiler/dart2js_native/field_type_test.dart
index 8e2e83d..e59ad72 100644
--- a/tests/compiler/dart2js_native/field_type_test.dart
+++ b/tests/compiler/dart2js_native/field_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// A native class has no defined constructor.
// This regression test verifies that compiler accounts for hidden constructor
// when analysing field values.
diff --git a/tests/compiler/dart2js_native/fixup_get_tag_test.dart b/tests/compiler/dart2js_native/fixup_get_tag_test.dart
index e4e1ab8..8853041 100644
--- a/tests/compiler/dart2js_native/fixup_get_tag_test.dart
+++ b/tests/compiler/dart2js_native/fixup_get_tag_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test for dartExperimentalFixupGetTag.
diff --git a/tests/compiler/dart2js_native/foreign_test.dart b/tests/compiler/dart2js_native/foreign_test.dart
index 31ab23b..3553d28 100644
--- a/tests/compiler/dart2js_native/foreign_test.dart
+++ b/tests/compiler/dart2js_native/foreign_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
foreign1(var a, var b) {
diff --git a/tests/compiler/dart2js_native/hash_code_test.dart b/tests/compiler/dart2js_native/hash_code_test.dart
index 137be8f..9024625 100644
--- a/tests/compiler/dart2js_native/hash_code_test.dart
+++ b/tests/compiler/dart2js_native/hash_code_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
@Native("A")
diff --git a/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart b/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
index 3185f05..f0d426c 100644
--- a/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
+++ b/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
import 'dart:_js_helper' show intTypeCheck;
diff --git a/tests/compiler/dart2js_native/internal_library_test.dart b/tests/compiler/dart2js_native/internal_library_test.dart
index 7f81f6c..e08339c 100644
--- a/tests/compiler/dart2js_native/internal_library_test.dart
+++ b/tests/compiler/dart2js_native/internal_library_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that a private library can be accessed from libraries in this special
// test folder.
diff --git a/tests/compiler/dart2js_native/is_check_test.dart b/tests/compiler/dart2js_native/is_check_test.dart
index ec1d703..13d2599 100644
--- a/tests/compiler/dart2js_native/is_check_test.dart
+++ b/tests/compiler/dart2js_native/is_check_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
@Native("A")
diff --git a/tests/compiler/dart2js_native/issue9182_test.dart b/tests/compiler/dart2js_native/issue9182_test.dart
index 62a0a60..cfbb2b2 100644
--- a/tests/compiler/dart2js_native/issue9182_test.dart
+++ b/tests/compiler/dart2js_native/issue9182_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for Issue 9182. The generative constructor body function
// should not have the interceptor calling convention.
diff --git a/tests/compiler/dart2js_native/js_const_test.dart b/tests/compiler/dart2js_native/js_const_test.dart
index d777e1e..a119f54 100644
--- a/tests/compiler/dart2js_native/js_const_test.dart
+++ b/tests/compiler/dart2js_native/js_const_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'package:expect/expect.dart';
import 'dart:_foreign_helper' show JS, JS_CONST;
diff --git a/tests/compiler/dart2js_native/js_constant_test.dart b/tests/compiler/dart2js_native/js_constant_test.dart
index 40ce27c..1ff176a 100644
--- a/tests/compiler/dart2js_native/js_constant_test.dart
+++ b/tests/compiler/dart2js_native/js_constant_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Negative constant numbers must be generated as negation, not just a literal
diff --git a/tests/compiler/dart2js_native/jsobject_test.dart b/tests/compiler/dart2js_native/jsobject_test.dart
index dd0ec8e..f5febe0 100644
--- a/tests/compiler/dart2js_native/jsobject_test.dart
+++ b/tests/compiler/dart2js_native/jsobject_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/load_elim_refinement_test.dart b/tests/compiler/dart2js_native/load_elim_refinement_test.dart
index ee9dfee..a4ed700 100644
--- a/tests/compiler/dart2js_native/load_elim_refinement_test.dart
+++ b/tests/compiler/dart2js_native/load_elim_refinement_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
class A {
diff --git a/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
index f590001..c7041fd 100644
--- a/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that native methods with unnamed* optional arguments are called with the
diff --git a/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
index 1646809..b66ddce 100644
--- a/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// This is a similar test to NativeCallArity1FrogTest, but makes sure
diff --git a/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
index 3be4585..28e0412 100644
--- a/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test similar to NativeCallArity1FrogTest, but with default values to
diff --git a/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart b/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
index ddce60e..ff52fa3 100644
--- a/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Test that type checks occur on native methods.
diff --git a/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart b/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
index f9fdece..76f512d 100644
--- a/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Test that type checks occur on assignment to fields of native methods.
diff --git a/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart b/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
index 6e4a95c..488cd67 100644
--- a/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that hidden native class names are not used by generated code.
diff --git a/tests/compiler/dart2js_native/native_class_fields_2_test.dart b/tests/compiler/dart2js_native/native_class_fields_2_test.dart
index 3b3d265..b8b031e 100644
--- a/tests/compiler/dart2js_native/native_class_fields_2_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Verify that methods are not renamed to clash with native field names
diff --git a/tests/compiler/dart2js_native/native_class_fields_3_test.dart b/tests/compiler/dart2js_native/native_class_fields_3_test.dart
index 4812292..ad96532 100644
--- a/tests/compiler/dart2js_native/native_class_fields_3_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Verify that we can have fields with names that start with g and s even
diff --git a/tests/compiler/dart2js_native/native_class_fields_test.dart b/tests/compiler/dart2js_native/native_class_fields_test.dart
index e37adbe..a960803 100644
--- a/tests/compiler/dart2js_native/native_class_fields_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Verify that native fields on classes are not renamed by the minifier.
diff --git a/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
index 322dcba..298a5f7 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test to see if resolving a hidden native class's method interferes with
diff --git a/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
index 8fa4b67..865ff93 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test to see if resolving a hidden native class's method interferes with
diff --git a/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
index af5a8e3..d6bc323 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test to see if resolving a hidden native class's method to noSuchMethod
diff --git a/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
index 25f8fcd..c230a0e 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Additional Dart code may be 'placed on' hidden native classes. With
diff --git a/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart b/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
index 6b8bb37..0294507 100644
--- a/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test for correct simple is-checks on hidden native classes.
diff --git a/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart b/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
index 98cbf91..fdd225a 100644
--- a/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test for correct simple is-checks on hidden native classes.
diff --git a/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart b/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
index 574e684..c3061d8 100644
--- a/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Additional Dart code may be 'placed on' hidden native classes.
diff --git a/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart b/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
index c5f5084..2f85058 100644
--- a/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
typedef MyFunctionType();
diff --git a/tests/compiler/dart2js_native/native_constructor_name_test.dart b/tests/compiler/dart2js_native/native_constructor_name_test.dart
index 9d60a40..1dc6d6c 100644
--- a/tests/compiler/dart2js_native/native_constructor_name_test.dart
+++ b/tests/compiler/dart2js_native/native_constructor_name_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test to see if a Dart class name is confused with dispatch tag. Both class A
// and class Z have a JavaScript constructor named "A". The dynamic native
// class dispatch hook on Object.prototype should avoid patching the Dart class
diff --git a/tests/compiler/dart2js_native/native_equals_frog_test.dart b/tests/compiler/dart2js_native/native_equals_frog_test.dart
index 0b460b9..1b5b38b 100644
--- a/tests/compiler/dart2js_native/native_equals_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_equals_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
@Native("A")
diff --git a/tests/compiler/dart2js_native/native_exception2_test.dart b/tests/compiler/dart2js_native/native_exception2_test.dart
index 59cf5b0..4bbc029 100644
--- a/tests/compiler/dart2js_native/native_exception2_test.dart
+++ b/tests/compiler/dart2js_native/native_exception2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Similar to native_exception_test.dart but also defines a native
// class. This exercises a different code path in emitter.dart.
diff --git a/tests/compiler/dart2js_native/native_exception_test.dart b/tests/compiler/dart2js_native/native_exception_test.dart
index e3e4a98..c3684b4 100644
--- a/tests/compiler/dart2js_native/native_exception_test.dart
+++ b/tests/compiler/dart2js_native/native_exception_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that dart2js can handle unexpected exception types.
library native_exception_test;
diff --git a/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart b/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
index 497a80c..084075e 100644
--- a/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Test that hidden native exception classes can be marked as existing.
diff --git a/tests/compiler/dart2js_native/native_field_invocation2_test.dart b/tests/compiler/dart2js_native/native_field_invocation2_test.dart
index 9c150687..2a4d013 100644
--- a/tests/compiler/dart2js_native/native_field_invocation2_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
@Native("NNative")
diff --git a/tests/compiler/dart2js_native/native_field_invocation3_test.dart b/tests/compiler/dart2js_native/native_field_invocation3_test.dart
index 9ed3d9c..8e0d918 100644
--- a/tests/compiler/dart2js_native/native_field_invocation3_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
makeCC() native;
diff --git a/tests/compiler/dart2js_native/native_field_invocation4_test.dart b/tests/compiler/dart2js_native/native_field_invocation4_test.dart
index afce3c09..7e5b0d4 100644
--- a/tests/compiler/dart2js_native/native_field_invocation4_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
@Native("A")
diff --git a/tests/compiler/dart2js_native/native_field_invocation5_test.dart b/tests/compiler/dart2js_native/native_field_invocation5_test.dart
index abd0169..5e9e853 100644
--- a/tests/compiler/dart2js_native/native_field_invocation5_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
makeCC() native;
diff --git a/tests/compiler/dart2js_native/native_field_invocation6_test.dart b/tests/compiler/dart2js_native/native_field_invocation6_test.dart
index 17ed660..3ca229f 100644
--- a/tests/compiler/dart2js_native/native_field_invocation6_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation6_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
makeA() native;
diff --git a/tests/compiler/dart2js_native/native_field_invocation_test.dart b/tests/compiler/dart2js_native/native_field_invocation_test.dart
index e6f13b6..65077fe 100644
--- a/tests/compiler/dart2js_native/native_field_invocation_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
@Native("A")
diff --git a/tests/compiler/dart2js_native/native_field_name_test.dart b/tests/compiler/dart2js_native/native_field_name_test.dart
index 66e25ac..c03a88d 100644
--- a/tests/compiler/dart2js_native/native_field_name_test.dart
+++ b/tests/compiler/dart2js_native/native_field_name_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Check that native fields are not incorrectly renamed.
diff --git a/tests/compiler/dart2js_native/native_field_optimization_test.dart b/tests/compiler/dart2js_native/native_field_optimization_test.dart
index 5b7e061..6b5a976 100644
--- a/tests/compiler/dart2js_native/native_field_optimization_test.dart
+++ b/tests/compiler/dart2js_native/native_field_optimization_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Test that compiler is cautious with optimizations on native fields. The
diff --git a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
index 5fd6602..11420c4 100644
--- a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// A native method prevents other members from having that name, including
// fields. However, native fields keep their name. The implication: a getter
// for the field must be based on the field's name, not the field's jsname.
diff --git a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
index 2c44d54..1591a28 100644
--- a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// A native method prevents other members from having that name, including
// fields. However, native fields keep their name. The implication: a getter
// for the field must be based on the field's name, not the field's jsname.
diff --git a/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart b/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
index 4909b7f..974bf07 100644
--- a/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test for correct hidden native class when abstract class has same name.
library main;
diff --git a/tests/compiler/dart2js_native/native_library_same_name_used_lib1.dart b/tests/compiler/dart2js_native/native_library_same_name_used_lib1.dart
index 5046ff7..9e21adf 100644
--- a/tests/compiler/dart2js_native/native_library_same_name_used_lib1.dart
+++ b/tests/compiler/dart2js_native/native_library_same_name_used_lib1.dart
@@ -2,6 +2,8 @@
// 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.7
+
// 'I' is the name of an abstract class and the name of the native class.
library native_library_same_name_used_lib1;
diff --git a/tests/compiler/dart2js_native/native_library_same_name_used_lib2.dart b/tests/compiler/dart2js_native/native_library_same_name_used_lib2.dart
index feec6bb..bec6852 100644
--- a/tests/compiler/dart2js_native/native_library_same_name_used_lib2.dart
+++ b/tests/compiler/dart2js_native/native_library_same_name_used_lib2.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Native implementation.
library lib2;
diff --git a/tests/compiler/dart2js_native/native_method_inlining_test.dart b/tests/compiler/dart2js_native/native_method_inlining_test.dart
index ba0ee3b..0df556d 100644
--- a/tests/compiler/dart2js_native/native_method_inlining_test.dart
+++ b/tests/compiler/dart2js_native/native_method_inlining_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2jsOptions=--omit-implicit-checks
// Test that native methods with unnamed optional arguments are called with the
diff --git a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
index 5d05694..65d0741 100644
--- a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test the feature where the native string declares the native method's name.
import 'native_testing.dart';
diff --git a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
index 35713a2..d2c5b49 100644
--- a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test the feature where the native string declares the native method's name.
import "native_testing.dart";
diff --git a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
index c5759b2..b2875a9 100644
--- a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test the feature where the native string declares the native method's name.
// #3. The name does not get
diff --git a/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart b/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
index c535d90..1245550 100644
--- a/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
+++ b/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Make sure we can have a native with a name that is a JavaScript keyword.
diff --git a/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart b/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
index d0595f6..e083b17 100644
--- a/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
@Native("A")
diff --git a/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart b/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
index ae5799f..7b96c87 100644
--- a/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
@Native("A")
diff --git a/tests/compiler/dart2js_native/native_mixin_field2_test.dart b/tests/compiler/dart2js_native/native_mixin_field2_test.dart
index 4612391..a2b9062 100644
--- a/tests/compiler/dart2js_native/native_mixin_field2_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_field2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that native classes can use ordinary Dart classes with fields
diff --git a/tests/compiler/dart2js_native/native_mixin_field_test.dart b/tests/compiler/dart2js_native/native_mixin_field_test.dart
index 7f1aebb..bc7d36c 100644
--- a/tests/compiler/dart2js_native/native_mixin_field_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_field_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that native classes can use ordinary Dart classes with fields
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart
index 0747e6b..aa95f87 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that native classes can access methods defined only by mixins.
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart
index 1963186..9992295 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that native classes and plain classes can access methods defined only by
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
index 310d75b..377353c 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that native classes can use ordinary Dart classes as mixins.
diff --git a/tests/compiler/dart2js_native/native_mixin_test.dart b/tests/compiler/dart2js_native/native_mixin_test.dart
index 64bd3e4..096f39e 100644
--- a/tests/compiler/dart2js_native/native_mixin_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that native classes can use ordinary Dart classes as mixins.
diff --git a/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart b/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
index aea5e67..d3ad80c 100644
--- a/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that native classes and ordinary Dart classes can both use the same
diff --git a/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart b/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
index b200628..916b9ec 100644
--- a/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Native class with named constructors and static methods.
diff --git a/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart b/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
index 949a405..d90df20 100644
--- a/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Hidden native class with factory constructors and NO static methods.
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
index 5df3c12..b562085 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
@Native("A")
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
index c4a7951..857bf54 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
@Native("A")
diff --git a/tests/compiler/dart2js_native/native_novel_html_test.dart b/tests/compiler/dart2js_native/native_novel_html_test.dart
index 19f9eca..fdd3e1f 100644
--- a/tests/compiler/dart2js_native/native_novel_html_test.dart
+++ b/tests/compiler/dart2js_native/native_novel_html_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Test to see if novel HTML tags are interpreted as HTMLElement.
diff --git a/tests/compiler/dart2js_native/native_null_closure_frog_test.dart b/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
index 1768cac..a7c83a3 100644
--- a/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test that exception unwrapping handle cases like ({foo:null}).foo().
import "native_testing.dart";
diff --git a/tests/compiler/dart2js_native/native_null_frog_test.dart b/tests/compiler/dart2js_native/native_null_frog_test.dart
index 0abdd35..9cf083d 100644
--- a/tests/compiler/dart2js_native/native_null_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_null_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test for values of some basic types.
diff --git a/tests/compiler/dart2js_native/native_property_frog_test.dart b/tests/compiler/dart2js_native/native_property_frog_test.dart
index 0c4d3ef..2deeed5 100644
--- a/tests/compiler/dart2js_native/native_property_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_property_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Properties on hidden native classes.
import 'native_testing.dart';
diff --git a/tests/compiler/dart2js_native/native_test.dart b/tests/compiler/dart2js_native/native_test.dart
index 0eb52d6..dc14fe6 100644
--- a/tests/compiler/dart2js_native/native_test.dart
+++ b/tests/compiler/dart2js_native/native_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Test for positive and negative uses of named declarations. This file is
// also used in tests/compiler/dart2js/model/native_test.dart.
diff --git a/tests/compiler/dart2js_native/native_testing.dart b/tests/compiler/dart2js_native/native_testing.dart
index 5dcaa24..9eb9246 100644
--- a/tests/compiler/dart2js_native/native_testing.dart
+++ b/tests/compiler/dart2js_native/native_testing.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Native testing library. Provides support for mock @Native classes and
// collects common imports.
diff --git a/tests/compiler/dart2js_native/native_to_string_frog_test.dart b/tests/compiler/dart2js_native/native_to_string_frog_test.dart
index 6fdca6f..f17ad7b 100644
--- a/tests/compiler/dart2js_native/native_to_string_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_to_string_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
@Native("A")
diff --git a/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart b/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
index 0bd930a..ef7b2a7 100644
--- a/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Test that we put native names and not Dart names into the dynamic
diff --git a/tests/compiler/dart2js_native/native_window1_frog_test.dart b/tests/compiler/dart2js_native/native_window1_frog_test.dart
index f47b66d..add29bc 100644
--- a/tests/compiler/dart2js_native/native_window1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_window1_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
abstract class Window {
diff --git a/tests/compiler/dart2js_native/native_window2_frog_test.dart b/tests/compiler/dart2js_native/native_window2_frog_test.dart
index 143c1e6..5593517 100644
--- a/tests/compiler/dart2js_native/native_window2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_window2_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
abstract class Window {
diff --git a/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart b/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
index 111e2f5..e3de1ed 100644
--- a/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
typedef void Callback0();
diff --git a/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart b/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
index 53473b8..e05b809 100644
--- a/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
typedef void Callback0();
diff --git a/tests/compiler/dart2js_native/oddly_named_fields_test.dart b/tests/compiler/dart2js_native/oddly_named_fields_test.dart
index 54d9bd4..e59f247 100644
--- a/tests/compiler/dart2js_native/oddly_named_fields_test.dart
+++ b/tests/compiler/dart2js_native/oddly_named_fields_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// JavaScript reserved words:
diff --git a/tests/compiler/dart2js_native/optimization_hints_test.dart b/tests/compiler/dart2js_native/optimization_hints_test.dart
index 45ee3ad..5b73d79 100644
--- a/tests/compiler/dart2js_native/optimization_hints_test.dart
+++ b/tests/compiler/dart2js_native/optimization_hints_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'dart:_foreign_helper' show JS;
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_native/rti_only_native_test.dart b/tests/compiler/dart2js_native/rti_only_native_test.dart
index ec2fa525..71d5e90 100644
--- a/tests/compiler/dart2js_native/rti_only_native_test.dart
+++ b/tests/compiler/dart2js_native/rti_only_native_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Regression test for a bug that was caused by uninstantiated classes being
// added to emitted classes by runtime-type system.
// See my explanation in https://codereview.chromium.org/14018036/.
diff --git a/tests/compiler/dart2js_native/runtimetype_test.dart b/tests/compiler/dart2js_native/runtimetype_test.dart
index 558f7ee..4465ae1 100644
--- a/tests/compiler/dart2js_native/runtimetype_test.dart
+++ b/tests/compiler/dart2js_native/runtimetype_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
// Test to see runtimeType works on native classes and does not use the native
diff --git a/tests/compiler/dart2js_native/static_methods_test.dart b/tests/compiler/dart2js_native/static_methods_test.dart
index d356c25..3b1b31c 100644
--- a/tests/compiler/dart2js_native/static_methods_test.dart
+++ b/tests/compiler/dart2js_native/static_methods_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// Accessing static native methods names:
// plain declaration -> use @Native tag as 'scope' for declared name.
// identifier @JSName -> use @Native tag as 'scope' for @JSName.
diff --git a/tests/compiler/dart2js_native/subclassing_1_test.dart b/tests/compiler/dart2js_native/subclassing_1_test.dart
index 77a636f..fd3dc84 100644
--- a/tests/compiler/dart2js_native/subclassing_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors' show findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_2_test.dart b/tests/compiler/dart2js_native/subclassing_2_test.dart
index 66c8d68..63f3711 100644
--- a/tests/compiler/dart2js_native/subclassing_2_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors' show findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_3_test.dart b/tests/compiler/dart2js_native/subclassing_3_test.dart
index 5a2c3d9..fb7a794 100644
--- a/tests/compiler/dart2js_native/subclassing_3_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_3_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors' show Interceptor, findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_4_test.dart b/tests/compiler/dart2js_native/subclassing_4_test.dart
index 07a2d4c..089f134 100644
--- a/tests/compiler/dart2js_native/subclassing_4_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_4_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors' show Interceptor, findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_5_test.dart b/tests/compiler/dart2js_native/subclassing_5_test.dart
index 220563b..3ae3859 100644
--- a/tests/compiler/dart2js_native/subclassing_5_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_5_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors' show Interceptor, findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart b/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
index bf989a7..ebf8929 100644
--- a/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart b/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart
index f1c8dd1..9228a85 100644
--- a/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test that native classes and subclasses of native classes cannot be directly
diff --git a/tests/compiler/dart2js_native/subclassing_super_call_test.dart b/tests/compiler/dart2js_native/subclassing_super_call_test.dart
index 61e3fc1..71a77e5 100644
--- a/tests/compiler/dart2js_native/subclassing_super_call_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_super_call_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart b/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart
index 827cb358..a1e3c2a 100644
--- a/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart b/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart
index 837568a..efd1bf6 100644
--- a/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/subclassing_type_test.dart b/tests/compiler/dart2js_native/subclassing_type_test.dart
index b99872e..3abc875 100644
--- a/tests/compiler/dart2js_native/subclassing_type_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_type_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import 'native_testing.dart';
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors' show Interceptor, findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/super_call_test.dart b/tests/compiler/dart2js_native/super_call_test.dart
index 5238bb5..2dfff1a 100644
--- a/tests/compiler/dart2js_native/super_call_test.dart
+++ b/tests/compiler/dart2js_native/super_call_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test to see if resolving a hidden native class's method interferes with
diff --git a/tests/compiler/dart2js_native/super_property_test.dart b/tests/compiler/dart2js_native/super_property_test.dart
index 68e815a..5efcf62 100644
--- a/tests/compiler/dart2js_native/super_property_test.dart
+++ b/tests/compiler/dart2js_native/super_property_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Tests super setter where the HInvokeSuper is using interceptor aka
diff --git a/tests/compiler/dart2js_native/type_error_decode_test.dart b/tests/compiler/dart2js_native/type_error_decode_test.dart
index ba97210..c61c84d 100644
--- a/tests/compiler/dart2js_native/type_error_decode_test.dart
+++ b/tests/compiler/dart2js_native/type_error_decode_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
library test.type_error_decode_test;
import 'native_testing.dart';
diff --git a/tests/compiler/dart2js_native/undefined_bailout_test.dart b/tests/compiler/dart2js_native/undefined_bailout_test.dart
index feff806..1fb021c 100644
--- a/tests/compiler/dart2js_native/undefined_bailout_test.dart
+++ b/tests/compiler/dart2js_native/undefined_bailout_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
// dart2js regression test where the SSA backend would use the wrong
// type for an instruction: when doing a speculative type propagation,
// if an instruction gets analyzed multiple times, we used to save the
diff --git a/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart b/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart
index 158063c..968ca87 100644
--- a/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart
+++ b/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart
@@ -2,6 +2,8 @@
// 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.7
+
import "native_testing.dart";
// Test for uninstantiated native classes as type parameters.
diff --git a/tests/compiler/dartdevc_native/assertion_failure_message_test.dart b/tests/compiler/dartdevc_native/assertion_failure_message_test.dart
index 4a7fe7b..f85d05e 100644
--- a/tests/compiler/dartdevc_native/assertion_failure_message_test.dart
+++ b/tests/compiler/dartdevc_native/assertion_failure_message_test.dart
@@ -2,6 +2,8 @@
// 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.6
+
import "utils.dart";
void main() {
@@ -10,7 +12,7 @@
} on AssertionError catch (error) {
var message = error.toString();
expectStringContains('Assertion failed:', message);
- expectStringContains('assertion_failure_message_test.dart:9:12', message);
+ expectStringContains('assertion_failure_message_test.dart:11:12', message);
expectStringContains('false', message);
expectStringContains('failure message', message);
}
@@ -22,7 +24,7 @@
} on AssertionError catch (error) {
var message = error.toString();
expectStringContains('Assertion failed:', message);
- expectStringContains('assertion_failure_message_test.dart:21:12', message);
+ expectStringContains('assertion_failure_message_test.dart:23:12', message);
expectStringContains('false', message);
expectStringContains('after a non-UTF8 character', message);
}
diff --git a/tests/compiler/dartdevc_native/const_test.dart b/tests/compiler/dartdevc_native/const_test.dart
index b2dbf27..63394cf 100644
--- a/tests/compiler/dartdevc_native/const_test.dart
+++ b/tests/compiler/dartdevc_native/const_test.dart
@@ -2,6 +2,8 @@
// 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.6
+
import "package:expect/expect.dart";
import 'dart:_foreign_helper' show JS;
import 'dart:_runtime' as dart;
diff --git a/tests/compiler/dartdevc_native/debugger/debugger_test.dart b/tests/compiler/dartdevc_native/debugger/debugger_test.dart
index da2e982..e02bd53 100644
--- a/tests/compiler/dartdevc_native/debugger/debugger_test.dart
+++ b/tests/compiler/dartdevc_native/debugger/debugger_test.dart
@@ -1,3 +1,5 @@
+// @dart = 2.6
+
/// Debugger custom formatter tests.
/// If the tests fail, paste the expected output into the [expectedGolden]
/// string literal in this file and audit the diff to ensure changes are
@@ -84,7 +86,7 @@
String format(value) {
// Avoid double-escaping strings.
if (value is String) return value;
- return stringify(value, replacer, 4);
+ return stringify(value, allowInterop(replacer), 4);
}
class FormattedObject {
diff --git a/tests/compiler/dartdevc_native/hot_restart_test.dart b/tests/compiler/dartdevc_native/hot_restart_test.dart
index 37f01ba..c34f5d9 100644
--- a/tests/compiler/dartdevc_native/hot_restart_test.dart
+++ b/tests/compiler/dartdevc_native/hot_restart_test.dart
@@ -2,6 +2,8 @@
// 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.6
+
import 'package:expect/expect.dart';
import 'dart:_foreign_helper' show JS;
import 'dart:_runtime' as dart;
diff --git a/tests/compiler/dartdevc_native/hot_restart_timer_test.dart b/tests/compiler/dartdevc_native/hot_restart_timer_test.dart
index 9685f51..2a8d6df 100644
--- a/tests/compiler/dartdevc_native/hot_restart_timer_test.dart
+++ b/tests/compiler/dartdevc_native/hot_restart_timer_test.dart
@@ -2,6 +2,8 @@
// 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.6
+
import 'package:expect/expect.dart';
import 'dart:async';
import 'dart:_runtime' as dart;
diff --git a/tests/compiler/dartdevc_native/js_interop_test.dart b/tests/compiler/dartdevc_native/js_interop_test.dart
index 4303dfc..f067d17 100644
--- a/tests/compiler/dartdevc_native/js_interop_test.dart
+++ b/tests/compiler/dartdevc_native/js_interop_test.dart
@@ -2,6 +2,8 @@
// 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.6
+
@JS()
library js_interop_test;
diff --git a/tests/compiler/dartdevc_native/libraries_part.dart b/tests/compiler/dartdevc_native/libraries_part.dart
index d5ac766..c26498e 100644
--- a/tests/compiler/dartdevc_native/libraries_part.dart
+++ b/tests/compiler/dartdevc_native/libraries_part.dart
@@ -2,4 +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.6
+
part of 'libraries_test.dart';
diff --git a/tests/compiler/dartdevc_native/libraries_test.dart b/tests/compiler/dartdevc_native/libraries_test.dart
index 533eb5d..d22324f 100644
--- a/tests/compiler/dartdevc_native/libraries_test.dart
+++ b/tests/compiler/dartdevc_native/libraries_test.dart
@@ -2,6 +2,8 @@
// 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.6
+
import 'package:expect/expect.dart';
import 'dart:_foreign_helper' show JS;
import 'dart:_runtime' as dart;
diff --git a/tests/compiler/dartdevc_native/nnbd_basic_assignment.dart b/tests/compiler/dartdevc_native/nnbd_basic_assignment.dart
index 5bc08a7..f9f7fb8 100644
--- a/tests/compiler/dartdevc_native/nnbd_basic_assignment.dart
+++ b/tests/compiler/dartdevc_native/nnbd_basic_assignment.dart
@@ -1,10 +1,11 @@
// Copyright (c) 2019, 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';
// Requirements=nnbd
+import 'package:expect/expect.dart';
+
void main() {
int x = 42;
int? y;
diff --git a/tests/compiler/dartdevc_native/nnbd_js_interop_test.dart b/tests/compiler/dartdevc_native/nnbd_js_interop_test.dart
index 56ce33f..ef7f6b3 100644
--- a/tests/compiler/dartdevc_native/nnbd_js_interop_test.dart
+++ b/tests/compiler/dartdevc_native/nnbd_js_interop_test.dart
@@ -2,6 +2,8 @@
// 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.
+// Requirements=nnbd
+
@JS()
library js_interop_test;
@@ -12,8 +14,6 @@
import 'package:expect/expect.dart';
import 'package:js/js.dart';
-// Requirements=nnbd
-
@JS()
class Console {
@JS()
@@ -53,7 +53,7 @@
@JS()
@anonymous
class NestedJs {
- external factory NestedJs({String Function() constructorArg});
+ external factory NestedJs({required String Function() constructorArg});
external String get stringField;
}
@@ -96,10 +96,10 @@
_jsStaticVariable = localNonNull;
});
Expect.throws(() {
- _jsStaticVariable = localNullableLegacy;
+ _jsStaticVariable = localNullableLegacy!;
});
Expect.throws(() {
- _jsStaticVariable = localNullable;
+ _jsStaticVariable = localNullable!;
});
_jsStaticVariable = allowInterop(dartStaticMethod);
_jsStaticVariable = wrappedDartStaticMethod;
@@ -114,16 +114,16 @@
jsStaticFunction(dartStaticMethod);
});
Expect.throws(() {
- jsStaticFunction(localNonNullLegacy);
+ jsStaticFunction(localNonNullLegacy as String Function());
});
Expect.throws(() {
jsStaticFunction(localNonNull);
});
Expect.throws(() {
- jsStaticFunction(localNullableLegacy);
+ jsStaticFunction(localNullableLegacy as String Function());
});
Expect.throws(() {
- jsStaticFunction(localNullable);
+ jsStaticFunction(localNullable!);
});
jsStaticFunction(allowInterop(() => 'hello'));
jsStaticFunction(wrappedDartStaticMethod);
@@ -143,10 +143,10 @@
method(localNonNull);
});
Expect.throws(() {
- method(localNullableLegacy);
+ method(localNullableLegacy!);
});
Expect.throws(() {
- method(localNullable);
+ method(localNullable!);
});
method(allowInterop(() => 'hello'));
method(wrappedDartStaticMethod);
@@ -164,16 +164,16 @@
someClass.jsFunctionFieldSetter = dartStaticMethod;
}));
Expect.throws((() {
- someClass.jsFunctionFieldSetter = localNonNullLegacy;
+ someClass.jsFunctionFieldSetter = localNonNullLegacy as String Function();
}));
Expect.throws((() {
someClass.jsFunctionFieldSetter = localNonNull;
}));
Expect.throws((() {
- someClass.jsFunctionFieldSetter = localNullableLegacy;
+ someClass.jsFunctionFieldSetter = localNullableLegacy as String Function();
}));
Expect.throws((() {
- someClass.jsFunctionFieldSetter = localNullable;
+ someClass.jsFunctionFieldSetter = localNullable!;
}));
someClass.jsFunctionFieldSetter = allowInterop(() => 'hello');
someClass.jsFunctionFieldSetter = wrappedDartStaticMethod;
@@ -186,16 +186,16 @@
someClass.jsInstanceMethod(dartStaticMethod);
});
Expect.throws(() {
- someClass.jsInstanceMethod(localNonNullLegacy);
+ someClass.jsInstanceMethod(localNonNullLegacy as String Function());
});
Expect.throws(() {
someClass.jsInstanceMethod(localNonNull);
});
Expect.throws(() {
- someClass.jsInstanceMethod(localNullableLegacy);
+ someClass.jsInstanceMethod(localNullableLegacy as String Function());
});
Expect.throws(() {
- someClass.jsInstanceMethod(localNullable);
+ someClass.jsInstanceMethod(localNullable!);
});
someClass.jsInstanceMethod(allowInterop(() => 'hello'));
someClass.jsInstanceMethod(wrappedDartStaticMethod);
@@ -209,16 +209,16 @@
SomeClass(dartStaticMethod);
});
Expect.throws(() {
- SomeClass(localNonNullLegacy);
+ SomeClass(localNonNullLegacy as String Function());
});
Expect.throws(() {
SomeClass(localNonNull);
});
Expect.throws(() {
- SomeClass(localNullableLegacy);
+ SomeClass(localNullableLegacy as String Function());
});
Expect.throws(() {
- SomeClass(localNullable);
+ SomeClass(localNullable!);
});
SomeClass(allowInterop(() => 'hello'));
SomeClass(wrappedDartStaticMethod);
@@ -231,16 +231,16 @@
NestedJs(constructorArg: dartStaticMethod);
});
Expect.throws(() {
- NestedJs(constructorArg: localNonNullLegacy);
+ NestedJs(constructorArg: localNonNullLegacy as String Function());
});
Expect.throws(() {
NestedJs(constructorArg: localNonNull);
});
Expect.throws(() {
- NestedJs(constructorArg: localNullableLegacy);
+ NestedJs(constructorArg: localNullableLegacy as String Function());
});
Expect.throws(() {
- NestedJs(constructorArg: localNullable);
+ NestedJs(constructorArg: localNullable!);
});
NestedJs(constructorArg: allowInterop(() => 'hello'));
NestedJs(constructorArg: wrappedDartStaticMethod);
@@ -260,10 +260,10 @@
method(localNonNull);
});
Expect.throws(() {
- method(localNullableLegacy);
+ method(localNullableLegacy!);
});
Expect.throws(() {
- method(localNullable);
+ method(localNullable!);
});
method(allowInterop(() => 'hello'));
method(wrappedDartStaticMethod);
@@ -276,16 +276,16 @@
someClass.jsFunctionFieldGetter(dartStaticMethod);
});
Expect.throws(() {
- someClass.jsFunctionFieldGetter(localNonNullLegacy);
+ someClass.jsFunctionFieldGetter(localNonNullLegacy as String Function());
});
Expect.throws(() {
someClass.jsFunctionFieldGetter(localNonNull);
});
Expect.throws(() {
- someClass.jsFunctionFieldGetter(localNullableLegacy);
+ someClass.jsFunctionFieldGetter(localNullableLegacy as String Function());
});
Expect.throws(() {
- someClass.jsFunctionFieldGetter(localNullable);
+ someClass.jsFunctionFieldGetter(localNullable!);
});
someClass.jsFunctionFieldGetter(allowInterop(() => 'hello'));
someClass.jsFunctionFieldGetter(wrappedDartStaticMethod);
@@ -309,10 +309,10 @@
// method(localNonNull);
//});
//Expect.throws(() {
- // method(localNullableLegacy);
+ // method(localNullableLegacy as String Function());
//});
//Expect.throws(() {
- // method(localNullable);
+ // method(localNullable!);
//});
method(allowInterop(() => 'hello'));
method(wrappedDartStaticMethod);
diff --git a/tests/compiler/dartdevc_native/nnbd_strong_subtype_test.dart b/tests/compiler/dartdevc_native/nnbd_strong_subtype_test.dart
index afe9afa..9bc25d9 100644
--- a/tests/compiler/dartdevc_native/nnbd_strong_subtype_test.dart
+++ b/tests/compiler/dartdevc_native/nnbd_strong_subtype_test.dart
@@ -4,7 +4,7 @@
// Requirements=nnbd-strong
-import 'dart:async';
+import 'dart:async' show Future;
import 'runtime_utils.dart' show futureOrOf, voidType;
import 'runtime_utils_nnbd.dart';
diff --git a/tests/compiler/dartdevc_native/no_such_method_errors_test.dart b/tests/compiler/dartdevc_native/no_such_method_errors_test.dart
index 1edcf7e..64d3302 100644
--- a/tests/compiler/dartdevc_native/no_such_method_errors_test.dart
+++ b/tests/compiler/dartdevc_native/no_such_method_errors_test.dart
@@ -2,6 +2,8 @@
// 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.6
+
import "utils.dart";
class A {
diff --git a/tests/compiler/dartdevc_native/runtime_utils.dart b/tests/compiler/dartdevc_native/runtime_utils.dart
index 79134c3..b5a32c0 100644
--- a/tests/compiler/dartdevc_native/runtime_utils.dart
+++ b/tests/compiler/dartdevc_native/runtime_utils.dart
@@ -5,7 +5,7 @@
import 'dart:_foreign_helper' show JS;
import 'dart:_runtime' as dart;
-import 'dart:async';
+import 'dart:async' show FutureOr;
import 'package:expect/expect.dart';
// Function type used to extract the FutureOr now that a raw FutureOr gets
diff --git a/tests/compiler/dartdevc_native/subtype_test.dart b/tests/compiler/dartdevc_native/subtype_test.dart
index e8c0534..93d7ebc7 100644
--- a/tests/compiler/dartdevc_native/subtype_test.dart
+++ b/tests/compiler/dartdevc_native/subtype_test.dart
@@ -2,6 +2,8 @@
// 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.6
+
import 'dart:async';
import 'runtime_utils.dart';
diff --git a/tests/compiler/dartdevc_native/utils.dart b/tests/compiler/dartdevc_native/utils.dart
index 79440f7..dff17dc 100644
--- a/tests/compiler/dartdevc_native/utils.dart
+++ b/tests/compiler/dartdevc_native/utils.dart
@@ -2,6 +2,8 @@
// 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.6
+
import "package:expect/expect.dart";
/// Expects that [expected] appears as a substring in [actual].
diff --git a/tests/compiler/dartdevc_native/variance_subtype_test.dart b/tests/compiler/dartdevc_native/variance_subtype_test.dart
index 6b993bc..96090bb 100644
--- a/tests/compiler/dartdevc_native/variance_subtype_test.dart
+++ b/tests/compiler/dartdevc_native/variance_subtype_test.dart
@@ -2,10 +2,12 @@
// 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 runtime subtyping with explicit variance modifiers.
+// @dart = 2.6
// SharedOptions=--enable-experiment=variance
+// Tests runtime subtyping with explicit variance modifiers.
+
import 'dart:async';
import 'runtime_utils.dart';
diff --git a/tests/compiler/dartdevc_native/variance_test.dart b/tests/compiler/dartdevc_native/variance_test.dart
index ec4fca2..b649ca3 100644
--- a/tests/compiler/dartdevc_native/variance_test.dart
+++ b/tests/compiler/dartdevc_native/variance_test.dart
@@ -2,10 +2,12 @@
// 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 the emission of explicit variance modifiers.
+// @dart = 2.6
// SharedOptions=--enable-experiment=variance
+// Tests the emission of explicit variance modifiers.
+
import 'dart:_runtime' as dart;
import 'package:expect/expect.dart';
diff --git a/tests/corelib/errors_test.dart b/tests/corelib/errors_test.dart
index 763b486..9d040c9 100644
--- a/tests/corelib/errors_test.dart
+++ b/tests/corelib/errors_test.dart
@@ -74,4 +74,27 @@
"RangeError: Index out of range: "
"index must not be negative: -5",
new RangeError.index(-5, [1, 2, 3]).toString());
+
+ Expect.equals(42, ArgumentError.checkNotNull(42));
+ Expect.equals(42, ArgumentError.checkNotNull(42, "name"));
+ Expect.throwsArgumentError(() => ArgumentError.checkNotNull(null));
+
+ Expect.equals(1, RangeError.checkNotNegative(1));
+ Expect.equals(0, RangeError.checkNotNegative(0));
+ Expect.throwsRangeError(() => RangeError.checkNotNegative(-1));
+
+ Expect.equals(1, RangeError.checkValueInInterval(1, 0, 2));
+ Expect.equals(1, RangeError.checkValueInInterval(1, 1, 2));
+ Expect.equals(1, RangeError.checkValueInInterval(1, 0, 1));
+ Expect.equals(1, RangeError.checkValueInInterval(1, 1, 1));
+ Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 2, 3));
+ Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 1, 0));
+ Expect.throwsRangeError(() => RangeError.checkValueInInterval(0, 1, 0));
+
+ Expect.equals(1, RangeError.checkValidIndex(1, [1, 2]));
+ Expect.equals(1, RangeError.checkValidIndex(1, null, null, 2));
+ Expect.throwsRangeError(() => RangeError.checkValidIndex(1, []));
+ Expect.throwsRangeError(() => RangeError.checkValidIndex(1, null, null, 1));
+ Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, [1, 2, 3]));
+ Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, null, null, 3));
}
diff --git a/tests/corelib/map_entry_test.dart b/tests/corelib/map_entry_test.dart
index 640b8cc..152fd6b 100644
--- a/tests/corelib/map_entry_test.dart
+++ b/tests/corelib/map_entry_test.dart
@@ -27,18 +27,18 @@
checkEntries(baseMap, baseMap);
checkEntries(baseMap, new Map<String, Object>.unmodifiable(baseMap));
checkMap({"x": 0, "y": 1});
- checkMap(new Map<String, Object>.from(baseMap));
- checkMap(new HashMap<String, Object>.from(baseMap));
- checkMap(new LinkedHashMap<String, Object>.from(baseMap));
- checkMap(new SplayTreeMap<String, Object>.from(baseMap));
+ checkMap(new Map<String, dynamic>.from(baseMap));
+ checkMap(new HashMap<String, dynamic>.from(baseMap));
+ checkMap(new LinkedHashMap<String, dynamic>.from(baseMap));
+ checkMap(new SplayTreeMap<String, dynamic>.from(baseMap));
checkMap(json.decode('{"x":0,"y":1}'));
}
-void checkMap(Map<String, Object> map) {
+void checkMap(Map<String, dynamic> map) {
checkEntries(baseMap, map);
- map.addEntries([new MapEntry<String, Object>("z", 2)]);
+ map.addEntries([new MapEntry<String, dynamic>("z", 2)]);
checkEntries({"x": 0, "y": 1, "z": 2}, map);
- map.addEntries(<MapEntry<String, Object>>[
+ map.addEntries(<MapEntry<String, dynamic>>[
new MapEntry("y", 11),
new MapEntry("v", 3),
new MapEntry("w", 4)
diff --git a/tests/corelib/map_set_undefined_test.dart b/tests/corelib/map_set_undefined_test.dart
index 338259e..22f7e71 100644
--- a/tests/corelib/map_set_undefined_test.dart
+++ b/tests/corelib/map_set_undefined_test.dart
@@ -23,7 +23,7 @@
isValidKey: (_) => true));
}
-testMap(Map<Object, Object> map) {
+testMap(Map<Object, Object?> map) {
var t = map.runtimeType.toString();
var s = ' (length ${map.length})';
checkUndefined('$t.[]$s', map['hi']);
diff --git a/tests/corelib/map_test.dart b/tests/corelib/map_test.dart
index a768aa3..74f0577 100644
--- a/tests/corelib/map_test.dart
+++ b/tests/corelib/map_test.dart
@@ -382,7 +382,7 @@
Map m = {"a": 1, "b": 2, "c": 3};
Expect.equals(3, m.length);
int sum = 0;
- m.forEach((a, int b) {
+ m.forEach((a, b) {
sum += b;
});
Expect.equals(6, sum);
diff --git a/tests/corelib/queue_iterator_test.dart b/tests/corelib/queue_iterator_test.dart
index c42e7b7..d7da61f 100644
--- a/tests/corelib/queue_iterator_test.dart
+++ b/tests/corelib/queue_iterator_test.dart
@@ -14,7 +14,7 @@
testEmptyQueue();
}
- static int sum(int expected, Iterator<int> it) {
+ static void sum(int expected, Iterator<int> it) {
int count = 0;
while (it.moveNext()) {
count += it.current;
diff --git a/tests/corelib/set_iterator_test.dart b/tests/corelib/set_iterator_test.dart
index 4b36545..17bf821 100644
--- a/tests/corelib/set_iterator_test.dart
+++ b/tests/corelib/set_iterator_test.dart
@@ -23,7 +23,7 @@
testDifferentHashCodes();
}
- static int sum(int expected, Iterator<int> it) {
+ static void sum(int expected, Iterator<int> it) {
int count = 0;
while (it.moveNext()) {
count += it.current;
diff --git a/tests/corelib_2/errors_test.dart b/tests/corelib_2/errors_test.dart
index 763b486..9d040c9 100644
--- a/tests/corelib_2/errors_test.dart
+++ b/tests/corelib_2/errors_test.dart
@@ -74,4 +74,27 @@
"RangeError: Index out of range: "
"index must not be negative: -5",
new RangeError.index(-5, [1, 2, 3]).toString());
+
+ Expect.equals(42, ArgumentError.checkNotNull(42));
+ Expect.equals(42, ArgumentError.checkNotNull(42, "name"));
+ Expect.throwsArgumentError(() => ArgumentError.checkNotNull(null));
+
+ Expect.equals(1, RangeError.checkNotNegative(1));
+ Expect.equals(0, RangeError.checkNotNegative(0));
+ Expect.throwsRangeError(() => RangeError.checkNotNegative(-1));
+
+ Expect.equals(1, RangeError.checkValueInInterval(1, 0, 2));
+ Expect.equals(1, RangeError.checkValueInInterval(1, 1, 2));
+ Expect.equals(1, RangeError.checkValueInInterval(1, 0, 1));
+ Expect.equals(1, RangeError.checkValueInInterval(1, 1, 1));
+ Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 2, 3));
+ Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 1, 0));
+ Expect.throwsRangeError(() => RangeError.checkValueInInterval(0, 1, 0));
+
+ Expect.equals(1, RangeError.checkValidIndex(1, [1, 2]));
+ Expect.equals(1, RangeError.checkValidIndex(1, null, null, 2));
+ Expect.throwsRangeError(() => RangeError.checkValidIndex(1, []));
+ Expect.throwsRangeError(() => RangeError.checkValidIndex(1, null, null, 1));
+ Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, [1, 2, 3]));
+ Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, null, null, 3));
}
diff --git a/tests/corelib_2/from_environment_const_type_undefined_test.dart b/tests/corelib_2/from_environment_const_type_undefined_test.dart
index c2e90ef..d63d75f 100644
--- a/tests/corelib_2/from_environment_const_type_undefined_test.dart
+++ b/tests/corelib_2/from_environment_const_type_undefined_test.dart
@@ -25,14 +25,14 @@
int // //# 10: ok
String //# 11: compile-time error
Foo // //# 12: compile-time error
- c = const int.fromEnvironment('c');
+ c = const int.fromEnvironment('c', defaultValue: 0);
const
bool // //# 13: compile-time error
int // //# 14: compile-time error
String //# 15: ok
Foo // //# 16: compile-time error
- d = const String.fromEnvironment('d');
+ d = const String.fromEnvironment('d', defaultValue: '');
main() {
Expect.equals(false, a);
diff --git a/tests/corelib_2/map_entry_test.dart b/tests/corelib_2/map_entry_test.dart
index 59c1cc9..98628d2 100644
--- a/tests/corelib_2/map_entry_test.dart
+++ b/tests/corelib_2/map_entry_test.dart
@@ -27,18 +27,18 @@
checkEntries(baseMap, baseMap);
checkEntries(baseMap, new Map<String, Object>.unmodifiable(baseMap));
checkMap({"x": 0, "y": 1});
- checkMap(new Map<String, Object>.from(baseMap));
- checkMap(new HashMap<String, Object>.from(baseMap));
- checkMap(new LinkedHashMap<String, Object>.from(baseMap));
- checkMap(new SplayTreeMap<String, Object>.from(baseMap));
+ checkMap(new Map<String, dynamic>.from(baseMap));
+ checkMap(new HashMap<String, dynamic>.from(baseMap));
+ checkMap(new LinkedHashMap<String, dynamic>.from(baseMap));
+ checkMap(new SplayTreeMap<String, dynamic>.from(baseMap));
checkMap(json.decode('{"x":0,"y":1}'));
}
-void checkMap(Map<String, Object> map) {
+void checkMap(Map<String, dynamic> map) {
checkEntries(baseMap, map);
- map.addEntries([new MapEntry<String, Object>("z", 2)]);
+ map.addEntries([new MapEntry<String, dynamic>("z", 2)]);
checkEntries({"x": 0, "y": 1, "z": 2}, map);
- map.addEntries(<MapEntry<String, Object>>[
+ map.addEntries(<MapEntry<String, dynamic>>[
new MapEntry("y", 11),
new MapEntry("v", 3),
new MapEntry("w", 4)
diff --git a/tests/dart/.blazeproject b/tests/dart/.blazeproject
deleted file mode 100644
index 6877be6..0000000
--- a/tests/dart/.blazeproject
+++ /dev/null
@@ -1,10 +0,0 @@
-
-directories:
- # Add the directories you want added as source here
- experimental/users/jcollins/dart
-
-targets:
- # Add targets that reach the source code that you want to resolve here
- //experimental/users/jcollins/dart:deep_nesting1_negative_test
-additional_languages:
- dart
\ No newline at end of file
diff --git a/tests/ffi_2/ffi_2.status b/tests/ffi_2/ffi_2.status
index 8db64fb..c138d83 100644
--- a/tests/ffi_2/ffi_2.status
+++ b/tests/ffi_2/ffi_2.status
@@ -2,9 +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.
-[ $builder_tag == asan ]
-data_not_asan_test: SkipByDesign # This test tries to allocate too much memory on purpose.
-
[ $system == android ]
*: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
@@ -17,6 +14,9 @@
[ $arch == simarm || $arch == simarm64 ]
*: Skip # FFI not yet supported on the arm simulator.
+[ $builder_tag == asan || $builder_tag == msan || $builder_tag == tsan ]
+data_not_asan_test: SkipByDesign # This test tries to allocate too much memory on purpose.
+
# These tests trigger and catch an abort (intentionally) and terminate the VM.
# They're incompatible with ASAN because not all memory is freed when aborting and
# with AppJit because the abort the VM before it can generate a snapshot.
diff --git a/tests/language/assert/initializer_test.dart b/tests/language/assert/initializer_test.dart
index b2fe755..b5de1eb 100644
--- a/tests/language/assert/initializer_test.dart
+++ b/tests/language/assert/initializer_test.dart
@@ -82,7 +82,7 @@
bool assertionsEnabled = false;
assert(assertionsEnabled = true);
- bool Function(C Function()) doTest = (assertionsEnabled && x >= y)
+ void Function(C Function()) doTest = (assertionsEnabled && x >= y)
? (f) { Expect.throwsAssertionError(f); }
: (f) { Expect.equals(x, f().x); };
diff --git a/tests/language/async/await_test.dart b/tests/language/async/await_test.dart
index 6803b91..de063c9 100644
--- a/tests/language/async/await_test.dart
+++ b/tests/language/async/await_test.dart
@@ -2248,7 +2248,8 @@
Future timeout(Duration duration, {onTimeout()?}) => this;
}
-typedef BinaryFunction(a, b);
+typedef OnErrorCallback2 = dynamic Function(Object, StackTrace);
+typedef OnErrorCallback1 = dynamic Function(Object);
/**
* A non-standard implementation of Future with an error.
@@ -2258,10 +2259,17 @@
FakeErrorFuture(this._error);
Future<S> then<S>(callback(value), {Function? onError}) {
if (onError != null) {
- if (onError is BinaryFunction) {
- return new Future<S>.microtask(() => onError(_error, null));
+ if (onError is OnErrorCallback2) {
+ return new Future<S>.microtask(() => onError(_error, StackTrace.empty));
+ } else if (onError is OnErrorCallback1) {
+ return new Future<S>.microtask(() => onError(_error));
+ } else {
+ throw new ArgumentError.value(
+ onError,
+ "onError",
+ "Error handler must accept one Object or one Object and a StackTrace"
+ " as arguments, and return a valid result");
}
- return new Future<S>.microtask(() => onError(_error));
}
return new Future<S>.error(_error);
}
@@ -2275,10 +2283,17 @@
Future catchError(Function onError, {bool test(Object error)?}) {
return new Future.microtask(() {
if (test != null && !test(_error)) return this;
- if (onError is BinaryFunction) {
- return onError(_error, null);
+ if (onError is OnErrorCallback2) {
+ return onError(_error, StackTrace.empty);
+ } else if (onError is OnErrorCallback1) {
+ return onError(_error);
+ } else {
+ throw new ArgumentError.value(
+ onError,
+ "onError",
+ "Error handler must accept one Object or one Object and a StackTrace"
+ " as arguments, and return a valid result");
}
- return onError(_error);
});
}
diff --git a/tests/language/async/or_generator_return_type_stacktrace_test.dart b/tests/language/async/or_generator_return_type_stacktrace_test.dart
index 39fdb56..35f1f2d 100644
--- a/tests/language/async/or_generator_return_type_stacktrace_test.dart
+++ b/tests/language/async/or_generator_return_type_stacktrace_test.dart
@@ -4,7 +4,7 @@
import "package:expect/expect.dart";
-int badReturnTypeAsync() async {}
+int badReturnTypeAsync() async => 0;
// [error line 7, column 1, length 3]
// [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
// ^
diff --git a/tests/language/bool/has_environment_not_new_test.dart b/tests/language/bool/has_environment_not_new_test.dart
new file mode 100644
index 0000000..947c6be
--- /dev/null
+++ b/tests/language/bool/has_environment_not_new_test.dart
@@ -0,0 +1,9 @@
+// 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:expect/expect.dart";
+
+main() {
+ Expect.throws(() => new bool.hasEnvironment("Anything"));
+}
diff --git a/tests/language/bool/has_environment_test.dart b/tests/language/bool/has_environment_test.dart
new file mode 100644
index 0000000..df593f1
--- /dev/null
+++ b/tests/language/bool/has_environment_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// SharedOptions=-Da= -Db=b -Dc=Something
+
+import 'package:expect/expect.dart';
+
+main() {
+ Expect.isTrue(const bool.hasEnvironment('dart.library.core'));
+ Expect.isTrue(const bool.hasEnvironment('a'));
+ Expect.isTrue(const bool.hasEnvironment('b'));
+ Expect.isTrue(const bool.hasEnvironment('c'));
+ Expect.isFalse(const bool.hasEnvironment('d'));
+}
diff --git a/tests/language/call/non_method_field_test.dart b/tests/language/call/non_method_field_test.dart
index 83a022d..6d30f27 100644
--- a/tests/language/call/non_method_field_test.dart
+++ b/tests/language/call/non_method_field_test.dart
@@ -15,13 +15,13 @@
x1.i();
//^^^^
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-// ^
+// ^
// [cfe] 'i' isn't a function or method and can't be invoked.
Hest x2 = new Hest();
x2.i();
//^^^^
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-// ^
+// ^
// [cfe] 'i' isn't a function or method and can't be invoked.
}
diff --git a/tests/language_2/async/await_test.dart b/tests/language_2/async/await_test.dart
index d434da9..8c7bf2f 100644
--- a/tests/language_2/async/await_test.dart
+++ b/tests/language_2/async/await_test.dart
@@ -2247,7 +2247,8 @@
Future timeout(Duration duration, {onTimeout()}) => this;
}
-typedef BinaryFunction(a, b);
+typedef OnErrorCallback2 = dynamic Function(Object, StackTrace);
+typedef OnErrorCallback1 = dynamic Function(Object);
/**
* A non-standard implementation of Future with an error.
@@ -2257,10 +2258,17 @@
FakeErrorFuture(this._error);
Future<S> then<S>(callback(value), {Function onError}) {
if (onError != null) {
- if (onError is BinaryFunction) {
+ if (onError is OnErrorCallback2) {
return new Future<S>.microtask(() => onError(_error, null));
+ } else if (onError is OnErrorCallback1) {
+ return new Future<S>.microtask(() => onError(_error));
+ } else {
+ throw new ArgumentError.value(
+ onError,
+ "onError",
+ "Error handler must accept one Object or one Object and a StackTrace"
+ " as arguments, and return a valid result");
}
- return new Future<S>.microtask(() => onError(_error));
}
return new Future<S>.error(_error);
}
@@ -2274,10 +2282,17 @@
Future catchError(Function onError, {bool test(error)}) {
return new Future.microtask(() {
if (test != null && !test(_error)) return this;
- if (onError is BinaryFunction) {
+ if (onError is OnErrorCallback2) {
return onError(_error, null);
+ } else if (onError is OnErrorCallback1) {
+ return onError(_error);
+ } else {
+ throw new ArgumentError.value(
+ onError,
+ "onError",
+ "Error handler must accept one Object or one Object and a StackTrace"
+ " as arguments, and return a valid result");
}
- return onError(_error);
});
}
diff --git a/tests/language_2/call/non_method_field_test.dart b/tests/language_2/call/non_method_field_test.dart
index 7bd4490..8fbd2a9 100644
--- a/tests/language_2/call/non_method_field_test.dart
+++ b/tests/language_2/call/non_method_field_test.dart
@@ -15,13 +15,13 @@
x1.i();
//^^^^
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-// ^
+// ^
// [cfe] 'i' isn't a function or method and can't be invoked.
Hest x2 = new Hest();
x2.i();
//^^^^
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-// ^
+// ^
// [cfe] 'i' isn't a function or method and can't be invoked.
}
diff --git a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
index a2aea8c..5cf5c20 100644
--- a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
+++ b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
@@ -63,7 +63,7 @@
c0[0] = 0;
//^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]=' isn't defined for the class 'C0'.
+ // [cfe] The operator '[]=' isn't defined for the class 'C0'.
E0(c0)[0];
// ^^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
@@ -73,20 +73,20 @@
c0[0] += 0;
//^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]=' isn't defined for the class 'C0'.
+ // [cfe] The operator '[]=' isn't defined for the class 'C0'.
c0[0]++;
//^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]=' isn't defined for the class 'C0'.
+ // [cfe] The operator '[]=' isn't defined for the class 'C0'.
E0(c0)[0] += 0;
// ^^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
- // [cfe] The method '[]' isn't defined for the class 'C0'.
+ // [cfe] The operator '[]' isn't defined for the class 'C0'.
E0(c0)[0]++;
// ^^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
- // [cfe] The method '[]' isn't defined for the class 'C0'.
+ // [cfe] The operator '[]' isn't defined for the class 'C0'.
}
// Conflicting extensions.
@@ -124,17 +124,17 @@
c1a[0] = 0;
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]=' isn't defined for the class 'C1<int>'.
+ // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
c1a[0] += 0;
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]=' isn't defined for the class 'C1<int>'.
+ // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
c1a[0]++;
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]=' isn't defined for the class 'C1<int>'.
+ // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
c1a[0];
@@ -143,59 +143,55 @@
c1b.m1;
// ^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'm1' isn't defined for the class 'C1<Object>'.
+ // [cfe] The property 'm1' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
c1b.m1 = 0;
// ^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'm1' isn't defined for the class 'C1<Object>'.
+ // [cfe] The property 'm1' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
c1b.m1 += 0;
// ^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'm1' isn't defined for the class 'C1<Object>'.
- // ^
- // [cfe] The setter 'm1' isn't defined for the class 'C1<Object>'.
+ // [cfe] The property 'm1' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
c1b.m1++;
// ^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'm1' isn't defined for the class 'C1<Object>'.
- // ^
- // [cfe] The setter 'm1' isn't defined for the class 'C1<Object>'.
+ // [cfe] The property 'm1' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
c1b.m2;
// ^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'm2' isn't defined for the class 'C1<Object>'.
+ // [cfe] The property 'm2' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
c1b[0];
//^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // ^
- // [cfe] The method '[]' isn't defined for the class 'C1<Object>'.
+// ^
+// [cfe] The operator '[]' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
c1b[0] = 0;
//^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // ^
- // [cfe] The method '[]=' isn't defined for the class 'C1<Object>'.
+// ^
+// [cfe] The operator '[]=' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
c1b[0] += 0;
//^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // ^
- // [cfe] The method '[]' isn't defined for the class 'C1<Object>'.
- // ^
- // [cfe] The method '[]=' isn't defined for the class 'C1<Object>'.
+// ^
+// [cfe] The operator '[]' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
+// ^
+// [cfe] The operator '[]=' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
c1b[0]++;
//^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // ^
- // [cfe] The method '[]' isn't defined for the class 'C1<Object>'.
- // ^
- // [cfe] The method '[]=' isn't defined for the class 'C1<Object>'.
+// ^
+// [cfe] The operator '[]' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
+// ^
+// [cfe] The operator '[]=' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
}
// Getter on the extension itself.
@@ -231,17 +227,17 @@
this[0];
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]' isn't defined for the class 'C2'.
+ // [cfe] The operator '[]' isn't defined for the class 'C2'.
this[0] += 0;
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]' isn't defined for the class 'C2'.
+ // [cfe] The operator '[]' isn't defined for the class 'C2'.
this[0]++;
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]' isn't defined for the class 'C2'.
+ // [cfe] The operator '[]' isn't defined for the class 'C2'.
// Check that `this.mc` refers to `C2.mc`.
this.mc.toRadixString(16);
diff --git a/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
index 04d90b6..5c5c1c7 100644
--- a/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
@@ -259,6 +259,7 @@
extensionMethod(4);
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// ^
// [cfe] 'extensionMethod' isn't a function or method and can't be invoked.
}
}
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart
index 01886be..b0409f9 100644
--- a/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart
@@ -96,21 +96,21 @@
bool t0 = this.fieldInGlobalScope;
// ^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t0);
bool t1 = this.getterInGlobalScope;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t1);
this.setterInGlobalScope = extensionValue;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
bool t2 = this.methodInGlobalScope();
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t2);
}
@@ -140,21 +140,21 @@
bool t0 = self.fieldInGlobalScope;
// ^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t0);
bool t1 = self.getterInGlobalScope;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t1);
self.setterInGlobalScope = extensionValue;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
bool t2 = self.methodInGlobalScope();
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t2);
}
@@ -224,21 +224,21 @@
bool t0 = a.fieldInGlobalScope;
// ^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t0);
bool t1 = a.getterInGlobalScope;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t1);
a.setterInGlobalScope = extensionValue;
//^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
bool t2 = a.methodInGlobalScope();
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t2);
}
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart
index dcb362a..6cd8d4b 100644
--- a/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart
@@ -96,21 +96,21 @@
bool t0 = this.fieldInGlobalScope;
// ^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t0);
bool t1 = this.getterInGlobalScope;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t1);
this.setterInGlobalScope = extensionValue;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
bool t2 = this.methodInGlobalScope();
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t2);
}
@@ -125,21 +125,21 @@
bool t0 = this.fieldInExtensionScope;
// ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The property 'fieldInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t0);
bool t1 = this.getterInExtensionScope;
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The property 'getterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t1);
this.setterInExtensionScope = extensionValue;
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'setterInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The property 'setterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
bool t2 = this.methodInExtensionScope();
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The method 'methodInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t2);
}
@@ -158,21 +158,21 @@
bool t0 = self.fieldInGlobalScope;
// ^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t0);
bool t1 = self.getterInGlobalScope;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t1);
self.setterInGlobalScope = extensionValue;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
bool t2 = self.methodInGlobalScope();
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t2);
}
@@ -187,21 +187,21 @@
bool t0 = self.fieldInExtensionScope;
// ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The property 'fieldInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t0);
bool t1 = self.getterInExtensionScope;
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The property 'getterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t1);
self.setterInExtensionScope = extensionValue;
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'setterInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The property 'setterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
bool t2 = self.methodInExtensionScope();
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The method 'methodInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t2);
}
@@ -238,27 +238,27 @@
bool t0 = fieldInExtensionScope;
// ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInExtensionScope' isn't defined for the class 'B'.
+ // [cfe] The property 'fieldInExtensionScope' is defined in multiple extensions for 'B' and neither is more specific.
// ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
checkExtensionValue(t0);
bool t1 = getterInExtensionScope;
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInExtensionScope' isn't defined for the class 'B'.
+ // [cfe] The property 'getterInExtensionScope' is defined in multiple extensions for 'B' and neither is more specific.
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
checkExtensionValue(t1);
setterInExtensionScope = extensionValue;
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-// [cfe] The setter 'setterInExtensionScope' isn't defined for the class 'B'.
+// [cfe] The property 'setterInExtensionScope' is defined in multiple extensions for 'B' and neither is more specific.
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
bool t2 = methodInExtensionScope();
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInExtensionScope' isn't defined for the class 'B'.
+ // [cfe] The method 'methodInExtensionScope' is defined in multiple extensions for 'B' and neither is more specific.
checkExtensionValue(t2);
}
@@ -283,21 +283,21 @@
bool t0 = a.fieldInGlobalScope;
// ^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t0);
bool t1 = a.getterInGlobalScope;
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t1);
a.setterInGlobalScope = extensionValue;
//^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
bool t2 = a.methodInGlobalScope();
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+ // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t2);
}
@@ -312,21 +312,21 @@
bool t0 = a.fieldInExtensionScope;
// ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'fieldInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The property 'fieldInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t0);
bool t1 = a.getterInExtensionScope;
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'getterInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The property 'getterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t1);
a.setterInExtensionScope = extensionValue;
//^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The setter 'setterInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The property 'setterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
bool t2 = a.methodInExtensionScope();
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'methodInExtensionScope' isn't defined for the class 'A'.
+ // [cfe] The method 'methodInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
checkExtensionValue(t2);
}
diff --git a/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart b/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart
index 666fbcf7..7f3993f 100644
--- a/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart
+++ b/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart
@@ -12,5 +12,5 @@
o.onObject;
//^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'onObject' isn't defined for the class 'Object'.
+ // [cfe] The property 'onObject' is defined in multiple extensions for 'Object' and neither is more specific.
}
diff --git a/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
index dc9b18c..f68d72b 100644
--- a/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
+++ b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
@@ -26,7 +26,7 @@
c.v2;
//^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'v2' isn't defined for the class 'C'.
+ // [cfe] The property 'v2' is defined in multiple extensions for 'C' and neither is more specific.
Expect.equals("EA.v3", a.v3);
Expect.equals("EA.v3", b1.v3);
@@ -51,20 +51,20 @@
li.i_num;
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'i_num' isn't defined for the class 'List<int>'.
+ // [cfe] The property 'i_num' is defined in multiple extensions for 'List<int>' and neither is more specific.
// no most specific because both are equally specific.
c.cs;
//^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The getter 'cs' isn't defined for the class 'C'.
+ // [cfe] The property 'cs' is defined in multiple extensions for 'C' and neither is more specific.
// Both EIT.e1 and ELO.e1 apply, but their instantiated on
// types are incomparable, and hence this is an error.
ln.e1();
// ^^
// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
- // [cfe] The method 'e1' isn't defined for the class 'List<num>'.
+ // [cfe] The method 'e1' is defined in multiple extensions for 'List<num>' and neither is more specific.
}
// Diamond class hierarchy.
diff --git a/tests/language_2/string/const_interpolation2_test.dart b/tests/language_2/string/const_interpolation2_test.dart
index 968d2c2..c9c373c 100644
--- a/tests/language_2/string/const_interpolation2_test.dart
+++ b/tests/language_2/string/const_interpolation2_test.dart
@@ -9,9 +9,15 @@
const u1 = null;
const int u2 = null;
const List u3 = null;
-const u4 = const String.fromEnvironment("XXXXX");
-const u5 = const int.fromEnvironment("XXXXX");
-const u6 = const bool.fromEnvironment("XXXXX", defaultValue: null);
+const u4 = const bool.hasEnvironment("XXXXX")
+ ? const String.fromEnvironment("XXXXX")
+ : null;
+const u5 = const bool.hasEnvironment("XXXXX")
+ ? const int.fromEnvironment("XXXXX")
+ : null;
+const u6 = bool.hasEnvironment("XXXXX")
+ ? const bool.fromEnvironment("XXXXX")
+ : null;
const n1 = 42;
const n2 = 3.1415;
const int n3 = 37;
@@ -88,7 +94,7 @@
Expect.equals(b2.toString(), sb2);
Expect.equals(b3.toString(), sb3);
Expect.equals(b4.toString(), sb4);
- var expect = "null null null 0 null 42 3.1415 37 4.6692 2.71828 87 "
+ var expect = "null null null null null null 42 3.1415 37 4.6692 2.71828 87 "
"s1 s2 s1s2 s4 true false false true";
Expect.equals(expect, interpolation1);
Expect.equals(expect, interpolation2);
diff --git a/tests/language_2/string/no_operator_test.dart b/tests/language_2/string/no_operator_test.dart
index e6bf231..e6da249 100644
--- a/tests/language_2/string/no_operator_test.dart
+++ b/tests/language_2/string/no_operator_test.dart
@@ -10,23 +10,23 @@
Expect.throws(() => x < y);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '<' isn't defined for the class 'String'.
+ // [cfe] The operator '<' isn't defined for the class 'String'.
Expect.throws(() => x <= y);
// ^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '<=' isn't defined for the class 'String'.
+ // [cfe] The operator '<=' isn't defined for the class 'String'.
Expect.throws(() => x > y);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '>' isn't defined for the class 'String'.
+ // [cfe] The operator '>' isn't defined for the class 'String'.
Expect.throws(() => x >= y);
// ^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '>=' isn't defined for the class 'String'.
+ // [cfe] The operator '>=' isn't defined for the class 'String'.
Expect.throws(() => x - y);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '-' isn't defined for the class 'String'.
+ // [cfe] The operator '-' isn't defined for the class 'String'.
Expect.throws(() => x * y);
// ^
// [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
@@ -34,41 +34,41 @@
Expect.throws(() => x / y);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '/' isn't defined for the class 'String'.
+ // [cfe] The operator '/' isn't defined for the class 'String'.
Expect.throws(() => x ~/ y);
// ^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '~/' isn't defined for the class 'String'.
+ // [cfe] The operator '~/' isn't defined for the class 'String'.
Expect.throws(() => x % y);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '%' isn't defined for the class 'String'.
+ // [cfe] The operator '%' isn't defined for the class 'String'.
Expect.throws(() => x >> y);
// ^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '>>' isn't defined for the class 'String'.
+ // [cfe] The operator '>>' isn't defined for the class 'String'.
Expect.throws(() => x << y);
// ^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '<<' isn't defined for the class 'String'.
+ // [cfe] The operator '<<' isn't defined for the class 'String'.
Expect.throws(() => x & y);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '&' isn't defined for the class 'String'.
+ // [cfe] The operator '&' isn't defined for the class 'String'.
Expect.throws(() => x | y);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '|' isn't defined for the class 'String'.
+ // [cfe] The operator '|' isn't defined for the class 'String'.
Expect.throws(() => x ^ y);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '^' isn't defined for the class 'String'.
+ // [cfe] The operator '^' isn't defined for the class 'String'.
Expect.throws(() => -x);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method 'unary-' isn't defined for the class 'String'.
+ // [cfe] The operator 'unary-' isn't defined for the class 'String'.
Expect.throws(() => ~x);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '~' isn't defined for the class 'String'.
+ // [cfe] The operator '~' isn't defined for the class 'String'.
}
diff --git a/tests/language_2/string/string_test.dart b/tests/language_2/string/string_test.dart
index 275d888..da6d40a 100644
--- a/tests/language_2/string/string_test.dart
+++ b/tests/language_2/string/string_test.dart
@@ -34,7 +34,7 @@
a[1] = 12;
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-// [cfe] The method '[]=' isn't defined for the class 'String'.
+// [cfe] The operator '[]=' isn't defined for the class 'String'.
}
static testCharCodes() {
diff --git a/tests/language_2/type_object/first_class_types_literals_test.dart b/tests/language_2/type_object/first_class_types_literals_test.dart
index e256332..77cf8b6 100644
--- a/tests/language_2/type_object/first_class_types_literals_test.dart
+++ b/tests/language_2/type_object/first_class_types_literals_test.dart
@@ -64,15 +64,15 @@
Expect.throwsNoSuchMethodError(() => C + 1);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '+' isn't defined for the class 'Type'.
+ // [cfe] The operator '+' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => C[2]);
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]' isn't defined for the class 'Type'.
+ // [cfe] The operator '[]' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => C[2] = 'hest');
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]=' isn't defined for the class 'Type'.
+ // [cfe] The operator '[]=' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => dynamic = 1);
// ^
// [cfe] Setter not found: 'dynamic'.
@@ -86,15 +86,15 @@
Expect.throwsNoSuchMethodError(() => dynamic + 1);
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '+' isn't defined for the class 'Type'.
+ // [cfe] The operator '+' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => dynamic[2]);
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]' isn't defined for the class 'Type'.
+ // [cfe] The operator '[]' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => dynamic[2] = 'hest');
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]=' isn't defined for the class 'Type'.
+ // [cfe] The operator '[]=' isn't defined for the class 'Type'.
Expect.equals((dynamic).toString(), 'dynamic');
}
diff --git a/tests/language_2/type_variable/conflict2_test.dart b/tests/language_2/type_variable/conflict2_test.dart
index c164e5d..4a03e01 100644
--- a/tests/language_2/type_variable/conflict2_test.dart
+++ b/tests/language_2/type_variable/conflict2_test.dart
@@ -58,7 +58,7 @@
grault() => T[0];
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]' isn't defined for the class 'Type'.
+ // [cfe] The operator '[]' isn't defined for the class 'Type'.
// Runtime type T not accessible from static context. Compile-time error.
static garply() => T[0];
@@ -67,7 +67,7 @@
// [cfe] Type variables can't be used in static members.
// ^^^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '[]' isn't defined for the class 'Type'.
+ // [cfe] The operator '[]' isn't defined for the class 'Type'.
// Class '_Type' has no member m: NoSuchMethodError.
waldo() => T.m;
diff --git a/tests/language_2/unsorted/unevaluated_field.dart b/tests/language_2/unsorted/unevaluated_field.dart
index 3567a7c..5c701db 100644
--- a/tests/language_2/unsorted/unevaluated_field.dart
+++ b/tests/language_2/unsorted/unevaluated_field.dart
@@ -6,11 +6,13 @@
import "package:expect/expect.dart";
-const int gx = const int.fromEnvironment("x");
+const int gx =
+ const bool.hasEnvironment("x") ? const int.fromEnvironment("x") : null;
class A {
final int x = gx;
- final int y = const int.fromEnvironment("y");
+ final int y =
+ const bool.hasEnvironment("y") ? const int.fromEnvironment("y") : null;
const A();
}
diff --git a/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart b/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
index 38c1d84..28c1add 100644
--- a/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
+++ b/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
@@ -18,7 +18,7 @@
List<out String> bar;
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '<' isn't defined for the class 'Type'.
+ // [cfe] The operator '<' isn't defined for the class 'Type'.
// ^^^
// [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
// [cfe] Expected ';' after this.
@@ -27,7 +27,7 @@
// [cfe] Getter not found: 'out'.
// ^
// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
- // [cfe] The method '>' isn't defined for the class 'Type'.
+ // [cfe] The operator '>' isn't defined for the class 'Type'.
// ^^^
// [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
// [cfe] Getter not found: 'bar'.
diff --git a/tests/language_2/vm/regress_28325_test.dart b/tests/language_2/vm/regress_28325_test.dart
deleted file mode 100644
index 95791ac..0000000
--- a/tests/language_2/vm/regress_28325_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2017, 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.
-
-// Test source positions in async errors.
-
-import "package:expect/expect.dart";
-import "dart:io";
-
-main() async {
- try {
- await Socket.connect("localhost", 0);
- Expect.isTrue(false); // Unreachable.
- } catch (e, s) {
- Expect.isTrue(e is SocketException);
- Expect.isTrue(s.toString().contains("regress_28325_test.dart"));
- print(s);
- Expect.isTrue(s.toString().contains(":12")); // Line number of "await".
- }
-}
diff --git a/tests/lib/async/future_foreach_test.dart b/tests/lib/async/future_foreach_test.dart
index 904ae80..af5426f 100644
--- a/tests/lib/async/future_foreach_test.dart
+++ b/tests/lib/async/future_foreach_test.dart
@@ -67,6 +67,7 @@
case 2:
return new Future.microtask(() {});
}
+ return new Future.value();
}).then((_) {
Expect.fail("Did not throw");
}, onError: (e) {
@@ -101,6 +102,7 @@
case 2:
return new Future.microtask(() {});
}
+ return new Future.value();
}).then((_) {
Expect.fail("Did not throw");
}, onError: (e) {
diff --git a/tests/lib/async/futures_test.dart b/tests/lib/async/futures_test.dart
index 6dd4311..1fd0648 100644
--- a/tests/lib/async/futures_test.dart
+++ b/tests/lib/async/futures_test.dart
@@ -56,7 +56,7 @@
throw 'incorrect error';
}).catchError((error, stackTrace) {
Expect.equals('correct error', error);
- Expect.isNull(stackTrace);
+ Expect.isNotNull(stackTrace);
});
}
@@ -73,7 +73,7 @@
throw 'incorrect error 2';
}).catchError((error, stackTrace) {
Expect.equals('correct error', error);
- Expect.isNull(stackTrace);
+ Expect.isNotNull(stackTrace);
});
}
@@ -90,7 +90,7 @@
throw 'incorrect error 2';
}).catchError((error, stackTrace) {
Expect.equals('correct error', error);
- Expect.isNull(stackTrace);
+ Expect.isNotNull(stackTrace);
});
}
@@ -192,8 +192,8 @@
Future testForEachSync() {
final seen = <int>[];
- return Future.forEach([1, 2, 3, 4, 5], seen.add).then(
- (_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
+ return Future.forEach([1, 2, 3, 4, 5], seen.add)
+ .then((_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
}
Future testForEachWithException() {
diff --git a/tests/lib/async/schedule_microtask_test.dart b/tests/lib/async/schedule_microtask_test.dart
index 8e12f4e..7ee540a 100644
--- a/tests/lib/async/schedule_microtask_test.dart
+++ b/tests/lib/async/schedule_microtask_test.dart
@@ -71,7 +71,7 @@
Expect.equals(TOTAL, scheduleMicrotaskDone);
completer.complete();
});
- Future scheduleMicrotaskCallback() {
+ void scheduleMicrotaskCallback() {
scheduleMicrotaskDone++;
if (scheduleMicrotaskDone != TOTAL) {
scheduleMicrotask(scheduleMicrotaskCallback);
diff --git a/tests/lib/async/stream_timeout_test.dart b/tests/lib/async/stream_timeout_test.dart
index eb33ad2..d0ddc0d 100644
--- a/tests/lib/async/stream_timeout_test.dart
+++ b/tests/lib/async/stream_timeout_test.dart
@@ -16,7 +16,7 @@
expect(tos.isBroadcast, false);
tos.handleError(expectAsync((e, s) {
expect(e, new isInstanceOf<TimeoutException>());
- expect(s, null);
+ expect(s, StackTrace.empty);
})).listen((v) {
fail("Unexpected event");
});
@@ -77,7 +77,7 @@
expect(tos.isBroadcast, true);
tos.handleError(expectAsync((e, s) {
expect(e, new isInstanceOf<TimeoutException>());
- expect(s, null);
+ expect(s, StackTrace.empty);
})).listen((v) {
fail("Unexpected event");
});
@@ -89,7 +89,7 @@
expect(tos.isBroadcast, true);
tos.handleError(expectAsync((e, s) {
expect(e, new isInstanceOf<TimeoutException>());
- expect(s, null);
+ expect(s, StackTrace.empty);
})).listen((v) {
fail("Unexpected event");
});
@@ -101,7 +101,7 @@
expect(tos.isBroadcast, false);
tos.handleError(expectAsync((e, s) {
expect(e, new isInstanceOf<TimeoutException>());
- expect(s, null);
+ expect(s, StackTrace.empty);
})).listen((v) {
fail("Unexpected event");
});
diff --git a/tests/lib/async/stream_type_test.dart b/tests/lib/async/stream_type_test.dart
index 2a76d73..f13f0f3 100644
--- a/tests/lib/async/stream_type_test.dart
+++ b/tests/lib/async/stream_type_test.dart
@@ -26,7 +26,7 @@
// Generic function used as parameter for, e.g., `skipWhile` and `reduce`.
f([_1, _2]) => throw "unreachable";
- bool testIntStream(stream(), name, int recursionDepth) {
+ void testIntStream(stream(), name, int recursionDepth) {
checkIntStream(stream(), name);
if (recursionDepth > 0) {
checkIntSubscription(stream().listen(null), "$name.listen");
diff --git a/tests/lib/async/zone_run_test.dart b/tests/lib/async/zone_run_test.dart
index 5c319d0..508060e 100644
--- a/tests/lib/async/zone_run_test.dart
+++ b/tests/lib/async/zone_run_test.dart
@@ -35,6 +35,7 @@
shouldForward = false;
result = forked.run(() {
Expect.fail("should not be invoked");
+ return -1;
});
Expect.equals(42, result);
events.add("executed run2");
diff --git a/tests/lib/async/zone_run_unary_test.dart b/tests/lib/async/zone_run_unary_test.dart
index ebf78ee..b505bc5d 100644
--- a/tests/lib/async/zone_run_unary_test.dart
+++ b/tests/lib/async/zone_run_unary_test.dart
@@ -36,6 +36,7 @@
shouldForward = false;
result = forked.runUnary<int, int>((arg) {
Expect.fail("should not be invoked");
+ return -1;
}, 99);
Expect.equals(42, result);
events.add("executed run2");
diff --git a/tests/lib/isolate/bool_from_environment_default_value_test.dart b/tests/lib/isolate/bool_from_environment_default_value_test.dart
new file mode 100644
index 0000000..fb9d49b
--- /dev/null
+++ b/tests/lib/isolate/bool_from_environment_default_value_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2013, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+
+import "package:expect/expect.dart";
+
+void test(port) {
+ Expect.isFalse(const bool.fromEnvironment('NOT_FOUND'));
+ Expect.isTrue(const bool.fromEnvironment('NOT_FOUND', defaultValue: true));
+ Expect.isFalse(const bool.fromEnvironment('NOT_FOUND', defaultValue: false));
+ if (port != null) port.send(null);
+}
+
+main() {
+ test(null);
+ var port = new ReceivePort();
+ Isolate.spawn(test, port.sendPort);
+ port.listen((_) => port.close());
+}
diff --git a/tests/lib/isolate/capability_test.dart b/tests/lib/isolate/capability_test.dart
new file mode 100644
index 0000000..fd6c4d3
--- /dev/null
+++ b/tests/lib/isolate/capability_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() {
+ asyncStart();
+
+ test(c1, c2) {
+ asyncStart();
+ Expect.notEquals(c1, c2);
+ var receive = new RawReceivePort();
+ receive.sendPort.send(c1);
+ receive.handler = (c3) {
+ Expect.equals(c3, c1);
+ Expect.notEquals(c3, c2);
+ receive.close();
+ asyncEnd();
+ };
+ }
+
+ Capability c1 = new Capability();
+ Capability c2 = new Capability();
+ Capability c3 = (new RawReceivePort()..close()).sendPort;
+ Capability c4 = (new RawReceivePort()..close()).sendPort;
+ test(c1, c2);
+ test(c3, c4);
+ test(c1, c3);
+ asyncEnd();
+}
diff --git a/tests/lib/isolate/compile_time_error_test.dart b/tests/lib/isolate/compile_time_error_test.dart
new file mode 100644
index 0000000..21197fa
--- /dev/null
+++ b/tests/lib/isolate/compile_time_error_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that errors thrown from isolates are
+// processed correctly and don't result in crashes.
+
+library Isolate3NegativeTest;
+
+import 'dart:isolate';
+import 'dart:async';
+import "package:async_helper/async_helper.dart";
+
+class TestClass {
+ TestClass.named(num this.fld1)
+ // Should cause a compilation error (for the spawned isolate). It is a
+ // runtime error for the test.
+ : fld2 = this.fld1 // //# 01: compile-time error
+ ;
+ late num fld1;
+ late num fld2;
+}
+
+void entry(SendPort replyTo) {
+ var tmp = new TestClass.named(10);
+ replyTo.send("done");
+}
+
+main() {
+ asyncStart();
+ ReceivePort response = new ReceivePort();
+ Isolate.spawn(entry, response.sendPort);
+ response.first.then((_) {
+ asyncEnd();
+ });
+}
diff --git a/tests/lib/isolate/count_test.dart b/tests/lib/isolate/count_test.dart
new file mode 100644
index 0000000..6a7de3b
--- /dev/null
+++ b/tests/lib/isolate/count_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library CountTest;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void countMessages(replyTo) {
+ int count = 0;
+ var port = new ReceivePort();
+ replyTo.send(["init", port.sendPort]);
+ port.listen((_message) {
+ int message = _message;
+ if (message == -1) {
+ Expect.equals(count, 10);
+ replyTo.send(["done"]);
+ port.close();
+ return;
+ }
+ count++;
+ Expect.equals(message, count);
+ replyTo.send(["count", message * 2]);
+ });
+}
+
+void main([args, port]) {
+ //testRemote(main, port);
+ ReceivePort local = new ReceivePort();
+ Isolate.spawn(countMessages, local.sendPort);
+ SendPort? remote;
+ int count = 0;
+ asyncStart();
+ local.listen((msg) {
+ switch (msg[0]) {
+ case "init":
+ Expect.equals(remote, null);
+ remote = msg[1];
+ remote!.send(++count);
+ break;
+ case "count":
+ Expect.equals(msg[1], count * 2);
+ if (count == 10) {
+ remote!.send(-1);
+ } else {
+ remote!.send(++count);
+ }
+ break;
+ case "done":
+ Expect.equals(count, 10);
+ local.close();
+ asyncEnd();
+ break;
+ default:
+ Expect.fail("unreachable: ${msg[0]}");
+ }
+ });
+}
diff --git a/tests/lib/isolate/cross_isolate_message_test.dart b/tests/lib/isolate/cross_isolate_message_test.dart
new file mode 100644
index 0000000..ede3792
--- /dev/null
+++ b/tests/lib/isolate/cross_isolate_message_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that isolates can communicate to isolates
+// other than the main isolate.
+
+library CrossIsolateMessageTest;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+/*
+ * Everything starts in the main-isolate (in the main-method).
+ * The main isolate spawns two isolates: isolate1 (with entry point
+ * 'crossIsolate1') and isolate2 (with entry point 'crossIsolate2').
+ *
+ * The main isolate creates two isolates, isolate1 and isolate2.
+ * The second isolate is created with a send-port being listened on by
+ * isolate1. A message is passed along this from isolate2 to isolate1.
+ * Isolate1 then sends the result back to the main isolate for final checking.
+ */
+
+void crossIsolate1(SendPort mainIsolate) {
+ ReceivePort local = new ReceivePort();
+ mainIsolate.send(["ready1", local.sendPort]);
+ local.first.then((msg) {
+ // Message from crossIsolate2
+ Expect.equals(msg[0], "fromIsolate2");
+ mainIsolate.send(["fromIsolate1", msg[1] + 58]); // 100.
+ });
+}
+
+void crossIsolate2(SendPort toIsolate1) {
+ toIsolate1.send(["fromIsolate2", 42]);
+}
+
+void main([args, port]) {
+ ReceivePort fromIsolate1 = new ReceivePort();
+ Isolate.spawn(crossIsolate1, fromIsolate1.sendPort);
+
+ asyncStart();
+ fromIsolate1.listen((msg) {
+ switch (msg[0]) {
+ case "ready1":
+ SendPort toIsolate1 = msg[1];
+ Isolate.spawn(crossIsolate2, toIsolate1);
+ break;
+ case "fromIsolate1":
+ Expect.equals(msg[1], 100);
+ fromIsolate1.close();
+ break;
+ default:
+ Expect.fail("unreachable! Tag: ${msg[0]}");
+ }
+ }, onDone: asyncEnd);
+}
diff --git a/tests/lib/isolate/deferred_in_isolate2_lib.dart b/tests/lib/isolate/deferred_in_isolate2_lib.dart
new file mode 100644
index 0000000..e3fea39
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate2_lib.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2015, 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.
+
+// Used by deferred_in_isolate2_test.
+library deferred_in_isolate2_lib;
+
+String f() => "hi";
diff --git a/tests/lib/isolate/deferred_in_isolate2_test.dart b/tests/lib/isolate/deferred_in_isolate2_test.dart
new file mode 100644
index 0000000..52e5428
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate2_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library deferred_in_isolate2_test;
+
+import 'dart:isolate';
+import 'dart:async';
+import 'package:async_helper/async_minitest.dart';
+
+import 'deferred_in_isolate2_lib.dart' deferred as lib;
+
+loadDeferred(port) {
+ lib.loadLibrary().then((_) {
+ port.send(lib.f());
+ });
+}
+
+main() {
+ test("Deferred loading in isolate", () {
+ ReceivePort port = new ReceivePort();
+ port.first.then(expectAsync((msg) {
+ expect(msg, equals("hi"));
+ }));
+ Isolate.spawn(loadDeferred, port.sendPort);
+ });
+}
diff --git a/tests/lib/isolate/deferred_in_isolate_app.dart b/tests/lib/isolate/deferred_in_isolate_app.dart
new file mode 100644
index 0000000..3c1f9dc
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate_app.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2014, 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 'deferred_in_isolate_lib.dart' deferred as test;
+
+void main(args, msg) {
+ assert(args != null);
+ assert(args.length == 1);
+ assert(msg != null);
+ assert(msg.length == 1);
+
+ var expectedMsg = args[0];
+ var replyPort = msg[0];
+
+ try {
+ print("BeforeLibraryLoading");
+
+ test.loadLibrary().then((_) {
+ var obj = new test.DeferredObj(expectedMsg);
+ replyPort.send(obj.toString());
+ }).catchError((error) {
+ replyPort.send("Error from isolate:\n$error");
+ });
+ } catch (exception, stacktrace) {
+ replyPort.send("Exception from isolate:\n$exception\n$stacktrace");
+ }
+}
diff --git a/tests/lib/isolate/deferred_in_isolate_lib.dart b/tests/lib/isolate/deferred_in_isolate_lib.dart
new file mode 100644
index 0000000..ed7e475
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate_lib.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2014, 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.
+
+library deferred_in_isolate_lib;
+
+class DeferredObj {
+ DeferredObj(this._val);
+ toString() => "$_val";
+
+ var _val;
+}
diff --git a/tests/lib/isolate/deferred_in_isolate_test.dart b/tests/lib/isolate/deferred_in_isolate_test.dart
new file mode 100644
index 0000000..d44f075
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Test that deferred libraries are supported from isolates other than the root
+// isolate.
+
+import 'dart:isolate';
+
+main() {
+ try {
+ var receivePort = new RawReceivePort();
+ var expectedMsg = "Deferred Loaded.";
+
+ receivePort.handler = (msg) {
+ if (msg != expectedMsg) {
+ print("Test failed.");
+ throw msg; // Fail the test if the message is not expected.
+ }
+ print('Test done.');
+ receivePort.close();
+ };
+
+ var stopwatch = new Stopwatch()..start();
+ Isolate.spawnUri(new Uri(path: 'deferred_in_isolate_app.dart'),
+ [expectedMsg], [receivePort.sendPort]).then((isolate) {
+ print('Isolate spawn: ${stopwatch.elapsedMilliseconds}ms');
+ }).catchError((error) {
+ print(error);
+ });
+ } catch (exception, stackTrace) {
+ print('Test failed.');
+ print(exception);
+ print(stackTrace);
+ rethrow;
+ }
+}
diff --git a/tests/lib/isolate/deferred_loaded_lib.dart b/tests/lib/isolate/deferred_loaded_lib.dart
new file mode 100644
index 0000000..4fcc2d0
--- /dev/null
+++ b/tests/lib/isolate/deferred_loaded_lib.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2015, 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.
+
+class FromChildIsolate {
+ String toString() => 'from child isolate';
+ int get fld => 10;
+}
diff --git a/tests/lib/isolate/enum_const_test.dart b/tests/lib/isolate/enum_const_test.dart
new file mode 100644
index 0000000..0a57f13
--- /dev/null
+++ b/tests/lib/isolate/enum_const_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+enum Foo { BAR, BAZ }
+
+verify(val) {
+ Expect.identical(Foo.BAR, val);
+}
+
+main() {
+ test1(); //# 01: ok
+ test2(); //# 02: ok
+}
+
+test1() => verify(Foo.BAR);
+
+test2() {
+ var rp;
+ rp = new RawReceivePort((val) {
+ verify(val);
+ rp.close();
+ });
+ rp.sendPort.send(Foo.BAR);
+}
diff --git a/tests/lib/isolate/error_at_spawn_test.dart b/tests/lib/isolate/error_at_spawn_test.dart
new file mode 100644
index 0000000..c22f41e
--- /dev/null
+++ b/tests/lib/isolate/error_at_spawn_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library error_at_spawn;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain(args) {
+ throw new ArgumentError("fast error");
+}
+
+main() {
+ asyncStart();
+
+ // Capture errors from other isolate as raw messages.
+ RawReceivePort errorPort = new RawReceivePort();
+ errorPort.handler = (message) {
+ String error = message[0];
+ String stack = message[1];
+ Expect.equals(new ArgumentError("fast error").toString(), "$error");
+ errorPort.close();
+ asyncEnd();
+ };
+
+ Isolate.spawn(isomain, null,
+ // Setup handler as part of spawn.
+ errorsAreFatal: false,
+ onError: errorPort.sendPort);
+}
diff --git a/tests/lib/isolate/error_at_spawnuri_iso.dart b/tests/lib/isolate/error_at_spawnuri_iso.dart
new file mode 100644
index 0000000..b165051
--- /dev/null
+++ b/tests/lib/isolate/error_at_spawnuri_iso.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2015, 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.
+
+library error_at_spawnuri_iso;
+
+main() {
+ throw new ArgumentError("fast error");
+}
diff --git a/tests/lib/isolate/error_at_spawnuri_test.dart b/tests/lib/isolate/error_at_spawnuri_test.dart
new file mode 100644
index 0000000..6d0e073
--- /dev/null
+++ b/tests/lib/isolate/error_at_spawnuri_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library error_at_spawnuri;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+main() {
+ asyncStart();
+
+ // Capture errors from other isolate as raw messages.
+ RawReceivePort errorPort = new RawReceivePort();
+ errorPort.handler = (message) {
+ String error = message[0];
+ String stack = message[1];
+ Expect.equals(new ArgumentError("fast error").toString(), "$error");
+ errorPort.close();
+ asyncEnd();
+ };
+
+ Isolate.spawnUri(Uri.parse("error_at_spawnuri_iso.dart"), [], null,
+ // Setup handler as part of spawn.
+ errorsAreFatal: false,
+ onError: errorPort.sendPort);
+}
diff --git a/tests/lib/isolate/error_exit_at_spawn_test.dart b/tests/lib/isolate/error_exit_at_spawn_test.dart
new file mode 100644
index 0000000..9543025
--- /dev/null
+++ b/tests/lib/isolate/error_exit_at_spawn_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library error_exit_at_spawn;
+
+import "dart:isolate";
+
+import 'error_exit_at_spawning_shared.dart';
+
+main() {
+ testIsolate((SendPort replyPort, SendPort errorPort, SendPort exitPort) {
+ Isolate.spawn(isomain, replyPort,
+ // Setup handlers as part of spawn.
+ errorsAreFatal: false,
+ onError: errorPort,
+ onExit: exitPort);
+ });
+}
diff --git a/tests/lib/isolate/error_exit_at_spawning_shared.dart b/tests/lib/isolate/error_exit_at_spawning_shared.dart
new file mode 100644
index 0000000..d59140e
--- /dev/null
+++ b/tests/lib/isolate/error_exit_at_spawning_shared.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2017, 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.
+
+library error_exit_at_spawning_shared;
+
+import "dart:isolate";
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+// Used by
+// isolate/error_exit_at_spawn_test.dart
+// isolate/error_exit_at_spawnuri_test.dart
+
+isomain(replyPort) {
+ final RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ switch (v) {
+ case 0:
+ replyPort.send(42);
+ break;
+ case 1:
+ throw new ArgumentError("whoops");
+ case 2:
+ throw new RangeError.value(37);
+ case 3:
+ port.close();
+ }
+ };
+ replyPort.send(port.sendPort);
+}
+
+testIsolate(
+ void spawnIsolate(SendPort reply, SendPort errorPort, SendPort exitPort)) {
+ asyncStart();
+ // Setup the port for communication with the newly spawned isolate.
+ RawReceivePort reply = new RawReceivePort(null);
+ late SendPort sendPort;
+ int state = 0;
+ reply.handler = (port) {
+ sendPort = port;
+ port.send(state);
+ reply.handler = (v) {
+ Expect.equals(0, state);
+ Expect.equals(42, v);
+ state++;
+ sendPort.send(state);
+ };
+ };
+
+ // Capture errors from other isolate as raw messages.
+ RawReceivePort errorPort = new RawReceivePort();
+ errorPort.handler = (List errorStackTuple) {
+ String error = errorStackTuple[0];
+ switch (state) {
+ case 1:
+ Expect.equals(new ArgumentError("whoops").toString(), "$error");
+ state++;
+ sendPort.send(state);
+ break;
+ case 2:
+ Expect.equals(new RangeError.value(37).toString(), "$error");
+ state++;
+ sendPort.send(state);
+ reply.close();
+ errorPort.close();
+ break;
+ default:
+ throw "Bad state for error: $state: $error";
+ }
+ };
+
+ // Get exit notifications from other isolate as raw messages.
+ RawReceivePort exitPort = new RawReceivePort();
+ exitPort.handler = (message) {
+ // onExit ports registered at spawn cannot have a particular message
+ // associated.
+ Expect.equals(null, message);
+ // Only exit after sending the termination message.
+ Expect.equals(3, state);
+ exitPort.close();
+ asyncEnd();
+ };
+
+ spawnIsolate(reply.sendPort, errorPort.sendPort, exitPort.sendPort);
+}
+
+// Used by
+// isolate/error_exit_at_spawnuri_test.dart
+main(args, replyPort) => isomain(replyPort);
diff --git a/tests/lib/isolate/error_exit_at_spawnuri_test.dart b/tests/lib/isolate/error_exit_at_spawnuri_test.dart
new file mode 100644
index 0000000..cf32b98
--- /dev/null
+++ b/tests/lib/isolate/error_exit_at_spawnuri_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library error_exit_at_spawnuri;
+
+import "dart:isolate";
+
+import 'error_exit_at_spawning_shared.dart';
+
+main() {
+ testIsolate((SendPort replyPort, SendPort errorPort, SendPort exitPort) {
+ Isolate.spawnUri(
+ Uri.parse("error_exit_at_spawning_shared.dart"), [], replyPort,
+ // Setup handlers as part of spawn.
+ errorsAreFatal: false,
+ onError: errorPort,
+ onExit: exitPort);
+ });
+}
diff --git a/tests/lib/isolate/exit_at_spawn_test.dart b/tests/lib/isolate/exit_at_spawn_test.dart
new file mode 100644
index 0000000..4a2574e
--- /dev/null
+++ b/tests/lib/isolate/exit_at_spawn_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library exit_at_spawn;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+// Isolate exiting immediately.
+isomain(args) {}
+
+// Isolate exiting after running microtasks.
+isomain2(args) {
+ scheduleMicrotask(() {});
+}
+
+// Isolate exiting after running timers.
+isomain3(args) {
+ new Timer(Duration.zero, () {});
+}
+
+main() {
+ asyncStart();
+
+ test(isomain);
+ test(isomain2);
+ test(isomain3);
+
+ asyncEnd();
+}
+
+void test(mainFunction) {
+ asyncStart();
+
+ RawReceivePort exitPort = new RawReceivePort();
+ exitPort.handler = (message) {
+ Expect.equals(null, message);
+ exitPort.close();
+ asyncEnd();
+ };
+
+ // Ignore returned Future.
+ Isolate.spawn(mainFunction, null,
+ // Setup handler as part of spawn.
+ errorsAreFatal: false,
+ onExit: exitPort.sendPort);
+}
diff --git a/tests/lib/isolate/exit_at_spawnuri_iso.dart b/tests/lib/isolate/exit_at_spawnuri_iso.dart
new file mode 100644
index 0000000..9bc892e
--- /dev/null
+++ b/tests/lib/isolate/exit_at_spawnuri_iso.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2015, 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.
+
+library exit_at_spawn_iso;
+
+main() {}
diff --git a/tests/lib/isolate/exit_at_spawnuri_test.dart b/tests/lib/isolate/exit_at_spawnuri_test.dart
new file mode 100644
index 0000000..5bb9ed8
--- /dev/null
+++ b/tests/lib/isolate/exit_at_spawnuri_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library exit_at_spawn;
+
+import "dart:isolate";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+main() {
+ asyncStart();
+
+ RawReceivePort exitPort = new RawReceivePort();
+ exitPort.handler = (message) {
+ Expect.equals(null, message);
+ exitPort.close();
+ asyncEnd();
+ };
+
+ // Ignore returned Future.
+ Isolate.spawnUri(Uri.parse("exit_at_spawnuri_iso.dart"), [], null,
+ // Setup handler as part of spawn.
+ errorsAreFatal: false,
+ onExit: exitPort.sendPort);
+}
diff --git a/tests/lib/isolate/function_send1_test.dart b/tests/lib/isolate/function_send1_test.dart
new file mode 100644
index 0000000..b25042e
--- /dev/null
+++ b/tests/lib/isolate/function_send1_test.dart
@@ -0,0 +1,150 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void toplevel(port, message) {
+ port.send("toplevel:$message");
+}
+
+Function createFuncToplevel() => (p, m) {
+ p.send(m);
+ };
+
+class C {
+ Function initializer;
+ Function body;
+ C()
+ : initializer = ((p, m) {
+ throw "initializer";
+ }),
+ body = ((p, m) {
+ throw "body";
+ }) {}
+ static void staticFunc(port, message) {
+ port.send("static:$message");
+ }
+
+ static Function createFuncStatic() => (p, m) {
+ throw "static expr";
+ };
+ void instanceMethod(p, m) {
+ throw "instanceMethod";
+ }
+
+ Function createFuncMember() => (p, m) {
+ throw "instance expr";
+ };
+ void call(n, p) {
+ throw "C";
+ }
+}
+
+class Callable {
+ void call(p, m) {
+ p.send(["callable", m]);
+ }
+}
+
+void main() {
+ asyncStart();
+
+ // top-level functions, static functions, closures, instance methods
+ // or function expressions are not sendable to an isolate spawned using
+ // spawnUri.
+ testUnsendable("toplevel", toplevel);
+ testUnsendable("static", C.staticFunc);
+ var c = new C();
+ testUnsendable("instance method", c.instanceMethod);
+ testUnsendable("static context expression", createFuncToplevel());
+ testUnsendable("static context expression", C.createFuncStatic());
+ testUnsendable("initializer context expression", c.initializer);
+ testUnsendable("constructor context expression", c.body);
+ testUnsendable("instance method context expression", c.createFuncMember());
+ testUnsendable("toplevel", toplevel.call);
+ testUnsendable("static", C.staticFunc.call);
+ testUnsendable("callable object", new Callable().call);
+
+ asyncEnd();
+ return;
+}
+
+// Create a receive port that expects exactly one message.
+// Pass the message to `callback` and return the sendPort.
+SendPort singleMessagePort(callback) {
+ var p;
+ p = new RawReceivePort((v) {
+ p.close();
+ callback(v);
+ });
+ return p.sendPort;
+}
+
+// A singleMessagePort that expects the message to be a specific value.
+SendPort expectMessagePort(message) {
+ asyncStart();
+ return singleMessagePort((v) {
+ Expect.equals(message, v);
+ asyncEnd();
+ });
+}
+
+// Creates a new isolate and a pair of ports that expect a single message
+// to be sent to the other isolate and back to the callback function.
+Future<SendPort> echoPort(callback(value)) {
+ Completer<SendPort> completer = new Completer<SendPort>();
+ SendPort replyPort = singleMessagePort(callback);
+ late RawReceivePort initPort;
+ initPort = new RawReceivePort((p) {
+ completer.complete(p);
+ initPort.close();
+ });
+ return Isolate.spawn(_echo, [replyPort, initPort.sendPort])
+ .then((isolate) => completer.future);
+}
+
+void _echo(msg) {
+ var replyPort = msg[0];
+ late RawReceivePort requestPort;
+ requestPort = new RawReceivePort((msg) {
+ replyPort.send(msg);
+ requestPort.close(); // Single echo only.
+ });
+ msg[1].send(requestPort.sendPort);
+}
+
+// Creates other isolate that waits for a single message, `msg`, on the returned
+// port, and executes it as `msg[0](msg[1],msg[2])` in the other isolate.
+Future<SendPort> callPort() {
+ Completer<SendPort> completer = new Completer<SendPort>();
+ SendPort initPort = singleMessagePort(completer.complete);
+ return Isolate.spawn(_call, initPort).then((_) => completer.future);
+}
+
+void _call(initPort) {
+ initPort.send(singleMessagePort(callFunc));
+}
+
+void testUnsendable(name, func) {
+ asyncStart();
+ Isolate.spawnUri(Uri.parse("function_send_test.dart"), [], func)
+ .then((v) => throw "allowed spawn direct?", onError: (e, s) {
+ asyncEnd();
+ });
+ asyncStart();
+ Isolate.spawnUri(Uri.parse("function_send_test.dart"), [], [func])
+ .then((v) => throw "allowed spawn wrapped?", onError: (e, s) {
+ asyncEnd();
+ });
+}
+
+void callFunc(message) {
+ message[0](message[1], message[2]);
+}
diff --git a/tests/lib/isolate/function_send_test.dart b/tests/lib/isolate/function_send_test.dart
new file mode 100644
index 0000000..24e9d77
--- /dev/null
+++ b/tests/lib/isolate/function_send_test.dart
@@ -0,0 +1,222 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void toplevel(port, message) {
+ port.send("toplevel:$message");
+}
+
+Function createFuncToplevel() => (p, m) {
+ p.send(m);
+ };
+
+class C {
+ Function initializer;
+ Function body;
+ C()
+ : initializer = ((p, m) {
+ throw "initializer";
+ }),
+ body = ((p, m) {
+ throw "body";
+ }) {}
+ static void staticFunc(port, message) {
+ port.send("static:$message");
+ }
+
+ static Function createFuncStatic() => (p, m) {
+ throw "static expr";
+ };
+ void instanceMethod(p, m) {
+ throw "instanceMethod";
+ }
+
+ Function createFuncMember() => (p, m) {
+ throw "instance expr";
+ };
+ void call(n, p) {
+ throw "C";
+ }
+}
+
+class Callable {
+ void call(p, m) {
+ p.send(["callable", m]);
+ }
+}
+
+void main() {
+ asyncStart();
+
+ // Sendables are top-level functions and static functions only.
+ testSendable("toplevel", toplevel);
+ testSendable("static", C.staticFunc);
+ // Unsendables are any closure - instance methods or function expression.
+ var c = new C();
+ testUnsendable("instance method", c.instanceMethod);
+ testUnsendable("static context expression", createFuncToplevel());
+ testUnsendable("static context expression", C.createFuncStatic());
+ testUnsendable("initializer context expression", c.initializer);
+ testUnsendable("constructor context expression", c.body);
+ testUnsendable("instance method context expression", c.createFuncMember());
+
+ // The result of `toplevel.call` and `staticFunc.call` may or may not be
+ // identical to `toplevel` and `staticFunc` respectively. If they are not
+ // equal, they may or may not be considered toplevel/static functions anyway,
+ // and therefore sendable. The VM and dart2js currently disagree on whether
+ // `toplevel` and `toplevel.call` are identical, both allow them to be sent.
+ // If this is ever specified to something else, use:
+ // testUnsendable("toplevel.call", toplevel.call);
+ // testUnsendable("static.call", C.staticFunc.call);
+ // instead.
+ // These two tests should be considered canaries for accidental behavior
+ // change rather than requirements.
+ testSendable("toplevel", toplevel.call);
+ testSendable("static", C.staticFunc.call);
+
+ // Callable objects are sendable if general objects are (VM yes, dart2js no).
+ // It's unspecified whether arbitrary objects can be sent. If it is specified,
+ // add a test that `new Callable()` is either sendable or unsendable.
+
+ // The call method of a callable object is a closure holding the object,
+ // not a top-level or static function, so it should be blocked, just as
+ // a normal method.
+ testUnsendable("callable object", new Callable().call);
+
+ asyncEnd();
+ return;
+}
+
+// Create a receive port that expects exactly one message.
+// Pass the message to `callback` and return the sendPort.
+SendPort singleMessagePort(callback) {
+ var p;
+ p = new RawReceivePort((v) {
+ p.close();
+ callback(v);
+ });
+ return p.sendPort;
+}
+
+// A singleMessagePort that expects the message to be a specific value.
+SendPort expectMessagePort(message) {
+ asyncStart();
+ return singleMessagePort((v) {
+ Expect.equals(message, v);
+ asyncEnd();
+ });
+}
+
+void testSendable(name, func) {
+ // Function as spawn message.
+ Isolate.spawn(callFunc, [func, expectMessagePort("$name:spawn"), "spawn"]);
+
+ // Send function to same isolate.
+ var reply = expectMessagePort("$name:direct");
+ singleMessagePort(callFunc).send([func, reply, "direct"]);
+
+ // Send function to other isolate, call it there.
+ reply = expectMessagePort("$name:other isolate");
+ callPort().then((p) {
+ p.send([func, reply, "other isolate"]);
+ });
+
+ // Round-trip function trough other isolate.
+ echoPort((roundtripFunc) {
+ Expect.identical(func, roundtripFunc, "$name:send through isolate");
+ }).then((port) {
+ port.send(func);
+ });
+}
+
+// Creates a new isolate and a pair of ports that expect a single message
+// to be sent to the other isolate and back to the callback function.
+Future<SendPort> echoPort(callback(value)) {
+ final completer = new Completer<SendPort>();
+ SendPort replyPort = singleMessagePort(callback);
+ late RawReceivePort initPort;
+ initPort = new RawReceivePort((p) {
+ completer.complete(p);
+ initPort.close();
+ });
+ return Isolate.spawn(_echo, [replyPort, initPort.sendPort])
+ .then((isolate) => completer.future);
+}
+
+void _echo(msg) {
+ var replyPort = msg[0];
+ late RawReceivePort requestPort;
+ requestPort = new RawReceivePort((msg) {
+ replyPort.send(msg);
+ requestPort.close(); // Single echo only.
+ });
+ msg[1].send(requestPort.sendPort);
+}
+
+// Creates other isolate that waits for a single message, `msg`, on the returned
+// port, and executes it as `msg[0](msg[1],msg[2])` in the other isolate.
+Future<SendPort> callPort() {
+ final completer = new Completer<SendPort>();
+ SendPort initPort = singleMessagePort(completer.complete);
+ return Isolate.spawn(_call, initPort).then((_) => completer.future);
+}
+
+void _call(initPort) {
+ initPort.send(singleMessagePort(callFunc));
+}
+
+void testUnsendable(name, func) {
+ asyncStart();
+ Isolate.spawn(nop, func).then((v) => throw "allowed spawn direct?",
+ onError: (e, s) {
+ asyncEnd();
+ });
+ asyncStart();
+ Isolate.spawn(nop, [func]).then((v) => throw "allowed spawn wrapped?",
+ onError: (e, s) {
+ asyncEnd();
+ });
+
+ asyncStart();
+ var noReply = new RawReceivePort((_) {
+ throw "Unexpected message: $_";
+ });
+ Expect.throws(() {
+ noReply.sendPort.send(func);
+ }, null, "send direct");
+ Expect.throws(() {
+ noReply.sendPort.send([func]);
+ }, null, "send wrapped");
+ scheduleMicrotask(() {
+ noReply.close();
+ asyncEnd();
+ });
+
+ // Try sending through other isolate.
+ asyncStart();
+ echoPort((v) {
+ Expect.equals(0, v);
+ }).then((p) {
+ try {
+ p.send(func);
+ } finally {
+ p.send(0); // Closes echo port.
+ }
+ }).then((p) => throw "unreachable 2", onError: (e, s) {
+ asyncEnd();
+ });
+}
+
+void nop(_) {}
+
+void callFunc(message) {
+ message[0](message[1], message[2]);
+}
diff --git a/tests/lib/isolate/handle_error2_test.dart b/tests/lib/isolate/handle_error2_test.dart
new file mode 100644
index 0000000..8e36364
--- /dev/null
+++ b/tests/lib/isolate/handle_error2_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library handle_error_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain1(replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ switch (v) {
+ case 0:
+ replyPort.send(42);
+ break;
+ case 1:
+ throw new ArgumentError("whoops");
+ case 2:
+ throw new RangeError.value(37);
+ case 3:
+ port.close();
+ }
+ };
+ replyPort.send(port.sendPort);
+}
+
+/// Do Isolate.spawn(entry) and get a sendPort from the isolate that it
+/// expects commands on.
+/// The isolate has errors set to non-fatal.
+/// Returns a list of `[isolate, commandPort]` in a future.
+Future spawn(entry) {
+ ReceivePort reply = new ReceivePort();
+ var isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+ return isolate.then((Isolate isolate) {
+ isolate.setErrorsFatal(false);
+ isolate.resume(isolate.pauseCapability!);
+ Future result = reply.first.then((sendPort) {
+ return [isolate, sendPort];
+ });
+ return result;
+ });
+}
+
+main() {
+ asyncStart();
+ RawReceivePort reply = new RawReceivePort(null);
+ // Create two isolates waiting for commands, with errors non-fatal.
+ Future iso1 = spawn(isomain1);
+ Future iso2 = spawn(isomain1);
+ Future.wait([iso1, iso2]).then((l) {
+ var isolate1 = l[0][0];
+ var sendPort1 = l[0][1];
+ var isolate2 = l[1][0];
+ var sendPort2 = l[1][1];
+ Stream errors = isolate1.errors; // Broadcast stream, never a done message.
+ int state = 1;
+ var subscription;
+ subscription = errors.listen(null, onError: (error, stack) {
+ switch (state) {
+ case 1:
+ Expect.equals(new ArgumentError("whoops").toString(), "$error");
+ state++;
+ break;
+ case 2:
+ Expect.equals(new RangeError.value(37).toString(), "$error");
+ state++;
+ reply.close();
+ subscription.cancel();
+ asyncEnd();
+ break;
+ default:
+ throw "Bad state for error: $state: $error";
+ }
+ });
+ sendPort1.send(0);
+ sendPort2.send(0);
+ sendPort1.send(1);
+ sendPort2.send(1);
+ sendPort1.send(2);
+ sendPort2.send(2);
+ sendPort1.send(3);
+ sendPort2.send(3);
+ });
+}
diff --git a/tests/lib/isolate/handle_error3_test.dart b/tests/lib/isolate/handle_error3_test.dart
new file mode 100644
index 0000000..170f130
--- /dev/null
+++ b/tests/lib/isolate/handle_error3_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library handle_error_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain1(replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ switch (v) {
+ case 0:
+ replyPort.send(42);
+ break;
+ case 1:
+ throw new ArgumentError("whoops");
+ case 2:
+ throw new RangeError.value(37);
+ case 3:
+ port.close();
+ }
+ };
+ replyPort.send(port.sendPort);
+}
+
+/// Do Isolate.spawn(entry) and get a sendPort from the isolate that it
+/// expects commands on.
+/// The isolate has errors set to non-fatal.
+/// Returns a list of `[isolate, commandPort]` in a future.
+Future spawn(entry) {
+ ReceivePort reply = new ReceivePort();
+ var isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+ return isolate.then((Isolate isolate) {
+ isolate.setErrorsFatal(false);
+ isolate.resume(isolate.pauseCapability!);
+ Future result = reply.first.then((sendPort) {
+ return [isolate, sendPort];
+ });
+ return result;
+ });
+}
+
+main() {
+ asyncStart();
+ asyncStart();
+ RawReceivePort reply = new RawReceivePort(null);
+ RawReceivePort reply2 = new RawReceivePort(null);
+ // Create two isolates waiting for commands, with errors non-fatal.
+ Future iso1 = spawn(isomain1);
+ Future iso2 = spawn(isomain1);
+ Future.wait([iso1, iso2]).then((l) {
+ var isolate1 = l[0][0];
+ var sendPort1 = l[0][1];
+ var isolate2 = l[1][0];
+ var sendPort2 = l[1][1];
+ // Capture errors from one isolate as stream.
+ Stream errors = isolate1.errors; // Broadcast stream, never a done message.
+ int state = 1;
+ var subscription;
+ subscription = errors.listen(null, onError: (error, stack) {
+ switch (state) {
+ case 1:
+ Expect.equals(new ArgumentError("whoops").toString(), "$error");
+ state++;
+ break;
+ case 2:
+ Expect.equals(new RangeError.value(37).toString(), "$error");
+ state++;
+ reply.close();
+ subscription.cancel();
+ asyncEnd();
+ break;
+ default:
+ throw "Bad state for error: $state: $error";
+ }
+ });
+ // Capture errors from other isolate as raw messages.
+ RawReceivePort errorPort2 = new RawReceivePort();
+ int state2 = 1;
+ errorPort2.handler = (message) {
+ String error = message[0];
+ String stack = message[1];
+ switch (state2) {
+ case 1:
+ Expect.equals(new ArgumentError("whoops").toString(), "$error");
+ state2++;
+ break;
+ case 2:
+ Expect.equals(new RangeError.value(37).toString(), "$error");
+ state2++;
+ reply2.close();
+ isolate2.removeErrorListener(errorPort2.sendPort);
+ errorPort2.close();
+ asyncEnd();
+ break;
+ default:
+ throw "Bad state-2 for error: $state: $error";
+ }
+ };
+ isolate2.addErrorListener(errorPort2.sendPort);
+
+ sendPort1.send(0);
+ sendPort2.send(0);
+ sendPort1.send(1);
+ sendPort2.send(1);
+ sendPort1.send(2);
+ sendPort2.send(2);
+ sendPort1.send(3);
+ sendPort2.send(3);
+ });
+}
diff --git a/tests/lib/isolate/handle_error_test.dart b/tests/lib/isolate/handle_error_test.dart
new file mode 100644
index 0000000..a453072
--- /dev/null
+++ b/tests/lib/isolate/handle_error_test.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library handle_error_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain1(replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ switch (v) {
+ case 0:
+ replyPort.send(42);
+ break;
+ case 1:
+ throw new ArgumentError("whoops");
+ case 2:
+ throw new RangeError.value(37);
+ case 3:
+ port.close();
+ }
+ };
+ replyPort.send(port.sendPort);
+}
+
+main() {
+ asyncStart();
+ RawReceivePort reply = new RawReceivePort(null);
+ // Start paused so we have time to set up the error handler.
+ Isolate.spawn(isomain1, reply.sendPort, paused: true).then((Isolate isolate) {
+ isolate.setErrorsFatal(false);
+ Stream errors = isolate.errors; // Broadcast stream, never a done message.
+ late SendPort sendPort;
+ late StreamSubscription subscription;
+ int state = 0;
+ reply.handler = (port) {
+ sendPort = port;
+ port.send(state);
+ reply.handler = (v) {
+ Expect.equals(0, state);
+ Expect.equals(42, v);
+ state++;
+ sendPort.send(state);
+ };
+ };
+ subscription = errors.listen(null, onError: (error, stack) {
+ switch (state) {
+ case 1:
+ Expect.equals(new ArgumentError("whoops").toString(), "$error");
+ state++;
+ sendPort.send(state);
+ break;
+ case 2:
+ Expect.equals(new RangeError.value(37).toString(), "$error");
+ state++;
+ sendPort.send(state);
+ reply.close();
+ subscription.cancel();
+ asyncEnd();
+ break;
+ default:
+ throw "Bad state for error: $state: $error";
+ }
+ });
+ isolate.resume(isolate.pauseCapability!);
+ });
+}
diff --git a/tests/lib/isolate/illegal_msg_function_test.dart b/tests/lib/isolate/illegal_msg_function_test.dart
new file mode 100644
index 0000000..5b5aa45
--- /dev/null
+++ b/tests/lib/isolate/illegal_msg_function_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library illegal_msg_function_test;
+
+import "dart:isolate";
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+echo(sendPort) {
+ var port = new ReceivePort();
+ sendPort.send(port.sendPort);
+ port.listen((msg) {
+ sendPort.send("echoing ${msg(1)}}");
+ });
+}
+
+void main() {
+ asyncStart();
+
+ final port = new ReceivePort();
+
+ // Ignore returned Future.
+ Isolate.spawn(echo, port.sendPort);
+
+ port.first.then((_snd) {
+ SendPort snd = _snd;
+ int function(x) => x + 2;
+ try {
+ snd.send(function);
+ } catch (e) {
+ // Expected behavior.
+ port.close();
+ asyncEnd();
+ return;
+ }
+ Expect.fail("Should not be reached. Message sending didn't throw.");
+ });
+}
diff --git a/tests/lib/isolate/illegal_msg_mirror_test.dart b/tests/lib/isolate/illegal_msg_mirror_test.dart
new file mode 100644
index 0000000..a15572d
--- /dev/null
+++ b/tests/lib/isolate/illegal_msg_mirror_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2013, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library illegal_msg_mirror_test;
+
+import "dart:isolate";
+import "dart:mirrors";
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+class Class {
+ method() {}
+}
+
+echo(sendPort) {
+ final port = new ReceivePort();
+ sendPort.send(port.sendPort);
+ port.listen((msg) {
+ sendPort.send("echoing ${msg(1)}}");
+ });
+}
+
+void main([args, port]) {
+ asyncStart();
+
+ final ReceivePort port = new ReceivePort();
+
+ // Ignore returned Future.
+ Isolate.spawn(echo, port.sendPort);
+
+ port.first.then((_snd) {
+ SendPort snd = _snd;
+ final methodMirror = reflectClass(Class).declarations[#method];
+ try {
+ snd.send(methodMirror);
+ } catch (e) {
+ // Expected behavior.
+ port.close();
+ asyncEnd();
+ return;
+ }
+ Expect.fail("Should not be reached. Message sending didn't throw.");
+ });
+}
diff --git a/tests/lib/isolate/int32_length_overflow_test.dart b/tests/lib/isolate/int32_length_overflow_test.dart
new file mode 100644
index 0000000..85e2bd7
--- /dev/null
+++ b/tests/lib/isolate/int32_length_overflow_test.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2019, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+const large = 1 << 30;
+
+void child(replyPort) {
+ print("Child start");
+
+ print("Child Uint8List");
+ dynamic x = new Uint8List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ for (int i = x.length - 4; i < x.length; i++) {
+ x[i] = x.length - i;
+ }
+ replyPort.send(x);
+ x = null;
+
+ // Too slow.
+ // print("Child Array");
+ // x = new List(large);
+ // for (int i = 0; i < 4; i++) {
+ // x[i] = i;
+ // }
+ // replyPort.send(x);
+ // x = null;
+
+ print("Child OneByteString");
+ x = null;
+ x = "Z";
+ while (x.length < large) {
+ x = x * 2;
+ }
+ replyPort.send(x);
+ x = null;
+
+ print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+ print("Parent start");
+
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(child, port.sendPort);
+ StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+ print("Parent Uint8");
+ Expect.isTrue(await incoming.moveNext());
+ dynamic x = incoming.current;
+ Expect.isTrue(x is Uint8List);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+ for (int i = x.length - 4; i < x.length; i++) {
+ Expect.equals(x.length - i, x[i]);
+ }
+ x = null;
+
+ // Too slow.
+ // print("Parent Array");
+ // Expect.isTrue(await incoming.moveNext());
+ // x = incoming.current;
+ // Expect.isTrue(x is List);
+ // Expect.equals(large, x.length);
+ // for (int i = 0; i < 4; i++) {
+ // Expect.equals(i, x[i]);
+ // }
+ // x = null;
+
+ print("Parent OneByteString");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is String);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals("Z", x[i]);
+ }
+ for (int i = x.length - 4; i < x.length; i++) {
+ Expect.equals("Z", x[i]);
+ }
+ x = null;
+
+ port.close();
+ print("Parent done");
+}
diff --git a/tests/lib/isolate/int_from_environment_default_value_test.dart b/tests/lib/isolate/int_from_environment_default_value_test.dart
new file mode 100644
index 0000000..af7ccac
--- /dev/null
+++ b/tests/lib/isolate/int_from_environment_default_value_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+void test(port) {
+ Expect.equals(0, const int.fromEnvironment('NOT_FOUND'));
+ Expect.equals(
+ 12345, const int.fromEnvironment('NOT_FOUND', defaultValue: 12345));
+ if (port != null) port.send(null);
+}
+
+main() {
+ asyncStart();
+
+ test(null);
+ final port = new ReceivePort();
+ Isolate.spawn(test, port.sendPort);
+ port.forEach((_) {
+ port.close();
+ asyncEnd();
+ });
+}
diff --git a/tests/lib/isolate/isolate_complex_messages_test.dart b/tests/lib/isolate/isolate_complex_messages_test.dart
new file mode 100644
index 0000000..64992dc
--- /dev/null
+++ b/tests/lib/isolate/isolate_complex_messages_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing isolate communication with
+// complex messages.
+
+library IsolateComplexMessagesTest;
+
+import 'dart:isolate';
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() {
+ asyncStart();
+
+ ReceivePort local = new ReceivePort();
+ Isolate.spawn(logMessages, local.sendPort);
+
+ int messagesReceived = 0;
+ local.listen((msg) {
+ switch (msg[0]) {
+ case "init":
+ messagesReceived++;
+ var remote = msg[1];
+ remote.send(1);
+ remote.send("Hello");
+ remote.send("World");
+ remote.send(const [null, 1, 2, 3, 4]);
+ remote.send(const [1, 2.0, true, false, 0xffffffffff]);
+ remote.send(const ["Hello", "World", 0xffffffffff]);
+ // Shutdown the LogRunner.
+ remote.send(-1);
+ break;
+ case "done":
+ messagesReceived++;
+ local.close();
+ Expect.equals(6, msg[1]);
+ Expect.equals(2, messagesReceived);
+ asyncEnd();
+ }
+ });
+}
+
+void logMessages(mainPort) {
+ int count = 0;
+ ReceivePort port = new ReceivePort();
+ mainPort.send(["init", port.sendPort]);
+ port.forEach((var message) {
+ if (message == -1) {
+ port.close();
+ mainPort.send(["done", count]);
+ } else {
+ switch (count) {
+ case 0:
+ Expect.equals(1, message);
+ break;
+ case 1:
+ Expect.equals("Hello", message);
+ break;
+ case 2:
+ Expect.equals("World", message);
+ break;
+ case 3:
+ Expect.equals(5, message.length);
+ Expect.equals(null, message[0]);
+ Expect.equals(1, message[1]);
+ Expect.equals(2, message[2]);
+ Expect.equals(3, message[3]);
+ Expect.equals(4, message[4]);
+ break;
+ case 4:
+ Expect.equals(5, message.length);
+ Expect.equals(1, message[0]);
+ Expect.equals(2.0, message[1]);
+ Expect.equals(true, message[2]);
+ Expect.equals(false, message[3]);
+ Expect.equals(0xffffffffff, message[4]);
+ break;
+ case 5:
+ Expect.equals(3, message.length);
+ Expect.equals("Hello", message[0]);
+ Expect.equals("World", message[1]);
+ Expect.equals(0xffffffffff, message[2]);
+ break;
+ }
+ count++;
+ }
+ });
+}
diff --git a/tests/lib/isolate/isolate_current_test.dart b/tests/lib/isolate/isolate_current_test.dart
new file mode 100644
index 0000000..908c42d
--- /dev/null
+++ b/tests/lib/isolate/isolate_current_test.dart
@@ -0,0 +1,138 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library isolate_current_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() {
+ asyncStart();
+
+ Expect.isNotNull(Isolate.current);
+
+ // Sending controlPort and capabilities as list.
+ testSend(i2l, l2i);
+ testSpawnReturnVsCurrent(true);
+ testSpawnReturnVsCurrent2(true);
+
+ // Sending Isolate itself.
+ testSend(id, id);
+ testSpawnReturnVsCurrent(false);
+ testSpawnReturnVsCurrent2(false);
+
+ asyncEnd();
+}
+
+/** Test sending the isolate data or isolate through a [SendPort]. */
+void testSend(i2l, l2i) {
+ asyncStart();
+ RawReceivePort p = new RawReceivePort();
+ Isolate isolate = Isolate.current;
+ p.handler = (list) {
+ var isolate2 = l2i(list);
+ Expect.equals(isolate.controlPort, isolate2.controlPort);
+ Expect.equals(isolate.pauseCapability, isolate2.pauseCapability);
+ Expect.equals(isolate.terminateCapability, isolate2.terminateCapability);
+ p.close();
+ asyncEnd();
+ };
+ p.sendPort.send(i2l(isolate));
+}
+
+/**
+ * Test that the isolate returned by [Isolate.spawn] is the same as
+ * the one returned by [Isolate.current] in the spawned isolate.
+ * Checked in the spawning isolate.
+ */
+void testSpawnReturnVsCurrent(bool asList) {
+ asyncStart();
+ Function transform = asList ? l2i : id;
+ Completer response = new Completer();
+ var p = new RawReceivePort();
+ p.handler = (v) {
+ response.complete(transform(v));
+ p.close();
+ };
+
+ Isolate.spawn(replyCurrent, [p.sendPort, asList]).then((Isolate isolate) {
+ return response.future.then((isolate2) {
+ expectIsolateEquals(isolate, isolate2 as Isolate);
+ asyncEnd();
+ });
+ });
+}
+
+void replyCurrent(args) {
+ SendPort responsePort = args[0];
+ Function transform = args[1] ? i2l : id;
+ responsePort.send(transform(Isolate.current));
+}
+
+/**
+ * Test that the isolate returned by [Isolate.spawn] is the same as
+ * the one returned by [Isolate.current] in the spawned isolate.
+ * Checked in the spawned isolate.
+ */
+void testSpawnReturnVsCurrent2(bool asList) {
+ asyncStart();
+ Function transform = asList ? i2l : id;
+
+ Completer response = new Completer();
+ var p = new RawReceivePort();
+ int state = 0;
+ p.handler = (v) {
+ switch (state) {
+ case 0:
+ response.complete(v);
+ state++;
+ break;
+ case 1:
+ p.close();
+ Expect.isTrue(v);
+ asyncEnd();
+ }
+ };
+
+ Isolate.spawn(expectCurrent, [p.sendPort, asList]).then((Isolate isolate) {
+ return response.future.then((port) {
+ (port as SendPort).send(transform(isolate));
+ });
+ });
+}
+
+void expectCurrent(args) {
+ SendPort responsePort = args[0];
+ Function transform = args[1] ? l2i : id;
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (isoData) {
+ Isolate isolate2 = transform(isoData);
+ port.close();
+ Isolate isolate = Isolate.current;
+ expectIsolateEquals(isolate, isolate2);
+ responsePort.send(true);
+ };
+ responsePort.send(port.sendPort);
+}
+
+/** Convert isolate to list (of control port and capabilities). */
+i2l(Isolate isolate) =>
+ [isolate.controlPort, isolate.pauseCapability, isolate.terminateCapability];
+/** Convert list to isolate. */
+l2i(List list) => new Isolate(list[0],
+ pauseCapability: list[1], terminateCapability: list[2]);
+
+/** Identity transformation. */
+id(Isolate isolate) => isolate;
+
+void expectIsolateEquals(Isolate expect, Isolate actual) {
+ Expect.equals(expect.controlPort, actual.controlPort);
+ Expect.equals(expect.pauseCapability, actual.pauseCapability);
+ Expect.equals(expect.terminateCapability, actual.terminateCapability);
+}
diff --git a/tests/lib/isolate/isolate_import_test.dart b/tests/lib/isolate/isolate_import_test.dart
new file mode 100644
index 0000000..211cced
--- /dev/null
+++ b/tests/lib/isolate/isolate_import_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library IsolateImportNegativeTest;
+
+// Omitting the following import is an error:
+/* // //# 01: runtime error, compile-time error
+import 'dart:isolate';
+*/ // //# 01: continued
+import 'package:async_helper/async_helper.dart';
+
+void entry(msg) {}
+
+main() {
+ asyncStart();
+ Isolate.spawn(entry, null).whenComplete(asyncEnd);
+}
diff --git a/tests/lib/isolate/issue_21398_child_isolate.dart b/tests/lib/isolate/issue_21398_child_isolate.dart
new file mode 100644
index 0000000..c35fcb2
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_child_isolate.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2015, 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 'dart:isolate';
+import "package:expect/expect.dart";
+
+class FromChildIsolate {
+ String toString() => 'from child isolate';
+}
+
+main(List<String> args, message) {
+ var sendPort = message;
+ try {
+ sendPort.send(new FromChildIsolate());
+ } catch (error) {
+ Expect.isTrue(error is ArgumentError);
+ sendPort.send("Invalid Argument(s).");
+ }
+}
diff --git a/tests/lib/isolate/issue_21398_child_isolate1.dart b/tests/lib/isolate/issue_21398_child_isolate1.dart
new file mode 100644
index 0000000..9911733
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_child_isolate1.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2015, 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 'dart:isolate';
+import "package:expect/expect.dart";
+
+main(List<String> args, message) {
+ var sendPort1 = message[0] as SendPort;
+ var sendPort2 = message[1] as SendPort;
+ sendPort2.send(sendPort1);
+}
diff --git a/tests/lib/isolate/issue_21398_child_isolate11.dart b/tests/lib/isolate/issue_21398_child_isolate11.dart
new file mode 100644
index 0000000..fd19d60
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_child_isolate11.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2015, 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 'dart:isolate';
+import "package:expect/expect.dart";
+
+class FromChildIsolate {
+ String toString() => 'from child isolate';
+}
+
+main(List<String> args, message) {
+ var receivePort = new ReceivePort();
+ var sendPort = message;
+ sendPort.send(receivePort.sendPort);
+ receivePort.listen((msg) {
+ Expect.isTrue(msg is SendPort);
+ try {
+ msg.send(new FromChildIsolate());
+ } catch (error) {
+ Expect.isTrue(error is ArgumentError);
+ msg.send("Invalid Argument(s).");
+ }
+ }, onError: (e) => print('$e'));
+}
diff --git a/tests/lib/isolate/issue_21398_parent_isolate1_test.dart b/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
new file mode 100644
index 0000000..6a0b458
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+
+class FromMainIsolate {
+ String toString() => 'from main isolate';
+ int get fld => 10;
+}
+
+func1Child(args) {
+ var receivePort = new ReceivePort();
+ var sendPort = args[0];
+ sendPort.send(receivePort.sendPort);
+ receivePort.listen((msg) {
+ Expect.isTrue(msg is FromMainIsolate);
+ Expect.equals(10, msg.fld);
+ receivePort.close();
+ sendPort.send("done");
+ }, onError: (e) => print('$e'));
+}
+
+func2Child(args) {
+ var receivePort = new ReceivePort();
+ var sendPort = args[0];
+ sendPort.send(receivePort.sendPort);
+ receivePort.listen((msg) {
+ Expect.isTrue(msg is SendPort);
+ msg.send(new FromMainIsolate());
+ receivePort.close();
+ }, onError: (e) => print('$e'));
+}
+
+spawnFuncTest() {
+ var receive1 = new ReceivePort();
+ var receive2 = new ReceivePort();
+
+ var spawnFunctionIsolate1SendPort;
+ var spawnFunctionIsolate2SendPort;
+
+ // First spawn the first isolate using spawnFunction, this isolate will
+ // create a receivePort and send it's sendPort back and then it will just
+ // sit there listening for a message from the second isolate spawned
+ // using spawnFunction.
+ asyncStart();
+ return Isolate.spawn(func1Child, [receive1.sendPort]).then((isolate) {
+ receive1.listen((msg) {
+ if (msg is SendPort) {
+ spawnFunctionIsolate1SendPort = msg;
+
+ // Now spawn the second isolate using spawnFunction, this isolate
+ // will create a receivePort and send it's sendPort back and then
+ // wait for the third isolate spawned using spawnUri to send it
+ // a sendPort to which it will try and send a non "literal-like"
+ // object.
+ Isolate.spawn(func2Child, [receive2.sendPort]).then((isolate) {
+ receive2.listen((msg) {
+ spawnFunctionIsolate2SendPort = msg;
+ receive2.close();
+
+ // Now spawn an isolate using spawnUri and send these send
+ // ports over to it. This isolate will send one of the
+ // sendports over to the other.
+ Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'), [],
+ [spawnFunctionIsolate1SendPort, spawnFunctionIsolate2SendPort]);
+ }, onError: (e) => print('$e'));
+ });
+ } else if (msg == "done") {
+ receive1.close();
+ asyncEnd();
+ } else {
+ Expect.fail("Invalid message received: $msg");
+ }
+ }, onError: (e) => print('$e'));
+ });
+}
+
+uriChild(args) {
+ var receivePort = new ReceivePort();
+ var sendPort = args[0];
+ sendPort.send(receivePort.sendPort);
+ receivePort.listen((msg) {
+ Expect.isTrue(msg is String);
+ Expect.equals("Invalid Argument(s).", msg);
+ receivePort.close();
+ sendPort.send("done");
+ }, onError: (e) => print('$e'));
+}
+
+spawnUriTest() {
+ var receive1 = new ReceivePort();
+ var receive2 = new ReceivePort();
+
+ var spawnFunctionIsolateSendPort;
+ var spawnUriIsolateSendPort;
+
+ // First spawn the first isolate using spawnFunction, this isolate will
+ // create a receivePort and send it's sendPort back and then it will just
+ // sit there listening for a message from the second isolate spawned
+ // using spawnFunction.
+ asyncStart();
+ Isolate.spawn(uriChild, [receive1.sendPort]).then((isolate) {
+ receive1.listen((msg) {
+ if (msg is SendPort) {
+ spawnFunctionIsolateSendPort = msg;
+
+ // Now spawn the second isolate using spawnUri, this isolate
+ // will create a receivePort and send it's sendPort back and then
+ // wait for the third isolate spawned using spawnUri to send it
+ // a sendPort to which it will try and send a non "literal-like"
+ // object.
+ Isolate.spawnUri(Uri.parse('issue_21398_child_isolate11.dart'), [],
+ receive2.sendPort)
+ .then((isolate) {
+ receive2.listen((msg) {
+ spawnUriIsolateSendPort = msg;
+ receive2.close();
+
+ // Now spawn an isolate using spawnUri and send these send
+ // ports over to it. This isolate will send one of the
+ // sendports over to the other.
+ Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'), [],
+ [spawnFunctionIsolateSendPort, spawnUriIsolateSendPort]);
+ }, onError: (e) => print('$e'));
+ });
+ } else if (msg == "done") {
+ receive1.close();
+ asyncEnd();
+ } else {
+ Expect.fail("Invalid message received: $msg");
+ }
+ }, onError: (e) => print('$e'));
+ });
+}
+
+main() {
+ spawnFuncTest();
+ spawnUriTest();
+}
diff --git a/tests/lib/isolate/issue_21398_parent_isolate2_test.dart b/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
new file mode 100644
index 0000000..feee51b
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+
+import "deferred_loaded_lib.dart" deferred as lib;
+
+// In this test case we send an object created from a deferred library
+// that is loaded in the child isolate but not the parent isolate. The
+// parent isolate does not know about the type of this object and throws
+// an unhandled exception.
+funcChild(args) {
+ var replyPort = args[0];
+ // Deferred load a library, create an object from that library and send
+ // it over to the parent isolate which has not yet loaded that library.
+ lib.loadLibrary().then((_) {
+ replyPort.send(new lib.FromChildIsolate());
+ });
+}
+
+void helperFunction() {
+ var receivePort = new ReceivePort();
+ asyncStart();
+
+ // Spawn an isolate using spawnFunction.
+ Isolate.spawn(funcChild, [receivePort.sendPort]).then((isolate) {
+ receivePort.listen((msg) {
+ // We don't expect to receive any valid messages.
+ Expect.fail("We don't expect to receive any valid messages");
+ receivePort.close();
+ asyncEnd();
+ }, onError: (e) {
+ // We don't expect to receive any error messages, per spec listen
+ // does not receive an error object.
+ Expect.fail("We don't expect to receive any error messages");
+ receivePort.close();
+ asyncEnd();
+ });
+ });
+}
+
+main() {
+ helperFunction(); //# 01: runtime error
+}
diff --git a/tests/lib/isolate/issue_21398_parent_isolate_test.dart b/tests/lib/isolate/issue_21398_parent_isolate_test.dart
new file mode 100644
index 0000000..34e91de
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_parent_isolate_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+
+class FromMainIsolate {
+ String toString() => 'from main isolate';
+ int get fld => 10;
+}
+
+funcChild(args) {
+ var reply = args[1];
+ var obj = args[0];
+ Expect.isTrue(obj is FromMainIsolate);
+ Expect.equals(10, obj.fld);
+ reply.send(new FromMainIsolate());
+}
+
+main() {
+ var receive1 = new ReceivePort();
+ var receive2 = new ReceivePort();
+
+ // First spawn an isolate using spawnURI and have it
+ // send back a "non-literal" like object.
+ asyncStart();
+ Isolate.spawnUri(Uri.parse('issue_21398_child_isolate.dart'), [],
+ [new FromMainIsolate(), receive1.sendPort]).catchError((error) {
+ Expect.isTrue(error is ArgumentError);
+ asyncEnd();
+ });
+ asyncStart();
+ Isolate.spawnUri(
+ Uri.parse('issue_21398_child_isolate.dart'), [], receive1.sendPort)
+ .then((isolate) {
+ receive1.listen((msg) {
+ Expect.stringEquals(msg, "Invalid Argument(s).");
+ receive1.close();
+ asyncEnd();
+ }, onError: (e) => print('$e'));
+ });
+
+ // Now spawn an isolate using spawnFunction and send it a "non-literal"
+ // like object and also have the child isolate send back a "non-literal"
+ // like object.
+ asyncStart();
+ Isolate.spawn(funcChild, [new FromMainIsolate(), receive2.sendPort])
+ .then((isolate) {
+ receive2.listen((msg) {
+ Expect.isTrue(msg is FromMainIsolate);
+ Expect.equals(10, msg.fld);
+ receive2.close();
+ asyncEnd();
+ }, onError: (e) => print('$e'));
+ });
+}
diff --git a/tests/lib/isolate/issue_22778_test.dart b/tests/lib/isolate/issue_22778_test.dart
new file mode 100644
index 0000000..28107cc
--- /dev/null
+++ b/tests/lib/isolate/issue_22778_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+func() {}
+
+main() {
+ var r = new RawReceivePort();
+ r.handler = (v) {
+ Expect.isTrue(v[0] == v[1]);
+ r.close();
+ };
+ r.sendPort.send(<Function>[func, func]);
+}
diff --git a/tests/lib/isolate/issue_24243_child1_isolate.dart b/tests/lib/isolate/issue_24243_child1_isolate.dart
new file mode 100644
index 0000000..4565cd16
--- /dev/null
+++ b/tests/lib/isolate/issue_24243_child1_isolate.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2015, 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 'dart:isolate';
+
+main(List<String> args, message) {
+ var sendPort = message;
+ try {
+ var list0 = <int>[1, 2, 3];
+ var list1 = <int>[4, 5, 6];
+ var list2 = <int>[7, 8, 9];
+ var list = new List<List<int>>.from([list0, list1, list2]);
+ sendPort.send(list);
+ } catch (error) {
+ sendPort.send("Invalid Argument(s).");
+ }
+}
diff --git a/tests/lib/isolate/issue_24243_child2_isolate.dart b/tests/lib/isolate/issue_24243_child2_isolate.dart
new file mode 100644
index 0000000..a603309
--- /dev/null
+++ b/tests/lib/isolate/issue_24243_child2_isolate.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2015, 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 'dart:isolate';
+
+main(List<String> args, message) {
+ var sendPort = message;
+ try {
+ var map0 = <int, String>{1: 'one', 2: 'two', 3: 'three'};
+ var map1 = <int, String>{4: 'four', 5: 'five', 6: 'six'};
+ var map2 = <int, String>{7: 'seven', 8: 'eight', 9: 'nine'};
+ var map = new Map<int, Map<int, String>>.from({0: map0, 1: map1, 2: map2});
+ sendPort.send(map);
+ } catch (error) {
+ sendPort.send("Invalid Argument(s).");
+ }
+}
diff --git a/tests/lib/isolate/issue_24243_child3_isolate.dart b/tests/lib/isolate/issue_24243_child3_isolate.dart
new file mode 100644
index 0000000..e45930c
--- /dev/null
+++ b/tests/lib/isolate/issue_24243_child3_isolate.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, 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 'dart:collection';
+import 'dart:isolate';
+
+main(List<String> args, message) {
+ var sendPort = message;
+ try {
+ var map0 = new LinkedHashMap<int, String>();
+ map0[1] = 'one';
+ map0[2] = 'two';
+ map0[3] = 'three';
+ var map1 = new LinkedHashMap<int, String>();
+ map1[4] = 'four';
+ map1[5] = 'five';
+ map1[6] = 'size';
+ var map2 = new LinkedHashMap<int, String>();
+ map2[7] = 'seven';
+ map2[8] = 'eight';
+ map2[9] = 'nine';
+
+ var map = new Map<int, LinkedHashMap<int, String>>.from(
+ {0: map0, 1: map1, 2: map2});
+ sendPort.send(map);
+ } catch (error) {
+ sendPort.send("Invalid Argument(s).");
+ }
+}
diff --git a/tests/lib/isolate/issue_24243_parent_isolate_test.dart b/tests/lib/isolate/issue_24243_parent_isolate_test.dart
new file mode 100644
index 0000000..c38e5e4
--- /dev/null
+++ b/tests/lib/isolate/issue_24243_parent_isolate_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:collection';
+import 'dart:isolate';
+
+import "package:expect/expect.dart";
+
+main() {
+ // First spawn an isolate using spawnURI and have it
+ // send back a "literal" like list object.
+ var receive1 = new ReceivePort();
+ Isolate.spawnUri(
+ Uri.parse('issue_24243_child1_isolate.dart'), [], receive1.sendPort)
+ .then((isolate) {
+ receive1.listen((msg) {
+ var list0 = <int>[1, 2, 3];
+ var list1 = <int>[4, 5, 6];
+ var list2 = <int>[7, 8, 9];
+ Expect.isTrue(msg is List<List<int>>);
+ Expect.listEquals(msg[0], list0);
+ Expect.listEquals(msg[1], list1);
+ Expect.listEquals(msg[2], list2);
+ Expect.throws(() => msg[0] = "throw an exception");
+ receive1.close();
+ }, onError: (e) => print('$e'));
+ });
+
+ // Now spawn an isolate using spawnURI and have it
+ // send back a "literal" like map object.
+ var receive2 = new ReceivePort();
+ Isolate.spawnUri(
+ Uri.parse('issue_24243_child2_isolate.dart'), [], receive2.sendPort)
+ .then((isolate) {
+ receive2.listen((msg) {
+ var map0 = <int, String>{1: 'one', 2: 'two', 3: 'three'};
+ var map1 = <int, String>{4: 'four', 5: 'five', 6: 'six'};
+ var map2 = <int, String>{7: 'seven', 8: 'eight', 9: 'nine'};
+ Expect.isTrue(msg is Map<int, Map<int, String>>);
+ Expect.mapEquals(msg[0], map0);
+ Expect.mapEquals(msg[1], map1);
+ Expect.mapEquals(msg[2], map2);
+ Expect.throws(() => msg[0] = "throw an exception");
+ receive2.close();
+ }, onError: (e) => print('$e'));
+ });
+
+ // Now spawn an isolate using spawnURI and have it
+ // send back a "literal" like LinkedHashMap object.
+ var receive3 = new ReceivePort();
+ Isolate.spawnUri(
+ Uri.parse('issue_24243_child3_isolate.dart'), [], receive3.sendPort)
+ .then((isolate) {
+ receive3.listen((msg) {
+ var map0 = new LinkedHashMap<int, String>();
+ map0[1] = 'one';
+ map0[2] = 'two';
+ map0[3] = 'three';
+ var map1 = new LinkedHashMap<int, String>();
+ map1[4] = 'four';
+ map1[5] = 'five';
+ map1[6] = 'size';
+ var map2 = new LinkedHashMap<int, String>();
+ map2[7] = 'seven';
+ map2[8] = 'eight';
+ map2[9] = 'nine';
+ Expect.isTrue(msg is Map<int, LinkedHashMap<int, String>>);
+ Expect.mapEquals(msg[0], map0);
+ Expect.mapEquals(msg[1], map1);
+ Expect.mapEquals(msg[2], map2);
+ Expect.throws(() => msg[0] = "throw an exception");
+ receive3.close();
+ }, onError: (e) => print('$e'));
+ });
+}
diff --git a/tests/lib/isolate/issue_35626_test.dart b/tests/lib/isolate/issue_35626_test.dart
new file mode 100644
index 0000000..1563a8392
--- /dev/null
+++ b/tests/lib/isolate/issue_35626_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2019, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Tests that sets of enums can be set through ports.
+// https://github.com/dart-lang/sdk/issues/35626
+
+library spawn_tests;
+
+import "dart:io";
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+enum MyEnum { foo, bar, baz }
+
+void sendSetOfEnums(SendPort port) {
+ Set<MyEnum> remoteSet = Set()..add(MyEnum.bar);
+ port.send(remoteSet);
+}
+
+void main() async {
+ Set<MyEnum> localSet = Set()..add(MyEnum.foo)..add(MyEnum.bar);
+ localSet.lookup(MyEnum.foo);
+
+ final port = ReceivePort();
+ await Isolate.spawn(sendSetOfEnums, port.sendPort);
+ Set<MyEnum> remoteSet = await port.first;
+
+ print(localSet);
+ print(remoteSet);
+ Expect.setEquals([MyEnum.bar], localSet.intersection(remoteSet));
+ Expect.setEquals([MyEnum.bar], remoteSet.intersection(localSet));
+}
diff --git a/tests/lib/isolate/issue_6610_test.dart b/tests/lib/isolate/issue_6610_test.dart
new file mode 100644
index 0000000..962955e
--- /dev/null
+++ b/tests/lib/isolate/issue_6610_test.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2018, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Testing that Isolate.spawn copies the source code of the parent isolate,
+// rather than rereading the parent's source URI.
+// https://github.com/dart-lang/sdk/issues/6610
+
+// Isolate structure:
+// Root 1 -> Branch 1 -> Leaf 1
+// /
+// main
+// \
+// Root 2 -> Branch 2 -> Leaf 2
+
+library spawn_tests;
+
+import "dart:io";
+import 'dart:isolate';
+import 'package:expect/expect.dart';
+
+void main() {
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ var count = 0;
+ server.listen((HttpRequest request) {
+ ++count;
+ request.response.write("""
+ import 'dart:isolate';
+
+ void main(_, SendPort port) {
+ root(port);
+ }
+
+ void root(SendPort port) {
+ port.send("Root ${count}");
+ Isolate.spawn(branch, port);
+ }
+
+ void branch(SendPort port) {
+ port.send("Branch ${count}");
+ Isolate.spawn(leaf, port);
+ }
+
+ void leaf(SendPort port) {
+ port.send("Leaf ${count}");
+ }
+ """);
+ request.response.close();
+ });
+
+ ReceivePort port = new ReceivePort();
+ var messageSet = Set();
+ port.listen((message) {
+ messageSet.add(message);
+ if (messageSet.length >= 6) {
+ server.close();
+ port.close();
+ Expect.setEquals([
+ "Root 1",
+ "Root 2",
+ "Branch 1",
+ "Branch 2",
+ "Leaf 1",
+ "Leaf 2",
+ ], messageSet);
+ }
+ });
+
+ Isolate.spawnUri(
+ Uri.parse("http://127.0.0.1:${server.port}"), [], port.sendPort);
+ Isolate.spawnUri(
+ Uri.parse("http://127.0.0.1:${server.port}"), [], port.sendPort);
+ });
+}
diff --git a/tests/lib/isolate/kill2_test.dart b/tests/lib/isolate/kill2_test.dart
new file mode 100644
index 0000000..9391fc8
--- /dev/null
+++ b/tests/lib/isolate/kill2_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ replyPort.send(v);
+ if (v == 0) port.close();
+ };
+ replyPort.send(port.sendPort);
+}
+
+void main() {
+ asyncStart();
+ var completer = new Completer(); // Completed by first reply from isolate.
+ RawReceivePort reply = new RawReceivePort(completer.complete);
+ Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+ List result = [];
+ completer.future.then((echoPort) {
+ reply.handler = (v) {
+ result.add(v);
+ if (v == 2) {
+ isolate.kill(priority: Isolate.beforeNextEvent);
+ }
+ echoPort.send(v - 1);
+ };
+ late RawReceivePort exitSignal;
+ exitSignal = new RawReceivePort((_) {
+ Expect.listEquals([4, 3, 2], result);
+ exitSignal.close();
+ reply.close();
+ asyncEnd();
+ });
+ isolate.addOnExitListener(exitSignal.sendPort);
+ echoPort.send(4);
+ });
+ });
+}
diff --git a/tests/lib/isolate/kill_self_synchronously_test.dart b/tests/lib/isolate/kill_self_synchronously_test.dart
new file mode 100644
index 0000000..19f3a2e
--- /dev/null
+++ b/tests/lib/isolate/kill_self_synchronously_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2017, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:io";
+
+void main(List<String> args) {
+ if (args.contains("--child")) {
+ new RawReceivePort(); // Hang if not killed.
+ Isolate.current.kill(priority: Isolate.immediate);
+ // No intervening call.
+ throw "QQQ Should not be reached";
+ } else {
+ var exec = Platform.resolvedExecutable;
+ var args = <String>[];
+ args.addAll(Platform.executableArguments);
+ args.add(Platform.script.toFilePath());
+ args.add("--child");
+ var result = Process.runSync(exec, args);
+ if (result.exitCode != 255) {
+ throw "Wrong exit code: ${result.exitCode}";
+ }
+ if (result.stderr.contains("QQQ Should not be reached")) {
+ print(result.stderr);
+ throw "Not killed synchronously";
+ }
+ if (!result.stderr.contains("isolate terminated by Isolate.kill")) {
+ print(result.stderr);
+ throw "Missing killed message";
+ }
+ }
+}
diff --git a/tests/lib/isolate/kill_self_test.dart b/tests/lib/isolate/kill_self_test.dart
new file mode 100644
index 0000000..157b30f
--- /dev/null
+++ b/tests/lib/isolate/kill_self_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ bool firstEvent = true;
+ port.handler = (v) {
+ if (!firstEvent) {
+ throw "Survived suicide";
+ }
+ var controlPort = v[0];
+ var killCapability = v[1];
+ firstEvent = false;
+ var isolate = new Isolate(controlPort, terminateCapability: killCapability);
+ isolate.kill(priority: Isolate.immediate);
+ };
+ replyPort.send(port.sendPort);
+}
+
+void main() {
+ asyncStart();
+ var completer = new Completer(); // Completed by first reply from isolate.
+ RawReceivePort reply = new RawReceivePort(completer.complete);
+ Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+ completer.future.then((isolatePort) {
+ late RawReceivePort exitSignal;
+ exitSignal = new RawReceivePort((_) {
+ exitSignal.close();
+ asyncEnd();
+ });
+ isolate.addOnExitListener(exitSignal.sendPort);
+ isolatePort.send([isolate.controlPort, isolate.terminateCapability]);
+ reply.close();
+ });
+ });
+}
diff --git a/tests/lib/isolate/kill_test.dart b/tests/lib/isolate/kill_test.dart
new file mode 100644
index 0000000..07e0dfe8
--- /dev/null
+++ b/tests/lib/isolate/kill_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ replyPort.send(v);
+ if (v == 0) port.close();
+ };
+ replyPort.send(port.sendPort);
+}
+
+void main() {
+ asyncStart();
+ var completer = new Completer(); // Completed by first reply from isolate.
+ RawReceivePort reply = new RawReceivePort(completer.complete);
+ Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+ completer.future.then((_echoPort) {
+ SendPort echoPort = _echoPort;
+ List result = [];
+ reply.handler = (v) {
+ result.add(v);
+ if (v == 2) {
+ isolate.kill(priority: Isolate.immediate);
+ }
+ echoPort.send(v - 1);
+ };
+ late RawReceivePort exitSignal;
+ exitSignal = new RawReceivePort((_) {
+ Expect.listEquals([4, 3, 2], result);
+ exitSignal.close();
+ reply.close();
+ asyncEnd();
+ });
+ isolate.addOnExitListener(exitSignal.sendPort);
+ echoPort.send(4);
+ });
+ });
+}
diff --git a/tests/lib/isolate/large_byte_data_leak_test.dart b/tests/lib/isolate/large_byte_data_leak_test.dart
new file mode 100644
index 0000000..1313519
--- /dev/null
+++ b/tests/lib/isolate/large_byte_data_leak_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:developer" show UserTag;
+import "dart:isolate" show Isolate, ReceivePort;
+import "dart:typed_data" show ByteData;
+import "package:expect/expect.dart";
+
+const large = 2 * 1024 * 1024;
+
+void child(replyPort) {
+ print("Child start");
+
+ Expect.throws(() {
+ replyPort.send([
+ new ByteData(large),
+ new UserTag("User tags are not allowed in isolate messages"),
+ new ByteData(large),
+ ]);
+ replyPort.send("Not reached");
+ }, (e) {
+ return e.toString().contains("Illegal argument in isolate message");
+ });
+
+ replyPort.send("Done");
+
+ print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+ print("Parent start");
+
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(child, port.sendPort);
+
+ Expect.equals("Done", await port.first);
+
+ print("Parent done");
+}
diff --git a/tests/lib/isolate/large_byte_data_test.dart b/tests/lib/isolate/large_byte_data_test.dart
new file mode 100644
index 0000000..8a78238
--- /dev/null
+++ b/tests/lib/isolate/large_byte_data_test.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2018, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+const large = 2 * 1024 * 1024;
+
+void child(replyPort) {
+ print("Child start");
+
+ print("Child ByteData");
+ dynamic x = new ByteData(large);
+ for (int i = 0; i < 4; i++) {
+ x.setInt8(i, i);
+ }
+ replyPort.send(x);
+
+ print("Child Uint8List");
+ x = new Uint8List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(x);
+
+ print("Child Int8List");
+ x = new Int8List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(x);
+
+ print("Child Uint16List");
+ x = new Uint16List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(x);
+
+ print("Child Int16List");
+ x = new Int16List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(x);
+
+ print("Child Uint32List");
+ x = new Uint32List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(x);
+
+ print("Child Int32List");
+ x = new Int32List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(x);
+
+ print("Child Uint64List");
+ x = new Uint64List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(x);
+
+ print("Child Int64List");
+ x = new Int64List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(x);
+
+ print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+ print("Parent start");
+
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(child, port.sendPort);
+ StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+ print("Parent ByteData");
+ Expect.isTrue(await incoming.moveNext());
+ dynamic x = incoming.current;
+ Expect.isTrue(x is ByteData);
+ Expect.equals(large, x.lengthInBytes);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x.getUint8(i));
+ }
+
+ print("Parent Uint8");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Uint8List);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Int8");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Int8List);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Uint16");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Uint16List);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Int16");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Int16List);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Uint32");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Uint32List);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Int32");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Int32List);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Uint64");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Uint64List);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Int64");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Int64List);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ port.close();
+ print("Parent done");
+}
diff --git a/tests/lib/isolate/mandel_isolate_test.dart b/tests/lib/isolate/mandel_isolate_test.dart
new file mode 100644
index 0000000..50d564a
--- /dev/null
+++ b/tests/lib/isolate/mandel_isolate_test.dart
@@ -0,0 +1,159 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library MandelIsolateTest;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:math';
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+const TERMINATION_MESSAGE = -1;
+const N = 100;
+const ISOLATES = 20;
+
+void main([args, port]) {
+ final state = new MandelbrotState();
+ asyncStart();
+ state._validated.future.then((result) {
+ Expect.isTrue(result);
+ asyncEnd();
+ });
+ for (int i = 0; i < min(ISOLATES, N); i++) state.startClient(i);
+}
+
+class MandelbrotState {
+ MandelbrotState() {
+ _result = new List<List<int>>.filled(N, []);
+ _lineProcessedBy = new List<LineProcessorClient?>.filled(N, null);
+ _sent = 0;
+ _missing = N;
+ _validated = new Completer<bool>();
+ }
+
+ void startClient(int id) {
+ assert(_sent < N);
+ int line = _sent++;
+ LineProcessorClient.create(this, id).then((final client) {
+ client.processLine(line);
+ });
+ }
+
+ void notifyProcessedLine(LineProcessorClient client, int y, List<int> line) {
+ assert(_result[y].isEmpty);
+ _result[y] = line;
+ _lineProcessedBy[y] = client;
+
+ if (_sent != N) {
+ client.processLine(_sent++);
+ } else {
+ client.shutdown();
+ }
+
+ // If all lines have been computed, validate the result.
+ if (--_missing == 0) {
+ _printResult();
+ _validateResult();
+ }
+ }
+
+ void _validateResult() {
+ // TODO(ngeoffray): Implement this.
+ _validated.complete(true);
+ }
+
+ void _printResult() {
+ var output = new StringBuffer();
+ for (int i = 0; i < _result.length; i++) {
+ List<int> line = _result[i];
+ for (int j = 0; j < line.length; j++) {
+ if (line[j] < 10) output.write("0");
+ output.write(line[j]);
+ }
+ output.write("\n");
+ }
+ // print(output);
+ }
+
+ late List<List<int>> _result;
+ late List<LineProcessorClient?> _lineProcessedBy;
+ late int _sent;
+ late int _missing;
+ late Completer<bool> _validated;
+}
+
+class LineProcessorClient {
+ MandelbrotState _state;
+ int _id;
+ SendPort _port;
+
+ LineProcessorClient(this._state, this._id, this._port);
+
+ static Future<LineProcessorClient> create(MandelbrotState state, int id) {
+ ReceivePort reply = new ReceivePort();
+ return Isolate.spawn(processLines, reply.sendPort).then((_) {
+ return reply.first.then((port) {
+ return new LineProcessorClient(state, id, port);
+ });
+ });
+ }
+
+ void processLine(int y) {
+ ReceivePort reply = new ReceivePort();
+ _port.send([y, reply.sendPort]);
+ reply.first.then((message) {
+ _state.notifyProcessedLine(this, y, message as List<int>);
+ });
+ }
+
+ void shutdown() {
+ _port.send(TERMINATION_MESSAGE);
+ }
+}
+
+List<int> processLine(int y) {
+ double inverseN = 2.0 / N;
+ double Civ = y * inverseN - 1.0;
+ List<int> result = new List<int>.filled(N, 0);
+ for (int x = 0; x < N; x++) {
+ double Crv = x * inverseN - 1.5;
+
+ double Zrv = Crv;
+ double Ziv = Civ;
+
+ double Trv = Crv * Crv;
+ double Tiv = Civ * Civ;
+
+ int i = 49;
+ do {
+ Ziv = (Zrv * Ziv) + (Zrv * Ziv) + Civ;
+ Zrv = Trv - Tiv + Crv;
+
+ Trv = Zrv * Zrv;
+ Tiv = Ziv * Ziv;
+ } while (((Trv + Tiv) <= 4.0) && (--i > 0));
+
+ result[x] = i;
+ }
+ return result;
+}
+
+void processLines(SendPort replyPort) {
+ ReceivePort port = new ReceivePort();
+ port.listen((message) {
+ if (message != TERMINATION_MESSAGE) {
+ int line = message[0];
+ SendPort replyTo = message[1];
+ replyTo.send(processLine(line));
+ } else {
+ port.close();
+ }
+ });
+ replyPort.send(port.sendPort);
+}
diff --git a/tests/lib/isolate/message2_test.dart b/tests/lib/isolate/message2_test.dart
new file mode 100644
index 0000000..7c2e691
--- /dev/null
+++ b/tests/lib/isolate/message2_test.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing serialization of messages.
+// VMOptions=--enable_type_checks --enable_asserts
+
+library Message2Test;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+// ---------------------------------------------------------------------------
+// Message passing test 2.
+// ---------------------------------------------------------------------------
+
+class MessageTest {
+ static void mapEqualsDeep(Map expected, Map actual) {
+ Expect.equals(actual.length, expected.length);
+ testForEachMap(key, value) {
+ if (value is List) {
+ listEqualsDeep(value, actual[key]);
+ } else {
+ Expect.equals(actual[key], value);
+ }
+ }
+
+ expected.forEach(testForEachMap);
+ }
+
+ static void listEqualsDeep(List expected, List actual) {
+ for (int i = 0; i < expected.length; i++) {
+ if (expected[i] is List) {
+ Expect.type<List>(actual[i]);
+ listEqualsDeep(expected[i], actual[i]);
+ } else if (expected[i] is Map) {
+ Expect.type<Map>(actual[i]);
+ mapEqualsDeep(expected[i], actual[i]);
+ } else {
+ Expect.equals(actual[i], expected[i]);
+ }
+ }
+ }
+}
+
+void pingPong(replyPort) {
+ ReceivePort port = new ReceivePort();
+ port.listen((message) {
+ if (message is SendPort) {
+ message.send('done');
+ port.close();
+ } else {
+ // Bounce the received object back so that the sender
+ // can make sure that the object matches.
+ message[1].send(message[0]);
+ }
+ });
+ replyPort.send(port.sendPort);
+}
+
+void main([args, port]) {
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(pingPong, port.sendPort);
+ asyncStart();
+ port.first.then((remote) {
+ Map m = new Map();
+ m[1] = "eins";
+ m[2] = "deux";
+ m[3] = "tre";
+ m[4] = "four";
+ ReceivePort replyPort = new ReceivePort();
+ remote.send([m, replyPort.sendPort]);
+ replyPort.listen((var received) {
+ if (received == 'done') {
+ replyPort.close();
+ asyncEnd();
+ } else {
+ MessageTest.mapEqualsDeep(m, received);
+ remote.send(replyPort.sendPort);
+ }
+ });
+ });
+}
diff --git a/tests/lib/isolate/message3_test.dart b/tests/lib/isolate/message3_test.dart
new file mode 100644
index 0000000..0bc63ff
--- /dev/null
+++ b/tests/lib/isolate/message3_test.dart
@@ -0,0 +1,503 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing serialization of messages.
+// VMOptions=--enable_type_checks --enable_asserts
+
+library MessageTest;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'dart:typed_data';
+
+void echoMain(msg) {
+ SendPort replyTo = msg[0];
+ SendPort pong = msg[1];
+ ReceivePort port = new ReceivePort();
+ replyTo.send(port.sendPort);
+ port.listen((msg) {
+ if (msg == "halt") {
+ port.close();
+ } else {
+ pong.send(msg);
+ }
+ });
+}
+
+class A {
+ var field = 499;
+
+ A();
+ A.named(this.field);
+}
+
+class B extends A {
+ final field2;
+ B() : field2 = 99;
+ B.named(this.field2, x) : super.named(x);
+}
+
+class C extends B {
+ var field = 33;
+
+ get superField => super.field;
+ get superField2 => super.field2;
+}
+
+class M {
+ get field2 => 11;
+}
+
+class D extends C with M {
+ var gee = 123;
+}
+
+class E {
+ Function fun;
+ E(this.fun);
+
+ static fooFun() => 499;
+ instanceFun() => 1234;
+}
+
+barFun() => 42;
+
+class F {
+ final field = "field";
+ const F();
+}
+
+class G {
+ final field;
+ const G(this.field);
+}
+
+class Value {
+ final val;
+ Value(this.val);
+
+ operator ==(other) {
+ if (other is! Value) return false;
+ return other.val == val;
+ }
+
+ get hashCode => val;
+}
+
+void runTests(SendPort ping, Queue checks) {
+ ping.send("abc");
+ checks.add((x) => Expect.equals("abc", x));
+
+ ping.send([1, 2]);
+ checks.add((x) {
+ Expect.isTrue(x is List);
+ Expect.listEquals([1, 2], x);
+ // Make sure the list is mutable.
+ x[0] = 0;
+ Expect.equals(0, x[0]);
+ // List must be extendable.
+ x.add(3);
+ Expect.equals(3, x[2]);
+ });
+
+ var fixed = List.filled(2, 0);
+ fixed[0] = 0;
+ fixed[1] = 1;
+ ping.send(fixed);
+ checks.add((x) {
+ Expect.isTrue(x is List);
+ Expect.listEquals([0, 1], x);
+ // List must be mutable.
+ x[0] = 3;
+ Expect.equals(3, x[0]);
+ // List must be fixed length.
+ Expect.throws(() {
+ x.add(5);
+ });
+ });
+
+ List cyclic = [];
+ cyclic.add(cyclic);
+ ping.send(cyclic);
+ checks.add((x) {
+ Expect.isTrue(x is List);
+ Expect.equals(1, x.length);
+ Expect.identical(x, x[0]);
+ // List must be mutable.
+ x[0] = 55;
+ Expect.equals(55, x[0]);
+ // List must be extendable.
+ x.add(42);
+ Expect.equals(42, x[1]);
+ });
+
+ var cyclic2 = List<Object?>.filled(1, null);
+ cyclic2[0] = cyclic2;
+ ping.send(cyclic2);
+ checks.add((x) {
+ Expect.isTrue(x is List);
+ Expect.equals(1, x.length);
+ Expect.identical(x, x[0]);
+ // List must be mutable.
+ x[0] = 55;
+ Expect.equals(55, x[0]);
+ // List must be fixed.
+ Expect.throws(() => x.add(42));
+ });
+
+ List constList = const [1, 2];
+ ping.send(constList);
+ checks.add((x) {
+ Expect.isTrue(x is List);
+ Expect.listEquals([1, 2], x);
+ // Make sure the list is immutable.
+ Expect.throws(() => x[0] = 0); // //# constList: ok
+ // List must not be extendable.
+ Expect.throws(() => x.add(3));
+ Expect.identical(x, constList); // //# constList_identical: ok
+ });
+
+ Uint8List uint8 = new Uint8List(2);
+ uint8[0] = 0;
+ uint8[1] = 1;
+ ping.send(uint8);
+ checks.add((x) {
+ Expect.isTrue(x is Uint8List);
+ Expect.equals(2, x.length);
+ Expect.equals(0, x[0]);
+ Expect.equals(1, x[1]);
+ });
+
+ Uint16List uint16 = new Uint16List(2);
+ uint16[0] = 0;
+ uint16[1] = 1;
+ ByteBuffer byteBuffer = uint16.buffer;
+ ping.send(byteBuffer); // //# byteBuffer: ok
+ checks.add( // //# byteBuffer: ok
+ (x) {
+ Expect.isTrue(x is ByteBuffer);
+ Uint16List uint16View = new Uint16List.view(x);
+ Expect.equals(2, uint16View.length);
+ Expect.equals(0, uint16View[0]);
+ Expect.equals(1, uint16View[1]);
+ }
+ ) // //# byteBuffer: ok
+ ;
+
+ Int32x4List list32x4 = new Int32x4List(2);
+ list32x4[0] = new Int32x4(1, 2, 3, 4);
+ list32x4[1] = new Int32x4(5, 6, 7, 8);
+ ping.send(list32x4);
+ checks.add(
+ (x) {
+ Expect.isTrue(x is Int32x4List);
+ Expect.equals(2, x.length);
+ Int32x4 entry1 = x[0];
+ Int32x4 entry2 = x[1];
+ Expect.equals(1, entry1.x);
+ Expect.equals(2, entry1.y);
+ Expect.equals(3, entry1.z);
+ Expect.equals(4, entry1.w);
+ Expect.equals(5, entry2.x);
+ Expect.equals(6, entry2.y);
+ Expect.equals(7, entry2.z);
+ Expect.equals(8, entry2.w);
+ });
+
+ Float32x4List flist32x4 = new Float32x4List(2);
+ flist32x4[0] = new Float32x4(1.5, 2.5, 3.5, 4.5);
+ flist32x4[1] = new Float32x4(5.5, 6.5, 7.5, 8.5);
+ ping.send(flist32x4);
+ checks.add(
+ (x) {
+ Expect.isTrue(x is Float32x4List);
+ Expect.equals(2, x.length);
+ Float32x4 entry1 = x[0];
+ Float32x4 entry2 = x[1];
+ Expect.equals(1.5, entry1.x);
+ Expect.equals(2.5, entry1.y);
+ Expect.equals(3.5, entry1.z);
+ Expect.equals(4.5, entry1.w);
+ Expect.equals(5.5, entry2.x);
+ Expect.equals(6.5, entry2.y);
+ Expect.equals(7.5, entry2.z);
+ Expect.equals(8.5, entry2.w);
+ });
+
+ Float64x2List flist64x2 = new Float64x2List(2);
+ flist64x2[0] = new Float64x2(1.5, 2.5);
+ flist64x2[1] = new Float64x2(5.5, 6.5);
+ ping.send(flist64x2);
+ checks.add(
+ (x) {
+ Expect.isTrue(x is Float64x2List);
+ Expect.equals(2, x.length);
+ Float64x2 entry1 = x[0];
+ Float64x2 entry2 = x[1];
+ Expect.equals(1.5, entry1.x);
+ Expect.equals(2.5, entry1.y);
+ Expect.equals(5.5, entry2.x);
+ Expect.equals(6.5, entry2.y);
+ });
+
+ ping.send({"foo": 499, "bar": 32});
+ checks.add((x) {
+ Expect.isTrue(x is LinkedHashMap);
+ Expect.listEquals(["foo", "bar"], x.keys.toList());
+ Expect.listEquals([499, 32], x.values.toList());
+ Expect.equals(499, x["foo"]);
+ Expect.equals(32, x["bar"]);
+ // Must be mutable.
+ x["foo"] = 22;
+ Expect.equals(22, x["foo"]);
+ // Must be extendable.
+ x["gee"] = 499;
+ Expect.equals(499, x["gee"]);
+ });
+
+ Map<String, int> mapWithRemovedKey = {"foo": 499, "bar": 32};
+ mapWithRemovedKey.remove("foo");
+ ping.send(mapWithRemovedKey);
+ checks.add((x) {
+ Expect.isTrue(x is LinkedHashMap);
+ Expect.listEquals(["bar"], x.keys.toList());
+ Expect.listEquals([32], x.values.toList());
+ Expect.equals(32, x["bar"]);
+ });
+
+ // Test map where a key does not define ==/hashCode.
+ Map<A, int> mapWithIdentityKey = new Map<A, int>();
+ mapWithIdentityKey[new A()] = 499;
+ ping.send(mapWithIdentityKey);
+ checks.add((x) {
+ Expect.isTrue(x is LinkedHashMap);
+ int value = x.values.first;
+ Expect.equals(499, value);
+ A key = x.keys.first;
+ Expect.equals(499, x[key]);
+ });
+
+ ping.send({0: 499, 1: 32});
+ checks.add((x) {
+ Expect.isTrue(x is LinkedHashMap);
+ Expect.listEquals([0, 1], x.keys.toList());
+ Expect.listEquals([499, 32], x.values.toList());
+ // Must be mutable.
+ x[0] = 22;
+ Expect.equals(22, x[0]);
+ // Must be extendable.
+ x[123] = 499;
+ Expect.equals(499, x[123]);
+ });
+
+ Map cyclicMap = {};
+ cyclicMap["cycle"] = cyclicMap;
+ ping.send(cyclicMap);
+ checks.add((x) {
+ Expect.isTrue(x is LinkedHashMap);
+ Expect.identical(x, x["cycle"]);
+ // Must be mutable.
+ x["cycle"] = 22;
+ Expect.equals(22, x["cycle"]);
+ // Must be extendable.
+ x["gee"] = 499;
+ Expect.equals(499, x["gee"]);
+ });
+
+ Map constMap = const {'foo': 499};
+ ping.send(constMap);
+ checks.add((x) {
+ Expect.isTrue(x is Map);
+ print(x.length);
+ Expect.equals(1, x.length);
+ Expect.equals(499, x['foo']);
+ Expect.identical(constMap, x); // //# constMap: ok
+ Expect.throws(() => constMap['bar'] = 42);
+ });
+
+ ping.send(new A());
+ checks.add((x) {
+ Expect.isTrue(x is A);
+ Expect.equals(499, x.field);
+ });
+
+ ping.send(new A.named(42));
+ checks.add((x) {
+ Expect.isTrue(x is A);
+ Expect.equals(42, x.field);
+ });
+
+ ping.send(new B());
+ checks.add((x) {
+ Expect.isTrue(x is A);
+ Expect.isTrue(x is B);
+ Expect.equals(499, x.field);
+ Expect.equals(99, x.field2);
+ Expect.throws(() => x.field2 = 22);
+ });
+
+ ping.send(new B.named(1, 2));
+ checks.add((x) {
+ Expect.isTrue(x is A);
+ Expect.isTrue(x is B);
+ Expect.equals(2, x.field);
+ Expect.equals(1, x.field2);
+ Expect.throws(() => x.field2 = 22);
+ });
+
+ ping.send(new C());
+ checks.add((x) {
+ Expect.isTrue(x is A);
+ Expect.isTrue(x is B);
+ Expect.isTrue(x is C);
+ Expect.equals(33, x.field);
+ Expect.equals(99, x.field2);
+ Expect.equals(499, x.superField);
+ Expect.throws(() => x.field2 = 22);
+ });
+
+ ping.send(new D());
+ checks.add((x) {
+ Expect.isTrue(x is A);
+ Expect.isTrue(x is B);
+ Expect.isTrue(x is C);
+ Expect.isTrue(x is D);
+ Expect.isTrue(x is M);
+ Expect.equals(33, x.field);
+ Expect.equals(11, x.field2);
+ Expect.equals(499, x.superField);
+ Expect.equals(99, x.superField2);
+ Expect.throws(() => x.field2 = 22);
+ });
+
+ D cyclicD = new D();
+ ping.send(cyclicD);
+ checks.add((x) {
+ Expect.isTrue(x is A);
+ Expect.isTrue(x is B);
+ Expect.isTrue(x is C);
+ Expect.isTrue(x is D);
+ Expect.isTrue(x is M);
+ Expect.equals(11, x.field2);
+ Expect.equals(499, x.superField);
+ Expect.equals(99, x.superField2);
+ Expect.throws(() => x.field2 = 22);
+ });
+
+ ping.send(new E(E.fooFun)); // //# fun: ok
+ checks.add((x) { // //# fun: continued
+ Expect.equals(E.fooFun, x.fun); // //# fun: continued
+ Expect.equals(499, x.fun()); // //# fun: continued
+ }); // //# fun: continued
+
+ ping.send(new E(barFun)); // //# fun: continued
+ checks.add((x) { // //# fun: continued
+ Expect.equals(barFun, x.fun); // //# fun: continued
+ Expect.equals(42, x.fun()); // //# fun: continued
+ }); // //# fun: continued
+
+ Expect.throws(() => ping.send(new E(new E(E.fooFun).instanceFun)));
+
+ F nonConstF = new F();
+ ping.send(nonConstF);
+ checks.add((x) {
+ Expect.equals("field", x.field);
+ Expect.isFalse(identical(nonConstF, x));
+ });
+
+ const F constF = const F();
+ ping.send(constF);
+ checks.add((x) {
+ Expect.equals("field", x.field);
+ Expect.identical(constF, x); // //# constInstance: ok
+ });
+
+ G g1 = new G(nonConstF);
+ G g2 = new G(constF);
+ G g3 = const G(constF);
+ ping.send(g1);
+ ping.send(g2);
+ ping.send(g3);
+
+ checks.add((x) {
+ // g1.
+ Expect.isTrue(x is G);
+ Expect.isFalse(identical(g1, x));
+ F f = x.field;
+ Expect.equals("field", f.field);
+ Expect.isFalse(identical(nonConstF, f));
+ });
+ checks.add((x) {
+ // g2.
+ Expect.isTrue(x is G);
+ Expect.isFalse(identical(g1, x));
+ F f = x.field;
+ Expect.equals("field", f.field);
+ Expect.identical(constF, f); // //# constInstance: continued
+ });
+ checks.add((x) {
+ // g3.
+ Expect.isTrue(x is G);
+ Expect.identical(g3, x); // //# constInstance: continued
+ F f = x.field;
+ Expect.equals("field", f.field);
+ Expect.identical(constF, f); // //# constInstance: continued
+ });
+
+ // Make sure objects in a map are serialized and deserialized in the correct
+ // order.
+ Map m = new Map();
+ Value val1 = new Value(1);
+ Value val2 = new Value(2);
+ m[val1] = val2;
+ m[val2] = val1;
+ // Possible bug we want to catch:
+ // serializer runs through keys first, and then the values:
+ // - id1 = val1, id2 = val2, ref[id2], ref[id1]
+ // deserializer runs through the keys and values in order:
+ // - val1; // id1.
+ // - ref[id2]; // boom. Wasn't deserialized yet.
+ ping.send(m);
+ checks.add((x) {
+ Expect.isTrue(x is Map);
+ Expect.equals(2, x.length);
+ Expect.equals(val2, x[val1]);
+ Expect.equals(val1, x[val2]);
+ Expect.identical(x.keys.elementAt(0), x.values.elementAt(1));
+ Expect.identical(x.keys.elementAt(1), x.values.elementAt(0));
+ });
+}
+
+void main() {
+ asyncStart();
+ Queue checks = new Queue();
+ ReceivePort testPort = new ReceivePort();
+ Completer completer = new Completer();
+
+ testPort.listen((msg) {
+ Function check = checks.removeFirst();
+ check(msg);
+ if (checks.isEmpty) {
+ completer.complete();
+ testPort.close();
+ }
+ });
+
+ ReceivePort initialReplyPort = new ReceivePort();
+ Isolate
+ .spawn(echoMain, [initialReplyPort.sendPort, testPort.sendPort])
+ .then((_) => initialReplyPort.first)
+ .then((_ping) {
+ SendPort ping = _ping;
+ runTests(ping, checks);
+ Expect.isTrue(checks.length > 0);
+ completer.future.then((_) => ping.send("halt")).then((_) => asyncEnd());
+ });
+}
diff --git a/tests/lib/isolate/message4_test.dart b/tests/lib/isolate/message4_test.dart
new file mode 100644
index 0000000..4644ddb
--- /dev/null
+++ b/tests/lib/isolate/message4_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2017, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing serialization of messages with static
+// native functions.
+
+library MessageTest;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void echoMain(msg) {
+ SendPort replyTo = msg[0];
+ SendPort pong = msg[1];
+ ReceivePort port = new ReceivePort();
+ replyTo.send(port.sendPort);
+ port.listen((msg) {
+ if (msg == "halt") {
+ port.close();
+ } else {
+ pong.send(msg);
+ }
+ });
+}
+
+void runTests(SendPort ping, Queue checks) {
+ ping.send("abc");
+ checks.add((x) => Expect.equals("abc", x));
+
+ ping.send(int.parse);
+ checks.add((x) => Expect.identical(int.parse, x));
+
+ ping.send(identityHashCode);
+ checks.add((x) => Expect.identical(identityHashCode, x));
+
+ ping.send(identical);
+ checks.add((x) => Expect.identical(identical, x));
+}
+
+main() async {
+ asyncStart();
+ Queue checks = new Queue();
+ ReceivePort testPort = new ReceivePort();
+ Completer completer = new Completer();
+
+ testPort.listen((msg) {
+ Function check = checks.removeFirst();
+ check(msg);
+ if (checks.isEmpty) {
+ completer.complete();
+ testPort.close();
+ }
+ });
+
+ ReceivePort initialReplyPort = new ReceivePort();
+
+ Isolate i = await Isolate.spawn(
+ echoMain, [initialReplyPort.sendPort, testPort.sendPort]);
+ SendPort ping = await initialReplyPort.first;
+ runTests(ping, checks);
+ Expect.isTrue(checks.length > 0);
+ await completer.future;
+ ping.send("halt");
+ asyncEnd();
+}
diff --git a/tests/lib/isolate/message_const_type_arguments_1_test.dart b/tests/lib/isolate/message_const_type_arguments_1_test.dart
new file mode 100644
index 0000000..e5133aa
--- /dev/null
+++ b/tests/lib/isolate/message_const_type_arguments_1_test.dart
@@ -0,0 +1,410 @@
+// Copyright (c) 2019, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// https://github.com/dart-lang/sdk/issues/35778
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+void child(replyPort) {
+ print("Child start");
+
+ replyPort.send(const <List>[]);
+ replyPort.send(const <Map>[]);
+ replyPort.send(const <Null>[]);
+ replyPort.send(const <Object>[]);
+ replyPort.send(const <String>[]);
+ replyPort.send(const <bool>[]);
+ replyPort.send(const <double>[]);
+ replyPort.send(const <int>[]);
+ replyPort.send(const <num>[]);
+
+ replyPort.send(const <List, List>{});
+ replyPort.send(const <List, Map>{});
+ replyPort.send(const <List, Null>{});
+ replyPort.send(const <List, Object>{});
+ replyPort.send(const <List, String>{});
+ replyPort.send(const <List, bool>{});
+ replyPort.send(const <List, double>{});
+ replyPort.send(const <List, int>{});
+ replyPort.send(const <List, num>{});
+
+ replyPort.send(const <Map, List>{});
+ replyPort.send(const <Map, Map>{});
+ replyPort.send(const <Map, Null>{});
+ replyPort.send(const <Map, Object>{});
+ replyPort.send(const <Map, String>{});
+ replyPort.send(const <Map, bool>{});
+ replyPort.send(const <Map, double>{});
+ replyPort.send(const <Map, int>{});
+ replyPort.send(const <Map, num>{});
+
+ replyPort.send(const <Null, List>{});
+ replyPort.send(const <Null, Map>{});
+ replyPort.send(const <Null, Null>{});
+ replyPort.send(const <Null, Object>{});
+ replyPort.send(const <Null, String>{});
+ replyPort.send(const <Null, bool>{});
+ replyPort.send(const <Null, double>{});
+ replyPort.send(const <Null, int>{});
+ replyPort.send(const <Null, num>{});
+
+ replyPort.send(const <Object, List>{});
+ replyPort.send(const <Object, Map>{});
+ replyPort.send(const <Object, Null>{});
+ replyPort.send(const <Object, Object>{});
+ replyPort.send(const <Object, String>{});
+ replyPort.send(const <Object, bool>{});
+ replyPort.send(const <Object, double>{});
+ replyPort.send(const <Object, int>{});
+ replyPort.send(const <Object, num>{});
+
+ replyPort.send(const <String, List>{});
+ replyPort.send(const <String, Map>{});
+ replyPort.send(const <String, Null>{});
+ replyPort.send(const <String, Object>{});
+ replyPort.send(const <String, String>{});
+ replyPort.send(const <String, bool>{});
+ replyPort.send(const <String, double>{});
+ replyPort.send(const <String, int>{});
+ replyPort.send(const <String, num>{});
+
+ replyPort.send(const <bool, List>{});
+ replyPort.send(const <bool, Map>{});
+ replyPort.send(const <bool, Null>{});
+ replyPort.send(const <bool, Object>{});
+ replyPort.send(const <bool, String>{});
+ replyPort.send(const <bool, bool>{});
+ replyPort.send(const <bool, double>{});
+ replyPort.send(const <bool, int>{});
+ replyPort.send(const <bool, num>{});
+
+ replyPort.send(const <double, List>{});
+ replyPort.send(const <double, Map>{});
+ replyPort.send(const <double, Null>{});
+ replyPort.send(const <double, Object>{});
+ replyPort.send(const <double, String>{});
+ replyPort.send(const <double, bool>{});
+ replyPort.send(const <double, double>{});
+ replyPort.send(const <double, int>{});
+ replyPort.send(const <double, num>{});
+
+ replyPort.send(const <int, List>{});
+ replyPort.send(const <int, Map>{});
+ replyPort.send(const <int, Null>{});
+ replyPort.send(const <int, Object>{});
+ replyPort.send(const <int, String>{});
+ replyPort.send(const <int, bool>{});
+ replyPort.send(const <int, double>{});
+ replyPort.send(const <int, int>{});
+ replyPort.send(const <int, num>{});
+
+ replyPort.send(const <num, List>{});
+ replyPort.send(const <num, Map>{});
+ replyPort.send(const <num, Null>{});
+ replyPort.send(const <num, Object>{});
+ replyPort.send(const <num, String>{});
+ replyPort.send(const <num, bool>{});
+ replyPort.send(const <num, double>{});
+ replyPort.send(const <num, int>{});
+ replyPort.send(const <num, num>{});
+
+ print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+ print("Parent start");
+
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(child, port.sendPort);
+ StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+ Expect.isTrue(await incoming.moveNext());
+ dynamic x = incoming.current;
+ Expect.isTrue(x is List<List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is List<Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is List<Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is List<Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is List<String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is List<bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is List<double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is List<int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is List<num>);
+
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<List, List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<List, Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<List, Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<List, Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<List, String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<List, bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<List, double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<List, int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<List, num>);
+
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Map, List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Map, Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Map, Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Map, Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Map, String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Map, bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Map, double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Map, int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Map, num>);
+
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Null, List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Null, Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Null, Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Null, Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Null, String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Null, bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Null, double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Null, int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Null, num>);
+
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Object, List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Object, Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Object, Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Object, Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Object, String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Object, bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Object, double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Object, int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<Object, num>);
+
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<String, List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<String, Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<String, Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<String, Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<String, String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<String, bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<String, double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<String, int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<String, num>);
+
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<bool, List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<bool, Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<bool, Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<bool, Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<bool, String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<bool, bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<bool, double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<bool, int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<bool, num>);
+
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<double, List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<double, Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<double, Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<double, Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<double, String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<double, bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<double, double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<double, int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<double, num>);
+
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<int, List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<int, Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<int, Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<int, Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<int, String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<int, bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<int, double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<int, int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<int, num>);
+
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<num, List>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<num, Map>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<num, Null>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<num, Object>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<num, String>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<num, bool>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<num, double>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<num, int>);
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current;
+ Expect.isTrue(x is Map<num, num>);
+
+ port.close();
+ print("Parent done");
+}
diff --git a/tests/lib/isolate/message_const_type_arguments_2_test.dart b/tests/lib/isolate/message_const_type_arguments_2_test.dart
new file mode 100644
index 0000000..002aa6e
--- /dev/null
+++ b/tests/lib/isolate/message_const_type_arguments_2_test.dart
@@ -0,0 +1,320 @@
+// Copyright (c) 2019, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// https://github.com/dart-lang/sdk/issues/35778
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+void child(replyPort) {
+ print("Child start");
+
+ replyPort.send(const <List>[]);
+ replyPort.send(const <Map>[]);
+ replyPort.send(const <Null>[]);
+ replyPort.send(const <Object>[]);
+ replyPort.send(const <String>[]);
+ replyPort.send(const <bool>[]);
+ replyPort.send(const <double>[]);
+ replyPort.send(const <int>[]);
+ replyPort.send(const <num>[]);
+
+ replyPort.send(const <List, List>{});
+ replyPort.send(const <List, Map>{});
+ replyPort.send(const <List, Null>{});
+ replyPort.send(const <List, Object>{});
+ replyPort.send(const <List, String>{});
+ replyPort.send(const <List, bool>{});
+ replyPort.send(const <List, double>{});
+ replyPort.send(const <List, int>{});
+ replyPort.send(const <List, num>{});
+
+ replyPort.send(const <Map, List>{});
+ replyPort.send(const <Map, Map>{});
+ replyPort.send(const <Map, Null>{});
+ replyPort.send(const <Map, Object>{});
+ replyPort.send(const <Map, String>{});
+ replyPort.send(const <Map, bool>{});
+ replyPort.send(const <Map, double>{});
+ replyPort.send(const <Map, int>{});
+ replyPort.send(const <Map, num>{});
+
+ replyPort.send(const <Null, List>{});
+ replyPort.send(const <Null, Map>{});
+ replyPort.send(const <Null, Null>{});
+ replyPort.send(const <Null, Object>{});
+ replyPort.send(const <Null, String>{});
+ replyPort.send(const <Null, bool>{});
+ replyPort.send(const <Null, double>{});
+ replyPort.send(const <Null, int>{});
+ replyPort.send(const <Null, num>{});
+
+ replyPort.send(const <Object, List>{});
+ replyPort.send(const <Object, Map>{});
+ replyPort.send(const <Object, Null>{});
+ replyPort.send(const <Object, Object>{});
+ replyPort.send(const <Object, String>{});
+ replyPort.send(const <Object, bool>{});
+ replyPort.send(const <Object, double>{});
+ replyPort.send(const <Object, int>{});
+ replyPort.send(const <Object, num>{});
+
+ replyPort.send(const <String, List>{});
+ replyPort.send(const <String, Map>{});
+ replyPort.send(const <String, Null>{});
+ replyPort.send(const <String, Object>{});
+ replyPort.send(const <String, String>{});
+ replyPort.send(const <String, bool>{});
+ replyPort.send(const <String, double>{});
+ replyPort.send(const <String, int>{});
+ replyPort.send(const <String, num>{});
+
+ replyPort.send(const <bool, List>{});
+ replyPort.send(const <bool, Map>{});
+ replyPort.send(const <bool, Null>{});
+ replyPort.send(const <bool, Object>{});
+ replyPort.send(const <bool, String>{});
+ replyPort.send(const <bool, bool>{});
+ replyPort.send(const <bool, double>{});
+ replyPort.send(const <bool, int>{});
+ replyPort.send(const <bool, num>{});
+
+ replyPort.send(const <double, List>{});
+ replyPort.send(const <double, Map>{});
+ replyPort.send(const <double, Null>{});
+ replyPort.send(const <double, Object>{});
+ replyPort.send(const <double, String>{});
+ replyPort.send(const <double, bool>{});
+ replyPort.send(const <double, double>{});
+ replyPort.send(const <double, int>{});
+ replyPort.send(const <double, num>{});
+
+ replyPort.send(const <int, List>{});
+ replyPort.send(const <int, Map>{});
+ replyPort.send(const <int, Null>{});
+ replyPort.send(const <int, Object>{});
+ replyPort.send(const <int, String>{});
+ replyPort.send(const <int, bool>{});
+ replyPort.send(const <int, double>{});
+ replyPort.send(const <int, int>{});
+ replyPort.send(const <int, num>{});
+
+ replyPort.send(const <num, List>{});
+ replyPort.send(const <num, Map>{});
+ replyPort.send(const <num, Null>{});
+ replyPort.send(const <num, Object>{});
+ replyPort.send(const <num, String>{});
+ replyPort.send(const <num, bool>{});
+ replyPort.send(const <num, double>{});
+ replyPort.send(const <num, int>{});
+ replyPort.send(const <num, num>{});
+
+ print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+ print("Parent start");
+
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(child, port.sendPort);
+ StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List>[]));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map>[]));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null>[]));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object>[]));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String>[]));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool>[]));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double>[]));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int>[]));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num>[]));
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List, List>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List, Map>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List, Null>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List, Object>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List, String>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List, bool>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List, double>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List, int>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <List, num>{}));
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map, List>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map, Map>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map, Null>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map, Object>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map, String>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map, bool>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map, double>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map, int>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Map, num>{}));
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null, List>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null, Map>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null, Null>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null, Object>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null, String>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null, bool>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null, double>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null, int>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Null, num>{}));
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object, List>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object, Map>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object, Null>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object, Object>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object, String>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object, bool>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object, double>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object, int>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <Object, num>{}));
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String, List>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String, Map>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String, Null>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String, Object>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String, String>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String, bool>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String, double>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String, int>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <String, num>{}));
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool, List>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool, Map>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool, Null>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool, Object>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool, String>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool, bool>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool, double>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool, int>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <bool, num>{}));
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double, List>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double, Map>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double, Null>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double, Object>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double, String>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double, bool>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double, double>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double, int>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <double, num>{}));
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int, List>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int, Map>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int, Null>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int, Object>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int, String>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int, bool>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int, double>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int, int>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <int, num>{}));
+
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num, List>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num, Map>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num, Null>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num, Object>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num, String>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num, bool>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num, double>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num, int>{}));
+ Expect.isTrue(await incoming.moveNext());
+ Expect.isTrue(identical(incoming.current, const <num, num>{}));
+
+ port.close();
+ print("Parent done");
+}
diff --git a/tests/lib/isolate/message_enum_test.dart b/tests/lib/isolate/message_enum_test.dart
new file mode 100644
index 0000000..801afd4d
--- /dev/null
+++ b/tests/lib/isolate/message_enum_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import "dart:isolate";
+
+enum Foo { BAR, BAZ }
+
+main() {
+ var p;
+ p = new RawReceivePort((map) {
+ Expect.equals(1, map.keys.length);
+ Expect.equals(42, map.values.first);
+ var key = map.keys.first;
+ Expect.equals(42, map[key]);
+ p.close();
+ });
+ asyncStart();
+ Isolate.spawn(sendIt, p.sendPort).whenComplete(asyncEnd);
+}
+
+void sendIt(port) {
+ var map = {Foo.BAR: 42};
+ port.send(map);
+}
diff --git a/tests/lib/isolate/message_test.dart b/tests/lib/isolate/message_test.dart
new file mode 100644
index 0000000..8a7ec69
--- /dev/null
+++ b/tests/lib/isolate/message_test.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing serialization of messages.
+// VMOptions=--enable_type_checks --enable_asserts
+
+library MessageTest;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+// ---------------------------------------------------------------------------
+// Message passing test.
+// ---------------------------------------------------------------------------
+
+class MessageTest {
+ static const List list1 = const ["Hello", "World", "Hello", 0xfffffffffff];
+ static const List list2 = const [null, list1, list1, list1, list1];
+ static const List list3 = const [list2, 2.0, true, false, 0xfffffffffff];
+ static const Map map1 = const {
+ "a=1": 1,
+ "b=2": 2,
+ "c=3": 3,
+ };
+ static const Map map2 = const {
+ "list1": list1,
+ "list2": list2,
+ "list3": list3,
+ };
+ static const List list4 = const [map1, map2];
+ static const List elms = const [
+ list1,
+ list2,
+ list3,
+ list4,
+ ];
+
+ static void VerifyMap(Map expected, Map actual) {
+ Expect.equals(actual.length, expected.length);
+ testForEachMap(key, value) {
+ if (value is List) {
+ VerifyList(value, actual[key]);
+ } else {
+ Expect.equals(actual[key], value);
+ }
+ }
+
+ expected.forEach(testForEachMap);
+ }
+
+ static void VerifyList(List expected, List actual) {
+ for (int i = 0; i < expected.length; i++) {
+ if (expected[i] is List) {
+ VerifyList(expected[i], actual[i]);
+ } else if (expected[i] is Map) {
+ Expect.type<Map>(actual[i]);
+ VerifyMap(expected[i], actual[i]);
+ } else {
+ Expect.equals(actual[i], expected[i]);
+ }
+ }
+ }
+
+ static void VerifyObject(int index, var actual) {
+ var expected = elms[index];
+ Expect.type<List>(expected);
+ Expect.type<List>(actual);
+ Expect.equals(actual.length, expected.length);
+ VerifyList(expected, actual);
+ }
+}
+
+pingPong(replyTo) {
+ ReceivePort port = new ReceivePort();
+ int count = 0;
+ port.listen((pair) {
+ var message = pair[0];
+ var replyTo = pair[1];
+ if (message == -1) {
+ port.close();
+ replyTo.send(count);
+ } else {
+ // Check if the received object is correct.
+ if (count < MessageTest.elms.length) {
+ MessageTest.VerifyObject(count, message);
+ }
+ // Bounce the received object back so that the sender
+ // can make sure that the object matches.
+ replyTo.send(message);
+ count++;
+ }
+ });
+ replyTo.send(port.sendPort);
+}
+
+Future remoteCall(SendPort port, message) {
+ ReceivePort receivePort = new ReceivePort();
+ port.send([message, receivePort.sendPort]);
+ return receivePort.first;
+}
+
+void main([args, port]) {
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(pingPong, port.sendPort);
+ asyncStart();
+ port.first.then((remote) {
+ // Send objects and receive them back.
+ for (int i = 0; i < MessageTest.elms.length; i++) {
+ var sentObject = MessageTest.elms[i];
+ asyncStart();
+ remoteCall(remote, sentObject).then((receivedObject) {
+ MessageTest.VerifyObject(i, receivedObject);
+ asyncEnd();
+ });
+ }
+
+ // Send recursive objects and receive them back.
+ List local_list1 = ["Hello", "World", "Hello", 0xffffffffff];
+ List local_list2 = [null, local_list1, local_list1];
+ List local_list3 = [local_list2, 2.0, true, false, 0xffffffffff];
+ List sendObject = new List.filled(5, null);
+ sendObject[0] = local_list1;
+ sendObject[1] = sendObject;
+ sendObject[2] = local_list2;
+ sendObject[3] = sendObject;
+ sendObject[4] = local_list3;
+ remoteCall(remote, sendObject).then((var replyObject) {
+ Expect.type<List>(sendObject);
+ Expect.type<List>(replyObject);
+ Expect.equals(sendObject.length, replyObject.length);
+ Expect.identical(replyObject[1], replyObject);
+ Expect.identical(replyObject[3], replyObject);
+ Expect.identical(replyObject[0], replyObject[2][1]);
+ Expect.identical(replyObject[0], replyObject[2][2]);
+ Expect.identical(replyObject[2], replyObject[4][0]);
+ Expect.identical(replyObject[0][0], replyObject[0][2]);
+ Expect.equals(replyObject[0][3], replyObject[4][4]);
+ });
+
+ // Shutdown the MessageServer.
+ remoteCall(remote, -1).then((message) {
+ Expect.equals(message, MessageTest.elms.length + 1);
+ asyncEnd();
+ });
+ });
+}
diff --git a/tests/lib/isolate/mint_maker_test.dart b/tests/lib/isolate/mint_maker_test.dart
new file mode 100644
index 0000000..c4b25ec
--- /dev/null
+++ b/tests/lib/isolate/mint_maker_test.dart
@@ -0,0 +1,187 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library MintMakerTest;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+class Mint {
+ Map<SendPort, Purse> _registry;
+ late SendPort port;
+
+ Mint() : _registry = new Map<SendPort, Purse>() {
+ ReceivePort mintPort = new ReceivePort();
+ port = mintPort.sendPort;
+ serveMint(mintPort);
+ }
+
+ void serveMint(ReceivePort port) {
+ port.listen((message) {
+ int balance = message[0];
+ Purse purse = createPurse(balance);
+ message[1].send(purse.port);
+ });
+ }
+
+ Purse createPurse(int balance) {
+ Purse purse = new Purse(this, balance);
+ _registry[purse.port] = purse;
+ return purse;
+ }
+
+ Purse lookupPurse(SendPort port) {
+ return (_registry[port])!;
+ }
+}
+
+class MintWrapper {
+ SendPort _mint;
+ MintWrapper(SendPort this._mint) {}
+
+ void createPurse(int balance, handlePurse(PurseWrapper purse)) {
+ ReceivePort reply = new ReceivePort();
+ reply.first.then((purse) {
+ handlePurse(new PurseWrapper(purse as SendPort));
+ });
+ _mint.send([balance, reply.sendPort]);
+ }
+}
+
+class Purse {
+ Mint mint;
+ int balance;
+ late SendPort port;
+
+ Purse(this.mint, this.balance) {
+ ReceivePort recipient = new ReceivePort();
+ port = recipient.sendPort;
+ servePurse(recipient);
+ }
+
+ void servePurse(ReceivePort recipient) {
+ recipient.listen((message) {
+ String command = message[0];
+ if (command == "balance") {
+ SendPort replyTo = message.last;
+ replyTo.send(queryBalance());
+ } else if (command == "deposit") {
+ Purse source = mint.lookupPurse(message[2]);
+ deposit(message[1], source);
+ } else if (command == "sprout") {
+ SendPort replyTo = message.last;
+ Purse result = sproutPurse();
+ replyTo.send(result.port);
+ } else {
+ // TODO: Send an exception back.
+ throw new UnsupportedError("Unsupported commend: $command");
+ }
+ });
+ }
+
+ int queryBalance() {
+ return balance;
+ }
+
+ Purse sproutPurse() {
+ return mint.createPurse(0);
+ }
+
+ void deposit(int amount, Purse source) {
+ // TODO: Throw an exception if the source purse doesn't hold
+ // enough dough.
+ balance += amount;
+ source.balance -= amount;
+ }
+}
+
+class PurseWrapper {
+ SendPort _purse;
+
+ PurseWrapper(this._purse) {}
+
+ void _sendReceive<T>(String message, replyHandler(T reply)) {
+ ReceivePort reply = new ReceivePort();
+ _purse.send([message, reply.sendPort]);
+ reply.first.then((a) => replyHandler(a as T));
+ }
+
+ void queryBalance(handleBalance(int balance)) {
+ _sendReceive("balance", handleBalance);
+ }
+
+ void sproutPurse(handleSprouted(PurseWrapper sprouted)) {
+ _sendReceive("sprout", (SendPort sprouted) {
+ handleSprouted(new PurseWrapper(sprouted));
+ });
+ }
+
+ void deposit(PurseWrapper source, int amount) {
+ _purse.send(["deposit", amount, source._purse]);
+ }
+}
+
+mintMakerWrapper(SendPort replyPort) {
+ ReceivePort receiver = new ReceivePort();
+ replyPort.send(receiver.sendPort);
+ receiver.listen((replyTo) {
+ Mint mint = new Mint();
+ (replyTo as SendPort).send(mint.port);
+ });
+}
+
+class MintMakerWrapper {
+ final SendPort _port;
+
+ static Future<MintMakerWrapper> create() {
+ ReceivePort reply = new ReceivePort();
+ return Isolate.spawn(mintMakerWrapper, reply.sendPort)
+ .then((_) => reply.first.then((port) => new MintMakerWrapper._(port)));
+ }
+
+ MintMakerWrapper._(this._port);
+
+ void makeMint(handleMint(MintWrapper mint)) {
+ ReceivePort reply = new ReceivePort();
+ reply.first.then((mint) {
+ handleMint(new MintWrapper(mint as SendPort));
+ });
+ _port.send(reply.sendPort);
+ }
+}
+
+_checkBalance(PurseWrapper wrapper, expected) {
+ wrapper.queryBalance((balance) {
+ Expect.equals(balance, expected);
+ });
+}
+
+void main([args, port]) {
+ asyncStart();
+ MintMakerWrapper.create().then((mintMaker) {
+ mintMaker.makeMint((mint) {
+ mint.createPurse(100, (purse) {
+ _checkBalance(purse, 100);
+ purse.sproutPurse((sprouted) {
+ _checkBalance(sprouted, 0);
+ _checkBalance(purse, 100);
+
+ sprouted.deposit(purse, 5);
+ _checkBalance(sprouted, 0 + 5);
+ _checkBalance(purse, 100 - 5);
+
+ sprouted.deposit(purse, 42);
+ _checkBalance(sprouted, 0 + 5 + 42);
+ _checkBalance(purse, 100 - 5 - 42);
+ asyncEnd();
+ });
+ });
+ });
+ });
+}
diff --git a/tests/lib/isolate/native_wrapper_message_test.dart b/tests/lib/isolate/native_wrapper_message_test.dart
new file mode 100644
index 0000000..2b663d5
--- /dev/null
+++ b/tests/lib/isolate/native_wrapper_message_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2018, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:isolate';
+import 'dart:nativewrappers';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+echo(msg) {
+ var data = msg[0];
+ var reply = msg[1];
+ reply.send('echoing ${data(1)}}');
+}
+
+class Test extends NativeFieldWrapperClass2 {
+ Test(this.i, this.j);
+ int i, j;
+}
+
+main() {
+ var port = new RawReceivePort();
+ var obj = new Test(1, 2);
+ var msg = [obj, port.sendPort];
+ var snd = Isolate.spawn(echo, msg);
+
+ asyncStart();
+ snd.catchError((e) {
+ Expect.isTrue(e is ArgumentError);
+ Expect.isTrue("$e".contains("NativeWrapper"));
+ port.close();
+ asyncEnd();
+ });
+}
diff --git a/tests/lib/isolate/nested_spawn2_test.dart b/tests/lib/isolate/nested_spawn2_test.dart
new file mode 100644
index 0000000..d335909
--- /dev/null
+++ b/tests/lib/isolate/nested_spawn2_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that isolates can spawn other isolates and
+// that the nested isolates can communicate with the main once the spawner has
+// disappeared.
+
+library NestedSpawn2Test;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void isolateA(SendPort init) {
+ ReceivePort port = new ReceivePort();
+ init.send(port.sendPort);
+ port.first.then((message) {
+ Expect.equals(message[0], "launch nested!");
+ SendPort replyTo = message[1];
+ Isolate.spawn(isolateB, replyTo);
+ });
+}
+
+String msg0 = "0 there?";
+String msg1 = "1 Yes.";
+String msg2 = "2 great. Think the other one is already dead?";
+String msg3 = "3 Give him some time.";
+String msg4 = "4 now?";
+String msg5 = "5 Now.";
+String msg6 = "6 Great. Bye";
+
+void _call(SendPort p, msg, void onreceive(m, replyTo)) {
+ final replyTo = new ReceivePort();
+ p.send([msg, replyTo.sendPort]);
+ replyTo.first.then((m) {
+ onreceive(m[0], m[1]);
+ });
+}
+
+void isolateB(SendPort mainPort) {
+ // Do a little ping-pong dance to give the intermediate isolate
+ // time to die.
+ _call(mainPort, msg0, ((msg, replyTo) {
+ Expect.equals(msg[0], "1");
+ _call(replyTo, msg2, ((msg, replyTo) {
+ Expect.equals(msg[0], "3");
+ _call(replyTo, msg4, ((msg, replyTo) {
+ Expect.equals(msg[0], "5");
+ replyTo.send([msg6, null]);
+ }));
+ }));
+ }));
+}
+
+void main([args, port]) {
+ // spawned isolate can spawn other isolates
+ ReceivePort init = new ReceivePort();
+ Isolate.spawn(isolateA, init.sendPort);
+ asyncStart();
+ init.first.then((port) {
+ _call(port, "launch nested!", (msg, replyTo) {
+ Expect.equals(msg[0], "0");
+ _call(replyTo, msg1, (msg, replyTo) {
+ Expect.equals(msg[0], "2");
+ _call(replyTo, msg3, (msg, replyTo) {
+ Expect.equals(msg[0], "4");
+ _call(replyTo, msg5, (msg, _) {
+ Expect.equals(msg[0], "6");
+ asyncEnd();
+ });
+ });
+ });
+ });
+ });
+}
diff --git a/tests/lib/isolate/nested_spawn_test.dart b/tests/lib/isolate/nested_spawn_test.dart
new file mode 100644
index 0000000..0bc8c77
--- /dev/null
+++ b/tests/lib/isolate/nested_spawn_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that isolates can spawn other isolates.
+
+library NestedSpawnTest;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void isolateA(message) {
+ message.add("isolateA");
+ Isolate.spawn(isolateB, message);
+}
+
+void isolateB(message) {
+ message.add("isolateB");
+ message[0].send(message);
+}
+
+void main([args, port]) {
+ // spawned isolates can spawn nested isolates
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(isolateA, [port.sendPort, "main"]);
+ asyncStart();
+ port.first.then((message) {
+ Expect.equals("main", message[1]);
+ Expect.equals("isolateA", message[2]);
+ Expect.equals("isolateB", message[3]);
+ asyncEnd();
+ });
+}
diff --git a/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart b/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
new file mode 100644
index 0000000..b361171
--- /dev/null
+++ b/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2017, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:io';
+
+main() async {
+ Isolate.current.setErrorsFatal(false);
+
+ new Timer(const Duration(milliseconds: 10), () {
+ print("Timer 1");
+
+ // This unhandled exception should not prevent the second timer from firing.
+ throw "Oh no!";
+ });
+
+ new Timer.periodic(const Duration(milliseconds: 20), (_) {
+ print("Timer 2");
+ exit(0);
+ });
+
+ sleep(const Duration(milliseconds: 30)); //# sleep: ok
+ // With sleep: both timers are due at the same wakeup event.
+ // Without sleep: the timers get separate wakeup events.
+}
diff --git a/tests/lib/isolate/object_leak_test.dart b/tests/lib/isolate/object_leak_test.dart
new file mode 100644
index 0000000..b8b94b4
--- /dev/null
+++ b/tests/lib/isolate/object_leak_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2011, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Regression test for http://dartbug.com/18942
+
+library LeakTest;
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import 'dart:isolate';
+import 'dart:async';
+
+class A {
+ var x = 0;
+}
+
+fun(msg) {
+ var a = msg[0];
+ var replyTo = msg[1];
+ print("received: ${a.x}");
+ a.x = 1;
+ print("done updating: ${a.x}");
+ replyTo.send("done");
+}
+
+main() {
+ asyncStart();
+ var a = new A();
+ ReceivePort rp = new ReceivePort();
+ Isolate.spawn(fun, [a, rp.sendPort]);
+ rp.first.then((msg) {
+ Expect.equals("done", msg);
+ // Changes in other isolate must not reach here.
+ Expect.equals(0, a.x);
+ asyncEnd();
+ });
+}
diff --git a/tests/lib/isolate/ondone_test.dart b/tests/lib/isolate/ondone_test.dart
new file mode 100644
index 0000000..f378855
--- /dev/null
+++ b/tests/lib/isolate/ondone_test.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+
+void isomain(SendPort replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ if (v == 0) {
+ // Shut down when receiving the 0 message.
+ port.close();
+ } else {
+ replyPort.send(v);
+ }
+ };
+ replyPort.send(port.sendPort);
+}
+
+void main() {
+ testExit();
+ testCancelExit();
+ testOverrideResponse();
+}
+
+void testExit() {
+ bool mayComplete = false;
+ asyncStart();
+ var completer = new Completer(); // Completed by first reply from isolate.
+ RawReceivePort reply = new RawReceivePort(completer.complete);
+ late RawReceivePort onExitPort;
+ onExitPort = new RawReceivePort((v) {
+ if (v != "RESPONSE") throw "WRONG RESPONSE: $v";
+ reply.close();
+ onExitPort.close();
+ if (!mayComplete) throw "COMPLETED EARLY";
+ asyncEnd();
+ });
+ Isolate.spawn(isomain, reply.sendPort).then((Isolate isolate) {
+ isolate.addOnExitListener(onExitPort.sendPort, response: "RESPONSE");
+ return completer.future;
+ }).then((echoPort) {
+ int counter = 4;
+ reply.handler = (v) {
+ if (v != counter) throw "WRONG REPLY";
+ if (v == 0) throw "REPLY INSTEAD OF SHUTDOWN";
+ counter--;
+ mayComplete = (counter == 0);
+ echoPort.send(counter);
+ };
+ echoPort.send(counter);
+ });
+}
+
+void testCancelExit() {
+ bool mayComplete = false;
+ asyncStart();
+ var completer = new Completer(); // Completed by first reply from isolate.
+ RawReceivePort reply = new RawReceivePort(completer.complete);
+ RawReceivePort onExitPort2 = new RawReceivePort((_) {
+ throw "RECEIVED EXIT MESSAGE";
+ });
+ late RawReceivePort onExitPort1;
+ onExitPort1 = new RawReceivePort((_) {
+ reply.close();
+ onExitPort1.close();
+ if (!mayComplete) throw "COMPLETED EARLY";
+ new Timer(const Duration(milliseconds: 0), () {
+ onExitPort2.close();
+ asyncEnd();
+ });
+ });
+ Isolate.spawn(isomain, reply.sendPort).then((Isolate isolate) {
+ isolate.addOnExitListener(onExitPort2.sendPort);
+ isolate.addOnExitListener(onExitPort1.sendPort);
+ return completer.future.then((echoPort) {
+ int counter = 4;
+ reply.handler = (v) {
+ if (v != counter) throw "WRONG REPLY";
+ if (v == 0) throw "REPLY INSTEAD OF SHUTDOWN";
+ counter--;
+ mayComplete = (counter == 0);
+ if (counter == 1) {
+ // Remove listener 2, keep listener 1.
+ isolate.removeOnExitListener(onExitPort2.sendPort);
+ }
+ echoPort.send(counter);
+ };
+ echoPort.send(counter);
+ });
+ });
+}
+
+void testOverrideResponse() {
+ bool mayComplete = false;
+ asyncStart();
+ var completer = new Completer(); // Completed by first reply from isolate.
+ RawReceivePort reply = new RawReceivePort(completer.complete);
+ late RawReceivePort onExitPort;
+ onExitPort = new RawReceivePort((v) {
+ if (v != "RESPONSE2") throw "WRONG RESPONSE: $v";
+ reply.close();
+ onExitPort.close();
+ if (!mayComplete) throw "COMPLETED EARLY";
+ asyncEnd();
+ });
+ Isolate.spawn(isomain, reply.sendPort).then((Isolate isolate) {
+ isolate.addOnExitListener(onExitPort.sendPort, response: "RESPONSE");
+ isolate.addOnExitListener(onExitPort.sendPort, response: "RESPONSE2");
+ return completer.future;
+ }).then((echoPort) {
+ int counter = 4;
+ reply.handler = (v) {
+ if (v != counter) throw "WRONG REPLY";
+ if (v == 0) throw "REPLY INSTEAD OF SHUTDOWN";
+ counter--;
+ mayComplete = (counter == 0);
+ echoPort.send(counter);
+ };
+ echoPort.send(counter);
+ });
+}
diff --git a/tests/lib/isolate/package_config_test.dart b/tests/lib/isolate/package_config_test.dart
new file mode 100644
index 0000000..cc345ee
--- /dev/null
+++ b/tests/lib/isolate/package_config_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+// VMOptions=--trace_shutdown
+import 'dart:io';
+import 'dart:isolate';
+
+final SPAWN_PACKAGE_CONFIG = "foobar:///no/such/file/";
+
+main([args, port]) async {
+ if (port != null) {
+ testPackageConfig(port);
+ return;
+ }
+ var p = new RawReceivePort();
+ Isolate.spawnUri(Platform.script, [], p.sendPort,
+ packageConfig: Uri.parse(SPAWN_PACKAGE_CONFIG));
+ p.handler = (msg) {
+ p.close();
+ if (msg[0] != SPAWN_PACKAGE_CONFIG) {
+ throw "Bad package config in child isolate: ${msg[0]}";
+ }
+ if (msg[1] != null) {
+ throw "Non-null loaded package config in isolate: ${msg[1]}";
+ }
+ print("SUCCESS");
+ };
+ print("Spawning isolate's package config: ${await Isolate.packageConfig}");
+}
+
+testPackageConfig(port) async {
+ var packageConfigStr = Platform.packageConfig;
+ var packageConfig = await Isolate.packageConfig;
+ print("Spawned isolate's package config flag: $packageConfigStr");
+ print("Spawned isolate's loaded package config: $packageConfig");
+ port.send([packageConfigStr, packageConfig.toString()]);
+}
diff --git a/tests/lib/isolate/package_resolve_test.dart b/tests/lib/isolate/package_resolve_test.dart
new file mode 100644
index 0000000..241732e
--- /dev/null
+++ b/tests/lib/isolate/package_resolve_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:io';
+import 'dart:isolate';
+
+final SPAWN_PACKAGE_ROOT = "file:///no/such/package/root/";
+final PACKAGE_URI = "package:foo/bar.dart";
+final PACKAGE_PATH = "file:///no/such/package/root/foo/bar.dart";
+
+main([args, port]) async {
+ if (port != null) {
+ testPackageResolution(port);
+ return;
+ }
+ var p = new RawReceivePort();
+ Isolate.spawnUri(Platform.script, [], p.sendPort,
+ packageRoot: Uri.parse(SPAWN_PACKAGE_ROOT));
+ p.handler = (msg) {
+ p.close();
+ if (msg is! List) {
+ print(msg.runtimeType);
+ throw "Failure return from spawned isolate:\n\n$msg";
+ }
+ if (msg[0] != null) {
+ throw "Bad package root in child isolate: ${msg[0]}";
+ }
+ if (msg[1] != null) {
+ throw "Package path not matching: ${msg[1]}";
+ }
+ print("SUCCESS");
+ };
+ print("Spawning isolate's package root: ${await Isolate.packageRoot}");
+}
+
+testPackageResolution(port) async {
+ try {
+ var packageRootStr = Platform.packageRoot;
+ var packageRoot = await Isolate.packageRoot;
+ var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(PACKAGE_URI));
+ print("Spawned isolate's package root flag: $packageRootStr");
+ print("Spawned isolate's loaded package root: $packageRoot");
+ print("Spawned isolate's resolved package path: $resolvedPkg");
+ port.send([packageRoot.toString(), resolvedPkg.toString()]);
+ } catch (e, s) {
+ port.send("$e\n$s\n");
+ }
+}
diff --git a/tests/lib/isolate/package_root_test.dart b/tests/lib/isolate/package_root_test.dart
new file mode 100644
index 0000000..390df69
--- /dev/null
+++ b/tests/lib/isolate/package_root_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:io';
+import 'dart:isolate';
+
+final SPAWN_PACKAGE_ROOT = "file:///no/such/file/";
+
+main([args, port]) async {
+ if (port != null) {
+ testPackageRoot(port);
+ return;
+ }
+ var p = new RawReceivePort();
+ Isolate.spawnUri(Platform.script, [], p.sendPort,
+ packageRoot: Uri.parse(SPAWN_PACKAGE_ROOT));
+ p.handler = (msg) {
+ p.close();
+ if (msg != null) {
+ throw "Bad package root in child isolate: $msg";
+ }
+ print("SUCCESS");
+ };
+ print("Spawning isolate's package root: ${await Isolate.packageRoot}");
+}
+
+testPackageRoot(port) async {
+ var packageRoot = await Isolate.packageRoot;
+ print("Spawned isolate's package root: $packageRoot");
+ port.send(packageRoot);
+}
diff --git a/tests/lib/isolate/pause_test.dart b/tests/lib/isolate/pause_test.dart
new file mode 100644
index 0000000..1e97f00a
--- /dev/null
+++ b/tests/lib/isolate/pause_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ replyPort.send(v);
+ port.close();
+ };
+ replyPort.send(port.sendPort);
+}
+
+main() {
+ asyncStart();
+ RawReceivePort reply = new RawReceivePort();
+ late Isolate isolate;
+ late Capability resume;
+ var completer = new Completer(); // Completed by first reply from isolate.
+ reply.handler = completer.complete;
+ Isolate.spawn(isomain1, reply.sendPort).then((Isolate iso) {
+ isolate = iso;
+ return completer.future;
+ }).then((echoPort) {
+ // Isolate has been created, and first response has been returned.
+ resume = isolate.pause();
+ echoPort.send(24);
+ reply.handler = (v) {
+ throw "RESPONSE WHILE PAUSED?!?";
+ };
+ return new Future.delayed(const Duration(milliseconds: 250));
+ }).then((_) {
+ reply.handler = (v) {
+ if (v != 24) throw "WRONG ANSWER!";
+ reply.close();
+ asyncEnd();
+ };
+ isolate.resume(resume);
+ });
+}
diff --git a/tests/lib/isolate/ping_pause_test.dart b/tests/lib/isolate/ping_pause_test.dart
new file mode 100644
index 0000000..48ad135
--- /dev/null
+++ b/tests/lib/isolate/ping_pause_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ replyPort.send(v);
+ if (v == 0) port.close();
+ };
+ replyPort.send(port.sendPort);
+}
+
+void main() {
+ asyncStart();
+ var completer = new Completer(); // Completed by first reply from isolate.
+ RawReceivePort reply = new RawReceivePort(completer.complete);
+ Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+ List result = [];
+ completer.future.then((echoPort) {
+ reply.handler = (v) {
+ result.add(v);
+ if (v == 0) {
+ Expect.listEquals([4, 3, 2, 1, 0], result);
+ reply.close();
+ asyncEnd();
+ }
+ };
+ echoPort.send(4);
+ echoPort.send(3);
+ Capability resume = isolate.pause();
+ var pingPort = new RawReceivePort();
+ pingPort.handler = (_) {
+ Expect.isTrue(result.length <= 2);
+ echoPort.send(0);
+ isolate.resume(resume);
+ pingPort.close();
+ };
+ isolate.ping(pingPort.sendPort, priority: Isolate.beforeNextEvent);
+ echoPort.send(2);
+ echoPort.send(1);
+ });
+ });
+}
diff --git a/tests/lib/isolate/ping_test.dart b/tests/lib/isolate/ping_test.dart
new file mode 100644
index 0000000..4371a4c0
--- /dev/null
+++ b/tests/lib/isolate/ping_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+ RawReceivePort port = new RawReceivePort();
+ port.handler = (v) {
+ replyPort.send(v);
+ if (v == 0) port.close();
+ };
+ replyPort.send(port.sendPort);
+}
+
+void main() {
+ asyncStart();
+ var completer = new Completer(); // Completed by first reply from isolate.
+ RawReceivePort reply = new RawReceivePort(completer.complete);
+ Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+ List result = [];
+ completer.future.then((echoPort) {
+ reply.handler = (v) {
+ result.add(v);
+ if (v == 0) {
+ Expect.listEquals(["alive", "control"],
+ result.where((x) => x is String).toList(), "control events");
+ Expect.listEquals([3, 2, 1, 0],
+ result.where((x) => x is int).toList(), "data events");
+ Expect.isTrue(
+ result.indexOf("alive") < result.indexOf(2), "alive index < 2");
+ Expect.isTrue(result.indexOf("control") < result.indexOf(1),
+ "control index < 1");
+ reply.close();
+ asyncEnd();
+ }
+ };
+ var pingPort = new RawReceivePort();
+ int pingCount = 0;
+ pingPort.handler = (response) {
+ result.add(response);
+ pingCount++;
+ if (pingCount == 2) pingPort.close();
+ };
+ ping(message, priority) {
+ isolate.ping(pingPort.sendPort, response: message, priority: priority);
+ }
+
+ echoPort.send(3);
+ ping("alive", Isolate.immediate);
+ echoPort.send(2);
+ ping("control", Isolate.beforeNextEvent);
+ echoPort.send(1);
+ echoPort.send(0);
+ });
+ });
+}
diff --git a/tests/lib/isolate/port_test.dart b/tests/lib/isolate/port_test.dart
new file mode 100644
index 0000000..937d75e
--- /dev/null
+++ b/tests/lib/isolate/port_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Test properties of ports.
+
+library PortTest;
+
+import "package:expect/expect.dart";
+import 'dart:isolate';
+
+main() {
+ testHashCode();
+ testEquals();
+ testMap();
+}
+
+void testHashCode() {
+ ReceivePort rp0 = new ReceivePort();
+ ReceivePort rp1 = new ReceivePort();
+ Expect.equals(rp0.sendPort.hashCode, rp0.sendPort.hashCode);
+ Expect.equals(rp1.sendPort.hashCode, rp1.sendPort.hashCode);
+ rp0.close();
+ rp1.close();
+}
+
+void testEquals() {
+ ReceivePort rp0 = new ReceivePort();
+ ReceivePort rp1 = new ReceivePort();
+ Expect.equals(rp0.sendPort, rp0.sendPort);
+ Expect.equals(rp1.sendPort, rp1.sendPort);
+ Expect.isFalse(rp0.sendPort == rp1.sendPort);
+ rp0.close();
+ rp1.close();
+}
+
+void testMap() {
+ ReceivePort rp0 = new ReceivePort();
+ ReceivePort rp1 = new ReceivePort();
+ final map = new Map<SendPort, int>();
+ map[rp0.sendPort] = 42;
+ map[rp1.sendPort] = 87;
+ Expect.equals(map[rp0.sendPort], 42);
+ Expect.equals(map[rp1.sendPort], 87);
+
+ map[rp0.sendPort] = 99;
+ Expect.equals(map[rp0.sendPort], 99);
+ Expect.equals(map[rp1.sendPort], 87);
+
+ map.remove(rp0.sendPort);
+ Expect.isFalse(map.containsKey(rp0.sendPort));
+ Expect.equals(map[rp1.sendPort], 87);
+
+ map.remove(rp1.sendPort);
+ Expect.isFalse(map.containsKey(rp0.sendPort));
+ Expect.isFalse(map.containsKey(rp1.sendPort));
+
+ rp0.close();
+ rp1.close();
+}
diff --git a/tests/lib/isolate/raw_port_test.dart b/tests/lib/isolate/raw_port_test.dart
new file mode 100644
index 0000000..6f24212
--- /dev/null
+++ b/tests/lib/isolate/raw_port_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Test RawReceivePort.
+
+library raw_port_test;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void remote(SendPort port) {
+ port.send("reply");
+}
+
+void remote2(SendPort port) {
+ port.send("reply 1");
+ port.send("reply 2");
+}
+
+main([args, port]) async {
+ // Raw receive
+ asyncTest(() {
+ final completer = Completer<void>();
+ RawReceivePort port = new RawReceivePort();
+ Isolate.spawn(remote, port.sendPort);
+ port.handler = (v) {
+ Expect.equals(v, "reply");
+ port.close();
+ completer.complete();
+ };
+ return completer.future;
+ });
+
+ // Raw receive hashCode
+ {
+ RawReceivePort port = new RawReceivePort();
+ Expect.isTrue(port.hashCode is int);
+ port.close();
+ }
+
+ // Raw receive twice - change handler
+ asyncTest(() {
+ final completer = Completer<void>();
+ RawReceivePort port = new RawReceivePort();
+ Isolate.spawn(remote2, port.sendPort);
+ port.handler = (v) {
+ Expect.equals(v, "reply 1");
+ port.handler = (v) {
+ Expect.equals(v, "reply 2");
+ port.close();
+ completer.complete();
+ };
+ };
+ return completer.future;
+ });
+
+ // From raw port
+ asyncTest(() {
+ final completer = Completer<void>();
+ RawReceivePort rawPort = new RawReceivePort();
+ Isolate.spawn(remote, rawPort.sendPort);
+ rawPort.handler = (v) {
+ Expect.equals(v, "reply");
+ ReceivePort port = new ReceivePort.fromRawReceivePort(rawPort);
+ Isolate.spawn(remote, rawPort.sendPort);
+ Isolate.spawn(remote, port.sendPort);
+ int ctr = 2;
+ port.listen(
+ (v) {
+ Expect.equals(v, "reply");
+ ctr--;
+ if (ctr == 0) port.close();
+ },
+ onDone: () => completer.complete(),
+ );
+ };
+ return completer.future;
+ });
+}
diff --git a/tests/lib/isolate/regress_34752_test.dart b/tests/lib/isolate/regress_34752_test.dart
new file mode 100644
index 0000000..dafff29
--- /dev/null
+++ b/tests/lib/isolate/regress_34752_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2018, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Verifies that large BigInt can be passed through a message port and
+// simple arithmetic operations still work after that.
+// This is a regression test for https://github.com/dart-lang/sdk/issues/34752.
+
+import 'dart:io';
+import 'dart:isolate';
+
+import "package:expect/expect.dart";
+
+const int kValue = 12345678;
+const int kShift = 8192 * 8;
+
+void verify(BigInt x) {
+ BigInt y = x >> kShift;
+ Expect.equals("$kValue", "$y");
+}
+
+void main() {
+ BigInt big = BigInt.from(kValue) << kShift;
+ verify(big);
+
+ final rp = new ReceivePort();
+ rp.listen((dynamic data) {
+ BigInt received = data as BigInt;
+ verify(received);
+ BigInt x = received + BigInt.one - BigInt.one;
+ verify(x);
+ print("ok");
+ exit(0);
+ });
+ rp.sendPort.send(big);
+}
diff --git a/tests/lib/isolate/regress_flutter_22796_test.dart b/tests/lib/isolate/regress_flutter_22796_test.dart
new file mode 100644
index 0000000..1cab5f1
--- /dev/null
+++ b/tests/lib/isolate/regress_flutter_22796_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2018, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Verifies that large typed data can be passed in a field through message port.
+// This is a regression test for
+// https://github.com/flutter/flutter/issues/22796.
+
+import 'dart:io';
+import 'dart:isolate';
+import 'dart:typed_data';
+
+import "package:expect/expect.dart";
+
+class A {
+ // TFA thinks this field has type _Int32List but sending an object across
+ // a message port creates an instance that has _ExternalInt32List inside.
+ final _int32Array = new Int32List(5 * 1024);
+ A() {
+ _int32Array.setRange(
+ 0, _int32Array.length, Iterable.generate(_int32Array.length));
+ verify();
+ }
+
+ void verify() {
+ for (var i = 0; i < _int32Array.length; i++) {
+ if (_int32Array[i] != i) {
+ print('_int32Array[$i]: ${_int32Array[i]} != ${i}');
+ }
+ Expect.equals(i, _int32Array[i]);
+ }
+ }
+}
+
+void main() {
+ final rp = new ReceivePort();
+ rp.listen((dynamic data) {
+ (data as A).verify();
+ print("ok");
+ exit(0);
+ });
+ rp.sendPort.send(A());
+}
diff --git a/tests/lib/isolate/request_reply_test.dart b/tests/lib/isolate/request_reply_test.dart
new file mode 100644
index 0000000..54d4d7c
--- /dev/null
+++ b/tests/lib/isolate/request_reply_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library RequestReplyTest;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void entry(initPort) {
+ ReceivePort port = new ReceivePort();
+ initPort.send(port.sendPort);
+ port.listen((pair) {
+ var message = pair[0];
+ SendPort replyTo = pair[1];
+ replyTo.send(message + 87);
+ port.close();
+ });
+}
+
+void main([args, port]) {
+ ReceivePort init = new ReceivePort();
+ Isolate.spawn(entry, init.sendPort);
+ asyncStart();
+ init.first.then((port) {
+ ReceivePort reply = new ReceivePort();
+ port.send([99, reply.sendPort]);
+ reply.listen((message) {
+ Expect.equals(message, 99 + 87);
+ reply.close();
+ asyncEnd();
+ });
+ });
+}
diff --git a/tests/lib/isolate/resolve_package_uri_test.dart b/tests/lib/isolate/resolve_package_uri_test.dart
new file mode 100644
index 0000000..9ea1d03
--- /dev/null
+++ b/tests/lib/isolate/resolve_package_uri_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2017, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Regression test for faulty encoding of `Isolate.resolvePackageUri` by
+// dart2js.
+
+import 'dart:async';
+import 'dart:isolate';
+
+main() {
+ var uri = Isolate.resolvePackageUri(Uri.parse('memory:main.dart'));
+ print(uri);
+}
diff --git a/tests/lib/isolate/send_private_test.dart b/tests/lib/isolate/send_private_test.dart
new file mode 100644
index 0000000..8ed717f
--- /dev/null
+++ b/tests/lib/isolate/send_private_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2016, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+class _Private {
+ String data;
+ _Private(this.data);
+}
+
+void child(message) {
+ print("Got message: $message");
+ SendPort replyPort = message[0];
+ _Private object = message[1];
+ Expect.isTrue(object is _Private);
+ Expect.equals("XYZ", object.data);
+ replyPort.send(object);
+}
+
+void main() {
+ var port;
+ port = new RawReceivePort((message) {
+ print("Got reply: $message");
+ Expect.isTrue(message is _Private);
+ Expect.equals("XYZ", message.data);
+ port.close();
+ });
+
+ Isolate.spawn(child, [port.sendPort, new _Private("XYZ")]);
+}
diff --git a/tests/lib/isolate/simple_message_test.dart b/tests/lib/isolate/simple_message_test.dart
new file mode 100644
index 0000000..f0310af
--- /dev/null
+++ b/tests/lib/isolate/simple_message_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that isolates are spawned.
+
+library IsolateNegativeTest;
+
+import "package:expect/expect.dart";
+import 'dart:isolate';
+import "package:async_helper/async_helper.dart";
+
+void entry(SendPort replyTo) {
+ var message = "foo";
+ message = "bar"; // //# 01: runtime error
+ replyTo.send(message);
+}
+
+main() {
+ asyncStart();
+ ReceivePort response = new ReceivePort();
+ Isolate.spawn(entry, response.sendPort);
+ response.first.then((message) {
+ Expect.equals("foo", message);
+ asyncEnd();
+ });
+}
diff --git a/tests/lib/isolate/spawn_function_custom_class_test.dart b/tests/lib/isolate/spawn_function_custom_class_test.dart
new file mode 100644
index 0000000..0046cef
--- /dev/null
+++ b/tests/lib/isolate/spawn_function_custom_class_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Create a user-defined class in a new isolate.
+//
+// Regression test for vm bug 2235: We were forgetting to finalize
+// classes in new isolates started using the v2 api.
+
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:expect/expect.dart';
+
+class MyClass {
+ final myVar = 'there';
+ myFunc(msg) {
+ return '$msg $myVar';
+ }
+}
+
+isolateEntryPoint(args) {
+ final reply = args[1];
+ final msg = args[0];
+ reply.send('re: ${new MyClass().myFunc(msg)}');
+}
+
+Future<void> main([args, port]) async {
+ // message - reply chain'
+ final exitPort = ReceivePort();
+ final replyPort = ReceivePort();
+
+ Isolate.spawn(isolateEntryPoint, ['hi', replyPort.sendPort],
+ onExit: exitPort.sendPort);
+
+ replyPort.listen((msg) {
+ replyPort.close();
+ Expect.equals(msg, 're: hi there');
+ });
+
+ // Explicitly await spawned isolate exit to enforce main isolate not
+ // completing (and the stand-alone runtime exiting) before the spawned
+ // isolate is done.
+ await exitPort.first;
+}
diff --git a/tests/lib/isolate/spawn_function_test.dart b/tests/lib/isolate/spawn_function_test.dart
new file mode 100644
index 0000000..bd8d1c1
--- /dev/null
+++ b/tests/lib/isolate/spawn_function_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Example of spawning an isolate from a function.
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+isolateEntryPoint(args) {
+ var msg = args[0];
+ var sendPort = args[1];
+ sendPort.send('re: $msg');
+}
+
+Future<void> main([args, port]) async {
+ // message - reply chain
+ const String debugName = 'spawnedIsolate';
+
+ ReceivePort port = new ReceivePort();
+ asyncStart();
+ port.listen((msg) {
+ port.close();
+ Expect.equals(msg, 're: hi');
+ asyncEnd();
+ });
+
+ // Start new isolate; paused so it's alive till we read the debugName.
+ // If the isolate runs to completion, the isolate might get cleaned up
+ // and debugName might be null.
+ final isolate = await Isolate.spawn(isolateEntryPoint, ['hi', port.sendPort],
+ paused: true, debugName: debugName);
+
+ Expect.equals(isolate.debugName, debugName);
+ isolate.resume(isolate.pauseCapability!);
+}
diff --git a/tests/lib/isolate/spawn_generic_test.dart b/tests/lib/isolate/spawn_generic_test.dart
new file mode 100644
index 0000000..109f2a8
--- /dev/null
+++ b/tests/lib/isolate/spawn_generic_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2015, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Check that Isolate.spawn is generic.
+library spawn_generic;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+void isomain(num args) {
+ print(args);
+ // All is well. No throwing.
+}
+
+void isomain1(num? args) {
+ print(args);
+ // All is well. No throwing.
+}
+
+int _count = 0;
+void enter() {
+ asyncStart();
+ _count++;
+}
+
+bool exit() {
+ asyncEnd();
+ return --_count == 0;
+}
+
+main() {
+ var remotePort = new RawReceivePort();
+ remotePort.handler = (m) {
+ if (m == null) {
+ if (exit()) remotePort.close();
+ } else {
+ List list = m;
+ throw new AsyncError(m[0], new StackTrace.fromString(m[1]));
+ }
+ };
+ var port = remotePort.sendPort;
+
+ // Explicit type works.
+ enter();
+ Isolate.spawn<int>(isomain, 42, onExit: port, onError: port);
+ enter();
+ Isolate.spawn<num>(isomain, 42, onExit: port, onError: port);
+ enter();
+ Isolate.spawn<num>(isomain, 1.2, onExit: port, onError: port);
+ enter();
+ Isolate.spawn<double>(isomain, 1.2, onExit: port, onError: port);
+ enter();
+ Isolate.spawn<int?>(isomain1, null, onExit: port, onError: port);
+
+ // Inference gets it right.
+ enter();
+ Isolate.spawn(isomain, 42, onExit: port, onError: port);
+ enter();
+ Isolate.spawn(isomain, 1.2, onExit: port, onError: port);
+ enter();
+ Isolate.spawn(isomain1, null, onExit: port, onError: port);
+}
diff --git a/tests/lib/isolate/spawn_uri_child_isolate.dart b/tests/lib/isolate/spawn_uri_child_isolate.dart
new file mode 100644
index 0000000..81f40f9
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_child_isolate.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2012, 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.
+
+// Child isolate code to be spawned from a URI to this file.
+library SpawnUriChildIsolate;
+
+void main(List<String> args, replyTo) {
+ var data = args[0];
+ replyTo.send('re: $data');
+}
diff --git a/tests/lib/isolate/spawn_uri_exported_main.dart b/tests/lib/isolate/spawn_uri_exported_main.dart
new file mode 100644
index 0000000..afd0122
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_exported_main.dart
@@ -0,0 +1,5 @@
+export "spawn_uri_exported_main_lib.dart";
+
+maine() {
+ print("This is not the maine you are looking for.");
+}
diff --git a/tests/lib/isolate/spawn_uri_exported_main_lib.dart b/tests/lib/isolate/spawn_uri_exported_main_lib.dart
new file mode 100644
index 0000000..7500465
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_exported_main_lib.dart
@@ -0,0 +1,6 @@
+library spawn_uri_exported_main_lib;
+
+main(args, msg) {
+ print("From main!");
+ msg.send(50);
+}
diff --git a/tests/lib/isolate/spawn_uri_exported_main_test.dart b/tests/lib/isolate/spawn_uri_exported_main_test.dart
new file mode 100644
index 0000000..837486e
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_exported_main_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+main() {
+ print("Spawning isolate.");
+ var t = new Timer(new Duration(seconds: 30), () {
+ // it might take some time for new isolate to get spawned from source since
+ // it needs to be compiled first.
+ Expect.fail("Isolate was not spawned successfully.");
+ });
+ var rp = new RawReceivePort();
+ rp.handler = (msg) {
+ print("Spawned main called.");
+ Expect.equals(msg, 50);
+ rp.close();
+ };
+ Isolate.spawnUri(Uri.parse("spawn_uri_exported_main.dart"), [], rp.sendPort)
+ .then((_) {
+ print("Loaded");
+ t.cancel();
+ });
+}
diff --git a/tests/lib/isolate/spawn_uri_fail_test.dart b/tests/lib/isolate/spawn_uri_fail_test.dart
new file mode 100644
index 0000000..6c9dc98
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_fail_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2016, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:io";
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+main() async {
+ var pkgRoot = Uri.parse("file:///no/such/directory/");
+ var pkgConfig = Uri.parse("file:///no/such/.packages");
+ try {
+ var i = await Isolate.spawnUri(Platform.script, [], null,
+ packageRoot: pkgRoot, packageConfig: pkgConfig);
+ } catch (e) {
+ print(e);
+ Expect.isTrue(e is ArgumentError);
+ }
+ try {
+ var i = await Isolate.spawnUri(Platform.script, [], null,
+ packageRoot: pkgRoot, automaticPackageResolution: true);
+ } catch (e) {
+ print(e);
+ Expect.isTrue(e is ArgumentError);
+ }
+ try {
+ var i = await Isolate.spawnUri(Platform.script, [], null,
+ packageConfig: pkgConfig, automaticPackageResolution: true);
+ } catch (e) {
+ print(e);
+ Expect.isTrue(e is ArgumentError);
+ }
+ try {
+ var i = await Isolate.spawnUri(Platform.script, [], null,
+ packageRoot: pkgRoot,
+ packageConfig: pkgConfig,
+ automaticPackageResolution: true);
+ } catch (e) {
+ print(e);
+ Expect.isTrue(e is ArgumentError);
+ }
+}
diff --git a/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart b/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
new file mode 100644
index 0000000..02521b6
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+/// Tests that Isolate.spawnUri completes with an error when the given URI
+/// doesn't resolve to an existing resource.
+///
+/// This test is similar to spawn_uri_missing_test.dart, but tests what happens
+/// when Isolate.spawnUri is called from an a spawned isolate. In dart2js,
+/// these two situations are different.
+library test.isolate.spawn_uri_missing_from_isolate_test;
+
+import 'dart:isolate';
+
+import 'dart:async';
+
+import 'package:async_helper/async_helper.dart';
+
+import 'spawn_uri_missing_test.dart';
+
+const String SUCCESS = 'Test worked.';
+
+void isolate(SendPort port) {
+ doTest().then((_) => port.send(SUCCESS),
+ onError: (error, stack) => port.send('Test failed: $error\n$stack'));
+}
+
+main() {
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(isolate, port.sendPort);
+ Completer completer = new Completer();
+ port.first.then((message) {
+ if (message == SUCCESS) {
+ completer.complete(null);
+ } else {
+ completer.completeError(message);
+ }
+ });
+
+ asyncTest(() => completer.future);
+}
diff --git a/tests/lib/isolate/spawn_uri_missing_test.dart b/tests/lib/isolate/spawn_uri_missing_test.dart
new file mode 100644
index 0000000..e13ec06
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_missing_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+/// Tests that Isolate.spanUri completes with an error when the given URI
+/// doesn't resolve to an existing resource.
+library test.isolate.spawn_uri_missing_test;
+
+import 'dart:isolate';
+
+import 'dart:async';
+
+import 'package:async_helper/async_helper.dart';
+
+const UNEXPECTED_MESSAGE = 'Created isolate from missing file.';
+
+Future doTest() {
+ return Isolate.spawnUri(Uri.base.resolve('no_such_file'), [], null)
+ .then((Isolate isolate) {
+ throw UNEXPECTED_MESSAGE;
+ }).catchError((error) {
+ if (error == UNEXPECTED_MESSAGE) throw error;
+ print('An error was thrown as expected');
+ return null;
+ });
+}
+
+main() {
+ asyncTest(doTest);
+}
diff --git a/tests/lib/isolate/spawn_uri_multi_test.dart b/tests/lib/isolate/spawn_uri_multi_test.dart
new file mode 100644
index 0000000..d5fdc46
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_multi_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Negative test to make sure that we are reaching all assertions.
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:async_helper/async_minitest.dart';
+
+/* Dummy import so multi-test copies the file.
+import 'spawn_uri_child_isolate.dart';
+*/
+
+main() {
+ test('isolate fromUri - negative test', () {
+ ReceivePort port = new ReceivePort();
+ port.first.then(expectAsync((msg) {
+ String expectedMessage = 're: hi';
+ // Should be hi, not hello.
+ expectedMessage = 're: hello'; //# 01: runtime error
+ expect(msg, equals(expectedMessage));
+ }));
+
+ Isolate.spawnUri(
+ Uri.parse('spawn_uri_child_isolate.dart'), ['hi'], port.sendPort);
+ });
+}
diff --git a/tests/lib/isolate/spawn_uri_nested_child1_vm_isolate.dart b/tests/lib/isolate/spawn_uri_nested_child1_vm_isolate.dart
new file mode 100644
index 0000000..6008357
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_nested_child1_vm_isolate.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, 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.
+
+// Example of nested spawning of isolates from a URI
+// Note: the following comment is used by test.dart to additionally compile the
+// other isolate's code.
+library NestedSpawnUriChild1Library;
+
+import 'dart:isolate';
+
+main(List<String> args, message) {
+ ReceivePort port2 = new ReceivePort();
+ port2.listen((msg) {
+ if (msg != "re: hi") throw "Bad response: $msg";
+ port2.close();
+ });
+
+ Isolate.spawnUri(Uri.parse('spawn_uri_nested_child2_vm_isolate.dart'), ['hi'],
+ port2.sendPort);
+
+ var data = message[0];
+ var replyTo = message[1];
+ replyTo.send(data);
+}
diff --git a/tests/lib/isolate/spawn_uri_nested_child2_vm_isolate.dart b/tests/lib/isolate/spawn_uri_nested_child2_vm_isolate.dart
new file mode 100644
index 0000000..a6c90b8f
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_nested_child2_vm_isolate.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2012, 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.
+
+// Child isolate code to be spawned from a URI to this file.
+library NestedSpawnUriChild2Library;
+
+import 'dart:isolate';
+
+void main(List<String> args, SendPort replyTo) {
+ var data = args[0];
+ replyTo.send('re: $data');
+}
diff --git a/tests/lib/isolate/spawn_uri_nested_vm_test.dart b/tests/lib/isolate/spawn_uri_nested_vm_test.dart
new file mode 100644
index 0000000..087b5fc
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_nested_vm_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Example of nested spawning of isolates from a URI
+library NestedSpawnUriLibrary;
+
+import 'dart:isolate';
+import 'package:async_helper/async_minitest.dart';
+
+main() {
+ test('isolate fromUri - nested send and reply', () {
+ ReceivePort port = new ReceivePort();
+ Isolate.spawnUri(Uri.parse('spawn_uri_nested_child1_vm_isolate.dart'), [], [
+ [1, 2],
+ port.sendPort
+ ]);
+ port.first.then(expectAsync((result) => print(result)));
+ });
+}
diff --git a/tests/lib/isolate/spawn_uri_test.dart b/tests/lib/isolate/spawn_uri_test.dart
new file mode 100644
index 0000000..28d7bce
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Example of spawning an isolate from a URI
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:async_helper/async_minitest.dart';
+
+main() {
+ test('isolate fromUri - send and reply', () async {
+ const String debugName = 'spawnedIsolate';
+
+ final exitPort = ReceivePort();
+
+ final port = new ReceivePort();
+ port.listen(expectAsync((msg) {
+ expect(msg, equals('re: hi'));
+ port.close();
+ }));
+
+ // Start new isolate; paused so it's alive till we read the debugName.
+ // If the isolate runs to completion, the isolate might get cleaned up
+ // and debugName might be null.
+ final isolate = await Isolate.spawnUri(
+ Uri.parse('spawn_uri_child_isolate.dart'), ['hi'], port.sendPort,
+ paused: true, debugName: debugName, onExit: exitPort.sendPort);
+
+ expect(isolate.debugName, debugName);
+
+ isolate.resume(isolate.pauseCapability!);
+
+ // Explicitly await spawned isolate exit to enforce main isolate not
+ // completing (and the stand-alone runtime exiting) before the spawned
+ // isolate is done.
+ await exitPort.first;
+ });
+}
diff --git a/tests/lib/isolate/spawn_uri_vm_test.dart b/tests/lib/isolate/spawn_uri_vm_test.dart
new file mode 100644
index 0000000..3832b42
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_vm_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Example of spawning an isolate from a URI
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:async_helper/async_minitest.dart';
+
+main() {
+ test('isolate fromUri - send and reply', () {
+ ReceivePort port = new ReceivePort();
+ port.first.then(expectAsync((msg) {
+ expect(msg, equals('re: hi'));
+ }));
+
+ Isolate.spawnUri(
+ Uri.parse('spawn_uri_child_isolate.dart'), ['hi'], port.sendPort);
+ });
+}
diff --git a/tests/lib/isolate/stacktrace_message_test.dart b/tests/lib/isolate/stacktrace_message_test.dart
new file mode 100644
index 0000000..41a0820
--- /dev/null
+++ b/tests/lib/isolate/stacktrace_message_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, 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 'dart:isolate';
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+// Test that StackTrace objects can be sent between isolates spawned from
+// the same isolate using Isolate.spawn.
+
+void main() {
+ asyncStart();
+ ReceivePort reply = new ReceivePort();
+ Isolate.spawn(runTest, reply.sendPort);
+ reply.first.then((pair) {
+ StackTrace stack = pair[0];
+ String stackString = pair[1];
+ if (stack == null) {
+ print("Failed to send stack-trace");
+ print(stackString);
+ Expect.fail("Sending stack-trace");
+ }
+ Expect.equals(stackString, "!$stack");
+ print(stack);
+ asyncEnd();
+ });
+}
+
+runTest(SendPort sendport) {
+ try {
+ throw 'sorry';
+ } catch (e, stack) {
+ try {
+ sendport.send([stack, "$stack"]);
+ print("Stacktrace sent");
+ } catch (e, s) {
+ print("Stacktrace not sent");
+ sendport.send([null, "$e\n$s"]);
+ }
+ }
+}
diff --git a/tests/lib/isolate/start_paused_test.dart b/tests/lib/isolate/start_paused_test.dart
new file mode 100644
index 0000000..c9b2b57
--- /dev/null
+++ b/tests/lib/isolate/start_paused_test.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2014, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library start_paused_test;
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void isomain(SendPort p) {
+ p.send("DONE");
+}
+
+void notyet(_) {
+ throw "NOT YET";
+}
+
+void main() {
+ asyncStart();
+ test1();
+ test2();
+ asyncEnd();
+}
+
+void test1() {
+ // Test that a paused isolate doesn't send events.
+ // We start two isolates, one paused and one not.
+ // The unpaused one must send an event, after which
+ // we resume that paused isolate, and expect the second event.
+ // This is not a guaranteed test, since it can succeede even if the
+ // paused isolate isn't really paused.
+ // However, it must never fail, since that would mean that a paused
+ // isolate sends a message.
+ asyncStart();
+ RawReceivePort p1 = new RawReceivePort(notyet);
+ Isolate.spawn(isomain, p1.sendPort, paused: true).then((isolate) {
+ late RawReceivePort p2;
+ p2 = new RawReceivePort((x) {
+ Expect.equals("DONE", x);
+ p2.close();
+ p1.handler = (x) {
+ Expect.equals("DONE", x);
+ p1.close();
+ asyncEnd();
+ };
+ isolate.resume(isolate.pauseCapability!);
+ });
+ Isolate.spawn(isomain, p2.sendPort);
+ });
+}
+
+void test2() {
+ // Test that a paused isolate doesn't send events.
+ // Like the test above, except that we change the pause capability
+ // of the paused isolate by pausing it using another capability and
+ // then resuming the initial pause. This must not cause it to send
+ // a message before the second pause is resumed as well.
+ asyncStart();
+ RawReceivePort p1 = new RawReceivePort(notyet);
+ Isolate.spawn(isomain, p1.sendPort, paused: true).then((isolate) {
+ late RawReceivePort p2;
+ Capability c2 = new Capability();
+ // Switch to another pause capability.
+ isolate.pause(c2);
+ isolate.resume(isolate.pauseCapability!);
+ p2 = new RawReceivePort((x) {
+ Expect.equals("DONE", x);
+ p2.close();
+ p1.handler = (x) {
+ Expect.equals("DONE", x);
+ p1.close();
+ asyncEnd();
+ };
+ isolate.resume(c2);
+ });
+ Isolate.spawn(isomain, p2.sendPort);
+ });
+}
diff --git a/tests/lib/isolate/static_function_lib.dart b/tests/lib/isolate/static_function_lib.dart
new file mode 100644
index 0000000..886284f
--- /dev/null
+++ b/tests/lib/isolate/static_function_lib.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2012, 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.
+
+library static_function_testlib;
+
+import "dart:isolate" show SendPort;
+
+// Used by static_function_test.dart.
+
+void function(port) {
+ port.send("LIBTOP");
+}
+
+void _function(port) {
+ port.send("_LIBTOP");
+}
+
+Function get privateFunction => _function;
+
+class C {
+ static void function(SendPort port) {
+ port.send("LIB");
+ }
+
+ static void _function(SendPort port) {
+ port.send("LIBPRIVATE");
+ }
+
+ static Function get privateFunction => _function;
+}
+
+Function get privateClassFunction => _C.function;
+Function get privateClassAndFunction => _C._function;
+
+class _C {
+ static void function(SendPort port) {
+ port.send("_LIB");
+ }
+
+ static void _function(SendPort port) {
+ port.send("_LIBPRIVATE");
+ }
+}
diff --git a/tests/lib/isolate/static_function_test.dart b/tests/lib/isolate/static_function_test.dart
new file mode 100644
index 0000000..e1ece06
--- /dev/null
+++ b/tests/lib/isolate/static_function_test.dart
@@ -0,0 +1,149 @@
+// Copyright (c) 2013, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Test starting isolate with static functions (and toplevel ones, for sanity).
+
+library static_function_test;
+
+import 'dart:isolate';
+import 'static_function_lib.dart' as lib;
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void function(SendPort port) {
+ port.send("TOP");
+}
+
+void _function(SendPort port) {
+ port.send("_TOP");
+}
+
+// A closure created at top-level (not inside a method), but not by a top-level
+// function declaration.
+var staticClosure = (SendPort port) {
+ port.send("WHAT?");
+};
+
+// An unnamed closure created inside a function.
+get dynamicClosure => (SendPort port) {
+ port.send("WHAT??");
+ };
+
+// A named closure created inside a function.
+get namedDynamicClosure {
+ void foo(SendPort port) {
+ port.send("WHAT FOO??");
+ }
+
+ ;
+ return foo;
+}
+
+class C {
+ // Unnamed closure created during object initialization, but not inside
+ // a method or constructor.
+ final Function instanceClosure = (SendPort port) {
+ port.send("C WHAT?");
+ };
+ // Unnamed closure created during object initializer list evaluation.
+ final Function constructorInitializerClosure;
+ // Unnamed closure created inside constructor body.
+ late Function constructorBodyClosure;
+ // Named closure created inside constructor body.
+ late Function namedConstructorBodyClosure;
+
+ C()
+ : constructorInitializerClosure = ((SendPort port) {
+ port.send("Init?");
+ }) {
+ constructorBodyClosure = (SendPort port) {
+ port.send("bodyClosure?");
+ };
+ void foo(SendPort port) {
+ port.send("namedBodyClosure?");
+ }
+
+ namedConstructorBodyClosure = foo;
+ }
+
+ static void function(SendPort port) {
+ port.send("YES");
+ }
+
+ static void _function(SendPort port) {
+ port.send("PRIVATE");
+ }
+
+ void instanceMethod(SendPort port) {
+ port.send("INSTANCE WHAT?");
+ }
+}
+
+class _C {
+ static void function(SendPort port) {
+ port.send("_YES");
+ }
+
+ static void _function(SendPort port) {
+ port.send("_PRIVATE");
+ }
+}
+
+void spawnTest(name, function, response) {
+ print(name);
+ ReceivePort r = new ReceivePort();
+ Isolate.spawn(function, r.sendPort);
+ asyncStart();
+ r.listen((v) {
+ Expect.equals(v, response);
+ r.close();
+ asyncEnd();
+ });
+}
+
+void functionFailTest(name, function) {
+ print("throws on $name");
+ asyncStart();
+ Isolate.spawn(function, null).catchError((e) {
+ /* do nothing */
+ asyncEnd();
+ });
+}
+
+void main([args, port]) {
+ asyncStart();
+ // Sanity check.
+ spawnTest("function", function, "TOP");
+ spawnTest("_function", _function, "_TOP");
+ spawnTest("lib.function", lib.function, "LIBTOP");
+ spawnTest("lib._function", lib.privateFunction, "_LIBTOP");
+
+ // Local static functions.
+ spawnTest("class.function", C.function, "YES");
+ spawnTest("class._function", C._function, "PRIVATE");
+ spawnTest("_class._function", _C.function, "_YES");
+ spawnTest("_class._function", _C._function, "_PRIVATE");
+
+ // Imported static functions.
+ spawnTest("lib.class.function", lib.C.function, "LIB");
+ spawnTest("lib.class._function", lib.C.privateFunction, "LIBPRIVATE");
+ spawnTest("lib._class._function", lib.privateClassFunction, "_LIB");
+ spawnTest("lib._class._function", lib.privateClassAndFunction, "_LIBPRIVATE");
+
+ // Negative tests
+ functionFailTest("static closure", staticClosure);
+ functionFailTest("dynamic closure", dynamicClosure);
+ functionFailTest("named dynamic closure", namedDynamicClosure);
+ functionFailTest("instance closure", new C().instanceClosure);
+ functionFailTest(
+ "initializer closure", new C().constructorInitializerClosure);
+ functionFailTest("constructor closure", new C().constructorBodyClosure);
+ functionFailTest(
+ "named constructor closure", new C().namedConstructorBodyClosure);
+ functionFailTest("instance method", new C().instanceMethod);
+ asyncEnd();
+}
diff --git a/tests/lib/isolate/string_from_environment_default_value_test.dart b/tests/lib/isolate/string_from_environment_default_value_test.dart
new file mode 100644
index 0000000..78b2feb
--- /dev/null
+++ b/tests/lib/isolate/string_from_environment_default_value_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2013, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+
+import "package:expect/expect.dart";
+
+void test(port) {
+ Expect.equals('', const String.fromEnvironment('NOT_FOUND'));
+ Expect.equals(
+ 'x', const String.fromEnvironment('NOT_FOUND', defaultValue: 'x'));
+ if (port != null) port.send(null);
+}
+
+main() {
+ test(null);
+ var port = new ReceivePort();
+ Isolate.spawn(test, port.sendPort);
+ port.listen((_) => port.close());
+}
diff --git a/tests/lib/isolate/timer_isolate_test.dart b/tests/lib/isolate/timer_isolate_test.dart
new file mode 100644
index 0000000..58e93c5
--- /dev/null
+++ b/tests/lib/isolate/timer_isolate_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library multiple_timer_test;
+
+import 'dart:isolate';
+import 'dart:async';
+import 'package:async_helper/async_minitest.dart';
+
+const Duration TIMEOUT = const Duration(milliseconds: 100);
+
+// Some browsers (Firefox and IE so far) can trigger too early. Add a safety
+// margin. We use identical(1, 1.0) as an easy way to know if the test is
+// compiled by dart2js.
+int get safetyMargin => identical(1, 1.0) ? 100 : 0;
+
+createTimer(replyTo) {
+ new Timer(TIMEOUT, () {
+ replyTo.send("timer_fired");
+ });
+}
+
+main() {
+ test("timer in isolate", () {
+ Stopwatch stopwatch = new Stopwatch();
+ ReceivePort port = new ReceivePort();
+
+ port.first.then(expectAsync((msg) {
+ expect("timer_fired", msg);
+ expect(stopwatch.elapsedMilliseconds + safetyMargin,
+ greaterThanOrEqualTo(TIMEOUT.inMilliseconds));
+ }));
+
+ stopwatch.start();
+ var remote = Isolate.spawn(createTimer, port.sendPort);
+ });
+}
diff --git a/tests/lib/isolate/timer_multiple_isolates_test.dart b/tests/lib/isolate/timer_multiple_isolates_test.dart
new file mode 100644
index 0000000..3f7d8f3
--- /dev/null
+++ b/tests/lib/isolate/timer_multiple_isolates_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2017, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library timer_multiple_isolates_test;
+
+import 'dart:isolate';
+import 'dart:async';
+
+child(msg) {
+ var i = msg[0] as int;
+ var reponsePort = msg[1];
+ print("Starting child $i");
+
+ // Keep this isolate running to prevent its shutdown from touching the event
+ // handler.
+ new RawReceivePort();
+
+ // Try to get separate wakeups for each isolate.
+ new Timer(new Duration(milliseconds: 100 * (i + 1)), () {
+ print("Timer fired $i");
+ reponsePort.send(null);
+ });
+}
+
+main() {
+ var port;
+ var replies = 0;
+ var n = 3;
+ port = new RawReceivePort((reply) {
+ replies++;
+ print("Got reply $replies");
+ if (replies == n) {
+ print("Done");
+ port.close();
+ }
+ });
+
+ for (var i = 0; i < n; i++) {
+ Isolate.spawn(child, [i, port.sendPort]);
+ }
+}
diff --git a/tests/lib/isolate/transferable_failed_to_send_test.dart b/tests/lib/isolate/transferable_failed_to_send_test.dart
new file mode 100644
index 0000000..ac6f80e
--- /dev/null
+++ b/tests/lib/isolate/transferable_failed_to_send_test.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2019, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:io" show ServerSocket;
+import "dart:isolate";
+import "dart:typed_data" show ByteData;
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() async {
+ final port = new ReceivePort();
+
+ // Sending a socket object will result in an error.
+ final socket = await ServerSocket.bind('localhost', 0);
+
+ final x = new ByteData(4);
+ for (int i = 0; i < 4; i++) {
+ x.setUint8(i, i);
+ }
+ {
+ final transferableFirst = TransferableTypedData.fromList([x]);
+ Expect.throwsArgumentError(
+ () => port.sendPort.send(<dynamic>[transferableFirst, socket]));
+ // Once TransferableTypedData was sent even if attempt failed, it can't be
+ // materialized.
+ // This need to be changed so that on failed send we should not detach the
+ // buffer form the transferrable. The order should not matter (i.e. if the
+ // error happens before or after the serializer hits a transferrable object)
+
+ final data1 = transferableFirst.materialize().asUint8List();
+ Expect.equals(x.lengthInBytes, data1.length);
+ for (int i = 0; i < data1.length; i++) {
+ Expect.equals(i, data1[i]);
+ }
+ }
+ {
+ final transferableFirst = TransferableTypedData.fromList([x]);
+ Expect.throwsArgumentError(() => port.sendPort
+ .send(<dynamic>[transferableFirst, transferableFirst, socket]));
+ // Once TransferableTypedData was sent even if attempt failed, it can't be
+ // materialized.
+ // This need to be changed so that on failed send we should not detach the
+ // buffer form the transferrable. The order should not matter (i.e. if the
+ // error happens before or after the serializer hits a transferrable object)
+
+ final data1 = transferableFirst.materialize().asUint8List();
+ Expect.equals(x.lengthInBytes, data1.length);
+ for (int i = 0; i < data1.length; i++) {
+ Expect.equals(i, data1[i]);
+ }
+ }
+
+ {
+ final transferableSecond = TransferableTypedData.fromList([x]);
+ Expect.throwsArgumentError(
+ () => port.sendPort.send(<dynamic>[socket, transferableSecond]));
+ // Once TransferableTypedData was sent even if attempt failed, it can't be
+ // materialized.
+ final data2 = transferableSecond.materialize().asUint8List();
+ Expect.equals(x.lengthInBytes, data2.length);
+ for (int i = 0; i < data2.length; i++) {
+ Expect.equals(i, data2[i]);
+ }
+ }
+
+ {
+ final transferableSecond = TransferableTypedData.fromList([x]);
+ Expect.throwsArgumentError(() => port.sendPort
+ .send(<dynamic>[socket, transferableSecond, transferableSecond]));
+ // Once TransferableTypedData was sent even if attempt failed, it can't be
+ // materialized.
+ final data2 = transferableSecond.materialize().asUint8List();
+ Expect.equals(x.lengthInBytes, data2.length);
+ for (int i = 0; i < data2.length; i++) {
+ Expect.equals(i, data2[i]);
+ }
+ }
+
+ socket.close();
+ port.close();
+}
diff --git a/tests/lib/isolate/transferable_test.dart b/tests/lib/isolate/transferable_test.dart
new file mode 100644
index 0000000..8680828
--- /dev/null
+++ b/tests/lib/isolate/transferable_test.dart
@@ -0,0 +1,287 @@
+// Copyright (c) 2019, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:collection";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+const large = 2 * 1024 * 1024;
+
+void child(replyPort) {
+ print("Child start");
+
+ print("Child ByteData");
+ dynamic x = new ByteData(large);
+ for (int i = 0; i < 4; i++) {
+ x.setInt8(i, i);
+ }
+ replyPort.send(TransferableTypedData.fromList([x.buffer.asUint8List()]));
+
+ print("Child Uint8List");
+ x = new Uint8List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(TransferableTypedData.fromList([x]));
+
+ print("Child Uint8List.view");
+ x = new Uint8List.view(x.buffer, 1, 2);
+ replyPort.send(TransferableTypedData.fromList([x]));
+
+ print("Child Int8List");
+ x = new Int8List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(TransferableTypedData.fromList([x]));
+
+ print("Child Uint16List");
+ x = new Uint16List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(TransferableTypedData.fromList([x]));
+
+ print("Child Int16List");
+ x = new Int16List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(TransferableTypedData.fromList([x]));
+
+ print("Child Uint32List");
+ x = new Uint32List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(TransferableTypedData.fromList([x]));
+
+ print("Child Int32List");
+ x = new Int32List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(TransferableTypedData.fromList([x]));
+
+ print("Child Uint64List");
+ x = new Uint64List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(TransferableTypedData.fromList([x]));
+
+ print("Child Int64List");
+ x = new Int64List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send(TransferableTypedData.fromList([x]));
+
+ print("Child two Uint8Lists");
+ x = new Uint8List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ replyPort.send([
+ TransferableTypedData.fromList([x]),
+ TransferableTypedData.fromList([x])
+ ]);
+
+ print("Child same Uint8List twice - materialize first");
+ x = new Uint8List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ var tr = TransferableTypedData.fromList([x]);
+ replyPort.send([tr, tr]);
+
+ print("Child same Uint8List twice - materialize second");
+ x = new Uint8List(large);
+ for (int i = 0; i < 4; i++) {
+ x[i] = i;
+ }
+ tr = TransferableTypedData.fromList([x]);
+ replyPort.send([tr, tr]);
+
+ print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+ print("Parent start");
+
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(child, port.sendPort);
+ StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+ print("Parent ByteData");
+ Expect.isTrue(await incoming.moveNext());
+ dynamic x = incoming.current.materialize().asByteData();
+ Expect.isTrue(x is ByteData);
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x.getUint8(i));
+ }
+
+ print("Parent Uint8List");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current.materialize();
+ Expect.isTrue(x is ByteBuffer);
+ x = x.asUint8List();
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Uint8List view");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current.materialize().asUint8List();
+ Expect.equals(1, x[0]);
+ Expect.equals(2, x[1]);
+
+ print("Parent Int8");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current.materialize().asInt8List();
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Uint16");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current.materialize().asUint16List();
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Int16");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current.materialize().asInt16List();
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Uint32");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current.materialize().asUint32List();
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Int32");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current.materialize().asInt32List();
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Uint64");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current.materialize().asUint64List();
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent Int64");
+ Expect.isTrue(await incoming.moveNext());
+ x = incoming.current.materialize().asInt64List();
+ Expect.equals(large, x.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x[i]);
+ }
+
+ print("Parent two Uint8Lists");
+ Expect.isTrue(await incoming.moveNext());
+ final x1 = incoming.current[0].materialize().asUint8List();
+ final x2 = incoming.current[1].materialize().asUint8List();
+ Expect.equals(large, x1.length);
+ Expect.equals(large, x2.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, x1[i]);
+ Expect.equals(i, x2[i]);
+ }
+
+ print("Parent same Uint8Lists twice, materialize first");
+ Expect.isTrue(await incoming.moveNext());
+ final tr0 = incoming.current[0].materialize().asUint8List();
+ Expect.throwsArgumentError(() => incoming.current[1].materialize());
+ Expect.equals(large, tr0.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, tr0[i]);
+ }
+
+ print("Parent same Uint8Lists twice, materialize second");
+ Expect.isTrue(await incoming.moveNext());
+ final tr1 = incoming.current[1].materialize().asUint8List();
+ Expect.throwsArgumentError(() => incoming.current[0].materialize());
+ Expect.equals(large, tr1.length);
+ for (int i = 0; i < 4; i++) {
+ Expect.equals(i, tr1[i]);
+ }
+
+ port.close();
+ print("Parent done");
+
+ testCreateMaterializeInSameIsolate();
+ testIterableToList();
+ testUserExtendedList();
+}
+
+testCreateMaterializeInSameIsolate() {
+ // Test same-isolate operation of TransferableTypedData.
+ final Uint8List bytes = new Uint8List(large);
+ for (int i = 0; i < bytes.length; ++i) {
+ bytes[i] = i % 256;
+ }
+ final tr = TransferableTypedData.fromList([bytes]);
+ Expect.listEquals(bytes, tr.materialize().asUint8List());
+}
+
+testIterableToList() {
+ // Test that iterable.toList() can be used as an argument.
+ final list1 = Uint8List(10);
+ for (int i = 0; i < list1.length; i++) {
+ list1[i] = i;
+ }
+ final list2 = Uint8List(20);
+ for (int i = 0; i < list2.length; i++) {
+ list2[i] = i + list1.length;
+ }
+ final map = {list1: true, list2: true};
+ Iterable<Uint8List> iterable = map.keys;
+ final result = TransferableTypedData.fromList(iterable.toList())
+ .materialize()
+ .asUint8List();
+ for (int i = 0; i < result.length; i++) {
+ Expect.equals(i, result[i]);
+ }
+}
+
+class MyList<E> extends ListBase<E> {
+ List<E> _source;
+ MyList(this._source);
+ int get length => _source.length;
+ void set length(int length) {
+ _source.length = length;
+ }
+
+ E operator [](int index) => _source[index];
+ void operator []=(int index, E value) {
+ _source[index] = value;
+ }
+}
+
+testUserExtendedList() {
+ final list = MyList<TypedData>([Uint8List(10)]);
+ TransferableTypedData.fromList(list);
+}
diff --git a/tests/lib/isolate/typed_message_test.dart b/tests/lib/isolate/typed_message_test.dart
new file mode 100644
index 0000000..38e24d0
--- /dev/null
+++ b/tests/lib/isolate/typed_message_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+// Dart test program for testing isolate communication with
+// typed objects.
+
+library TypedMessageTest;
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import "dart:isolate";
+
+void logMessages(SendPort replyTo) {
+ print("Starting log server.");
+ ReceivePort port = new ReceivePort();
+ replyTo.send(port.sendPort);
+ port.first.then((_message) {
+ List<int> message = _message;
+ print("Log $message");
+ Expect.equals(5, message.length);
+ Expect.equals(0, message[0]);
+ Expect.equals(1, message[1]);
+ Expect.equals(2, message[2]);
+ Expect.equals(3, message[3]);
+ Expect.equals(4, message[4]);
+ port.close();
+ replyTo.send(1);
+ print("Stopping log server.");
+ });
+}
+
+main() {
+ asyncStart();
+ ReceivePort receivePort = new ReceivePort();
+ Future<Isolate> remote = Isolate.spawn(logMessages, receivePort.sendPort);
+ var msg = <int>[0, 1, 2, 3, 4];
+ StreamIterator iterator = new StreamIterator(receivePort);
+ iterator.moveNext().then((b) {
+ SendPort sendPort = iterator.current;
+ sendPort.send(msg);
+ return iterator.moveNext();
+ }).then((b) {
+ Expect.equals(1, iterator.current);
+ receivePort.close();
+ asyncEnd();
+ });
+}
diff --git a/tests/lib/isolate/unboxed_double_snapshot_writer_test.dart b/tests/lib/isolate/unboxed_double_snapshot_writer_test.dart
new file mode 100644
index 0000000..132ad6b
--- /dev/null
+++ b/tests/lib/isolate/unboxed_double_snapshot_writer_test.dart
@@ -0,0 +1,34 @@
+// 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 'dart:async';
+import 'dart:isolate';
+import 'dart:typed_data';
+
+import 'package:expect/expect.dart';
+
+double getDoubleWithHeapObjectTag() {
+ final bd = ByteData(8);
+ bd.setUint64(0, 0x8000000000000001, Endian.host);
+ final double v = bd.getFloat64(0, Endian.host);
+ return v;
+}
+
+class Foo {
+ final double x = getDoubleWithHeapObjectTag();
+ final String name = "Foo Class";
+ Foo();
+}
+
+main(args) async {
+ final receivePort = new ReceivePort();
+
+ receivePort.sendPort.send(Foo());
+ final it = StreamIterator(receivePort);
+ Expect.isTrue(await it.moveNext());
+ final Foo receivedFoo = it.current as Foo;
+ Expect.equals(receivedFoo.x, getDoubleWithHeapObjectTag());
+ Expect.equals(receivedFoo.name, "Foo Class");
+ await it.cancel();
+}
diff --git a/tests/lib/isolate/unresolved_ports_test.dart b/tests/lib/isolate/unresolved_ports_test.dart
new file mode 100644
index 0000000..7707fab
--- /dev/null
+++ b/tests/lib/isolate/unresolved_ports_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2012, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// spawns multiple isolates and sends unresolved ports between them.
+library unresolved_ports;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+// This test does the following:
+// - main spawns two isolates: 'tim' and 'beth'
+// - 'tim' spawns an isolate: 'bob'
+// - main starts a message chain:
+// main -> beth -> tim -> bob -> main
+// by giving 'beth' a send-port to 'tim'.
+
+bethIsolate(init) {
+ ReceivePort port = initIsolate(init);
+ // TODO(sigmund): use expectAsync when it is OK to use it within an isolate
+ // (issue #6856)
+ port.first.then((msg) => msg[1]
+ .send(['${msg[0]}\nBeth says: Tim are you coming? And Bob?', msg[2]]));
+}
+
+timIsolate(init) {
+ ReceivePort port = initIsolate(init);
+ spawnFunction(bobIsolate).then((bob) {
+ port.first.then((msg) => bob.send([
+ '${msg[0]}\nTim says: Can you tell "main" that we are all coming?',
+ msg[1]
+ ]));
+ });
+}
+
+bobIsolate(init) {
+ ReceivePort port = initIsolate(init);
+ port.first
+ .then((msg) => msg[1].send('${msg[0]}\nBob says: we are all coming!'));
+}
+
+Future spawnFunction(function) {
+ ReceivePort init = new ReceivePort();
+ Isolate.spawn(function, init.sendPort);
+ return init.first;
+}
+
+ReceivePort initIsolate(SendPort starter) {
+ ReceivePort port = new ReceivePort();
+ starter.send(port.sendPort);
+ return port;
+}
+
+baseTest({bool failForNegativeTest: false}) {
+ // Message chain with unresolved ports
+ ReceivePort port = new ReceivePort();
+ asyncStart();
+ port.listen((msg) {
+ Expect.equals(
+ msg,
+ 'main says: Beth, find out if Tim is coming.'
+ '\nBeth says: Tim are you coming? And Bob?'
+ '\nTim says: Can you tell "main" that we are all coming?'
+ '\nBob says: we are all coming!');
+ Expect.isFalse(failForNegativeTest);
+ port.close();
+ asyncEnd();
+ });
+
+ spawnFunction(timIsolate).then((tim) {
+ spawnFunction(bethIsolate).then((beth) {
+ beth.send(
+ ['main says: Beth, find out if Tim is coming.', tim, port.sendPort]);
+ });
+ });
+}
+
+void main([args, port]) => baseTest();
diff --git a/tests/lib/isolate/vm_rehash_test.dart b/tests/lib/isolate/vm_rehash_test.dart
new file mode 100644
index 0000000..f5a0a73
--- /dev/null
+++ b/tests/lib/isolate/vm_rehash_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2017, 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:async';
+import 'dart:isolate';
+
+int globalHash = 0;
+
+class A {
+ int get hashCode => globalHash;
+ bool operator ==(other) => true;
+}
+
+final key = new A();
+
+other(SendPort sendPort) async {
+ // We use a different hash than the main isolate, but the re-hashing on our
+ // side happens after this line and should therefore also deserialize the map
+ // with a new hash, so we should be able to find the value in the map.
+ globalHash = 4321;
+
+ final port = new ReceivePort();
+ sendPort.send(port.sendPort);
+
+ final Map map = await port.first;
+ sendPort.send(map[key]);
+ port.close();
+}
+
+void launchIsolate(argument) {
+ other(argument);
+}
+
+main() async {
+ final r = new ReceivePort();
+ final re = new ReceivePort();
+ final map = {};
+
+ globalHash = 1234;
+ map[key] = 1;
+
+ await Isolate.spawn(launchIsolate, r.sendPort, onError: re.sendPort);
+ re.listen((error) => throw 'Error $error');
+
+ final it = new StreamIterator(r);
+
+ await it.moveNext();
+ final SendPort port = it.current;
+
+ port.send(map);
+ await it.moveNext();
+ final otherIsolateMapEntry = await it.current;
+ if (map[key] != otherIsolateMapEntry) {
+ throw "test failed";
+ }
+ r.close();
+ re.close();
+}
diff --git a/tests/lib/lib_kernel.status b/tests/lib/lib_kernel.status
index 51d3d73..8151fcf 100644
--- a/tests/lib/lib_kernel.status
+++ b/tests/lib/lib_kernel.status
@@ -55,6 +55,7 @@
isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
mirrors/invocation_fuzz_test: Crash
mirrors/metadata_allowed_values_test/16: Skip # Flaky, crashes.
+mirrors/native_class_test: SkipByDesign # Imports dart:html
[ $hot_reload_rollback && ($compiler == dartk || $compiler == dartkb) ]
isolate/illegal_msg_function_test: Skip # Timeout
diff --git a/tests/lib/lib_vm.status b/tests/lib/lib_vm.status
index 4412dcf..c4207d9 100644
--- a/tests/lib/lib_vm.status
+++ b/tests/lib/lib_vm.status
@@ -80,5 +80,93 @@
[ $runtime == vm && ($arch == simarm || $arch == simarmv6) ]
convert/utf85_test: Skip # Pass, Slow Issue 12644.
+[ $arch == simarm || $arch == simarm64 || $hot_reload || $hot_reload_rollback ]
+convert/chunked_conversion_utf88_test: SkipSlow
+convert/streamed_conversion_json_utf8_decode_test: SkipSlow
+convert/utf85_test: SkipSlow
+
[ $arch == simarmv6 || $arch == simarm && $runtime == vm ]
convert/chunked_conversion_utf88_test: Skip # Pass, Slow Issue 12644.
+
+[ $hot_reload || $hot_reload_rollback ]
+isolate/bool_from_environment_default_value_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/capability_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/compile_time_error_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/count_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/cross_isolate_message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/enum_const_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/error_at_spawn_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/error_at_spawnuri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/error_exit_at_spawn_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/error_exit_at_spawnuri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/exit_at_spawn_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/exit_at_spawnuri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/function_send1_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/function_send_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/handle_error2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/handle_error3_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/handle_error_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/illegal_msg_function_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/illegal_msg_mirror_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/int32_length_overflow_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/int_from_environment_default_value_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/isolate_complex_messages_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/isolate_current_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/isolate_import_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_21398_parent_isolate1_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_21398_parent_isolate2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_21398_parent_isolate_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_22778_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_35626_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_6610_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/kill2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/kill_self_synchronously_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/kill_self_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/kill_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/large_byte_data_leak_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/large_byte_data_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/mandel_isolate_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message3_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message4_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message_const_type_arguments_1_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message_const_type_arguments_2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message_enum_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/mint_maker_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/native_wrapper_message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/nested_spawn2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/nested_spawn_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/non_fatal_exception_in_timer_callback_test/none: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/non_fatal_exception_in_timer_callback_test/sleep: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/object_leak_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/ondone_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/pause_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/ping_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/port_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/raw_port_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/regress_34752_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/regress_flutter_22796_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/request_reply_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/resolve_package_uri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/send_private_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/simple_message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_function_custom_class_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_function_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_generic_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_exported_main_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_missing_from_isolate_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_missing_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_multi_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_nested_vm_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_vm_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/start_paused_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/string_from_environment_default_value_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/timer_isolate_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/timer_multiple_isolates_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/transferable_failed_to_send_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/transferable_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/typed_message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/unresolved_ports_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/vm_rehash_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
diff --git a/tests/lib/mirrors/abstract_class_test.dart b/tests/lib/mirrors/abstract_class_test.dart
index 285d032..17fd28f 100644
--- a/tests/lib/mirrors/abstract_class_test.dart
+++ b/tests/lib/mirrors/abstract_class_test.dart
@@ -53,11 +53,11 @@
}
abstract class GenericFoo<T> {
- T genericFoo();
+ T genericFoo(T t);
}
class GenericBar<T> extends GenericFoo<T> {
- T genericFoo() {}
+ T genericFoo(T t) => t;
}
testGeneric() {
diff --git a/tests/lib/mirrors/generic_local_function_test.dart b/tests/lib/mirrors/generic_local_function_test.dart
index bc56f29..c8bd0e8 100644
--- a/tests/lib/mirrors/generic_local_function_test.dart
+++ b/tests/lib/mirrors/generic_local_function_test.dart
@@ -12,13 +12,13 @@
class C<T> {
makeClosure1() {
- T closure1(T t) {}
+ T closure1(T t) => t;
return closure1;
}
makeClosure2() {
enclosing() {
- T closure2(T t) {}
+ T closure2(T t) => t;
return closure2;
}
diff --git a/tests/lib/mirrors/generics_dynamic_test.dart b/tests/lib/mirrors/generics_dynamic_test.dart
index 8a583da..152d0d8 100644
--- a/tests/lib/mirrors/generics_dynamic_test.dart
+++ b/tests/lib/mirrors/generics_dynamic_test.dart
@@ -8,7 +8,7 @@
class A<T> {}
class B<T extends A> extends A implements C {
- A m(A a) {}
+ A m(A a) => a;
late A field;
}
diff --git a/tests/lib/mirrors/metadata_symbol_literal_test.dart b/tests/lib/mirrors/metadata_symbol_literal_test.dart
index 129d4cd..5709ecd 100644
--- a/tests/lib/mirrors/metadata_symbol_literal_test.dart
+++ b/tests/lib/mirrors/metadata_symbol_literal_test.dart
@@ -12,7 +12,7 @@
class U {
@T(#x)
- int field;
+ int? field;
}
main() {
diff --git a/tests/lib/mirrors/method_mirror_source_test.dart b/tests/lib/mirrors/method_mirror_source_test.dart
index a55fbc7..5657efa 100644
--- a/tests/lib/mirrors/method_mirror_source_test.dart
+++ b/tests/lib/mirrors/method_mirror_source_test.dart
@@ -36,8 +36,8 @@
: _y = y,
super();
- factory C.other(num z) {}
- factory C.other2() {}
+ factory C.other(num z) => C(z, z);
+ factory C.other2() => C(0, 0);
factory C.other3() = C.other2;
static dynamic foo() {
@@ -87,7 +87,7 @@
" : _y = y,\n"
" super();");
expectSource(cm.declarations[#C.other]!,
- "factory C.other(num z) {}");
+ "factory C.other(num z) => C(z, z);");
expectSource(cm.declarations[#C.other3]!,
"factory C.other3() = C.other2;");
diff --git a/tests/lib/mirrors/mirror_in_static_init_test.dart b/tests/lib/mirrors/mirror_in_static_init_test.dart
index 4de3ef6..90afd5a 100644
--- a/tests/lib/mirrors/mirror_in_static_init_test.dart
+++ b/tests/lib/mirrors/mirror_in_static_init_test.dart
@@ -12,7 +12,7 @@
// This class is only loaded during initialization of `staticField`.
abstract class C {
- int _a;
+ int? _a;
// This is a syntax error on purpose.
C([this._a: 0]); //# 01: compile-time error
}
diff --git a/tests/lib/mirrors/operator_test.dart b/tests/lib/mirrors/operator_test.dart
index a7fafbc..c466775 100644
--- a/tests/lib/mirrors/operator_test.dart
+++ b/tests/lib/mirrors/operator_test.dart
@@ -12,26 +12,26 @@
import 'stringify.dart';
class Foo {
- Foo operator ~() {}
- Foo operator -() {}
+ Foo operator ~() => this;
+ Foo operator -() => this;
- bool operator ==(a) {}
- Foo operator [](int a) {}
- Foo operator *(Foo a) {}
- Foo operator /(Foo a) {}
- Foo operator %(Foo a) {}
- Foo operator ~/(Foo a) {}
- Foo operator +(Foo a) {}
- Foo operator <<(Foo a) {}
- Foo operator >>(Foo a) {}
- Foo operator >=(Foo a) {}
- Foo operator >(Foo a) {}
- Foo operator <=(Foo a) {}
- Foo operator <(Foo a) {}
- Foo operator &(Foo a) {}
- Foo operator ^(Foo a) {}
- Foo operator |(Foo a) {}
- Foo operator -(Foo a) {}
+ bool operator ==(a) => false;
+ Foo operator [](int a) => this;
+ Foo operator *(Foo a) => this;
+ Foo operator /(Foo a) => this;
+ Foo operator %(Foo a) => this;
+ Foo operator ~/(Foo a) => this;
+ Foo operator +(Foo a) => this;
+ Foo operator <<(Foo a) => this;
+ Foo operator >>(Foo a) => this;
+ Foo operator >=(Foo a) => this;
+ Foo operator >(Foo a) => this;
+ Foo operator <=(Foo a) => this;
+ Foo operator <(Foo a) => this;
+ Foo operator &(Foo a) => this;
+ Foo operator ^(Foo a) => this;
+ Foo operator |(Foo a) => this;
+ Foo operator -(Foo a) => this;
// TODO(ahe): use void when dart2js reifies that type.
operator []=(int a, Foo b) {}
diff --git a/tests/lib/mirrors/parameter_metadata_test.dart b/tests/lib/mirrors/parameter_metadata_test.dart
index f875983..78e814f 100644
--- a/tests/lib/mirrors/parameter_metadata_test.dart
+++ b/tests/lib/mirrors/parameter_metadata_test.dart
@@ -20,7 +20,7 @@
class B {
B.foo(int x) {}
- factory B.bar(@m3 @m2 int z, x) {}
+ factory B.bar(@m3 @m2 int z, x) => new B.foo(0);
baz(@m1 final int x, @m2 int y, @m3 final int z) {}
qux(int x, [@m3 @m2 @m1 int y = 3 + 1]) {}
diff --git a/tests/lib/mirrors/regress_14304_test.dart b/tests/lib/mirrors/regress_14304_test.dart
index 293fcea..072e791 100644
--- a/tests/lib/mirrors/regress_14304_test.dart
+++ b/tests/lib/mirrors/regress_14304_test.dart
@@ -8,7 +8,7 @@
import "package:expect/expect.dart";
class A<T> {
- T m() {}
+ T m(T t) => t;
}
main() {
diff --git a/tests/lib/mirrors/return_type_test.dart b/tests/lib/mirrors/return_type_test.dart
index 65115bd..5a66dfe 100644
--- a/tests/lib/mirrors/return_type_test.dart
+++ b/tests/lib/mirrors/return_type_test.dart
@@ -11,9 +11,9 @@
class B {
f() {}
- int g() {}
- List h() {}
- B i() {}
+ int g() => 0;
+ List h() => [];
+ B i() => new B();
// TODO(ahe): Test this when dart2js handles parameterized types.
// List<int> j() {}
diff --git a/tests/lib/mirrors/type_mirror_for_type_test.dart b/tests/lib/mirrors/type_mirror_for_type_test.dart
index 92e101f..8ae149b 100644
--- a/tests/lib/mirrors/type_mirror_for_type_test.dart
+++ b/tests/lib/mirrors/type_mirror_for_type_test.dart
@@ -13,7 +13,7 @@
class C<T> {}
class X {
- Type foo() {}
+ Type foo() => Object;
}
main() {
diff --git a/tests/lib/typed_data/float32x4_test.dart b/tests/lib/typed_data/float32x4_test.dart
index c68ecc1..80600ff 100644
--- a/tests/lib/typed_data/float32x4_test.dart
+++ b/tests/lib/typed_data/float32x4_test.dart
@@ -397,19 +397,22 @@
Expect.equals(4.0, f.w);
}
+// TODO(eernst): Come pure null-safety, this can only be `TypeError`.
+bool isTypeError(e) => e is TypeError || e is ArgumentError;
+
void testBadArguments() {
dynamic dynamicNull = null;
- Expect.throwsTypeError(() => new Float32x4(dynamicNull, 2.0, 3.0, 4.0));
- Expect.throwsTypeError(() => new Float32x4(1.0, dynamicNull, 3.0, 4.0));
- Expect.throwsTypeError(() => new Float32x4(1.0, 2.0, dynamicNull, 4.0));
- Expect.throwsTypeError(() => new Float32x4(1.0, 2.0, 3.0, dynamicNull));
+ Expect.throws(() => new Float32x4(dynamicNull, 2.0, 3.0, 4.0), isTypeError);
+ Expect.throws(() => new Float32x4(1.0, dynamicNull, 3.0, 4.0), isTypeError);
+ Expect.throws(() => new Float32x4(1.0, 2.0, dynamicNull, 4.0), isTypeError);
+ Expect.throws(() => new Float32x4(1.0, 2.0, 3.0, dynamicNull), isTypeError);
// Use local variable typed as "dynamic" to avoid static warnings.
dynamic str = "foo";
- Expect.throwsTypeError(() => new Float32x4(str, 2.0, 3.0, 4.0));
- Expect.throwsTypeError(() => new Float32x4(1.0, str, 3.0, 4.0));
- Expect.throwsTypeError(() => new Float32x4(1.0, 2.0, str, 4.0));
- Expect.throwsTypeError(() => new Float32x4(1.0, 2.0, 3.0, str));
+ Expect.throws(() => new Float32x4(str, 2.0, 3.0, 4.0), isTypeError);
+ Expect.throws(() => new Float32x4(1.0, str, 3.0, 4.0), isTypeError);
+ Expect.throws(() => new Float32x4(1.0, 2.0, str, 4.0), isTypeError);
+ Expect.throws(() => new Float32x4(1.0, 2.0, 3.0, str), isTypeError);
}
void testSpecialValues() {
diff --git a/tests/lib/typed_data/int32x4_test.dart b/tests/lib/typed_data/int32x4_test.dart
index e9b2f4a..897c8a5 100644
--- a/tests/lib/typed_data/int32x4_test.dart
+++ b/tests/lib/typed_data/int32x4_test.dart
@@ -11,6 +11,9 @@
import 'dart:typed_data';
import 'package:expect/expect.dart';
+// TODO(eernst): Come pure null-safety, it can only be `TypeError`.
+bool isTypeError(e) => e is TypeError || e is ArgumentError;
+
void testBadArguments() {
// Check that the actual argument type error is detected and a dynamic
// error is raised. This is not trivially covered by similar dynamic type
@@ -18,12 +21,10 @@
// is a built-in type.
dynamic dynamicNull = null;
- Expect.throwsTypeError(() => new Int32x4(dynamicNull, 2, 3, 4));
- Expect.throwsTypeError(() => new Int32x4(1, dynamicNull, 3, 4));
- Expect.throwsTypeError(() => new Int32x4(1, 2, dynamicNull, 4));
- Expect.throwsTypeError(() => new Int32x4(1, 2, 3, dynamicNull));
-
- bool isTypeError(e) => e is TypeError;
+ Expect.throws(() => new Int32x4(dynamicNull, 2, 3, 4), isTypeError);
+ Expect.throws(() => new Int32x4(1, dynamicNull, 3, 4), isTypeError);
+ Expect.throws(() => new Int32x4(1, 2, dynamicNull, 4), isTypeError);
+ Expect.throws(() => new Int32x4(1, 2, 3, dynamicNull), isTypeError);
// Use a local variable typed as dynamic to avoid static warnings.
dynamic str = "foo";
diff --git a/tests/lib/typed_data/simd_type_null_params_test.dart b/tests/lib/typed_data/simd_type_null_params_test.dart
index 536b2be..0eb4737 100644
--- a/tests/lib/typed_data/simd_type_null_params_test.dart
+++ b/tests/lib/typed_data/simd_type_null_params_test.dart
@@ -11,7 +11,8 @@
try {
f();
} catch (e) {
- return e is TypeError;
+ // TODO(eernst): Come pure null-safety, this can only be `TypeError`.
+ return e is TypeError || e is ArgumentError;
}
return false;
}
diff --git a/tests/lib_2/async/futures_test.dart b/tests/lib_2/async/futures_test.dart
index 51a3018..a98d612 100644
--- a/tests/lib_2/async/futures_test.dart
+++ b/tests/lib_2/async/futures_test.dart
@@ -56,7 +56,7 @@
throw 'incorrect error';
}).catchError((error, stackTrace) {
Expect.equals('correct error', error);
- Expect.isNull(stackTrace);
+ Expect.isNotNull(stackTrace);
});
}
@@ -73,7 +73,7 @@
throw 'incorrect error 2';
}).catchError((error, stackTrace) {
Expect.equals('correct error', error);
- Expect.isNull(stackTrace);
+ Expect.isNotNull(stackTrace);
});
}
@@ -90,7 +90,7 @@
throw 'incorrect error 2';
}).catchError((error, stackTrace) {
Expect.equals('correct error', error);
- Expect.isNull(stackTrace);
+ Expect.isNotNull(stackTrace);
});
}
@@ -100,7 +100,7 @@
} catch (e, st) {
return st;
}
- return null;
+ throw "unreachable";
}
Future testWaitWithSingleErrorWithStackTrace() {
@@ -193,8 +193,8 @@
Future testForEachSync() {
final seen = <int>[];
- return Future.forEach([1, 2, 3, 4, 5], seen.add).then(
- (_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
+ return Future.forEach([1, 2, 3, 4, 5], seen.add)
+ .then((_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
}
Future testForEachWithException() {
diff --git a/tests/lib_2/async/stream_timeout_test.dart b/tests/lib_2/async/stream_timeout_test.dart
index eb33ad2..d0ddc0d 100644
--- a/tests/lib_2/async/stream_timeout_test.dart
+++ b/tests/lib_2/async/stream_timeout_test.dart
@@ -16,7 +16,7 @@
expect(tos.isBroadcast, false);
tos.handleError(expectAsync((e, s) {
expect(e, new isInstanceOf<TimeoutException>());
- expect(s, null);
+ expect(s, StackTrace.empty);
})).listen((v) {
fail("Unexpected event");
});
@@ -77,7 +77,7 @@
expect(tos.isBroadcast, true);
tos.handleError(expectAsync((e, s) {
expect(e, new isInstanceOf<TimeoutException>());
- expect(s, null);
+ expect(s, StackTrace.empty);
})).listen((v) {
fail("Unexpected event");
});
@@ -89,7 +89,7 @@
expect(tos.isBroadcast, true);
tos.handleError(expectAsync((e, s) {
expect(e, new isInstanceOf<TimeoutException>());
- expect(s, null);
+ expect(s, StackTrace.empty);
})).listen((v) {
fail("Unexpected event");
});
@@ -101,7 +101,7 @@
expect(tos.isBroadcast, false);
tos.handleError(expectAsync((e, s) {
expect(e, new isInstanceOf<TimeoutException>());
- expect(s, null);
+ expect(s, StackTrace.empty);
})).listen((v) {
fail("Unexpected event");
});
diff --git a/tests/lib_2/html/node_validator_important_if_you_suppress_make_the_bug_critical_test.dart b/tests/lib_2/html/node_validator_important_if_you_suppress_make_the_bug_critical_test.dart
index 194e43a..1b3ea60 100644
--- a/tests/lib_2/html/node_validator_important_if_you_suppress_make_the_bug_critical_test.dart
+++ b/tests/lib_2/html/node_validator_important_if_you_suppress_make_the_bug_critical_test.dart
@@ -428,6 +428,31 @@
"<form id='single_node_clobbering' onmouseover='alert(1)'><input name='attributes'>",
"");
+ testHtml('DOM clobbering of previousSibling',
+ validator,
+ 'https://example.com/<div><img/src="x"/onerror="alert();"/><form><input/name="previousSibling"></form></div>',
+ 'https://example.com/<div><img src="x"></div>'
+ );
+
+ // The lastChild and childNodes clobbering corrupts iterating the tree. They
+ // get removed, but in the meantime the evil node has been skipped. Note
+ // that we end up deleting the entire form because the clobbering makes its
+ // lastChild incorrect and we detect this, but only on the second time
+ // through.
+ testHtml('DOM clobbering of both childNodes and lastChild',
+ validator,
+ "abc<form><div><img src='x' onerror='alert(document.domain)'></div><div><input name='childNodes'><input id='lastChild' name='childNodes'></div></form>",
+ 'abc'
+ );
+
+ test('DOM clobbering of previousSibling via append', () {
+ var div = Element.div();
+ var bad =
+ 'https://example.com/<div><img/src="x"/onerror="alert();"/><form><input/name="previousSibling"></form></div>';
+ div.innerHtml = bad;
+ expect(div.innerHtml, 'https://example.com/<div><img src="x"></div>');
+ });
+
testHtml(
'DOM clobbering of attributes with multiple nodes',
validator,
diff --git a/tests/lib_2/isolate/count_test.dart b/tests/lib_2/isolate/count_test.dart
index 95e2e33..0095e60 100644
--- a/tests/lib_2/isolate/count_test.dart
+++ b/tests/lib_2/isolate/count_test.dart
@@ -8,8 +8,8 @@
library CountTest;
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
void countMessages(replyTo) {
int count = 0;
@@ -18,48 +18,46 @@
port.listen((_message) {
int message = _message;
if (message == -1) {
- expect(count, 10);
+ Expect.equals(count, 10);
replyTo.send(["done"]);
port.close();
return;
}
count++;
- expect(message, count);
+ Expect.equals(message, count);
replyTo.send(["count", message * 2]);
});
}
void main([args, port]) {
- if (testRemote(main, port)) return;
- test("count 10 consecutive messages", () {
- ReceivePort local = new ReceivePort();
- Isolate.spawn(countMessages, local.sendPort);
- SendPort remote;
- int count = 0;
- var done = expectAsync(() {});
- local.listen((msg) {
- switch (msg[0]) {
- case "init":
- expect(remote, null);
- remote = msg[1];
+ //testRemote(main, port);
+ ReceivePort local = new ReceivePort();
+ Isolate.spawn(countMessages, local.sendPort);
+ SendPort remote;
+ int count = 0;
+ asyncStart();
+ local.listen((msg) {
+ switch (msg[0]) {
+ case "init":
+ Expect.equals(remote, null);
+ remote = msg[1];
+ remote.send(++count);
+ break;
+ case "count":
+ Expect.equals(msg[1], count * 2);
+ if (count == 10) {
+ remote.send(-1);
+ } else {
remote.send(++count);
- break;
- case "count":
- expect(msg[1], count * 2);
- if (count == 10) {
- remote.send(-1);
- } else {
- remote.send(++count);
- }
- break;
- case "done":
- expect(count, 10);
- local.close();
- done();
- break;
- default:
- fail("unreachable: ${msg[0]}");
- }
- });
+ }
+ break;
+ case "done":
+ Expect.equals(count, 10);
+ local.close();
+ asyncEnd();
+ break;
+ default:
+ Expect.fail("unreachable: ${msg[0]}");
+ }
});
}
diff --git a/tests/lib_2/isolate/cross_isolate_message_test.dart b/tests/lib_2/isolate/cross_isolate_message_test.dart
index 7bcdd8d..ede3792 100644
--- a/tests/lib_2/isolate/cross_isolate_message_test.dart
+++ b/tests/lib_2/isolate/cross_isolate_message_test.dart
@@ -11,8 +11,8 @@
library CrossIsolateMessageTest;
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
/*
* Everything starts in the main-isolate (in the main-method).
@@ -30,7 +30,7 @@
mainIsolate.send(["ready1", local.sendPort]);
local.first.then((msg) {
// Message from crossIsolate2
- expect(msg[0], "fromIsolate2");
+ Expect.equals(msg[0], "fromIsolate2");
mainIsolate.send(["fromIsolate1", msg[1] + 58]); // 100.
});
}
@@ -40,24 +40,22 @@
}
void main([args, port]) {
- if (testRemote(main, port)) return;
- test("send message cross isolates ", () {
- ReceivePort fromIsolate1 = new ReceivePort();
- Isolate.spawn(crossIsolate1, fromIsolate1.sendPort);
- var done = expectAsync(() {});
- fromIsolate1.listen((msg) {
- switch (msg[0]) {
- case "ready1":
- SendPort toIsolate1 = msg[1];
- Isolate.spawn(crossIsolate2, toIsolate1);
- break;
- case "fromIsolate1":
- expect(msg[1], 100);
- fromIsolate1.close();
- break;
- default:
- fail("unreachable! Tag: ${msg[0]}");
- }
- }, onDone: done);
- });
+ ReceivePort fromIsolate1 = new ReceivePort();
+ Isolate.spawn(crossIsolate1, fromIsolate1.sendPort);
+
+ asyncStart();
+ fromIsolate1.listen((msg) {
+ switch (msg[0]) {
+ case "ready1":
+ SendPort toIsolate1 = msg[1];
+ Isolate.spawn(crossIsolate2, toIsolate1);
+ break;
+ case "fromIsolate1":
+ Expect.equals(msg[1], 100);
+ fromIsolate1.close();
+ break;
+ default:
+ Expect.fail("unreachable! Tag: ${msg[0]}");
+ }
+ }, onDone: asyncEnd);
}
diff --git a/tests/lib_2/isolate/mandel_isolate_test.dart b/tests/lib_2/isolate/mandel_isolate_test.dart
index 84f7d14..99f5e48 100644
--- a/tests/lib_2/isolate/mandel_isolate_test.dart
+++ b/tests/lib_2/isolate/mandel_isolate_test.dart
@@ -10,25 +10,22 @@
import 'dart:async';
import 'dart:isolate';
import 'dart:math';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
const TERMINATION_MESSAGE = -1;
const N = 100;
const ISOLATES = 20;
void main([args, port]) {
- if (testRemote(main, port)) return;
- // Test is really slow in debug builds of the VM.
- var configuration = unittestConfiguration;
- configuration.timeout = const Duration(seconds: 480);
- test("Render Mandelbrot in parallel", () {
- final state = new MandelbrotState();
- state._validated.future.then(expectAsync((result) {
- expect(result, isTrue);
- }));
- for (int i = 0; i < min(ISOLATES, N); i++) state.startClient(i);
+ final state = new MandelbrotState();
+ asyncStart();
+ state._validated.future.then((result) {
+ Expect.isTrue(result);
+ asyncEnd();
});
+ for (int i = 0; i < min(ISOLATES, N); i++) state.startClient(i);
}
class MandelbrotState {
diff --git a/tests/lib_2/isolate/message2_test.dart b/tests/lib_2/isolate/message2_test.dart
index cb625a4..7c2e691 100644
--- a/tests/lib_2/isolate/message2_test.dart
+++ b/tests/lib_2/isolate/message2_test.dart
@@ -11,8 +11,8 @@
library Message2Test;
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
// ---------------------------------------------------------------------------
// Message passing test 2.
@@ -20,14 +20,12 @@
class MessageTest {
static void mapEqualsDeep(Map expected, Map actual) {
- expect(expected, isMap);
- expect(actual, isMap);
- expect(actual.length, expected.length);
+ Expect.equals(actual.length, expected.length);
testForEachMap(key, value) {
if (value is List) {
listEqualsDeep(value, actual[key]);
} else {
- expect(actual[key], value);
+ Expect.equals(actual[key], value);
}
}
@@ -37,11 +35,13 @@
static void listEqualsDeep(List expected, List actual) {
for (int i = 0; i < expected.length; i++) {
if (expected[i] is List) {
+ Expect.type<List>(actual[i]);
listEqualsDeep(expected[i], actual[i]);
} else if (expected[i] is Map) {
+ Expect.type<Map>(actual[i]);
mapEqualsDeep(expected[i], actual[i]);
} else {
- expect(actual[i], expected[i]);
+ Expect.equals(actual[i], expected[i]);
}
}
}
@@ -50,7 +50,8 @@
void pingPong(replyPort) {
ReceivePort port = new ReceivePort();
port.listen((message) {
- if (message == null) {
+ if (message is SendPort) {
+ message.send('done');
port.close();
} else {
// Bounce the received object back so that the sender
@@ -62,22 +63,25 @@
}
void main([args, port]) {
- if (testRemote(main, port)) return;
- test("map is equal after it is sent back and forth", () {
- ReceivePort port = new ReceivePort();
- Isolate.spawn(pingPong, port.sendPort);
- port.first.then(expectAsync((remote) {
- Map m = new Map();
- m[1] = "eins";
- m[2] = "deux";
- m[3] = "tre";
- m[4] = "four";
- ReceivePort replyPort = new ReceivePort();
- remote.send([m, replyPort.sendPort]);
- replyPort.first.then(expectAsync((var received) {
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(pingPong, port.sendPort);
+ asyncStart();
+ port.first.then((remote) {
+ Map m = new Map();
+ m[1] = "eins";
+ m[2] = "deux";
+ m[3] = "tre";
+ m[4] = "four";
+ ReceivePort replyPort = new ReceivePort();
+ remote.send([m, replyPort.sendPort]);
+ replyPort.listen((var received) {
+ if (received == 'done') {
+ replyPort.close();
+ asyncEnd();
+ } else {
MessageTest.mapEqualsDeep(m, received);
- remote.send(null);
- }));
- }));
+ remote.send(replyPort.sendPort);
+ }
+ });
});
}
diff --git a/tests/lib_2/isolate/message_test.dart b/tests/lib_2/isolate/message_test.dart
index 73db18a..1d7cd78 100644
--- a/tests/lib_2/isolate/message_test.dart
+++ b/tests/lib_2/isolate/message_test.dart
@@ -10,10 +10,11 @@
library MessageTest;
-import 'dart:isolate';
import 'dart:async';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'dart:isolate';
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
// ---------------------------------------------------------------------------
// Message passing test.
@@ -42,14 +43,12 @@
];
static void VerifyMap(Map expected, Map actual) {
- expect(expected, isMap);
- expect(actual, isMap);
- expect(actual.length, expected.length);
+ Expect.equals(actual.length, expected.length);
testForEachMap(key, value) {
if (value is List) {
VerifyList(value, actual[key]);
} else {
- expect(actual[key], value);
+ Expect.equals(actual[key], value);
}
}
@@ -61,18 +60,19 @@
if (expected[i] is List) {
VerifyList(expected[i], actual[i]);
} else if (expected[i] is Map) {
+ Expect.type<Map>(actual[i]);
VerifyMap(expected[i], actual[i]);
} else {
- expect(actual[i], expected[i]);
+ Expect.equals(actual[i], expected[i]);
}
}
}
static void VerifyObject(int index, var actual) {
var expected = elms[index];
- expect(expected, isList);
- expect(actual, isList);
- expect(actual.length, expected.length);
+ Expect.type<List>(expected);
+ Expect.type<List>(actual);
+ Expect.equals(actual.length, expected.length);
VerifyList(expected, actual);
}
}
@@ -107,46 +107,47 @@
}
void main([args, port]) {
- if (testRemote(main, port)) return;
- test("send objects and receive them back", () {
- ReceivePort port = new ReceivePort();
- Isolate.spawn(pingPong, port.sendPort);
- port.first.then(expectAsync1((remote) {
- // Send objects and receive them back.
- for (int i = 0; i < MessageTest.elms.length; i++) {
- var sentObject = MessageTest.elms[i];
- remoteCall(remote, sentObject).then(expectAsync1((receivedObject) {
- MessageTest.VerifyObject(i, receivedObject);
- }));
- }
-
- // Send recursive objects and receive them back.
- List local_list1 = ["Hello", "World", "Hello", 0xffffffffff];
- List local_list2 = [null, local_list1, local_list1];
- List local_list3 = [local_list2, 2.0, true, false, 0xffffffffff];
- List sendObject = new List(5);
- sendObject[0] = local_list1;
- sendObject[1] = sendObject;
- sendObject[2] = local_list2;
- sendObject[3] = sendObject;
- sendObject[4] = local_list3;
- remoteCall(remote, sendObject).then((var replyObject) {
- expect(sendObject, isList);
- expect(replyObject, isList);
- expect(sendObject.length, equals(replyObject.length));
- expect(replyObject[1], same(replyObject));
- expect(replyObject[3], same(replyObject));
- expect(replyObject[0], same(replyObject[2][1]));
- expect(replyObject[0], same(replyObject[2][2]));
- expect(replyObject[2], same(replyObject[4][0]));
- expect(replyObject[0][0], same(replyObject[0][2]));
- expect(replyObject[0][3], equals(replyObject[4][4]));
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(pingPong, port.sendPort);
+ asyncStart();
+ port.first.then((remote) {
+ // Send objects and receive them back.
+ for (int i = 0; i < MessageTest.elms.length; i++) {
+ var sentObject = MessageTest.elms[i];
+ asyncStart();
+ remoteCall(remote, sentObject).then((receivedObject) {
+ MessageTest.VerifyObject(i, receivedObject);
+ asyncEnd();
});
+ }
- // Shutdown the MessageServer.
- remoteCall(remote, -1).then(expectAsync1((message) {
- expect(message, MessageTest.elms.length + 1);
- }));
- }));
+ // Send recursive objects and receive them back.
+ List local_list1 = ["Hello", "World", "Hello", 0xffffffffff];
+ List local_list2 = [null, local_list1, local_list1];
+ List local_list3 = [local_list2, 2.0, true, false, 0xffffffffff];
+ List sendObject = new List(5);
+ sendObject[0] = local_list1;
+ sendObject[1] = sendObject;
+ sendObject[2] = local_list2;
+ sendObject[3] = sendObject;
+ sendObject[4] = local_list3;
+ remoteCall(remote, sendObject).then((var replyObject) {
+ Expect.type<List>(sendObject);
+ Expect.type<List>(replyObject);
+ Expect.equals(sendObject.length, replyObject.length);
+ Expect.identical(replyObject[1], replyObject);
+ Expect.identical(replyObject[3], replyObject);
+ Expect.identical(replyObject[0], replyObject[2][1]);
+ Expect.identical(replyObject[0], replyObject[2][2]);
+ Expect.identical(replyObject[2], replyObject[4][0]);
+ Expect.identical(replyObject[0][0], replyObject[0][2]);
+ Expect.equals(replyObject[0][3], replyObject[4][4]);
+ });
+
+ // Shutdown the MessageServer.
+ remoteCall(remote, -1).then((message) {
+ Expect.equals(message, MessageTest.elms.length + 1);
+ asyncEnd();
+ });
});
}
diff --git a/tests/lib_2/isolate/mint_maker_test.dart b/tests/lib_2/isolate/mint_maker_test.dart
index fb6eb87..18bbb91 100644
--- a/tests/lib_2/isolate/mint_maker_test.dart
+++ b/tests/lib_2/isolate/mint_maker_test.dart
@@ -9,8 +9,8 @@
import 'dart:async';
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
class Mint {
Map<SendPort, Purse> _registry;
@@ -141,8 +141,7 @@
static Future<MintMakerWrapper> create() {
ReceivePort reply = new ReceivePort();
- return Isolate
- .spawn(mintMakerWrapper, reply.sendPort)
+ return Isolate.spawn(mintMakerWrapper, reply.sendPort)
.then((_) => reply.first.then((port) => new MintMakerWrapper._(port)));
}
@@ -158,32 +157,31 @@
}
_checkBalance(PurseWrapper wrapper, expected) {
- wrapper.queryBalance(expectAsync1((balance) {
- expect(balance, equals(expected));
- }));
+ wrapper.queryBalance((balance) {
+ Expect.equals(balance, expected);
+ });
}
void main([args, port]) {
- if (testRemote(main, port)) return;
- test("creating purse, deposit, and query balance", () {
- MintMakerWrapper.create().then(expectAsync1((mintMaker) {
- mintMaker.makeMint(expectAsync1((mint) {
- mint.createPurse(100, expectAsync1((purse) {
+ asyncStart();
+ MintMakerWrapper.create().then((mintMaker) {
+ mintMaker.makeMint((mint) {
+ mint.createPurse(100, (purse) {
+ _checkBalance(purse, 100);
+ purse.sproutPurse((sprouted) {
+ _checkBalance(sprouted, 0);
_checkBalance(purse, 100);
- purse.sproutPurse(expectAsync1((sprouted) {
- _checkBalance(sprouted, 0);
- _checkBalance(purse, 100);
- sprouted.deposit(purse, 5);
- _checkBalance(sprouted, 0 + 5);
- _checkBalance(purse, 100 - 5);
+ sprouted.deposit(purse, 5);
+ _checkBalance(sprouted, 0 + 5);
+ _checkBalance(purse, 100 - 5);
- sprouted.deposit(purse, 42);
- _checkBalance(sprouted, 0 + 5 + 42);
- _checkBalance(purse, 100 - 5 - 42);
- }));
- }));
- }));
- }));
+ sprouted.deposit(purse, 42);
+ _checkBalance(sprouted, 0 + 5 + 42);
+ _checkBalance(purse, 100 - 5 - 42);
+ asyncEnd();
+ });
+ });
+ });
});
}
diff --git a/tests/lib_2/isolate/nested_spawn2_test.dart b/tests/lib_2/isolate/nested_spawn2_test.dart
index 1a9fa6a..d335909 100644
--- a/tests/lib_2/isolate/nested_spawn2_test.dart
+++ b/tests/lib_2/isolate/nested_spawn2_test.dart
@@ -12,14 +12,14 @@
library NestedSpawn2Test;
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
void isolateA(SendPort init) {
ReceivePort port = new ReceivePort();
init.send(port.sendPort);
port.first.then((message) {
- expect(message[0], "launch nested!");
+ Expect.equals(message[0], "launch nested!");
SendPort replyTo = message[1];
Isolate.spawn(isolateB, replyTo);
});
@@ -45,11 +45,11 @@
// Do a little ping-pong dance to give the intermediate isolate
// time to die.
_call(mainPort, msg0, ((msg, replyTo) {
- expect(msg[0], "1");
+ Expect.equals(msg[0], "1");
_call(replyTo, msg2, ((msg, replyTo) {
- expect(msg[0], "3");
+ Expect.equals(msg[0], "3");
_call(replyTo, msg4, ((msg, replyTo) {
- expect(msg[0], "5");
+ Expect.equals(msg[0], "5");
replyTo.send([msg6, null]);
}));
}));
@@ -57,23 +57,23 @@
}
void main([args, port]) {
- if (testRemote(main, port)) return;
- test("spawned isolate can spawn other isolates", () {
- ReceivePort init = new ReceivePort();
- Isolate.spawn(isolateA, init.sendPort);
- return init.first.then(expectAsync((port) {
- _call(port, "launch nested!", expectAsync((msg, replyTo) {
- expect(msg[0], "0");
- _call(replyTo, msg1, expectAsync((msg, replyTo) {
- expect(msg[0], "2");
- _call(replyTo, msg3, expectAsync((msg, replyTo) {
- expect(msg[0], "4");
- _call(replyTo, msg5, expectAsync((msg, _) {
- expect(msg[0], "6");
- }));
- }));
- }));
- }));
- }));
+ // spawned isolate can spawn other isolates
+ ReceivePort init = new ReceivePort();
+ Isolate.spawn(isolateA, init.sendPort);
+ asyncStart();
+ init.first.then((port) {
+ _call(port, "launch nested!", (msg, replyTo) {
+ Expect.equals(msg[0], "0");
+ _call(replyTo, msg1, (msg, replyTo) {
+ Expect.equals(msg[0], "2");
+ _call(replyTo, msg3, (msg, replyTo) {
+ Expect.equals(msg[0], "4");
+ _call(replyTo, msg5, (msg, _) {
+ Expect.equals(msg[0], "6");
+ asyncEnd();
+ });
+ });
+ });
+ });
});
}
diff --git a/tests/lib_2/isolate/nested_spawn_test.dart b/tests/lib_2/isolate/nested_spawn_test.dart
index a1d6538..0bc8c77 100644
--- a/tests/lib_2/isolate/nested_spawn_test.dart
+++ b/tests/lib_2/isolate/nested_spawn_test.dart
@@ -10,8 +10,8 @@
library NestedSpawnTest;
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
void isolateA(message) {
message.add("isolateA");
@@ -24,14 +24,14 @@
}
void main([args, port]) {
- if (testRemote(main, port)) return;
- test("spawned isolates can spawn nested isolates", () {
- ReceivePort port = new ReceivePort();
- Isolate.spawn(isolateA, [port.sendPort, "main"]);
- return port.first.then((message) {
- expect("main", message[1]);
- expect("isolateA", message[2]);
- expect("isolateB", message[3]);
- });
+ // spawned isolates can spawn nested isolates
+ ReceivePort port = new ReceivePort();
+ Isolate.spawn(isolateA, [port.sendPort, "main"]);
+ asyncStart();
+ port.first.then((message) {
+ Expect.equals("main", message[1]);
+ Expect.equals("isolateA", message[2]);
+ Expect.equals("isolateB", message[3]);
+ asyncEnd();
});
}
diff --git a/tests/lib_2/isolate/port_test.dart b/tests/lib_2/isolate/port_test.dart
index 5d70832..e946542 100644
--- a/tests/lib_2/isolate/port_test.dart
+++ b/tests/lib_2/isolate/port_test.dart
@@ -6,9 +6,6 @@
// VMOptions=--no-enable-isolate-groups
// Test properties of ports.
-// Note: unittest.dart depends on ports, in particular on the behaviour tested
-// here. To keep things simple, we don't use the unittest library here.
-
library PortTest;
import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/raw_port_test.dart b/tests/lib_2/isolate/raw_port_test.dart
index 8b3463a..6f24212 100644
--- a/tests/lib_2/isolate/raw_port_test.dart
+++ b/tests/lib_2/isolate/raw_port_test.dart
@@ -9,9 +9,10 @@
library raw_port_test;
+import 'dart:async';
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import 'remote_unittest_helper.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
void remote(SendPort port) {
port.send("reply");
@@ -22,52 +23,63 @@
port.send("reply 2");
}
-main([args, port]) {
- if (testRemote(main, port)) return;
-
- test("raw receive", () {
+main([args, port]) async {
+ // Raw receive
+ asyncTest(() {
+ final completer = Completer<void>();
RawReceivePort port = new RawReceivePort();
Isolate.spawn(remote, port.sendPort);
- port.handler = expectAsync((v) {
- expect(v, "reply");
+ port.handler = (v) {
+ Expect.equals(v, "reply");
port.close();
- });
+ completer.complete();
+ };
+ return completer.future;
});
- test("raw receive hashCode", () {
+ // Raw receive hashCode
+ {
RawReceivePort port = new RawReceivePort();
- expect(port.hashCode is int, true);
+ Expect.isTrue(port.hashCode is int);
port.close();
- });
+ }
- test("raw receive twice - change handler", () {
+ // Raw receive twice - change handler
+ asyncTest(() {
+ final completer = Completer<void>();
RawReceivePort port = new RawReceivePort();
Isolate.spawn(remote2, port.sendPort);
- port.handler = expectAsync((v) {
- expect(v, "reply 1");
- port.handler = expectAsync((v) {
- expect(v, "reply 2");
+ port.handler = (v) {
+ Expect.equals(v, "reply 1");
+ port.handler = (v) {
+ Expect.equals(v, "reply 2");
port.close();
- });
- });
+ completer.complete();
+ };
+ };
+ return completer.future;
});
- test("from-raw-port", () {
+ // From raw port
+ asyncTest(() {
+ final completer = Completer<void>();
RawReceivePort rawPort = new RawReceivePort();
Isolate.spawn(remote, rawPort.sendPort);
- rawPort.handler = expectAsync((v) {
- expect(v, "reply");
+ rawPort.handler = (v) {
+ Expect.equals(v, "reply");
ReceivePort port = new ReceivePort.fromRawReceivePort(rawPort);
Isolate.spawn(remote, rawPort.sendPort);
Isolate.spawn(remote, port.sendPort);
int ctr = 2;
port.listen(
- expectAsync((v) {
- expect(v, "reply");
- ctr--;
- if (ctr == 0) port.close();
- }, count: 2),
- onDone: expectAsync(() {}));
- });
+ (v) {
+ Expect.equals(v, "reply");
+ ctr--;
+ if (ctr == 0) port.close();
+ },
+ onDone: () => completer.complete(),
+ );
+ };
+ return completer.future;
});
}
diff --git a/tests/lib_2/isolate/remote_unittest_helper.dart b/tests/lib_2/isolate/remote_unittest_helper.dart
deleted file mode 100644
index ea440d1..0000000
--- a/tests/lib_2/isolate/remote_unittest_helper.dart
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (c) 2013, 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.
-
-// Helper functions and classes for running a set of unittests in a
-// remote isolate.
-// Used to test Isolate.spawn because dartium/drt does not allow it in the DOM
-// isolate.
-
-import "dart:isolate";
-import "package:unittest/unittest.dart";
-import "dart:mirrors";
-
-/**
- * Use this function at the beginning of the main method:
- *
- * void main([args, port]) {
- * if (testRemote(main, port)) return;
- * // the usual test.
- * }
- *
- * Remember to import unittest using the URI `package:unittest/unittest.dart`.
- * Otherwise it won't be sharing the `unittestConfiguration` with this library,
- * and the override set below won't work.
- *
- * Returns `true` if the tests are being run remotely, and
- * `false` if the tests should be run locally.
- */
-bool testRemote(Function main, SendPort port) {
- if (port != null) {
- unittestConfiguration = new RemoteConfiguration(port);
- return false;
- }
- var testResponses = new Map<String, List>();
-
- ClosureMirror closure = reflect(main);
- LibraryMirror library = closure.function.owner;
-
- var receivePort = new ReceivePort();
- void remoteAction(message) {
- switch (message[0]) {
- case "testStart":
- String name = message[1];
- testResponses[name] = null;
- break;
- case "testResult":
- case "testResultChanged":
- String name = message[1];
- testResponses[name] = message;
- break;
- case "logMessage":
- break; // Ignore.
- case "summary":
- throw message[1]; // Uncaught error.
- case "done":
- receivePort.close();
- _simulateTests(testResponses);
- break;
- }
- }
-
- try {
- Isolate.spawnUri(library.uri, null, receivePort.sendPort);
- receivePort.listen(remoteAction);
- return true;
- } catch (e) {
- // spawnUri is only supported by dart2js if web workers are available.
- // If the spawnUri fails, run the tests locally instead, since we are
- // not in a browser anyway.
- //
- // That is, we assume that either Isolate.spawn or Isolate.spawnUri must
- // work, so if spawnUri doesn't work, we can run the tests directly.
- receivePort.close();
- return false;
- }
-}
-
-class RemoteConfiguration implements Configuration {
- final SendPort _port;
- Duration timeout = const Duration(minutes: 2);
-
- RemoteConfiguration(this._port);
-
- bool get autoStart => true;
-
- void onInit() {}
-
- void onStart() {}
-
- void onTestStart(TestCase testCase) {
- _port.send(["testStart", testCase.description]);
- }
-
- void onTestResult(TestCase testCase) {
- _port.send([
- "testResult",
- testCase.description,
- testCase.result,
- testCase.message
- ]);
- }
-
- void onTestResultChanged(TestCase testCase) {
- _port.send([
- "testResultChanged",
- testCase.description,
- testCase.result,
- testCase.message
- ]);
- }
-
- void onLogMessage(TestCase testCase, String message) {
- _port.send(["logMessage", testCase.description, message]);
- }
-
- void onDone(bool success) {
- _port.send(["done", success]);
- }
-
- void onSummary(int passed, int failed, int errors, List<TestCase> results,
- String uncaughtError) {
- if (uncaughtError != null) {
- _port.send(["summary", uncaughtError]);
- }
- }
-}
-
-void _simulateTests(Map<String, List> responses) {
- // Start all unit tests in the same event.
- responses.forEach((name, response) {
- test(name, () {
- var result = response[2];
- var message = response[3];
- if (result == FAIL) {
- fail(message);
- } else if (result == ERROR) {
- throw message;
- }
- });
- });
-}
diff --git a/tests/lib_2/isolate/request_reply_test.dart b/tests/lib_2/isolate/request_reply_test.dart
index 3c8aed0..54d4d7c 100644
--- a/tests/lib_2/isolate/request_reply_test.dart
+++ b/tests/lib_2/isolate/request_reply_test.dart
@@ -8,8 +8,8 @@
library RequestReplyTest;
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
void entry(initPort) {
ReceivePort port = new ReceivePort();
@@ -23,17 +23,16 @@
}
void main([args, port]) {
- if (testRemote(main, port)) return;
- test("send", () {
- ReceivePort init = new ReceivePort();
- Isolate.spawn(entry, init.sendPort);
- init.first.then(expectAsync((port) {
- ReceivePort reply = new ReceivePort();
- port.send([99, reply.sendPort]);
- reply.listen(expectAsync((message) {
- expect(message, 99 + 87);
- reply.close();
- }));
- }));
+ ReceivePort init = new ReceivePort();
+ Isolate.spawn(entry, init.sendPort);
+ asyncStart();
+ init.first.then((port) {
+ ReceivePort reply = new ReceivePort();
+ port.send([99, reply.sendPort]);
+ reply.listen((message) {
+ Expect.equals(message, 99 + 87);
+ reply.close();
+ asyncEnd();
+ });
});
}
diff --git a/tests/lib_2/isolate/spawn_function_custom_class_test.dart b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
index 8ef17c4..0046cef 100644
--- a/tests/lib_2/isolate/spawn_function_custom_class_test.dart
+++ b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
@@ -13,8 +13,7 @@
library spawn_tests;
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:expect/expect.dart';
class MyClass {
final myVar = 'there';
@@ -29,26 +28,21 @@
reply.send('re: ${new MyClass().myFunc(msg)}');
}
-void main([args, port]) {
- if (testRemote(main, port)) {
- return;
- }
+Future<void> main([args, port]) async {
+ // message - reply chain'
+ final exitPort = ReceivePort();
+ final replyPort = ReceivePort();
- test('message - reply chain', () async {
- final exitPort = ReceivePort();
- final replyPort = ReceivePort();
+ Isolate.spawn(isolateEntryPoint, ['hi', replyPort.sendPort],
+ onExit: exitPort.sendPort);
- final isolate = Isolate.spawn(isolateEntryPoint, ['hi', replyPort.sendPort],
- onExit: exitPort.sendPort);
-
- replyPort.listen((msg) {
- replyPort.close();
- expect(msg, equals('re: hi there'));
- });
-
- // Explicitly await spawned isolate exit to enforce main isolate not
- // completing (and the stand-alone runtime exiting) before the spawned
- // isolate is done.
- await exitPort.first;
+ replyPort.listen((msg) {
+ replyPort.close();
+ Expect.equals(msg, 're: hi there');
});
+
+ // Explicitly await spawned isolate exit to enforce main isolate not
+ // completing (and the stand-alone runtime exiting) before the spawned
+ // isolate is done.
+ await exitPort.first;
}
diff --git a/tests/lib_2/isolate/spawn_function_test.dart b/tests/lib_2/isolate/spawn_function_test.dart
index 31cb54c..fb90ba4 100644
--- a/tests/lib_2/isolate/spawn_function_test.dart
+++ b/tests/lib_2/isolate/spawn_function_test.dart
@@ -9,8 +9,8 @@
library spawn_tests;
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
isolateEntryPoint(args) {
var msg = args[0];
@@ -18,29 +18,24 @@
sendPort.send('re: $msg');
}
-void main([args, port]) {
- if (testRemote(main, port)) {
- return;
- }
+Future<void> main([args, port]) async {
+ // message - reply chain
+ const String debugName = 'spawnedIsolate';
- test('message - reply chain', () async {
- const String debugName = 'spawnedIsolate';
-
- ReceivePort port = new ReceivePort();
- port.listen(expectAsync((msg) {
- port.close();
- expect(msg, equals('re: hi'));
- }));
-
- // Start new isolate; paused so it's alive till we read the debugName.
- // If the isolate runs to completion, the isolate might get cleaned up
- // and debugName might be null.
- final isolate = await Isolate.spawn(
- isolateEntryPoint, ['hi', port.sendPort],
- paused: true, debugName: debugName);
-
- expect(isolate.debugName, debugName);
-
- isolate.resume(isolate.pauseCapability);
+ ReceivePort port = new ReceivePort();
+ asyncStart();
+ port.listen((msg) {
+ port.close();
+ Expect.equals(msg, 're: hi');
+ asyncEnd();
});
+
+ // Start new isolate; paused so it's alive till we read the debugName.
+ // If the isolate runs to completion, the isolate might get cleaned up
+ // and debugName might be null.
+ final isolate = await Isolate.spawn(isolateEntryPoint, ['hi', port.sendPort],
+ paused: true, debugName: debugName);
+
+ Expect.equals(isolate.debugName, debugName);
+ isolate.resume(isolate.pauseCapability);
}
diff --git a/tests/lib_2/isolate/static_function_test.dart b/tests/lib_2/isolate/static_function_test.dart
index b1e115e..1c785a5 100644
--- a/tests/lib_2/isolate/static_function_test.dart
+++ b/tests/lib_2/isolate/static_function_test.dart
@@ -10,10 +10,9 @@
library static_function_test;
import 'dart:isolate';
-import 'dart:async';
import 'static_function_lib.dart' as lib;
-import 'package:unittest/unittest.dart';
-import 'remote_unittest_helper.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
void function(SendPort port) {
port.send("TOP");
@@ -95,26 +94,28 @@
}
void spawnTest(name, function, response) {
- test(name, () {
- ReceivePort r = new ReceivePort();
- Isolate.spawn(function, r.sendPort);
- r.listen(expectAsync((v) {
- expect(v, response);
- r.close();
- }));
+ print(name);
+ ReceivePort r = new ReceivePort();
+ Isolate.spawn(function, r.sendPort);
+ asyncStart();
+ r.listen((v) {
+ Expect.equals(v, response);
+ r.close();
+ asyncEnd();
});
}
void functionFailTest(name, function) {
- test("throws on $name", () {
- Isolate.spawn(function, null).catchError(expectAsync((e) {
- /* do nothing */
- }));
+ print("throws on $name");
+ asyncStart();
+ Isolate.spawn(function, null).catchError((e) {
+ /* do nothing */
+ asyncEnd();
});
}
void main([args, port]) {
- if (testRemote(main, port)) return;
+ asyncStart();
// Sanity check.
spawnTest("function", function, "TOP");
spawnTest("_function", _function, "_TOP");
@@ -144,4 +145,5 @@
functionFailTest(
"named constructor closure", new C().namedConstructorBodyClosure);
functionFailTest("instance method", new C().instanceMethod);
+ asyncEnd();
}
diff --git a/tests/lib_2/isolate/unresolved_ports_test.dart b/tests/lib_2/isolate/unresolved_ports_test.dart
index 78bef1a..7707fab 100644
--- a/tests/lib_2/isolate/unresolved_ports_test.dart
+++ b/tests/lib_2/isolate/unresolved_ports_test.dart
@@ -10,8 +10,8 @@
import 'dart:async';
import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
// This test does the following:
// - main spawns two isolates: 'tim' and 'beth'
@@ -57,32 +57,27 @@
}
baseTest({bool failForNegativeTest: false}) {
- test('Message chain with unresolved ports', () {
- ReceivePort port = new ReceivePort();
- port.listen(expectAsync((msg) {
- expect(
- msg,
- equals('main says: Beth, find out if Tim is coming.'
- '\nBeth says: Tim are you coming? And Bob?'
- '\nTim says: Can you tell "main" that we are all coming?'
- '\nBob says: we are all coming!'));
- expect(failForNegativeTest, isFalse);
- port.close();
- }));
+ // Message chain with unresolved ports
+ ReceivePort port = new ReceivePort();
+ asyncStart();
+ port.listen((msg) {
+ Expect.equals(
+ msg,
+ 'main says: Beth, find out if Tim is coming.'
+ '\nBeth says: Tim are you coming? And Bob?'
+ '\nTim says: Can you tell "main" that we are all coming?'
+ '\nBob says: we are all coming!');
+ Expect.isFalse(failForNegativeTest);
+ port.close();
+ asyncEnd();
+ });
- spawnFunction(timIsolate).then((tim) {
- spawnFunction(bethIsolate).then((beth) {
- beth.send([
- 'main says: Beth, find out if Tim is coming.',
- tim,
- port.sendPort
- ]);
- });
+ spawnFunction(timIsolate).then((tim) {
+ spawnFunction(bethIsolate).then((beth) {
+ beth.send(
+ ['main says: Beth, find out if Tim is coming.', tim, port.sendPort]);
});
});
}
-void main([args, port]) {
- if (testRemote(main, port)) return;
- baseTest();
-}
+void main([args, port]) => baseTest();
diff --git a/tests/search/.blazeproject b/tests/search/.blazeproject
deleted file mode 100644
index feb408a..0000000
--- a/tests/search/.blazeproject
+++ /dev/null
@@ -1,7 +0,0 @@
-directories:
- crm/greentea/fe3/service/search
-
-targets:
- //crm/greentea/fe3/service/search/...:all
-additional_languages:
- dart
\ No newline at end of file
diff --git a/tests/standalone/io/addlatexhash_test.dart b/tests/standalone/io/addlatexhash_test.dart
index fe8c166..50c778a 100755
--- a/tests/standalone/io/addlatexhash_test.dart
+++ b/tests/standalone/io/addlatexhash_test.dart
@@ -73,8 +73,7 @@
// file names/paths for file containing groups of 8 variants of a paragraph
const par8timesName = "addlatexhash_test_src";
const par8timesFileName = "$par8timesName.tex";
- final par8timesDirPath =
- path.join(dartRootDir, "tests", "standalone_2", "io");
+ final par8timesDirPath = path.join(dartRootDir, "tests", "standalone", "io");
final par8timesPath = path.join(par8timesDirPath, par8timesFileName);
final tmpPar8timesPath = path.join(tmpDirPath, par8timesFileName);
diff --git a/tests/standalone/io/dart_std_io_pipe_test.dart b/tests/standalone/io/dart_std_io_pipe_test.dart
index 7d3e6fc..3163d7e 100644
--- a/tests/standalone/io/dart_std_io_pipe_test.dart
+++ b/tests/standalone/io/dart_std_io_pipe_test.dart
@@ -105,16 +105,15 @@
// Get the shell script for testing the Standalone Dart VM with
// piping and redirections of stdio.
- var shellScript = new File("tests/standalone_2/io/dart_std_io_pipe_test.sh");
+ var shellScript = new File("tests/standalone/io/dart_std_io_pipe_test.sh");
if (!shellScript.existsSync()) {
- shellScript = new File("../tests/standalone_2/io/dart_std_io_pipe_test.sh");
+ shellScript = new File("../tests/standalone/io/dart_std_io_pipe_test.sh");
}
// Get the Dart script file which echoes stdin to stdout or stderr or both.
- var scriptFile =
- new File("tests/standalone_2/io/dart_std_io_pipe_script.dart");
+ var scriptFile = new File("tests/standalone/io/dart_std_io_pipe_script.dart");
if (!scriptFile.existsSync()) {
scriptFile =
- new File("../tests/standalone_2/io/dart_std_io_pipe_script.dart");
+ new File("../tests/standalone/io/dart_std_io_pipe_script.dart");
}
// Run the shell script.
diff --git a/tests/standalone/io/directory_fuzz_test.dart b/tests/standalone/io/directory_fuzz_test.dart
index f76fc79..358bcff 100644
--- a/tests/standalone/io/directory_fuzz_test.dart
+++ b/tests/standalone/io/directory_fuzz_test.dart
@@ -18,9 +18,10 @@
doItSync(() {
Directory.systemTemp.createTempSync(v as String?).deleteSync();
});
- late Directory d;
- doItSync(() => d = new Directory(v as String));
- if (d == null) return;
+ Directory? directory;
+ doItSync(() => directory = new Directory(v as String));
+ if (directory == null) return;
+ final d = directory!;
doItSync(d.existsSync);
doItSync(d.createSync);
doItSync(d.deleteSync);
diff --git a/tests/standalone/io/file_fuzz_test.dart b/tests/standalone/io/file_fuzz_test.dart
index 82dd4ac..f7f89c8 100644
--- a/tests/standalone/io/file_fuzz_test.dart
+++ b/tests/standalone/io/file_fuzz_test.dart
@@ -15,9 +15,10 @@
fuzzSyncMethods() {
typeMapping.forEach((k, v) {
- late File f;
- doItSync(() => f = new File(v as String));
- if (f == null) return;
+ File? file;
+ doItSync(() => file = new File(v as String));
+ if (file == null) return;
+ final f = file!;
doItSync(f.existsSync);
doItSync(f.createSync);
doItSync(f.deleteSync);
@@ -41,9 +42,10 @@
asyncStart();
var futures = <Future>[];
typeMapping.forEach((k, v) {
- late File f;
- doItSync(() => f = new File(v as String));
- if (f == null) return;
+ File? file;
+ doItSync(() => file = new File(v as String));
+ if (file == null) return;
+ final f = file!;
futures.add(doItAsync(f.exists));
futures.add(doItAsync(f.delete));
futures.add(doItAsync(() => f.parent));
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index d1d0b8c..5617498 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -259,6 +259,25 @@
}
HeaderValue headerValue;
+ headerValue = HeaderValue.parse("");
+ check(headerValue, "", {});
+ headerValue = HeaderValue.parse(";");
+ check(headerValue, "", {});
+ headerValue = HeaderValue.parse(";;");
+ check(headerValue, "", {});
+ headerValue = HeaderValue.parse("v;a");
+ check(headerValue, "v", {"a": null});
+ headerValue = HeaderValue.parse("v;a=");
+ check(headerValue, "v", {"a": ""});
+ Expect.throws(() => HeaderValue.parse("v;a=\""), (e) => e is HttpException);
+ headerValue = HeaderValue.parse("v;a=\"\"");
+ check(headerValue, "v", {"a": ""});
+ Expect.throws(() => HeaderValue.parse("v;a=\"\\"), (e) => e is HttpException);
+ Expect.throws(
+ () => HeaderValue.parse("v;a=\";b=\"c\""), (e) => e is HttpException);
+ Expect.throws(() => HeaderValue.parse("v;a=b c"), (e) => e is HttpException);
+ headerValue = HeaderValue.parse("æ;ø=å");
+ check(headerValue, "æ", {"ø": "å"});
headerValue =
HeaderValue.parse("xxx; aaa=bbb; ccc=\"\\\";\\a\"; ddd=\" \"");
check(headerValue, "xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": " "});
@@ -280,6 +299,24 @@
check(headerValue, "attachment", parameters);
headerValue = HeaderValue.parse("xxx; aaa; bbb; ccc");
check(headerValue, "xxx", {"aaa": null, "bbb": null, "ccc": null});
+
+ Expect.equals("", HeaderValue().toString());
+ Expect.equals("", HeaderValue("").toString());
+ Expect.equals("v", HeaderValue("v").toString());
+ Expect.equals("v", HeaderValue("v", {}).toString());
+ Expect.equals("v; ", HeaderValue("v", {"": null}).toString());
+ Expect.equals("v; a", HeaderValue("v", {"a": null}).toString());
+ Expect.equals("v; a; b", HeaderValue("v", {"a": null, "b": null}).toString());
+ Expect.equals(
+ "v; a; b=c", HeaderValue("v", {"a": null, "b": "c"}).toString());
+ Expect.equals(
+ "v; a=c; b", HeaderValue("v", {"a": "c", "b": null}).toString());
+ Expect.equals("v; a=\"\"", HeaderValue("v", {"a": ""}).toString());
+ Expect.equals("v; a=\"b c\"", HeaderValue("v", {"a": "b c"}).toString());
+ Expect.equals("v; a=\",\"", HeaderValue("v", {"a": ","}).toString());
+ Expect.equals(
+ "v; a=\"\\\\\\\"\"", HeaderValue("v", {"a": "\\\""}).toString());
+ Expect.equals("v; a=\"ø\"", HeaderValue("v", {"a": "ø"}).toString());
}
void testContentType() {
@@ -352,7 +389,7 @@
check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
contentType = ContentType.parse("text/html; charset=;");
- check(contentType, "text", "html", {"charset": null});
+ check(contentType, "text", "html", {"charset": ""});
contentType = ContentType.parse("text/html; charset;");
check(contentType, "text", "html", {"charset": null});
diff --git a/tests/standalone/io/internet_address_test.dart b/tests/standalone/io/internet_address_test.dart
index 1832207..493957e 100644
--- a/tests/standalone/io/internet_address_test.dart
+++ b/tests/standalone/io/internet_address_test.dart
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:io';
+import 'dart:convert';
+import 'dart:typed_data';
import "package:expect/expect.dart";
@@ -131,10 +133,40 @@
});
}
+void testRawAddress() {
+ Uint8List addr = Uint8List.fromList([127, 0, 0, 1]);
+ var address = InternetAddress.fromRawAddress(addr);
+ Expect.equals('127.0.0.1', address.address);
+ Expect.equals(address.address, address.host);
+ Expect.equals(InternetAddressType.IPv4, address.type);
+}
+
+void testRawAddressIPv6() {
+ Uint8List addr =
+ Uint8List.fromList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
+ var address = InternetAddress.fromRawAddress(addr);
+ Expect.equals('::1', address.address);
+ Expect.equals(address.address, address.host);
+ Expect.equals(InternetAddressType.IPv6, address.type);
+}
+
+void testRawPath() {
+ var name = 'test_raw_path';
+ Uint8List path = Uint8List.fromList(utf8.encode(name));
+ var address =
+ InternetAddress.fromRawAddress(path, type: InternetAddressType.unix);
+ Expect.equals(name, address.address);
+ Expect.equals(address.address, address.host);
+ Expect.equals(InternetAddressType.unix, address.type);
+}
+
void main() {
testDefaultAddresses();
testConstructor();
testEquality();
testLookup();
testReverseLookup();
+ testRawAddress();
+ testRawAddressIPv6();
+ testRawPath();
}
diff --git a/tests/standalone/io/io_override_test.dart b/tests/standalone/io/io_override_test.dart
index aafa0ff..03c41af 100644
--- a/tests/standalone/io/io_override_test.dart
+++ b/tests/standalone/io/io_override_test.dart
@@ -7,6 +7,7 @@
import 'dart:io';
import 'dart:typed_data';
+import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
class DirectoryMock extends FileSystemEntity implements Directory {
@@ -127,9 +128,12 @@
}
}
+final _mockFileSystemEvent = new Stream<FileSystemEvent>.empty();
+
class FileSystemWatcherMock {
static Stream<FileSystemEvent> watch(
- String path, int events, bool recursive) async* {}
+ String path, int events, bool recursive) =>
+ _mockFileSystemEvent;
static bool watchSupported() => false;
}
@@ -187,11 +191,12 @@
Expect.equals(
FileSystemEntity.typeSync("file"), FileSystemEntityType.file);
Expect.isFalse(FileSystemEntity.isWatchSupported);
- Expect.isNull(new Directory("directory").watch());
+ Expect.identical(
+ _mockFileSystemEvent, new Directory("directory").watch());
Expect.isTrue(new Link("link") is LinkMock);
- Expect.isNull(Socket.connect(null, 0));
- Expect.isNull(Socket.startConnect(null, 0));
- Expect.isNull(ServerSocket.bind(null, 0));
+ asyncExpectThrows(() async => await Socket.connect(null, 0));
+ asyncExpectThrows(() async => await Socket.startConnect(null, 0));
+ asyncExpectThrows(() async => await ServerSocket.bind(null, 0));
},
createDirectory: DirectoryMock.createDirectory,
getCurrentDirectory: DirectoryMock.getCurrent,
diff --git a/tests/standalone/io/platform_test.dart b/tests/standalone/io/platform_test.dart
index e337c5c..64ac7d0 100644
--- a/tests/standalone/io/platform_test.dart
+++ b/tests/standalone/io/platform_test.dart
@@ -46,8 +46,8 @@
// Move directory to be sure script is correct.
var oldDir = Directory.current;
Directory.current = Directory.current.parent;
- Expect.isTrue(Platform.script.path
- .endsWith('tests/standalone_2/io/platform_test.dart'));
+ Expect.isTrue(
+ Platform.script.path.endsWith('tests/standalone/io/platform_test.dart'));
Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
// Restore dir.
Directory.current = oldDir;
@@ -87,8 +87,7 @@
// SpawnFunction retains the script url of the parent which in this
// case was a relative path.
Expect.equals("file", uri.scheme);
- Expect.isTrue(
- uri.path.endsWith('tests/standalone_2/io/platform_test.dart'));
+ Expect.isTrue(uri.path.endsWith('tests/standalone/io/platform_test.dart'));
Expect.equals(Platform.packageRoot, results["Platform.packageRoot"]);
Expect.listEquals(
Platform.executableArguments, results["Platform.executableArguments"]);
@@ -99,7 +98,10 @@
testVersion() {
checkValidVersion(String version) {
RegExp re = new RegExp(r'(\d+)\.(\d+)\.(\d+)(-dev\.([^\.]*)\.([^\.]*))?');
- var match = re.firstMatch(version)!;
+ var match = re.firstMatch(version);
+ if (match == null) {
+ throw new FormatException();
+ }
var major = int.parse(match.group(1)!);
// Major version.
Expect.isTrue(major == 1 || major == 2);
diff --git a/tests/standalone/io/process_check_arguments_test.dart b/tests/standalone/io/process_check_arguments_test.dart
index c79c00e..f6bfd0b 100644
--- a/tests/standalone/io/process_check_arguments_test.dart
+++ b/tests/standalone/io/process_check_arguments_test.dart
@@ -22,10 +22,10 @@
main() {
// Get the Dart script file which checks arguments.
var scriptFile =
- new File("tests/standalone_2/io/process_check_arguments_script.dart");
+ new File("tests/standalone/io/process_check_arguments_script.dart");
if (!scriptFile.existsSync()) {
- scriptFile = new File(
- "../tests/standalone_2/io/process_check_arguments_script.dart");
+ scriptFile =
+ new File("../tests/standalone/io/process_check_arguments_script.dart");
}
test([scriptFile.path, '3', '0', 'a']);
test([scriptFile.path, '3', '0', 'a b']);
diff --git a/tests/standalone/io/process_environment_test.dart b/tests/standalone/io/process_environment_test.dart
index ca56130..8d46681 100644
--- a/tests/standalone/io/process_environment_test.dart
+++ b/tests/standalone/io/process_environment_test.dart
@@ -12,7 +12,7 @@
runEnvironmentProcess(
Map<String, String> environment, name, includeParent, callback) {
var dartExecutable = Platform.executable;
- var printEnv = 'tests/standalone_2/io/print_env.dart';
+ var printEnv = 'tests/standalone/io/print_env.dart';
if (!new File(printEnv).existsSync()) {
printEnv = '../$printEnv';
}
diff --git a/tests/standalone/io/process_run_output_test.dart b/tests/standalone/io/process_run_output_test.dart
index 11b111a..c9fb7ae 100644
--- a/tests/standalone/io/process_run_output_test.dart
+++ b/tests/standalone/io/process_run_output_test.dart
@@ -55,11 +55,9 @@
}
main() {
- var scriptFile =
- new File("tests/standalone_2/io/process_std_io_script2.dart");
+ var scriptFile = new File("tests/standalone/io/process_std_io_script2.dart");
if (!scriptFile.existsSync()) {
- scriptFile =
- new File("../tests/standalone_2/io/process_std_io_script2.dart");
+ scriptFile = new File("../tests/standalone/io/process_std_io_script2.dart");
}
Expect.isTrue(scriptFile.existsSync());
test(scriptFile.path, 'ascii', 'stdout');
diff --git a/tests/standalone/io/process_stderr_test.dart b/tests/standalone/io/process_stderr_test.dart
index 0492fe2..904377c 100644
--- a/tests/standalone/io/process_stderr_test.dart
+++ b/tests/standalone/io/process_stderr_test.dart
@@ -61,10 +61,9 @@
// Run the test using the dart binary with an echo script.
// The test runner can be run from either the root or from runtime.
- var scriptFile = new File("tests/standalone_2/io/process_std_io_script.dart");
+ var scriptFile = new File("tests/standalone/io/process_std_io_script.dart");
if (!scriptFile.existsSync()) {
- scriptFile =
- new File("../tests/standalone_2/io/process_std_io_script.dart");
+ scriptFile = new File("../tests/standalone/io/process_std_io_script.dart");
}
Expect.isTrue(scriptFile.existsSync());
test(
diff --git a/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart b/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart
index fa36a06..5d8b6e2 100644
--- a/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart
+++ b/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart
@@ -33,9 +33,9 @@
main() {
var scriptName = "process_stdin_transform_unsubscribe_script.dart";
- var scriptFile = new File("tests/standalone_2/io/$scriptName");
+ var scriptFile = new File("tests/standalone/io/$scriptName");
if (!scriptFile.existsSync()) {
- scriptFile = new File("../tests/standalone_2/io/$scriptName");
+ scriptFile = new File("../tests/standalone/io/$scriptName");
}
Expect.isTrue(scriptFile.existsSync());
test(
diff --git a/tests/standalone/io/process_stdout_test.dart b/tests/standalone/io/process_stdout_test.dart
index 7d3bc7f..10c27f7 100644
--- a/tests/standalone/io/process_stdout_test.dart
+++ b/tests/standalone/io/process_stdout_test.dart
@@ -59,10 +59,9 @@
// Run the test using the dart binary with an echo script.
// The test runner can be run from either the root or from runtime.
- var scriptFile = new File("tests/standalone_2/io/process_std_io_script.dart");
+ var scriptFile = new File("tests/standalone/io/process_std_io_script.dart");
if (!scriptFile.existsSync()) {
- scriptFile =
- new File("../tests/standalone_2/io/process_std_io_script.dart");
+ scriptFile = new File("../tests/standalone/io/process_std_io_script.dart");
}
Expect.isTrue(scriptFile.existsSync());
test(
diff --git a/tests/standalone/io/raw_synchronous_socket_test.dart b/tests/standalone/io/raw_synchronous_socket_test.dart
index 74a82f2..50cb0f2 100644
--- a/tests/standalone/io/raw_synchronous_socket_test.dart
+++ b/tests/standalone/io/raw_synchronous_socket_test.dart
@@ -419,7 +419,7 @@
asyncEnd();
}
-Future testInvalidReadWriteOperations() {
+void testInvalidReadWriteOperations() {
asyncStart();
RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
server.listen((socket) {});
diff --git a/tests/standalone/io/resolve_symbolic_links_test.dart b/tests/standalone/io/resolve_symbolic_links_test.dart
index 57561db..9ff0e9e 100644
--- a/tests/standalone/io/resolve_symbolic_links_test.dart
+++ b/tests/standalone/io/resolve_symbolic_links_test.dart
@@ -16,16 +16,16 @@
// All of these tests test that resolveSymbolicLinks gives a path
// that points to the same place as the original, and that it removes
// all links, .., and . segments, and that it produces an absolute path.
- asyncTest(() => testFile(join(
- testsDir, 'standalone_2', 'io', 'resolve_symbolic_links_test.dart')));
- asyncTest(() => testFile(join(testsDir, 'standalone_2', 'io', '..', 'io',
+ asyncTest(() => testFile(
+ join(testsDir, 'standalone', 'io', 'resolve_symbolic_links_test.dart')));
+ asyncTest(() => testFile(join(testsDir, 'standalone', 'io', '..', 'io',
'resolve_symbolic_links_test.dart')));
- asyncTest(() => testDir(join(testsDir, 'standalone_2', 'io')));
- asyncTest(() => testDir(join(testsDir, 'lib_2', '..', 'standalone_2', 'io')));
+ asyncTest(() => testDir(join(testsDir, 'standalone', 'io')));
+ asyncTest(() => testDir(join(testsDir, 'lib_2', '..', 'standalone', 'io')));
// Test a relative path.
if (Platform.isWindows) {
- asyncTest(() => testFile(join('\\\\?\\$testsDir', 'standalone_2', 'io',
+ asyncTest(() => testFile(join('\\\\?\\$testsDir', 'standalone', 'io',
'resolve_symbolic_links_test.dart')));
asyncTest(() => testDir('\\\\?\\$testsDir'));
}
diff --git a/tests/standalone/io/secure_server_client_certificate_test.dart b/tests/standalone/io/secure_server_client_certificate_test.dart
index 18ae856..2223d3e 100644
--- a/tests/standalone/io/secure_server_client_certificate_test.dart
+++ b/tests/standalone/io/secure_server_client_certificate_test.dart
@@ -67,7 +67,7 @@
: clientNoCertContext(certType, password);
var clientEndFuture =
SecureSocket.connect(HOST, server.port, context: clientContext);
- if (required && sendCert) {
+ if (required && !sendCert) {
try {
await server.first;
} catch (e) {
diff --git a/tests/standalone/io/socket_from_raw_path_test.dart b/tests/standalone/io/socket_from_raw_path_test.dart
new file mode 100644
index 0000000..757bf37
--- /dev/null
+++ b/tests/standalone/io/socket_from_raw_path_test.dart
@@ -0,0 +1,73 @@
+// 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 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:typed_data';
+
+import 'package:expect/expect.dart';
+
+Future testAddress(Uint8List name, String addr,
+ {InternetAddressType? type}) async {
+ var address = InternetAddress.fromRawAddress(name, type: type);
+ Expect.equals(address.address, addr);
+ var server = await ServerSocket.bind(address, 0);
+ var client = await Socket.connect(address, server.port);
+ var completer = Completer();
+ server.listen((socket) async {
+ Expect.equals(socket.port, server.port);
+ Expect.equals(client.port, socket.remotePort);
+ Expect.equals(client.remotePort, socket.port);
+
+ Expect.equals(client.remoteAddress, address);
+ socket.destroy();
+ client.destroy();
+ await server.close();
+ completer.complete();
+ });
+ await completer.future;
+}
+
+Future<void> testUnixAddress() async {
+ Directory dir = Directory.systemTemp.createTempSync();
+ var name = 'raw_path_test';
+ try {
+ final file = File('${dir.path}/$name');
+ Uint8List path = Uint8List.fromList(utf8.encode(file.path));
+ var address =
+ InternetAddress.fromRawAddress(path, type: InternetAddressType.unix);
+ Expect.isTrue(address.address.toString().endsWith(name));
+
+ // Test socket
+ var server = await ServerSocket.bind(address, 0);
+ var client = await Socket.connect(address, server.port);
+ var completer = Completer<void>();
+ server.listen((socket) async {
+ Expect.equals(socket.port, server.port);
+ Expect.equals(client.port, socket.remotePort);
+ Expect.equals(client.remotePort, socket.port);
+
+ Expect.equals(client.remoteAddress, address);
+ socket.destroy();
+ client.destroy();
+ await server.close();
+ completer.complete();
+ });
+ await completer.future;
+ } finally {
+ dir.deleteSync(recursive: true);
+ }
+}
+
+void main() async {
+ // Test for internet address ipv4 ('127.0.0.1').
+ Uint8List addr = Uint8List.fromList([127, 0, 0, 1]);
+ await testAddress(addr, '127.0.0.1');
+
+ // Test unix socket
+ if (Platform.isMacOS || Platform.isLinux || Platform.isAndroid) {
+ await testUnixAddress();
+ }
+}
diff --git a/tests/standalone/io/socket_info_ipv6_test.dart b/tests/standalone/io/socket_info_ipv6_test.dart
index 11920fb..7c15b7d 100644
--- a/tests/standalone/io/socket_info_ipv6_test.dart
+++ b/tests/standalone/io/socket_info_ipv6_test.dart
@@ -2,8 +2,11 @@
// 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";
+import "dart:async";
import "dart:io";
+import "dart:typed_data";
+
+import "package:expect/expect.dart";
void testHostAndPort() {
ServerSocket.bind("::1", 0).then((server) {
@@ -29,6 +32,30 @@
});
}
-void main() {
+Future<void> testRawAddress() async {
+ var list =
+ Uint8List.fromList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
+ var addr = '::1';
+ var address = InternetAddress.fromRawAddress(list);
+ Expect.equals(address.address, addr);
+ var server = await ServerSocket.bind(address, 0);
+ var client = await Socket.connect(address, server.port);
+ var completer = Completer<void>();
+ server.listen((socket) async {
+ Expect.equals(socket.port, server.port);
+ Expect.equals(client.port, socket.remotePort);
+ Expect.equals(client.remotePort, socket.port);
+
+ Expect.equals(client.remoteAddress, address);
+ socket.destroy();
+ client.destroy();
+ await server.close();
+ completer.complete();
+ });
+ await completer.future;
+}
+
+void main() async {
testHostAndPort();
+ await testRawAddress();
}
diff --git a/tests/standalone/io/test_extension_test.dart b/tests/standalone/io/test_extension_test.dart
index e69ae28..fc7caef 100644
--- a/tests/standalone/io/test_extension_test.dart
+++ b/tests/standalone/io/test_extension_test.dart
@@ -21,6 +21,7 @@
default:
Expect.fail('Unknown operating system ${Platform.operatingSystem}');
}
+ throw 'Unknown operating system ${Platform.operatingSystem}';
}
// Returns a list containing the source file name in the first element and the
@@ -37,6 +38,7 @@
default:
Expect.fail('Unknown operating system ${Platform.operatingSystem}');
}
+ throw 'Unknown operating system ${Platform.operatingSystem}';
}
String getExtensionPath(String buildDirectory, String filename) {
diff --git a/tests/standalone/io/unix_socket_test.dart b/tests/standalone/io/unix_socket_test.dart
new file mode 100644
index 0000000..cc6ed79
--- /dev/null
+++ b/tests/standalone/io/unix_socket_test.dart
@@ -0,0 +1,174 @@
+// 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 'dart:async';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+
+Future testAddress(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ var server = await ServerSocket.bind(address, 0);
+
+ var type = FileSystemEntity.typeSync(address.address);
+
+ var client = await Socket.connect(address, server.port);
+ var completer = Completer<void>();
+ server.listen((socket) async {
+ Expect.equals(socket.port, 0);
+ Expect.equals(socket.port, server.port);
+ Expect.equals(client.port, socket.remotePort);
+ Expect.equals(client.remotePort, socket.port);
+
+ // Client has not bound to a path. This is an unnamed socket.
+ Expect.equals(socket.remoteAddress.toString(), "InternetAddress('', Unix)");
+ Expect.equals(client.remoteAddress.toString(), address.toString());
+ socket.destroy();
+ client.destroy();
+ await server.close();
+ completer.complete();
+ });
+ await completer.future;
+}
+
+testBindShared(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ var socket = await ServerSocket.bind(address, 0, shared: true);
+ Expect.isTrue(socket.port == 0);
+
+ // Same path
+ var socket2 = await ServerSocket.bind(address, 0, shared: true);
+ Expect.equals(socket.address.address, socket2.address.address);
+ Expect.equals(socket.port, socket2.port);
+
+ // Test relative path
+ var path = name.substring(name.lastIndexOf('/') + 1);
+ address = InternetAddress('${name}/../${path}/sock',
+ type: InternetAddressType.unix);
+
+ var socket3 = await ServerSocket.bind(address, 0, shared: true);
+ Expect.isTrue(FileSystemEntity.identicalSync(
+ socket.address.address, socket3.address.address));
+ Expect.equals(socket.port, socket2.port);
+ await socket.close();
+ await socket2.close();
+ await socket3.close();
+}
+
+testBind(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ var server = await ServerSocket.bind(address, 0, shared: false);
+ Expect.isTrue(server.address.toString().contains(name));
+ // Unix domain socket does not have a valid port number.
+ Expect.equals(server.port, 0);
+
+ var type = FileSystemEntity.typeSync(address.address);
+
+ var sub;
+ sub = server.listen((s) {
+ sub.cancel();
+ server.close();
+ });
+
+ var socket = await Socket.connect(address, server.port);
+ socket.write(" socket content");
+
+ await socket.destroy();
+ await server.close();
+}
+
+Future testListenCloseListenClose(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ ServerSocket socket = await ServerSocket.bind(address, 0, shared: true);
+ ServerSocket socket2 =
+ await ServerSocket.bind(address, socket.port, shared: true);
+
+ // The second socket should have kept the OS socket alive. We can therefore
+ // test if it is working correctly.
+ await socket.close();
+
+ var type = FileSystemEntity.typeSync(address.address);
+
+ // For robustness we ignore any clients unrelated to this test.
+ List<int> sendData = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+ socket2.listen((Socket client) async {
+ client.add(sendData);
+ await Future.wait([client.drain(), client.close()]);
+ });
+
+ final client = await Socket.connect(address, socket2.port);
+ List<int> data = [];
+ var completer = Completer<void>();
+ client.listen(data.addAll, onDone: () {
+ Expect.listEquals(sendData, data);
+ completer.complete();
+ });
+ await completer.future;
+ await client.close();
+
+ // Close the second server socket.
+ await socket2.close();
+}
+
+Future testSourceAddressConnect(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ ServerSocket server = await ServerSocket.bind(address, 0);
+
+ var completer = Completer<void>();
+ var localAddress =
+ InternetAddress('$name/local', type: InternetAddressType.unix);
+ server.listen((Socket socket) async {
+ Expect.equals(socket.address.address, address.address);
+ Expect.equals(socket.remoteAddress.address, localAddress.address);
+ socket.drain();
+ socket.close();
+ completer.complete();
+ });
+
+ var type = FileSystemEntity.typeSync(address.address);
+
+ Socket client =
+ await Socket.connect(address, server.port, sourceAddress: localAddress);
+ Expect.equals(client.remoteAddress.address, address.address);
+ await completer.future;
+ await client.close();
+ await client.drain();
+ await server.close();
+}
+
+// Create socket in temp directory
+Future withTempDir(String prefix, void test(Directory dir)) async {
+ var tempDir = Directory.systemTemp.createTempSync(prefix);
+ try {
+ await test(tempDir);
+ } finally {
+ tempDir.deleteSync(recursive: true);
+ }
+}
+
+void main() async {
+ try {
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testAddress('${dir.path}');
+ });
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testBind('${dir.path}');
+ });
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testBindShared('${dir.path}');
+ });
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testListenCloseListenClose('${dir.path}');
+ });
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testSourceAddressConnect('${dir.path}');
+ });
+ } catch (e) {
+ if (Platform.isMacOS || Platform.isLinux || Platform.isAndroid) {
+ Expect.fail("Unexpected exceptions are thrown");
+ } else {
+ Expect.isTrue(e is SocketException);
+ }
+ }
+}
diff --git a/tests/standalone/io/web_socket_ping_test.dart b/tests/standalone/io/web_socket_ping_test.dart
index 3960958..ef6169d 100644
--- a/tests/standalone/io/web_socket_ping_test.dart
+++ b/tests/standalone/io/web_socket_ping_test.dart
@@ -36,20 +36,22 @@
response.headers.add("Sec-WebSocket-Accept", accept);
response.headers.contentLength = 0;
response.detachSocket().then((socket) {
- socket.drain().then((_) {
- socket.close();
- closed++;
- if (closed == totalConnections) {
- server.close();
- }
- });
+ socket.destroy();
});
});
+ int closeCount = 0;
for (int i = 0; i < totalConnections; i++) {
WebSocket.connect('ws://localhost:${server.port}').then((webSocket) {
webSocket.pingInterval = const Duration(milliseconds: 100);
- webSocket.drain();
+ webSocket.listen((message) {
+ Expect.fail("unexpected message");
+ }, onDone: () {
+ closeCount++;
+ if (closeCount == totalConnections) {
+ server.close();
+ }
+ });
});
}
});
diff --git a/tests/standalone_2/dwarf_stack_trace_obfuscate_test.dart b/tests/standalone_2/dwarf_stack_trace_obfuscate_test.dart
index 60f7bb7..37fd305 100644
--- a/tests/standalone_2/dwarf_stack_trace_obfuscate_test.dart
+++ b/tests/standalone_2/dwarf_stack_trace_obfuscate_test.dart
@@ -49,12 +49,12 @@
// The first frame should correspond to the throw in bar, which was inlined
// into foo (so we'll get information for two calls for that PC address).
[
- CallInfo(
+ DartCallInfo(
function: "bar",
filename: "dwarf_stack_trace_obfuscate_test.dart",
line: 17,
inlined: true),
- CallInfo(
+ DartCallInfo(
function: "foo",
filename: "dwarf_stack_trace_obfuscate_test.dart",
line: 23,
@@ -62,7 +62,7 @@
],
// The second frame corresponds to call to foo in main.
[
- CallInfo(
+ DartCallInfo(
function: "main",
filename: "dwarf_stack_trace_obfuscate_test.dart",
line: 29,
diff --git a/tests/standalone_2/dwarf_stack_trace_test.dart b/tests/standalone_2/dwarf_stack_trace_test.dart
index fd811ca..bed8cfa 100644
--- a/tests/standalone_2/dwarf_stack_trace_test.dart
+++ b/tests/standalone_2/dwarf_stack_trace_test.dart
@@ -143,12 +143,12 @@
// The first frame should correspond to the throw in bar, which was inlined
// into foo (so we'll get information for two calls for that PC address).
[
- CallInfo(
+ DartCallInfo(
function: "bar",
filename: "dwarf_stack_trace_test.dart",
line: 17,
inlined: true),
- CallInfo(
+ DartCallInfo(
function: "foo",
filename: "dwarf_stack_trace_test.dart",
line: 23,
@@ -156,7 +156,7 @@
],
// The second frame corresponds to call to foo in main.
[
- CallInfo(
+ DartCallInfo(
function: "main",
filename: "dwarf_stack_trace_test.dart",
line: 29,
@@ -168,14 +168,14 @@
List<List<CallInfo>> removeInternalCalls(List<List<CallInfo>> original) =>
original
- .map((frame) => frame.where((call) => call.line > 0).toList())
+ .map((frame) => frame.where((call) => !call.isInternal).toList())
.toList();
void checkConsistency(
List<List<CallInfo>> externalFrames, List<List<CallInfo>> allFrames) {
// We should have the same number of frames for both external-only
// and combined call information.
- Expect.equals(externalFrames.length, allFrames.length);
+ Expect.equals(allFrames.length, externalFrames.length);
for (var frame in externalFrames) {
// There should be no frames in either version where we failed to look up
@@ -185,7 +185,7 @@
// External-only call information should only include call information with
// positive line numbers.
for (var call in frame) {
- Expect.isTrue(call.line > 0);
+ Expect.isTrue(!call.isInternal);
}
}
@@ -200,11 +200,10 @@
}
// The information in the external-only and combined call information should
- // be consistent for external frames.
- for (var i = 0; i < allFrames.length; i++) {
- if (externalFrames[i].isNotEmpty) {
- Expect.listEquals(externalFrames[i], allFrames[i]);
- }
+ // be consistent for externally visible calls.
+ final allFramesStripped = removeInternalCalls(allFrames);
+ for (var i = 0; i < allFramesStripped.length; i++) {
+ Expect.listEquals(allFramesStripped[i], externalFrames[i]);
}
}
@@ -218,15 +217,15 @@
// non-positive line numbers match, as long as they're both non-positive.
for (var i = 0; i < expectedInfo.length; i++) {
for (var j = 0; j < expectedInfo[i].length; j++) {
- final got = framesInfo[i][j];
- final expected = expectedInfo[i][j];
- Expect.equals(got.function, expected.function);
- Expect.equals(got.inlined, expected.inlined);
- Expect.equals(path.basename(got.filename), expected.filename);
- if (expected.line > 0) {
- Expect.equals(got.line, expected.line);
+ final DartCallInfo got = framesInfo[i][j];
+ final DartCallInfo expected = expectedInfo[i][j];
+ Expect.equals(expected.function, got.function);
+ Expect.equals(expected.inlined, got.inlined);
+ Expect.equals(expected.filename, path.basename(got.filename));
+ if (expected.isInternal) {
+ Expect.isTrue(got.isInternal);
} else {
- Expect.isTrue(got.line <= 0);
+ Expect.equals(expected.line, got.line);
}
}
}
@@ -236,11 +235,13 @@
var ret = <String>[];
for (final frame in expectedCalls) {
for (final call in frame) {
- ret.add(call.function);
- if (call.line > 0) {
- ret.add("${call.filename}:${call.line}");
- } else {
- ret.add("${call.filename}:??");
+ if (call is DartCallInfo) {
+ ret.add(call.function);
+ if (call.isInternal) {
+ ret.add("${call.filename}:??");
+ } else {
+ ret.add("${call.filename}:${call.line}");
+ }
}
}
}
diff --git a/tests/standalone_2/io/http_headers_test.dart b/tests/standalone_2/io/http_headers_test.dart
index d1d0b8c..1213e85 100644
--- a/tests/standalone_2/io/http_headers_test.dart
+++ b/tests/standalone_2/io/http_headers_test.dart
@@ -259,6 +259,25 @@
}
HeaderValue headerValue;
+ headerValue = HeaderValue.parse("");
+ check(headerValue, "", {});
+ headerValue = HeaderValue.parse(";");
+ check(headerValue, "", {});
+ headerValue = HeaderValue.parse(";;");
+ check(headerValue, "", {});
+ headerValue = HeaderValue.parse("v;a");
+ check(headerValue, "v", {"a": null});
+ headerValue = HeaderValue.parse("v;a=");
+ check(headerValue, "v", {"a": ""});
+ Expect.throws(() => HeaderValue.parse("v;a=\""), (e) => e is HttpException);
+ headerValue = HeaderValue.parse("v;a=\"\"");
+ check(headerValue, "v", {"a": ""});
+ Expect.throws(() => HeaderValue.parse("v;a=\"\\"), (e) => e is HttpException);
+ Expect.throws(
+ () => HeaderValue.parse("v;a=\";b=\"c\""), (e) => e is HttpException);
+ Expect.throws(() => HeaderValue.parse("v;a=b c"), (e) => e is HttpException);
+ headerValue = HeaderValue.parse("æ;ø=å");
+ check(headerValue, "æ", {"ø": "å"});
headerValue =
HeaderValue.parse("xxx; aaa=bbb; ccc=\"\\\";\\a\"; ddd=\" \"");
check(headerValue, "xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": " "});
@@ -280,6 +299,25 @@
check(headerValue, "attachment", parameters);
headerValue = HeaderValue.parse("xxx; aaa; bbb; ccc");
check(headerValue, "xxx", {"aaa": null, "bbb": null, "ccc": null});
+
+ Expect.equals("", HeaderValue().toString());
+ Expect.equals("", HeaderValue("").toString());
+ Expect.equals("v", HeaderValue("v").toString());
+ Expect.equals("v", HeaderValue("v", null).toString());
+ Expect.equals("v", HeaderValue("v", {}).toString());
+ Expect.equals("v; ", HeaderValue("v", {"": null}).toString());
+ Expect.equals("v; a", HeaderValue("v", {"a": null}).toString());
+ Expect.equals("v; a; b", HeaderValue("v", {"a": null, "b": null}).toString());
+ Expect.equals(
+ "v; a; b=c", HeaderValue("v", {"a": null, "b": "c"}).toString());
+ Expect.equals(
+ "v; a=c; b", HeaderValue("v", {"a": "c", "b": null}).toString());
+ Expect.equals("v; a=\"\"", HeaderValue("v", {"a": ""}).toString());
+ Expect.equals("v; a=\"b c\"", HeaderValue("v", {"a": "b c"}).toString());
+ Expect.equals("v; a=\",\"", HeaderValue("v", {"a": ","}).toString());
+ Expect.equals(
+ "v; a=\"\\\\\\\"\"", HeaderValue("v", {"a": "\\\""}).toString());
+ Expect.equals("v; a=\"ø\"", HeaderValue("v", {"a": "ø"}).toString());
}
void testContentType() {
@@ -352,7 +390,7 @@
check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
contentType = ContentType.parse("text/html; charset=;");
- check(contentType, "text", "html", {"charset": null});
+ check(contentType, "text", "html", {"charset": ""});
contentType = ContentType.parse("text/html; charset;");
check(contentType, "text", "html", {"charset": null});
diff --git a/tests/standalone_2/io/internet_address_test.dart b/tests/standalone_2/io/internet_address_test.dart
index 1832207..d35e91c 100644
--- a/tests/standalone_2/io/internet_address_test.dart
+++ b/tests/standalone_2/io/internet_address_test.dart
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:io';
+import 'dart:convert';
+import 'dart:typed_data';
import "package:expect/expect.dart";
@@ -131,10 +133,39 @@
});
}
+void testRawAddress() {
+ Uint8List addr = Uint8List.fromList([127, 0, 0, 1]);
+ var address = InternetAddress.fromRawAddress(addr);
+ Expect.equals('127.0.0.1', address.address);
+ Expect.equals(address.address, address.host);
+ Expect.equals(InternetAddressType.IPv4, address.type);
+}
+
+void testRawAddressIPv6() {
+ Uint8List addr =
+ Uint8List.fromList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
+ var address = InternetAddress.fromRawAddress(addr);
+ Expect.equals('::1', address.address);
+ Expect.equals(address.address, address.host);
+ Expect.equals(InternetAddressType.IPv6, address.type);
+}
+
+void testRawPath() {
+ var name = 'test_raw_path';
+ var address = InternetAddress.fromRawAddress(utf8.encode(name),
+ type: InternetAddressType.unix);
+ Expect.equals(name, address.address);
+ Expect.equals(address.address, address.host);
+ Expect.equals(InternetAddressType.unix, address.type);
+}
+
void main() {
testDefaultAddresses();
testConstructor();
testEquality();
testLookup();
testReverseLookup();
+ testRawAddress();
+ testRawAddressIPv6();
+ testRawPath();
}
diff --git a/tests/standalone_2/io/socket_from_raw_path_test.dart b/tests/standalone_2/io/socket_from_raw_path_test.dart
new file mode 100644
index 0000000..794f075
--- /dev/null
+++ b/tests/standalone_2/io/socket_from_raw_path_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 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:typed_data';
+
+import 'package:expect/expect.dart';
+
+Future testAddress(Uint8List name, String addr,
+ {InternetAddressType type}) async {
+ var address = InternetAddress.fromRawAddress(name, type: type);
+ Expect.equals(address.address, addr);
+ var server = await ServerSocket.bind(address, 0);
+ var client = await Socket.connect(address, server.port);
+ var completer = Completer();
+ server.listen((socket) async {
+ Expect.equals(socket.port, server.port);
+ Expect.equals(client.port, socket.remotePort);
+ Expect.equals(client.remotePort, socket.port);
+
+ Expect.equals(client.remoteAddress, address);
+ socket.destroy();
+ client.destroy();
+ await server.close();
+ completer.complete();
+ });
+ await completer.future;
+}
+
+Future<void> testUnixAddress() async {
+ Directory dir = Directory.systemTemp.createTempSync();
+ var name = 'raw_path_test';
+ try {
+ var file = File('${dir.path}/$name');
+ var address = InternetAddress.fromRawAddress(utf8.encode(file.path),
+ type: InternetAddressType.unix);
+ Expect.isTrue(address.address.toString().endsWith(name));
+
+ // Test socket
+ var server = await ServerSocket.bind(address, 0);
+ var client = await Socket.connect(address, server.port);
+ var completer = Completer<void>();
+ server.listen((socket) async {
+ Expect.equals(socket.port, server.port);
+ Expect.equals(client.port, socket.remotePort);
+ Expect.equals(client.remotePort, socket.port);
+
+ Expect.equals(client.remoteAddress, address);
+ socket.destroy();
+ client.destroy();
+ await server.close();
+ completer.complete();
+ });
+ await completer.future;
+ } finally {
+ dir.deleteSync(recursive: true);
+ }
+}
+
+void main() async {
+ // Test for internet address ipv4 ('127.0.0.1').
+ Uint8List addr = Uint8List.fromList([127, 0, 0, 1]);
+ await testAddress(addr, '127.0.0.1');
+
+ // Test unix socket
+ if (Platform.isMacOS || Platform.isLinux || Platform.isAndroid) {
+ await testUnixAddress();
+ }
+}
diff --git a/tests/standalone_2/io/socket_info_ipv6_test.dart b/tests/standalone_2/io/socket_info_ipv6_test.dart
index 11920fb..7c15b7d 100644
--- a/tests/standalone_2/io/socket_info_ipv6_test.dart
+++ b/tests/standalone_2/io/socket_info_ipv6_test.dart
@@ -2,8 +2,11 @@
// 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";
+import "dart:async";
import "dart:io";
+import "dart:typed_data";
+
+import "package:expect/expect.dart";
void testHostAndPort() {
ServerSocket.bind("::1", 0).then((server) {
@@ -29,6 +32,30 @@
});
}
-void main() {
+Future<void> testRawAddress() async {
+ var list =
+ Uint8List.fromList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
+ var addr = '::1';
+ var address = InternetAddress.fromRawAddress(list);
+ Expect.equals(address.address, addr);
+ var server = await ServerSocket.bind(address, 0);
+ var client = await Socket.connect(address, server.port);
+ var completer = Completer<void>();
+ server.listen((socket) async {
+ Expect.equals(socket.port, server.port);
+ Expect.equals(client.port, socket.remotePort);
+ Expect.equals(client.remotePort, socket.port);
+
+ Expect.equals(client.remoteAddress, address);
+ socket.destroy();
+ client.destroy();
+ await server.close();
+ completer.complete();
+ });
+ await completer.future;
+}
+
+void main() async {
testHostAndPort();
+ await testRawAddress();
}
diff --git a/tests/standalone_2/io/unix_socket_test.dart b/tests/standalone_2/io/unix_socket_test.dart
new file mode 100644
index 0000000..cc6ed79
--- /dev/null
+++ b/tests/standalone_2/io/unix_socket_test.dart
@@ -0,0 +1,174 @@
+// 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 'dart:async';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+
+Future testAddress(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ var server = await ServerSocket.bind(address, 0);
+
+ var type = FileSystemEntity.typeSync(address.address);
+
+ var client = await Socket.connect(address, server.port);
+ var completer = Completer<void>();
+ server.listen((socket) async {
+ Expect.equals(socket.port, 0);
+ Expect.equals(socket.port, server.port);
+ Expect.equals(client.port, socket.remotePort);
+ Expect.equals(client.remotePort, socket.port);
+
+ // Client has not bound to a path. This is an unnamed socket.
+ Expect.equals(socket.remoteAddress.toString(), "InternetAddress('', Unix)");
+ Expect.equals(client.remoteAddress.toString(), address.toString());
+ socket.destroy();
+ client.destroy();
+ await server.close();
+ completer.complete();
+ });
+ await completer.future;
+}
+
+testBindShared(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ var socket = await ServerSocket.bind(address, 0, shared: true);
+ Expect.isTrue(socket.port == 0);
+
+ // Same path
+ var socket2 = await ServerSocket.bind(address, 0, shared: true);
+ Expect.equals(socket.address.address, socket2.address.address);
+ Expect.equals(socket.port, socket2.port);
+
+ // Test relative path
+ var path = name.substring(name.lastIndexOf('/') + 1);
+ address = InternetAddress('${name}/../${path}/sock',
+ type: InternetAddressType.unix);
+
+ var socket3 = await ServerSocket.bind(address, 0, shared: true);
+ Expect.isTrue(FileSystemEntity.identicalSync(
+ socket.address.address, socket3.address.address));
+ Expect.equals(socket.port, socket2.port);
+ await socket.close();
+ await socket2.close();
+ await socket3.close();
+}
+
+testBind(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ var server = await ServerSocket.bind(address, 0, shared: false);
+ Expect.isTrue(server.address.toString().contains(name));
+ // Unix domain socket does not have a valid port number.
+ Expect.equals(server.port, 0);
+
+ var type = FileSystemEntity.typeSync(address.address);
+
+ var sub;
+ sub = server.listen((s) {
+ sub.cancel();
+ server.close();
+ });
+
+ var socket = await Socket.connect(address, server.port);
+ socket.write(" socket content");
+
+ await socket.destroy();
+ await server.close();
+}
+
+Future testListenCloseListenClose(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ ServerSocket socket = await ServerSocket.bind(address, 0, shared: true);
+ ServerSocket socket2 =
+ await ServerSocket.bind(address, socket.port, shared: true);
+
+ // The second socket should have kept the OS socket alive. We can therefore
+ // test if it is working correctly.
+ await socket.close();
+
+ var type = FileSystemEntity.typeSync(address.address);
+
+ // For robustness we ignore any clients unrelated to this test.
+ List<int> sendData = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+ socket2.listen((Socket client) async {
+ client.add(sendData);
+ await Future.wait([client.drain(), client.close()]);
+ });
+
+ final client = await Socket.connect(address, socket2.port);
+ List<int> data = [];
+ var completer = Completer<void>();
+ client.listen(data.addAll, onDone: () {
+ Expect.listEquals(sendData, data);
+ completer.complete();
+ });
+ await completer.future;
+ await client.close();
+
+ // Close the second server socket.
+ await socket2.close();
+}
+
+Future testSourceAddressConnect(String name) async {
+ var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+ ServerSocket server = await ServerSocket.bind(address, 0);
+
+ var completer = Completer<void>();
+ var localAddress =
+ InternetAddress('$name/local', type: InternetAddressType.unix);
+ server.listen((Socket socket) async {
+ Expect.equals(socket.address.address, address.address);
+ Expect.equals(socket.remoteAddress.address, localAddress.address);
+ socket.drain();
+ socket.close();
+ completer.complete();
+ });
+
+ var type = FileSystemEntity.typeSync(address.address);
+
+ Socket client =
+ await Socket.connect(address, server.port, sourceAddress: localAddress);
+ Expect.equals(client.remoteAddress.address, address.address);
+ await completer.future;
+ await client.close();
+ await client.drain();
+ await server.close();
+}
+
+// Create socket in temp directory
+Future withTempDir(String prefix, void test(Directory dir)) async {
+ var tempDir = Directory.systemTemp.createTempSync(prefix);
+ try {
+ await test(tempDir);
+ } finally {
+ tempDir.deleteSync(recursive: true);
+ }
+}
+
+void main() async {
+ try {
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testAddress('${dir.path}');
+ });
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testBind('${dir.path}');
+ });
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testBindShared('${dir.path}');
+ });
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testListenCloseListenClose('${dir.path}');
+ });
+ await withTempDir('unix_socket_test', (Directory dir) async {
+ await testSourceAddressConnect('${dir.path}');
+ });
+ } catch (e) {
+ if (Platform.isMacOS || Platform.isLinux || Platform.isAndroid) {
+ Expect.fail("Unexpected exceptions are thrown");
+ } else {
+ Expect.isTrue(e is SocketException);
+ }
+ }
+}
diff --git a/tests/standalone_2/io/web_socket_ping_test.dart b/tests/standalone_2/io/web_socket_ping_test.dart
index 3960958..ef6169d 100644
--- a/tests/standalone_2/io/web_socket_ping_test.dart
+++ b/tests/standalone_2/io/web_socket_ping_test.dart
@@ -36,20 +36,22 @@
response.headers.add("Sec-WebSocket-Accept", accept);
response.headers.contentLength = 0;
response.detachSocket().then((socket) {
- socket.drain().then((_) {
- socket.close();
- closed++;
- if (closed == totalConnections) {
- server.close();
- }
- });
+ socket.destroy();
});
});
+ int closeCount = 0;
for (int i = 0; i < totalConnections; i++) {
WebSocket.connect('ws://localhost:${server.port}').then((webSocket) {
webSocket.pingInterval = const Duration(milliseconds: 100);
- webSocket.drain();
+ webSocket.listen((message) {
+ Expect.fail("unexpected message");
+ }, onDone: () {
+ closeCount++;
+ if (closeCount == totalConnections) {
+ server.close();
+ }
+ });
});
}
});
diff --git a/tools/VERSION b/tools/VERSION
index 4acf823..858a4ac 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
MAJOR 2
MINOR 8
PATCH 0
-PRERELEASE 16
+PRERELEASE 17
PRERELEASE_PATCH 0
-ABI_VERSION 29
-OLDEST_SUPPORTED_ABI_VERSION 29
+ABI_VERSION 30
+OLDEST_SUPPORTED_ABI_VERSION 30
diff --git a/tools/addlatexhash.dart b/tools/addlatexhash.dart
index 2354668..a3b2230 100755
--- a/tools/addlatexhash.dart
+++ b/tools/addlatexhash.dart
@@ -111,7 +111,7 @@
multilineNormalize(lines) {
var afterBlankLines = false; // Does [line] succeed >0 empty lines?
var afterCommentLines = false; // Does [line] succeed >0 commentOnly lines?
- var newLines = new List();
+ var newLines = [];
for (var line in lines) {
if (afterBlankLines && afterCommentLines) {
// Previous line was both blank and a comment: not possible.
@@ -193,7 +193,7 @@
/// and "interesting" lines may be characterized by [analysisFunc] via
/// the returned event object.
findEvents(lines, analyzer) {
- var events = new List();
+ var events = [];
for (var line in lines) {
var event = analyzer.analyze(line);
if (event != null) events.add(event);
@@ -543,7 +543,7 @@
// Perform single-line normalization.
var inDartCode = false;
- var normalizedLines = new List();
+ var normalizedLines = [];
for (var line in lines) {
if (sispIsDartBegin(line)) {
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 7e3c496..9e79caf 100755
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -72,7 +72,7 @@
For every (channel,revision,release-type) tuple we have a base path:
- gs://dart-archive/channels/{be,dev,stable,try,integration}
+ gs://dart-archive/channels/{be,beta,dev,stable,try,integration}
/{raw,signed,release}/{revision,latest}/
Under every base path, the following structure is used:
diff --git a/tools/bots/find_base_commit.dart b/tools/bots/find_base_commit.dart
index 5a0a741..5da2e31 100755
--- a/tools/bots/find_base_commit.dart
+++ b/tools/bots/find_base_commit.dart
@@ -89,8 +89,10 @@
for (final build in builds) {
final parameters = jsonDecode(build["parameters_json"]);
final bot = parameters["builder_name"];
- if (bot.endsWith("-dev") || bot.endsWith("-stable")) {
- // Ignore the -dev and -stable builders. The -try builders aren't in the
+ if (bot.endsWith("-beta") ||
+ bot.endsWith("-dev") ||
+ bot.endsWith("-stable")) {
+ // Ignore the release builders. The -try builders aren't in the
// bucket we're reading.
continue;
}
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 6fac31d..f69d3e0 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -526,6 +526,36 @@
"timeout": 240
}
},
+ "dartkp-asan-(linux|mac)-(debug|product|release)-x64": {
+ "options": {
+ "builder-tag": "asan",
+ "timeout": 240
+ }
+ },
+ "dartkp-lsan-(linux|mac)-(debug|product|release)-x64": {
+ "options": {
+ "builder-tag": "lsan",
+ "timeout": 240
+ }
+ },
+ "dartkp-msan-linux-(debug|product|release)-x64": {
+ "options": {
+ "builder-tag": "msan",
+ "timeout": 240
+ }
+ },
+ "dartkp-tsan-(linux|mac)-(debug|product|release)-x64": {
+ "options": {
+ "builder-tag": "tsan",
+ "timeout": 240
+ }
+ },
+ "dartkp-ubsan-(linux|mac)-(debug|product|release)-x64": {
+ "options": {
+ "builder-tag": "ubsan",
+ "timeout": 240
+ }
+ },
"dart2js-(linux|mac|win)-chrome": {
"options": {
"use-sdk": true
@@ -1323,9 +1353,10 @@
"name": "vm nnbd tests in weak mode with asserts",
"arguments": [
"-ndartkp-weak-asserts-${system}-${mode}-${arch}",
+ "corelib",
"ffi",
"language",
- "lib/mirrors",
+ "lib",
"standalone/io"
]
},
@@ -1333,9 +1364,10 @@
"name": "vm nnbd tests in strong mode",
"arguments": [
"-ndartkp-strong-${system}-${mode}-${arch}",
+ "corelib",
"ffi",
"language",
- "lib/mirrors",
+ "lib",
"standalone/io"
]
}
@@ -1726,9 +1758,10 @@
"name": "vm nnbd test in weak mode with asserts",
"arguments": [
"-ndartk-weak-asserts-${system}-${mode}-${arch}",
+ "corelib",
"ffi",
"language",
- "lib/mirrors",
+ "lib",
"standalone/io"
]
},
@@ -1736,9 +1769,10 @@
"name": "vm nnbd tests in strong mode",
"arguments": [
"-ndartk-strong-${system}-${mode}-${arch}",
+ "corelib",
"ffi",
"language",
- "lib/mirrors",
+ "lib",
"standalone/io"
]
}
@@ -3207,6 +3241,14 @@
]
},
{
+ "name": "analyze pkg/dds",
+ "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+ "arguments": [
+ "--fatal-warnings",
+ "pkg/dds"
+ ]
+ },
+ {
"name": "analyze runtime/observatory",
"script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
"arguments": [
@@ -3626,6 +3668,7 @@
],
"sanitizer_options": {
"ASAN_OPTIONS": "check_initialization_order=true:handle_segv=0:detect_leaks=1:detect_stack_use_after_return=0:disable_coredump=0:abort_on_error=1",
+ "LSAN_OPTIONS": "check_initialization_order=true:handle_segv=0:detect_leaks=1:detect_stack_use_after_return=0:disable_coredump=0:abort_on_error=1",
"MSAN_OPTIONS": "check_initialization_order=true:handle_segv=0:detect_leaks=1:detect_stack_use_after_return=0:disable_coredump=0:abort_on_error=1",
"TSAN_OPTIONS": "handle_segv=0:disable_coredump=0:abort_on_error=1",
"UBSAN_OPTIONS": "handle_segv=0:disable_coredump=0:abort_on_error=1"
diff --git a/tools/bots/version_checker.py b/tools/bots/version_checker.py
index 6c72aaf..89c4cdd 100755
--- a/tools/bots/version_checker.py
+++ b/tools/bots/version_checker.py
@@ -73,7 +73,8 @@
print 'No sanity checking on bleeding edge'
else:
assert (channel == bot_utils.Channel.STABLE or
- channel == bot_utils.Channel.DEV)
+ channel == bot_utils.Channel.DEV or
+ channel == bot_utils.Channel.BETA)
latest_version = GetLatestVersionFromGCS(channel)
version = utils.GetVersion()
print 'Latests version on GCS: %s' % latest_version
diff --git a/tools/create_debian_chroot.sh b/tools/create_debian_chroot.sh
index 1cfcf1e..4f2f25e 100755
--- a/tools/create_debian_chroot.sh
+++ b/tools/create_debian_chroot.sh
@@ -9,7 +9,7 @@
#
function usage {
- USAGE="Usage: $0 i386|amd64 [target dir] [be|dev|<stable version>]]\n
+ USAGE="Usage: $0 i386|amd64 [target dir] [be|beta|dev|<stable version>]]\n
\n
The first mandatory argument speciifies the CPU architecture using\n
the Debian convention (e.g. i386 and amd64).\n
diff --git a/tools/dom/nnbd_src/Validators.dart b/tools/dom/nnbd_src/Validators.dart
index aca5628..26dac65 100644
--- a/tools/dom/nnbd_src/Validators.dart
+++ b/tools/dom/nnbd_src/Validators.dart
@@ -157,6 +157,9 @@
*/
class _ValidatingTreeSanitizer implements NodeTreeSanitizer {
NodeValidator validator;
+
+ /// Did we modify the tree by removing anything.
+ bool modifiedTree = false;
_ValidatingTreeSanitizer(this.validator) {}
void sanitizeTree(Node node) {
@@ -165,11 +168,15 @@
var child = node.lastChild;
while (null != child) {
- var nextChild;
+ Node? nextChild;
try {
- // Child may be removed during the walk, and we may not
- // even be able to get its previousNode.
+ // Child may be removed during the walk, and we may not even be able
+ // to get its previousNode. But it's also possible that previousNode
+ // (i.e. previousSibling) is being spoofed, so double-check it.
nextChild = child.previousNode;
+ if (nextChild != null && nextChild.nextNode != child) {
+ throw StateError("Corrupt HTML");
+ }
} catch (e) {
// Child appears bad, remove it. We want to check the rest of the
// children of node and, but we have no way of getting to the next
@@ -183,7 +190,12 @@
}
}
+ modifiedTree = false;
walk(node, null);
+ while (modifiedTree) {
+ modifiedTree = false;
+ walk(node, null);
+ }
}
/// Aggressively try to remove node.
@@ -191,7 +203,8 @@
// If we have the parent, it's presumably already passed more sanitization
// or is the fragment, so ask it to remove the child. And if that fails
// try to set the outer html.
- if (parent == null) {
+ modifiedTree = true;
+ if (parent == null || parent != node.parentNode) {
node.remove();
} else {
parent._removeChild(node);
diff --git a/tools/dom/src/Validators.dart b/tools/dom/src/Validators.dart
index ceb6968..ce706ef 100644
--- a/tools/dom/src/Validators.dart
+++ b/tools/dom/src/Validators.dart
@@ -157,6 +157,9 @@
*/
class _ValidatingTreeSanitizer implements NodeTreeSanitizer {
NodeValidator validator;
+
+ /// Did we modify the tree by removing anything.
+ bool modifiedTree = false;
_ValidatingTreeSanitizer(this.validator) {}
void sanitizeTree(Node node) {
@@ -165,11 +168,15 @@
var child = node.lastChild;
while (null != child) {
- var nextChild;
+ Node nextChild;
try {
- // Child may be removed during the walk, and we may not
- // even be able to get its previousNode.
+ // Child may be removed during the walk, and we may not even be able
+ // to get its previousNode. But it's also possible that previousNode
+ // (i.e. previousSibling) is being spoofed, so double-check it.
nextChild = child.previousNode;
+ if (nextChild != null && nextChild.nextNode != child) {
+ throw StateError("Corrupt HTML");
+ }
} catch (e) {
// Child appears bad, remove it. We want to check the rest of the
// children of node and, but we have no way of getting to the next
@@ -183,7 +190,12 @@
}
}
+ modifiedTree = false;
walk(node, null);
+ while (modifiedTree) {
+ modifiedTree = false;
+ walk(node, null);
+ }
}
/// Aggressively try to remove node.
@@ -191,7 +203,8 @@
// If we have the parent, it's presumably already passed more sanitization
// or is the fragment, so ask it to remove the child. And if that fails
// try to set the outer html.
- if (parent == null) {
+ modifiedTree = true;
+ if (parent == null || parent != node.parentNode) {
node.remove();
} else {
parent._removeChild(node);
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index d692342..76ddcde 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -1449,6 +1449,14 @@
if (!(element.attributes instanceof NamedNodeMap)) {
return true;
}
+ // If something has corrupted the traversal we want to detect
+ // these on not only the children (tested below) but on the node itself
+ // in case it was bypassed.
+ if (element["id"] == 'lastChild' || element["name"] == 'lastChild' ||
+ element["id"] == 'previousSibling' || element["name"] == 'previousSibling' ||
+ element["id"] == 'children' || element["name"] == 'children') {
+ return true;
+ }
var childNodes = element.childNodes;
if (element.lastChild &&
element.lastChild !== childNodes[childNodes.length -1]) {
@@ -1474,6 +1482,7 @@
// allowing us to check for clobbering that may show up in other accesses.
if (child["id"] == 'attributes' || child["name"] == 'attributes' ||
child["id"] == 'lastChild' || child["name"] == 'lastChild' ||
+ child["id"] == 'previousSibling' || child["name"] == 'previousSibling' ||
child["id"] == 'children' || child["name"] == 'children') {
return true;
}
diff --git a/tools/make_version.py b/tools/make_version.py
index 4b16d91..eb01d35 100755
--- a/tools/make_version.py
+++ b/tools/make_version.py
@@ -47,17 +47,6 @@
def MakeVersionString(quiet, no_git_hash, custom_for_pub=None):
channel = utils.GetChannel()
- if custom_for_pub:
- # TODO(athom): remove the custom 2.7.0 logic post release.
- # For 2.7.0, we want flutter to claim Dart is 2.7.0 even before it is
- # decided what exactly 2.7.0 will be. Dart & Flutter stable releases
- # will be synced, so that what will be released as Dart 2.7.0 will also
- # be what will be packaged with Flutter.
- version = utils.ReadVersionFile()
- custom_version_string = "%s.%s.%s" % (version.major, version.minor,
- version.patch)
- if custom_version_string == "2.7.0" and custom_for_pub == "flutter":
- return "2.7.0"
if custom_for_pub and channel == 'be':
latest = utils.GetLatestDevTag()
@@ -98,6 +87,8 @@
version_cc_text = open(input_file).read()
version_cc_text = version_cc_text.replace("{{VERSION_STR}}", version_string)
+ channel = utils.GetChannel()
+ version_cc_text = version_cc_text.replace("{{CHANNEL}}", channel)
version_time = utils.GetGitTimestamp()
if no_git_hash or version_time == None:
version_time = "Unknown timestamp"
diff --git a/tools/sdks/update.sh b/tools/sdks/update.sh
index 857c98f..6f1cc4e 100755
--- a/tools/sdks/update.sh
+++ b/tools/sdks/update.sh
@@ -8,9 +8,10 @@
exit 1
fi
-channel="stable"
case "$1" in
-*-dev.*) channel="dev";;
+*-dev.*.0) channel="dev";;
+*-dev.*) channel="beta";;
+*) channel="stable";;
esac
tmpdir=$(mktemp -d)
diff --git a/tools/utils.py b/tools/utils.py
index 7fa9d73..fb26d28 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -378,7 +378,7 @@
if version.channel == 'be':
postfix = '-edge' if no_git_hash else '-edge.%s' % GetGitRevision()
- elif version.channel == 'dev':
+ elif version.channel in ('beta', 'dev'):
postfix = '-dev.%s.%s' % (version.prerelease, version.prerelease_patch)
else:
assert version.channel == 'stable'
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 6925150..a0fa6b0 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -202,25 +202,14 @@
group("dartdevc_test_kernel_pkg") {
deps = [
":async_helper_js",
+ ":collection_js",
":expect_js",
":js_js",
+ ":matcher_js",
":meta_js",
+ ":path_js",
+ ":stack_trace_js",
]
-
- # TODO(38701): Cleanup after merging the forked SDK into mainline.
- if (!use_nnbd) {
- # TODO(sigmund): Merge this list into above. We turned this off temporarily
- # while the migration of libraries is in flux, this step otherwise fails
- # with many nnbd-related compile-time errors because the packages are
- # assumed to be nnbd compilant.
- deps += [
- ":collection_js",
- ":matcher_js",
- ":path_js",
- ":stack_trace_js",
- ":unittest_js",
- ]
- }
}
template("dartdevc_kernel_compile") {
@@ -329,21 +318,6 @@
package_dependencies = [ "path" ]
}
-# TODO(rnystrom): Remove this when unittest is no longer used. Also remove
-# any of the above packages that are only here because unittest uses them.
-dartdevc_kernel_compile("unittest_js") {
- package = "unittest"
- package_dependencies = [
- "path",
- "stack_trace",
- ]
- extra_libraries = [
- "html_config",
- "html_individual_config",
- "html_enhanced_config",
- ]
-}
-
compile_platform("dartdevc_platform") {
single_root_scheme = "org-dartlang-sdk"
single_root_base = rebase_path("../../")