[cfe] Implement matchMapType for the shared analysis of patterns

Part of https://github.com/dart-lang/sdk/issues/49749

Closes https://github.com/dart-lang/sdk/issues/51523

Change-Id: I4875020510246761878e71b969698cbd1baa0de0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/286822
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
Chloe Stefantsova 2023-03-06 08:47:38 +00:00 committed by Commit Queue
parent cb7366482c
commit 874e7ee056
35 changed files with 251 additions and 64 deletions

View file

@ -9000,11 +9000,12 @@ class InferenceVisitorImpl extends InferenceVisitorBase
int? stackBase;
assert(checkStackBase(node, stackBase = stackHeight));
// TODO(cstefantsova): Support late variables.
analyzePatternVariableDeclaration(node, node.pattern, node.initializer,
isFinal: node.isFinal, isLate: false);
Pattern pattern = node.pattern;
Expression initializer = node.initializer;
// TODO(cstefantsova): Support late variables.
analyzePatternVariableDeclaration(node, pattern, initializer,
isFinal: node.isFinal, isLate: false);
assert(checkStack(node, stackBase, [
/* pattern = */ ValueKinds.Pattern,
@ -9016,12 +9017,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase
pattern = rewrite as Pattern;
}
Expression initializer = node.initializer;
assert(checkStack(node, stackBase, [
/* initializer = */ ValueKinds.Expression,
]));
rewrite = popRewrite();
if (!identical(initializer, rewrite)) {
initializer = rewrite as Expression;
@ -10685,11 +10680,14 @@ class InferenceVisitorImpl extends InferenceVisitorBase
node.matchedType = flow.getMatchedValueType();
MapPatternTypeArguments<DartType>? typeArguments =
node.keyType == null && node.valueType == null
? null
: new MapPatternTypeArguments<DartType>(
keyType: node.keyType ?? const DynamicType(),
valueType: node.valueType ?? const DynamicType());
DartType mapType = analyzeMapPattern(context, node,
typeArguments: new MapPatternTypeArguments<DartType>(
keyType: node.keyType ?? const DynamicType(),
valueType: node.valueType ?? const DynamicType()),
elements: node.entries);
typeArguments: typeArguments, elements: node.entries);
// TODO(johnniwinther): How does `mapType` relate to `node.mapType`?
DartType keyType = node.keyType ?? const DynamicType();

View file

@ -568,8 +568,20 @@ class OperationsCfe
@override
MapPatternTypeArguments<DartType>? matchMapType(DartType type) {
// TODO: implement matchMapType
throw new UnimplementedError('TODO(scheglov)');
if (type is! InterfaceType) {
return null;
} else {
InterfaceType? mapType = typeEnvironment.getTypeAsInstanceOf(
type, typeEnvironment.coreTypes.mapClass, typeEnvironment.coreTypes,
isNonNullableByDefault: isNonNullableByDefault);
if (mapType == null) {
return null;
} else {
return new MapPatternTypeArguments<DartType>(
keyType: mapType.typeArguments[0],
valueType: mapType.typeArguments[1]);
}
}
}
@override

View file

@ -16,7 +16,7 @@ static method test(core::Object? o) → core::String {
}
}
else
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final dynamic #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} in true)) {
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final dynamic #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::Object? in true)) {
{
toReturn = "map";
break #L1;

View file

@ -16,7 +16,7 @@ static method test(core::Object? o) → core::String {
}
}
else
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final core::bool* #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final dynamic #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} in true)) {
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final core::bool* #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final core::Object? #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} in true)) {
{
toReturn = "map";
break #L1;

View file

@ -16,7 +16,7 @@ static method test(core::Object? o) → core::String {
}
}
else
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final dynamic #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} in true)) {
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final dynamic #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::Object? in true)) {
{
toReturn = "map";
break #L1;

View file

@ -16,7 +16,7 @@ static method test(core::Object? o) → core::String {
}
}
else
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final dynamic #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} in true)) {
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final dynamic #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::Object? in true)) {
{
toReturn = "map";
break #L1;

View file

@ -16,7 +16,7 @@ static method test(core::Object? o) → core::String {
}
}
else
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final core::bool* #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final dynamic #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} in true)) {
if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final core::bool* #t2 = #0#2#isSet = true in #0#2 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final core::Object? #t3 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C3){(core::Object?) → dynamic} in true)) {
{
toReturn = "map";
break #L1;

View file

@ -0,0 +1,11 @@
// 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.
class C<T> {
const C();
}
void main() {
var {const C(): a1} = <C<String>, int>{const C<String>(): 1};
}

View file

@ -0,0 +1,29 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
const constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
}
static method main() → void {
core::int a1;
{
final dynamic #0#0 = <self::C<core::String>, core::int>{#C1: 1};
if(!(#0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::containsKey}(#C1){(core::Object?) → core::bool} && (let final dynamic #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(#C1){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}
constants {
#C1 = self::C<core::String> {}
#C2 = 1
}
Constructor coverage from constants:
org-dartlang-testcase:///issue51523.dart:
- C. (from org-dartlang-testcase:///issue51523.dart:6:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)

View file

@ -0,0 +1,29 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
const constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
}
static method main() → void {
core::int a1;
{
final dynamic #0#0 = <self::C<core::String>, core::int>{#C1: 1};
if(!(#0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::containsKey}(#C1){(core::Object?) → core::bool} && (let final core::int #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(#C1){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}
constants {
#C1 = self::C<core::String> {}
#C2 = 1
}
Constructor coverage from constants:
org-dartlang-testcase:///issue51523.dart:
- C. (from org-dartlang-testcase:///issue51523.dart:6:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)

View file

@ -0,0 +1,5 @@
class C<T> {
const C();
}
void main() {}

View file

@ -0,0 +1,5 @@
class C<T> {
const C();
}
void main() {}

View file

@ -0,0 +1,29 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
const constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
}
static method main() → void {
core::int a1;
{
final dynamic #0#0 = <self::C<core::String>, core::int>{#C1: 1};
if(!(#0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::containsKey}(#C1){(core::Object?) → core::bool} && (let final dynamic #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(#C1){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}
constants {
#C1 = self::C<core::String*> {}
#C2 = 1
}
Constructor coverage from constants:
org-dartlang-testcase:///issue51523.dart:
- C. (from org-dartlang-testcase:///issue51523.dart:6:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)

View file

@ -0,0 +1,29 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
const constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
}
static method main() → void {
core::int a1;
{
final dynamic #0#0 = <self::C<core::String>, core::int>{#C1: 1};
if(!(#0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::containsKey}(#C1){(core::Object?) → core::bool} && (let final dynamic #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(#C1){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}
constants {
#C1 = self::C<core::String*> {}
#C2 = 1
}
Constructor coverage from constants:
org-dartlang-testcase:///issue51523.dart:
- C. (from org-dartlang-testcase:///issue51523.dart:6:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)

View file

@ -0,0 +1,11 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
const constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
}
static method main() → void
;

View file

@ -0,0 +1,29 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/ {
const constructor •() → self::C<self::C::T%>
: super core::Object::•()
;
}
static method main() → void {
core::int a1;
{
final dynamic #0#0 = <self::C<core::String>, core::int>{#C1: 1};
if(!(#0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::containsKey}(#C1){(core::Object?) → core::bool} && (let final core::int #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(#C1){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}
constants {
#C1 = self::C<core::String*> {}
#C2 = 1
}
Constructor coverage from constants:
org-dartlang-testcase:///issue51523.dart:
- C. (from org-dartlang-testcase:///issue51523.dart:6:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)

View file

@ -6,7 +6,7 @@ static method test(dynamic x) → dynamic {
#L1:
{
final dynamic #0#0 = x;
if(let final dynamic #t1 = #0#0 as{ForNonNullableByDefault} core::Object in (#0#0 as{ForNonNullableByDefault} core::Object) is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::containsKey}(#C2){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::[]}(#C2){(core::Object?) → dynamic}) {
if(let final dynamic #t1 = #0#0 as{ForNonNullableByDefault} core::Object in (#0#0 as{ForNonNullableByDefault} core::Object) is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::containsKey}(#C2){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::[]}(#C2){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::Object?) {
{
break #L1;
}

View file

@ -6,7 +6,7 @@ static method test(dynamic x) → dynamic {
#L1:
{
final dynamic #0#0 = x;
if(let final dynamic #t1 = #0#0 as{ForNonNullableByDefault} core::Object in (#0#0 as{ForNonNullableByDefault} core::Object) is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::containsKey}(#C2){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::[]}(#C2){(core::Object?) → dynamic}) {
if(let final dynamic #t1 = #0#0 as{ForNonNullableByDefault} core::Object in (#0#0 as{ForNonNullableByDefault} core::Object) is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::containsKey}(#C2){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::[]}(#C2){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::Object?) {
{
break #L1;
}

View file

@ -6,7 +6,7 @@ static method test(dynamic x) → dynamic {
#L1:
{
final dynamic #0#0 = x;
if(let final dynamic #t1 = #0#0 as{ForNonNullableByDefault} core::Object in (#0#0 as{ForNonNullableByDefault} core::Object) is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::containsKey}(#C2){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::[]}(#C2){(core::Object?) → dynamic}) {
if(let final dynamic #t1 = #0#0 as{ForNonNullableByDefault} core::Object in (#0#0 as{ForNonNullableByDefault} core::Object) is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::containsKey}(#C2){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} ((#0#0 as{ForNonNullableByDefault} core::Object) as{ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::[]}(#C2){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::Object?) {
{
break #L1;
}

View file

@ -28,7 +28,7 @@ static method test2(dynamic x) → dynamic {
static method test3(core::Map<core::bool, core::double> x) → dynamic {
{
final core::Map<core::bool, core::double> #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::double) {
}
}
{
@ -40,7 +40,7 @@ static method test3(core::Map<core::bool, core::double> x) → dynamic {
static method test4(self::MyMap x) → dynamic {
{
final self::MyMap #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int) {
}
}
}

View file

@ -28,7 +28,7 @@ static method test2(dynamic x) → dynamic {
static method test3(core::Map<core::bool, core::double> x) → dynamic {
{
final core::Map<core::bool, core::double> #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::double) {
}
}
{
@ -40,7 +40,7 @@ static method test3(core::Map<core::bool, core::double> x) → dynamic {
static method test4(self::MyMap x) → dynamic {
{
final self::MyMap #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int) {
}
}
}

View file

@ -28,7 +28,7 @@ static method test2(dynamic x) → dynamic {
static method test3(core::Map<core::bool, core::double> x) → dynamic {
{
final core::Map<core::bool, core::double> #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::double) {
}
}
{
@ -40,7 +40,7 @@ static method test3(core::Map<core::bool, core::double> x) → dynamic {
static method test4(self::MyMap x) → dynamic {
{
final self::MyMap #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int) {
}
}
}

View file

@ -28,7 +28,7 @@ static method test2(dynamic x) → dynamic {
static method test3(core::Map<core::bool, core::double> x) → dynamic {
{
final core::Map<core::bool, core::double> #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::double) {
}
}
{
@ -40,7 +40,7 @@ static method test3(core::Map<core::bool, core::double> x) → dynamic {
static method test4(self::MyMap x) → dynamic {
{
final self::MyMap #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int) {
}
}
}

View file

@ -28,7 +28,7 @@ static method test2(dynamic x) → dynamic {
static method test3(core::Map<core::bool, core::double> x) → dynamic {
{
final core::Map<core::bool, core::double> #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool} && #C8 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C7){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::double) {
}
}
{
@ -40,7 +40,7 @@ static method test3(core::Map<core::bool, core::double> x) → dynamic {
static method test4(self::MyMap x) → dynamic {
{
final self::MyMap #0#0 = x;
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic}) {
if(#0#0.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0.{core::Map::containsKey}(#C10){(core::Object?) → core::bool} && #C3 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C10){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int && #0#0.{core::Map::containsKey}(#C11){(core::Object?) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::Map::[]}(#C11){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int) {
}
}
}

View file

@ -29,7 +29,7 @@ class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstr
static method foo() → core::Map<self::C<core::String>, core::int>
return throw 0;
static method test() → dynamic {
dynamic a1;
core::int a1;
{
final dynamic #0#0 = self::foo();
final const dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
@ -39,7 +39,7 @@ static method test() → dynamic {
var {const C(:var t): a1} = foo();
^"){(core::Object?) → core::bool} && (let final dynamic #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
var {const C(:var t): a1} = foo();
^"){(core::Object?) → dynamic} in true)))
^"){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}

View file

@ -29,7 +29,7 @@ class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstr
static method foo() → core::Map<self::C<core::String>, core::int>
return throw 0;
static method test() → dynamic {
dynamic a1;
core::int a1;
{
final dynamic #0#0 = self::foo();
final const dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
@ -37,9 +37,9 @@ static method test() → dynamic {
^";
if(!(#0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::containsKey}(invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
var {const C(:var t): a1} = foo();
^"){(core::Object?) → core::bool} && (let final core::int? #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
^"){(core::Object?) → core::bool} && (let final core::int #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
var {const C(:var t): a1} = foo();
^"){(core::Object?) → dynamic} in true)))
^"){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}

View file

@ -29,7 +29,7 @@ class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstr
static method foo() → core::Map<self::C<core::String>, core::int>
return throw 0;
static method test() → dynamic {
dynamic a1;
core::int a1;
{
final dynamic #0#0 = self::foo();
final const dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
@ -39,7 +39,7 @@ static method test() → dynamic {
var {const C(:var t): a1} = foo();
^"){(core::Object?) → core::bool} && (let final dynamic #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
var {const C(:var t): a1} = foo();
^"){(core::Object?) → dynamic} in true)))
^"){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}

View file

@ -29,7 +29,7 @@ class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstr
static method foo() → core::Map<self::C<core::String>, core::int>
return throw 0;
static method test() → dynamic {
dynamic a1;
core::int a1;
{
final dynamic #0#0 = self::foo();
final const dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
@ -39,7 +39,7 @@ static method test() → dynamic {
var {const C(:var t): a1} = foo();
^"){(core::Object?) → core::bool} && (let final dynamic #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
var {const C(:var t): a1} = foo();
^"){(core::Object?) → dynamic} in true)))
^"){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}

View file

@ -29,7 +29,7 @@ class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstr
static method foo() → core::Map<self::C<core::String>, core::int>
return throw 0;
static method test() → dynamic {
dynamic a1;
core::int a1;
{
final dynamic #0#0 = self::foo();
final const dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
@ -37,9 +37,9 @@ static method test() → dynamic {
^";
if(!(#0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::containsKey}(invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
var {const C(:var t): a1} = foo();
^"){(core::Object?) → core::bool} && (let final core::int? #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
^"){(core::Object?) → core::bool} && (let final core::int #t1 = a1 = #0#0{core::Map<self::C<core::String>, core::int>}.{core::Map::[]}(invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
var {const C(:var t): a1} = foo();
^"){(core::Object?) → dynamic} in true)))
^"){(core::Object?) → dynamic} as{ForNonNullableByDefault} core::int in true)))
throw new _in::ReachabilityError::•();
}
}

View file

@ -38,9 +38,9 @@ library /*isNonNullableByDefault*/;
// pkg/front_end/testcases/records/type_record_as_supertype.dart:22:16: Error: 'RR' is restricted and can't be extended or implemented.
// abstract class C2 with RR {} // Error.
// ^
// sdk/lib/core/record.dart:11:22: Context: This is the type denoted by the type alias.
// abstract final class Record {}
// ^
// sdk/lib/core/record.dart:11:16: Context: This is the type denoted by the type alias.
// abstract class Record {}
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -38,9 +38,9 @@ library /*isNonNullableByDefault*/;
// pkg/front_end/testcases/records/type_record_as_supertype.dart:22:16: Error: 'RR' is restricted and can't be extended or implemented.
// abstract class C2 with RR {} // Error.
// ^
// sdk/lib/core/record.dart:11:22: Context: This is the type denoted by the type alias.
// abstract final class Record {}
// ^
// sdk/lib/core/record.dart:11:16: Context: This is the type denoted by the type alias.
// abstract class Record {}
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -38,9 +38,9 @@ library /*isNonNullableByDefault*/;
// pkg/front_end/testcases/records/type_record_as_supertype.dart:22:16: Error: 'RR' is restricted and can't be extended or implemented.
// abstract class C2 with RR {} // Error.
// ^
// sdk/lib/core/record.dart:11:22: Context: This is the type denoted by the type alias.
// abstract final class Record {}
// ^
// sdk/lib/core/record.dart:11:16: Context: This is the type denoted by the type alias.
// abstract class Record {}
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -38,9 +38,9 @@ library /*isNonNullableByDefault*/;
// pkg/front_end/testcases/records/type_record_as_supertype.dart:22:16: Error: 'RR' is restricted and can't be extended or implemented.
// abstract class C2 with RR {} // Error.
// ^
// sdk/lib/core/record.dart:11:22: Context: This is the type denoted by the type alias.
// abstract final class Record {}
// ^
// sdk/lib/core/record.dart:11:16: Context: This is the type denoted by the type alias.
// abstract class Record {}
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -38,9 +38,9 @@ library /*isNonNullableByDefault*/;
// pkg/front_end/testcases/records/type_record_as_supertype.dart:22:16: Error: 'RR' is restricted and can't be extended or implemented.
// abstract class C2 with RR {} // Error.
// ^
// sdk/lib/core/record.dart:11:22: Context: This is the type denoted by the type alias.
// abstract final class Record {}
// ^
// sdk/lib/core/record.dart:11:16: Context: This is the type denoted by the type alias.
// abstract class Record {}
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -38,9 +38,9 @@ library /*isNonNullableByDefault*/;
// pkg/front_end/testcases/records/type_record_as_supertype.dart:22:16: Error: 'RR' is restricted and can't be extended or implemented.
// abstract class C2 with RR {} // Error.
// ^
// sdk/lib/core/record.dart:11:22: Context: This is the type denoted by the type alias.
// abstract final class Record {}
// ^
// sdk/lib/core/record.dart:11:16: Context: This is the type denoted by the type alias.
// abstract class Record {}
// ^
//
import self as self;
import "dart:core" as core;