Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 16da66f

Browse files
scheglovCommit Queue
authored and
Commit Queue
committed
Resolve rest elements in list patterns.
Change-Id: I95c210bde168b09c86a7a42ff984b5728440f7a9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/271741 Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent d359e07 commit 16da66f

File tree

4 files changed

+48
-12
lines changed

4 files changed

+48
-12
lines changed

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10967,14 +10967,21 @@ class RestPatternElementImpl extends AstNodeImpl
1096710967
RestPatternElementImpl({
1096810968
required this.operator,
1096910969
required this.pattern,
10970-
});
10970+
}) {
10971+
_becomeParentOf(pattern);
10972+
}
1097110973

1097210974
@override
1097310975
Token get beginToken => operator;
1097410976

1097510977
@override
1097610978
Token get endToken => pattern?.endToken ?? operator;
1097710979

10980+
@override
10981+
ChildEntities get _childEntities => ChildEntities()
10982+
..addToken('operator', operator)
10983+
..addNode('pattern', pattern);
10984+
1097810985
@override
1097910986
E? accept<E>(AstVisitor<E> visitor) {
1098010987
return visitor.visitRestPatternElement(this);

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -911,9 +911,10 @@ class ResolverVisitor extends ThrowingAstVisitor<void>
911911
}
912912

913913
@override
914-
DartPattern? getRestPatternElementPattern(covariant DartPatternImpl node) {
915-
// TODO(scheglov): implement getRestPatternElementPattern
916-
throw UnimplementedError();
914+
DartPattern? getRestPatternElementPattern(
915+
covariant RestPatternElementImpl element,
916+
) {
917+
return element.pattern;
917918
}
918919

919920
@override
@@ -1038,11 +1039,8 @@ class ResolverVisitor extends ThrowingAstVisitor<void>
10381039
@override
10391040
void handleListPatternRestElement(
10401041
DartPattern container,
1041-
covariant DartPattern restElement,
1042-
) {
1043-
// TODO(scheglov): implement handleListPatternRestElement
1044-
throw UnimplementedError();
1045-
}
1042+
covariant RestPatternElementImpl restElement,
1043+
) {}
10461044

10471045
@override
10481046
void handleMapPatternEntry(DartPattern container, AstNode entryElement) {
@@ -1145,9 +1143,8 @@ class ResolverVisitor extends ThrowingAstVisitor<void>
11451143
}
11461144

11471145
@override
1148-
bool isRestPatternElement(covariant DartPatternImpl node) {
1149-
// TODO(scheglov): implement isRestPatternElement
1150-
return false;
1146+
bool isRestPatternElement(AstNode node) {
1147+
return node is RestPatternElementImpl;
11511148
}
11521149

11531150
@override

pkg/analyzer/test/generated/patterns_parser_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6706,6 +6706,7 @@ ListPattern
67066706
leftBracket: [
67076707
elements
67086708
RestPatternElement
6709+
operator: ...
67096710
rightBracket: ]
67106711
''');
67116712
}
@@ -6725,6 +6726,10 @@ ListPattern
67256726
leftBracket: [
67266727
elements
67276728
RestPatternElement
6729+
operator: ...
6730+
pattern: VariablePattern
6731+
keyword: var
6732+
name: y
67286733
rightBracket: ]
67296734
''');
67306735
}

pkg/analyzer/test/src/dart/resolution/list_pattern_test.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,33 @@ ListPattern
101101
''');
102102
}
103103

104+
test_matchList_noTypeArguments_restElement() async {
105+
await assertNoErrorsInCode(r'''
106+
void f(List<int> x) {
107+
if (x case [0, ...var rest]) {}
108+
}
109+
''');
110+
final node = findNode.singleGuardedPattern.pattern;
111+
assertResolvedNodeText(node, r'''
112+
ListPattern
113+
leftBracket: [
114+
elements
115+
ConstantPattern
116+
expression: IntegerLiteral
117+
literal: 0
118+
staticType: int
119+
RestPatternElement
120+
operator: ...
121+
pattern: VariablePattern
122+
keyword: var
123+
name: rest
124+
declaredElement: hasImplicitType rest@46
125+
type: List<int>
126+
rightBracket: ]
127+
requiredType: List<int>
128+
''');
129+
}
130+
104131
test_matchList_noTypeArguments_variable_untyped() async {
105132
await assertNoErrorsInCode(r'''
106133
void f(List<int> x) {

0 commit comments

Comments
 (0)