diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart index c4ec8364e29..bfae6d03073 100644 --- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart +++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart @@ -10613,6 +10613,37 @@ const MessageCode messagePatchNonExternal = const MessageCode( r"""Can't apply this patch as its origin declaration isn't external.""", correctionMessage: r"""Try adding 'external' to the origin declaration."""); +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. +const Template< + Message Function( + String + name)> templatePatternAssignmentDeclaresVariable = const Template< + Message Function(String name)>( + problemMessageTemplate: + r"""Variable '#name' can't be declared in a pattern assignment.""", + correctionMessageTemplate: + r"""Try using a preexisting variable or changing the assignment to a pattern variable declaration.""", + withArguments: _withArgumentsPatternAssignmentDeclaresVariable); + +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. +const Code + codePatternAssignmentDeclaresVariable = + const Code( + "PatternAssignmentDeclaresVariable", +); + +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. +Message _withArgumentsPatternAssignmentDeclaresVariable(String name) { + if (name.isEmpty) throw 'No name provided'; + name = demangleMixinApplicationName(name); + return new Message(codePatternAssignmentDeclaresVariable, + problemMessage: + """Variable '${name}' can't be declared in a pattern assignment.""", + correctionMessage: + """Try using a preexisting variable or changing the assignment to a pattern variable declaration.""", + arguments: {'name': name}); +} + // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. const Code codePlatformPrivateLibraryAccess = messagePlatformPrivateLibraryAccess; diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart index c842fd5d9d2..f51e3b1a53a 100644 --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart @@ -8889,21 +8889,27 @@ class BodyBuilder extends StackListenerImpl reportIfNotEnabled( libraryFeatures.patterns, variable.charOffset, variable.charCount); - // ignore: unused_local_variable TypeBuilder? type = pop(NullValues.TypeBuilder) as TypeBuilder?; DartType? patternType = type?.build(libraryBuilder, TypeUse.variableType); Pattern pattern; if (variable.lexeme == "_") { pattern = new WildcardPattern(patternType, variable.charOffset); } else if (inAssignmentPattern) { - Expression variableUse = - toValue(scopeLookup(scope, variable.lexeme, variable)); - if (variableUse is VariableGet) { - pattern = new AssignedVariablePattern(variableUse.variable, - offset: variable.charOffset); + String name = variable.lexeme; + if (keyword != null || type != null) { + pattern = new InvalidPattern(buildProblem( + fasta.templatePatternAssignmentDeclaresVariable.withArguments(name), + variable.charOffset, + variable.charCount)); } else { - // Recover by using [WildcardPattern] instead. - pattern = new WildcardPattern(patternType, variable.charOffset); + Expression variableUse = toValue(scopeLookup(scope, name, variable)); + if (variableUse is VariableGet) { + pattern = new AssignedVariablePattern(variableUse.variable, + offset: variable.charOffset); + } else { + // Recover by using [WildcardPattern] instead. + pattern = new WildcardPattern(patternType, variable.charOffset); + } } } else { VariableDeclaration declaredVariable = forest.createVariableDeclaration( diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status index 9e30d9155dc..f349046c7c3 100644 --- a/pkg/front_end/messages.status +++ b/pkg/front_end/messages.status @@ -836,6 +836,7 @@ PatchInjectionFailed/analyzerCode: Fail PatchInjectionFailed/example: Fail PatchNonExternal/analyzerCode: Fail PatchNonExternal/example: Fail +PatternAssignmentDeclaresVariable/analyzerCode: Fail PlatformPrivateLibraryAccess/example: Fail PositionalAfterNamedArgument/example: Fail PositionalSuperParametersAndArguments/analyzerCode: Fail diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml index 2d65fd99134..cd4f9e4fe52 100644 --- a/pkg/front_end/messages.yaml +++ b/pkg/front_end/messages.yaml @@ -6308,3 +6308,13 @@ UnnamedObjectPatternField: method(x) { if (x case int(5)) {} } + +PatternAssignmentDeclaresVariable: + problemMessage: "Variable '#name' can't be declared in a pattern assignment." + correctionMessage: "Try using a preexisting variable or changing the assignment to a pattern variable declaration." + experiments: patterns + script: | + method(x) { + var y; + [y, var z] = x; + } diff --git a/pkg/front_end/test/spell_checking_list_messages.txt b/pkg/front_end/test/spell_checking_list_messages.txt index 93eb66694a9..778a117be55 100644 --- a/pkg/front_end/test/spell_checking_list_messages.txt +++ b/pkg/front_end/test/spell_checking_list_messages.txt @@ -79,6 +79,7 @@ part(s) patch(es) patterns placing +preexisting pubspec.yaml r re diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart new file mode 100644 index 00000000000..702dda26534 --- /dev/null +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart @@ -0,0 +1,15 @@ +// 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 Class { + dynamic field1; + dynamic field2; +} + +method(x, y, z) { + var a; + (a, int b, final int c) = x; + [a, final d] = y; + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +} diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.expect new file mode 100644 index 00000000000..0a9bf3a1692 --- /dev/null +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.expect @@ -0,0 +1,81 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// [a, final d] = y; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +import self as self; +import "dart:core" as core; +import "dart:_internal" as _in; + +class Class extends core::Object { + field dynamic field1 = null; + field dynamic field2 = null; + synthetic constructor •() → self::Class + : super core::Object::•() + ; +} +static method method(dynamic x, dynamic y, dynamic z) → dynamic { + dynamic a; + block { + final dynamic #0#0 = x; + if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?) && (let final dynamic #t1 = a = #0#0{(core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^" && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^")) + throw new _in::ReachabilityError::•(); + } =>#0#0; + block { + final dynamic #1#0 = y; + if(!(#1#0 is{ForNonNullableByDefault} core::List && #1#0{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = a = #1#0{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t3 = #1#0{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + [a, final d] = y; + ^"))) + throw new _in::ReachabilityError::•(); + } =>#1#0; + block { + final dynamic #2#0 = z; + late final dynamic #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}; + late final dynamic #2#9 = #2#3{core::List}.{core::List::[]}(0){(core::int) → dynamic}; + late final dynamic #2#16 = #2#3{core::List}.{core::List::[]}(1){(core::int) → dynamic}; + if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^"))))) + throw new _in::ReachabilityError::•(); + } =>#2#0; +} + +constants { + #C1 = 2 + #C2 = 1 +} diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.transformed.expect new file mode 100644 index 00000000000..f132dcf0b38 --- /dev/null +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.transformed.expect @@ -0,0 +1,87 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// [a, final d] = y; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +import self as self; +import "dart:core" as core; +import "dart:_internal" as _in; + +class Class extends core::Object { + field dynamic field1 = null; + field dynamic field2 = null; + synthetic constructor •() → self::Class + : super core::Object::•() + ; +} +static method method(dynamic x, dynamic y, dynamic z) → dynamic { + dynamic a; + block { + final dynamic #0#0 = x; + if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?) && (let final core::Object? #t1 = a = #0#0{(core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^" && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^")) + throw new _in::ReachabilityError::•(); + } =>#0#0; + block { + final dynamic #1#0 = y; + if(!(#1#0 is{ForNonNullableByDefault} core::List && #1#0{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = a = #1#0{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t3 = #1#0{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + [a, final d] = y; + ^"))) + throw new _in::ReachabilityError::•(); + } =>#1#0; + block { + final dynamic #2#0 = z; + function ##2#3#initializer() → dynamic + return #2#0{self::Class}.{self::Class::field2}{dynamic}; + late final dynamic #2#3 = ##2#3#initializer(){() → dynamic}; + function ##2#9#initializer() → dynamic + return #2#3{core::List}.{core::List::[]}(0){(core::int) → dynamic}; + late final dynamic #2#9 = ##2#9#initializer(){() → dynamic}; + function ##2#16#initializer() → dynamic + return #2#3{core::List}.{core::List::[]}(1){(core::int) → dynamic}; + late final dynamic #2#16 = ##2#16#initializer(){() → dynamic}; + if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^"))))) + throw new _in::ReachabilityError::•(); + } =>#2#0; +} + +constants { + #C1 = 2 + #C2 = 1 +} diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.textual_outline.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.textual_outline.expect new file mode 100644 index 00000000000..33f6d14ac9d --- /dev/null +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.textual_outline.expect @@ -0,0 +1,6 @@ +class Class { + dynamic field1; + dynamic field2; +} + +method(x, y, z) {} diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..33f6d14ac9d --- /dev/null +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.textual_outline_modelled.expect @@ -0,0 +1,6 @@ +class Class { + dynamic field1; + dynamic field2; +} + +method(x, y, z) {} diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.expect new file mode 100644 index 00000000000..0a9bf3a1692 --- /dev/null +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.expect @@ -0,0 +1,81 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// [a, final d] = y; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +import self as self; +import "dart:core" as core; +import "dart:_internal" as _in; + +class Class extends core::Object { + field dynamic field1 = null; + field dynamic field2 = null; + synthetic constructor •() → self::Class + : super core::Object::•() + ; +} +static method method(dynamic x, dynamic y, dynamic z) → dynamic { + dynamic a; + block { + final dynamic #0#0 = x; + if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?) && (let final dynamic #t1 = a = #0#0{(core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^" && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^")) + throw new _in::ReachabilityError::•(); + } =>#0#0; + block { + final dynamic #1#0 = y; + if(!(#1#0 is{ForNonNullableByDefault} core::List && #1#0{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = a = #1#0{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t3 = #1#0{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + [a, final d] = y; + ^"))) + throw new _in::ReachabilityError::•(); + } =>#1#0; + block { + final dynamic #2#0 = z; + late final dynamic #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}; + late final dynamic #2#9 = #2#3{core::List}.{core::List::[]}(0){(core::int) → dynamic}; + late final dynamic #2#16 = #2#3{core::List}.{core::List::[]}(1){(core::int) → dynamic}; + if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^"))))) + throw new _in::ReachabilityError::•(); + } =>#2#0; +} + +constants { + #C1 = 2 + #C2 = 1 +} diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.modular.expect new file mode 100644 index 00000000000..0a9bf3a1692 --- /dev/null +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.modular.expect @@ -0,0 +1,81 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// [a, final d] = y; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +import self as self; +import "dart:core" as core; +import "dart:_internal" as _in; + +class Class extends core::Object { + field dynamic field1 = null; + field dynamic field2 = null; + synthetic constructor •() → self::Class + : super core::Object::•() + ; +} +static method method(dynamic x, dynamic y, dynamic z) → dynamic { + dynamic a; + block { + final dynamic #0#0 = x; + if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?) && (let final dynamic #t1 = a = #0#0{(core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^" && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^")) + throw new _in::ReachabilityError::•(); + } =>#0#0; + block { + final dynamic #1#0 = y; + if(!(#1#0 is{ForNonNullableByDefault} core::List && #1#0{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = a = #1#0{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t3 = #1#0{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + [a, final d] = y; + ^"))) + throw new _in::ReachabilityError::•(); + } =>#1#0; + block { + final dynamic #2#0 = z; + late final dynamic #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}; + late final dynamic #2#9 = #2#3{core::List}.{core::List::[]}(0){(core::int) → dynamic}; + late final dynamic #2#16 = #2#3{core::List}.{core::List::[]}(1){(core::int) → dynamic}; + if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^"))))) + throw new _in::ReachabilityError::•(); + } =>#2#0; +} + +constants { + #C1 = 2 + #C2 = 1 +} diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.outline.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.outline.expect new file mode 100644 index 00000000000..f68690daf5e --- /dev/null +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.outline.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class Class extends core::Object { + field dynamic field1; + field dynamic field2; + synthetic constructor •() → self::Class + ; +} +static method method(dynamic x, dynamic y, dynamic z) → dynamic + ; diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.transformed.expect new file mode 100644 index 00000000000..f132dcf0b38 --- /dev/null +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.transformed.expect @@ -0,0 +1,87 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// (a, int b, final int c) = x; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// [a, final d] = y; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +// Try using a preexisting variable or changing the assignment to a pattern variable declaration. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// +import self as self; +import "dart:core" as core; +import "dart:_internal" as _in; + +class Class extends core::Object { + field dynamic field1 = null; + field dynamic field2 = null; + synthetic constructor •() → self::Class + : super core::Object::•() + ; +} +static method method(dynamic x, dynamic y, dynamic z) → dynamic { + dynamic a; + block { + final dynamic #0#0 = x; + if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?) && (let final core::Object? #t1 = a = #0#0{(core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^" && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + (a, int b, final int c) = x; + ^")) + throw new _in::ReachabilityError::•(); + } =>#0#0; + block { + final dynamic #1#0 = y; + if(!(#1#0 is{ForNonNullableByDefault} core::List && #1#0{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = a = #1#0{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t3 = #1#0{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + [a, final d] = y; + ^"))) + throw new _in::ReachabilityError::•(); + } =>#1#0; + block { + final dynamic #2#0 = z; + function ##2#3#initializer() → dynamic + return #2#0{self::Class}.{self::Class::field2}{dynamic}; + late final dynamic #2#3 = ##2#3#initializer(){() → dynamic}; + function ##2#9#initializer() → dynamic + return #2#3{core::List}.{core::List::[]}(0){(core::int) → dynamic}; + late final dynamic #2#9 = ##2#9#initializer(){() → dynamic}; + function ##2#16#initializer() → dynamic + return #2#3{core::List}.{core::List::[]}(1){(core::int) → dynamic}; + late final dynamic #2#16 = ##2#16#initializer(){() → dynamic}; + if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. +Try using a preexisting variable or changing the assignment to a pattern variable declaration. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^"))))) + throw new _in::ReachabilityError::•(); + } =>#2#0; +} + +constants { + #C1 = 2 + #C2 = 1 +}