Skip to content

Commit a811db5

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Change MapPattern.key to Expression
The key can only be an Expression but was unneedingly wrapped in a ConstantPattern. Since the shared type analysis only handles map pattern keys as expressions, the expected properties of ConstantPattern were not set. Amongst these were the static type of the key expression, which is know passed directly to the handleMapPatternEntry method. Change-Id: I705fc655e440d534ccc442c9c1359c377955b3b1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/288282 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent f17cf33 commit a811db5

11 files changed

+20
-18
lines changed

pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,13 +1082,13 @@ mixin TypeAnalyzer<
10821082
Node element = elements[i];
10831083
MapPatternEntry<Expression, Pattern>? entry = getMapPatternEntry(element);
10841084
if (entry != null) {
1085-
analyzeExpression(entry.key, keyContext);
1085+
Type keyType = analyzeExpression(entry.key, keyContext);
10861086
flow.pushSubpattern(valueType);
10871087
dispatchPattern(
10881088
context.withUnnecessaryWildcardKind(null),
10891089
entry.value,
10901090
);
1091-
handleMapPatternEntry(node, element);
1091+
handleMapPatternEntry(node, element, keyType);
10921092
flow.popSubpattern();
10931093
} else {
10941094
assert(isRestPatternElement(element));
@@ -2171,7 +2171,8 @@ mixin TypeAnalyzer<
21712171
/// Called after visiting an entry element in a map pattern.
21722172
///
21732173
/// Stack effect: pushes (MapPatternElement).
2174-
void handleMapPatternEntry(Pattern container, Node entryElement);
2174+
void handleMapPatternEntry(
2175+
Pattern container, Node entryElement, Type keyType);
21752176

21762177
/// Called after visiting a rest element in a map pattern.
21772178
///

pkg/_fe_analyzer_shared/test/mini_ast.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3790,7 +3790,8 @@ class _MiniAstTypeAnalyzer
37903790
}
37913791

37923792
@override
3793-
void handleMapPatternEntry(Pattern container, Node entryElement) {
3793+
void handleMapPatternEntry(
3794+
Pattern container, Node entryElement, Type keyType) {
37943795
_irBuilder.apply('mapPatternEntry', [Kind.expression, Kind.pattern],
37953796
Kind.mapPatternElement,
37963797
location: entryElement.location);

pkg/analyzer/lib/src/generated/resolver.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,7 @@ class ResolverVisitor extends ThrowingAstVisitor<void>
11271127
void handleMapPatternEntry(
11281128
DartPattern container,
11291129
covariant MapPatternEntryImpl entry,
1130+
DartType keyType,
11301131
) {
11311132
entry.key = popRewrite()!;
11321133
}

pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11339,9 +11339,8 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1133911339
}
1134011340

1134111341
@override
11342-
void handleMapPatternEntry(Pattern container, TreeNode entryElement) {
11343-
entryElement as MapPatternEntry;
11344-
11342+
void handleMapPatternEntry(Pattern container,
11343+
covariant MapPatternEntry entryElement, DartType keyType) {
1134511344
Object? rewrite = popRewrite();
1134611345
if (!identical(rewrite, entryElement.value)) {
1134711346
entryElement.value = rewrite as Pattern..parent = entryElement;
@@ -11352,6 +11351,8 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1135211351
entryElement.key = (rewrite as Expression)..parent = entryElement;
1135311352
}
1135411353

11354+
entryElement.keyType = keyType;
11355+
1135511356
pushRewrite(entryElement);
1135611357
}
1135711358

pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart.strong.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static method test() → dynamic {
3232
core::int a1;
3333
{
3434
final synthesized dynamic #0#0 = self::foo();
35-
final const synthesized dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
35+
final const synthesized invalid-type #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
3636
var {const C(:var t): a1} = foo();
3737
^";
3838
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.

pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static method test() → dynamic {
3232
core::int a1;
3333
{
3434
final synthesized dynamic #0#0 = self::foo();
35-
final const synthesized dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
35+
final const synthesized invalid-type #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
3636
var {const C(:var t): a1} = foo();
3737
^";
3838
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.

pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart.weak.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static method test() → dynamic {
3232
core::int a1;
3333
{
3434
final synthesized dynamic #0#0 = self::foo();
35-
final const synthesized dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
35+
final const synthesized invalid-type #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
3636
var {const C(:var t): a1} = foo();
3737
^";
3838
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.

pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart.weak.modular.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static method test() → dynamic {
3232
core::int a1;
3333
{
3434
final synthesized dynamic #0#0 = self::foo();
35-
final const synthesized dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
35+
final const synthesized invalid-type #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
3636
var {const C(:var t): a1} = foo();
3737
^";
3838
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.

pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart.weak.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static method test() → dynamic {
3232
core::int a1;
3333
{
3434
final synthesized dynamic #0#0 = self::foo();
35-
final const synthesized dynamic #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
35+
final const synthesized invalid-type #0#4 = invalid-expression "pkg/front_end/testcases/patterns/parser_recovery_in_pattern_arguments.dart:13:14: Error: This couldn't be parsed.
3636
var {const C(:var t): a1} = foo();
3737
^";
3838
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.

pkg/kernel/binary.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,7 +1646,7 @@ type AndPattern extends Pattern {
16461646
Byte tag = 128;
16471647
FileOffset fileOffset;
16481648
Pattern left;
1649-
Pattern right;
1649+
Pattern right;
16501650
}
16511651

16521652
type AssignedVariablePattern extends Pattern {
@@ -1677,7 +1677,7 @@ type InvalidPattern extends Pattern {
16771677
Byte tag = 132;
16781678
FileOffset fileOffset;
16791679
Expression invalidExpression;
1680-
List<VariableDeclarationPlain> declaredVariables;
1680+
List<VariableDeclarationPlain> declaredVariables;
16811681
}
16821682

16831683
type ListPattern extends Pattern {

pkg/kernel/lib/src/ast/patterns.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ class ConstantPattern extends Pattern {
3333
Expression expression;
3434

3535
/// Static type of the expression as computed during inference.
36-
// TODO(johnniwinther): Initialize this to `InvalidType.unsetType`.
37-
DartType expressionType = const DynamicType();
36+
DartType expressionType = InvalidType.unsetType;
3837

3938
/// Reference to the `operator ==` procedure on [expression].
4039
///
@@ -1435,8 +1434,7 @@ class MapPatternEntry extends TreeNode {
14351434
Expression key;
14361435
Pattern value;
14371436

1438-
// TODO(johnniwinther): Initialize this to `InvalidType.unsetType`.
1439-
DartType keyType = const DynamicType();
1437+
DartType keyType = InvalidType.unsetType;
14401438

14411439
MapPatternEntry(this.key, this.value) {
14421440
key.parent = this;

0 commit comments

Comments
 (0)