From 1fccfb8be7746d80d80f3f9686d1b9efe25fa681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Tue, 14 Nov 2023 11:12:39 +0000 Subject: [PATCH 1/4] [dart2wasm] Fix JSCM convert patch TextDecoder use MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ib2de3df8495ab16c172a39627c8d79c1c442ef16 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336000 Reviewed-by: Aske Simon Christensen Commit-Queue: Ömer Ağacan --- .../wasm_js_compatibility/lib/convert_patch.dart | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/sdk/lib/_internal/wasm_js_compatibility/lib/convert_patch.dart b/sdk/lib/_internal/wasm_js_compatibility/lib/convert_patch.dart index cef1d72b9189..f4fd5876bec8 100644 --- a/sdk/lib/_internal/wasm_js_compatibility/lib/convert_patch.dart +++ b/sdk/lib/_internal/wasm_js_compatibility/lib/convert_patch.dart @@ -70,17 +70,12 @@ class Utf8Decoder { } if (0 == start && end == codeUnits.length) { - return _useTextDecoder(decoder, codeUnits.toExternRef); + return _useTextDecoder(decoder, codeUnits.toJSArrayExternRef()); } - final length = codeUnits.length; - end = RangeError.checkValidRange(start, end, length); + RangeError.checkValidRange(start, end, codeUnits.length); + final length = end - start; return _useTextDecoder( - decoder, - js.JS( - '(codeUnits, start, end) => codeUnits.subarray(start, end)', - codeUnits.toExternRef, - start.toDouble, - end.toDouble)); + decoder, codeUnits.toJSArrayExternRef(start, length)); } static String? _useTextDecoder( From 932ed2e364276e97f48acb6abfe9341be885ccc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Tue, 14 Nov 2023 11:42:23 +0000 Subject: [PATCH 2/4] [dart2wasm] Allocate TextDecoder once when decoding UTF-8 to JSStringImpl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improves a protobuf decoding benchmark from 348ms to 305ms. Change-Id: Ib47d4271981c16c196594e435c807fecb8fb02f5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336020 Reviewed-by: Aske Simon Christensen Commit-Queue: Ömer Ağacan --- pkg/dart2wasm/lib/js/runtime_generator.dart | 3 +- pkg/dart2wasm/lib/target.dart | 2 + .../lib/convert_patch.dart | 63 ++++++++----------- 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/pkg/dart2wasm/lib/js/runtime_generator.dart b/pkg/dart2wasm/lib/js/runtime_generator.dart index 343d3f67129c..d6708e288308 100644 --- a/pkg/dart2wasm/lib/js/runtime_generator.dart +++ b/pkg/dart2wasm/lib/js/runtime_generator.dart @@ -35,8 +35,9 @@ JSMethods _performJSInteropTransformations( additionalCoreLibraries: { '_js_helper', '_js_types', + 'convert', 'js_interop', - 'js_interop_unsafe' + 'js_interop_unsafe', }); for (Library library in interopDependentLibraries) { staticInteropClassEraser.visitLibrary(library); diff --git a/pkg/dart2wasm/lib/target.dart b/pkg/dart2wasm/lib/target.dart index ff4aec70d1ef..d845d0ff36ba 100644 --- a/pkg/dart2wasm/lib/target.dart +++ b/pkg/dart2wasm/lib/target.dart @@ -251,6 +251,8 @@ class WasmTarget extends Target { component, Uri.parse("dart:_js_annotations")), ...?jsInteropHelper.calculateTransitiveImportsOfJsInteropIfUsed( component, Uri.parse("dart:js_interop")), + ...?jsInteropHelper.calculateTransitiveImportsOfJsInteropIfUsed( + component, Uri.parse("dart:convert")), }; if (transitiveImportingJSInterop.isEmpty) { logger?.call("Skipped JS interop transformations"); diff --git a/sdk/lib/_internal/wasm_js_compatibility/lib/convert_patch.dart b/sdk/lib/_internal/wasm_js_compatibility/lib/convert_patch.dart index f4fd5876bec8..6147ae0fb25d 100644 --- a/sdk/lib/_internal/wasm_js_compatibility/lib/convert_patch.dart +++ b/sdk/lib/_internal/wasm_js_compatibility/lib/convert_patch.dart @@ -52,30 +52,19 @@ class Utf8Decoder { static String? _convertInterceptedUint8List( bool allowMalformed, JSUint8ArrayImpl codeUnits, int start, int end) { - // TODO(omersa): There's a bug somewhere when compiling lazy statics that - // return `WasmExternRef`? - // final WasmExternRef? decoder = allowMalformed ? _decoderNonfatal : _decoder; - // if (decoder == WasmExternRef.nullRef) { - // return null; - // } - final WasmExternRef? decoder; - try { - decoder = allowMalformed - ? js.JS( - '() => new TextDecoder("utf-8", {fatal: false})') - : js.JS( - '() => new TextDecoder("utf-8", {fatal: true})'); - } catch (e) { + final JSAny? decoder = allowMalformed ? _decoderNonFatal : _decoder; + if (decoder == null) { return null; } if (0 == start && end == codeUnits.length) { - return _useTextDecoder(decoder, codeUnits.toJSArrayExternRef()); + return _useTextDecoder( + externRefForJSAny(decoder), codeUnits.toJSArrayExternRef()); } RangeError.checkValidRange(start, end, codeUnits.length); final length = end - start; - return _useTextDecoder( - decoder, codeUnits.toJSArrayExternRef(start, length)); + return _useTextDecoder(externRefForJSAny(decoder), + codeUnits.toJSArrayExternRef(start, length)); } static String? _useTextDecoder( @@ -92,26 +81,28 @@ class Utf8Decoder { return null; } - // TODO(omersa): These values seem to be miscompiled at the use sites, see - // above. + // TextDecoder is not defined on some browsers and on the stand-alone d8 and + // jsshell engines. Use a lazy initializer to do feature detection once. // - // // TextDecoder is not defined on some browsers and on the stand-alone d8 and - // // jsshell engines. Use a lazy initializer to do feature detection once. - // static final WasmExternRef? _decoder = () { - // try { - // return js - // .JS('() => new TextDecoder("utf-8", {fatal: true})'); - // } catch (e) {} - // return null; - // }(); - - // static final WasmExternRef? _decoderNonfatal = () { - // try { - // return js - // .JS('() => new TextDecoder("utf-8", {fatal: false})'); - // } catch (e) {} - // return null; - // }(); + // Globls need to return boxed Dart values, so these return `JSAny?` instead + // of `WasmExternRef?`. + static final JSAny? _decoder = () { + try { + return js + .JS('() => new TextDecoder("utf-8", {fatal: true})') + .toJS; + } catch (e) {} + return null; + }(); + + static final JSAny? _decoderNonFatal = () { + try { + return js + .JS('() => new TextDecoder("utf-8", {fatal: false})') + .toJS; + } catch (e) {} + return null; + }(); } //// Implementation /////////////////////////////////////////////////////////// From a0bb10b6758d1917a7da5bc20c4b2d8d98841399 Mon Sep 17 00:00:00 2001 From: Jens Johansen Date: Tue, 14 Nov 2023 11:46:28 +0000 Subject: [PATCH 3/4] [CFE] Let textual outline pass flags to the formatter; mark failures in status file Before (or, currently) we force the `ExperimentalFlag.inlineClass` experimental flag to be on and it's experimental and we thus basically always allow the formatter to fail. With the flag being flipped this allowing it to fail goes away. This CL fixes some of it by passing flags to the formatter as well, and "fixes" the rest by putting in status entries. Change-Id: I059efa0473dc0746bd72b45071c69915d4472b07 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336001 Commit-Queue: Jens Johansen Reviewed-by: Johnni Winther --- .../test/fasta/textual_outline_suite.dart | 14 ++++- .../external.dart.textual_outline.expect | 3 + ...ernal.dart.textual_outline_modelled.expect | 3 + .../external.dart.textual_outline.expect | 3 + ...ernal.dart.textual_outline_modelled.expect | 3 + ...n_type_members.dart.textual_outline.expect | 2 + ...mbers.dart.textual_outline_modelled.expect | 2 + ...interface_type.dart.textual_outline.expect | 5 +- ..._type.dart.textual_outline_modelled.expect | 5 +- .../await.dart.textual_outline.expect | 2 +- ...await.dart.textual_outline_modelled.expect | 2 +- ...mber_signature.dart.textual_outline.expect | 3 + ...ature.dart.textual_outline_modelled.expect | 4 ++ ...c_and_instance.dart.textual_outline.expect | 2 + ...tance.dart.textual_outline_modelled.expect | 2 + ...extension_type.dart.textual_outline.expect | 1 + ..._type.dart.textual_outline_modelled.expect | 1 + ...ember_conflict.dart.textual_outline.expect | 18 ++++-- ...flict.dart.textual_outline_modelled.expect | 18 ++++-- ...variant_equals.dart.textual_outline.expect | 3 + ...quals.dart.textual_outline_modelled.expect | 3 + ...e_declarations.dart.textual_outline.expect | 4 +- ...tions.dart.textual_outline_modelled.expect | 4 +- .../external.dart.textual_outline.expect | 1 + ...ernal.dart.textual_outline_modelled.expect | 1 + ...ents_conflicts.dart.textual_outline.expect | 55 +++++++++++++------ ...licts.dart.textual_outline_modelled.expect | 55 +++++++++++++------ ...inferred_types.dart.textual_outline.expect | 3 + ...types.dart.textual_outline_modelled.expect | 4 ++ ...nherit_generic.dart.textual_outline.expect | 6 +- ...neric.dart.textual_outline_modelled.expect | 6 +- .../main.dart.textual_outline.expect | 1 + .../main.dart.textual_outline_modelled.expect | 1 + ...entation_field.dart.textual_outline.expect | 1 + ...field.dart.textual_outline_modelled.expect | 1 + .../issue51556.dart.textual_outline.expect | 4 ++ ...51556.dart.textual_outline_modelled.expect | 3 + .../issue52542.dart.textual_outline.expect | 1 + ...52542.dart.textual_outline_modelled.expect | 1 + .../issue52667.dart.textual_outline.expect | 1 + ...52667.dart.textual_outline_modelled.expect | 1 + .../issue53155.dart.textual_outline.expect | 2 + ...53155.dart.textual_outline_modelled.expect | 2 + .../issue53207.dart.textual_outline.expect | 13 ++++- ...53207.dart.textual_outline_modelled.expect | 13 ++++- .../issue53211.dart.textual_outline.expect | 2 + ...53211.dart.textual_outline_modelled.expect | 1 + .../issue53740.dart.textual_outline.expect | 2 + ...53740.dart.textual_outline_modelled.expect | 2 + .../issue53791.dart.textual_outline.expect | 1 + ...53791.dart.textual_outline_modelled.expect | 1 + .../issue53799.dart.textual_outline.expect | 3 + ...53799.dart.textual_outline_modelled.expect | 3 + .../issue53803.dart.textual_outline.expect | 25 ++++++--- ...53803.dart.textual_outline_modelled.expect | 25 ++++++--- .../method_access.dart.textual_outline.expect | 1 + ...ccess.dart.textual_outline_modelled.expect | 1 + ...type_parameter.dart.textual_outline.expect | 8 +-- ...meter.dart.textual_outline_modelled.expect | 8 +-- .../nullability.dart.textual_outline.expect | 48 ++++++++++++++-- ...ility.dart.textual_outline_modelled.expect | 47 ++++++++++++++-- ...ullable_access.dart.textual_outline.expect | 4 +- ...ccess.dart.textual_outline_modelled.expect | 4 +- ...pattern_for_in.dart.textual_outline.expect | 1 + ...or_in.dart.textual_outline_modelled.expect | 1 + ...ory_from_class.dart.textual_outline.expect | 5 ++ ...class.dart.textual_outline_modelled.expect | 4 ++ ...eld_and_setter.dart.textual_outline.expect | 2 + ...etter.dart.textual_outline_modelled.expect | 1 + ...rtype_conflict.dart.textual_outline.expect | 1 + ...flict.dart.textual_outline_modelled.expect | 1 + .../main.dart.textual_outline.expect | 4 +- .../main.dart.textual_outline_modelled.expect | 4 +- .../testcases/textual_outline.status | 45 +++++++++++++++ 74 files changed, 436 insertions(+), 102 deletions(-) diff --git a/pkg/front_end/test/fasta/textual_outline_suite.dart b/pkg/front_end/test/fasta/textual_outline_suite.dart index cbaa9c1ecd36..944add4beb95 100644 --- a/pkg/front_end/test/fasta/textual_outline_suite.dart +++ b/pkg/front_end/test/fasta/textual_outline_suite.dart @@ -98,6 +98,8 @@ class TextualOutline extends Step { context.suiteFolderOptions.computeFolderOptions(description); Map experimentalFlags = folderOptions .computeExplicitExperimentalFlags(context.forcedExperimentalFlags); + Map experimentalFlagsExplicit = + folderOptions.computeExplicitExperimentalFlags(const {}); List bytes = new File.fromUri(description.uri).readAsBytesSync(); for (bool modelled in [false, true]) { @@ -146,7 +148,15 @@ class TextualOutline extends Step { if (!containsUnknownChunk) { // Try to format only if it doesn't contain the unknown chunk marker. try { - result = new DartFormatter().format(result); + List experimentFlags = []; + for (MapEntry entry + in experimentalFlags.entries) { + if (entry.value) { + experimentFlags.add(entry.key.name); + } + } + result = new DartFormatter(experimentFlags: experimentFlags) + .format(result); } catch (e, st) { formatterException = e; formatterExceptionSt = st; @@ -171,7 +181,7 @@ class TextualOutline extends Step { if (formatterException != null && !info.hasParserErrors) { bool hasUnreleasedExperiment = false; for (MapEntry entry - in experimentalFlags.entries) { + in experimentalFlagsExplicit.entries) { if (entry.value) { if (!entry.key.isEnabledByDefault) { hasUnreleasedExperiment = true; diff --git a/pkg/front_end/testcases/dart2js/extension_types/external.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/extension_types/external.dart.textual_outline.expect index 4689aa67b29a..bc98cdb74101 100644 --- a/pkg/front_end/testcases/dart2js/extension_types/external.dart.textual_outline.expect +++ b/pkg/front_end/testcases/dart2js/extension_types/external.dart.textual_outline.expect @@ -1,9 +1,12 @@ @JS() library static_interop; + import 'dart:js_interop'; + @JS() @staticInterop class A {} + @JS() extension type B._(A a) { external B(A a); diff --git a/pkg/front_end/testcases/dart2js/extension_types/external.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/extension_types/external.dart.textual_outline_modelled.expect index f3d6b15269b4..df55e5031663 100644 --- a/pkg/front_end/testcases/dart2js/extension_types/external.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/dart2js/extension_types/external.dart.textual_outline_modelled.expect @@ -1,9 +1,12 @@ @JS() library static_interop; + import 'dart:js_interop'; + @JS() @staticInterop class A {} + @JS() extension type B._(A a) { external A field; diff --git a/pkg/front_end/testcases/dartdevc/extension_types/external.dart.textual_outline.expect b/pkg/front_end/testcases/dartdevc/extension_types/external.dart.textual_outline.expect index 4689aa67b29a..bc98cdb74101 100644 --- a/pkg/front_end/testcases/dartdevc/extension_types/external.dart.textual_outline.expect +++ b/pkg/front_end/testcases/dartdevc/extension_types/external.dart.textual_outline.expect @@ -1,9 +1,12 @@ @JS() library static_interop; + import 'dart:js_interop'; + @JS() @staticInterop class A {} + @JS() extension type B._(A a) { external B(A a); diff --git a/pkg/front_end/testcases/dartdevc/extension_types/external.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dartdevc/extension_types/external.dart.textual_outline_modelled.expect index f3d6b15269b4..df55e5031663 100644 --- a/pkg/front_end/testcases/dartdevc/extension_types/external.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/dartdevc/extension_types/external.dart.textual_outline_modelled.expect @@ -1,9 +1,12 @@ @JS() library static_interop; + import 'dart:js_interop'; + @JS() @staticInterop class A {} + @JS() extension type B._(A a) { external A field; diff --git a/pkg/front_end/testcases/extension_types/access_non_extension_type_members.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/access_non_extension_type_members.dart.textual_outline.expect index 98ff2de2185c..836fecdae451 100644 --- a/pkg/front_end/testcases/extension_types/access_non_extension_type_members.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/access_non_extension_type_members.dart.textual_outline.expect @@ -4,7 +4,9 @@ class A { int get getter => field; void set setter(int value) {} } + class B extends A {} + extension type E(B it) implements B {} extension type F(B it) implements E {} main() {} diff --git a/pkg/front_end/testcases/extension_types/access_non_extension_type_members.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/access_non_extension_type_members.dart.textual_outline_modelled.expect index 8f5ba7db0e36..12fd3d80ef02 100644 --- a/pkg/front_end/testcases/extension_types/access_non_extension_type_members.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/access_non_extension_type_members.dart.textual_outline_modelled.expect @@ -4,7 +4,9 @@ class A { int method() => field; void set setter(int value) {} } + class B extends A {} + expect(expected, actual) {} extension type E(B it) implements B {} extension type F(B it) implements E {} diff --git a/pkg/front_end/testcases/extension_types/assign_interface_type.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/assign_interface_type.dart.textual_outline.expect index 436f20ccf709..4ebfd3634ac3 100644 --- a/pkg/front_end/testcases/extension_types/assign_interface_type.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/assign_interface_type.dart.textual_outline.expect @@ -1,8 +1,11 @@ class A {} + class B extends A {} + extension type C(Object? o) {} extension type D(Object o) {} extension type E(B it) implements A {} extension type F(B it) implements E, B {} extension type G(T o) {} -test( Object o, A a, B b, C c, D d, E e, F f, G g1, G g2) {} +test( + Object o, A a, B b, C c, D d, E e, F f, G g1, G g2) {} diff --git a/pkg/front_end/testcases/extension_types/assign_interface_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/assign_interface_type.dart.textual_outline_modelled.expect index 436f20ccf709..4ebfd3634ac3 100644 --- a/pkg/front_end/testcases/extension_types/assign_interface_type.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/assign_interface_type.dart.textual_outline_modelled.expect @@ -1,8 +1,11 @@ class A {} + class B extends A {} + extension type C(Object? o) {} extension type D(Object o) {} extension type E(B it) implements A {} extension type F(B it) implements E, B {} extension type G(T o) {} -test( Object o, A a, B b, C c, D d, E e, F f, G g1, G g2) {} +test( + Object o, A a, B b, C c, D d, E e, F f, G g1, G g2) {} diff --git a/pkg/front_end/testcases/extension_types/await.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/await.dart.textual_outline.expect index b272d405e7cd..45ea7435acb7 100644 --- a/pkg/front_end/testcases/extension_types/await.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/await.dart.textual_outline.expect @@ -1,4 +1,4 @@ extension type V1(Future id) implements Future {} -extension type V2>(T id) implements Future{} +extension type V2>(T id) implements Future {} main() async {} expect(expected, actual) {} diff --git a/pkg/front_end/testcases/extension_types/await.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/await.dart.textual_outline_modelled.expect index ba8bbd8e0bb9..5a8f05388660 100644 --- a/pkg/front_end/testcases/extension_types/await.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/await.dart.textual_outline_modelled.expect @@ -1,4 +1,4 @@ expect(expected, actual) {} extension type V1(Future id) implements Future {} -extension type V2>(T id) implements Future{} +extension type V2>(T id) implements Future {} main() async {} diff --git a/pkg/front_end/testcases/extension_types/combined_member_signature.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/combined_member_signature.dart.textual_outline.expect index 03d76c790475..1ace88870c5d 100644 --- a/pkg/front_end/testcases/extension_types/combined_member_signature.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/combined_member_signature.dart.textual_outline.expect @@ -3,16 +3,19 @@ abstract class A { (Object?, dynamic) get getter; void set setter((int, int) Function(Object?, dynamic) f); } + abstract class B { (dynamic, Object?) method(); (dynamic, Object?) get getter; void set setter((int, int) Function(dynamic, Object?) f); } + class C implements A, B { (int, int) method() => (42, 87); (int, int) get getter => (42, 87); void set setter((int, int) Function(dynamic, dynamic) f) {} } + extension type E(C c) implements A, B {} (Object?, Object?) testMethod0(E e) => e.method(); (int, Object?) testMethod1(E e) => e.method(); diff --git a/pkg/front_end/testcases/extension_types/combined_member_signature.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/combined_member_signature.dart.textual_outline_modelled.expect index c9ee4844b102..347262f586e7 100644 --- a/pkg/front_end/testcases/extension_types/combined_member_signature.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/combined_member_signature.dart.textual_outline_modelled.expect @@ -11,21 +11,25 @@ (int, Object?) testGetter1(E e) => e.getter; (int, Object?) testMethod1(E e) => e.method(); E e = E(C()); + abstract class A { (Object?, dynamic) get getter; (Object?, dynamic) method(); void set setter((int, int) Function(Object?, dynamic) f); } + abstract class B { (dynamic, Object?) get getter; (dynamic, Object?) method(); void set setter((int, int) Function(dynamic, Object?) f); } + class C implements A, B { (int, int) get getter => (42, 87); (int, int) method() => (42, 87); void set setter((int, int) Function(dynamic, dynamic) f) {} } + expect(expected, actual) {} extension type E(C c) implements A, B {} main() {} diff --git a/pkg/front_end/testcases/extension_types/conflicting_static_and_instance.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/conflicting_static_and_instance.dart.textual_outline.expect index 83fd56212acf..c5fbbf5b1bb5 100644 --- a/pkg/front_end/testcases/extension_types/conflicting_static_and_instance.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/conflicting_static_and_instance.dart.textual_outline.expect @@ -1,9 +1,11 @@ class C1 { void x() {} } + class C2 implements C1 { static int get x => 1; } + extension type I1(int id) { void x() {} } diff --git a/pkg/front_end/testcases/extension_types/conflicting_static_and_instance.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/conflicting_static_and_instance.dart.textual_outline_modelled.expect index e18983e92645..95056e3c77c9 100644 --- a/pkg/front_end/testcases/extension_types/conflicting_static_and_instance.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/conflicting_static_and_instance.dart.textual_outline_modelled.expect @@ -1,9 +1,11 @@ class C1 { void x() {} } + class C2 implements C1 { static int get x => 1; } + extension type ET1(int id) implements I1 { static int get x => 1; } diff --git a/pkg/front_end/testcases/extension_types/const_extension_type.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/const_extension_type.dart.textual_outline.expect index aa9160f70f62..39d08bc8cc29 100644 --- a/pkg/front_end/testcases/extension_types/const_extension_type.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/const_extension_type.dart.textual_outline.expect @@ -1,6 +1,7 @@ class Class { const Class(); } + extension type const ExtensionType(T id) {} const a1 = Class; const a2 = ExtensionType>; diff --git a/pkg/front_end/testcases/extension_types/const_extension_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/const_extension_type.dart.textual_outline_modelled.expect index e2e58dddf4dc..9773a28d57b3 100644 --- a/pkg/front_end/testcases/extension_types/const_extension_type.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/const_extension_type.dart.textual_outline_modelled.expect @@ -1,6 +1,7 @@ class Class { const Class(); } + const a1 = Class; const a2 = ExtensionType>; const a3 = Class; diff --git a/pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.textual_outline.expect index c64a5f145c74..f7f064e0d15d 100644 --- a/pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.textual_outline.expect @@ -1,20 +1,26 @@ extension type ExtensionType(int it) { ExtensionType.constructorAndMethod(); void constructorAndMethod() {} - factory ExtensionType.factoryAndMethod() => new ExtensionType.constructorAndMethod(); + factory ExtensionType.factoryAndMethod() => + new ExtensionType.constructorAndMethod(); void factoryAndMethod() {} - factory ExtensionType.redirectingFactoryAndMethod() = ExtensionType.constructorAndMethod; + factory ExtensionType.redirectingFactoryAndMethod() = + ExtensionType.constructorAndMethod; void redirectingFactoryAndMethod() {} ExtensionType.constructorAndGetter(); dynamic get constructorAndGetter => null; - factory ExtensionType.factoryAndGetter() => new ExtensionType.constructorAndGetter(); + factory ExtensionType.factoryAndGetter() => + new ExtensionType.constructorAndGetter(); dynamic get factoryAndGetter => null; - factory ExtensionType.redirectingFactoryAndGetter() = ExtensionType.constructorAndGetter; + factory ExtensionType.redirectingFactoryAndGetter() = + ExtensionType.constructorAndGetter; dynamic get redirectingFactoryAndGetter => null; ExtensionType.constructorAndSetter(); void set constructorAndSetter(value) {} - factory ExtensionType.factoryAndSetter() => new ExtensionType.constructorAndSetter(); + factory ExtensionType.factoryAndSetter() => + new ExtensionType.constructorAndSetter(); void set factoryAndSetter(value) {} - factory ExtensionType.redirectingFactoryAndSetter() = ExtensionType.constructorAndSetter; + factory ExtensionType.redirectingFactoryAndSetter() = + ExtensionType.constructorAndSetter; void set redirectingFactoryAndSetter(value) {} } diff --git a/pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.textual_outline_modelled.expect index a4446cb72374..5e47520906f9 100644 --- a/pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.textual_outline_modelled.expect @@ -5,12 +5,18 @@ extension type ExtensionType(int it) { dynamic get constructorAndGetter => null; dynamic get factoryAndGetter => null; dynamic get redirectingFactoryAndGetter => null; - factory ExtensionType.factoryAndGetter() => new ExtensionType.constructorAndGetter(); - factory ExtensionType.factoryAndMethod() => new ExtensionType.constructorAndMethod(); - factory ExtensionType.factoryAndSetter() => new ExtensionType.constructorAndSetter(); - factory ExtensionType.redirectingFactoryAndGetter() = ExtensionType.constructorAndGetter; - factory ExtensionType.redirectingFactoryAndMethod() = ExtensionType.constructorAndMethod; - factory ExtensionType.redirectingFactoryAndSetter() = ExtensionType.constructorAndSetter; + factory ExtensionType.factoryAndGetter() => + new ExtensionType.constructorAndGetter(); + factory ExtensionType.factoryAndMethod() => + new ExtensionType.constructorAndMethod(); + factory ExtensionType.factoryAndSetter() => + new ExtensionType.constructorAndSetter(); + factory ExtensionType.redirectingFactoryAndGetter() = + ExtensionType.constructorAndGetter; + factory ExtensionType.redirectingFactoryAndMethod() = + ExtensionType.constructorAndMethod; + factory ExtensionType.redirectingFactoryAndSetter() = + ExtensionType.constructorAndSetter; void constructorAndMethod() {} void factoryAndMethod() {} void redirectingFactoryAndMethod() {} diff --git a/pkg/front_end/testcases/extension_types/covariant_equals.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/covariant_equals.dart.textual_outline.expect index f89034648846..110cde134ba6 100644 --- a/pkg/front_end/testcases/extension_types/covariant_equals.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/covariant_equals.dart.textual_outline.expect @@ -1,9 +1,12 @@ class A {} + class B implements A { @override bool operator ==(covariant A other) {} } + class C {} + extension type ET1(B b) implements A {} extension type ET2(B b) implements ET1, B {} void test() {} diff --git a/pkg/front_end/testcases/extension_types/covariant_equals.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/covariant_equals.dart.textual_outline_modelled.expect index f89034648846..110cde134ba6 100644 --- a/pkg/front_end/testcases/extension_types/covariant_equals.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/covariant_equals.dart.textual_outline_modelled.expect @@ -1,9 +1,12 @@ class A {} + class B implements A { @override bool operator ==(covariant A other) {} } + class C {} + extension type ET1(B b) implements A {} extension type ET2(B b) implements ET1, B {} void test() {} diff --git a/pkg/front_end/testcases/extension_types/extension_type_declarations.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/extension_type_declarations.dart.textual_outline.expect index 63a26c19b817..406b9495f4e2 100644 --- a/pkg/front_end/testcases/extension_types/extension_type_declarations.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/extension_type_declarations.dart.textual_outline.expect @@ -10,8 +10,8 @@ extension type ExtensionType4(int it) { int get getter => it; void set setter(int value) {} int method() => it; - int operator[](int index) => it; - void operator[]=(int index, int value) {} + int operator [](int index) => it; + void operator []=(int index, int value) {} static int staticField = 42; static int get staticGetter => 42; static void set staticSetter(int value) {} diff --git a/pkg/front_end/testcases/extension_types/extension_type_declarations.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/extension_type_declarations.dart.textual_outline_modelled.expect index 50142da609f0..1e4a95c7d61a 100644 --- a/pkg/front_end/testcases/extension_types/extension_type_declarations.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/extension_type_declarations.dart.textual_outline_modelled.expect @@ -9,12 +9,12 @@ extension type ExtensionType4(int it) { final int field = 42; int get getter => it; int method() => it; - int operator[](int index) => it; + int operator [](int index) => it; static int get staticGetter => 42; static int staticField = 42; static int staticMethod() => 42; static void set staticSetter(int value) {} - void operator[]=(int index, int value) {} + void operator []=(int index, int value) {} void set setter(int value) {} } extension type ExtensionType5.new(int it) {} diff --git a/pkg/front_end/testcases/extension_types/external.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/external.dart.textual_outline.expect index 6790abaedbf7..0e300fcc20f3 100644 --- a/pkg/front_end/testcases/extension_types/external.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/external.dart.textual_outline.expect @@ -1,4 +1,5 @@ abstract class A {} + extension type B._(A a) { external B(A a); external B.named(int i); diff --git a/pkg/front_end/testcases/extension_types/external.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/external.dart.textual_outline_modelled.expect index f12f9603ab93..1f2963537acc 100644 --- a/pkg/front_end/testcases/extension_types/external.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/external.dart.textual_outline_modelled.expect @@ -1,4 +1,5 @@ abstract class A {} + extension type B._(A a) { external A field; external A method(); diff --git a/pkg/front_end/testcases/extension_types/implements_conflicts.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/implements_conflicts.dart.textual_outline.expect index 2a876d21ef08..3318711a5106 100644 --- a/pkg/front_end/testcases/extension_types/implements_conflicts.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/implements_conflicts.dart.textual_outline.expect @@ -1,31 +1,42 @@ import 'implements_conflicts_lib.dart'; + extension type ExtensionType1a(ClassA c) implements ClassA, ExtensionTypeA {} extension type ExtensionType1b(ClassA c) implements ClassA, ExtensionTypeA { void method1() {} } -extension type ExtensionType2a(ClassC c) implements ClassC, ExtensionTypeA, ExtensionTypeB {} -extension type ExtensionType2b(ClassC c) implements ClassC, ExtensionTypeA, ExtensionTypeB { +extension type ExtensionType2a(ClassC c) + implements ClassC, ExtensionTypeA, ExtensionTypeB {} +extension type ExtensionType2b(ClassC c) + implements ClassC, ExtensionTypeA, ExtensionTypeB { void method1() {} } -extension type ExtensionType3a(ClassC c) implements ClassA, ClassB, ExtensionTypeA {} -extension type ExtensionType3b(ClassC c) implements ClassA, ClassB, ExtensionTypeA { +extension type ExtensionType3a(ClassC c) + implements ClassA, ClassB, ExtensionTypeA {} +extension type ExtensionType3b(ClassC c) + implements ClassA, ClassB, ExtensionTypeA { void method1() {} } -extension type ExtensionType4a(ClassC c) implements ExtensionTypeA, ExtensionTypeB {} -extension type ExtensionType4b(ClassC c) implements ExtensionTypeA, ExtensionTypeB { +extension type ExtensionType4a(ClassC c) + implements ExtensionTypeA, ExtensionTypeB {} +extension type ExtensionType4b(ClassC c) + implements ExtensionTypeA, ExtensionTypeB { void method1() {} } -extension type ExtensionType5(ClassC c) implements ExtensionTypeA1, ExtensionTypeA2 {} +extension type ExtensionType5(ClassC c) + implements ExtensionTypeA1, ExtensionTypeA2 {} extension type ExtensionType6a(ClassF c) implements ClassD, ClassE {} extension type ExtensionType6b(ClassF c) implements ClassD, ClassE { void method2() {} } -extension type ExtensionType7a(ClassF c) implements ExtensionTypeD, ExtensionTypeE {} -extension type ExtensionType7b(ClassF c) implements ExtensionTypeD, ExtensionTypeE { +extension type ExtensionType7a(ClassF c) + implements ExtensionTypeD, ExtensionTypeE {} +extension type ExtensionType7b(ClassF c) + implements ExtensionTypeD, ExtensionTypeE { void method2() {} } extension type ExtensionType8a(ClassI c) implements ClassG, ClassH {} -extension type ExtensionType8b(ClassI c) implements ExtensionTypeG, ExtensionTypeH {} +extension type ExtensionType8b(ClassI c) + implements ExtensionTypeG, ExtensionTypeH {} extension type ExtensionType9(int i) { void method4() {} void set method4(int value) {} @@ -35,8 +46,10 @@ extension type ExtensionType9b(ClassJK n) implements ClassJ, ClassK { int get method4 => 42; void set method4(int value) {} } -extension type ExtensionType10a(ClassJK i) implements ExtensionTypeJ, ExtensionTypeK {} -extension type ExtensionType10b(ClassJK i) implements ExtensionTypeJ, ExtensionTypeK { +extension type ExtensionType10a(ClassJK i) + implements ExtensionTypeJ, ExtensionTypeK {} +extension type ExtensionType10b(ClassJK i) + implements ExtensionTypeJ, ExtensionTypeK { int get method4 => 42; void set method4(int value) {} } @@ -55,27 +68,33 @@ extension type ExtensionType12d(ClassLM n) implements ClassL, ClassM { bool get property => true; void set property(bool value) {} } -extension type ExtensionType13a(ClassLM i) implements ExtensionTypeL, ExtensionTypeM {} +extension type ExtensionType13a(ClassLM i) + implements ExtensionTypeL, ExtensionTypeM {} extension type ExtensionType13b(ClassL i) implements ExtensionTypeL { void set property(bool value) {} } extension type ExtensionType13c(ClassM i) implements ExtensionTypeM { bool get property => true; } -extension type ExtensionType13d(ClassLM i) implements ExtensionTypeL, ExtensionTypeM { +extension type ExtensionType13d(ClassLM i) + implements ExtensionTypeL, ExtensionTypeM { bool get property => true; void set property(bool value) {} } -extension type ExtensionType14a(ExtensionTypeLN n) implements ClassL, ExtensionTypeN {} -extension type ExtensionType14b(ExtensionTypeLN n) implements ExtensionTypeL, ClassN {} +extension type ExtensionType14a(ExtensionTypeLN n) + implements ClassL, ExtensionTypeN {} +extension type ExtensionType14b(ExtensionTypeLN n) + implements ExtensionTypeL, ClassN {} extension type ExtensionType14c(ClassL n) implements ClassL { void set property(int value) {} } -extension type ExtensionType14d(ExtensionTypeLN n) implements ExtensionTypeL, ClassN { +extension type ExtensionType14d(ExtensionTypeLN n) + implements ExtensionTypeL, ClassN { int get property => 42; void set property(int value) {} } -extension type ExtensionType14e(ExtensionTypeLN n) implements ClassL, ExtensionTypeN { +extension type ExtensionType14e(ExtensionTypeLN n) + implements ClassL, ExtensionTypeN { int get property => 42; void set property(int value) {} } diff --git a/pkg/front_end/testcases/extension_types/implements_conflicts.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/implements_conflicts.dart.textual_outline_modelled.expect index f9b94876ef8b..a56424495720 100644 --- a/pkg/front_end/testcases/extension_types/implements_conflicts.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/implements_conflicts.dart.textual_outline_modelled.expect @@ -1,6 +1,9 @@ import 'implements_conflicts_lib.dart'; -extension type ExtensionType10a(ClassJK i) implements ExtensionTypeJ, ExtensionTypeK {} -extension type ExtensionType10b(ClassJK i) implements ExtensionTypeJ, ExtensionTypeK { + +extension type ExtensionType10a(ClassJK i) + implements ExtensionTypeJ, ExtensionTypeK {} +extension type ExtensionType10b(ClassJK i) + implements ExtensionTypeJ, ExtensionTypeK { int get method4 => 42; void set method4(int value) {} } @@ -19,27 +22,33 @@ extension type ExtensionType12d(ClassLM n) implements ClassL, ClassM { bool get property => true; void set property(bool value) {} } -extension type ExtensionType13a(ClassLM i) implements ExtensionTypeL, ExtensionTypeM {} +extension type ExtensionType13a(ClassLM i) + implements ExtensionTypeL, ExtensionTypeM {} extension type ExtensionType13b(ClassL i) implements ExtensionTypeL { void set property(bool value) {} } extension type ExtensionType13c(ClassM i) implements ExtensionTypeM { bool get property => true; } -extension type ExtensionType13d(ClassLM i) implements ExtensionTypeL, ExtensionTypeM { +extension type ExtensionType13d(ClassLM i) + implements ExtensionTypeL, ExtensionTypeM { bool get property => true; void set property(bool value) {} } -extension type ExtensionType14a(ExtensionTypeLN n) implements ClassL, ExtensionTypeN {} -extension type ExtensionType14b(ExtensionTypeLN n) implements ExtensionTypeL, ClassN {} +extension type ExtensionType14a(ExtensionTypeLN n) + implements ClassL, ExtensionTypeN {} +extension type ExtensionType14b(ExtensionTypeLN n) + implements ExtensionTypeL, ClassN {} extension type ExtensionType14c(ClassL n) implements ClassL { void set property(int value) {} } -extension type ExtensionType14d(ExtensionTypeLN n) implements ExtensionTypeL, ClassN { +extension type ExtensionType14d(ExtensionTypeLN n) + implements ExtensionTypeL, ClassN { int get property => 42; void set property(int value) {} } -extension type ExtensionType14e(ExtensionTypeLN n) implements ClassL, ExtensionTypeN { +extension type ExtensionType14e(ExtensionTypeLN n) + implements ClassL, ExtensionTypeN { int get property => 42; void set property(int value) {} } @@ -47,29 +56,39 @@ extension type ExtensionType1a(ClassA c) implements ClassA, ExtensionTypeA {} extension type ExtensionType1b(ClassA c) implements ClassA, ExtensionTypeA { void method1() {} } -extension type ExtensionType2a(ClassC c) implements ClassC, ExtensionTypeA, ExtensionTypeB {} -extension type ExtensionType2b(ClassC c) implements ClassC, ExtensionTypeA, ExtensionTypeB { +extension type ExtensionType2a(ClassC c) + implements ClassC, ExtensionTypeA, ExtensionTypeB {} +extension type ExtensionType2b(ClassC c) + implements ClassC, ExtensionTypeA, ExtensionTypeB { void method1() {} } -extension type ExtensionType3a(ClassC c) implements ClassA, ClassB, ExtensionTypeA {} -extension type ExtensionType3b(ClassC c) implements ClassA, ClassB, ExtensionTypeA { +extension type ExtensionType3a(ClassC c) + implements ClassA, ClassB, ExtensionTypeA {} +extension type ExtensionType3b(ClassC c) + implements ClassA, ClassB, ExtensionTypeA { void method1() {} } -extension type ExtensionType4a(ClassC c) implements ExtensionTypeA, ExtensionTypeB {} -extension type ExtensionType4b(ClassC c) implements ExtensionTypeA, ExtensionTypeB { +extension type ExtensionType4a(ClassC c) + implements ExtensionTypeA, ExtensionTypeB {} +extension type ExtensionType4b(ClassC c) + implements ExtensionTypeA, ExtensionTypeB { void method1() {} } -extension type ExtensionType5(ClassC c) implements ExtensionTypeA1, ExtensionTypeA2 {} +extension type ExtensionType5(ClassC c) + implements ExtensionTypeA1, ExtensionTypeA2 {} extension type ExtensionType6a(ClassF c) implements ClassD, ClassE {} extension type ExtensionType6b(ClassF c) implements ClassD, ClassE { void method2() {} } -extension type ExtensionType7a(ClassF c) implements ExtensionTypeD, ExtensionTypeE {} -extension type ExtensionType7b(ClassF c) implements ExtensionTypeD, ExtensionTypeE { +extension type ExtensionType7a(ClassF c) + implements ExtensionTypeD, ExtensionTypeE {} +extension type ExtensionType7b(ClassF c) + implements ExtensionTypeD, ExtensionTypeE { void method2() {} } extension type ExtensionType8a(ClassI c) implements ClassG, ClassH {} -extension type ExtensionType8b(ClassI c) implements ExtensionTypeG, ExtensionTypeH {} +extension type ExtensionType8b(ClassI c) + implements ExtensionTypeG, ExtensionTypeH {} extension type ExtensionType9(int i) { void method4() {} void set method4(int value) {} diff --git a/pkg/front_end/testcases/extension_types/inferred_types.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/inferred_types.dart.textual_outline.expect index 5f30989d9c42..5b0c995e15ae 100644 --- a/pkg/front_end/testcases/extension_types/inferred_types.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/inferred_types.dart.textual_outline.expect @@ -4,13 +4,16 @@ E e = E(C(42)); D d = D(C(42)); extension type E(C c) implements C {} extension type D(C c) implements B {} + class C implements B { final field; C(this.field); } + abstract class B implements A { get field; } + abstract class A { int get field; } diff --git a/pkg/front_end/testcases/extension_types/inferred_types.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/inferred_types.dart.textual_outline_modelled.expect index caac0568ffee..37dda2f7f65b 100644 --- a/pkg/front_end/testcases/extension_types/inferred_types.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/inferred_types.dart.textual_outline_modelled.expect @@ -1,15 +1,19 @@ D d = D(C(42)); E e = E(C(42)); + abstract class A { int get field; } + abstract class B implements A { get field; } + class C implements B { C(this.field); final field; } + extension type D(C c) implements B {} extension type E(C c) implements C {} var f = d.field; diff --git a/pkg/front_end/testcases/extension_types/inherit_generic.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/inherit_generic.dart.textual_outline.expect index 65e1ed9a2f2f..a6d606e2b6ad 100644 --- a/pkg/front_end/testcases/extension_types/inherit_generic.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/inherit_generic.dart.textual_outline.expect @@ -2,18 +2,18 @@ extension type A(Object it) { T method() => throw ''; T get getter => throw ''; void set setter(T value) {} - T operator[] (T index) => throw ''; + T operator [](T index) => throw ''; } extension type B(Object it) implements A { S method2() => method(); S get getter2 => getter; void set setter2(S value) {} - void operator[]= (S index, S value) {} + void operator []=(S index, S value) {} } extension type C(Object i) implements A { int method3() => method(); int get getter3 => getter; void set setter3(int value) {} - void operator[]= (int index, int value) {} + void operator []=(int index, int value) {} } test(A a, B b, C c) {} diff --git a/pkg/front_end/testcases/extension_types/inherit_generic.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/inherit_generic.dart.textual_outline_modelled.expect index 2817471cb68f..f1b3a3667253 100644 --- a/pkg/front_end/testcases/extension_types/inherit_generic.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/inherit_generic.dart.textual_outline_modelled.expect @@ -1,19 +1,19 @@ extension type A(Object it) { T get getter => throw ''; T method() => throw ''; - T operator[] (T index) => throw ''; + T operator [](T index) => throw ''; void set setter(T value) {} } extension type B(Object it) implements A { S get getter2 => getter; S method2() => method(); - void operator[]= (S index, S value) {} + void operator []=(S index, S value) {} void set setter2(S value) {} } extension type C(Object i) implements A { int get getter3 => getter; int method3() => method(); - void operator[]= (int index, int value) {} + void operator []=(int index, int value) {} void set setter3(int value) {} } test(A a, B b, C c) {} diff --git a/pkg/front_end/testcases/extension_types/inherited_combined_member_signature/main.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/inherited_combined_member_signature/main.dart.textual_outline.expect index 16b458119e1f..21bc8059a051 100644 --- a/pkg/front_end/testcases/extension_types/inherited_combined_member_signature/main.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/inherited_combined_member_signature/main.dart.textual_outline.expect @@ -1,2 +1,3 @@ import 'main_lib.dart'; + extension type H(E e) implements F, D {} diff --git a/pkg/front_end/testcases/extension_types/inherited_combined_member_signature/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/inherited_combined_member_signature/main.dart.textual_outline_modelled.expect index 16b458119e1f..21bc8059a051 100644 --- a/pkg/front_end/testcases/extension_types/inherited_combined_member_signature/main.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/inherited_combined_member_signature/main.dart.textual_outline_modelled.expect @@ -1,2 +1,3 @@ import 'main_lib.dart'; + extension type H(E e) implements F, D {} diff --git a/pkg/front_end/testcases/extension_types/inherited_representation_field.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/inherited_representation_field.dart.textual_outline.expect index 3a139c4ca156..36728436a3d6 100644 --- a/pkg/front_end/testcases/extension_types/inherited_representation_field.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/inherited_representation_field.dart.textual_outline.expect @@ -1,4 +1,5 @@ import 'inherited_representation_field_lib.dart'; + extension type A(int a) {} extension type B(int b) implements A { methodA() => a; diff --git a/pkg/front_end/testcases/extension_types/inherited_representation_field.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/inherited_representation_field.dart.textual_outline_modelled.expect index b41726a1d5c3..379543d5c21c 100644 --- a/pkg/front_end/testcases/extension_types/inherited_representation_field.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/inherited_representation_field.dart.textual_outline_modelled.expect @@ -1,4 +1,5 @@ import 'inherited_representation_field_lib.dart'; + expect(expected, actual) {} extension type A(int a) {} extension type B(int b) implements A { diff --git a/pkg/front_end/testcases/extension_types/issue51556.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue51556.dart.textual_outline.expect index 8feca2842305..857fcef5793c 100644 --- a/pkg/front_end/testcases/extension_types/issue51556.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue51556.dart.textual_outline.expect @@ -3,13 +3,17 @@ extension type JSObject(Object value) implements JSAny {} extension type JSArray(List value) implements JSObject {} extension type JSExportedDartObject(Object value) implements JSObject {} extension type JSNumber(double value) implements JSAny {} + extension ObjectToJSExportedDartObject on Object { JSExportedDartObject get toJS => JSExportedDartObject(this); } + extension ListToJSArray on List { JSArray get toJS => JSArray(this); } + extension DoubleToJSNumber on double { JSNumber get toJS => JSNumber(this); } + void main() {} diff --git a/pkg/front_end/testcases/extension_types/issue51556.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue51556.dart.textual_outline_modelled.expect index bd39d33cb495..7c2d2f1ca086 100644 --- a/pkg/front_end/testcases/extension_types/issue51556.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue51556.dart.textual_outline_modelled.expect @@ -1,12 +1,15 @@ extension DoubleToJSNumber on double { JSNumber get toJS => JSNumber(this); } + extension ListToJSArray on List { JSArray get toJS => JSArray(this); } + extension ObjectToJSExportedDartObject on Object { JSExportedDartObject get toJS => JSExportedDartObject(this); } + extension type JSAny(Object value) {} extension type JSArray(List value) implements JSObject {} extension type JSExportedDartObject(Object value) implements JSObject {} diff --git a/pkg/front_end/testcases/extension_types/issue52542.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue52542.dart.textual_outline.expect index 3e7f7e555417..c0823da767ec 100644 --- a/pkg/front_end/testcases/extension_types/issue52542.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue52542.dart.textual_outline.expect @@ -2,6 +2,7 @@ extension type const Option(Object? _value) { static const Option none = const None() as Option; V get value => _value is None ? (throw StateError("No Value")) : _value as V; } + class None { const None(); } diff --git a/pkg/front_end/testcases/extension_types/issue52542.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue52542.dart.textual_outline_modelled.expect index ce0a46ccf952..4af3355fa46b 100644 --- a/pkg/front_end/testcases/extension_types/issue52542.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue52542.dart.textual_outline_modelled.expect @@ -1,6 +1,7 @@ class None { const None(); } + extension type const Option(Object? _value) { V get value => _value is None ? (throw StateError("No Value")) : _value as V; static const Option none = const None() as Option; diff --git a/pkg/front_end/testcases/extension_types/issue52667.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue52667.dart.textual_outline.expect index d404928821d5..2b8a5d19bda8 100644 --- a/pkg/front_end/testcases/extension_types/issue52667.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue52667.dart.textual_outline.expect @@ -1,4 +1,5 @@ class Foo {} + extension type FooBar(Foo i) implements Foo {} extension type FooBaz(Foo i) implements Foo {} void main() {} diff --git a/pkg/front_end/testcases/extension_types/issue52667.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue52667.dart.textual_outline_modelled.expect index d404928821d5..2b8a5d19bda8 100644 --- a/pkg/front_end/testcases/extension_types/issue52667.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue52667.dart.textual_outline_modelled.expect @@ -1,4 +1,5 @@ class Foo {} + extension type FooBar(Foo i) implements Foo {} extension type FooBaz(Foo i) implements Foo {} void main() {} diff --git a/pkg/front_end/testcases/extension_types/issue53155.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53155.dart.textual_outline.expect index bea722fa7952..808f8b2d381a 100644 --- a/pkg/front_end/testcases/extension_types/issue53155.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue53155.dart.textual_outline.expect @@ -2,8 +2,10 @@ extension type V(X1 id) {} typedef V Foo>(V v); typedef IntNumV = V; V foo>(T t) => t as V; + class C> { Foo f = foo>; } + main() {} expect(expected, actual) {} diff --git a/pkg/front_end/testcases/extension_types/issue53155.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53155.dart.textual_outline_modelled.expect index 43d5bbb5e67d..19554a8f3e73 100644 --- a/pkg/front_end/testcases/extension_types/issue53155.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue53155.dart.textual_outline_modelled.expect @@ -1,7 +1,9 @@ V foo>(T t) => t as V; + class C> { Foo f = foo>; } + expect(expected, actual) {} extension type V(X1 id) {} main() {} diff --git a/pkg/front_end/testcases/extension_types/issue53207.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53207.dart.textual_outline.expect index ce4aaebc6234..4e7b7600c802 100644 --- a/pkg/front_end/testcases/extension_types/issue53207.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue53207.dart.textual_outline.expect @@ -1,4 +1,5 @@ import 'dart:async'; + extension type E1(Future foo) {} extension type E2>(X foo) {} extension type E3(FutureOr foo) {} @@ -8,4 +9,14 @@ extension type F1(Future foo) implements Future {} extension type F2>(X foo) implements Future {} extension type F3>(X foo) implements Future {} extension type F4>(X foo) implements F3 {} -test( E1 e1, E2> e2, E3 e3, E4> e4, E5 e5object, E5> e5future, F1 f1, F2> f2, F3> f3, F4> f4) async {} +test( + E1 e1, + E2> e2, + E3 e3, + E4> e4, + E5 e5object, + E5> e5future, + F1 f1, + F2> f2, + F3> f3, + F4> f4) async {} diff --git a/pkg/front_end/testcases/extension_types/issue53207.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53207.dart.textual_outline_modelled.expect index ce4aaebc6234..4e7b7600c802 100644 --- a/pkg/front_end/testcases/extension_types/issue53207.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue53207.dart.textual_outline_modelled.expect @@ -1,4 +1,5 @@ import 'dart:async'; + extension type E1(Future foo) {} extension type E2>(X foo) {} extension type E3(FutureOr foo) {} @@ -8,4 +9,14 @@ extension type F1(Future foo) implements Future {} extension type F2>(X foo) implements Future {} extension type F3>(X foo) implements Future {} extension type F4>(X foo) implements F3 {} -test( E1 e1, E2> e2, E3 e3, E4> e4, E5 e5object, E5> e5future, F1 f1, F2> f2, F3> f3, F4> f4) async {} +test( + E1 e1, + E2> e2, + E3 e3, + E4> e4, + E5 e5object, + E5> e5future, + F1 f1, + F2> f2, + F3> f3, + F4> f4) async {} diff --git a/pkg/front_end/testcases/extension_types/issue53211.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53211.dart.textual_outline.expect index 79625c05857e..02aced17d897 100644 --- a/pkg/front_end/testcases/extension_types/issue53211.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue53211.dart.textual_outline.expect @@ -5,7 +5,9 @@ extension type ET4.new(T id) {} extension type ET5.n(int id) {} extension type ET6.n(T id) {} main() {} + extension StaticType on T { T expectStaticType>() {} } + typedef Exactly = T Function(T); diff --git a/pkg/front_end/testcases/extension_types/issue53211.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53211.dart.textual_outline_modelled.expect index 702d587d72c0..b9d7bae1f95b 100644 --- a/pkg/front_end/testcases/extension_types/issue53211.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue53211.dart.textual_outline_modelled.expect @@ -1,6 +1,7 @@ extension StaticType on T { T expectStaticType>() {} } + extension type ET1(int id) {} extension type ET2(T id) {} extension type ET3.new(int id) {} diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline.expect index 0fae0c66caa3..10f206d798e0 100644 --- a/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline.expect @@ -1,10 +1,12 @@ class A { void foo() {} } + class B implements A { @override void foo([int i = 0]) {} } + extension type ET1(B b) implements A {} extension type ET2(B b) implements ET1, B {} void main() {} diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline_modelled.expect index 0fae0c66caa3..10f206d798e0 100644 --- a/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline_modelled.expect @@ -1,10 +1,12 @@ class A { void foo() {} } + class B implements A { @override void foo([int i = 0]) {} } + extension type ET1(B b) implements A {} extension type ET2(B b) implements ET1, B {} void main() {} diff --git a/pkg/front_end/testcases/extension_types/issue53791.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53791.dart.textual_outline.expect index e9b01b43504c..e1c36db81c78 100644 --- a/pkg/front_end/testcases/extension_types/issue53791.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue53791.dart.textual_outline.expect @@ -1,4 +1,5 @@ class A {} + extension type E(Object? it) {} typedef TA = A; typedef TE = E; diff --git a/pkg/front_end/testcases/extension_types/issue53791.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53791.dart.textual_outline_modelled.expect index 91404e41d12b..573faac6c359 100644 --- a/pkg/front_end/testcases/extension_types/issue53791.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue53791.dart.textual_outline_modelled.expect @@ -1,4 +1,5 @@ class A {} + extension type E(Object? it) {} extension type E1(A it) implements A, A {} extension type E2(E it) implements E, E {} diff --git a/pkg/front_end/testcases/extension_types/issue53799.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53799.dart.textual_outline.expect index 6e016de39e3c..d5eae3ad1b73 100644 --- a/pkg/front_end/testcases/extension_types/issue53799.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue53799.dart.textual_outline.expect @@ -1,6 +1,9 @@ class A {} + class B extends A {} + class C extends A {} + extension type E(X it) {} extension type E1(A it) implements A, A {} extension type E2(B it) implements B, A {} diff --git a/pkg/front_end/testcases/extension_types/issue53799.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53799.dart.textual_outline_modelled.expect index 6e016de39e3c..d5eae3ad1b73 100644 --- a/pkg/front_end/testcases/extension_types/issue53799.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue53799.dart.textual_outline_modelled.expect @@ -1,6 +1,9 @@ class A {} + class B extends A {} + class C extends A {} + extension type E(X it) {} extension type E1(A it) implements A, A {} extension type E2(B it) implements B, A {} diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline.expect index c6ae557e09d3..de5c3b4a7895 100644 --- a/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline.expect @@ -1,14 +1,23 @@ class Class {} + extension type ExtensionType(Object? foo) {} extension type E1(Class foo) implements Class {} -extension type E2(Class foo) implements Class {} -extension type E3(Class foo) implements Class {} +extension type E2(Class foo) + implements Class {} +extension type E3(Class foo) + implements Class {} extension type E4(Class foo) implements Class {} -extension type E5(Class foo) implements Class {} -extension type E6(Class foo) implements Class {} +extension type E5(Class foo) + implements Class {} +extension type E6(Class foo) + implements Class {} extension type E7(Object? foo) implements ExtensionType {} -extension type E8(Object? foo) implements ExtensionType {} -extension type E9(Object? foo) implements ExtensionType {} +extension type E8(Object? foo) + implements ExtensionType {} +extension type E9(Object? foo) + implements ExtensionType {} extension type E10(Object? foo) implements ExtensionType {} -extension type E11(Object? foo) implements ExtensionType {} -extension type E12(Object? foo) implements ExtensionType {} +extension type E11(Object? foo) + implements ExtensionType {} +extension type E12(Object? foo) + implements ExtensionType {} diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline_modelled.expect index e2fa479d626b..4a0e3cc72ea3 100644 --- a/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline_modelled.expect @@ -1,14 +1,23 @@ class Class {} + extension type E1(Class foo) implements Class {} extension type E10(Object? foo) implements ExtensionType {} -extension type E11(Object? foo) implements ExtensionType {} -extension type E12(Object? foo) implements ExtensionType {} -extension type E2(Class foo) implements Class {} -extension type E3(Class foo) implements Class {} +extension type E11(Object? foo) + implements ExtensionType {} +extension type E12(Object? foo) + implements ExtensionType {} +extension type E2(Class foo) + implements Class {} +extension type E3(Class foo) + implements Class {} extension type E4(Class foo) implements Class {} -extension type E5(Class foo) implements Class {} -extension type E6(Class foo) implements Class {} +extension type E5(Class foo) + implements Class {} +extension type E6(Class foo) + implements Class {} extension type E7(Object? foo) implements ExtensionType {} -extension type E8(Object? foo) implements ExtensionType {} -extension type E9(Object? foo) implements ExtensionType {} +extension type E8(Object? foo) + implements ExtensionType {} +extension type E9(Object? foo) + implements ExtensionType {} extension type ExtensionType(Object? foo) {} diff --git a/pkg/front_end/testcases/extension_types/method_access.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/method_access.dart.textual_outline.expect index 864251fe5835..067a04d8e855 100644 --- a/pkg/front_end/testcases/extension_types/method_access.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/method_access.dart.textual_outline.expect @@ -2,6 +2,7 @@ extension on Object { int get setter => 42; void set getter(int value) {} } + extension type InlineClass(int it) { test() {} int operator +(int other) => 42; diff --git a/pkg/front_end/testcases/extension_types/method_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/method_access.dart.textual_outline_modelled.expect index 76802db47e95..c6fd222a38cf 100644 --- a/pkg/front_end/testcases/extension_types/method_access.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/method_access.dart.textual_outline_modelled.expect @@ -2,6 +2,7 @@ extension on Object { int get setter => 42; void set getter(int value) {} } + extension type InlineClass(int it) { T genericMethod(T t) => t; int call() => 321; diff --git a/pkg/front_end/testcases/extension_types/non_covariant_type_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/non_covariant_type_parameter.dart.textual_outline.expect index 78cc67bbbd86..6592fef7ec5f 100644 --- a/pkg/front_end/testcases/extension_types/non_covariant_type_parameter.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/non_covariant_type_parameter.dart.textual_outline.expect @@ -10,7 +10,7 @@ extension type ET_ContravariantAlias(Contravariant f) {} extension type ET_InvariantAlias(Invariant f) {} extension type ET_CovariantAlias(Covariant f) {} extension type ET_BivariantAlias(Bivariant f) {} -extension type ET_ContravariantAlias1 (Contravariant Function() f) {} -extension type ET_ContravariantAlias2 (void Function(Covariant) f) {} -extension type ET_CovariantAlias1 (Covariant Function() f) {} -extension type ET_CovariantAlias2 (void Function(Contravariant) f) {} +extension type ET_ContravariantAlias1(Contravariant Function() f) {} +extension type ET_ContravariantAlias2(void Function(Covariant) f) {} +extension type ET_CovariantAlias1(Covariant Function() f) {} +extension type ET_CovariantAlias2(void Function(Contravariant) f) {} diff --git a/pkg/front_end/testcases/extension_types/non_covariant_type_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/non_covariant_type_parameter.dart.textual_outline_modelled.expect index c86987417d53..8d87ac5e79be 100644 --- a/pkg/front_end/testcases/extension_types/non_covariant_type_parameter.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/non_covariant_type_parameter.dart.textual_outline_modelled.expect @@ -2,12 +2,12 @@ extension type ET_Bivariant(T Function(T) f) {} extension type ET_BivariantAlias(Bivariant f) {} extension type ET_Contravariant(void Function(T) f) {} extension type ET_ContravariantAlias(Contravariant f) {} -extension type ET_ContravariantAlias1 (Contravariant Function() f) {} -extension type ET_ContravariantAlias2 (void Function(Covariant) f) {} +extension type ET_ContravariantAlias1(Contravariant Function() f) {} +extension type ET_ContravariantAlias2(void Function(Covariant) f) {} extension type ET_Covariant(T Function() f) {} extension type ET_CovariantAlias(Covariant f) {} -extension type ET_CovariantAlias1 (Covariant Function() f) {} -extension type ET_CovariantAlias2 (void Function(Contravariant) f) {} +extension type ET_CovariantAlias1(Covariant Function() f) {} +extension type ET_CovariantAlias2(void Function(Contravariant) f) {} extension type ET_Invariant(void Function() f) {} extension type ET_InvariantAlias(Invariant f) {} typedef Bivariant = T Function(T); diff --git a/pkg/front_end/testcases/extension_types/nullability.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/nullability.dart.textual_outline.expect index aba3757febf4..9a4fc892e198 100644 --- a/pkg/front_end/testcases/extension_types/nullability.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/nullability.dart.textual_outline.expect @@ -3,8 +3,23 @@ extension type E2(Object? foo) {} extension type E3(E1 foo) {} extension type E4(E1 foo) {} extension type E5(E2 foo) {} -testNotNonNullable(E1 e1numNullableNNN, E1 e1doubleNNN, E2 e2NNN, E3 e3NNN, E4 e4NNN, E5 e5NNN) {} -testNotNullable( E1 e1numNullableNN, E1 e1doubleNN, E2 e2NN, E3 e3NN, E4 e4NN, E5 e5NN, E1? e1numNullableNNNullable, E1? e1doubleNNNullable, E2? e2NNNullable, E3? e3NNNullable, E4? e4NNNullable, E5? e5NNNullable, ) {} +testNotNonNullable(E1 e1numNullableNNN, E1 e1doubleNNN, E2 e2NNN, + E3 e3NNN, E4 e4NNN, E5 e5NNN) {} +testNotNullable( + E1 e1numNullableNN, + E1 e1doubleNN, + E2 e2NN, + E3 e3NN, + E4 e4NN, + E5 e5NN, + E1? e1numNullableNNNullable, + E1? e1doubleNNNullable, + E2? e2NNNullable, + E3? e3NNNullable, + E4? e4NNNullable, + E5? e5NNNullable, +) {} + class A { E1 e1numNullableA; E1 e1doubleA; @@ -19,5 +34,30 @@ class A { E4? e4ANullable; E5? e5ANullable; } -testOptionalPositional([ E1 e1numNullableOP, E1 e1doubleOP, E2 e2OP, E3 e3OP, E4 e4OP, E5 e5OP, E1? e1numNullableOPNullable, E1? e1doubleOPNullable, E2? e2OPNullable, E3? e3OPNullable, E4? e4OPNullable, E5? e5OPNullable ]) {} -testNamedNotRequired({ E1 e1numNullableNNR, E1 e1doubleNNR, E2 e2NNR, E3 e3NNR, E4 e4NNR, E5 e5NNR, E1? e1numNullableNNRNullable, E1? e1doubleNNRNullable, E2? e2NNRNullable, E3? e3NNRNullable, E4? e4NNRNullable, E5? e5NNRNullable }) {} + +testOptionalPositional( + [E1 e1numNullableOP, + E1 e1doubleOP, + E2 e2OP, + E3 e3OP, + E4 e4OP, + E5 e5OP, + E1? e1numNullableOPNullable, + E1? e1doubleOPNullable, + E2? e2OPNullable, + E3? e3OPNullable, + E4? e4OPNullable, + E5? e5OPNullable]) {} +testNamedNotRequired( + {E1 e1numNullableNNR, + E1 e1doubleNNR, + E2 e2NNR, + E3 e3NNR, + E4 e4NNR, + E5 e5NNR, + E1? e1numNullableNNRNullable, + E1? e1doubleNNRNullable, + E2? e2NNRNullable, + E3? e3NNRNullable, + E4? e4NNRNullable, + E5? e5NNRNullable}) {} diff --git a/pkg/front_end/testcases/extension_types/nullability.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/nullability.dart.textual_outline_modelled.expect index 512cd70fd479..353d3641c04a 100644 --- a/pkg/front_end/testcases/extension_types/nullability.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/nullability.dart.textual_outline_modelled.expect @@ -12,12 +12,51 @@ class A { E5? e5ANullable; E5 e5A; } + extension type E1(T foo) {} extension type E2(Object? foo) {} extension type E3(E1 foo) {} extension type E4(E1 foo) {} extension type E5(E2 foo) {} -testNamedNotRequired({ E1 e1numNullableNNR, E1 e1doubleNNR, E2 e2NNR, E3 e3NNR, E4 e4NNR, E5 e5NNR, E1? e1numNullableNNRNullable, E1? e1doubleNNRNullable, E2? e2NNRNullable, E3? e3NNRNullable, E4? e4NNRNullable, E5? e5NNRNullable }) {} -testNotNonNullable(E1 e1numNullableNNN, E1 e1doubleNNN, E2 e2NNN, E3 e3NNN, E4 e4NNN, E5 e5NNN) {} -testNotNullable( E1 e1numNullableNN, E1 e1doubleNN, E2 e2NN, E3 e3NN, E4 e4NN, E5 e5NN, E1? e1numNullableNNNullable, E1? e1doubleNNNullable, E2? e2NNNullable, E3? e3NNNullable, E4? e4NNNullable, E5? e5NNNullable, ) {} -testOptionalPositional([ E1 e1numNullableOP, E1 e1doubleOP, E2 e2OP, E3 e3OP, E4 e4OP, E5 e5OP, E1? e1numNullableOPNullable, E1? e1doubleOPNullable, E2? e2OPNullable, E3? e3OPNullable, E4? e4OPNullable, E5? e5OPNullable ]) {} +testNamedNotRequired( + {E1 e1numNullableNNR, + E1 e1doubleNNR, + E2 e2NNR, + E3 e3NNR, + E4 e4NNR, + E5 e5NNR, + E1? e1numNullableNNRNullable, + E1? e1doubleNNRNullable, + E2? e2NNRNullable, + E3? e3NNRNullable, + E4? e4NNRNullable, + E5? e5NNRNullable}) {} +testNotNonNullable(E1 e1numNullableNNN, E1 e1doubleNNN, E2 e2NNN, + E3 e3NNN, E4 e4NNN, E5 e5NNN) {} +testNotNullable( + E1 e1numNullableNN, + E1 e1doubleNN, + E2 e2NN, + E3 e3NN, + E4 e4NN, + E5 e5NN, + E1? e1numNullableNNNullable, + E1? e1doubleNNNullable, + E2? e2NNNullable, + E3? e3NNNullable, + E4? e4NNNullable, + E5? e5NNNullable, +) {} +testOptionalPositional( + [E1 e1numNullableOP, + E1 e1doubleOP, + E2 e2OP, + E3 e3OP, + E4 e4OP, + E5 e5OP, + E1? e1numNullableOPNullable, + E1? e1doubleOPNullable, + E2? e2OPNullable, + E3? e3OPNullable, + E4? e4OPNullable, + E5? e5OPNullable]) {} diff --git a/pkg/front_end/testcases/extension_types/nullable_access.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/nullable_access.dart.textual_outline.expect index 114d3c14b9d4..cf5cf30e880a 100644 --- a/pkg/front_end/testcases/extension_types/nullable_access.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/nullable_access.dart.textual_outline.expect @@ -1,7 +1,9 @@ extension E on ET? { void foo(int i) {} } + extension type ET(int? i) { void foo() {} } -method(ET et1, ET? et2, X x1, X? x2, Y y1, Y? y2) {} +method( + ET et1, ET? et2, X x1, X? x2, Y y1, Y? y2) {} diff --git a/pkg/front_end/testcases/extension_types/nullable_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/nullable_access.dart.textual_outline_modelled.expect index 114d3c14b9d4..cf5cf30e880a 100644 --- a/pkg/front_end/testcases/extension_types/nullable_access.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/nullable_access.dart.textual_outline_modelled.expect @@ -1,7 +1,9 @@ extension E on ET? { void foo(int i) {} } + extension type ET(int? i) { void foo() {} } -method(ET et1, ET? et2, X x1, X? x2, Y y1, Y? y2) {} +method( + ET et1, ET? et2, X x1, X? x2, Y y1, Y? y2) {} diff --git a/pkg/front_end/testcases/extension_types/pattern_for_in.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/pattern_for_in.dart.textual_outline.expect index 5965363607a7..756841866f3b 100644 --- a/pkg/front_end/testcases/extension_types/pattern_for_in.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/pattern_for_in.dart.textual_outline.expect @@ -1,4 +1,5 @@ import 'dart:async'; + extension type MyList(List it) implements List {} extension type MyStream(Stream it) implements Stream {} method1(MyList list, MyStream stream) async {} diff --git a/pkg/front_end/testcases/extension_types/pattern_for_in.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/pattern_for_in.dart.textual_outline_modelled.expect index 5965363607a7..756841866f3b 100644 --- a/pkg/front_end/testcases/extension_types/pattern_for_in.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/pattern_for_in.dart.textual_outline_modelled.expect @@ -1,4 +1,5 @@ import 'dart:async'; + extension type MyList(List it) implements List {} extension type MyStream(Stream it) implements Stream {} method1(MyList list, MyStream stream) async {} diff --git a/pkg/front_end/testcases/extension_types/redirecting_factory_from_class.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/redirecting_factory_from_class.dart.textual_outline.expect index deacd4812ba5..1ab815aaf93c 100644 --- a/pkg/front_end/testcases/extension_types/redirecting_factory_from_class.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/redirecting_factory_from_class.dart.textual_outline.expect @@ -3,23 +3,28 @@ class A1 { const A1(this.foo); const factory A1.redir(A1 it) = E1.redir; } + extension type const E1(A1 it) implements A1 { const factory E1.redir(A1 it) = E1; } test1() {} + class A2 { final int foo; const A2(this.foo); const factory A2.redir(bool b) = E2.pick; } + class B2 extends A2 { static const B2 element = const B2(0); const B2(super.foo); } + class C2 extends A2 { static const C2 element = const C2(0); const C2(super.foo); } + extension type const E2(A2 it) implements A2 { const E2.pick(bool b) : this(b ? B2.element : C2.element); } diff --git a/pkg/front_end/testcases/extension_types/redirecting_factory_from_class.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/redirecting_factory_from_class.dart.textual_outline_modelled.expect index 787a7688b1ce..a81c23dd9926 100644 --- a/pkg/front_end/testcases/extension_types/redirecting_factory_from_class.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/redirecting_factory_from_class.dart.textual_outline_modelled.expect @@ -3,19 +3,23 @@ class A1 { const factory A1.redir(A1 it) = E1.redir; final int foo; } + class A2 { const A2(this.foo); const factory A2.redir(bool b) = E2.pick; final int foo; } + class B2 extends A2 { const B2(super.foo); static const B2 element = const B2(0); } + class C2 extends A2 { const C2(super.foo); static const C2 element = const C2(0); } + expectIdentical(expected, actual) {} extension type const E1(A1 it) implements A1 { const factory E1.redir(A1 it) = E1; diff --git a/pkg/front_end/testcases/extension_types/representation_field_and_setter.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/representation_field_and_setter.dart.textual_outline.expect index 864072f630eb..645da9ca5b9f 100644 --- a/pkg/front_end/testcases/extension_types/representation_field_and_setter.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/representation_field_and_setter.dart.textual_outline.expect @@ -9,8 +9,10 @@ extension type C1(int property) {} extension type C2(int it) implements C1 { void set property(int value) {} } + class D1 { void set property(D1 value) {} } + extension type D2(D1 property) implements D1 {} main() {} diff --git a/pkg/front_end/testcases/extension_types/representation_field_and_setter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/representation_field_and_setter.dart.textual_outline_modelled.expect index d113e319f373..97ac7b85bde2 100644 --- a/pkg/front_end/testcases/extension_types/representation_field_and_setter.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/representation_field_and_setter.dart.textual_outline_modelled.expect @@ -1,6 +1,7 @@ class D1 { void set property(D1 value) {} } + extension type A(int property) { void set property(int value) {} } diff --git a/pkg/front_end/testcases/extension_types/supertype_conflict.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/supertype_conflict.dart.textual_outline.expect index 6510bc9c1a46..0659053f5b5e 100644 --- a/pkg/front_end/testcases/extension_types/supertype_conflict.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/supertype_conflict.dart.textual_outline.expect @@ -1,4 +1,5 @@ class A {} + extension type B(A it) implements A {} extension type C(A it) implements C {} extension type D(A it) implements A, B {} diff --git a/pkg/front_end/testcases/extension_types/supertype_conflict.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/supertype_conflict.dart.textual_outline_modelled.expect index 6510bc9c1a46..0659053f5b5e 100644 --- a/pkg/front_end/testcases/extension_types/supertype_conflict.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/supertype_conflict.dart.textual_outline_modelled.expect @@ -1,4 +1,5 @@ class A {} + extension type B(A it) implements A {} extension type C(A it) implements C {} extension type D(A it) implements A, B {} diff --git a/pkg/front_end/testcases/extension_types/with_dependencies/issue53209_1/main.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/with_dependencies/issue53209_1/main.dart.textual_outline.expect index 4b3ab9315163..81d558291b32 100644 --- a/pkg/front_end/testcases/extension_types/with_dependencies/issue53209_1/main.dart.textual_outline.expect +++ b/pkg/front_end/testcases/extension_types/with_dependencies/issue53209_1/main.dart.textual_outline.expect @@ -1,4 +1,6 @@ import './main_lib.dart'; + extension type E1(String foo) { - factory E1.redirectingFactoryToSubtype() = E2.redirectingFactoryWithMismatchingParameters; + factory E1.redirectingFactoryToSubtype() = + E2.redirectingFactoryWithMismatchingParameters; } diff --git a/pkg/front_end/testcases/extension_types/with_dependencies/issue53209_1/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/with_dependencies/issue53209_1/main.dart.textual_outline_modelled.expect index 4b3ab9315163..81d558291b32 100644 --- a/pkg/front_end/testcases/extension_types/with_dependencies/issue53209_1/main.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/with_dependencies/issue53209_1/main.dart.textual_outline_modelled.expect @@ -1,4 +1,6 @@ import './main_lib.dart'; + extension type E1(String foo) { - factory E1.redirectingFactoryToSubtype() = E2.redirectingFactoryWithMismatchingParameters; + factory E1.redirectingFactoryToSubtype() = + E2.redirectingFactoryWithMismatchingParameters; } diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status index 5a66a61947b5..29741e24a626 100644 --- a/pkg/front_end/testcases/textual_outline.status +++ b/pkg/front_end/testcases/textual_outline.status @@ -5,6 +5,51 @@ # Status file for the textual_outline_suite.dart test suite. This is testing # the textual outline used for better incremental compilation. +super_parameters/issue47741: FormatterCrash # https://github.com/dart-lang/dart_style/issues/1321 + +# These tests have errors in them which isn't reported by the parser but the +# formatter still sees as syntax errors and thus won't format. +# Before the extension_types flag is flipped they are allowed to crash though, +# so for now they're marked as both crashing and passing. +extension_types/field_access: FormatterCrash, Pass +extension_types/issue52119: FormatterCrash, Pass +extension_types/issue53212: FormatterCrash, Pass +extension_types/representation: FormatterCrash, Pass + +# These tests have errors in them which isn't reported by the parser but the +# formatter still sees as syntax errors and thus won't format. +general/base_class_declaration: FormatterCrash +general/constants/non_const_constructor: FormatterCrash +general/constants/various: FormatterCrash +general/constants/various2: FormatterCrash +general/enum_super_constructor: FormatterCrash +general/extension_type_declaration_disabled: FormatterCrash +general/final_class_declaration: FormatterCrash +general/interface_class_declaration: FormatterCrash +general/invalid_operator: FormatterCrash +general/invalid_super_initializer: FormatterCrash +general/issue_46886: FormatterCrash +general/issue45700.crash: FormatterCrash +general/issue48487: FormatterCrash +general/issue48487b: FormatterCrash +general/issue48919: FormatterCrash +general/macro_class: FormatterCrash +general/mixin_class_declaration: FormatterCrash +general/null_safety_invalid_experiment_and_language_version: FormatterCrash +general/null_safety_invalid_experiment: FormatterCrash +general/records_opt_out: FormatterCrash +general/sealed_class_declaration: FormatterCrash +nnbd_mixed/inheritance_from_opt_in: FormatterCrash +nnbd_mixed/issue41597: FormatterCrash +nnbd_mixed/null_safety_invalid_language_version: FormatterCrash +nonfunction_type_aliases/old_version: FormatterCrash +records/record_type_unsupported: FormatterCrash +regress/issue_30994: FormatterCrash +regress/issue_31198: FormatterCrash +super_parameters/opt_out: FormatterCrash +super_parameters/var_before_super: FormatterCrash +triple_shift/invalid_operator: FormatterCrash + general/error_recovery/issue_38415.crash: EmptyOutput general/error_recovery/issue_39024.crash: EmptyOutput general/error_recovery/issue_39058.crash: EmptyOutput From 77ec617fd84435d0de229220e65c942b301c612e Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Tue, 14 Nov 2023 13:50:51 +0000 Subject: [PATCH 4/4] [cfe] Add test for issue 53610 Closes #53610 Change-Id: Id8efa1cc31617fdd0f323cc1397db4c7519b370a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/335522 Commit-Queue: Johnni Winther Reviewed-by: Jens Johansen --- .../testcases/extension_types/issue53610.dart | 10 +++++++++ .../issue53610.dart.strong.expect | 17 ++++++++++++++ .../issue53610.dart.strong.transformed.expect | 22 +++++++++++++++++++ .../issue53610.dart.textual_outline.expect | 2 ++ ...53610.dart.textual_outline_modelled.expect | 2 ++ .../issue53610.dart.weak.expect | 17 ++++++++++++++ .../issue53610.dart.weak.modular.expect | 17 ++++++++++++++ .../issue53610.dart.weak.outline.expect | 14 ++++++++++++ .../issue53610.dart.weak.transformed.expect | 22 +++++++++++++++++++ 9 files changed, 123 insertions(+) create mode 100644 pkg/front_end/testcases/extension_types/issue53610.dart create mode 100644 pkg/front_end/testcases/extension_types/issue53610.dart.strong.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53610.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53610.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53610.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53610.dart.weak.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53610.dart.weak.modular.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53610.dart.weak.outline.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53610.dart.weak.transformed.expect diff --git a/pkg/front_end/testcases/extension_types/issue53610.dart b/pkg/front_end/testcases/extension_types/issue53610.dart new file mode 100644 index 000000000000..44baa31f455d --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53610.dart @@ -0,0 +1,10 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +extension type const N(Null _) {} + +void main() { + var n = N(null); + const cn = N(null); +} \ No newline at end of file diff --git a/pkg/front_end/testcases/extension_types/issue53610.dart.strong.expect b/pkg/front_end/testcases/extension_types/issue53610.dart.strong.expect new file mode 100644 index 000000000000..4f226ab53be1 --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53610.dart.strong.expect @@ -0,0 +1,17 @@ +library; +import self as self; + +extension type N(Null _) { + abstract extension-type-member representation-field get _() → Null; + constructor • = self::N|constructor#; + constructor tearoff • = self::N|constructor#_#new#tearOff; +} +static extension-type-member method N|constructor#(Null _) → self::N /* = Null */ { + lowered final self::N /* = Null */ #this = _; + return #this; +} +static extension-type-member method N|constructor#_#new#tearOff(Null _) → self::N /* = Null */ + return self::N|constructor#(_); +static method main() → void { + self::N /* = Null */ n = self::N|constructor#(null); +} diff --git a/pkg/front_end/testcases/extension_types/issue53610.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/issue53610.dart.strong.transformed.expect new file mode 100644 index 000000000000..9c7e3a94d9ed --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53610.dart.strong.transformed.expect @@ -0,0 +1,22 @@ +library; +import self as self; + +extension type N(Null _) { + abstract extension-type-member representation-field get _() → Null; + constructor • = self::N|constructor#; + constructor tearoff • = self::N|constructor#_#new#tearOff; +} +static extension-type-member method N|constructor#(Null _) → self::N /* = Null */ { + lowered final self::N /* = Null */ #this = _; + return #this; +} +static extension-type-member method N|constructor#_#new#tearOff(Null _) → self::N /* = Null */ + return self::N|constructor#(_); +static method main() → void { + self::N /* = Null */ n = self::N|constructor#(null); +} + + +Extra constant evaluation status: +Evaluated: FactoryConstructorInvocation @ org-dartlang-testcase:///issue53610.dart:8:11 -> NullConstant(null) +Extra constant evaluation: evaluated: 5, effectively constant: 1 diff --git a/pkg/front_end/testcases/extension_types/issue53610.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53610.dart.textual_outline.expect new file mode 100644 index 000000000000..b802ceff062e --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53610.dart.textual_outline.expect @@ -0,0 +1,2 @@ +extension type const N(Null _) {} +void main() {} diff --git a/pkg/front_end/testcases/extension_types/issue53610.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53610.dart.textual_outline_modelled.expect new file mode 100644 index 000000000000..b802ceff062e --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53610.dart.textual_outline_modelled.expect @@ -0,0 +1,2 @@ +extension type const N(Null _) {} +void main() {} diff --git a/pkg/front_end/testcases/extension_types/issue53610.dart.weak.expect b/pkg/front_end/testcases/extension_types/issue53610.dart.weak.expect new file mode 100644 index 000000000000..4f226ab53be1 --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53610.dart.weak.expect @@ -0,0 +1,17 @@ +library; +import self as self; + +extension type N(Null _) { + abstract extension-type-member representation-field get _() → Null; + constructor • = self::N|constructor#; + constructor tearoff • = self::N|constructor#_#new#tearOff; +} +static extension-type-member method N|constructor#(Null _) → self::N /* = Null */ { + lowered final self::N /* = Null */ #this = _; + return #this; +} +static extension-type-member method N|constructor#_#new#tearOff(Null _) → self::N /* = Null */ + return self::N|constructor#(_); +static method main() → void { + self::N /* = Null */ n = self::N|constructor#(null); +} diff --git a/pkg/front_end/testcases/extension_types/issue53610.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/issue53610.dart.weak.modular.expect new file mode 100644 index 000000000000..4f226ab53be1 --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53610.dart.weak.modular.expect @@ -0,0 +1,17 @@ +library; +import self as self; + +extension type N(Null _) { + abstract extension-type-member representation-field get _() → Null; + constructor • = self::N|constructor#; + constructor tearoff • = self::N|constructor#_#new#tearOff; +} +static extension-type-member method N|constructor#(Null _) → self::N /* = Null */ { + lowered final self::N /* = Null */ #this = _; + return #this; +} +static extension-type-member method N|constructor#_#new#tearOff(Null _) → self::N /* = Null */ + return self::N|constructor#(_); +static method main() → void { + self::N /* = Null */ n = self::N|constructor#(null); +} diff --git a/pkg/front_end/testcases/extension_types/issue53610.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/issue53610.dart.weak.outline.expect new file mode 100644 index 000000000000..0485342d0f1b --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53610.dart.weak.outline.expect @@ -0,0 +1,14 @@ +library; +import self as self; + +extension type N(Null _) { + abstract extension-type-member representation-field get _() → Null; + constructor • = self::N|constructor#; + constructor tearoff • = self::N|constructor#_#new#tearOff; +} +static extension-type-member method N|constructor#(Null _) → self::N /* = Null */ + ; +static extension-type-member method N|constructor#_#new#tearOff(Null _) → self::N /* = Null */ + return self::N|constructor#(_); +static method main() → void + ; diff --git a/pkg/front_end/testcases/extension_types/issue53610.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/issue53610.dart.weak.transformed.expect new file mode 100644 index 000000000000..9c7e3a94d9ed --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53610.dart.weak.transformed.expect @@ -0,0 +1,22 @@ +library; +import self as self; + +extension type N(Null _) { + abstract extension-type-member representation-field get _() → Null; + constructor • = self::N|constructor#; + constructor tearoff • = self::N|constructor#_#new#tearOff; +} +static extension-type-member method N|constructor#(Null _) → self::N /* = Null */ { + lowered final self::N /* = Null */ #this = _; + return #this; +} +static extension-type-member method N|constructor#_#new#tearOff(Null _) → self::N /* = Null */ + return self::N|constructor#(_); +static method main() → void { + self::N /* = Null */ n = self::N|constructor#(null); +} + + +Extra constant evaluation status: +Evaluated: FactoryConstructorInvocation @ org-dartlang-testcase:///issue53610.dart:8:11 -> NullConstant(null) +Extra constant evaluation: evaluated: 5, effectively constant: 1