Skip to content

Commit 0aff070

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Report pattern assignment of non-variables
Change-Id: Ieed7be9ec7e75e64f6f24f729e6211a0a4689c3a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/280722 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent 2ef0ee4 commit 0aff070

12 files changed

+340
-0
lines changed

pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10752,6 +10752,18 @@ Message _withArgumentsPatternAssignmentDeclaresVariable(String name) {
1075210752
arguments: {'name': name});
1075310753
}
1075410754

10755+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
10756+
const Code<Null> codePatternAssignmentNotLocalVariable =
10757+
messagePatternAssignmentNotLocalVariable;
10758+
10759+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
10760+
const MessageCode messagePatternAssignmentNotLocalVariable = const MessageCode(
10761+
"PatternAssignmentNotLocalVariable",
10762+
analyzerCodes: <String>["PATTERN_ASSIGNMENT_NOT_LOCAL_VARIABLE"],
10763+
problemMessage:
10764+
r"""Only local variables or formal parameters can be used in pattern assignments.""",
10765+
correctionMessage: r"""Try assigning to a local variable.""");
10766+
1075510767
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
1075610768
const Code<Null> codePlatformPrivateLibraryAccess =
1075710769
messagePlatformPrivateLibraryAccess;

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8917,6 +8917,8 @@ class BodyBuilder extends StackListenerImpl
89178917
pattern = new AssignedVariablePattern(variableUse.variable,
89188918
offset: variable.charOffset);
89198919
} else {
8920+
addProblem(fasta.messagePatternAssignmentNotLocalVariable,
8921+
variable.charOffset, variable.charCount);
89208922
// Recover by using [WildcardPattern] instead.
89218923
pattern = new WildcardPattern(patternType, variable.charOffset);
89228924
}

pkg/front_end/messages.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6362,3 +6362,14 @@ PatternAssignmentDeclaresVariable:
63626362
var y;
63636363
[y, var z] = x;
63646364
}
6365+
6366+
PatternAssignmentNotLocalVariable:
6367+
problemMessage: Only local variables or formal parameters can be used in pattern assignments.
6368+
correctionMessage: Try assigning to a local variable.
6369+
analyzerCode: PATTERN_ASSIGNMENT_NOT_LOCAL_VARIABLE
6370+
experiments: patterns
6371+
script: |
6372+
var global;
6373+
method(x) {
6374+
[global] = x;
6375+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
var global;
6+
7+
class Super {
8+
var superField;
9+
}
10+
11+
class Class extends Super {
12+
var instanceField;
13+
static var staticField;
14+
15+
method(o, parameter) {
16+
var local;
17+
(local, // Ok
18+
parameter, // Ok
19+
global, // Error
20+
superField, // Error
21+
instanceField, // Error
22+
staticField // Error
23+
) = o;
24+
}
25+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:19:9: Error: Only local variables or formal parameters can be used in pattern assignments.
6+
// Try assigning to a local variable.
7+
// global, // Error
8+
// ^^^^^^
9+
//
10+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:20:9: Error: Only local variables or formal parameters can be used in pattern assignments.
11+
// Try assigning to a local variable.
12+
// superField, // Error
13+
// ^^^^^^^^^^
14+
//
15+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:21:9: Error: Only local variables or formal parameters can be used in pattern assignments.
16+
// Try assigning to a local variable.
17+
// instanceField, // Error
18+
// ^^^^^^^^^^^^^
19+
//
20+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:22:9: Error: Only local variables or formal parameters can be used in pattern assignments.
21+
// Try assigning to a local variable.
22+
// staticField // Error
23+
// ^^^^^^^^^^^
24+
//
25+
import self as self;
26+
import "dart:core" as core;
27+
import "dart:_internal" as _in;
28+
29+
class Super extends core::Object {
30+
field dynamic superField = null;
31+
synthetic constructor •() → self::Super
32+
: super core::Object::•()
33+
;
34+
}
35+
class Class extends self::Super {
36+
field dynamic instanceField = null;
37+
static field dynamic staticField = null;
38+
synthetic constructor •() → self::Class
39+
: super self::Super::•()
40+
;
41+
method method(dynamic o, dynamic parameter) → dynamic {
42+
dynamic local;
43+
block {
44+
final dynamic #0#0 = o;
45+
if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?) && (let final dynamic #t1 = local = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && (let final dynamic #t2 = parameter = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$2{core::Object?} in true) && true && true && true && true))
46+
throw new _in::ReachabilityError::•();
47+
} =>#0#0;
48+
}
49+
}
50+
static field dynamic global;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:19:9: Error: Only local variables or formal parameters can be used in pattern assignments.
6+
// Try assigning to a local variable.
7+
// global, // Error
8+
// ^^^^^^
9+
//
10+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:20:9: Error: Only local variables or formal parameters can be used in pattern assignments.
11+
// Try assigning to a local variable.
12+
// superField, // Error
13+
// ^^^^^^^^^^
14+
//
15+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:21:9: Error: Only local variables or formal parameters can be used in pattern assignments.
16+
// Try assigning to a local variable.
17+
// instanceField, // Error
18+
// ^^^^^^^^^^^^^
19+
//
20+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:22:9: Error: Only local variables or formal parameters can be used in pattern assignments.
21+
// Try assigning to a local variable.
22+
// staticField // Error
23+
// ^^^^^^^^^^^
24+
//
25+
import self as self;
26+
import "dart:core" as core;
27+
import "dart:_internal" as _in;
28+
29+
class Super extends core::Object {
30+
field dynamic superField = null;
31+
synthetic constructor •() → self::Super
32+
: super core::Object::•()
33+
;
34+
}
35+
class Class extends self::Super {
36+
field dynamic instanceField = null;
37+
static field dynamic staticField = null;
38+
synthetic constructor •() → self::Class
39+
: super self::Super::•()
40+
;
41+
method method(dynamic o, dynamic parameter) → dynamic {
42+
dynamic local;
43+
block {
44+
final dynamic #0#0 = o;
45+
if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?) && (let final core::Object? #t1 = local = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && (let final core::Object? #t2 = parameter = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$2{core::Object?} in true) && true && true && true && true))
46+
throw new _in::ReachabilityError::•();
47+
} =>#0#0;
48+
}
49+
}
50+
static field dynamic global;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
var global;
2+
3+
class Super {
4+
var superField;
5+
}
6+
7+
class Class extends Super {
8+
var instanceField;
9+
static var staticField;
10+
method(o, parameter) {}
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Class extends Super {
2+
method(o, parameter) {}
3+
static var staticField;
4+
var instanceField;
5+
}
6+
7+
class Super {
8+
var superField;
9+
}
10+
11+
var global;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:19:9: Error: Only local variables or formal parameters can be used in pattern assignments.
6+
// Try assigning to a local variable.
7+
// global, // Error
8+
// ^^^^^^
9+
//
10+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:20:9: Error: Only local variables or formal parameters can be used in pattern assignments.
11+
// Try assigning to a local variable.
12+
// superField, // Error
13+
// ^^^^^^^^^^
14+
//
15+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:21:9: Error: Only local variables or formal parameters can be used in pattern assignments.
16+
// Try assigning to a local variable.
17+
// instanceField, // Error
18+
// ^^^^^^^^^^^^^
19+
//
20+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:22:9: Error: Only local variables or formal parameters can be used in pattern assignments.
21+
// Try assigning to a local variable.
22+
// staticField // Error
23+
// ^^^^^^^^^^^
24+
//
25+
import self as self;
26+
import "dart:core" as core;
27+
import "dart:_internal" as _in;
28+
29+
class Super extends core::Object {
30+
field dynamic superField = null;
31+
synthetic constructor •() → self::Super
32+
: super core::Object::•()
33+
;
34+
}
35+
class Class extends self::Super {
36+
field dynamic instanceField = null;
37+
static field dynamic staticField = null;
38+
synthetic constructor •() → self::Class
39+
: super self::Super::•()
40+
;
41+
method method(dynamic o, dynamic parameter) → dynamic {
42+
dynamic local;
43+
block {
44+
final dynamic #0#0 = o;
45+
if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?) && (let final dynamic #t1 = local = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && (let final dynamic #t2 = parameter = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$2{core::Object?} in true) && true && true && true && true))
46+
throw new _in::ReachabilityError::•();
47+
} =>#0#0;
48+
}
49+
}
50+
static field dynamic global;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:19:9: Error: Only local variables or formal parameters can be used in pattern assignments.
6+
// Try assigning to a local variable.
7+
// global, // Error
8+
// ^^^^^^
9+
//
10+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:20:9: Error: Only local variables or formal parameters can be used in pattern assignments.
11+
// Try assigning to a local variable.
12+
// superField, // Error
13+
// ^^^^^^^^^^
14+
//
15+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:21:9: Error: Only local variables or formal parameters can be used in pattern assignments.
16+
// Try assigning to a local variable.
17+
// instanceField, // Error
18+
// ^^^^^^^^^^^^^
19+
//
20+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:22:9: Error: Only local variables or formal parameters can be used in pattern assignments.
21+
// Try assigning to a local variable.
22+
// staticField // Error
23+
// ^^^^^^^^^^^
24+
//
25+
import self as self;
26+
import "dart:core" as core;
27+
import "dart:_internal" as _in;
28+
29+
class Super extends core::Object {
30+
field dynamic superField = null;
31+
synthetic constructor •() → self::Super
32+
: super core::Object::•()
33+
;
34+
}
35+
class Class extends self::Super {
36+
field dynamic instanceField = null;
37+
static field dynamic staticField = null;
38+
synthetic constructor •() → self::Class
39+
: super self::Super::•()
40+
;
41+
method method(dynamic o, dynamic parameter) → dynamic {
42+
dynamic local;
43+
block {
44+
final dynamic #0#0 = o;
45+
if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?) && (let final dynamic #t1 = local = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && (let final dynamic #t2 = parameter = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$2{core::Object?} in true) && true && true && true && true))
46+
throw new _in::ReachabilityError::•();
47+
} =>#0#0;
48+
}
49+
}
50+
static field dynamic global;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class Super extends core::Object {
6+
field dynamic superField;
7+
synthetic constructor •() → self::Super
8+
;
9+
}
10+
class Class extends self::Super {
11+
field dynamic instanceField;
12+
static field dynamic staticField;
13+
synthetic constructor •() → self::Class
14+
;
15+
method method(dynamic o, dynamic parameter) → dynamic
16+
;
17+
}
18+
static field dynamic global;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:19:9: Error: Only local variables or formal parameters can be used in pattern assignments.
6+
// Try assigning to a local variable.
7+
// global, // Error
8+
// ^^^^^^
9+
//
10+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:20:9: Error: Only local variables or formal parameters can be used in pattern assignments.
11+
// Try assigning to a local variable.
12+
// superField, // Error
13+
// ^^^^^^^^^^
14+
//
15+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:21:9: Error: Only local variables or formal parameters can be used in pattern assignments.
16+
// Try assigning to a local variable.
17+
// instanceField, // Error
18+
// ^^^^^^^^^^^^^
19+
//
20+
// pkg/front_end/testcases/patterns/pattern_assignment_non_variable.dart:22:9: Error: Only local variables or formal parameters can be used in pattern assignments.
21+
// Try assigning to a local variable.
22+
// staticField // Error
23+
// ^^^^^^^^^^^
24+
//
25+
import self as self;
26+
import "dart:core" as core;
27+
import "dart:_internal" as _in;
28+
29+
class Super extends core::Object {
30+
field dynamic superField = null;
31+
synthetic constructor •() → self::Super
32+
: super core::Object::•()
33+
;
34+
}
35+
class Class extends self::Super {
36+
field dynamic instanceField = null;
37+
static field dynamic staticField = null;
38+
synthetic constructor •() → self::Class
39+
: super self::Super::•()
40+
;
41+
method method(dynamic o, dynamic parameter) → dynamic {
42+
dynamic local;
43+
block {
44+
final dynamic #0#0 = o;
45+
if(!(#0#0 is{ForNonNullableByDefault} (core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?) && (let final core::Object? #t1 = local = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && (let final core::Object? #t2 = parameter = #0#0{(core::Object?, core::Object?, core::Object?, core::Object?, core::Object?, core::Object?)}.$2{core::Object?} in true) && true && true && true && true))
46+
throw new _in::ReachabilityError::•();
47+
} =>#0#0;
48+
}
49+
}
50+
static field dynamic global;

0 commit comments

Comments
 (0)