mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 15:21:54 +00:00
[cfe] fix order of pattern fields
Fixes #50826 Change-Id: I5e71c4dd0e4f937c4570e4851cd4c1e3446d888a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/277003 Commit-Queue: Chloe Stefantsova <cstefantsova@google.com> Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
parent
cdd9e43b2c
commit
f8307ed296
|
@ -8337,6 +8337,13 @@ class BodyBuilder extends StackListenerImpl
|
|||
// TODO(cstefantsova): Report an error.
|
||||
}
|
||||
}
|
||||
if (fields != null) {
|
||||
for (int i = 0, j = fields.length - 1; i < j; i++, j--) {
|
||||
NamedPattern field = fields[i];
|
||||
fields[i] = fields[j];
|
||||
fields[j] = field;
|
||||
}
|
||||
}
|
||||
push(fields ?? NullValue.PatternList);
|
||||
}
|
||||
|
||||
|
|
16
pkg/front_end/testcases/patterns/fields_order.dart
Normal file
16
pkg/front_end/testcases/patterns/fields_order.dart
Normal file
|
@ -0,0 +1,16 @@
|
|||
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
class A {
|
||||
String get foo => "foo";
|
||||
Object? get bar => null;
|
||||
}
|
||||
|
||||
test(dynamic x) {
|
||||
if (x case A(foo: "", bar: String y as String)) {
|
||||
return y;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object {
|
||||
synthetic constructor •() → self::A
|
||||
: super core::Object::•()
|
||||
;
|
||||
get foo() → core::String
|
||||
return "foo";
|
||||
get bar() → core::Object?
|
||||
return null;
|
||||
}
|
||||
static method test(dynamic x) → dynamic {
|
||||
final dynamic #t1 = x;
|
||||
final core::bool #t2 = true;
|
||||
final dynamic #t3 = #t1;
|
||||
if(#t3 is self::A) {
|
||||
final core::String #t4 = #t3{self::A}.{self::A::foo}{core::String};
|
||||
final core::Object? #t5 = #t3{self::A}.{self::A::bar}{core::Object?};
|
||||
if(#t4 =={core::String::==}{(core::Object) → core::bool} "") {
|
||||
final core::String #t6 = #t5 as{ForNonNullableByDefault} core::String;
|
||||
final core::String #t7 = #t6;
|
||||
if(#t7 is core::String) {
|
||||
#t2 = false;
|
||||
{
|
||||
core::String y = #t7{core::String};
|
||||
{
|
||||
return y;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(#t2) {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object {
|
||||
synthetic constructor •() → self::A
|
||||
: super core::Object::•()
|
||||
;
|
||||
get foo() → core::String
|
||||
return "foo";
|
||||
get bar() → core::Object?
|
||||
return null;
|
||||
}
|
||||
static method test(dynamic x) → dynamic {
|
||||
final dynamic #t1 = x;
|
||||
final core::bool #t2 = true;
|
||||
final dynamic #t3 = #t1;
|
||||
if(#t3 is self::A) {
|
||||
final core::String #t4 = #t3{self::A}.{self::A::foo}{core::String};
|
||||
final core::Object? #t5 = #t3{self::A}.{self::A::bar}{core::Object?};
|
||||
if(#t4 =={core::String::==}{(core::Object) → core::bool} "") {
|
||||
final core::String #t6 = #t5 as{ForNonNullableByDefault} core::String;
|
||||
final core::String #t7 = #t6;
|
||||
if(#t7 is core::String) {
|
||||
#t2 = false;
|
||||
{
|
||||
core::String y = #t7{core::String};
|
||||
{
|
||||
return y;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(#t2) {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
class A {
|
||||
String get foo => "foo";
|
||||
Object? get bar => null;
|
||||
}
|
||||
|
||||
test(dynamic x) {}
|
|
@ -0,0 +1,6 @@
|
|||
class A {
|
||||
Object? get bar => null;
|
||||
String get foo => "foo";
|
||||
}
|
||||
|
||||
test(dynamic x) {}
|
|
@ -0,0 +1,38 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object {
|
||||
synthetic constructor •() → self::A
|
||||
: super core::Object::•()
|
||||
;
|
||||
get foo() → core::String
|
||||
return "foo";
|
||||
get bar() → core::Object?
|
||||
return null;
|
||||
}
|
||||
static method test(dynamic x) → dynamic {
|
||||
final dynamic #t1 = x;
|
||||
final core::bool #t2 = true;
|
||||
final dynamic #t3 = #t1;
|
||||
if(#t3 is self::A) {
|
||||
final core::String #t4 = #t3{self::A}.{self::A::foo}{core::String};
|
||||
final core::Object? #t5 = #t3{self::A}.{self::A::bar}{core::Object?};
|
||||
if(#t4 =={core::String::==}{(core::Object) → core::bool} "") {
|
||||
final core::String #t6 = #t5 as{ForNonNullableByDefault} core::String;
|
||||
final core::String #t7 = #t6;
|
||||
if(#t7 is core::String) {
|
||||
#t2 = false;
|
||||
{
|
||||
core::String y = #t7{core::String};
|
||||
{
|
||||
return y;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(#t2) {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object {
|
||||
synthetic constructor •() → self::A
|
||||
: super core::Object::•()
|
||||
;
|
||||
get foo() → core::String
|
||||
return "foo";
|
||||
get bar() → core::Object?
|
||||
return null;
|
||||
}
|
||||
static method test(dynamic x) → dynamic {
|
||||
final dynamic #t1 = x;
|
||||
final core::bool #t2 = true;
|
||||
final dynamic #t3 = #t1;
|
||||
if(#t3 is self::A) {
|
||||
final core::String #t4 = #t3{self::A}.{self::A::foo}{core::String};
|
||||
final core::Object? #t5 = #t3{self::A}.{self::A::bar}{core::Object?};
|
||||
if(#t4 =={core::String::==}{(core::Object) → core::bool} "") {
|
||||
final core::String #t6 = #t5 as{ForNonNullableByDefault} core::String;
|
||||
final core::String #t7 = #t6;
|
||||
if(#t7 is core::String) {
|
||||
#t2 = false;
|
||||
{
|
||||
core::String y = #t7{core::String};
|
||||
{
|
||||
return y;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(#t2) {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object {
|
||||
synthetic constructor •() → self::A
|
||||
;
|
||||
get foo() → core::String
|
||||
;
|
||||
get bar() → core::Object?
|
||||
;
|
||||
}
|
||||
static method test(dynamic x) → dynamic
|
||||
;
|
|
@ -0,0 +1,38 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object {
|
||||
synthetic constructor •() → self::A
|
||||
: super core::Object::•()
|
||||
;
|
||||
get foo() → core::String
|
||||
return "foo";
|
||||
get bar() → core::Object?
|
||||
return null;
|
||||
}
|
||||
static method test(dynamic x) → dynamic {
|
||||
final dynamic #t1 = x;
|
||||
final core::bool #t2 = true;
|
||||
final dynamic #t3 = #t1;
|
||||
if(#t3 is self::A) {
|
||||
final core::String #t4 = #t3{self::A}.{self::A::foo}{core::String};
|
||||
final core::Object? #t5 = #t3{self::A}.{self::A::bar}{core::Object?};
|
||||
if(#t4 =={core::String::==}{(core::Object) → core::bool} "") {
|
||||
final core::String #t6 = #t5 as{ForNonNullableByDefault} core::String;
|
||||
final core::String #t7 = #t6;
|
||||
if(#t7 is core::String) {
|
||||
#t2 = false;
|
||||
{
|
||||
core::String y = #t7{core::String};
|
||||
{
|
||||
return y;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(#t2) {
|
||||
return null;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue