Version 2.18.0-213.0.dev
Merge commit '95d8a5d41ae6ae1574995718cc35fa67def5bb1d' into 'dev'
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 b4df57c..4c75ebb 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -16,11 +16,11 @@
NullType,
Nullability,
Supertype,
+ TreeNode,
getAsTypeArguments;
import 'package:kernel/class_hierarchy.dart'
show ClassHierarchy, ClassHierarchyBase;
import 'package:kernel/src/unaliasing.dart';
-import 'package:kernel/text/text_serialization_verifier.dart';
import '../fasta_codes.dart';
import '../modifier.dart';
@@ -37,6 +37,8 @@
import 'type_builder.dart';
import 'type_variable_builder.dart';
+const Uri? noUri = null;
+
abstract class ClassBuilder implements DeclarationBuilder {
/// The type variables declared on a class, extension or mixin declaration.
List<TypeVariableBuilder>? get typeVariables;
@@ -304,7 +306,7 @@
return nonNullableRawType;
case Nullability.undetermined:
default:
- return unhandled("$nullability", "rawType", noOffset, noUri);
+ return unhandled("$nullability", "rawType", TreeNode.noOffset, noUri);
}
}
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index ae6bc65..a9e1916 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -135,7 +135,6 @@
import '../../utils/kernel_chain.dart'
show
ComponentResult,
- KernelTextSerialization,
MatchContext,
MatchExpectation,
Print,
@@ -200,8 +199,6 @@
]
''';
-const String KERNEL_TEXT_SERIALIZATION = " kernel text serialization ";
-
final Expectation runtimeError = ExpectationSet.Default["RuntimeError"];
const String experimentalFlagOptions = '--enable-experiment=';
@@ -358,7 +355,6 @@
bool updateComments,
this.skipVm,
this.semiFuzz,
- bool kernelTextSerialization,
CompileMode compileMode,
this.verify,
this.soundNullSafety)
@@ -402,9 +398,6 @@
}
steps.add(const TypeCheck());
steps.add(const EnsureNoErrors());
- if (kernelTextSerialization) {
- steps.add(const KernelTextSerialization());
- }
switch (compileMode) {
case CompileMode.full:
steps.add(const Transform());
@@ -758,7 +751,6 @@
"skipVm",
"semiFuzz",
"verify",
- KERNEL_TEXT_SERIALIZATION,
"platformBinaries",
COMPILATION_MODE,
};
@@ -788,8 +780,6 @@
bool skipVm = environment["skipVm"] == "true";
bool semiFuzz = environment["semiFuzz"] == "true";
bool verify = environment["verify"] != "false";
- bool kernelTextSerialization =
- environment.containsKey(KERNEL_TEXT_SERIALIZATION);
String? platformBinaries = environment["platformBinaries"];
if (platformBinaries != null && !platformBinaries.endsWith('/')) {
platformBinaries = '$platformBinaries/';
@@ -807,7 +797,6 @@
updateComments,
skipVm,
semiFuzz,
- kernelTextSerialization,
compileModeFromName(environment[COMPILATION_MODE]),
verify,
soundNullSafety));
@@ -1248,6 +1237,9 @@
}
return pass(result);
+ } catch (e, st) {
+ return new Result<ComponentResult>(result, semiFuzzCrash,
+ "Crashed with '$e' when fuzz compiling.\n\n$st");
} finally {
if (originalFlag != null) {
context.explicitExperimentalFlags[
diff --git a/pkg/front_end/test/fasta/text_serialization_suite.dart b/pkg/front_end/test/fasta/text_serialization_suite.dart
deleted file mode 100644
index caf682e..0000000
--- a/pkg/front_end/test/fasta/text_serialization_suite.dart
+++ /dev/null
@@ -1,19 +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.md file.
-
-library fasta.test.text_serialization_suite;
-
-import 'suite_utils.dart' show internalMain;
-import 'testing/suite.dart';
-
-Future<FastaContext> createContext(
- Chain suite, Map<String, String> environment) {
- environment[COMPILATION_MODE] = CompileMode.full.name;
- environment[KERNEL_TEXT_SERIALIZATION] = "";
- return FastaContext.create(suite, environment);
-}
-
-Future<void> main(List<String> arguments) async {
- await internalMain(createContext, arguments: arguments);
-}
diff --git a/pkg/front_end/test/unit_test_suites.dart b/pkg/front_end/test/unit_test_suites.dart
index 20fd455..f8eba4b 100644
--- a/pkg/front_end/test/unit_test_suites.dart
+++ b/pkg/front_end/test/unit_test_suites.dart
@@ -23,8 +23,6 @@
import 'fasta/modular_suite.dart' as modular show createContext;
import 'fasta/outline_suite.dart' as outline show createContext;
import 'fasta/strong_suite.dart' as strong show createContext;
-import 'fasta/text_serialization_suite.dart' as text_serialization
- show createContext;
import 'fasta/textual_outline_suite.dart' as textual_outline show createContext;
import 'fasta/weak_suite.dart' as weak show createContext;
import 'incremental_bulk_compiler_smoke_suite.dart' as incremental_bulk_compiler
@@ -386,13 +384,6 @@
requiresGit: true,
),
const Suite(
- "fasta/text_serialization",
- text_serialization.createContext,
- "../../testing.json",
- path: "fasta/text_serialization_suite.dart",
- shardCount: 10,
- ),
- const Suite(
"fasta/strong",
strong.createContext,
"../../testing.json",
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index 58b15da..94f121e 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -11,7 +11,7 @@
show isWindows, relativizeUri;
import 'package:front_end/src/api_prototype/compiler_options.dart'
- show CompilerOptions, DiagnosticMessage;
+ show DiagnosticMessage;
import 'package:front_end/src/base/processed_options.dart'
show ProcessedOptions;
@@ -21,15 +21,13 @@
import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
-import 'package:front_end/src/fasta/fasta_codes.dart' show templateUnspecified;
-
import 'package:front_end/src/fasta/kernel/kernel_target.dart'
show KernelTarget;
import 'package:front_end/src/fasta/kernel/utils.dart' show ByteSink;
import 'package:front_end/src/fasta/messages.dart'
- show DiagnosticMessageFromJson, LocatedMessage, Message;
+ show DiagnosticMessageFromJson;
import 'package:kernel/ast.dart'
show
@@ -54,9 +52,6 @@
import 'package:kernel/text/ast_to_text.dart' show Printer;
-import 'package:kernel/text/text_serialization_verifier.dart'
- show RoundTripStatus, TextSerializationVerifier;
-
import 'package:testing/testing.dart'
show
ChainContext,
@@ -359,77 +354,6 @@
}
}
-class KernelTextSerialization
- extends Step<ComponentResult, ComponentResult, ChainContext> {
- static const bool writeRoundTripStatus = bool.fromEnvironment(
- "text_serialization.writeRoundTripStatus",
- defaultValue: false);
-
- static const String suffix = ".roundtrip";
-
- const KernelTextSerialization();
-
- @override
- String get name => "kernel text serialization";
-
- @override
- Future<Result<ComponentResult>> run(
- ComponentResult result, ChainContext context) async {
- Component component = result.component;
- StringBuffer messages = new StringBuffer();
- ProcessedOptions options = new ProcessedOptions(
- options: new CompilerOptions()
- ..onDiagnostic = (DiagnosticMessage message) {
- if (messages.isNotEmpty) {
- messages.write("\n");
- }
- messages.writeAll(message.plainTextFormatted, "\n");
- });
- return await CompilerContext.runWithOptions(options,
- (compilerContext) async {
- component.computeCanonicalNames();
- compilerContext.uriToSource.addAll(component.uriToSource);
- TextSerializationVerifier verifier =
- new TextSerializationVerifier(root: component.root);
- for (Library library in component.libraries) {
- if (!library.importUri.isScheme("dart") &&
- !library.importUri.isScheme("package")) {
- verifier.verify(library);
- }
- }
-
- List<RoundTripStatus> failures = verifier.failures;
- for (RoundTripStatus failure in failures) {
- Message message = templateUnspecified.withArguments("\n${failure}");
- LocatedMessage locatedMessage = failure.uri != null
- ? message.withLocation(failure.uri!, failure.offset, 1)
- : message.withoutLocation();
- options.report(locatedMessage, locatedMessage.code.severity);
- }
-
- if (writeRoundTripStatus) {
- Uri uri = component.uriToSource.keys
- .firstWhere((uri) => uri.isScheme("file"));
- String filename = "${uri.toFilePath()}${suffix}";
- uri = new File(filename).uri;
- StringBuffer buffer = new StringBuffer();
- for (RoundTripStatus status in verifier.takeStatus()) {
- status.printOn(buffer);
- }
- await openWrite(uri, (IOSink sink) {
- sink.write(buffer.toString());
- });
- }
-
- if (failures.isNotEmpty) {
- return new Result<ComponentResult>(null,
- context.expectationSet["TextSerializationFailure"], "$messages");
- }
- return pass(result);
- });
- }
-}
-
class WriteDill extends Step<ComponentResult, ComponentResult, ChainContext> {
final bool skipVm;
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect
index ec6a7f6..e218902 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect
@@ -28,19 +28,19 @@
Extra constant evaluation status:
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:814:13 -> SymbolConstant(#catchError)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:814:13 -> ListConstant(const <Type*>[])
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:814:13 -> SymbolConstant(#test)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:865:13 -> SymbolConstant(#whenComplete)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:865:13 -> ListConstant(const <Type*>[])
-Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:865:13 -> MapConstant(const <Symbol*, dynamic>{})
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:909:13 -> SymbolConstant(#timeout)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:909:13 -> ListConstant(const <Type*>[])
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:909:13 -> SymbolConstant(#onTimeout)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:763:13 -> SymbolConstant(#then)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:763:13 -> SymbolConstant(#onError)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> SymbolConstant(#asStream)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> ListConstant(const <Type*>[])
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> ListConstant(const <dynamic>[])
-Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:821:13 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:821:13 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:821:13 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:872:13 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:872:13 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:872:13 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:916:13 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:916:13 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:916:13 -> SymbolConstant(#onTimeout)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:770:13 -> SymbolConstant(#then)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:770:13 -> SymbolConstant(#onError)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> MapConstant(const <Symbol*, dynamic>{})
Extra constant evaluation: evaluated: 61, effectively constant: 15
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 5eca28b..0d2af9b 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -13,6 +13,8 @@
dart2js/late_statics: SemiFuzzFailure
static_field_lowering/opt_in: SemiFuzzFailure
+dartdevc/static_interop_erasure/main: SemiFuzzCrash # https://github.com/dart-lang/sdk/issues/49301
+
const_functions/const_functions_list: SemiFuzzCrash
generic_metadata/typedef_generic_types_in_arguments_and_bounds: SemiFuzzCrash
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
deleted file mode 100644
index fda1207..0000000
--- a/pkg/front_end/testcases/text_serialization.status
+++ /dev/null
@@ -1,182 +0,0 @@
-# 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.md file.
-
-# Status file for the text_serialization_test.dart test suite. This is testing
-# the round trip for Kernel textual serialization where the initial binary
-# Kernel files are produced by compiling Dart code via Fasta.
-
-constructor_tearoffs/call_instantiation: TypeCheckError
-constructor_tearoffs/lowering/invalid_redirect: VerificationError
-enhanced_enums/declared_hashcode: TypeCheckError
-enhanced_enums/declared_index: TypeCheckError
-enhanced_enums/named_arguments_anywhere/issue48276: TextSerializationFailure # Issue 47524.
-enhanced_enums/named_arguments_anywhere/redirecting_constructor: TextSerializationFailure # Issue 47524.
-enhanced_enums/simple_mixins: RuntimeError
-extension_types/access_setter_as_getter: ExpectationFileMismatchSerialized # Expected.
-extension_types/call_not_get: ExpectationFileMismatchSerialized # Expected.
-extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
-extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
-extension_types/show_and_run_ceil: ExpectationFileMismatchSerialized # Expected.
-extension_types/simple: ExpectationFileMismatchSerialized # Expected.
-extension_types/simple_getter_resolution: ExpectationFileMismatchSerialized # Expected.
-extension_types/simple_method_resolution: ExpectationFileMismatchSerialized # Expected.
-extension_types/simple_operator_resolution: ExpectationFileMismatchSerialized # Expected.
-extension_types/simple_setter_resolution: ExpectationFileMismatchSerialized # Expected.
-extension_types/simple_show_hide: ExpectationFileMismatchSerialized # Expected.
-extension_types/type_variable_in_static_context: ExpectationFileMismatchSerialized # Expected.
-extensions/extension_setter_error: TypeCheckError
-extensions/instance_access_of_static: RuntimeError
-extensions/invalid_explicit_access: RuntimeError
-extensions/static_access_of_instance: RuntimeError
-general/abstract_members: TypeCheckError
-general/accessors: RuntimeError
-general/await_in_non_async: RuntimeError
-general/bounded_implicit_instantiation: TypeCheckError
-general/bounds_instances: TypeCheckError
-general/bug30695: TypeCheckError
-general/call: RuntimeError
-general/cascade: RuntimeError
-general/constructor_initializer_invalid: RuntimeError
-general/covariant_field: TypeCheckError
-general/covariant_generic2: RuntimeError
-general/covariant_generic: RuntimeError
-general/crashes/crash_02/main: Crash
-general/crashes/crash_06/main: Crash
-general/duplicated_field_initializer: RuntimeError
-general/error_locations/error_location_01: RuntimeError
-general/error_locations/error_location_02: RuntimeError
-general/error_locations/error_location_03: RuntimeError
-general/error_recovery/empty_await_for: RuntimeError
-general/error_recovery/empty_for: RuntimeError
-general/expressions: RuntimeError
-general/getter_vs_setter_type: TypeCheckError
-general/implement_semi_stub: TypeCheckError
-general/infer_field_from_multiple2: TypeCheckError
-general/infer_field_from_multiple: TypeCheckError
-general/invalid_operator: TypeCheckError
-general/invalid_operator_override: TypeCheckError
-general/invocations: TypeCheckError
-general/issue37776: RuntimeError
-general/issue41210a: TypeCheckError
-general/issue41210b/issue41210.no_link: TypeCheckError
-general/issue41210b/issue41210: TypeCheckError
-general/issue47994b: RuntimeError # Assertions are not enabled
-general/issue_46886: RuntimeError
-general/micro: RuntimeError
-general/mixin_application_override: TypeCheckError
-general/mixin_constructors_with_default_values: RuntimeError
-general/mixin_covariant2: RuntimeError
-general/named_parameters_super_and_not: TextSerializationFailure # Issue 47524.
-general/operator_method_not_found: RuntimeError
-general/optional: RuntimeError
-general/override_check_accessor_after_inference: TypeCheckError # Issue #31620
-general/override_check_accessor_basic: TypeCheckError # Issue #31620
-general/override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
-general/override_check_after_inference: TypeCheckError # Issue #31620
-general/override_check_basic: TypeCheckError # Issue #31620
-general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
-general/override_setter_with_field: TypeCheckError
-general/redirecting_factory: RuntimeError
-general/spread_collection: RuntimeError # Should be fixed as part of implementing spread collection support
-general/super_semi_stub: TypeCheckError
-general/type_variable_as_super: RuntimeError
-general/unsound_promotion: TypeCheckError
-general/void_methods: RuntimeError
-general/with_dependencies/issue_43084/issue_43084: RuntimeError
-inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
-inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: TypeCheckError
-inference/downwards_inference_for_each: RuntimeError
-inference/downwards_inference_on_list_literals_infer_downwards: RuntimeError
-inference/future_then_upwards: RuntimeError
-inference/future_then_upwards_2: RuntimeError
-inference/generic_methods_correctly_recognize_generic_upper_bound: TypeCheckError
-inference/generic_methods_do_not_infer_invalid_override_of_generic_method: TypeCheckError
-inference/generic_methods_handle_override_of_non_generic_with_generic: TypeCheckError
-inference/infer_method_missing_params: TypeCheckError
-inference/infer_type_regardless_of_declaration_order_or_cycles: RuntimeError
-inference/infer_types_on_generic_instantiations_4: RuntimeError
-inference/infer_types_on_generic_instantiations_infer: TypeCheckError
-inference/instantiate_to_bounds_generic_has_bound_defined_after transform: RuntimeError
-inference/mixin_inference_outwards_3: TypeCheckError
-inference/mixin_inference_outwards_4: TypeCheckError
-inference/mixin_inference_unification_1: TypeCheckError
-inference/mixin_inference_unification_2: TypeCheckError
-inference/override_equals: RuntimeError
-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
-late_lowering/covariant_late_field: TypeCheckError
-named_arguments_anywhere/redirecting_constructor_initializers: TextSerializationFailure # Issue 47524.
-nnbd/covariant_late_field: TypeCheckError
-nnbd/getter_vs_setter_type: TypeCheckError
-nnbd/issue42603: TypeCheckError
-nnbd/no_support_for_old_null_aware_index_access_syntax: RuntimeError # Expected.
-nnbd_mixed/bad_mixins: TypeCheckError
-nnbd_mixed/covariant_from_opt_in: TypeCheckError
-nnbd_mixed/hierarchy/conflict: TypeCheckError
-nnbd_mixed/hierarchy/duplicates: TypeCheckError
-nnbd_mixed/hierarchy/forwarding_semi_stub_field: TypeCheckError
-nnbd_mixed/hierarchy/forwarding_semi_stub_method: TypeCheckError
-nnbd_mixed/hierarchy/forwarding_semi_stub_setter: TypeCheckError
-nnbd_mixed/hierarchy/getter_setter: TypeCheckError
-nnbd_mixed/hierarchy/mix_in_override: TypeCheckError
-nnbd_mixed/hierarchy/override: TypeCheckError
-nnbd_mixed/inheritance_from_opt_in: TypeCheckError
-nnbd_mixed/issue41567: TypeCheckError
-nnbd_mixed/messages_with_types_opt_in: TypeCheckError
-nnbd_mixed/messages_with_types_opt_out: TypeCheckError
-nnbd_mixed/mixin_from_opt_in/main: RuntimeError
-rasta/abstract_constructor: RuntimeError
-rasta/bad_constructor_redirection: RuntimeError
-rasta/bad_continue: RuntimeError
-rasta/bad_default_constructor: RuntimeError
-rasta/bad_explicit_super_constructor: RuntimeError
-rasta/bad_implicit_super_constructor: RuntimeError
-rasta/bad_interpolation: RuntimeError
-rasta/bad_redirection: RuntimeError
-rasta/bad_setter_initializer: RuntimeError
-rasta/breaking_bad: RuntimeError
-rasta/class_hierarchy: RuntimeError
-rasta/constant_get_and_invoke: RuntimeError
-rasta/generic_factory: RuntimeError
-rasta/issue_000001: RuntimeError
-rasta/issue_000031: RuntimeError
-rasta/issue_000032: RuntimeError
-rasta/issue_000034: RuntimeError
-rasta/issue_000036: RuntimeError
-rasta/issue_000041: RuntimeError
-rasta/issue_000042: RuntimeError
-rasta/issue_000044: RuntimeError
-rasta/malformed_const_constructor: RuntimeError
-rasta/malformed_function: RuntimeError
-rasta/parser_error: RuntimeError
-rasta/static: RuntimeError
-rasta/super: RuntimeError
-rasta/super_mixin: RuntimeError
-rasta/type_literals: RuntimeError
-rasta/typedef: RuntimeError
-rasta/unresolved: RuntimeError
-rasta/unresolved_constructor: RuntimeError
-rasta/unresolved_for_in: RuntimeError
-regress/issue_29976: RuntimeError
-regress/issue_29982: RuntimeError
-regress/issue_31180: TypeCheckError
-regress/issue_31180_2: TypeCheckError
-regress/issue_32972: RuntimeError
-regress/issue_33452: RuntimeError
-regress/issue_34225: RuntimeError
-regress/issue_34563: RuntimeError
-regress/issue_35258: RuntimeError
-regress/issue_35259: RuntimeError
-regress/issue_35260: RuntimeError
-regress/issue_35266: RuntimeError
-regress/issue_37285: RuntimeError
-regress/issue_39091_2: RuntimeError
-runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
-set_literals/disambiguation_rule: RuntimeError
-set_literals/disambiguation_rule2: RuntimeError
-value_class/copy_with_call_sites: RuntimeError # Expected
-value_class/simple: RuntimeError # Expected
-value_class/value_extends_non_value: RuntimeError # Expected
-value_class/value_implements_non_value: RuntimeError # Expected
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 6154e48..f8898ce 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -10,6 +10,8 @@
no_such_method_forwarders/abstract_override_abstract_different_type: SemiFuzzFailure
no_such_method_forwarders/abstract_override_with_different_signature: SemiFuzzFailure
+dartdevc/static_interop_erasure/main: SemiFuzzCrash # https://github.com/dart-lang/sdk/issues/49301
+
dart2js/tear_off_patch/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
general/constants/with_unevaluated_agnostic/various_2: SemiFuzzFailure # Looks similar to https://dart-review.googlesource.com/c/sdk/+/242441
general/no_such_method_forwarder: SemiFuzzFailure # https://dart-review.googlesource.com/c/sdk/+/242444
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 2d92f0b..435e80e 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -82,23 +82,6 @@
]
},
{
- "name": "text_serialization",
- "kind": "Chain",
- "source": "test/fasta/text_serialization_suite.dart",
- "path": "testcases/",
- "status": "testcases/text_serialization.status",
- "pattern": [
- "\\.dart$",
- "\\.crash_dart$"
- ],
- "exclude": [
- "/testcases/.*_part[0-9]*\\.dart$",
- "/testcases/.*_lib[0-9]*\\.dart$",
- "/testcases/dartino/",
- "/testcases/expression/"
- ]
- },
- {
"name": "modular",
"kind": "Chain",
"source": "test/fasta/modular_suite.dart",
diff --git a/pkg/front_end/tool/update_expectations.dart b/pkg/front_end/tool/update_expectations.dart
index 8a99e2e..fd75621 100644
--- a/pkg/front_end/tool/update_expectations.dart
+++ b/pkg/front_end/tool/update_expectations.dart
@@ -9,7 +9,6 @@
'outline',
'strong',
'modular',
- 'text_serialization',
'textual_outline',
];
diff --git a/pkg/kernel/lib/text/serializer_combinators.dart b/pkg/kernel/lib/text/serializer_combinators.dart
deleted file mode 100644
index 7eed26a..0000000
--- a/pkg/kernel/lib/text/serializer_combinators.dart
+++ /dev/null
@@ -1,923 +0,0 @@
-// 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.
-
-library kernel.serializer_combinators;
-
-import 'dart:convert' show json;
-
-import '../ast.dart' show Node;
-import '../canonical_name.dart' show CanonicalName;
-import 'text_serializer.dart' show Tagger;
-
-class DeserializationEnvironment<T extends Node> {
- final DeserializationEnvironment<T>? parent;
-
- final Map<String, T> locals = <String, T>{};
-
- final Map<String, T> binders = <String, T>{};
-
- final Map<T, String> distinctNames = new Map<T, String>.identity();
-
- DeserializationEnvironment(this.parent);
-
- T lookup(String name) =>
- locals[name] ??
- parent?.lookup(name) ??
- (throw StateError("No local '${name}' found in this scope."));
-
- T addBinder(T node, String distinctName) {
- if (lookupDistinctName(node) != null) {
- throw StateError(
- "Name '${distinctName}' is already declared in this scope.");
- }
- distinctNames[node] = distinctName;
- return binders[distinctName] = node;
- }
-
- // TODO(cstefantsova): Consider combining with [addBinder] into a single
- // method.
- void extend() {
- locals.addAll(binders);
- binders.clear();
- }
-
- String? lookupDistinctName(T object) {
- return distinctNames[object] ?? parent?.lookupDistinctName(object);
- }
-}
-
-class SerializationEnvironment<T extends Node> {
- final SerializationEnvironment<T>? parent;
-
- final Map<T, String> locals = new Map<T, String>.identity();
-
- final Map<T, String> binders = new Map<T, String>.identity();
-
- int nameCount;
-
- Map<T, String> distinctNames = new Map<T, String>.identity();
-
- SerializationEnvironment(this.parent) : nameCount = parent?.nameCount ?? 0;
-
- String lookup(T node) =>
- locals[node] ??
- parent?.lookup(node) ??
- (throw StateError("No name for ${node} found in this scope."));
-
- String addBinder(T node, {String? nameClue}) {
- final String separator = "^";
- final int codeOfZero = "0".codeUnitAt(0);
- final int codeOfNine = "9".codeUnitAt(0);
-
- String prefix;
- if (nameClue != null) {
- int prefixLength = nameClue.length - 1;
- bool isOnlyDigits = true;
- while (prefixLength >= 0 && nameClue[prefixLength] != separator) {
- int code = nameClue.codeUnitAt(prefixLength);
- isOnlyDigits =
- isOnlyDigits && (codeOfZero <= code && code <= codeOfNine);
- --prefixLength;
- }
- if (prefixLength < 0 || !isOnlyDigits) {
- prefixLength = nameClue.length;
- }
- prefix = nameClue.substring(0, prefixLength);
- } else {
- prefix = "ID";
- }
- String distinctName = "$prefix$separator${nameCount++}";
- // The following checks for an internal error, not an error caused by the
- // user. So, an assert is used instead of an exception.
- assert(
- lookupDistinctName(node) == null,
- "Can't assign distinct name '${distinctName}' "
- "to an object of kind '${node.runtimeType}': "
- "it's already known by name '${lookupDistinctName(node)}'.");
- distinctNames[node] = distinctName;
- return binders[node] = distinctName;
- }
-
- // TODO(cstefantsova): Consider combining with [addBinder] into a single
- // method.
- void extend() {
- locals.addAll(binders);
- binders.clear();
- }
-
- String? lookupDistinctName(T object) {
- return distinctNames[object] ?? parent?.lookupDistinctName(object);
- }
-}
-
-class DeserializationState {
- final DeserializationEnvironment environment;
- final CanonicalName nameRoot;
-
- DeserializationState(this.environment, this.nameRoot);
-}
-
-class SerializationState {
- final SerializationEnvironment environment;
-
- SerializationState(this.environment);
-}
-
-abstract class TextSerializer<T> {
- const TextSerializer();
-
- T readFrom(Iterator<Object?> stream, DeserializationState? state);
- void writeTo(StringBuffer buffer, T object, SerializationState? state);
-
- /// True if this serializer/deserializer writes/reads nothing. This is true
- /// for the serializer [Nothing] and also some serializers derived from it.
- bool get isEmpty => false;
-}
-
-class Nothing extends TextSerializer<void> {
- const Nothing();
-
- @override
- void readFrom(Iterator<Object?> stream, DeserializationState? _) {}
-
- @override
- void writeTo(StringBuffer buffer, void ignored, SerializationState? _) {}
-
- @override
- bool get isEmpty => true;
-}
-
-class DartString extends TextSerializer<String> {
- const DartString();
-
- @override
- String readFrom(Iterator<Object?> stream, DeserializationState? _) {
- Object? current = stream.current;
- if (current is! String) {
- throw StateError("Expected an atom, found a list: '${current}'.");
- }
- String result = json.decode(current);
- stream.moveNext();
- return result;
- }
-
- @override
- void writeTo(StringBuffer buffer, String object, SerializationState? _) {
- buffer.write(json.encode(object));
- }
-}
-
-class DartInt extends TextSerializer<int> {
- const DartInt();
-
- @override
- int readFrom(Iterator<Object?> stream, DeserializationState? _) {
- Object? current = stream.current;
- if (current is! String) {
- throw StateError("Expected an atom, found a list: '${current}'.");
- }
- int result = int.parse(current);
- stream.moveNext();
- return result;
- }
-
- @override
- void writeTo(StringBuffer buffer, int object, SerializationState? _) {
- buffer.write(object);
- }
-}
-
-class DartDouble extends TextSerializer<double> {
- const DartDouble();
-
- @override
- double readFrom(Iterator<Object?> stream, DeserializationState? _) {
- Object? current = stream.current;
- if (current is! String) {
- throw StateError("Expected an atom, found a list: '${current}'.");
- }
- double result = double.parse(current);
- stream.moveNext();
- return result;
- }
-
- @override
- void writeTo(StringBuffer buffer, double object, SerializationState? _) {
- buffer.write(object);
- }
-}
-
-class DartBool extends TextSerializer<bool> {
- const DartBool();
-
- @override
- bool readFrom(Iterator<Object?> stream, DeserializationState? _) {
- Object? current = stream.current;
- if (current is! String) {
- throw StateError("Expected an atom, found a list: '${current}'.");
- }
- bool result;
- if (current == "true") {
- result = true;
- } else if (current == "false") {
- result = false;
- } else {
- throw StateError("Expected 'true' or 'false', found '${current}'");
- }
- stream.moveNext();
- return result;
- }
-
- @override
- void writeTo(StringBuffer buffer, bool object, SerializationState? _) {
- buffer.write(object ? 'true' : 'false');
- }
-}
-
-class UriSerializer extends TextSerializer<Uri> {
- const UriSerializer();
-
- @override
- Uri readFrom(Iterator<Object?> stream, DeserializationState? state) {
- String uriAsString = const DartString().readFrom(stream, state);
- return Uri.parse(uriAsString);
- }
-
- @override
- void writeTo(StringBuffer buffer, Uri object, SerializationState? state) {
- const DartString().writeTo(buffer, object.toString(), state);
- }
-}
-
-// == Serializers for tagged (disjoint) unions.
-//
-// They require a function mapping serializables to a tag string. This is
-// implemented by Tagger visitors.
-// A tagged union of serializer/deserializers.
-class Case<T> extends TextSerializer<T> {
- final Tagger<T> tagger;
- final List<String> _tags;
- final List<TextSerializer<T>> _serializers;
-
- Case(this.tagger, Map<String, TextSerializer<T>> tagsAndSerializers)
- : _tags = tagsAndSerializers.keys.toList(),
- _serializers = tagsAndSerializers.values.toList();
-
- Case.uninitialized(this.tagger)
- : _tags = [],
- _serializers = [];
-
- void registerTags(Map<String, TextSerializer<T>> tagsAndSerializers) {
- _tags.addAll(tagsAndSerializers.keys);
- _serializers.addAll(tagsAndSerializers.values);
- }
-
- @override
- T readFrom(Iterator<Object?> stream, DeserializationState? state) {
- Object? iterator = stream.current;
- if (iterator is! Iterator<Object?>) {
- throw StateError("Expected list, found atom: '${iterator}'.");
- }
- iterator.moveNext();
- Object? element = iterator.current;
- if (element is! String) {
- throw StateError("Expected atom, found list: '${element}'.");
- }
- String tag = element;
- for (int i = 0; i < _tags.length; ++i) {
- if (_tags[i] == tag) {
- iterator.moveNext();
- T result = _serializers[i].readFrom(iterator, state);
- if (iterator.moveNext()) {
- throw StateError(
- "Extra data in tagged '${tag}': '${iterator.current}'.");
- }
- stream.moveNext();
- return result;
- }
- }
- throw StateError("Unrecognized tag '${tag}'.");
- }
-
- @override
- void writeTo(StringBuffer buffer, T object, SerializationState? state) {
- String tag = tagger.tag(object);
- for (int i = 0; i < _tags.length; ++i) {
- if (_tags[i] == tag) {
- buffer.write("(${tag}");
- if (!_serializers[i].isEmpty) {
- buffer.write(" ");
- }
- _serializers[i].writeTo(buffer, object, state);
- buffer.write(")");
- return;
- }
- }
- throw StateError("Unrecognized tag '${tag}'.");
- }
-}
-
-// A serializer/deserializer that unwraps/wraps nodes before serialization and
-// after deserialization.
-class Wrapped<S, K> extends TextSerializer<K> {
- final S Function(K) unwrap;
- final K Function(S) wrap;
- final TextSerializer<S> contents;
-
- const Wrapped(this.unwrap, this.wrap, this.contents);
-
- @override
- K readFrom(Iterator<Object?> stream, DeserializationState? state) {
- return wrap(contents.readFrom(stream, state));
- }
-
- @override
- void writeTo(StringBuffer buffer, K object, SerializationState? state) {
- contents.writeTo(buffer, unwrap(object), state);
- }
-
- @override
- bool get isEmpty => contents.isEmpty;
-}
-
-class ScopedUse<T extends Node> extends TextSerializer<T> {
- final DartString stringSerializer = const DartString();
-
- const ScopedUse();
-
- @override
- T readFrom(Iterator<Object?> stream, DeserializationState? state) {
- if (state == null) {
- throw StateError(
- "No deserialization state provided for ${runtimeType}.readFrom.");
- }
- return state.environment.lookup(stringSerializer.readFrom(stream, null))
- as T;
- }
-
- @override
- void writeTo(StringBuffer buffer, T object, SerializationState? state) {
- if (state == null) {
- throw StateError(
- "No serialization state provided for ${runtimeType}.writeTo.");
- }
- stringSerializer.writeTo(buffer, state.environment.lookup(object), null);
- }
-}
-
-// A serializer/deserializer for pairs.
-class Tuple2Serializer<T1, T2> extends TextSerializer<Tuple2<T1, T2>> {
- final TextSerializer<T1> first;
- final TextSerializer<T2> second;
-
- const Tuple2Serializer(this.first, this.second);
-
- @override
- Tuple2<T1, T2> readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- return new Tuple2(
- first.readFrom(stream, state), second.readFrom(stream, state));
- }
-
- @override
- void writeTo(
- StringBuffer buffer, Tuple2<T1, T2> object, SerializationState? state) {
- first.writeTo(buffer, object.first, state);
- if (!second.isEmpty) buffer.write(' ');
- second.writeTo(buffer, object.second, state);
- }
-}
-
-class Tuple2<T1, T2> {
- final T1 first;
- final T2 second;
-
- const Tuple2(this.first, this.second);
-}
-
-class Tuple3Serializer<T1, T2, T3> extends TextSerializer<Tuple3<T1, T2, T3>> {
- final TextSerializer<T1> first;
- final TextSerializer<T2> second;
- final TextSerializer<T3> third;
-
- const Tuple3Serializer(this.first, this.second, this.third);
-
- @override
- Tuple3<T1, T2, T3> readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- return new Tuple3(first.readFrom(stream, state),
- second.readFrom(stream, state), third.readFrom(stream, state));
- }
-
- @override
- void writeTo(StringBuffer buffer, Tuple3<T1, T2, T3> object,
- SerializationState? state) {
- first.writeTo(buffer, object.first, state);
- if (!second.isEmpty) buffer.write(' ');
- second.writeTo(buffer, object.second, state);
- if (!third.isEmpty) buffer.write(' ');
- third.writeTo(buffer, object.third, state);
- }
-}
-
-class Tuple3<T1, T2, T3> {
- final T1 first;
- final T2 second;
- final T3 third;
-
- const Tuple3(this.first, this.second, this.third);
-}
-
-class Tuple4Serializer<T1, T2, T3, T4>
- extends TextSerializer<Tuple4<T1, T2, T3, T4>> {
- final TextSerializer<T1> first;
- final TextSerializer<T2> second;
- final TextSerializer<T3> third;
- final TextSerializer<T4> fourth;
-
- const Tuple4Serializer(this.first, this.second, this.third, this.fourth);
-
- @override
- Tuple4<T1, T2, T3, T4> readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- return new Tuple4(
- first.readFrom(stream, state),
- second.readFrom(stream, state),
- third.readFrom(stream, state),
- fourth.readFrom(stream, state));
- }
-
- @override
- void writeTo(StringBuffer buffer, Tuple4<T1, T2, T3, T4> object,
- SerializationState? state) {
- first.writeTo(buffer, object.first, state);
- if (!second.isEmpty) buffer.write(' ');
- second.writeTo(buffer, object.second, state);
- if (!third.isEmpty) buffer.write(' ');
- third.writeTo(buffer, object.third, state);
- if (!fourth.isEmpty) buffer.write(' ');
- fourth.writeTo(buffer, object.fourth, state);
- }
-}
-
-class Tuple4<T1, T2, T3, T4> {
- final T1 first;
- final T2 second;
- final T3 third;
- final T4 fourth;
-
- const Tuple4(this.first, this.second, this.third, this.fourth);
-}
-
-class Tuple5Serializer<T1, T2, T3, T4, T5>
- extends TextSerializer<Tuple5<T1, T2, T3, T4, T5>> {
- final TextSerializer<T1> first;
- final TextSerializer<T2> second;
- final TextSerializer<T3> third;
- final TextSerializer<T4> fourth;
- final TextSerializer<T5> fifth;
-
- const Tuple5Serializer(
- this.first, this.second, this.third, this.fourth, this.fifth);
-
- @override
- Tuple5<T1, T2, T3, T4, T5> readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- return new Tuple5(
- first.readFrom(stream, state),
- second.readFrom(stream, state),
- third.readFrom(stream, state),
- fourth.readFrom(stream, state),
- fifth.readFrom(stream, state));
- }
-
- @override
- void writeTo(StringBuffer buffer, Tuple5<T1, T2, T3, T4, T5> object,
- SerializationState? state) {
- first.writeTo(buffer, object.first, state);
- if (!second.isEmpty) buffer.write(' ');
- second.writeTo(buffer, object.second, state);
- if (!third.isEmpty) buffer.write(' ');
- third.writeTo(buffer, object.third, state);
- if (!fourth.isEmpty) buffer.write(' ');
- fourth.writeTo(buffer, object.fourth, state);
- if (!fifth.isEmpty) buffer.write(' ');
- fifth.writeTo(buffer, object.fifth, state);
- }
-}
-
-class Tuple5<T1, T2, T3, T4, T5> {
- final T1 first;
- final T2 second;
- final T3 third;
- final T4 fourth;
- final T5 fifth;
-
- const Tuple5(this.first, this.second, this.third, this.fourth, this.fifth);
-}
-
-class Tuple6Serializer<T1, T2, T3, T4, T5, T6>
- extends TextSerializer<Tuple6<T1, T2, T3, T4, T5, T6>> {
- final TextSerializer<T1> first;
- final TextSerializer<T2> second;
- final TextSerializer<T3> third;
- final TextSerializer<T4> fourth;
- final TextSerializer<T5> fifth;
- final TextSerializer<T6> sixth;
-
- const Tuple6Serializer(
- this.first, this.second, this.third, this.fourth, this.fifth, this.sixth);
-
- @override
- Tuple6<T1, T2, T3, T4, T5, T6> readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- return new Tuple6(
- first.readFrom(stream, state),
- second.readFrom(stream, state),
- third.readFrom(stream, state),
- fourth.readFrom(stream, state),
- fifth.readFrom(stream, state),
- sixth.readFrom(stream, state));
- }
-
- @override
- void writeTo(StringBuffer buffer, Tuple6<T1, T2, T3, T4, T5, T6> object,
- SerializationState? state) {
- first.writeTo(buffer, object.first, state);
- if (!second.isEmpty) buffer.write(' ');
- second.writeTo(buffer, object.second, state);
- if (!third.isEmpty) buffer.write(' ');
- third.writeTo(buffer, object.third, state);
- if (!fourth.isEmpty) buffer.write(' ');
- fourth.writeTo(buffer, object.fourth, state);
- if (!fifth.isEmpty) buffer.write(' ');
- fifth.writeTo(buffer, object.fifth, state);
- if (!sixth.isEmpty) buffer.write(' ');
- sixth.writeTo(buffer, object.sixth, state);
- }
-}
-
-class Tuple6<T1, T2, T3, T4, T5, T6> {
- final T1 first;
- final T2 second;
- final T3 third;
- final T4 fourth;
- final T5 fifth;
- final T6 sixth;
-
- const Tuple6(
- this.first, this.second, this.third, this.fourth, this.fifth, this.sixth);
-}
-
-class Tuple7Serializer<T1, T2, T3, T4, T5, T6, T7>
- extends TextSerializer<Tuple7<T1, T2, T3, T4, T5, T6, T7>> {
- final TextSerializer<T1> first;
- final TextSerializer<T2> second;
- final TextSerializer<T3> third;
- final TextSerializer<T4> fourth;
- final TextSerializer<T5> fifth;
- final TextSerializer<T6> sixth;
- final TextSerializer<T7> seventh;
-
- const Tuple7Serializer(this.first, this.second, this.third, this.fourth,
- this.fifth, this.sixth, this.seventh);
-
- @override
- Tuple7<T1, T2, T3, T4, T5, T6, T7> readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- return new Tuple7(
- first.readFrom(stream, state),
- second.readFrom(stream, state),
- third.readFrom(stream, state),
- fourth.readFrom(stream, state),
- fifth.readFrom(stream, state),
- sixth.readFrom(stream, state),
- seventh.readFrom(stream, state));
- }
-
- @override
- void writeTo(StringBuffer buffer, Tuple7<T1, T2, T3, T4, T5, T6, T7> object,
- SerializationState? state) {
- first.writeTo(buffer, object.first, state);
- if (!second.isEmpty) buffer.write(' ');
- second.writeTo(buffer, object.second, state);
- if (!third.isEmpty) buffer.write(' ');
- third.writeTo(buffer, object.third, state);
- if (!fourth.isEmpty) buffer.write(' ');
- fourth.writeTo(buffer, object.fourth, state);
- if (!fifth.isEmpty) buffer.write(' ');
- fifth.writeTo(buffer, object.fifth, state);
- if (!sixth.isEmpty) buffer.write(' ');
- sixth.writeTo(buffer, object.sixth, state);
- if (!seventh.isEmpty) buffer.write(' ');
- seventh.writeTo(buffer, object.seventh, state);
- }
-}
-
-class Tuple7<T1, T2, T3, T4, T5, T6, T7> {
- final T1 first;
- final T2 second;
- final T3 third;
- final T4 fourth;
- final T5 fifth;
- final T6 sixth;
- final T7 seventh;
-
- const Tuple7(this.first, this.second, this.third, this.fourth, this.fifth,
- this.sixth, this.seventh);
-}
-
-class Tuple8Serializer<T1, T2, T3, T4, T5, T6, T7, T8>
- extends TextSerializer<Tuple8<T1, T2, T3, T4, T5, T6, T7, T8>> {
- final TextSerializer<T1> first;
- final TextSerializer<T2> second;
- final TextSerializer<T3> third;
- final TextSerializer<T4> fourth;
- final TextSerializer<T5> fifth;
- final TextSerializer<T6> sixth;
- final TextSerializer<T7> seventh;
- final TextSerializer<T8> eighth;
-
- const Tuple8Serializer(this.first, this.second, this.third, this.fourth,
- this.fifth, this.sixth, this.seventh, this.eighth);
-
- @override
- Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- return new Tuple8(
- first.readFrom(stream, state),
- second.readFrom(stream, state),
- third.readFrom(stream, state),
- fourth.readFrom(stream, state),
- fifth.readFrom(stream, state),
- sixth.readFrom(stream, state),
- seventh.readFrom(stream, state),
- eighth.readFrom(stream, state));
- }
-
- @override
- void writeTo(
- StringBuffer buffer,
- Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> object,
- SerializationState? state) {
- first.writeTo(buffer, object.first, state);
- if (!second.isEmpty) buffer.write(' ');
- second.writeTo(buffer, object.second, state);
- if (!third.isEmpty) buffer.write(' ');
- third.writeTo(buffer, object.third, state);
- if (!fourth.isEmpty) buffer.write(' ');
- fourth.writeTo(buffer, object.fourth, state);
- if (!fifth.isEmpty) buffer.write(' ');
- fifth.writeTo(buffer, object.fifth, state);
- if (!sixth.isEmpty) buffer.write(' ');
- sixth.writeTo(buffer, object.sixth, state);
- if (!seventh.isEmpty) buffer.write(' ');
- seventh.writeTo(buffer, object.seventh, state);
- if (!eighth.isEmpty) buffer.write(' ');
- eighth.writeTo(buffer, object.eighth, state);
- }
-}
-
-class Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> {
- final T1 first;
- final T2 second;
- final T3 third;
- final T4 fourth;
- final T5 fifth;
- final T6 sixth;
- final T7 seventh;
- final T8 eighth;
-
- const Tuple8(this.first, this.second, this.third, this.fourth, this.fifth,
- this.sixth, this.seventh, this.eighth);
-}
-
-// A serializer/deserializer for lists.
-class ListSerializer<T> extends TextSerializer<List<T>> {
- final TextSerializer<T> elements;
-
- const ListSerializer(this.elements);
-
- @override
- List<T> readFrom(Iterator<Object?> stream, DeserializationState? state) {
- Object? iterator = stream.current;
- if (iterator is! Iterator<Object?>) {
- throw StateError("Expected a list, found an atom: '${iterator}'.");
- }
- iterator.moveNext();
- List<T> result = [];
- while (iterator.current != null) {
- result.add(elements.readFrom(iterator, state));
- }
- stream.moveNext();
- return result;
- }
-
- @override
- void writeTo(StringBuffer buffer, List<T> object, SerializationState? state) {
- buffer.write('(');
- for (int i = 0; i < object.length; ++i) {
- if (i != 0) buffer.write(' ');
- elements.writeTo(buffer, object[i], state);
- }
- buffer.write(')');
- }
-}
-
-class Optional<T> extends TextSerializer<T?> {
- final TextSerializer<T> contents;
-
- const Optional(this.contents);
-
- @override
- T? readFrom(Iterator<Object?> stream, DeserializationState? state) {
- if (stream.current == '_') {
- stream.moveNext();
- return null;
- }
- return contents.readFrom(stream, state);
- }
-
- @override
- void writeTo(StringBuffer buffer, T? object, SerializationState? state) {
- if (object == null) {
- buffer.write('_');
- } else {
- contents.writeTo(buffer, object, state);
- }
- }
-}
-
-/// Introduces a binder to the environment.
-///
-/// Serializes an object and uses it as a binder for the name that is retrieved
-/// from the object using [nameGetter] and (temporarily) modified using
-/// [nameSetter]. The binder is added to the enclosing environment.
-class Binder<T extends Node> extends TextSerializer<Tuple2<String?, T>> {
- final Tuple2Serializer<String, T> namedContents;
-
- Binder(TextSerializer<T> contents)
- : namedContents = new Tuple2Serializer(const DartString(), contents);
-
- @override
- Tuple2<String, T> readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- if (state == null) {
- throw StateError(
- "No deserialization state provided for ${runtimeType}.readFrom.");
- }
- Tuple2<String, T> namedObject = namedContents.readFrom(stream, state);
- String name = namedObject.first;
- T object = namedObject.second;
- state.environment.addBinder(object, name);
- return new Tuple2(name, object);
- }
-
- @override
- void writeTo(StringBuffer buffer, Tuple2<String?, T> namedObject,
- SerializationState? state) {
- if (state == null) {
- throw StateError(
- "No serialization state provided for ${runtimeType}.writeTo.");
- }
- String? nameClue = namedObject.first;
- T object = namedObject.second;
- String distinctName =
- state.environment.addBinder(object, nameClue: nameClue);
- namedContents.writeTo(buffer, new Tuple2(distinctName, object), state);
- }
-}
-
-/// Binds binders from one term in the other.
-///
-/// Serializes a [Tuple2] of [pattern] and [term], closing [term] over the
-/// binders found in [pattern]. The binders aren't added to the enclosing
-/// environment.
-class Bind<P, T> extends TextSerializer<Tuple2<P, T>> {
- final TextSerializer<P> pattern;
- final TextSerializer<T> term;
-
- const Bind(this.pattern, this.term);
-
- @override
- Tuple2<P, T> readFrom(Iterator<Object?> stream, DeserializationState? state) {
- if (state == null) {
- throw StateError(
- "No deserialization state provided for ${runtimeType}.readFrom.");
- }
- DeserializationState bindingState = new DeserializationState(
- new DeserializationEnvironment(state.environment), state.nameRoot);
- P first = pattern.readFrom(stream, bindingState);
- bindingState.environment.extend();
- T second = term.readFrom(stream, bindingState);
- return new Tuple2(first, second);
- }
-
- @override
- void writeTo(
- StringBuffer buffer, Tuple2<P, T> tuple, SerializationState? state) {
- if (state == null) {
- throw StateError(
- "No serialization state provided for ${runtimeType}.writeTo.");
- }
- SerializationState bindingState =
- new SerializationState(new SerializationEnvironment(state.environment));
- pattern.writeTo(buffer, tuple.first, bindingState);
- bindingState.environment.extend();
- buffer.write(' ');
- term.writeTo(buffer, tuple.second, bindingState);
- }
-}
-
-/// Nested binding pattern that also binds binders from one term in the other.
-///
-/// Serializes a [Tuple2] of [pattern1] and [pattern2], closing [pattern2] over
-/// the binders found in [pattern1]. The binders from both [pattern1] and
-/// [pattern2] are added to the enclosing environment.
-class Rebind<P, T> extends TextSerializer<Tuple2<P, T>> {
- final TextSerializer<P> pattern1;
- final TextSerializer<T> pattern2;
-
- const Rebind(this.pattern1, this.pattern2);
-
- @override
- Tuple2<P, T> readFrom(Iterator<Object?> stream, DeserializationState? state) {
- if (state == null) {
- throw StateError(
- "No deserialization state provided for ${runtimeType}.readFrom.");
- }
- P first = pattern1.readFrom(stream, state);
- DeserializationState closedState = new DeserializationState(
- new DeserializationEnvironment(state.environment)
- ..binders.addAll(state.environment.binders)
- ..extend(),
- state.nameRoot);
- T second = pattern2.readFrom(stream, closedState);
- state.environment.binders.addAll(closedState.environment.binders);
- return new Tuple2(first, second);
- }
-
- @override
- void writeTo(
- StringBuffer buffer, Tuple2<P, T> tuple, SerializationState? state) {
- if (state == null) {
- throw StateError(
- "No serialization state provided for ${runtimeType}.writeTo.");
- }
- pattern1.writeTo(buffer, tuple.first, state);
- SerializationState closedState =
- new SerializationState(new SerializationEnvironment(state.environment)
- ..binders.addAll(state.environment.binders)
- ..extend());
- buffer.write(' ');
- pattern2.writeTo(buffer, tuple.second, closedState);
- state.environment.binders.addAll(closedState.environment.binders);
- }
-}
-
-class Zip<T, T1, T2> extends TextSerializer<List<T>> {
- final TextSerializer<Tuple2<List<T1>, List<T2>>> lists;
- final T Function(T1, T2) zip;
- final Tuple2<T1, T2> Function(T) unzip;
-
- const Zip(this.lists, this.zip, this.unzip);
-
- @override
- List<T> readFrom(Iterator<Object?> stream, DeserializationState? state) {
- Tuple2<List<T1>, List<T2>> toZip = lists.readFrom(stream, state);
- List<T1> firsts = toZip.first;
- List<T> zipped;
- if (firsts.isEmpty) {
- zipped = <T>[];
- } else {
- List<T2> seconds = toZip.second;
- zipped =
- new List<T>.filled(toZip.first.length, zip(firsts[0], seconds[0]));
- for (int i = 1; i < zipped.length; ++i) {
- zipped[i] = zip(firsts[i], seconds[i]);
- }
- }
- return zipped;
- }
-
- @override
- void writeTo(StringBuffer buffer, List<T> zipped, SerializationState? state) {
- List<T1> firsts;
- List<T2> seconds;
- if (zipped.isEmpty) {
- firsts = <T1>[];
- seconds = <T2>[];
- } else {
- Tuple2<T1, T2> initial = unzip(zipped[0]);
- firsts = new List<T1>.filled(zipped.length, initial.first);
- seconds = new List<T2>.filled(zipped.length, initial.second);
- for (int i = 1; i < zipped.length; ++i) {
- Tuple2<T1, T2> tuple = unzip(zipped[i]);
- firsts[i] = tuple.first;
- seconds[i] = tuple.second;
- }
- }
- lists.writeTo(buffer, new Tuple2(firsts, seconds), state);
- }
-}
diff --git a/pkg/kernel/lib/text/text_serialization_verifier.dart b/pkg/kernel/lib/text/text_serialization_verifier.dart
deleted file mode 100644
index a8a0283..0000000
--- a/pkg/kernel/lib/text/text_serialization_verifier.dart
+++ /dev/null
@@ -1,308 +0,0 @@
-// 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:convert' show json;
-
-import '../ast.dart';
-
-import '../text/serializer_combinators.dart';
-
-import '../text/text_reader.dart' show TextIterator;
-
-import '../text/text_serializer.dart';
-
-const Uri? noUri = null;
-
-const int noOffset = -1;
-
-abstract class RoundTripStatus implements Comparable<RoundTripStatus> {
- /// The round-trip serialization was run on that [node].
- final Node node;
-
- /// The context of the failure.
- ///
- /// The [context] node is a [TreeNode] and is set either to the node that the
- /// round-trip serialization failed on or to the closest parent with location.
- final TreeNode context;
-
- RoundTripStatus(this.node, {required TreeNode context})
- : context = node is TreeNode && node.location != null ? node : context;
-
- Uri? get uri => context.location?.file;
-
- int get offset => context.fileOffset;
-
- bool get isSuccess;
-
- bool get isFailure => !isSuccess;
-
- String get nameForDebugging;
-
- @override
- int compareTo(RoundTripStatus other) {
- Node thisNode = this.node;
- Node otherNode = other.node;
- if (thisNode is TreeNode && otherNode is TreeNode) {
- Uri? thisUri = thisNode.location?.file;
- Uri? otherUri = otherNode.location?.file;
- int thisOffset = thisNode.fileOffset;
- int otherOffset = otherNode.fileOffset;
-
- int compareUri;
- if (thisUri == null && otherUri == null) {
- compareUri = 0;
- } else if (thisUri == null) {
- compareUri = 1;
- } else if (otherUri == null) {
- compareUri = -1;
- } else {
- // ignore: unnecessary_null_comparison
- assert(thisUri != null && otherUri != null);
- compareUri = thisUri.toString().compareTo(otherUri.toString());
- }
- if (compareUri != 0) return compareUri;
-
- int compareOffset;
- // ignore: unnecessary_null_comparison
- if (thisOffset == null && otherOffset == null) {
- compareOffset = 0;
- // ignore: unnecessary_null_comparison
- } else if (thisOffset == null) {
- compareOffset = 1;
- // ignore: unnecessary_null_comparison
- } else if (otherOffset == null) {
- compareOffset = -1;
- } else {
- compareOffset = thisOffset = otherOffset;
- }
- if (compareOffset != 0) return compareOffset;
-
- // The "success" outcome has the lowest index. Make it so that it appears
- // last, and the failures are at the beginning and are more visible.
- if (isFailure && other.isSuccess) {
- return -1;
- }
- if (isSuccess && other.isFailure) {
- return 1;
- }
-
- return 0;
- } else if (node is TreeNode) {
- return -1;
- } else {
- return 1;
- }
- }
-
- void printOn(StringBuffer sb) {
- sb.writeln(""
- ";; -------------------------------------"
- "----------------------------------------");
- sb.writeln("Status: ${nameForDebugging}");
- sb.writeln("Node type: ${node.runtimeType}");
- sb.writeln("Node: ${json.encode(node.leakingDebugToString())}");
- Node treeNode = node;
- if (treeNode is TreeNode) {
- if (treeNode.parent != null) {
- sb.writeln("Parent type: ${treeNode.parent.runtimeType}");
- sb.writeln(
- "Parent: ${json.encode(treeNode.parent!.leakingDebugToString())}");
- }
- }
- }
-
- @override
- String toString() {
- StringBuffer sb = new StringBuffer();
- printOn(sb);
- return sb.toString();
- }
-}
-
-class RoundTripSuccess extends RoundTripStatus {
- final String serialized;
-
- RoundTripSuccess(Node node, this.serialized, {required TreeNode context})
- : super(node, context: context);
-
- @override
- bool get isSuccess => true;
-
- @override
- String get nameForDebugging => "RoundTripSuccess";
-
- @override
- void printOn(StringBuffer sb) {
- super.printOn(sb);
- sb.writeln("Serialized: ${serialized}");
- }
-}
-
-class RoundTripInitialSerializationFailure extends RoundTripStatus {
- final String message;
-
- RoundTripInitialSerializationFailure(Node node, this.message,
- {required TreeNode context})
- : super(node, context: context);
-
- @override
- bool get isSuccess => false;
-
- @override
- String get nameForDebugging => "RoundTripInitialSerializationFailure";
-
- @override
- void printOn(StringBuffer sb) {
- super.printOn(sb);
- sb.writeln("Message: ${message}");
- }
-}
-
-class RoundTripDeserializationFailure extends RoundTripStatus {
- final String message;
-
- RoundTripDeserializationFailure(Node node, this.message,
- {required TreeNode context})
- : super(node, context: context);
-
- @override
- bool get isSuccess => false;
-
- @override
- String get nameForDebugging => "RoundTripDeserializationFailure";
-
- @override
- void printOn(StringBuffer sb) {
- super.printOn(sb);
- sb.writeln("Message: ${message}");
- }
-}
-
-class RoundTripSecondSerializationFailure extends RoundTripStatus {
- final String initial;
- final String serialized;
-
- RoundTripSecondSerializationFailure(Node node, this.initial, this.serialized,
- {required TreeNode context})
- : super(node, context: context);
-
- @override
- bool get isSuccess => false;
-
- @override
- String get nameForDebugging => "RoundTripSecondSerializationFailure";
-
- @override
- void printOn(StringBuffer sb) {
- super.printOn(sb);
- sb.writeln("Initial: ${initial}");
- sb.writeln("Serialized: ${serialized}");
- }
-}
-
-class TextSerializationVerifier {
- static const bool showStackTrace = bool.fromEnvironment(
- "text_serialization.showStackTrace",
- defaultValue: false);
-
- /// List of status for all round-trip serialization attempts.
- final List<RoundTripStatus> _status = <RoundTripStatus>[];
-
- final CanonicalName root;
-
- TextSerializationVerifier({CanonicalName? root})
- : root = root ?? new CanonicalName.root() {
- initializeSerializers();
- }
-
- /// List of errors produced during round trips on the visited nodes.
- Iterable<RoundTripStatus> get _failures => _status.where((s) => s.isFailure);
-
- List<RoundTripStatus> get failures => _failures.toList()..sort();
-
- void verify(Library node) {
- makeRoundTrip<Library>(node, librarySerializer);
- }
-
- T? readNode<T extends TreeNode>(
- T node, String input, TextSerializer<T> serializer) {
- TextIterator stream = new TextIterator(input, 0);
- stream.moveNext();
- T result;
- try {
- result = serializer.readFrom(stream,
- new DeserializationState(new DeserializationEnvironment(null), root));
- } catch (exception, stackTrace) {
- String message =
- showStackTrace ? "${exception}\n${stackTrace}" : "${exception}";
- _status.add(
- new RoundTripDeserializationFailure(node, message, context: node));
- return null;
- }
- if (stream.moveNext()) {
- _status.add(new RoundTripDeserializationFailure(
- node, "unexpected trailing text",
- context: node));
- }
- // ignore: unnecessary_null_comparison
- if (result == null) {
- _status.add(new RoundTripDeserializationFailure(
- node, "Deserialization of the following returned null: '${input}'",
- context: node));
- }
- return result;
- }
-
- String writeNode<T extends TreeNode>(T node, TextSerializer<T> serializer) {
- StringBuffer buffer = new StringBuffer();
- try {
- serializer.writeTo(buffer, node,
- new SerializationState(new SerializationEnvironment(null)));
- } catch (exception, stackTrace) {
- String message =
- showStackTrace ? "${exception}\n${stackTrace}" : "${exception}";
- _status.add(new RoundTripInitialSerializationFailure(node, message,
- context: node));
- }
- return buffer.toString();
- }
-
- void makeRoundTrip<T extends TreeNode>(T node, TextSerializer<T> serializer) {
- int failureCount = _failures.length;
- String initial = writeNode(node, serializer);
- if (_failures.length != failureCount) {
- return;
- }
-
- // Do the round trip.
- T? deserialized = readNode(node, initial, serializer);
- if (_failures.length != failureCount) {
- return;
- }
-
- if (deserialized == null) {
- // The error is reported elsewhere for the case of null.
- return;
- }
-
- String serialized = writeNode(deserialized, serializer);
- if (_failures.length != failureCount) {
- return;
- }
-
- if (initial != serialized) {
- _status.add(new RoundTripSecondSerializationFailure(
- node, initial, serialized,
- context: node));
- } else {
- _status.add(new RoundTripSuccess(node, initial, context: node));
- }
- }
-
- List<RoundTripStatus> takeStatus() {
- List<RoundTripStatus> result = _status.toList()..sort();
- _status.clear();
- return result;
- }
-}
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
deleted file mode 100644
index 9aa5e0e..0000000
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ /dev/null
@@ -1,2916 +0,0 @@
-// 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.
-
-library kernel.text_serializer;
-
-import '../ast.dart';
-
-import 'serializer_combinators.dart';
-
-abstract class Tagger<T> {
- String tag(T object);
-}
-
-class NameTagger implements Tagger<Name> {
- const NameTagger();
-
- @override
- String tag(Name name) => name.isPrivate ? "private" : "public";
-}
-
-TextSerializer<Name> publicName =
- Wrapped<String, Name>((w) => w.text, (u) => Name(u), const DartString());
-
-TextSerializer<Name> privateName = Wrapped<Tuple2<String, CanonicalName>, Name>(
- (w) => Tuple2(w.text, w.library!.reference.canonicalName!),
- (u) => Name.byReference(u.first, u.second.reference),
- Tuple2Serializer(DartString(), CanonicalNameSerializer()));
-
-TextSerializer<Name> nameSerializer = new Case(
- const NameTagger(), {"public": publicName, "private": privateName});
-
-class ExpressionTagger extends ExpressionVisitor<String>
- implements Tagger<Expression> {
- const ExpressionTagger();
-
- @override
- String tag(Expression expression) => expression.accept(this);
-
- @override
- String visitStringLiteral(StringLiteral _) => "string";
- @override
- String visitIntLiteral(IntLiteral _) => "int";
- @override
- String visitDoubleLiteral(DoubleLiteral _) => "double";
- @override
- String visitBoolLiteral(BoolLiteral _) => "bool";
- @override
- String visitNullLiteral(NullLiteral _) => "null";
- @override
- String visitInvalidExpression(InvalidExpression _) => "invalid";
- @override
- String visitNot(Not _) => "not";
- @override
- String visitLogicalExpression(LogicalExpression expression) {
- return logicalExpressionOperatorToString(expression.operatorEnum);
- }
-
- @override
- String visitStringConcatenation(StringConcatenation _) => "concat";
- @override
- String visitSymbolLiteral(SymbolLiteral _) => "symbol";
- @override
- String visitThisExpression(ThisExpression _) => "this";
- @override
- String visitRethrow(Rethrow _) => "rethrow";
- @override
- String visitThrow(Throw _) => "throw";
- @override
- String visitAwaitExpression(AwaitExpression _) => "await";
- @override
- String visitConditionalExpression(ConditionalExpression _) => "cond";
- @override
- String visitIsExpression(IsExpression _) => "is";
- @override
- String visitAsExpression(AsExpression _) => "as";
- @override
- String visitTypeLiteral(TypeLiteral _) => "type";
- @override
- String visitListLiteral(ListLiteral expression) {
- return expression.isConst ? "const-list" : "list";
- }
-
- @override
- String visitSetLiteral(SetLiteral expression) {
- return expression.isConst ? "const-set" : "set";
- }
-
- @override
- String visitMapLiteral(MapLiteral expression) {
- return expression.isConst ? "const-map" : "map";
- }
-
- @override
- String visitLet(Let _) => "let";
-
- @override
- String visitInstanceGet(InstanceGet _) => "get-instance";
- @override
- String visitInstanceSet(InstanceSet _) => "set-instance";
- @override
- String visitDynamicGet(DynamicGet _) => "get-dynamic";
- @override
- String visitDynamicSet(DynamicSet _) => "set-dynamic";
- @override
- String visitInstanceTearOff(InstanceTearOff _) => "tearoff-instance";
- @override
- String visitFunctionTearOff(FunctionTearOff _) => "tearoff-function";
- @override
- String visitSuperPropertyGet(SuperPropertyGet _) => "get-super";
- @override
- String visitSuperPropertySet(SuperPropertySet _) => "set-super";
- @override
- String visitInstanceInvocation(InstanceInvocation _) => "invoke-instance";
- @override
- String visitInstanceGetterInvocation(InstanceGetterInvocation _) =>
- "invoke-instance-getter";
- @override
- String visitDynamicInvocation(DynamicInvocation _) => "invoke-dynamic";
- @override
- String visitFunctionInvocation(FunctionInvocation _) => "invoke-function";
- @override
- String visitLocalFunctionInvocation(LocalFunctionInvocation _) =>
- "invoke-local-function";
- @override
- String visitEqualsNull(EqualsNull _) => "equals-null";
- @override
- String visitEqualsCall(EqualsCall _) => "equals-call";
- @override
- String visitSuperMethodInvocation(SuperMethodInvocation _) => "invoke-super";
-
- @override
- String visitVariableGet(VariableGet _) => "get-var";
- @override
- String visitVariableSet(VariableSet _) => "set-var";
- @override
- String visitStaticGet(StaticGet _) => "get-static";
- @override
- String visitStaticSet(StaticSet _) => "set-static";
- @override
- String visitStaticTearOff(StaticTearOff _) => "tearoff-static";
- @override
- String visitConstructorTearOff(ConstructorTearOff _) => "tearoff-constructor";
- @override
- String visitRedirectingFactoryTearOff(RedirectingFactoryTearOff _) =>
- "tearoff-redirecting-factory";
- @override
- String visitTypedefTearOff(TypedefTearOff _) => "tearoff-typedef";
- @override
- String visitStaticInvocation(StaticInvocation expression) {
- return expression.isConst ? "invoke-const-static" : "invoke-static";
- }
-
- @override
- String visitConstructorInvocation(ConstructorInvocation expression) {
- return expression.isConst
- ? "invoke-const-constructor"
- : "invoke-constructor";
- }
-
- @override
- String visitFunctionExpression(FunctionExpression _) => "fun";
- @override
- String visitListConcatenation(ListConcatenation _) => "lists";
- @override
- String visitSetConcatenation(SetConcatenation _) => "sets";
- @override
- String visitMapConcatenation(MapConcatenation _) => "maps";
- @override
- String visitBlockExpression(BlockExpression _) => "let-block";
- @override
- String visitInstantiation(Instantiation _) => "apply";
- @override
- String visitNullCheck(NullCheck _) => "not-null";
- @override
- String visitFileUriExpression(FileUriExpression _) => "with-uri";
- @override
- String visitCheckLibraryIsLoaded(CheckLibraryIsLoaded _) => "is-loaded";
- @override
- String visitLoadLibrary(LoadLibrary _) => "load";
- @override
- String visitConstantExpression(ConstantExpression _) => "const";
- @override
- String visitInstanceCreation(InstanceCreation _) => "object";
-
- @override
- String defaultExpression(Expression node) {
- throw new UnimplementedError(
- 'Unimplemented expression $node (${node.runtimeType})');
- }
-}
-
-TextSerializer<InvalidExpression> invalidExpressionSerializer =
- new Wrapped<Tuple2<String?, Expression?>, InvalidExpression>(
- unwrapInvalidExpression,
- wrapInvalidExpression,
- Tuple2Serializer<String?, Expression?>(
- Optional(DartString()), Optional(expressionSerializer)));
-
-Tuple2<String?, Expression?> unwrapInvalidExpression(
- InvalidExpression expression) {
- return Tuple2(expression.message, expression.expression);
-}
-
-InvalidExpression wrapInvalidExpression(Tuple2<String?, Expression?> tuple) {
- return new InvalidExpression(tuple.first, tuple.second);
-}
-
-TextSerializer<Not> notSerializer =
- new Wrapped<Expression, Not>(unwrapNot, wrapNot, expressionSerializer);
-
-Expression unwrapNot(Not expression) => expression.operand;
-
-Not wrapNot(Expression operand) => new Not(operand);
-
-TextSerializer<LogicalExpression> logicalAndSerializer =
- new Wrapped<Tuple2<Expression, Expression>, LogicalExpression>(
- unwrapLogicalExpression,
- wrapLogicalAnd,
- new Tuple2Serializer(expressionSerializer, expressionSerializer));
-
-Tuple2<Expression, Expression> unwrapLogicalExpression(
- LogicalExpression expression) {
- return new Tuple2(expression.left, expression.right);
-}
-
-LogicalExpression wrapLogicalAnd(Tuple2<Expression, Expression> tuple) {
- return new LogicalExpression(
- tuple.first, LogicalExpressionOperator.AND, tuple.second);
-}
-
-TextSerializer<LogicalExpression> logicalOrSerializer =
- new Wrapped<Tuple2<Expression, Expression>, LogicalExpression>(
- unwrapLogicalExpression,
- wrapLogicalOr,
- new Tuple2Serializer(expressionSerializer, expressionSerializer));
-
-LogicalExpression wrapLogicalOr(Tuple2<Expression, Expression> tuple) {
- return new LogicalExpression(
- tuple.first, LogicalExpressionOperator.OR, tuple.second);
-}
-
-TextSerializer<StringConcatenation> stringConcatenationSerializer =
- new Wrapped<List<Expression>, StringConcatenation>(
- unwrapStringConcatenation,
- wrapStringConcatenation,
- new ListSerializer(expressionSerializer));
-
-List<Expression> unwrapStringConcatenation(StringConcatenation expression) {
- return expression.expressions;
-}
-
-StringConcatenation wrapStringConcatenation(List<Expression> expressions) {
- return new StringConcatenation(expressions);
-}
-
-const TextSerializer<StringLiteral> stringLiteralSerializer =
- const Wrapped<String, StringLiteral>(
- unwrapStringLiteral, wrapStringLiteral, const DartString());
-
-String unwrapStringLiteral(StringLiteral literal) => literal.value;
-
-StringLiteral wrapStringLiteral(String value) => new StringLiteral(value);
-
-const TextSerializer<IntLiteral> intLiteralSerializer =
- const Wrapped<int, IntLiteral>(
- unwrapIntLiteral, wrapIntLiteral, const DartInt());
-
-int unwrapIntLiteral(IntLiteral literal) => literal.value;
-
-IntLiteral wrapIntLiteral(int value) => new IntLiteral(value);
-
-const TextSerializer<DoubleLiteral> doubleLiteralSerializer =
- const Wrapped<double, DoubleLiteral>(
- unwrapDoubleLiteral, wrapDoubleLiteral, const DartDouble());
-
-double unwrapDoubleLiteral(DoubleLiteral literal) => literal.value;
-
-DoubleLiteral wrapDoubleLiteral(double value) => new DoubleLiteral(value);
-
-const TextSerializer<BoolLiteral> boolLiteralSerializer =
- const Wrapped<bool, BoolLiteral>(
- unwrapBoolLiteral, wrapBoolLiteral, const DartBool());
-
-bool unwrapBoolLiteral(BoolLiteral literal) => literal.value;
-
-BoolLiteral wrapBoolLiteral(bool value) => new BoolLiteral(value);
-
-const TextSerializer<NullLiteral> nullLiteralSerializer =
- const Wrapped<void, NullLiteral>(
- unwrapNullLiteral, wrapNullLiteral, const Nothing());
-
-void unwrapNullLiteral(NullLiteral literal) {}
-
-NullLiteral wrapNullLiteral(void ignored) => new NullLiteral();
-
-const TextSerializer<SymbolLiteral> symbolLiteralSerializer =
- const Wrapped<String, SymbolLiteral>(
- unwrapSymbolLiteral, wrapSymbolLiteral, const DartString());
-
-String unwrapSymbolLiteral(SymbolLiteral expression) => expression.value;
-
-SymbolLiteral wrapSymbolLiteral(String value) => new SymbolLiteral(value);
-
-const TextSerializer<ThisExpression> thisExpressionSerializer =
- const Wrapped<void, ThisExpression>(
- unwrapThisExpression, wrapThisExpression, const Nothing());
-
-void unwrapThisExpression(ThisExpression expression) {}
-
-ThisExpression wrapThisExpression(void ignored) => new ThisExpression();
-
-const TextSerializer<Rethrow> rethrowSerializer =
- const Wrapped<void, Rethrow>(unwrapRethrow, wrapRethrow, const Nothing());
-
-void unwrapRethrow(Rethrow expression) {}
-
-Rethrow wrapRethrow(void ignored) => new Rethrow();
-
-TextSerializer<Throw> throwSerializer = new Wrapped<Expression, Throw>(
- unwrapThrow, wrapThrow, expressionSerializer);
-
-Expression unwrapThrow(Throw expression) => expression.expression;
-
-Throw wrapThrow(Expression expression) => new Throw(expression);
-
-TextSerializer<AwaitExpression> awaitExpressionSerializer =
- new Wrapped<Expression, AwaitExpression>(
- unwrapAwaitExpression, wrapAwaitExpression, expressionSerializer);
-
-Expression unwrapAwaitExpression(AwaitExpression expression) =>
- expression.operand;
-
-AwaitExpression wrapAwaitExpression(Expression operand) =>
- new AwaitExpression(operand);
-
-TextSerializer<ConditionalExpression> conditionalExpressionSerializer =
- new Wrapped<Tuple4<Expression, DartType, Expression, Expression>,
- ConditionalExpression>(
- unwrapConditionalExpression,
- wrapConditionalExpression,
- new Tuple4Serializer(expressionSerializer, dartTypeSerializer,
- expressionSerializer, expressionSerializer));
-
-Tuple4<Expression, DartType, Expression, Expression>
- unwrapConditionalExpression(ConditionalExpression expression) {
- return new Tuple4(expression.condition, expression.staticType,
- expression.then, expression.otherwise);
-}
-
-ConditionalExpression wrapConditionalExpression(
- Tuple4<Expression, DartType, Expression, Expression> tuple) {
- return new ConditionalExpression(
- tuple.first, tuple.third, tuple.fourth, tuple.second);
-}
-
-TextSerializer<IsExpression> isExpressionSerializer =
- new Wrapped<Tuple2<Expression, DartType>, IsExpression>(
- unwrapIsExpression,
- wrapIsExpression,
- new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
-
-Tuple2<Expression, DartType> unwrapIsExpression(IsExpression expression) {
- return new Tuple2(expression.operand, expression.type);
-}
-
-IsExpression wrapIsExpression(Tuple2<Expression, DartType> tuple) {
- return new IsExpression(tuple.first, tuple.second);
-}
-
-TextSerializer<AsExpression> asExpressionSerializer =
- new Wrapped<Tuple2<Expression, DartType>, AsExpression>(
- unwrapAsExpression,
- wrapAsExpression,
- new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
-
-Tuple2<Expression, DartType> unwrapAsExpression(AsExpression expression) {
- return new Tuple2(expression.operand, expression.type);
-}
-
-AsExpression wrapAsExpression(Tuple2<Expression, DartType> tuple) {
- return new AsExpression(tuple.first, tuple.second);
-}
-
-TextSerializer<TypeLiteral> typeLiteralSerializer =
- new Wrapped<DartType, TypeLiteral>(
- unwrapTypeLiteral, wrapTypeLiteral, dartTypeSerializer);
-
-DartType unwrapTypeLiteral(TypeLiteral expression) => expression.type;
-
-TypeLiteral wrapTypeLiteral(DartType type) => new TypeLiteral(type);
-
-TextSerializer<ListLiteral> listLiteralSerializer =
- new Wrapped<Tuple2<DartType, List<Expression>>, ListLiteral>(
- unwrapListLiteral,
- wrapListLiteral,
- new Tuple2Serializer(
- dartTypeSerializer, new ListSerializer(expressionSerializer)));
-
-Tuple2<DartType, List<Expression>> unwrapListLiteral(ListLiteral expression) {
- return new Tuple2(expression.typeArgument, expression.expressions);
-}
-
-ListLiteral wrapListLiteral(Tuple2<DartType, List<Expression>> tuple) {
- return new ListLiteral(tuple.second,
- typeArgument: tuple.first, isConst: false);
-}
-
-TextSerializer<ListLiteral> constListLiteralSerializer =
- new Wrapped<Tuple2<DartType, List<Expression>>, ListLiteral>(
- unwrapListLiteral,
- wrapConstListLiteral,
- new Tuple2Serializer(
- dartTypeSerializer, new ListSerializer(expressionSerializer)));
-
-ListLiteral wrapConstListLiteral(Tuple2<DartType, List<Expression>> tuple) {
- return new ListLiteral(tuple.second,
- typeArgument: tuple.first, isConst: true);
-}
-
-TextSerializer<SetLiteral> setLiteralSerializer =
- new Wrapped<Tuple2<DartType, List<Expression>>, SetLiteral>(
- unwrapSetLiteral,
- wrapSetLiteral,
- new Tuple2Serializer(
- dartTypeSerializer, new ListSerializer(expressionSerializer)));
-
-Tuple2<DartType, List<Expression>> unwrapSetLiteral(SetLiteral expression) {
- return new Tuple2(expression.typeArgument, expression.expressions);
-}
-
-SetLiteral wrapSetLiteral(Tuple2<DartType, List<Expression>> tuple) {
- return new SetLiteral(tuple.second,
- typeArgument: tuple.first, isConst: false);
-}
-
-TextSerializer<SetLiteral> constSetLiteralSerializer =
- new Wrapped<Tuple2<DartType, List<Expression>>, SetLiteral>(
- unwrapSetLiteral,
- wrapConstSetLiteral,
- new Tuple2Serializer(
- dartTypeSerializer, new ListSerializer(expressionSerializer)));
-
-SetLiteral wrapConstSetLiteral(Tuple2<DartType, List<Expression>> tuple) {
- return new SetLiteral(tuple.second, typeArgument: tuple.first, isConst: true);
-}
-
-TextSerializer<MapLiteral> mapLiteralSerializer =
- new Wrapped<Tuple3<DartType, DartType, List<Expression>>, MapLiteral>(
- unwrapMapLiteral,
- wrapMapLiteral,
- new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
- new ListSerializer(expressionSerializer)));
-
-Tuple3<DartType, DartType, List<Expression>> unwrapMapLiteral(
- MapLiteral expression) {
- List<Expression> entries =
- new List.filled(2 * expression.entries.length, dummyExpression);
- for (int from = 0, to = 0; from < expression.entries.length; ++from) {
- MapLiteralEntry entry = expression.entries[from];
- entries[to++] = entry.key;
- entries[to++] = entry.value;
- }
- return new Tuple3(expression.keyType, expression.valueType, entries);
-}
-
-MapLiteral wrapMapLiteral(Tuple3<DartType, DartType, List<Expression>> tuple) {
- List<MapLiteralEntry> entries =
- new List.filled(tuple.third.length ~/ 2, dummyMapLiteralEntry);
- for (int from = 0, to = 0; to < entries.length; ++to) {
- entries[to] = new MapLiteralEntry(tuple.third[from++], tuple.third[from++]);
- }
- return new MapLiteral(entries,
- keyType: tuple.first, valueType: tuple.second, isConst: false);
-}
-
-TextSerializer<MapLiteral> constMapLiteralSerializer =
- new Wrapped<Tuple3<DartType, DartType, List<Expression>>, MapLiteral>(
- unwrapMapLiteral,
- wrapConstMapLiteral,
- new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
- new ListSerializer(expressionSerializer)));
-
-MapLiteral wrapConstMapLiteral(
- Tuple3<DartType, DartType, List<Expression>> tuple) {
- List<MapLiteralEntry> entries =
- new List.filled(tuple.third.length ~/ 2, dummyMapLiteralEntry);
- for (int from = 0, to = 0; to < entries.length; ++to) {
- entries[to] = new MapLiteralEntry(tuple.third[from++], tuple.third[from++]);
- }
- return new MapLiteral(entries,
- keyType: tuple.first, valueType: tuple.second, isConst: true);
-}
-
-TextSerializer<Let> letSerializer =
- new Wrapped<Tuple2<VariableDeclaration, Expression>, Let>(unwrapLet,
- wrapLet, new Bind(variableDeclarationSerializer, expressionSerializer));
-
-Tuple2<VariableDeclaration, Expression> unwrapLet(Let expression) {
- return new Tuple2(expression.variable, expression.body);
-}
-
-Let wrapLet(Tuple2<VariableDeclaration, Expression> tuple) {
- return new Let(tuple.first, tuple.second);
-}
-
-TextSerializer<InstanceGet> instanceGetSerializer = new Wrapped<
- Tuple5<InstanceAccessKind, Expression, Name, CanonicalName, DartType>,
- InstanceGet>(
- unwrapInstanceGet,
- wrapInstanceGet,
- new Tuple5Serializer(instanceAccessKindSerializer, expressionSerializer,
- nameSerializer, canonicalNameSerializer, dartTypeSerializer));
-
-Tuple5<InstanceAccessKind, Expression, Name, CanonicalName, DartType>
- unwrapInstanceGet(InstanceGet expression) {
- return new Tuple5(
- expression.kind,
- expression.receiver,
- expression.name,
- expression.interfaceTargetReference.canonicalName!,
- expression.resultType);
-}
-
-InstanceGet wrapInstanceGet(
- Tuple5<InstanceAccessKind, Expression, Name, CanonicalName, DartType>
- tuple) {
- return new InstanceGet.byReference(tuple.first, tuple.second, tuple.third,
- interfaceTargetReference: tuple.fourth.reference,
- resultType: tuple.fifth);
-}
-
-TextSerializer<InstanceSet> instanceSetSerializer = new Wrapped<
- Tuple5<InstanceAccessKind, Expression, Name, Expression, CanonicalName>,
- InstanceSet>(
- unwrapInstanceSet,
- wrapInstanceSet,
- new Tuple5Serializer(instanceAccessKindSerializer, expressionSerializer,
- nameSerializer, expressionSerializer, canonicalNameSerializer));
-
-Tuple5<InstanceAccessKind, Expression, Name, Expression, CanonicalName>
- unwrapInstanceSet(InstanceSet expression) {
- return new Tuple5(expression.kind, expression.receiver, expression.name,
- expression.value, expression.interfaceTargetReference.canonicalName!);
-}
-
-InstanceSet wrapInstanceSet(
- Tuple5<InstanceAccessKind, Expression, Name, Expression, CanonicalName>
- tuple) {
- return new InstanceSet.byReference(
- tuple.first, tuple.second, tuple.third, tuple.fourth,
- interfaceTargetReference: tuple.fifth.reference);
-}
-
-TextSerializer<DynamicGet> dynamicGetSerializer =
- new Wrapped<Tuple3<DynamicAccessKind, Expression, Name>, DynamicGet>(
- unwrapDynamicGet,
- wrapDynamicGet,
- new Tuple3Serializer(
- dynamicAccessKindSerializer, expressionSerializer, nameSerializer));
-
-Tuple3<DynamicAccessKind, Expression, Name> unwrapDynamicGet(
- DynamicGet expression) {
- return new Tuple3(expression.kind, expression.receiver, expression.name);
-}
-
-DynamicGet wrapDynamicGet(Tuple3<DynamicAccessKind, Expression, Name> tuple) {
- return new DynamicGet(tuple.first, tuple.second, tuple.third);
-}
-
-TextSerializer<DynamicSet> dynamicSetSerializer = new Wrapped<
- Tuple4<DynamicAccessKind, Expression, Name, Expression>, DynamicSet>(
- unwrapDynamicSet,
- wrapDynamicSet,
- new Tuple4Serializer(dynamicAccessKindSerializer, expressionSerializer,
- nameSerializer, expressionSerializer));
-
-Tuple4<DynamicAccessKind, Expression, Name, Expression> unwrapDynamicSet(
- DynamicSet expression) {
- return new Tuple4(
- expression.kind, expression.receiver, expression.name, expression.value);
-}
-
-DynamicSet wrapDynamicSet(
- Tuple4<DynamicAccessKind, Expression, Name, Expression> tuple) {
- return new DynamicSet(tuple.first, tuple.second, tuple.third, tuple.fourth);
-}
-
-TextSerializer<InstanceTearOff> instanceTearOffSerializer = new Wrapped<
- Tuple5<InstanceAccessKind, Expression, Name, CanonicalName, DartType>,
- InstanceTearOff>(
- unwrapInstanceTearOff,
- wrapInstanceTearOff,
- new Tuple5Serializer(instanceAccessKindSerializer, expressionSerializer,
- nameSerializer, canonicalNameSerializer, dartTypeSerializer));
-
-Tuple5<InstanceAccessKind, Expression, Name, CanonicalName, DartType>
- unwrapInstanceTearOff(InstanceTearOff expression) {
- return new Tuple5(
- expression.kind,
- expression.receiver,
- expression.name,
- expression.interfaceTargetReference.canonicalName!,
- expression.resultType);
-}
-
-InstanceTearOff wrapInstanceTearOff(
- Tuple5<InstanceAccessKind, Expression, Name, CanonicalName, DartType>
- tuple) {
- return new InstanceTearOff.byReference(tuple.first, tuple.second, tuple.third,
- interfaceTargetReference: tuple.fourth.reference,
- resultType: tuple.fifth);
-}
-
-TextSerializer<FunctionTearOff> functionTearOffSerializer =
- new Wrapped<Expression, FunctionTearOff>(
- unwrapFunctionTearOff, wrapFunctionTearOff, expressionSerializer);
-
-Expression unwrapFunctionTearOff(FunctionTearOff expression) {
- return expression.receiver;
-}
-
-FunctionTearOff wrapFunctionTearOff(Expression expression) {
- return new FunctionTearOff(expression);
-}
-
-TextSerializer<SuperPropertyGet> superPropertyGetSerializer =
- new Wrapped<Name, SuperPropertyGet>(
- unwrapSuperPropertyGet, wrapSuperPropertyGet, nameSerializer);
-
-Name unwrapSuperPropertyGet(SuperPropertyGet expression) {
- return expression.name;
-}
-
-SuperPropertyGet wrapSuperPropertyGet(Name name) {
- return new SuperPropertyGet(name);
-}
-
-TextSerializer<SuperPropertySet> superPropertySetSerializer =
- new Wrapped<Tuple2<Name, Expression>, SuperPropertySet>(
- unwrapSuperPropertySet,
- wrapSuperPropertySet,
- new Tuple2Serializer(nameSerializer, expressionSerializer));
-
-Tuple2<Name, Expression> unwrapSuperPropertySet(SuperPropertySet expression) {
- return new Tuple2(expression.name, expression.value);
-}
-
-SuperPropertySet wrapSuperPropertySet(Tuple2<Name, Expression> tuple) {
- return new SuperPropertySet(tuple.first, tuple.second, null);
-}
-
-const Map<InstanceAccessKind, String> instanceAccessKindToName = const {
- InstanceAccessKind.Instance: "instance",
- InstanceAccessKind.Object: "object",
- InstanceAccessKind.Nullable: "nullable",
- InstanceAccessKind.Inapplicable: "inapplicable",
-};
-
-class InstanceAccessKindTagger implements Tagger<InstanceAccessKind> {
- const InstanceAccessKindTagger();
-
- @override
- String tag(InstanceAccessKind kind) {
- return instanceAccessKindToName[kind] ??
- (throw StateError("Unknown InstanceAccessKind flag value: ${kind}."));
- }
-}
-
-TextSerializer<InstanceAccessKind> instanceAccessKindSerializer =
- Case(InstanceAccessKindTagger(), convertFlagsMap(instanceAccessKindToName));
-
-TextSerializer<InstanceInvocation> instanceInvocationSerializer = new Wrapped<
- Tuple6<InstanceAccessKind, Expression, Name, Arguments, CanonicalName,
- DartType>,
- InstanceInvocation>(
- unwrapInstanceInvocation,
- wrapInstanceInvocation,
- new Tuple6Serializer(
- instanceAccessKindSerializer,
- expressionSerializer,
- nameSerializer,
- argumentsSerializer,
- canonicalNameSerializer,
- dartTypeSerializer));
-
-Tuple6<InstanceAccessKind, Expression, Name, Arguments, CanonicalName, DartType>
- unwrapInstanceInvocation(InstanceInvocation expression) {
- return new Tuple6(
- expression.kind,
- expression.receiver,
- expression.name,
- expression.arguments,
- expression.interfaceTargetReference.canonicalName!,
- expression.functionType);
-}
-
-InstanceInvocation wrapInstanceInvocation(
- Tuple6<InstanceAccessKind, Expression, Name, Arguments, CanonicalName,
- DartType>
- tuple) {
- return new InstanceInvocation.byReference(
- tuple.first, tuple.second, tuple.third, tuple.fourth,
- interfaceTargetReference: tuple.fifth.reference,
- functionType: tuple.sixth as FunctionType);
-}
-
-TextSerializer<
- InstanceGetterInvocation> instanceGetterInvocationSerializer = new Wrapped<
- Tuple6<InstanceAccessKind, Expression, Name, Arguments, CanonicalName,
- DartType?>,
- InstanceGetterInvocation>(
- unwrapInstanceGetterInvocation,
- wrapInstanceGetterInvocation,
- new Tuple6Serializer(
- instanceAccessKindSerializer,
- expressionSerializer,
- nameSerializer,
- argumentsSerializer,
- const CanonicalNameSerializer(),
- Optional(dartTypeSerializer)));
-
-Tuple6<InstanceAccessKind, Expression, Name, Arguments, CanonicalName,
- DartType?>
- unwrapInstanceGetterInvocation(InstanceGetterInvocation expression) {
- return new Tuple6(
- expression.kind,
- expression.receiver,
- expression.name,
- expression.arguments,
- expression.interfaceTargetReference.canonicalName!,
- expression.functionType);
-}
-
-InstanceGetterInvocation wrapInstanceGetterInvocation(
- Tuple6<InstanceAccessKind, Expression, Name, Arguments, CanonicalName,
- DartType?>
- tuple) {
- return new InstanceGetterInvocation.byReference(
- tuple.first, tuple.second, tuple.third, tuple.fourth,
- interfaceTargetReference: tuple.fifth.reference,
- functionType: tuple.sixth as FunctionType?);
-}
-
-const Map<DynamicAccessKind, String> dynamicAccessKindToName = const {
- DynamicAccessKind.Dynamic: "dynamic",
- DynamicAccessKind.Never: "never",
- DynamicAccessKind.Invalid: "invalid",
- DynamicAccessKind.Unresolved: "unresolved",
-};
-
-class DynamicAccessKindTagger implements Tagger<DynamicAccessKind> {
- const DynamicAccessKindTagger();
-
- @override
- String tag(DynamicAccessKind kind) {
- return dynamicAccessKindToName[kind] ??
- (throw StateError("Unknown DynamicAccessKind flag value: ${kind}."));
- }
-}
-
-TextSerializer<DynamicAccessKind> dynamicAccessKindSerializer =
- Case(DynamicAccessKindTagger(), convertFlagsMap(dynamicAccessKindToName));
-
-TextSerializer<DynamicInvocation> dynamicInvocationSerializer = new Wrapped<
- Tuple4<DynamicAccessKind, Expression, Name, Arguments>,
- DynamicInvocation>(
- unwrapDynamicInvocation,
- wrapDynamicInvocation,
- new Tuple4Serializer(dynamicAccessKindSerializer, expressionSerializer,
- nameSerializer, argumentsSerializer));
-
-Tuple4<DynamicAccessKind, Expression, Name, Arguments> unwrapDynamicInvocation(
- DynamicInvocation expression) {
- return new Tuple4(expression.kind, expression.receiver, expression.name,
- expression.arguments);
-}
-
-DynamicInvocation wrapDynamicInvocation(
- Tuple4<DynamicAccessKind, Expression, Name, Arguments> tuple) {
- return new DynamicInvocation(
- tuple.first, tuple.second, tuple.third, tuple.fourth);
-}
-
-const Map<FunctionAccessKind, String> functionAccessKindToName = const {
- FunctionAccessKind.Function: "function",
- FunctionAccessKind.FunctionType: "function-type",
- FunctionAccessKind.Inapplicable: "inapplicable",
- FunctionAccessKind.Nullable: "nullable",
-};
-
-class FunctionAccessKindTagger implements Tagger<FunctionAccessKind> {
- const FunctionAccessKindTagger();
-
- @override
- String tag(FunctionAccessKind kind) {
- return functionAccessKindToName[kind] ??
- (throw StateError("Unknown FunctionAccessKind flag value: ${kind}."));
- }
-}
-
-TextSerializer<FunctionAccessKind> functionAccessKindSerializer =
- Case(FunctionAccessKindTagger(), convertFlagsMap(functionAccessKindToName));
-
-TextSerializer<FunctionInvocation> functionInvocationSerializer = new Wrapped<
- Tuple4<FunctionAccessKind, Expression, Arguments, DartType?>,
- FunctionInvocation>(
- unwrapFunctionInvocation,
- wrapFunctionInvocation,
- new Tuple4Serializer(functionAccessKindSerializer, expressionSerializer,
- argumentsSerializer, new Optional(dartTypeSerializer)));
-
-Tuple4<FunctionAccessKind, Expression, Arguments, DartType?>
- unwrapFunctionInvocation(FunctionInvocation expression) {
- return new Tuple4(expression.kind, expression.receiver, expression.arguments,
- expression.functionType);
-}
-
-FunctionInvocation wrapFunctionInvocation(
- Tuple4<FunctionAccessKind, Expression, Arguments, DartType?> tuple) {
- return new FunctionInvocation(tuple.first, tuple.second, tuple.third,
- functionType: tuple.fourth as FunctionType?);
-}
-
-TextSerializer<LocalFunctionInvocation> localFunctionInvocationSerializer =
- new Wrapped<Tuple3<VariableDeclaration, Arguments, DartType>,
- LocalFunctionInvocation>(
- unwrapLocalFunctionInvocation,
- wrapLocalFunctionInvocation,
- new Tuple3Serializer(const ScopedUse<VariableDeclaration>(),
- argumentsSerializer, dartTypeSerializer));
-
-Tuple3<VariableDeclaration, Arguments, DartType> unwrapLocalFunctionInvocation(
- LocalFunctionInvocation expression) {
- return new Tuple3(
- expression.variable, expression.arguments, expression.functionType);
-}
-
-LocalFunctionInvocation wrapLocalFunctionInvocation(
- Tuple3<VariableDeclaration, Arguments, DartType> tuple) {
- return new LocalFunctionInvocation(tuple.first, tuple.second,
- functionType: tuple.third as FunctionType);
-}
-
-TextSerializer<EqualsNull> equalsNullSerializer =
- new Wrapped<Expression, EqualsNull>(
- unwrapEqualsNull, wrapEqualsNull, expressionSerializer);
-
-Expression unwrapEqualsNull(EqualsNull expression) {
- return expression.expression;
-}
-
-EqualsNull wrapEqualsNull(Expression expression) {
- return new EqualsNull(expression);
-}
-
-TextSerializer<EqualsCall> equalsCallSerializer = new Wrapped<
- Tuple4<Expression, Expression, CanonicalName, DartType>, EqualsCall>(
- unwrapEqualsCall,
- wrapEqualsCall,
- new Tuple4Serializer(expressionSerializer, expressionSerializer,
- canonicalNameSerializer, dartTypeSerializer));
-
-Tuple4<Expression, Expression, CanonicalName, DartType> unwrapEqualsCall(
- EqualsCall expression) {
- return new Tuple4(
- expression.left,
- expression.right,
- expression.interfaceTargetReference.canonicalName!,
- expression.functionType);
-}
-
-EqualsCall wrapEqualsCall(
- Tuple4<Expression, Expression, CanonicalName, DartType> tuple) {
- return new EqualsCall.byReference(tuple.first, tuple.second,
- interfaceTargetReference: tuple.third.reference,
- functionType: tuple.fourth as FunctionType);
-}
-
-TextSerializer<SuperMethodInvocation> superMethodInvocationSerializer =
- new Wrapped<Tuple2<Name, Arguments>, SuperMethodInvocation>(
- unwrapSuperMethodInvocation,
- wrapSuperMethodInvocation,
- new Tuple2Serializer(nameSerializer, argumentsSerializer));
-
-Tuple2<Name, Arguments> unwrapSuperMethodInvocation(
- SuperMethodInvocation expression) {
- return new Tuple2(expression.name, expression.arguments);
-}
-
-SuperMethodInvocation wrapSuperMethodInvocation(Tuple2<Name, Arguments> tuple) {
- return new SuperMethodInvocation(tuple.first, tuple.second);
-}
-
-TextSerializer<VariableGet> variableGetSerializer =
- new Wrapped<Tuple2<VariableDeclaration, DartType?>, VariableGet>(
- unwrapVariableGet,
- wrapVariableGet,
- new Tuple2Serializer(const ScopedUse<VariableDeclaration>(),
- new Optional(dartTypeSerializer)));
-
-Tuple2<VariableDeclaration, DartType?> unwrapVariableGet(VariableGet node) {
- return new Tuple2<VariableDeclaration, DartType?>(
- node.variable, node.promotedType);
-}
-
-VariableGet wrapVariableGet(Tuple2<VariableDeclaration, DartType?> tuple) {
- return new VariableGet(tuple.first, tuple.second);
-}
-
-TextSerializer<VariableSet> variableSetSerializer =
- new Wrapped<Tuple2<VariableDeclaration, Expression>, VariableSet>(
- unwrapVariableSet,
- wrapVariableSet,
- new Tuple2Serializer(
- const ScopedUse<VariableDeclaration>(), expressionSerializer));
-
-Tuple2<VariableDeclaration, Expression> unwrapVariableSet(VariableSet node) {
- return new Tuple2<VariableDeclaration, Expression>(node.variable, node.value);
-}
-
-VariableSet wrapVariableSet(Tuple2<VariableDeclaration, Expression> tuple) {
- return new VariableSet(tuple.first, tuple.second);
-}
-
-const CanonicalNameSerializer canonicalNameSerializer =
- const CanonicalNameSerializer();
-
-class CanonicalNameSerializer extends TextSerializer<CanonicalName> {
- static const String delimiter = "::";
-
- const CanonicalNameSerializer();
-
- static void writeName(CanonicalName name, StringBuffer buffer) {
- if (!name.isRoot) {
- if (!name.parent!.isRoot) {
- writeName(name.parent!, buffer);
- buffer.write(delimiter);
- }
- buffer.write(name.name);
- }
- }
-
- @override
- CanonicalName readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- if (state == null) {
- throw StateError(
- "No deserialization state provided for ${runtimeType}.readFrom.");
- }
- String string = const DartString().readFrom(stream, state);
- CanonicalName name = state.nameRoot;
- for (String s in string.split(delimiter)) {
- name = name.getChild(s);
- }
- return name;
- }
-
- @override
- void writeTo(
- StringBuffer buffer, CanonicalName name, SerializationState? state) {
- StringBuffer sb = new StringBuffer();
- writeName(name, sb);
- const DartString().writeTo(buffer, sb.toString(), state);
- }
-}
-
-const TextSerializer<StaticGet> staticGetSerializer =
- const Wrapped(unwrapStaticGet, wrapStaticGet, canonicalNameSerializer);
-
-CanonicalName unwrapStaticGet(StaticGet expression) {
- return expression.targetReference.canonicalName!;
-}
-
-StaticGet wrapStaticGet(CanonicalName name) {
- return new StaticGet.byReference(name.reference);
-}
-
-const TextSerializer<StaticTearOff> staticTearOffSerializer =
- const Wrapped<CanonicalName, StaticTearOff>(
- unwrapStaticTearOff, wrapStaticTearOff, canonicalNameSerializer);
-
-CanonicalName unwrapStaticTearOff(StaticTearOff expression) {
- return expression.targetReference.canonicalName!;
-}
-
-StaticTearOff wrapStaticTearOff(CanonicalName name) {
- return new StaticTearOff.byReference(name.reference);
-}
-
-const TextSerializer<ConstructorTearOff> constructorTearOffSerializer =
- const Wrapped<CanonicalName, ConstructorTearOff>(unwrapConstructorTearOff,
- wrapConstructorTearOff, canonicalNameSerializer);
-
-CanonicalName unwrapConstructorTearOff(ConstructorTearOff expression) {
- return expression.targetReference.canonicalName!;
-}
-
-ConstructorTearOff wrapConstructorTearOff(CanonicalName name) {
- return new ConstructorTearOff.byReference(name.reference);
-}
-
-const TextSerializer<RedirectingFactoryTearOff>
- redirectingFactoryTearOffSerializer =
- const Wrapped<CanonicalName, RedirectingFactoryTearOff>(
- unwrapRedirectingFactoryTearOff,
- wrapRedirectingFactoryTearOff,
- canonicalNameSerializer);
-
-CanonicalName unwrapRedirectingFactoryTearOff(
- RedirectingFactoryTearOff expression) {
- return expression.targetReference.canonicalName!;
-}
-
-RedirectingFactoryTearOff wrapRedirectingFactoryTearOff(CanonicalName name) {
- return new RedirectingFactoryTearOff.byReference(name.reference);
-}
-
-final TextSerializer<TypedefTearOff> typedefTearOffSerializer = new Wrapped<
- Tuple2<List<TypeParameter>, Tuple2<Expression, List<DartType>>>,
- TypedefTearOff>(
- unwrapTypedefTearOff,
- wrapTypedefTearOff,
- Bind(
- typeParametersSerializer,
- Tuple2Serializer(
- expressionSerializer, ListSerializer(dartTypeSerializer))));
-
-Tuple2<List<TypeParameter>, Tuple2<Expression, List<DartType>>>
- unwrapTypedefTearOff(TypedefTearOff node) {
- return new Tuple2(
- node.typeParameters, new Tuple2(node.expression, node.typeArguments));
-}
-
-TypedefTearOff wrapTypedefTearOff(
- Tuple2<List<TypeParameter>, Tuple2<Expression, List<DartType>>> tuple) {
- return new TypedefTearOff(
- tuple.first, tuple.second.first, tuple.second.second);
-}
-
-TextSerializer<StaticSet> staticSetSerializer =
- new Wrapped<Tuple2<CanonicalName, Expression>, StaticSet>(
- unwrapStaticSet,
- wrapStaticSet,
- new Tuple2Serializer(canonicalNameSerializer, expressionSerializer));
-
-Tuple2<CanonicalName, Expression> unwrapStaticSet(StaticSet expression) {
- return new Tuple2(
- expression.targetReference.canonicalName!, expression.value);
-}
-
-StaticSet wrapStaticSet(Tuple2<CanonicalName, Expression> tuple) {
- return new StaticSet.byReference(tuple.first.reference, tuple.second);
-}
-
-TextSerializer<StaticInvocation> staticInvocationSerializer =
- new Wrapped<Tuple2<CanonicalName, Arguments>, StaticInvocation>(
- unwrapStaticInvocation,
- wrapStaticInvocation,
- new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
-
-Tuple2<CanonicalName, Arguments> unwrapStaticInvocation(
- StaticInvocation expression) {
- return new Tuple2(
- expression.targetReference.canonicalName!, expression.arguments);
-}
-
-StaticInvocation wrapStaticInvocation(Tuple2<CanonicalName, Arguments> tuple) {
- return new StaticInvocation.byReference(tuple.first.reference, tuple.second,
- isConst: false);
-}
-
-TextSerializer<StaticInvocation> constStaticInvocationSerializer =
- new Wrapped<Tuple2<CanonicalName, Arguments>, StaticInvocation>(
- unwrapStaticInvocation,
- wrapConstStaticInvocation,
- new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
-
-StaticInvocation wrapConstStaticInvocation(
- Tuple2<CanonicalName, Arguments> tuple) {
- return new StaticInvocation.byReference(tuple.first.reference, tuple.second,
- isConst: true);
-}
-
-TextSerializer<ConstructorInvocation> constructorInvocationSerializer =
- new Wrapped<Tuple2<CanonicalName, Arguments>, ConstructorInvocation>(
- unwrapConstructorInvocation,
- wrapConstructorInvocation,
- new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
-
-Tuple2<CanonicalName, Arguments> unwrapConstructorInvocation(
- ConstructorInvocation expression) {
- return new Tuple2(
- expression.targetReference.canonicalName!, expression.arguments);
-}
-
-ConstructorInvocation wrapConstructorInvocation(
- Tuple2<CanonicalName, Arguments> tuple) {
- return new ConstructorInvocation.byReference(
- tuple.first.reference, tuple.second,
- isConst: false);
-}
-
-TextSerializer<ConstructorInvocation> constConstructorInvocationSerializer =
- new Wrapped<Tuple2<CanonicalName, Arguments>, ConstructorInvocation>(
- unwrapConstructorInvocation,
- wrapConstConstructorInvocation,
- Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
-
-ConstructorInvocation wrapConstConstructorInvocation(
- Tuple2<CanonicalName, Arguments> tuple) {
- return new ConstructorInvocation.byReference(
- tuple.first.reference, tuple.second,
- isConst: true);
-}
-
-TextSerializer<FunctionExpression> functionExpressionSerializer =
- new Wrapped<FunctionNode, FunctionExpression>(unwrapFunctionExpression,
- wrapFunctionExpression, functionNodeSerializer);
-
-FunctionNode unwrapFunctionExpression(FunctionExpression expression) {
- return expression.function;
-}
-
-FunctionExpression wrapFunctionExpression(FunctionNode node) {
- return new FunctionExpression(node);
-}
-
-TextSerializer<ListConcatenation> listConcatenationSerializer =
- Wrapped<Tuple2<DartType, List<Expression>>, ListConcatenation>(
- (lc) => Tuple2(lc.typeArgument, lc.lists),
- (t) => ListConcatenation(t.second, typeArgument: t.first),
- Tuple2Serializer(
- dartTypeSerializer, ListSerializer(expressionSerializer)));
-
-TextSerializer<SetConcatenation> setConcatenationSerializer =
- Wrapped<Tuple2<DartType, List<Expression>>, SetConcatenation>(
- (sc) => Tuple2(sc.typeArgument, sc.sets),
- (t) => SetConcatenation(t.second, typeArgument: t.first),
- Tuple2Serializer(
- dartTypeSerializer, ListSerializer(expressionSerializer)));
-
-TextSerializer<MapConcatenation> mapConcatenationSerializer =
- Wrapped<Tuple3<DartType, DartType, List<Expression>>, MapConcatenation>(
- (mc) => Tuple3(mc.keyType, mc.valueType, mc.maps),
- (t) => MapConcatenation(t.third, keyType: t.first, valueType: t.second),
- Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
- ListSerializer(expressionSerializer)));
-
-TextSerializer<BlockExpression> blockExpressionSerializer =
- Wrapped<Tuple2<List<Statement>, Expression?>, BlockExpression>(
- (w) => Tuple2(w.body.statements, w.value),
- (u) => BlockExpression(Block(u.first), u.second!),
- const BlockSerializer());
-
-TextSerializer<Instantiation> instantiationSerializer =
- Wrapped<Tuple2<Expression, List<DartType>>, Instantiation>(
- (i) => Tuple2(i.expression, i.typeArguments),
- (t) => Instantiation(t.first, t.second),
- Tuple2Serializer(
- expressionSerializer, ListSerializer(dartTypeSerializer)));
-
-TextSerializer<NullCheck> nullCheckSerializer = Wrapped<Expression, NullCheck>(
- (nc) => nc.operand, (op) => NullCheck(op), expressionSerializer);
-
-TextSerializer<FileUriExpression> fileUriExpressionSerializer =
- Wrapped<Tuple2<Expression, Uri>, FileUriExpression>(
- (fue) => Tuple2(fue.expression, fue.fileUri),
- (t) => FileUriExpression(t.first, t.second),
- Tuple2Serializer(expressionSerializer, const UriSerializer()));
-
-TextSerializer<CheckLibraryIsLoaded> checkLibraryIsLoadedSerializer =
- Wrapped<LibraryDependency, CheckLibraryIsLoaded>((clil) => clil.import,
- (i) => CheckLibraryIsLoaded(i), libraryDependencySerializer);
-
-TextSerializer<LoadLibrary> loadLibrarySerializer =
- Wrapped<LibraryDependency, LoadLibrary>(
- (ll) => ll.import, (i) => LoadLibrary(i), libraryDependencySerializer);
-
-TextSerializer<ConstantExpression> constantExpressionSerializer =
- Wrapped<Tuple2<Constant, DartType>, ConstantExpression>(
- (ce) => Tuple2(ce.constant, ce.type),
- (t) => ConstantExpression(t.first, t.second),
- Tuple2Serializer(constantSerializer, dartTypeSerializer));
-
-TextSerializer<InstanceCreation> instanceCreationSerializer = Wrapped<
- Tuple6<CanonicalName, List<DartType>, List<CanonicalName>,
- List<Expression>, List<AssertStatement>, List<Expression>>,
- InstanceCreation>(
- (ic) => Tuple6(
- ic.classReference.canonicalName!,
- ic.typeArguments,
- ic.fieldValues.keys.map((r) => r.canonicalName!).toList(),
- ic.fieldValues.values.toList(),
- ic.asserts,
- ic.unusedArguments),
- (t) => InstanceCreation(
- t.first.reference,
- t.second,
- Map.fromIterables(t.third.map((cn) => cn.reference), t.fourth),
- t.fifth,
- t.sixth),
- Tuple6Serializer(
- CanonicalNameSerializer(),
- ListSerializer(dartTypeSerializer),
- ListSerializer(CanonicalNameSerializer()),
- ListSerializer(expressionSerializer),
- ListSerializer(assertStatementSerializer),
- ListSerializer(expressionSerializer)));
-
-Case<Expression> expressionSerializer =
- new Case.uninitialized(const ExpressionTagger());
-
-TextSerializer<Expression?> nullableExpressionSerializer =
- new Optional(expressionSerializer);
-
-TextSerializer<NamedExpression> namedExpressionSerializer =
- new Wrapped<Tuple2<String, Expression>, NamedExpression>(
- unwrapNamedExpression,
- wrapNamedExpression,
- new Tuple2Serializer(const DartString(), expressionSerializer));
-
-Tuple2<String, Expression> unwrapNamedExpression(NamedExpression expression) {
- return new Tuple2(expression.name, expression.value);
-}
-
-NamedExpression wrapNamedExpression(Tuple2<String, Expression> tuple) {
- return new NamedExpression(tuple.first, tuple.second);
-}
-
-TextSerializer<Arguments> argumentsSerializer = new Wrapped<
- Tuple3<List<DartType>, List<Expression>, List<NamedExpression>>,
- Arguments>(
- unwrapArguments,
- wrapArguments,
- Tuple3Serializer(
- new ListSerializer(dartTypeSerializer),
- new ListSerializer(expressionSerializer),
- new ListSerializer(namedExpressionSerializer)));
-
-Tuple3<List<DartType>, List<Expression>, List<NamedExpression>> unwrapArguments(
- Arguments arguments) {
- return new Tuple3(arguments.types, arguments.positional, arguments.named);
-}
-
-Arguments wrapArguments(
- Tuple3<List<DartType>, List<Expression>, List<NamedExpression>> tuple) {
- return new Arguments(tuple.second, types: tuple.first, named: tuple.third);
-}
-
-const Map<int, String> variableDeclarationFlagToName = const {
- VariableDeclaration.FlagFinal: "final",
- VariableDeclaration.FlagConst: "const",
- VariableDeclaration.FlagInitializingFormal: "field-formal",
- VariableDeclaration.FlagCovariantByDeclaration: "covariant",
- VariableDeclaration.FlagCovariantByClass: "generic-covariant-impl",
- VariableDeclaration.FlagLate: "late",
- VariableDeclaration.FlagRequired: "required",
- VariableDeclaration.FlagLowered: "lowered",
- VariableDeclaration.FlagHasDeclaredInitializer: "has-declared-initializer",
-};
-
-class VariableDeclarationFlagTagger implements Tagger<int> {
- @override
- String tag(int flag) {
- return variableDeclarationFlagToName[flag] ??
- (throw StateError("Unknown VariableDeclaration flag value: ${flag}."));
- }
-}
-
-TextSerializer<int> variableDeclarationFlagsSerializer =
- Wrapped<List<int>, int>(
- (w) => List.generate(30, (i) => w & (1 << i))
- .where((f) => f != 0)
- .toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(VariableDeclarationFlagTagger(),
- convertFlagsMap(variableDeclarationFlagToName))));
-
-TextSerializer<VariableDeclaration> variableDeclarationSerializer =
- Wrapped<Tuple2<String?, VariableDeclaration>, VariableDeclaration>(
- (v) => Tuple2(v.name, v),
- (t) => t.second..name = t.first,
- Binder<VariableDeclaration>(
- new Wrapped<Tuple4<int, DartType, Expression?, List<Expression>>,
- VariableDeclaration>(
- (w) => Tuple4(w.flags, w.type, w.initializer, w.annotations),
- (u) => u.fourth.fold(
- VariableDeclaration(null,
- flags: u.first, type: u.second, initializer: u.third),
- (v, a) => v..addAnnotation(a)),
- Tuple4Serializer(
- variableDeclarationFlagsSerializer,
- dartTypeSerializer,
- new Optional(expressionSerializer),
- new ListSerializer(expressionSerializer))),
- ));
-
-TextSerializer<TypeParameter> typeParameterSerializer =
- Wrapped<Tuple2<String?, TypeParameter>, TypeParameter>(
- (p) => Tuple2(p.name, p),
- (t) => t.second..name = t.first,
- Binder<TypeParameter>(Wrapped<void, TypeParameter>(
- (_) => null, (_) => TypeParameter(), const Nothing())));
-
-TextSerializer<List<TypeParameter>> typeParametersSerializer = new Zip(
- new Rebind(
- new Zip(
- new Rebind(new ListSerializer(typeParameterSerializer),
- new ListSerializer(dartTypeSerializer)),
- zipTypeParameterBound,
- unzipTypeParameterBound),
- new ListSerializer(dartTypeSerializer)),
- zipTypeParameterDefaultType,
- unzipTypeParameterDefaultType);
-
-TypeParameter zipTypeParameterBound(TypeParameter node, DartType bound) {
- return node..bound = bound;
-}
-
-Tuple2<TypeParameter, DartType> unzipTypeParameterBound(TypeParameter node) {
- return new Tuple2(node, node.bound);
-}
-
-TypeParameter zipTypeParameterDefaultType(
- TypeParameter node, DartType defaultType) {
- return node..defaultType = defaultType;
-}
-
-Tuple2<TypeParameter, DartType> unzipTypeParameterDefaultType(
- TypeParameter node) {
- return new Tuple2(node, node.defaultType);
-}
-
-class DartTypeTagger extends DartTypeVisitor<String>
- implements Tagger<DartType> {
- const DartTypeTagger();
-
- @override
- String tag(DartType type) => type.accept(this);
-
- @override
- String visitInvalidType(InvalidType _) => "invalid";
- @override
- String visitDynamicType(DynamicType _) => "dynamic";
- @override
- String visitVoidType(VoidType _) => "void";
- @override
- String visitFunctionType(FunctionType _) => "->";
- @override
- String visitTypeParameterType(TypeParameterType _) => "par";
- @override
- String visitInterfaceType(InterfaceType _) => "interface";
- @override
- String visitNeverType(NeverType _) => "never";
- @override
- String visitTypedefType(TypedefType _) => "typedef";
- @override
- String visitFutureOrType(FutureOrType _) => "futureor";
- @override
- String visitNullType(NullType _) => "null-type";
-
- @override
- String defaultDartType(DartType node) {
- throw UnimplementedError('Unimplemented type $node (${node.runtimeType})');
- }
-}
-
-const TextSerializer<InvalidType> invalidTypeSerializer =
- const Wrapped<void, InvalidType>(
- unwrapInvalidType, wrapInvalidType, const Nothing());
-
-void unwrapInvalidType(InvalidType type) {}
-
-InvalidType wrapInvalidType(void ignored) => const InvalidType();
-
-const TextSerializer<DynamicType> dynamicTypeSerializer =
- const Wrapped<void, DynamicType>(
- unwrapDynamicType, wrapDynamicType, const Nothing());
-
-void unwrapDynamicType(DynamicType type) {}
-
-DynamicType wrapDynamicType(void ignored) => const DynamicType();
-
-const TextSerializer<VoidType> voidTypeSerializer =
- const Wrapped<void, VoidType>(
- unwrapVoidType, wrapVoidType, const Nothing());
-
-void unwrapVoidType(VoidType type) {}
-
-VoidType wrapVoidType(void ignored) => const VoidType();
-
-const TextSerializer<NeverType> neverTypeSerializer =
- const Wrapped<void, NeverType>(
- unwrapNeverType, wrapNeverType, const Nothing());
-
-void unwrapNeverType(NeverType type) {}
-
-NeverType wrapNeverType(void ignored) => const NeverType.legacy();
-
-// TODO(cstefantsova): Also handle nameParameters, and typedefType.
-TextSerializer<FunctionType> functionTypeSerializer = new Wrapped<
- Tuple2<List<TypeParameter>,
- Tuple4<List<DartType>, List<DartType>, List<NamedType>, DartType>>,
- FunctionType>(
- unwrapFunctionType,
- wrapFunctionType,
- new Bind(
- typeParametersSerializer,
- new Tuple4Serializer(
- new ListSerializer(dartTypeSerializer),
- new ListSerializer(dartTypeSerializer),
- new ListSerializer(namedTypeSerializer),
- dartTypeSerializer)));
-
-Tuple2<List<TypeParameter>,
- Tuple4<List<DartType>, List<DartType>, List<NamedType>, DartType>>
- unwrapFunctionType(FunctionType type) {
- return new Tuple2(
- type.typeParameters,
- new Tuple4(
- type.positionalParameters.sublist(0, type.requiredParameterCount),
- type.positionalParameters.sublist(type.requiredParameterCount),
- type.namedParameters,
- type.returnType));
-}
-
-FunctionType wrapFunctionType(
- Tuple2<List<TypeParameter>,
- Tuple4<List<DartType>, List<DartType>, List<NamedType>, DartType>>
- tuple) {
- return new FunctionType(tuple.second.first + tuple.second.second,
- tuple.second.fourth, Nullability.legacy,
- requiredParameterCount: tuple.second.first.length,
- typeParameters: tuple.first,
- namedParameters: tuple.second.third);
-}
-
-TextSerializer<NamedType> namedTypeSerializer =
- new Wrapped<Tuple2<String, DartType>, NamedType>(
- unwrapNamedType,
- wrapNamedType,
- Tuple2Serializer(const DartString(), dartTypeSerializer));
-
-Tuple2<String, DartType> unwrapNamedType(NamedType namedType) {
- return new Tuple2(namedType.name, namedType.type);
-}
-
-NamedType wrapNamedType(Tuple2<String, DartType> tuple) {
- return new NamedType(tuple.first, tuple.second);
-}
-
-TextSerializer<TypeParameterType> typeParameterTypeSerializer =
- new Wrapped<Tuple2<TypeParameter, DartType?>, TypeParameterType>(
- unwrapTypeParameterType,
- wrapTypeParameterType,
- Tuple2Serializer(
- new ScopedUse<TypeParameter>(), new Optional(dartTypeSerializer)));
-
-Tuple2<TypeParameter, DartType?> unwrapTypeParameterType(
- TypeParameterType node) {
- return new Tuple2(node.parameter, node.promotedBound);
-}
-
-TypeParameterType wrapTypeParameterType(
- Tuple2<TypeParameter, DartType?> tuple) {
- return new TypeParameterType(tuple.first, Nullability.legacy, tuple.second);
-}
-
-TextSerializer<InterfaceType> interfaceTypeSerializer =
- new Wrapped<Tuple2<CanonicalName, List<DartType>>, InterfaceType>(
- unwrapInterfaceType,
- wrapInterfaceType,
- Tuple2Serializer(
- canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
-
-Tuple2<CanonicalName, List<DartType>> unwrapInterfaceType(InterfaceType node) {
- return new Tuple2(node.className.canonicalName!, node.typeArguments);
-}
-
-InterfaceType wrapInterfaceType(Tuple2<CanonicalName, List<DartType>> tuple) {
- return new InterfaceType.byReference(
- tuple.first.reference, Nullability.legacy, tuple.second);
-}
-
-TextSerializer<TypedefType> typedefTypeSerializer =
- new Wrapped<Tuple2<CanonicalName, List<DartType>>, TypedefType>(
- unwrapTypedefType,
- wrapTypedefType,
- Tuple2Serializer(
- canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
-
-Tuple2<CanonicalName, List<DartType>> unwrapTypedefType(TypedefType node) {
- return new Tuple2(node.typedefReference.canonicalName!, node.typeArguments);
-}
-
-TypedefType wrapTypedefType(Tuple2<CanonicalName, List<DartType>> tuple) {
- return new TypedefType.byReference(
- tuple.first.reference, Nullability.legacy, tuple.second);
-}
-
-TextSerializer<FutureOrType> futureOrTypeSerializer =
- new Wrapped<DartType, FutureOrType>(
- unwrapFutureOrType, wrapFutureOrType, dartTypeSerializer);
-
-DartType unwrapFutureOrType(FutureOrType node) {
- return node.typeArgument;
-}
-
-FutureOrType wrapFutureOrType(DartType typeArgument) {
- return new FutureOrType(typeArgument, Nullability.legacy);
-}
-
-TextSerializer<NullType> nullTypeSerializer =
- new Wrapped<void, NullType>(unwrapNullType, wrapNullType, const Nothing());
-
-void unwrapNullType(NullType type) {}
-
-NullType wrapNullType(void ignored) => const NullType();
-
-Case<DartType> dartTypeSerializer =
- new Case.uninitialized(const DartTypeTagger());
-
-class StatementTagger extends StatementVisitor<String>
- implements Tagger<Statement> {
- const StatementTagger();
-
- @override
- String tag(Statement statement) => statement.accept(this);
-
- @override
- String visitExpressionStatement(ExpressionStatement _) => "expr";
- @override
- String visitReturnStatement(ReturnStatement node) {
- return node.expression == null ? "ret-void" : "ret";
- }
-
- @override
- String visitYieldStatement(YieldStatement _) => "yield";
- @override
- String visitBlock(Block _) => "block";
- @override
- String visitVariableDeclaration(VariableDeclaration _) => "local";
- @override
- String visitIfStatement(IfStatement node) {
- return node.otherwise == null ? "if" : "if-else";
- }
-
- @override
- String visitEmptyStatement(EmptyStatement node) => "skip";
- @override
- String visitWhileStatement(WhileStatement node) => "while";
- @override
- String visitDoStatement(DoStatement node) => "do-while";
- @override
- String visitForStatement(ForStatement node) => "for";
- @override
- String visitForInStatement(ForInStatement node) {
- return node.isAsync ? "await-for-in" : "for-in";
- }
-
- @override
- String visitAssertStatement(AssertStatement node) => "assert";
- @override
- String visitAssertBlock(AssertBlock node) => "assert-block";
- @override
- String visitLabeledStatement(LabeledStatement node) => "label";
- @override
- String visitBreakStatement(BreakStatement node) => "break";
- @override
- String visitTryFinally(TryFinally node) => "try-finally";
- @override
- String visitTryCatch(TryCatch node) => "try-catch";
- @override
- String visitSwitchStatement(SwitchStatement node) => "switch";
- @override
- String visitContinueSwitchStatement(ContinueSwitchStatement node) =>
- "continue";
- @override
- String visitFunctionDeclaration(FunctionDeclaration node) => "local-fun";
-
- @override
- String defaultStatement(Statement node) {
- throw new UnimplementedError(
- "Unimplemented statement $node (${node.runtimeType})");
- }
-}
-
-TextSerializer<ExpressionStatement> expressionStatementSerializer =
- new Wrapped<Expression, ExpressionStatement>(unwrapExpressionStatement,
- wrapExpressionStatement, expressionSerializer);
-
-Expression unwrapExpressionStatement(ExpressionStatement statement) {
- return statement.expression;
-}
-
-ExpressionStatement wrapExpressionStatement(Expression expression) {
- return new ExpressionStatement(expression);
-}
-
-TextSerializer<ReturnStatement> returnStatementSerializer =
- new Wrapped<Expression?, ReturnStatement>(
- unwrapReturnStatement, wrapReturnStatement, expressionSerializer);
-
-Expression? unwrapReturnStatement(ReturnStatement statement) {
- return statement.expression;
-}
-
-ReturnStatement wrapReturnStatement(Expression? expression) {
- return new ReturnStatement(expression);
-}
-
-TextSerializer<ReturnStatement> returnVoidStatementSerializer =
- new Wrapped<void, ReturnStatement>(
- unwrapReturnVoidStatement, wrapReturnVoidStatement, const Nothing());
-
-void unwrapReturnVoidStatement(void ignored) {}
-
-ReturnStatement wrapReturnVoidStatement(void ignored) => new ReturnStatement();
-
-TextSerializer<YieldStatement> yieldStatementSerializer =
- new Wrapped<Expression, YieldStatement>(
- unwrapYieldStatement, wrapYieldStatement, expressionSerializer);
-
-Expression unwrapYieldStatement(YieldStatement node) => node.expression;
-
-YieldStatement wrapYieldStatement(Expression expression) {
- return new YieldStatement(expression);
-}
-
-TextSerializer<AssertStatement> assertStatementSerializer =
- Wrapped<Tuple4<Expression, Expression?, int, int>, AssertStatement>(
- (a) => Tuple4(a.condition, a.message, a.conditionStartOffset,
- a.conditionEndOffset),
- (t) => AssertStatement(t.first,
- message: t.second,
- conditionStartOffset: t.third,
- conditionEndOffset: t.fourth),
- Tuple4Serializer(expressionSerializer, nullableExpressionSerializer,
- const DartInt(), const DartInt()));
-
-TextSerializer<Block> blockSerializer =
- Wrapped<Tuple2<List<Statement>, Expression?>, Block>(
- (w) => Tuple2(w.statements, null),
- (u) => Block(u.first),
- const BlockSerializer());
-
-TextSerializer<AssertBlock> assertBlockSerializer =
- Wrapped<Tuple2<List<Statement>, Expression?>, AssertBlock>(
- (w) => Tuple2(w.statements, null),
- (u) => AssertBlock(u.first),
- const BlockSerializer());
-
-/// Serializer for [Block]s.
-///
-/// [BlockSerializer] is a combination of [ListSerializer] and [Bind]. As in
-/// the case of [ListSerializer], [BlockSerializer] is a sequence of statements.
-/// As in the case of [Bind], a statement in a block can be a
-/// [VariableDeclaration] introducing binders that are bound in the rest of the
-/// statements in the block. Effectively, [BlockSerializer] could have been
-/// expressed in terms of [ListSerializer] and [Bind], but that would transform
-/// blocks like {stmt1; stmt2; stmt3;} into {stmt1; {stmt2; {stmt3; {}}}} via
-/// the round-trip, and an extra pass will be required to flatten the
-/// unnecessary nested blocks. Instead, [BlockSerializer] is implemented
-/// without direct invocations of either [ListSerializer] or [Bind], but with a
-/// certain internal correspondence to how they work.
-class BlockSerializer
- extends TextSerializer<Tuple2<List<Statement>, Expression?>> {
- const BlockSerializer();
-
- @override
- Tuple2<List<Statement>, Expression?> readFrom(
- Iterator<Object?> stream, DeserializationState? state) {
- if (state == null) {
- throw StateError(
- "No deserialization state provided for ${runtimeType}.readFrom.");
- }
- Object? iterator = stream.current;
- if (iterator is! Iterator) {
- throw StateError("Expected a list, found an atom: '${iterator}'.");
- }
- iterator.moveNext();
- List<Statement> statements = [];
- DeserializationState currentState = state;
- while (iterator.current != null) {
- currentState = new DeserializationState(
- new DeserializationEnvironment(currentState.environment),
- currentState.nameRoot);
- statements.add(statementSerializer.readFrom(iterator, currentState));
- currentState.environment.extend();
- }
- stream.moveNext();
- Expression? expression =
- nullableExpressionSerializer.readFrom(stream, currentState);
- return new Tuple2(statements, expression);
- }
-
- @override
- void writeTo(StringBuffer buffer, Tuple2<List<Statement>, Expression?> tuple,
- SerializationState? state) {
- if (state == null) {
- throw StateError(
- "No serialization state provided for ${runtimeType}.writeTo.");
- }
- buffer.write('(');
- SerializationState currentState = state;
- for (int i = 0; i < tuple.first.length; ++i) {
- if (i != 0) buffer.write(' ');
- currentState = new SerializationState(
- new SerializationEnvironment(currentState.environment));
- statementSerializer.writeTo(buffer, tuple.first[i], currentState);
- currentState.environment.extend();
- }
- buffer.write(') ');
- nullableExpressionSerializer.writeTo(buffer, tuple.second, currentState);
- }
-}
-
-TextSerializer<IfStatement> ifStatementSerializer =
- new Wrapped<Tuple2<Expression, Statement>, IfStatement>(
- unwrapIfStatement,
- wrapIfStatement,
- Tuple2Serializer(expressionSerializer, statementSerializer));
-
-Tuple2<Expression, Statement> unwrapIfStatement(IfStatement node) {
- return new Tuple2(node.condition, node.then);
-}
-
-IfStatement wrapIfStatement(Tuple2<Expression, Statement> tuple) {
- return new IfStatement(tuple.first, tuple.second, null);
-}
-
-TextSerializer<IfStatement> ifElseStatementSerializer =
- new Wrapped<Tuple3<Expression, Statement, Statement?>, IfStatement>(
- unwrapIfElseStatement,
- wrapIfElseStatement,
- Tuple3Serializer<Expression, Statement, Statement?>(
- expressionSerializer, statementSerializer, statementSerializer));
-
-Tuple3<Expression, Statement, Statement?> unwrapIfElseStatement(
- IfStatement node) {
- return new Tuple3(node.condition, node.then, node.otherwise);
-}
-
-IfStatement wrapIfElseStatement(
- Tuple3<Expression, Statement, Statement?> tuple) {
- return new IfStatement(tuple.first, tuple.second, tuple.third);
-}
-
-TextSerializer<EmptyStatement> emptyStatementSerializer =
- new Wrapped<void, EmptyStatement>(
- unwrapEmptyStatement, wrapEmptyStatement, const Nothing());
-
-void unwrapEmptyStatement(EmptyStatement node) {}
-
-EmptyStatement wrapEmptyStatement(void ignored) => new EmptyStatement();
-
-TextSerializer<WhileStatement> whileStatementSerializer =
- new Wrapped<Tuple2<Expression, Statement>, WhileStatement>(
- unwrapWhileStatement,
- wrapWhileStatement,
- new Tuple2Serializer(expressionSerializer, statementSerializer));
-
-Tuple2<Expression, Statement> unwrapWhileStatement(WhileStatement node) {
- return new Tuple2(node.condition, node.body);
-}
-
-WhileStatement wrapWhileStatement(Tuple2<Expression, Statement> tuple) {
- return new WhileStatement(tuple.first, tuple.second);
-}
-
-TextSerializer<DoStatement> doStatementSerializer =
- new Wrapped<Tuple2<Statement, Expression>, DoStatement>(
- unwrapDoStatement,
- wrapDoStatement,
- new Tuple2Serializer(statementSerializer, expressionSerializer));
-
-Tuple2<Statement, Expression> unwrapDoStatement(DoStatement node) {
- return new Tuple2(node.body, node.condition);
-}
-
-DoStatement wrapDoStatement(Tuple2<Statement, Expression> tuple) {
- return new DoStatement(tuple.first, tuple.second);
-}
-
-TextSerializer<ForStatement> forStatementSerializer = Wrapped<
- Tuple2<List<VariableDeclaration>,
- Tuple3<Expression?, List<Expression>, Statement>>,
- ForStatement>(
- (w) => Tuple2(w.variables, Tuple3(w.condition, w.updates, w.body)),
- (u) =>
- ForStatement(u.first, u.second.first, u.second.second, u.second.third),
- new Bind(
- ListSerializer(variableDeclarationSerializer),
- new Tuple3Serializer(Optional(expressionSerializer),
- new ListSerializer(expressionSerializer), statementSerializer)));
-
-TextSerializer<ForInStatement> forInStatementSerializer = new Wrapped<
- Tuple2<Expression, Tuple2<VariableDeclaration, Statement>>,
- ForInStatement>(
- unwrapForInStatement,
- wrapForInStatement,
- new Tuple2Serializer(expressionSerializer,
- new Bind(variableDeclarationSerializer, statementSerializer)));
-
-Tuple2<Expression, Tuple2<VariableDeclaration, Statement>> unwrapForInStatement(
- ForInStatement node) {
- return new Tuple2(node.iterable, new Tuple2(node.variable, node.body));
-}
-
-ForInStatement wrapForInStatement(
- Tuple2<Expression, Tuple2<VariableDeclaration, Statement>> tuple) {
- return new ForInStatement(
- tuple.second.first, tuple.first, tuple.second.second);
-}
-
-TextSerializer<ForInStatement> awaitForInStatementSerializer = new Wrapped<
- Tuple2<Expression, Tuple2<VariableDeclaration, Statement>>,
- ForInStatement>(
- unwrapForInStatement,
- wrapAwaitForInStatement,
- new Tuple2Serializer(expressionSerializer,
- new Bind(variableDeclarationSerializer, statementSerializer)));
-
-ForInStatement wrapAwaitForInStatement(
- Tuple2<Expression, Tuple2<VariableDeclaration, Statement>> tuple) {
- return new ForInStatement(
- tuple.second.first, tuple.first, tuple.second.second,
- isAsync: true);
-}
-
-TextSerializer<LabeledStatement> labeledStatementSerializer =
- Wrapped<Tuple2<LabeledStatement, Statement>, LabeledStatement>(
- (ls) => Tuple2(ls, ls.body),
- (t) => t.first..body = t.second,
- Bind(
- Wrapped<Tuple2<String?, LabeledStatement>, LabeledStatement>(
- (ls) => Tuple2("L", ls),
- (t) => t.second,
- Binder(Wrapped<void, LabeledStatement>(
- (_) => null, (_) => LabeledStatement(null), Nothing()))),
- statementSerializer));
-
-TextSerializer<BreakStatement> breakSerializer =
- new Wrapped<LabeledStatement, BreakStatement>(unwrapBreakStatement,
- wrapBreakStatement, const ScopedUse<LabeledStatement>());
-
-LabeledStatement unwrapBreakStatement(BreakStatement node) {
- return node.target;
-}
-
-BreakStatement wrapBreakStatement(LabeledStatement node) {
- return new BreakStatement(node);
-}
-
-TextSerializer<TryFinally> tryFinallySerializer =
- Wrapped<Tuple2<Statement, Statement>, TryFinally>(
- (w) => Tuple2(w.body, w.finalizer),
- (u) => TryFinally(u.first, u.second),
- Tuple2Serializer(statementSerializer, statementSerializer));
-
-TextSerializer<TryCatch> tryCatchSerializer =
- Wrapped<Tuple2<Statement, List<Catch>>, TryCatch>(
- (w) => Tuple2(w.body, w.catches),
- (u) => TryCatch(u.first, u.second),
- Tuple2Serializer(statementSerializer, ListSerializer(catchSerializer)));
-
-TextSerializer<Catch> catchSerializer =
- Wrapped<
- Tuple2<
- DartType,
- Tuple2<Tuple2<VariableDeclaration?, VariableDeclaration?>,
- Statement>>,
- Catch>(
- (w) =>
- Tuple2(w.guard, Tuple2(Tuple2(w.exception, w.stackTrace), w.body)),
- (u) => Catch(u.second.first.first, u.second.second,
- stackTrace: u.second.first.second, guard: u.first),
- Tuple2Serializer(
- dartTypeSerializer,
- Bind(
- Tuple2Serializer(Optional(variableDeclarationSerializer),
- Optional(variableDeclarationSerializer)),
- statementSerializer)));
-
-TextSerializer<SwitchStatement> switchStatementSerializer =
- Wrapped<Tuple2<Expression, List<SwitchCase>>, SwitchStatement>(
- (w) => Tuple2(w.expression, w.cases),
- (u) => SwitchStatement(u.first, u.second),
- Tuple2Serializer(
- expressionSerializer,
- Zip(
- Bind(ListSerializer<SwitchCase>(switchCaseSerializer),
- ListSerializer(statementSerializer)),
- (SwitchCase c, Statement b) => c..body = b,
- (SwitchCase z) => Tuple2(z, z.body))));
-
-class SwitchCaseTagger implements Tagger<SwitchCase> {
- @override
- String tag(SwitchCase node) {
- return node.isDefault ? "default" : "case";
- }
-}
-
-TextSerializer<SwitchCase> switchCaseCaseSerializer =
- Wrapped<Tuple2<String?, SwitchCase>, SwitchCase>(
- (w) => Tuple2("L", w),
- (u) => u.second,
- Binder(Wrapped<List<Expression>, SwitchCase>(
- (w) => w.expressions,
- (u) => SwitchCase(u, List.filled(u.length, 0), null),
- ListSerializer(expressionSerializer))));
-
-TextSerializer<SwitchCase> switchCaseDefaultSerializer =
- Wrapped<Tuple2<String?, SwitchCase>, SwitchCase>(
- (w) => Tuple2("L", w),
- (u) => u.second,
- Binder(Wrapped<void, SwitchCase>(
- (w) => null, (u) => SwitchCase.defaultCase(null), Nothing())));
-
-TextSerializer<SwitchCase> switchCaseSerializer = Case(SwitchCaseTagger(), {
- "case": switchCaseCaseSerializer,
- "default": switchCaseDefaultSerializer,
-});
-
-TextSerializer<ContinueSwitchStatement> continueSwitchStatementSerializer =
- Wrapped<SwitchCase, ContinueSwitchStatement>(
- (w) => w.target, (u) => ContinueSwitchStatement(u), ScopedUse());
-
-TextSerializer<FunctionDeclaration> functionDeclarationSerializer =
- Wrapped<Tuple2<VariableDeclaration, FunctionNode>, FunctionDeclaration>(
- (w) => Tuple2(w.variable, w.function),
- (u) => FunctionDeclaration(u.first, u.second),
- Rebind(variableDeclarationSerializer, functionNodeSerializer));
-
-Case<Statement> statementSerializer =
- new Case.uninitialized(const StatementTagger());
-
-const Map<AsyncMarker, String> asyncMarkerToName = {
- AsyncMarker.Async: "async",
- AsyncMarker.Sync: "sync",
- AsyncMarker.AsyncStar: "async-star",
- AsyncMarker.SyncStar: "sync-star",
- AsyncMarker.SyncYielding: "sync-yielding",
-};
-
-class AsyncMarkerTagger implements Tagger<AsyncMarker> {
- const AsyncMarkerTagger();
-
- @override
- String tag(AsyncMarker node) {
- return asyncMarkerToName[node] ?? (throw new UnsupportedError("${node}"));
- }
-}
-
-TextSerializer<AsyncMarker> asyncMarkerSerializer =
- Case(AsyncMarkerTagger(), convertFlagsMap(asyncMarkerToName));
-
-// '/**/' comments added to guide formatting.
-
-TextSerializer<Tuple2<FunctionNode, List<Initializer>?>> /**/
- functionNodeWithInitializersSerializer = Wrapped<
- Tuple2<
- AsyncMarker,
- Tuple2<
- /**/
- Tuple2<
- /**/
- List<TypeParameter>,
- Tuple3<
- List<VariableDeclaration>,
- List<VariableDeclaration>,
- List<VariableDeclaration>>>,
- Tuple3<DartType, List<Initializer>?, Statement?>>>,
- Tuple2<FunctionNode, List<Initializer>?>>(
- (w) => Tuple2(
- w.first.asyncMarker,
- Tuple2(
- Tuple2(
- w.first.typeParameters,
- Tuple3(
- w.first.positionalParameters
- .sublist(0, w.first.requiredParameterCount),
- w.first.positionalParameters
- .sublist(w.first.requiredParameterCount),
- w.first.namedParameters)),
- Tuple3(w.first.returnType, w.second, w.first.body))),
- (u) => Tuple2(
- FunctionNode(u.second.second.third,
- typeParameters: u.second.first.first,
- positionalParameters:
- u.second.first.second.first + u.second.first.second.second,
- namedParameters: u.second.first.second.third,
- requiredParameterCount: u.second.first.second.first.length,
- returnType: u.second.second.first,
- asyncMarker: u.first),
- u.second.second.second),
- Tuple2Serializer(
- asyncMarkerSerializer,
- Bind(
- Rebind(
- typeParametersSerializer,
- Tuple3Serializer(
- ListSerializer(variableDeclarationSerializer),
- ListSerializer(variableDeclarationSerializer),
- ListSerializer(variableDeclarationSerializer))),
- Tuple3Serializer(
- dartTypeSerializer,
- Optional(ListSerializer(initializerSerializer)),
- Optional(statementSerializer)))));
-
-TextSerializer<FunctionNode> functionNodeSerializer =
- Wrapped<Tuple2<FunctionNode, List<Initializer>?>, FunctionNode>(
- (w) => Tuple2(w, null),
- (u) => u.first,
- functionNodeWithInitializersSerializer);
-
-const Map<int, String> procedureFlagToName = const {
- Procedure.FlagStatic: "static",
- Procedure.FlagAbstract: "abstract",
- Procedure.FlagExternal: "external",
- Procedure.FlagConst: "const",
- Procedure.FlagRedirectingFactory: "redirecting-factory-constructor",
- Procedure.FlagExtensionMember: "extension-member",
- Procedure.FlagNonNullableByDefault: "non-nullable-by-default",
- Procedure.FlagSynthetic: "synthetic",
-};
-
-class ProcedureFlagTagger implements Tagger<int> {
- const ProcedureFlagTagger();
-
- @override
- String tag(int flag) {
- return procedureFlagToName[flag] ??
- (throw StateError("Unknown Procedure flag value: ${flag}."));
- }
-}
-
-TextSerializer<int> procedureFlagsSerializer = Wrapped<List<int>, int>(
- (w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(
- Case(ProcedureFlagTagger(), convertFlagsMap(procedureFlagToName))));
-
-const Map<int, String> fieldFlagToName = const {
- Field.FlagFinal: "final",
- Field.FlagConst: "const",
- Field.FlagStatic: "static",
- Field.FlagCovariant: "covariant",
- Field.FlagCovariantByClass: "generic-covariant-impl",
- Field.FlagLate: "late",
- Field.FlagExtensionMember: "extension-member",
- Field.FlagNonNullableByDefault: "non-nullable-by-default",
- Field.FlagInternalImplementation: "internal-implementation",
-};
-
-class FieldFlagTagger implements Tagger<int> {
- const FieldFlagTagger();
-
- @override
- String tag(int flag) {
- return fieldFlagToName[flag] ??
- (throw StateError("Unknown Field flag value: ${flag}."));
- }
-}
-
-TextSerializer<int> fieldFlagsSerializer = Wrapped<List<int>, int>(
- (w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(FieldFlagTagger(), convertFlagsMap(fieldFlagToName))));
-
-const Map<int, String> constructorFlagToName = const {
- Constructor.FlagConst: "const",
- Constructor.FlagExternal: "external",
- Constructor.FlagSynthetic: "synthetic",
- Constructor.FlagNonNullableByDefault: "non-nullable-by-default",
-};
-
-class ConstructorFlagTagger implements Tagger<int> {
- const ConstructorFlagTagger();
-
- @override
- String tag(int flag) {
- return constructorFlagToName[flag] ??
- (throw StateError("Unknown Constructor flag value: ${flag}."));
- }
-}
-
-TextSerializer<int> constructorFlagsSerializer = Wrapped<List<int>, int>(
- (w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(
- Case(ConstructorFlagTagger(), convertFlagsMap(constructorFlagToName))));
-
-const Map<int, String> redirectingFactoryFlagToName = const {
- RedirectingFactory.FlagConst: "const",
- RedirectingFactory.FlagExternal: "external",
- RedirectingFactory.FlagNonNullableByDefault: "non-nullable-by-default",
-};
-
-class RedirectingFactoryFlagTagger implements Tagger<int> {
- const RedirectingFactoryFlagTagger();
-
- @override
- String tag(int flag) {
- return redirectingFactoryFlagToName[flag] ??
- (throw StateError("Unknown RedirectingFactory flag value: ${flag}."));
- }
-}
-
-TextSerializer<int> redirectingFactoryConstructorFlagsSerializer =
- Wrapped<List<int>, int>(
- (w) => List.generate(30, (i) => w & (1 << i))
- .where((f) => f != 0)
- .toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(RedirectingFactoryFlagTagger(),
- convertFlagsMap(redirectingFactoryFlagToName))));
-
-class MemberTagger implements Tagger<Member> {
- const MemberTagger();
-
- @override
- String tag(Member node) {
- if (node is Field) {
- return node.hasSetter ? "mutable-field" : "immutable-field";
- } else if (node is Constructor) {
- return "constructor";
- } else if (node is RedirectingFactory) {
- return "redirecting-factory-constructor";
- } else if (node is Procedure) {
- switch (node.kind) {
- case ProcedureKind.Method:
- return "method";
- case ProcedureKind.Getter:
- return "getter";
- case ProcedureKind.Setter:
- return "setter";
- case ProcedureKind.Operator:
- return "operator";
- case ProcedureKind.Factory:
- return "factory";
- default:
- throw new UnsupportedError("MemberTagger.tag(${node.kind})");
- }
- } else {
- throw UnimplementedError("MemberTagger.tag(${node.runtimeType})");
- }
- }
-}
-
-TextSerializer<Field> mutableFieldSerializer =
- Wrapped<Tuple5<Name, int, DartType, Expression?, Uri>, Field>(
- (w) => Tuple5(w.name, w.flags, w.type, w.initializer, w.fileUri),
- (u) => Field.mutable(u.first,
- type: u.third, initializer: u.fourth, fileUri: u.fifth)
- ..flags = u.second,
- Tuple5Serializer(nameSerializer, fieldFlagsSerializer,
- dartTypeSerializer, nullableExpressionSerializer, UriSerializer()));
-
-TextSerializer<Field> immutableFieldSerializer =
- Wrapped<Tuple5<Name, int, DartType, Expression?, Uri>, Field>(
- (w) => Tuple5(w.name, w.flags, w.type, w.initializer, w.fileUri),
- (u) => Field.immutable(u.first,
- type: u.third, initializer: u.fourth, fileUri: u.fifth)
- ..flags = u.second,
- Tuple5Serializer(nameSerializer, fieldFlagsSerializer,
- dartTypeSerializer, nullableExpressionSerializer, UriSerializer()));
-
-TextSerializer<Procedure> methodSerializer =
- Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
- (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
- (u) =>
- Procedure(u.first, ProcedureKind.Method, u.third, fileUri: u.fourth)
- ..flags = u.second,
- Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
- functionNodeSerializer, UriSerializer()));
-
-TextSerializer<Procedure> getterSerializer =
- Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
- (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
- (u) =>
- Procedure(u.first, ProcedureKind.Getter, u.third, fileUri: u.fourth)
- ..flags = u.second,
- Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
- functionNodeSerializer, UriSerializer()));
-
-TextSerializer<Procedure> setterSerializer =
- Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
- (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
- (u) =>
- Procedure(u.first, ProcedureKind.Setter, u.third, fileUri: u.fourth)
- ..flags = u.second,
- Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
- functionNodeSerializer, UriSerializer()));
-
-TextSerializer<Procedure> operatorSerializer =
- Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
- (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
- (u) => Procedure(u.first, ProcedureKind.Operator, u.third,
- fileUri: u.fourth)
- ..flags = u.second,
- Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
- functionNodeSerializer, UriSerializer()));
-
-TextSerializer<Procedure> factorySerializer =
- Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
- (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
- (u) => Procedure(u.first, ProcedureKind.Factory, u.third,
- fileUri: u.fourth)
- ..flags = u.second,
- Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
- functionNodeSerializer, UriSerializer()));
-
-TextSerializer<Constructor> constructorSerializer = Wrapped<
- Tuple4<Name, int, Tuple2<FunctionNode, List<Initializer>?>, Uri>,
- Constructor>(
- (w) =>
- Tuple4(w.name, w.flags, Tuple2(w.function, w.initializers), w.fileUri),
- (u) => Constructor(u.third.first,
- name: u.first, initializers: u.third.second, fileUri: u.fourth)
- ..flags = u.second,
- Tuple4Serializer(nameSerializer, constructorFlagsSerializer,
- functionNodeWithInitializersSerializer, UriSerializer()));
-
-TextSerializer<RedirectingFactory> redirectingFactoryConstructorSerializer
- // Comment added to direct formatter.
- = Wrapped<
- Tuple6<Name, int, FunctionNode, CanonicalName, List<DartType>, Uri>,
- RedirectingFactory>(
- (w) => Tuple6(w.name, w.flags, w.function,
- w.targetReference!.canonicalName!, w.typeArguments, w.fileUri),
- (u) => RedirectingFactory(u.fourth.reference,
- name: u.first,
- function: u.third,
- typeArguments: u.fifth,
- fileUri: u.sixth)
- ..flags = u.second,
- Tuple6Serializer(
- nameSerializer,
- redirectingFactoryConstructorFlagsSerializer,
- functionNodeSerializer,
- CanonicalNameSerializer(),
- ListSerializer(dartTypeSerializer),
- UriSerializer()));
-
-Case<Member> memberSerializer = new Case.uninitialized(const MemberTagger());
-
-TextSerializer<LibraryPart> libraryPartSerializer =
- Wrapped<Tuple2<String, List<Expression>>, LibraryPart>(
- (w) => Tuple2(w.partUri, w.annotations),
- (u) => LibraryPart(u.second, u.first),
- Tuple2Serializer(DartString(), ListSerializer(expressionSerializer)));
-
-class LibraryTagger implements Tagger<Library> {
- const LibraryTagger();
-
- @override
- String tag(Library node) {
- return node.isNonNullableByDefault ? "null-safe" : "legacy";
- }
-}
-
-const Map<int, String> libraryFlagToName = const {
- Library.SyntheticFlag: "synthetic",
- Library.NonNullableByDefaultFlag: "nnbd",
- Library.NonNullableByDefaultModeBit1: "nnbd-bit1",
- Library.NonNullableByDefaultModeBit2: "nnbd-bit2",
-};
-
-class LibraryFlagTagger implements Tagger<int> {
- const LibraryFlagTagger();
-
- @override
- String tag(int flag) {
- return libraryFlagToName[flag] ??
- (throw StateError("Unknown Library flag value: ${flag}."));
- }
-}
-
-TextSerializer<int> libraryFlagsSerializer = Wrapped<List<int>, int>(
- (w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(
- Case(LibraryFlagTagger(), convertFlagsMap(libraryFlagToName))));
-
-TextSerializer<Library> librarySerializer = new Wrapped<
- Tuple8<Uri, int, List<LibraryPart>, List<Member>, List<Class>,
- List<Typedef>, List<Extension>, Uri>,
- Library>(
- (w) => Tuple8(w.importUri, w.flags, w.parts, [...w.fields, ...w.procedures],
- w.classes, w.typedefs, w.extensions, w.fileUri),
- (u) => Library(u.first,
- parts: u.third,
- fields: u.fourth.where((m) => m is Field).cast<Field>().toList(),
- procedures:
- u.fourth.where((m) => m is Procedure).cast<Procedure>().toList(),
- classes: u.fifth,
- typedefs: u.sixth,
- extensions: u.seventh,
- fileUri: u.eighth)
- ..flags = u.second,
- Tuple8Serializer(
- UriSerializer(),
- libraryFlagsSerializer,
- ListSerializer(libraryPartSerializer),
- ListSerializer(memberSerializer),
- ListSerializer(classSerializer),
- ListSerializer(typedefSerializer),
- ListSerializer(extensionSerializer),
- UriSerializer()),
-);
-
-TextSerializer<Component> componentSerializer =
- Wrapped<List<Library>, Component>(
- (w) => w.libraries,
- (u) => Component(nameRoot: CanonicalName.root(), libraries: u),
- ListSerializer(librarySerializer));
-
-class ShowHideTagger implements Tagger<Combinator> {
- @override
- String tag(Combinator node) => node.isShow ? "show" : "hide";
-}
-
-TextSerializer<Combinator> showSerializer = Wrapped<List<String>, Combinator>(
- (c) => c.names, (ns) => Combinator(true, ns), ListSerializer(DartString()));
-
-TextSerializer<Combinator> hideSerializer = Wrapped<List<String>, Combinator>(
- (c) => c.names,
- (ns) => Combinator(false, ns),
- ListSerializer(DartString()));
-
-Case<Combinator> showHideSerializer = new Case(ShowHideTagger(), {
- "show": showSerializer,
- "hide": hideSerializer,
-});
-
-TextSerializer<LibraryDependency> libraryDependencySerializer = Wrapped<
- Tuple5<CanonicalName, String?, List<Combinator>, int, List<Expression>>,
- LibraryDependency>(
- (ld) => Tuple5(ld.importedLibraryReference.canonicalName!, ld.name,
- ld.combinators, ld.flags, ld.annotations),
- (t) => LibraryDependency.byReference(
- t.fourth, t.fifth, t.first.reference, t.second, t.third),
- Tuple5Serializer(
- CanonicalNameSerializer(),
- Optional(DartString()),
- ListSerializer(showHideSerializer),
- DartInt(),
- ListSerializer(expressionSerializer)));
-
-class ConstantTagger extends ConstantVisitor<String>
- implements Tagger<Constant> {
- const ConstantTagger();
-
- @override
- String tag(Constant node) => node.accept(this);
-
- @override
- String visitBoolConstant(BoolConstant node) => "const-bool";
- @override
- String visitDoubleConstant(DoubleConstant node) => "const-double";
- @override
- String visitInstanceConstant(InstanceConstant node) => "const-object";
- @override
- String visitIntConstant(IntConstant node) => "const-int";
- @override
- String visitListConstant(ListConstant node) => "const-list";
- @override
- String visitMapConstant(MapConstant node) => "const-map";
- @override
- String visitNullConstant(NullConstant node) => "const-null";
- @override
- String visitInstantiationConstant(InstantiationConstant node) =>
- "const-apply";
- @override
- String visitSetConstant(SetConstant node) => "const-set";
- @override
- String visitStringConstant(StringConstant node) => "const-string";
- @override
- String visitSymbolConstant(SymbolConstant node) => "const-symbol";
- @override
- String visitStaticTearOffConstant(StaticTearOffConstant node) =>
- "const-tearoff-static";
- @override
- String visitConstructorTearOffConstant(ConstructorTearOffConstant node) =>
- "const-tearoff-constructor";
- @override
- String visitRedirectingFactoryTearOffConstant(
- RedirectingFactoryTearOffConstant node) =>
- "const-tearoff-redirecting-factory";
- @override
- String visitTypedefTearOffConstant(TypedefTearOffConstant node) =>
- "const-tearoff-typedef";
- @override
- String visitTypeLiteralConstant(TypeLiteralConstant node) => "const-type";
- @override
- String visitUnevaluatedConstant(UnevaluatedConstant node) => "const-expr";
-
- @override
- String defaultConstant(Constant node) {
- throw new UnimplementedError(
- 'Unimplemented constant $node (${node.runtimeType})');
- }
-}
-
-TextSerializer<BoolConstant> boolConstantSerializer =
- Wrapped<bool, BoolConstant>(
- (w) => w.value, (u) => BoolConstant(u), DartBool());
-
-TextSerializer<DoubleConstant> doubleConstantSerializer =
- Wrapped<double, DoubleConstant>(
- (w) => w.value, (u) => DoubleConstant(u), DartDouble());
-
-TextSerializer<IntConstant> intConstantSerializer =
- Wrapped<int, IntConstant>((w) => w.value, (u) => IntConstant(u), DartInt());
-
-TextSerializer<ListConstant> listConstantSerializer =
- Wrapped<Tuple2<DartType, List<Constant>>, ListConstant>(
- (w) => Tuple2(w.typeArgument, w.entries),
- (u) => ListConstant(u.first, u.second),
- Tuple2Serializer(
- dartTypeSerializer, ListSerializer(constantSerializer)));
-
-TextSerializer<MapConstant> mapConstantSerializer =
- Wrapped<Tuple3<DartType, DartType, List<ConstantMapEntry>>, MapConstant>(
- (w) => Tuple3(w.keyType, w.valueType, w.entries),
- (u) => MapConstant(u.first, u.second, u.third),
- Tuple3Serializer(
- dartTypeSerializer,
- dartTypeSerializer,
- Zip(
- Tuple2Serializer(ListSerializer(constantSerializer),
- ListSerializer(constantSerializer)),
- (Constant k, Constant v) => ConstantMapEntry(k, v),
- (z) => Tuple2(z.key, z.value))));
-
-TextSerializer<NullConstant> nullConstantSerializer =
- Wrapped<void, NullConstant>((w) => null, (u) => NullConstant(), Nothing());
-
-TextSerializer<InstantiationConstant> instantiationConstantSerializer =
- Wrapped<Tuple2<Constant, List<DartType>>, InstantiationConstant>(
- (w) => Tuple2(w.tearOffConstant, w.types),
- (u) => InstantiationConstant(u.first, u.second),
- Tuple2Serializer(
- constantSerializer, ListSerializer(dartTypeSerializer)));
-
-TextSerializer<SetConstant> setConstantSerializer =
- Wrapped<Tuple2<DartType, List<Constant>>, SetConstant>(
- (w) => Tuple2(w.typeArgument, w.entries),
- (u) => SetConstant(u.first, u.second),
- Tuple2Serializer(
- dartTypeSerializer, ListSerializer(constantSerializer)));
-
-TextSerializer<StringConstant> stringConstantSerializer =
- Wrapped<String, StringConstant>(
- (w) => w.value, (u) => StringConstant(u), DartString());
-
-TextSerializer<SymbolConstant> symbolConstantSerializer =
- Wrapped<Tuple2<String, CanonicalName?>, SymbolConstant>(
- (w) => Tuple2(w.name, w.libraryReference?.canonicalName),
- (u) => SymbolConstant(u.first, u.second?.reference),
- Tuple2Serializer(DartString(), Optional(CanonicalNameSerializer())));
-
-TextSerializer<StaticTearOffConstant> staticTearOffConstantSerializer =
- Wrapped<CanonicalName, StaticTearOffConstant>(
- (w) => w.targetReference.canonicalName!,
- (u) => StaticTearOffConstant.byReference(u.reference),
- CanonicalNameSerializer());
-
-TextSerializer<ConstructorTearOffConstant>
- constructorTearOffConstantSerializer =
- Wrapped<CanonicalName, ConstructorTearOffConstant>(
- (w) => w.targetReference.canonicalName!,
- (u) => ConstructorTearOffConstant.byReference(u.reference),
- CanonicalNameSerializer());
-
-TextSerializer<RedirectingFactoryTearOffConstant>
- redirectingFactoryTearOffConstantSerializer =
- Wrapped<CanonicalName, RedirectingFactoryTearOffConstant>(
- (w) => w.targetReference.canonicalName!,
- (u) => RedirectingFactoryTearOffConstant.byReference(u.reference),
- CanonicalNameSerializer());
-
-final TextSerializer<TypedefTearOffConstant> typedefTearOffConstantSerializer =
- new Wrapped<Tuple2<List<TypeParameter>, Tuple2<Constant, List<DartType>>>,
- TypedefTearOffConstant>(
- unwrapTypedefTearOffConstant,
- wrapTypedefTearOffConstant,
- Bind(
- typeParametersSerializer,
- Tuple2Serializer(
- constantSerializer, ListSerializer(dartTypeSerializer))));
-
-Tuple2<List<TypeParameter>, Tuple2<Constant, List<DartType>>>
- unwrapTypedefTearOffConstant(TypedefTearOffConstant node) {
- return new Tuple2(
- node.parameters, new Tuple2(node.tearOffConstant, node.types));
-}
-
-TypedefTearOffConstant wrapTypedefTearOffConstant(
- Tuple2<List<TypeParameter>, Tuple2<Constant, List<DartType>>> tuple) {
- return new TypedefTearOffConstant(
- tuple.first, tuple.second.first as TearOffConstant, tuple.second.second);
-}
-
-TextSerializer<TypeLiteralConstant> typeLiteralConstantSerializer =
- Wrapped<DartType, TypeLiteralConstant>(
- (w) => w.type, (u) => TypeLiteralConstant(u), dartTypeSerializer);
-
-TextSerializer<UnevaluatedConstant> unevaluatedConstantSerializer =
- Wrapped<Expression, UnevaluatedConstant>((w) => w.expression,
- (u) => UnevaluatedConstant(u), expressionSerializer);
-
-TextSerializer<InstanceConstant> instanceConstantSerializer =
- Wrapped<
- Tuple4<CanonicalName, List<DartType>, List<CanonicalName>,
- List<Constant>>,
- InstanceConstant>(
- (w) => Tuple4(
- w.classReference.canonicalName!,
- w.typeArguments,
- w.fieldValues.keys.map((r) => r.canonicalName!).toList(),
- w.fieldValues.values.toList()),
- (u) => InstanceConstant(u.first.reference, u.second,
- Map.fromIterables(u.third.map((c) => c.reference), u.fourth)),
- Tuple4Serializer(
- CanonicalNameSerializer(),
- ListSerializer(dartTypeSerializer),
- ListSerializer(CanonicalNameSerializer()),
- ListSerializer(constantSerializer)));
-
-Case<Constant> constantSerializer = Case.uninitialized(ConstantTagger());
-
-class InitializerTagger implements Tagger<Initializer> {
- const InitializerTagger();
-
- @override
- String tag(Initializer node) {
- if (node is AssertInitializer) {
- return "assert";
- } else if (node is FieldInitializer) {
- return "field";
- } else if (node is InvalidInitializer) {
- return "invalid";
- } else if (node is LocalInitializer) {
- return "local";
- } else if (node is RedirectingInitializer) {
- return "redirecting";
- } else if (node is SuperInitializer) {
- return "super";
- } else {
- throw UnimplementedError("InitializerTagger.tag(${node.runtimeType}).");
- }
- }
-}
-
-TextSerializer<AssertInitializer> assertInitializerSerializer =
- Wrapped<Statement, AssertInitializer>((w) => w.statement,
- (u) => AssertInitializer(u as AssertStatement), statementSerializer);
-
-TextSerializer<FieldInitializer> fieldInitializerSerializer =
- Wrapped<Tuple2<CanonicalName, Expression>, FieldInitializer>(
- (w) => Tuple2(w.fieldReference.canonicalName!, w.value),
- (u) => FieldInitializer.byReference(u.first.reference, u.second),
- Tuple2Serializer(CanonicalNameSerializer(), expressionSerializer));
-
-TextSerializer<InvalidInitializer> invalidInitializerSerializer =
- Wrapped<void, InvalidInitializer>(
- (_) => null, (_) => InvalidInitializer(), Nothing());
-
-TextSerializer<LocalInitializer> localInitializerSerializer =
- Wrapped<VariableDeclaration, LocalInitializer>((w) => w.variable,
- (u) => LocalInitializer(u), variableDeclarationSerializer);
-
-TextSerializer<RedirectingInitializer> redirectingInitializerSerializer =
- Wrapped<Tuple2<CanonicalName, Arguments>, RedirectingInitializer>(
- (w) => Tuple2(w.targetReference.canonicalName!, w.arguments),
- (u) => RedirectingInitializer.byReference(u.first.reference, u.second),
- Tuple2Serializer(CanonicalNameSerializer(), argumentsSerializer));
-
-TextSerializer<SuperInitializer> superInitializerSerializer =
- Wrapped<Tuple2<CanonicalName, Arguments>, SuperInitializer>(
- (w) => Tuple2(w.targetReference.canonicalName!, w.arguments),
- (u) => SuperInitializer.byReference(u.first.reference, u.second),
- Tuple2Serializer(CanonicalNameSerializer(), argumentsSerializer));
-
-Case<Initializer> initializerSerializer =
- Case.uninitialized(InitializerTagger());
-
-TextSerializer<Supertype> supertypeSerializer =
- Wrapped<Tuple2<CanonicalName, List<DartType>>, Supertype>(
- (w) => Tuple2(w.className.canonicalName!, w.typeArguments),
- (u) => Supertype.byReference(u.first.reference, u.second),
- Tuple2Serializer(
- CanonicalNameSerializer(), ListSerializer(dartTypeSerializer)));
-
-const Map<int, String> classFlagToName = const {
- Class.FlagAbstract: "abstract",
- Class.FlagEnum: "enum",
- Class.FlagAnonymousMixin: "anonymous-mixin",
- Class.FlagEliminatedMixin: "eliminated-mixin",
- Class.FlagMixinDeclaration: "mixin-declaration",
- Class.FlagHasConstConstructor: "has-const-constructor",
- Class.FlagMacro: "macro",
-};
-
-class ClassFlagTagger implements Tagger<int> {
- const ClassFlagTagger();
-
- @override
- String tag(int flag) {
- return classFlagToName[flag] ??
- (throw StateError("Unknown Class flag value: ${flag}."));
- }
-}
-
-TextSerializer<int> classFlagsSerializer = Wrapped<List<int>, int>(
- (w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(ClassFlagTagger(), convertFlagsMap(classFlagToName))));
-
-TextSerializer<Class> classSerializer = Wrapped<
- Tuple4<
- String,
- int,
- Uri,
- Tuple2<
- List<TypeParameter>,
- /* Comment added to guide formatting. */
- Tuple4<Supertype?, Supertype?, List<Supertype>, List<Member>>>>,
- Class>(
- (w) => Tuple4(
- w.name,
- w.flags,
- w.fileUri,
- Tuple2(
- w.typeParameters,
- Tuple4(w.supertype, w.mixedInType, w.implementedTypes,
- <Member>[...w.fields, ...w.constructors, ...w.procedures]))),
- (u) => Class(
- name: u.first,
- typeParameters: u.fourth.first,
- supertype: u.fourth.second.first,
- mixedInType: u.fourth.second.second,
- implementedTypes: u.fourth.second.third,
- fields: u.fourth.second.fourth
- .where((m) => m is Field)
- .cast<Field>()
- .toList(),
- constructors: u.fourth.second.fourth
- .where((m) => m is Constructor)
- .cast<Constructor>()
- .toList(),
- procedures: u.fourth.second.fourth
- .where((m) => m is Procedure)
- .cast<Procedure>()
- .toList(),
- fileUri: u.third)
- ..flags = u.second,
- Tuple4Serializer(
- DartString(),
- classFlagsSerializer,
- UriSerializer(),
- Bind(
- typeParametersSerializer,
- Tuple4Serializer(
- Optional(supertypeSerializer),
- Optional(supertypeSerializer),
- ListSerializer(supertypeSerializer),
- ListSerializer(memberSerializer)))));
-
-TextSerializer<Typedef> typedefSerializer = Wrapped<
- Tuple3<String, Tuple2<List<TypeParameter>, DartType>, Uri>, Typedef>(
- (w) => Tuple3(w.name, Tuple2(w.typeParameters, w.type!), w.fileUri),
- (u) => Typedef(u.first, u.second.second,
- typeParameters: u.second.first, fileUri: u.third),
- Tuple3Serializer(DartString(),
- Bind(typeParametersSerializer, dartTypeSerializer), UriSerializer()));
-
-const Map<int, String> extensionMemberDescriptorFlagToName = const {
- ExtensionMemberDescriptor.FlagStatic: "static",
-};
-
-class ExtensionMemberDescriptorFlagTagger implements Tagger<int> {
- const ExtensionMemberDescriptorFlagTagger();
-
- @override
- String tag(int flag) {
- return extensionMemberDescriptorFlagToName[flag] ??
- (throw StateError(
- "Unknown ExtensionMemberDescriptor flag value: ${flag}."));
- }
-}
-
-TextSerializer<int> extensionMemberDescriptorFlagsSerializer =
- Wrapped<List<int>, int>(
- (w) => List.generate(30, (i) => w & (1 << i))
- .where((f) => f != 0)
- .toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(ExtensionMemberDescriptorFlagTagger(),
- convertFlagsMap(extensionMemberDescriptorFlagToName))));
-
-const Map<ExtensionMemberKind, String> extensionMemberKindToName = const {
- ExtensionMemberKind.Field: "field",
- ExtensionMemberKind.Method: "method",
- ExtensionMemberKind.Getter: "getter",
- ExtensionMemberKind.Setter: "setter",
- ExtensionMemberKind.Operator: "operator",
- ExtensionMemberKind.TearOff: "tearOff",
-};
-
-class ExtensionMemberKindTagger implements Tagger<ExtensionMemberKind> {
- const ExtensionMemberKindTagger();
-
- @override
- String tag(ExtensionMemberKind kind) {
- return extensionMemberKindToName[kind] ??
- (throw StateError("Unknown ExtensionMemberKind flag value: ${kind}."));
- }
-}
-
-TextSerializer<ExtensionMemberKind> extensionMemberKindSerializer = Case(
- ExtensionMemberKindTagger(), convertFlagsMap(extensionMemberKindToName));
-
-TextSerializer<ExtensionMemberDescriptor> extensionMemberDescriptorSerializer =
- Wrapped<Tuple4<Name, ExtensionMemberKind, int, CanonicalName>,
- ExtensionMemberDescriptor>(
- (w) => Tuple4(w.name, w.kind, w.flags, w.member.canonicalName!),
- (u) => ExtensionMemberDescriptor(
- name: u.first, kind: u.second, member: u.fourth.reference)
- ..flags = u.third,
- Tuple4Serializer(
- nameSerializer,
- extensionMemberKindSerializer,
- extensionMemberDescriptorFlagsSerializer,
- CanonicalNameSerializer()));
-
-TextSerializer<Extension> extensionSerializer = Wrapped<
- Tuple4<String, Tuple2<List<TypeParameter>, DartType>,
- List<ExtensionMemberDescriptor>, Uri>,
- Extension>(
- (w) => Tuple4(
- w.name, Tuple2(w.typeParameters, w.onType), w.members, w.fileUri),
- (u) => Extension(
- name: u.first,
- typeParameters: u.second.first,
- onType: u.second.second,
- members: u.third,
- fileUri: u.fourth),
- Tuple4Serializer(
- DartString(),
- Bind(typeParametersSerializer, dartTypeSerializer),
- ListSerializer(extensionMemberDescriptorSerializer),
- UriSerializer()));
-
-void initializeSerializers() {
- expressionSerializer.registerTags({
- "string": stringLiteralSerializer,
- "int": intLiteralSerializer,
- "double": doubleLiteralSerializer,
- "bool": boolLiteralSerializer,
- "null": nullLiteralSerializer,
- "invalid": invalidExpressionSerializer,
- "not": notSerializer,
- "&&": logicalAndSerializer,
- "||": logicalOrSerializer,
- "concat": stringConcatenationSerializer,
- "symbol": symbolLiteralSerializer,
- "this": thisExpressionSerializer,
- "rethrow": rethrowSerializer,
- "throw": throwSerializer,
- "await": awaitExpressionSerializer,
- "cond": conditionalExpressionSerializer,
- "is": isExpressionSerializer,
- "as": asExpressionSerializer,
- "type": typeLiteralSerializer,
- "list": listLiteralSerializer,
- "const-list": constListLiteralSerializer,
- "set": setLiteralSerializer,
- "const-set": constSetLiteralSerializer,
- "map": mapLiteralSerializer,
- "const-map": constMapLiteralSerializer,
- "let": letSerializer,
- "get-instance": instanceGetSerializer,
- "set-instance": instanceSetSerializer,
- "get-dynamic": dynamicGetSerializer,
- "set-dynamic": dynamicSetSerializer,
- "tearoff-instance": instanceTearOffSerializer,
- "tearoff-function": functionTearOffSerializer,
- "get-super": superPropertyGetSerializer,
- "set-super": superPropertySetSerializer,
- "invoke-instance": instanceInvocationSerializer,
- "invoke-instance-getter": instanceGetterInvocationSerializer,
- "invoke-dynamic": dynamicInvocationSerializer,
- "invoke-function": functionInvocationSerializer,
- "invoke-local-function": localFunctionInvocationSerializer,
- "equals-null": equalsNullSerializer,
- "equals-call": equalsCallSerializer,
- "invoke-super": superMethodInvocationSerializer,
- "get-var": variableGetSerializer,
- "set-var": variableSetSerializer,
- "get-static": staticGetSerializer,
- "set-static": staticSetSerializer,
- "tearoff-static": staticTearOffSerializer,
- "tearoff-constructor": constructorTearOffSerializer,
- "tearoff-redirecting-factory": redirectingFactoryTearOffSerializer,
- "tearoff-typedef": typedefTearOffSerializer,
- "invoke-static": staticInvocationSerializer,
- "invoke-const-static": constStaticInvocationSerializer,
- "invoke-constructor": constructorInvocationSerializer,
- "invoke-const-constructor": constConstructorInvocationSerializer,
- "fun": functionExpressionSerializer,
- "lists": listConcatenationSerializer,
- "sets": setConcatenationSerializer,
- "maps": mapConcatenationSerializer,
- "let-block": blockExpressionSerializer,
- "apply": instantiationSerializer,
- "not-null": nullCheckSerializer,
- "with-uri": fileUriExpressionSerializer,
- "is-loaded": checkLibraryIsLoadedSerializer,
- "load": loadLibrarySerializer,
- "const": constantExpressionSerializer,
- "object": instanceCreationSerializer,
- });
- dartTypeSerializer.registerTags({
- "invalid": invalidTypeSerializer,
- "dynamic": dynamicTypeSerializer,
- "void": voidTypeSerializer,
- "->": functionTypeSerializer,
- "par": typeParameterTypeSerializer,
- "interface": interfaceTypeSerializer,
- "never": neverTypeSerializer,
- "typedef": typedefTypeSerializer,
- "futureor": futureOrTypeSerializer,
- "null-type": nullTypeSerializer,
- });
- statementSerializer.registerTags({
- "expr": expressionStatementSerializer,
- "ret": returnStatementSerializer,
- "ret-void": returnVoidStatementSerializer,
- "yield": yieldStatementSerializer,
- "block": blockSerializer,
- "local": variableDeclarationSerializer,
- "if": ifStatementSerializer,
- "if-else": ifElseStatementSerializer,
- "skip": emptyStatementSerializer,
- "while": whileStatementSerializer,
- "do-while": doStatementSerializer,
- "for": forStatementSerializer,
- "for-in": forInStatementSerializer,
- "await-for-in": awaitForInStatementSerializer,
- "assert": assertStatementSerializer,
- "assert-block": assertBlockSerializer,
- "label": labeledStatementSerializer,
- "break": breakSerializer,
- "try-finally": tryFinallySerializer,
- "try-catch": tryCatchSerializer,
- "switch": switchStatementSerializer,
- "continue": continueSwitchStatementSerializer,
- "local-fun": functionDeclarationSerializer,
- });
- memberSerializer.registerTags({
- "mutable-field": mutableFieldSerializer,
- "immutable-field": immutableFieldSerializer,
- "method": methodSerializer,
- "getter": getterSerializer,
- "setter": setterSerializer,
- "operator": operatorSerializer,
- "factory": factorySerializer,
- "constructor": constructorSerializer,
- "redirecting-factory-constructor": redirectingFactoryConstructorSerializer,
- });
- constantSerializer.registerTags({
- "const-bool": boolConstantSerializer,
- "const-double": doubleConstantSerializer,
- "const-int": intConstantSerializer,
- "const-list": listConstantSerializer,
- "const-map": mapConstantSerializer,
- "const-null": nullConstantSerializer,
- "const-apply": instantiationConstantSerializer,
- "const-set": setConstantSerializer,
- "const-string": stringConstantSerializer,
- "const-symbol": symbolConstantSerializer,
- "const-tearoff-static": staticTearOffConstantSerializer,
- "const-tearoff-constructor": constructorTearOffConstantSerializer,
- "const-tearoff-redirecting-factory":
- redirectingFactoryTearOffConstantSerializer,
- "const-tearoff-typedef": typedefTearOffConstantSerializer,
- "const-type": typeLiteralConstantSerializer,
- "const-expr": unevaluatedConstantSerializer,
- "const-object": instanceConstantSerializer,
- });
- initializerSerializer.registerTags({
- "assert": assertInitializerSerializer,
- "field": fieldInitializerSerializer,
- "invalid": invalidInitializerSerializer,
- "local": localInitializerSerializer,
- "redirecting": redirectingInitializerSerializer,
- "super": superInitializerSerializer,
- });
-}
-
-Map<String, Wrapped<void, T>> convertFlagsMap<T>(Map<T, String> map) {
- return map.entries.toMap(
- key: (e) => e.value,
- value: (e) => Wrapped<void, T>((_) => null, (_) => e.key, Nothing()));
-}
-
-extension MapFromIterable<E> on Iterable<E> {
- Map<K, V> toMap<K, V>(
- {required K Function(E) key, required V Function(E) value}) {
- return {for (E e in this) key(e): value(e)};
- }
-}
diff --git a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
deleted file mode 100644
index 4261086..0000000
--- a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
+++ /dev/null
@@ -1,628 +0,0 @@
-// 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.
-
-library kernel.text_serializer_from_kernel_nodes_test;
-
-import 'package:kernel/ast.dart';
-import 'package:kernel/text/serializer_combinators.dart';
-import 'package:kernel/text/text_reader.dart';
-import 'package:kernel/text/text_serializer.dart';
-
-void main() {
- initializeSerializers();
- test();
-}
-
-class TestCase<T extends Node> {
- final String name;
- final T node;
- final SerializationState Function() makeSerializationState;
- final DeserializationState Function() makeDeserializationState;
- final String expectation;
- final TextSerializer<T> serializer;
-
- TestCase(
- {required this.name,
- required this.node,
- required this.expectation,
- required this.serializer,
- SerializationState Function()? makeSerializationState,
- DeserializationState Function()? makeDeserializationState})
- // ignore: unnecessary_null_comparison
- : assert(node != null),
- // ignore: unnecessary_null_comparison
- assert(expectation != null),
- // ignore: unnecessary_null_comparison
- assert(serializer != null),
- this.makeSerializationState = makeSerializationState ??
- (() => new SerializationState(new SerializationEnvironment(null))),
- this.makeDeserializationState = makeDeserializationState ??
- (() => new DeserializationState(
- new DeserializationEnvironment(null),
- new CanonicalName.root()));
-
- T readNode(String input, DeserializationState state) {
- TextIterator stream = new TextIterator(input, 0);
- stream.moveNext();
- T result = serializer.readFrom(stream, state);
- if (stream.moveNext()) {
- throw new StateError("Found extra tokens at the end.");
- }
- return result;
- }
-
- String writeNode(T node, SerializationState state) {
- StringBuffer buffer = new StringBuffer();
- serializer.writeTo(buffer, node, state);
- return buffer.toString();
- }
-}
-
-void test() {
- List<String> failures = [];
- List<TestCase> tests = <TestCase>[
- new TestCase<Statement>(
- name: 'let dynamic x = 42 in x;',
- node: () {
- VariableDeclaration x = new VariableDeclaration('x',
- type: const DynamicType(), initializer: new IntLiteral(42));
- return new ExpressionStatement(new Let(x, new VariableGet(x)));
- }(),
- expectation: ''
- '(expr (let "x^0" () (dynamic) (int 42) ()'
- ' (get-var "x^0" _)))',
- serializer: statementSerializer),
- new TestCase<Statement>(
- name: 'let dynamic x = 42 in let Null x^0 = null in x;',
- node: () {
- VariableDeclaration outerLetVar = new VariableDeclaration('x',
- type: const DynamicType(), initializer: new IntLiteral(42));
- VariableDeclaration innerLetVar = new VariableDeclaration('x',
- type: const NullType(), initializer: new NullLiteral());
- return new ExpressionStatement(new Let(
- outerLetVar, new Let(innerLetVar, new VariableGet(outerLetVar))));
- }(),
- expectation: ''
- '(expr (let "x^0" () (dynamic) (int 42) ()'
- ' (let "x^1" () (null-type) (null) ()'
- ' (get-var "x^0" _))))',
- serializer: statementSerializer),
- new TestCase<Statement>(
- name: 'let dynamic x = 42 in let Null x^0 = null in x^0;',
- node: () {
- VariableDeclaration outerLetVar = new VariableDeclaration('x',
- type: const DynamicType(), initializer: new IntLiteral(42));
- VariableDeclaration innerLetVar = new VariableDeclaration('x',
- type: const NullType(), initializer: new NullLiteral());
- return new ExpressionStatement(new Let(
- outerLetVar, new Let(innerLetVar, new VariableGet(innerLetVar))));
- }(),
- expectation: ''
- '(expr (let "x^0" () (dynamic) (int 42) ()'
- ' (let "x^1" () (null-type) (null) ()'
- ' (get-var "x^1" _))))',
- serializer: statementSerializer),
- () {
- VariableDeclaration x =
- new VariableDeclaration('x', type: const DynamicType());
- return new TestCase<Statement>(
- name: '/* suppose: dynamic x; */ x = 42;',
- node: new ExpressionStatement(new VariableSet(x, new IntLiteral(42))),
- expectation: '(expr (set-var "x^0" (int 42)))',
- makeSerializationState: () => new SerializationState(
- new SerializationEnvironment(null)
- ..addBinder(x, nameClue: x.name)
- ..extend(),
- ),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null)
- ..addBinder(x, "x^0")
- ..extend(),
- new CanonicalName.root()),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Field field = new Field.immutable(new Name('field'),
- type: const DynamicType(), fileUri: uri);
- Library library = new Library(uri, fileUri: uri, fields: <Field>[field]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
- return new TestCase<Statement>(
- name: '/* suppose top-level: dynamic field; */ field;',
- node: new ExpressionStatement(new StaticGet(field)),
- expectation: ''
- '(expr (get-static "package:foo/bar.dart::@getters::field"))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Field field = new Field.mutable(new Name('field'),
- type: const DynamicType(), fileUri: uri);
- Library library = new Library(uri, fileUri: uri, fields: <Field>[field]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
- return new TestCase<Statement>(
- name: '/* suppose top-level: dynamic field; */ field;',
- node: new ExpressionStatement(new StaticGet(field)),
- expectation: ''
- '(expr (get-static "package:foo/bar.dart::@getters::field"))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Field field = new Field.mutable(new Name('field'),
- type: const DynamicType(), fileUri: uri);
- Library library = new Library(uri, fileUri: uri, fields: <Field>[field]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
- return new TestCase<Statement>(
- name: '/* suppose top-level: dynamic field; */ field = 1;',
- node:
- new ExpressionStatement(new StaticSet(field, new IntLiteral(1))),
- expectation: ''
- '(expr'
- ' (set-static "package:foo/bar.dart::@setters::field" (int 1)))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Procedure topLevelProcedure = new Procedure(
- new Name('foo'),
- ProcedureKind.Method,
- new FunctionNode(null, positionalParameters: <VariableDeclaration>[
- new VariableDeclaration('x', type: const DynamicType())
- ]),
- isStatic: true,
- fileUri: uri);
- Library library = new Library(uri,
- fileUri: uri, procedures: <Procedure>[topLevelProcedure]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
- return new TestCase<Statement>(
- name: '/* suppose top-level: foo(dynamic x) {...}; */ foo(42);',
- node: new ExpressionStatement(new StaticInvocation.byReference(
- topLevelProcedure.reference,
- new Arguments(<Expression>[new IntLiteral(42)]),
- isConst: false)),
- expectation: ''
- '(expr (invoke-static "package:foo/bar.dart::@methods::foo"'
- ' () ((int 42)) ()))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Procedure factoryConstructor = new Procedure(
- new Name('foo'), ProcedureKind.Factory, new FunctionNode(null),
- isStatic: true, isConst: true, fileUri: uri);
- Class klass = new Class(
- name: 'A', procedures: <Procedure>[factoryConstructor], fileUri: uri);
- Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
- return new TestCase<Statement>(
- name: ''
- '/* suppose A { const A(); const factory A.foo() = A; } */'
- ' const A.foo();',
- node: new ExpressionStatement(new StaticInvocation.byReference(
- factoryConstructor.reference, new Arguments([]), isConst: true)),
- expectation: ''
- '(expr (invoke-const-static'
- ' "package:foo/bar.dart::A::@factories::foo"'
- ' () () ()))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Field field = new Field.immutable(new Name('field'),
- type: const DynamicType(), fileUri: uri);
- Class klass = new Class(name: 'A', fields: <Field>[field], fileUri: uri);
- Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
-
- VariableDeclaration x =
- new VariableDeclaration('x', type: const DynamicType());
- return new TestCase<Statement>(
- name: '/* suppose A {dynamic field;} A x; */ x.{A::field};',
- node: new ExpressionStatement(new InstanceGet.byReference(
- InstanceAccessKind.Instance, new VariableGet(x), field.name,
- interfaceTargetReference: field.getterReference,
- resultType: field.getterType)),
- expectation: ''
- '(expr (get-instance (instance) (get-var "x^0" _) '
- '(public "field") "package:foo/bar.dart::A::@getters::field" '
- '(dynamic)))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)
- ..addBinder(x, nameClue: 'x')
- ..extend()),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null)
- ..addBinder(x, "x^0")
- ..extend(),
- component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Field field = new Field.mutable(new Name('field'),
- type: const DynamicType(), fileUri: uri);
- Class klass = new Class(name: 'A', fields: <Field>[field], fileUri: uri);
- Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
-
- VariableDeclaration x =
- new VariableDeclaration('x', type: const DynamicType());
- return new TestCase<Statement>(
- name: '/* suppose A {dynamic field;} A x; */ x.{A::field};',
- node: new ExpressionStatement(new InstanceGet.byReference(
- InstanceAccessKind.Instance, new VariableGet(x), field.name,
- interfaceTargetReference: field.getterReference,
- resultType: field.getterType)),
- expectation: ''
- '(expr (get-instance (instance) (get-var "x^0" _) '
- '(public "field") "package:foo/bar.dart::A::@getters::field" '
- '(dynamic)))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)
- ..addBinder(x, nameClue: 'x')
- ..extend()),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null)
- ..addBinder(x, "x^0")
- ..extend(),
- component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Field field = new Field.mutable(new Name('field'),
- type: const DynamicType(), fileUri: uri);
- Class klass = new Class(name: 'A', fields: <Field>[field], fileUri: uri);
- Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
-
- VariableDeclaration x =
- new VariableDeclaration('x', type: const DynamicType());
- return new TestCase<Statement>(
- name: '/* suppose A {dynamic field;} A x; */ x.{A::field} = 42;',
- node: new ExpressionStatement(InstanceSet.byReference(
- InstanceAccessKind.Instance,
- new VariableGet(x),
- field.name,
- new IntLiteral(42),
- interfaceTargetReference: field.setterReference!)),
- expectation: ''
- '(expr (set-instance (instance) (get-var "x^0" _) '
- '(public "field") (int 42) '
- '"package:foo/bar.dart::A::@setters::field"))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)
- ..addBinder(x, nameClue: 'x')
- ..extend()),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null)
- ..addBinder(x, "x^0")
- ..extend(),
- component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Procedure method = new Procedure(
- new Name('foo'), ProcedureKind.Method, new FunctionNode(null),
- isStatic: true, isConst: true, fileUri: uri);
- Class klass =
- new Class(name: 'A', procedures: <Procedure>[method], fileUri: uri);
- Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
-
- VariableDeclaration x =
- new VariableDeclaration('x', type: const DynamicType());
- return new TestCase<Statement>(
- name: '/* suppose A {foo() {...}} A x; */ x.{A::foo}();',
- node: new ExpressionStatement(new InstanceInvocation.byReference(
- InstanceAccessKind.Instance,
- new VariableGet(x),
- method.name,
- new Arguments([]),
- interfaceTargetReference: method.reference,
- functionType: method.getterType as FunctionType)),
- expectation: ''
- '(expr (invoke-instance (instance) (get-var "x^0" _) '
- '(public "foo") () () () '
- '"package:foo/bar.dart::A::@methods::foo" '
- '(-> () () () () () () (dynamic))))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)
- ..addBinder(x, nameClue: 'x')
- ..extend()),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null)
- ..addBinder(x, "x^0")
- ..extend(),
- component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Constructor constructor = new Constructor(new FunctionNode(null),
- name: new Name('foo'), fileUri: uri);
- Class klass = new Class(
- name: 'A', constructors: <Constructor>[constructor], fileUri: uri);
- Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
- return new TestCase<Statement>(
- name: '/* suppose A {A.foo();} */ new A();',
- node: new ExpressionStatement(new ConstructorInvocation.byReference(
- constructor.reference, new Arguments([]))),
- expectation: ''
- '(expr (invoke-constructor'
- ' "package:foo/bar.dart::A::@constructors::foo"'
- ' () () ()))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), component.root),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
- Constructor constructor = new Constructor(new FunctionNode(null),
- name: new Name('foo'), isConst: true, fileUri: uri);
- Class klass = new Class(
- name: 'A', constructors: <Constructor>[constructor], fileUri: uri);
- Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
- Component component = new Component(libraries: <Library>[library]);
- component.computeCanonicalNames();
- return new TestCase<Statement>(
- name: '/* suppose A {const A.foo();} */ const A();',
- node: new ExpressionStatement(new ConstructorInvocation.byReference(
- constructor.reference, new Arguments([]), isConst: true)),
- expectation: ''
- '(expr (invoke-const-constructor'
- ' "package:foo/bar.dart::A::@constructors::foo"'
- ' () () ()))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), component.root),
- serializer: statementSerializer);
- }(),
- () {
- TypeParameter outerParam =
- new TypeParameter('T', const DynamicType(), const DynamicType());
- TypeParameter innerParam =
- new TypeParameter('T', const DynamicType(), const DynamicType());
- return new TestCase<Statement>(
- name: '/* T Function<T>(T Function<T>()); */',
- node: new ExpressionStatement(new TypeLiteral(new FunctionType(
- [
- new FunctionType(
- [],
- new TypeParameterType(innerParam, Nullability.legacy),
- Nullability.legacy,
- typeParameters: [innerParam])
- ],
- new TypeParameterType(outerParam, Nullability.legacy),
- Nullability.legacy,
- typeParameters: [outerParam]))),
- expectation: ''
- '(expr (type (-> ("T^0") ((dynamic)) ((dynamic)) '
- '((-> ("T^1") ((dynamic)) ((dynamic)) () () () '
- '(par "T^1" _))) () () (par "T^0" _))))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), new CanonicalName.root()),
- serializer: statementSerializer);
- }(),
- () {
- TypeParameter t =
- new TypeParameter('T', const DynamicType(), const DynamicType());
- VariableDeclaration t1 = new VariableDeclaration('t1',
- type: new TypeParameterType(t, Nullability.legacy));
- VariableDeclaration t2 = new VariableDeclaration('t2',
- type: new TypeParameterType(t, Nullability.legacy));
- return new TestCase<Statement>(
- name: '/* <T>(T t1, [T t2]) => t1; */',
- node: new ExpressionStatement(new FunctionExpression(new FunctionNode(
- new ReturnStatement(new VariableGet(t1)),
- typeParameters: [t],
- positionalParameters: [t1, t2],
- requiredParameterCount: 1,
- namedParameters: [],
- returnType: new TypeParameterType(t, Nullability.legacy),
- asyncMarker: AsyncMarker.Sync))),
- expectation: ''
- '(expr (fun (sync) ("T^0") ((dynamic)) ((dynamic)) ("t1^1" '
- '() (par "T^0" _) _ ()) ("t2^2" () (par "T^0" _) '
- '_ ()) () (par "T^0" _) _ (ret (get-var "t1^1" _))))',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), new CanonicalName.root()),
- serializer: statementSerializer);
- }(),
- () {
- Uri uri = Uri(scheme: 'package', path: 'foo/bar.dart');
- VariableDeclaration x = VariableDeclaration('x', type: DynamicType());
- Procedure foo = Procedure(
- Name('foo'),
- ProcedureKind.Method,
- FunctionNode(ReturnStatement(VariableGet(x)),
- positionalParameters: [x]),
- isStatic: true,
- fileUri: uri);
- Library library = Library(uri, fileUri: uri, procedures: [foo]);
- Component component = Component(libraries: [library]);
- component.computeCanonicalNames();
- return new TestCase<Member>(
- name: 'foo(x) => x;',
- node: foo,
- expectation: ''
- '(method (public "foo") ((static))'
- ' (sync) () () () ("x^0" () (dynamic) _ ()) () ()'
- ' (dynamic) _ (ret (get-var "x^0" _))'
- ' "package:foo/bar.dart")',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), component.root),
- serializer: memberSerializer);
- }(),
- () {
- Uri uri = Uri(scheme: 'package', path: 'foo/bar.dart');
- VariableDeclaration x1 = VariableDeclaration('x', type: DynamicType());
- VariableDeclaration x2 = VariableDeclaration('x', type: DynamicType());
- Procedure foo = Procedure(
- Name('foo'),
- ProcedureKind.Method,
- FunctionNode(ReturnStatement(VariableGet(x1)),
- positionalParameters: [x1]),
- isStatic: true,
- fileUri: uri);
- Procedure bar = Procedure(
- Name('bar'),
- ProcedureKind.Method,
- FunctionNode(
- ReturnStatement(
- StaticInvocation(foo, Arguments([VariableGet(x2)]))),
- positionalParameters: [x2]),
- isStatic: true,
- fileUri: uri);
- Library library = Library(uri, fileUri: uri, procedures: [foo, bar]);
- Component component = Component(libraries: [library]);
- component.computeCanonicalNames();
- return new TestCase<Library>(
- name: 'foo(x) => x; bar(x) => foo(x);',
- node: library,
- expectation: ''
- '"package:foo/bar.dart" () ()'
- ''
- ' ((method (public "foo") ((static))'
- ' (sync) () () () ("x^0" () (dynamic) _ ()) () () (dynamic)'
- ' _ (ret (get-var "x^0" _))'
- ' "package:foo/bar.dart")'
- ''
- ' (method (public "bar") ((static))'
- ' (sync) () () () ("x^0" () (dynamic) _ ()) () () (dynamic)'
- ' _ (ret'
- ' (invoke-static "package:foo/bar.dart::@methods::foo"'
- ' () ((get-var "x^0" _)) ()))'
- ' "package:foo/bar.dart"))'
- ''
- ' ()'
- ''
- ' ()'
- ''
- ' ()'
- ''
- ' "package:foo/bar.dart"',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), new CanonicalName.root()),
- serializer: librarySerializer);
- }(),
- () {
- Uri uri = Uri(scheme: "package", path: "foo/bar.dart");
- Class a = Class(name: "A", fileUri: uri);
- Procedure foo = Procedure(
- Name("foo"),
- ProcedureKind.Method,
- FunctionNode(ReturnStatement(NullLiteral()),
- returnType: InterfaceType(a, Nullability.legacy)),
- isStatic: true,
- fileUri: uri);
- Library library =
- Library(uri, fileUri: uri, classes: [a], procedures: [foo]);
- Component component = Component(libraries: [library]);
- component.computeCanonicalNames();
- return new TestCase<Library>(
- name: 'class A{} A foo() => null;',
- node: library,
- expectation: ''
- '"package:foo/bar.dart" () ()'
- ''
- ' ((method (public "foo") ((static))'
- ' (sync) () () () () () () (interface "package:foo/bar.dart::A" ())'
- ' _ (ret (null))'
- ' "package:foo/bar.dart"))'
- ''
- ' ("A" () "package:foo/bar.dart" () () () _ _ () ())'
- ''
- ' ()'
- ''
- ' ()'
- ''
- ' "package:foo/bar.dart"',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), component.root),
- serializer: librarySerializer);
- }(),
- () {
- return new TestCase<Statement>(
- name: 'dynamic x;',
- node: VariableDeclaration('x', type: const DynamicType()),
- expectation: '(local "x^0" () (dynamic) _ ())',
- makeSerializationState: () =>
- new SerializationState(new SerializationEnvironment(null)),
- makeDeserializationState: () => new DeserializationState(
- new DeserializationEnvironment(null), new CanonicalName.root()),
- serializer: statementSerializer);
- }(),
- ];
- for (TestCase testCase in tests) {
- String roundTripInput =
- testCase.writeNode(testCase.node, testCase.makeSerializationState());
- if (roundTripInput != testCase.expectation) {
- failures.add(''
- "* initial serialization for test '${testCase.name}'"
- " gave output:\n ${roundTripInput}\n"
- " but expected:\n ${testCase.expectation}");
- }
-
- Node deserialized =
- testCase.readNode(roundTripInput, testCase.makeDeserializationState());
- String roundTripOutput =
- testCase.writeNode(deserialized, testCase.makeSerializationState());
- if (roundTripOutput != roundTripInput) {
- failures.add(''
- "* input '${testCase.name}' gave output '${roundTripOutput}'");
- }
- }
- if (failures.isNotEmpty) {
- print('Round trip failures:');
- failures.forEach(print);
- throw StateError('Round trip failures');
- }
-}
diff --git a/pkg/kernel/test/text_serializer_test.dart b/pkg/kernel/test/text_serializer_test.dart
deleted file mode 100644
index a08ce79..0000000
--- a/pkg/kernel/test/text_serializer_test.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// 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.
-
-library kernel.text_serializer_test;
-
-import 'package:kernel/ast.dart';
-import 'package:kernel/text/serializer_combinators.dart';
-import 'package:kernel/text/text_reader.dart';
-import 'package:kernel/text/text_serializer.dart';
-
-void main() {
- initializeSerializers();
- TestRunner testRunner = new TestRunner();
- testRunner.run();
- if (testRunner.failures.isNotEmpty) {
- print('Round trip failures:');
- testRunner.failures.forEach(print);
- throw StateError('Round trip failures');
- }
-}
-
-// Wrappers for testing.
-Expression readExpression(String input) {
- TextIterator stream = new TextIterator(input, 0);
- stream.moveNext();
- Expression result = expressionSerializer.readFrom(
- stream,
- new DeserializationState(
- new DeserializationEnvironment(null), new CanonicalName.root()));
- if (stream.moveNext()) {
- throw StateError("extra cruft in basic literal");
- }
- return result;
-}
-
-String writeExpression(Expression expression) {
- StringBuffer buffer = new StringBuffer();
- expressionSerializer.writeTo(buffer, expression,
- new SerializationState(new SerializationEnvironment(null)));
- return buffer.toString();
-}
-
-class TestRunner {
- final List<String> failures = [];
-
- void run() {
- test('(get-super (public "hashCode"))');
- test('(let "x^0" () (dynamic) (int 0) () (null))');
- test('(let "x^0" () (dynamic) _ () (null))');
- test('(let "x^0" ((const)) (dynamic) (int 0) () (null))');
- test('(let "x^0" ((const)) (dynamic) _ () (null))');
- test('(let "x^0" ((final)) (dynamic) (int 0) () (null))');
- test('(let "x^0" ((final)) (dynamic) _ () (null))');
- test(r'''(string "Hello, 'string'!")''');
- test(r'''(string "Hello, \"string\"!")''');
- test(r'''(string "Yeah nah yeah, here is\nthis really long string haiku\n'''
- r'''blowing in the wind\n")''');
- test('(int 42)');
- test('(int 0)');
- test('(int -1001)');
- test('(double 3.14159)');
- test('(bool true)');
- test('(bool false)');
- test('(null)');
- test(r'''(invalid "You can't touch this" (null))''');
- test('(not (bool true))');
- test('(&& (bool true) (bool false))');
- test('(|| (&& (bool true) (not (bool true))) (bool true))');
- test('(concat ((string "The opposite of ") (int 3) '
- '(string " is ") (int 7)))');
- test('(symbol "unquote-splicing")');
- test('(this)');
- test('(rethrow)');
- test('(throw (string "error"))');
- test('(await (null))');
- test('(cond (bool true) (dynamic) (int 0) (int 1))');
- test('(is (bool true) (invalid))');
- test('(as (bool true) (void))');
- test('(type (null-type))');
- test('(list (dynamic) ((null) (null) (null)))');
- test('(const-list (dynamic) ((int 0) (int 1) (int 2)))');
- test('(set (dynamic) ((bool true) (bool false) (int 0)))');
- test('(const-set (dynamic) ((int 0) (int 1) (int 2)))');
- test('(map (dynamic) (void)'
- ' ((int 0) (null) (int 1) (null) (int 2) (null)))');
- test('(const-map (dynamic) (void) ((int 0) (null) (int 1) (null) '
- '(int 2) (null)))');
- test('(type (-> () () () ((dynamic)) () () (dynamic)))');
- test('(type (-> () () () () ((dynamic)) () (dynamic)))');
- test('(type (-> () () () ((dynamic) (dynamic)) () () (dynamic)))');
- test('(type (-> () () () () () () (dynamic)))');
- test('(type (-> () () () ((-> () () () ((dynamic)) () () (dynamic))) () () '
- '(dynamic)))');
- test('(type (-> ("T^0") ((dynamic)) ((dynamic)) () () () (dynamic)))');
- test('(type (-> ("T^0") ((dynamic)) ((dynamic)) ((par "T^0" _)) () () '
- '(par "T^0" _)))');
- test('(type (-> ("T^0" "S^1") ((par "S^1" _) (par "T^0" _)) ((dynamic) '
- '(dynamic)) () () () (dynamic)))');
- }
-
- void test(String input) {
- var kernelAst = readExpression(input);
- var output = writeExpression(kernelAst);
- if (output != input) {
- failures.add('* input "${input}" gave output "${output}"');
- }
- }
-}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index b7d1949..2fd2aac 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -56,7 +56,6 @@
front_end/test/fasta/bootstrap_test: Pass, Slow
front_end/test/fasta/rasta/*: SkipByDesign # Anything in rasta is input to fasta unit tests and shouldn't be run as tests.
front_end/test/fasta/sdk_test: SkipByDesign # sdk_test would take too long to complete, and should be run in a different way.
-front_end/test/fasta/text_serialization_test: Pass, ExtraSlow
front_end/test/fasta/types/dart2js_benchmark_test: Pass, Slow
front_end/test/fasta/types/large_app_benchmark_test: Pass, ExtraSlow
front_end/test/incremental_compiler_leak_test: Pass, ExtraSlow
@@ -148,7 +147,6 @@
[ $system == windows ]
front_end/test/fasta/bootstrap_test: Skip # Issue 31902
front_end/test/fasta/strong_test: Pass, Slow, Timeout
-front_end/test/fasta/text_serialization_test: Pass, Slow, Timeout
front_end/test/incremental_dart2js_load_from_dill_test: Pass, Slow
[ $browser ]
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index d20cf54..84694a6 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1739,13 +1739,6 @@
// how the vm_tag (kEmbedderTagId) can be set, these tags need to
// move to the OSThread structure.
set_user_tag(UserTags::kDefaultUserTag);
-
- if (group()->obfuscate()) {
- OS::PrintErr(
- "Warning: This VM has been configured to obfuscate symbol information "
- "which violates the Dart standard.\n"
- " See dartbug.com/30524 for more information.\n");
- }
}
#undef REUSABLE_HANDLE_SCOPE_INIT
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 47633fe..8814320 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -25878,12 +25878,6 @@
isolate_instructions_image.instructions_relocated_address();
auto const vm_relocated_address =
vm_instructions_image.instructions_relocated_address();
- // The Dart standard requires the output of StackTrace.toString to include
- // all pending activations with precise source locations (i.e., to expand
- // inlined frames and provide line and column numbers).
- buffer.Printf(
- "Warning: This VM has been configured to produce stack traces "
- "that violate the Dart standard.\n");
// This prologue imitates Android's debuggerd to make it possible to paste
// the stack trace into ndk-stack.
buffer.Printf(
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index f4da9ca..ca05fc6 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -109,7 +109,6 @@
CastStreamTransformer,
checkNotNullable,
EmptyIterator,
- isNullFuture,
IterableElementError,
nullFuture,
printToZone,
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 908e5e1..f83386d 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -223,6 +223,13 @@
/// it's very clearly documented.
@pragma("wasm:entry-point")
abstract class Future<T> {
+ /// A `Future<Null>` completed with `null`.
+ ///
+ /// Currently shared with `dart:internal`.
+ /// If that future can be removed, then change this back to
+ /// `_Future<Null>.zoneValue(null, _rootZone);`
+ static final _Future<Null> _nullFuture = nullFuture as _Future<Null>;
+
/// A `Future<bool>` completed with `false`.
static final _Future<bool> _falseFuture =
new _Future<bool>.zoneValue(false, _rootZone);
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index bb942d9..038c3bb 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -515,7 +515,7 @@
controller
..onCancel = () {
timer.cancel();
- return nullFuture;
+ return Future._nullFuture;
}
..onPause = () {
watch.stop();
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index 2d381c5..2baf008 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -588,10 +588,7 @@
Future<void> get done => _ensureDoneFuture();
Future<void> _ensureDoneFuture() =>
- _doneFuture ??
- (_isCanceled
- ? nullFuture as Future<void>
- : _doneFuture = _Future<void>());
+ _doneFuture ??= _isCanceled ? Future._nullFuture : _Future<void>();
/// Send or enqueue a data event.
void add(T value) {
@@ -922,7 +919,7 @@
var cancel = addSubscription.cancel();
if (cancel == null) {
addStreamFuture._asyncComplete(null);
- return nullFuture;
+ return Future._nullFuture;
}
return cancel.whenComplete(() {
addStreamFuture._asyncComplete(null);
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index 9065c46..b4fb5d8 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -197,7 +197,7 @@
if (!_isCanceled) {
_cancel();
}
- return _cancelFuture ?? nullFuture;
+ return _cancelFuture ?? Future._nullFuture;
}
Future<E> asFuture<E>([E? futureValue]) {
@@ -217,7 +217,7 @@
};
_onError = (Object error, StackTrace stackTrace) {
Future cancelFuture = cancel();
- if (!isNullFuture(Zone._current, cancelFuture)) {
+ if (!identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(() {
result._completeError(error, stackTrace);
});
@@ -297,7 +297,7 @@
// Hooks called when the input is paused, unpaused or canceled.
// These must not throw. If overwritten to call user code, include suitable
// try/catch wrapping and send any errors to
- // [Zone._current.handleUncaughtError].
+ // [_Zone.current.handleUncaughtError].
void _onPause() {
assert(_isInputPaused);
}
@@ -352,6 +352,7 @@
// future to finish we must not report the error.
if (_isCanceled && !_waitsForCancel) return;
_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);
@@ -365,7 +366,8 @@
_state |= _STATE_WAIT_FOR_CANCEL;
_cancel();
var cancelFuture = _cancelFuture;
- if (cancelFuture != null && !isNullFuture(Zone._current, cancelFuture)) {
+ if (cancelFuture != null &&
+ !identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(sendError);
} else {
sendError();
@@ -394,7 +396,7 @@
_cancel();
_state |= _STATE_WAIT_FOR_CANCEL;
var cancelFuture = _cancelFuture;
- if (cancelFuture != null && !isNullFuture(Zone._current, cancelFuture)) {
+ if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(sendDone);
} else {
sendDone();
@@ -670,7 +672,7 @@
}
}
- Future cancel() => nullFuture;
+ Future cancel() => Future._nullFuture;
Future<E> asFuture<E>([E? futureValue]) {
E resultValue;
@@ -817,7 +819,7 @@
Future cancel() {
_stream._cancelSubscription();
- return nullFuture;
+ return Future._nullFuture;
}
bool get isPaused {
@@ -961,7 +963,7 @@
}
return subscription.cancel();
}
- return nullFuture;
+ return Future._nullFuture;
}
void _onData(T data) {
diff --git a/sdk/lib/async/stream_pipe.dart b/sdk/lib/async/stream_pipe.dart
index 78ad675..cd707be 100644
--- a/sdk/lib/async/stream_pipe.dart
+++ b/sdk/lib/async/stream_pipe.dart
@@ -26,7 +26,7 @@
void _cancelAndError(StreamSubscription subscription, _Future future,
Object error, StackTrace stackTrace) {
var cancelFuture = subscription.cancel();
- if (cancelFuture != null && !isNullFuture(Zone._current, cancelFuture)) {
+ if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(() => future._completeError(error, stackTrace));
} else {
future._completeError(error, stackTrace);
@@ -55,7 +55,7 @@
before completing with a value. */
void _cancelAndValue(StreamSubscription subscription, _Future future, value) {
var cancelFuture = subscription.cancel();
- if (cancelFuture != null && !isNullFuture(Zone._current, cancelFuture)) {
+ if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(() => future._complete(value));
} else {
future._complete(value);
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 4bc1905..671f68a 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -37302,7 +37302,7 @@
}
Future cancel() {
- if (_canceled) return Future<void>.value(null);
+ if (_canceled) return nullFuture;
_unlisten();
// Clear out the target to indicate this is complete.
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index a763b12..ff3d890 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -136,7 +136,7 @@
return digit1 * 16 + digit2 - (digit2 & 256);
}
-/// A reusable `null`-valued future per zone used by `dart:async`.
+/// A reusable `null`-valued future used by `dart:async`.
///
/// **DO NOT USE.**
///
@@ -156,14 +156,7 @@
/// This future will be removed again if we can ever do so.
/// Do not use it for anything other than preserving timing
/// during the null safety migration.
-Future<Null> get nullFuture => _nullFutures[Zone.current] ??=
- Future<Null>.value(null);
-
-/// Whether [future] is the null future of the current zone.
-bool isNullFuture(Zone zone, Future future) =>
- identical(_nullFutures[zone], future);
-
-final Expando<Future<Null>> _nullFutures = Expando<Future<Null>>();
+final Future<Null> nullFuture = Zone.root.run(() => Future<Null>.value(null));
/// A default hash function used by the platform in various places.
///
diff --git a/tests/lib/async/null_future_zone_test.dart b/tests/lib/async/null_future_zone_test.dart
index 34201e7..9a266be 100644
--- a/tests/lib/async/null_future_zone_test.dart
+++ b/tests/lib/async/null_future_zone_test.dart
@@ -13,32 +13,21 @@
Expect.isFalse(await it.moveNext());
late Future nullFuture;
-
- bool nullFutureZoneUsed = false;
- runZoned(() {
- nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
- }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
- (Zone self, ZoneDelegate parent, Zone zone, void f()) {
- Expect.identical(zone, self);
- nullFutureZoneUsed = true;
- parent.scheduleMicrotask(zone, f);
- }));
-
- nullFuture.then((value) {
- Expect.isNull(value);
- Expect.isTrue(nullFutureZoneUsed);
- asyncEnd();
- });
-
late Future falseFuture;
runZoned(() {
+ nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
falseFuture = it.moveNext();
}, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
(Zone self, ZoneDelegate parent, Zone zone, void f()) {
Expect.fail("Should not be called");
}));
+ nullFuture.then((value) {
+ Expect.isNull(value);
+ asyncEnd();
+ });
+
falseFuture.then((value) {
Expect.isFalse(value);
asyncEnd();
diff --git a/tests/lib_2/async/null_future_zone_test.dart b/tests/lib_2/async/null_future_zone_test.dart
index 77cb1b7..3322916 100644
--- a/tests/lib_2/async/null_future_zone_test.dart
+++ b/tests/lib_2/async/null_future_zone_test.dart
@@ -15,32 +15,21 @@
Expect.isFalse(await it.moveNext());
Future nullFuture;
-
- bool nullFutureZoneUsed = false;
- runZoned(() {
- nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
- }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
- (Zone self, ZoneDelegate parent, Zone zone, void f()) {
- Expect.identical(zone, self);
- nullFutureZoneUsed = true;
- parent.scheduleMicrotask(zone, f);
- }));
-
- nullFuture.then((value) {
- Expect.isNull(value);
- Expect.isTrue(nullFutureZoneUsed);
- asyncEnd();
- });
-
Future falseFuture;
runZoned(() {
+ nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
falseFuture = it.moveNext();
}, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
(Zone self, ZoneDelegate parent, Zone zone, void f()) {
Expect.fail("Should not be called");
}));
+ nullFuture.then((value) {
+ Expect.isNull(value);
+ asyncEnd();
+ });
+
falseFuture.then((value) {
Expect.isFalse(value);
asyncEnd();
diff --git a/tools/VERSION b/tools/VERSION
index 05a2446..1e379b9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 18
PATCH 0
-PRERELEASE 212
+PRERELEASE 213
PRERELEASE_PATCH 0
\ No newline at end of file