Add RestPatternElement, ListPatternElement, MapPatternElement.

Change-Id: Icbd312e97c7c03348a1ea5c0d9bea5f4d5ace373
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/271180
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
This commit is contained in:
Konstantin Shcheglov 2022-11-21 21:54:31 +00:00 committed by Commit Queue
parent 4acfca65df
commit 4ba2fdc0fe
9 changed files with 180 additions and 50 deletions

View file

@ -606,6 +606,8 @@ abstract class AstVisitor<R> {
R? visitRelationalPattern(RelationalPattern node);
R? visitRestPatternElement(RestPatternElement node);
R? visitRethrowExpression(RethrowExpression node);
R? visitReturnStatement(ReturnStatement node);
@ -1659,7 +1661,7 @@ abstract class ContinueStatement implements Statement {
///
/// Clients may not extend, implement or mix-in this class.
@experimental
abstract class DartPattern implements AstNode {
abstract class DartPattern implements AstNode, ListPatternElement {
/// Return the precedence of this pattern.
///
/// The precedence is a positive integer value that defines how the source
@ -3436,7 +3438,7 @@ abstract class ListPattern implements DartPattern {
DartType? requiredType;
/// Return the elements in this pattern.
NodeList<DartPattern> get elements;
NodeList<ListPatternElement> get elements;
/// Return the left square bracket.
Token get leftBracket;
@ -3449,6 +3451,12 @@ abstract class ListPattern implements DartPattern {
TypeArgumentList? get typeArguments;
}
/// An element of a list pattern.
///
/// Clients may not extend, implement or mix-in this class.
@experimental
abstract class ListPatternElement implements AstNode {}
/// A node that represents a literal expression.
///
/// literal ::=
@ -3491,8 +3499,8 @@ abstract class MapLiteralEntry implements CollectionElement {
/// Clients may not extend, implement or mix-in this class.
@experimental
abstract class MapPattern implements DartPattern {
/// Return the entries in this pattern.
NodeList<MapPatternEntry> get entries;
/// Return the elements in this pattern.
NodeList<MapPatternElement> get elements;
/// Return the left curly bracket.
Token get leftBracket;
@ -3505,6 +3513,12 @@ abstract class MapPattern implements DartPattern {
TypeArgumentList? get typeArguments;
}
/// An element of a map pattern.
///
/// Clients may not extend, implement or mix-in this class.
@experimental
abstract class MapPatternElement implements AstNode {}
/// An entry in a map pattern.
///
/// mapPatternEntry ::=
@ -3512,7 +3526,7 @@ abstract class MapPattern implements DartPattern {
///
/// Clients may not extend, implement or mix-in this class.
@experimental
abstract class MapPatternEntry implements AstNode {
abstract class MapPatternEntry implements AstNode, MapPatternElement {
/// Return the expression computing the key of the entry to be matched.
Expression get key;
@ -4473,6 +4487,21 @@ abstract class RelationalPattern implements DartPattern {
Token get operator;
}
/// A rest pattern element.
///
/// restPatternElement ::= '...' [DartPattern]?
///
/// Clients may not extend, implement or mix-in this class.
@experimental
abstract class RestPatternElement
implements ListPatternElement, MapPatternElement {
/// The operator token '...'.
Token get operator;
/// The optional pattern.
DartPattern? get pattern;
}
/// A rethrow expression.
///
/// rethrowExpression ::=

View file

@ -615,6 +615,9 @@ class GeneralizingAstVisitor<R> implements AstVisitor<R> {
@override
R? visitRelationalPattern(RelationalPattern node) => visitDartPattern(node);
@override
R? visitRestPatternElement(RestPatternElement node) => visitNode(node);
@override
R? visitRethrowExpression(RethrowExpression node) => visitExpression(node);
@ -1524,6 +1527,12 @@ class RecursiveAstVisitor<R> implements AstVisitor<R> {
return null;
}
@override
R? visitRestPatternElement(RestPatternElement node) {
node.visitChildren(this);
return null;
}
@override
R? visitRethrowExpression(RethrowExpression node) {
node.visitChildren(this);
@ -2143,6 +2152,9 @@ class SimpleAstVisitor<R> implements AstVisitor<R> {
@override
R? visitRelationalPattern(RelationalPattern node) => null;
@override
R? visitRestPatternElement(RestPatternElement node) => null;
@override
R? visitRethrowExpression(RethrowExpression node) => null;
@ -2664,6 +2676,9 @@ class ThrowingAstVisitor<R> implements AstVisitor<R> {
@override
R? visitRelationalPattern(RelationalPattern node) => _throw(node);
@override
R? visitRestPatternElement(RestPatternElement node) => _throw(node);
@override
R? visitRethrowExpression(RethrowExpression node) => _throw(node);
@ -3807,6 +3822,14 @@ class TimedAstVisitor<T> implements AstVisitor<T> {
return result;
}
@override
T? visitRestPatternElement(RestPatternElement node) {
stopwatch.start();
T? result = _baseVisitor.visitRestPatternElement(node);
stopwatch.stop();
return result;
}
@override
T? visitRethrowExpression(RethrowExpression node) {
stopwatch.start();
@ -4525,6 +4548,9 @@ class UnifyingAstVisitor<R> implements AstVisitor<R> {
@override
R? visitRelationalPattern(RelationalPattern node) => visitNode(node);
@override
R? visitRestPatternElement(RestPatternElement node) => visitNode(node);
@override
R? visitRethrowExpression(RethrowExpression node) => visitNode(node);

View file

@ -3351,7 +3351,8 @@ class ContinueStatementImpl extends StatementImpl implements ContinueStatement {
/// | [RelationalPattern]
/// | [VariablePattern]
@experimental
abstract class DartPatternImpl extends AstNodeImpl implements DartPattern {
abstract class DartPatternImpl extends AstNodeImpl
implements DartPattern, ListPatternElementImpl {
DartPatternImpl();
@override
@ -8030,22 +8031,26 @@ class ListLiteralImpl extends TypedLiteralImpl implements ListLiteral {
}
}
@experimental
abstract class ListPatternElementImpl
implements AstNodeImpl, ListPatternElement {}
/// A list pattern.
///
/// listPattern ::=
/// [TypeArgumentList]? '[' [DartPattern] (',' [DartPattern])* ','? ']'
@experimental
class ListPatternImpl extends DartPatternImpl implements ListPattern {
final NodeListImpl<DartPatternImpl> _elements = NodeListImpl._();
@override
final TypeArgumentListImpl? typeArguments;
@override
final Token leftBracket;
@override
final Token rightBracket;
final NodeListImpl<ListPatternElementImpl> _elements = NodeListImpl._();
@override
final TypeArgumentListImpl? typeArguments;
final Token rightBracket;
@override
DartType? requiredType;
@ -8053,7 +8058,7 @@ class ListPatternImpl extends DartPatternImpl implements ListPattern {
ListPatternImpl({
required this.typeArguments,
required this.leftBracket,
required List<DartPatternImpl> elements,
required List<ListPatternElementImpl> elements,
required this.rightBracket,
}) {
_becomeParentOf(typeArguments);
@ -8064,7 +8069,7 @@ class ListPatternImpl extends DartPatternImpl implements ListPattern {
Token get beginToken => typeArguments?.beginToken ?? leftBracket;
@override
NodeList<DartPattern> get elements => _elements;
NodeList<ListPatternElementImpl> get elements => _elements;
@override
Token get endToken => rightBracket;
@ -8201,12 +8206,17 @@ class MapLiteralEntryImpl extends CollectionElementImpl
}
}
@experimental
abstract class MapPatternElementImpl
implements AstNodeImpl, MapPatternElement {}
/// An entry in a map pattern.
///
/// mapPatternEntry ::=
/// [Expression] ':' [DartPattern]
@experimental
class MapPatternEntryImpl extends AstNodeImpl implements MapPatternEntry {
class MapPatternEntryImpl extends AstNodeImpl
implements MapPatternEntry, MapPatternElementImpl {
@override
final ExpressionImpl key;
@ -8254,41 +8264,41 @@ class MapPatternEntryImpl extends AstNodeImpl implements MapPatternEntry {
/// ','? '}'
@experimental
class MapPatternImpl extends DartPatternImpl implements MapPattern {
final NodeListImpl<MapPatternEntryImpl> _entries = NodeListImpl._();
@override
final TypeArgumentListImpl? typeArguments;
@override
final Token leftBracket;
@override
final Token rightBracket;
final NodeListImpl<MapPatternElementImpl> _elements = NodeListImpl._();
@override
final TypeArgumentListImpl? typeArguments;
final Token rightBracket;
MapPatternImpl({
required this.typeArguments,
required this.leftBracket,
required List<MapPatternEntryImpl> entries,
required List<MapPatternElementImpl> elements,
required this.rightBracket,
}) {
_becomeParentOf(typeArguments);
_entries._initialize(this, entries);
_elements._initialize(this, elements);
}
@override
Token get beginToken => typeArguments?.beginToken ?? leftBracket;
@override
Token get endToken => rightBracket;
NodeList<MapPatternElementImpl> get elements => _elements;
@override
NodeList<MapPatternEntry> get entries => _entries;
Token get endToken => rightBracket;
@override
ChildEntities get _childEntities => super._childEntities
..addNode('typeArguments', typeArguments)
..addToken('leftBracket', leftBracket)
..addNodeList('entries', entries)
..addNodeList('elements', elements)
..addToken('rightBracket', rightBracket);
@override
@ -8310,7 +8320,7 @@ class MapPatternImpl extends DartPatternImpl implements MapPattern {
@override
void visitChildren(AstVisitor visitor) {
typeArguments?.accept(visitor);
entries.accept(visitor);
elements.accept(visitor);
}
}
@ -10939,6 +10949,40 @@ class RelationalPatternImpl extends DartPatternImpl
}
}
@experimental
class RestPatternElementImpl extends AstNodeImpl
implements
RestPatternElement,
ListPatternElementImpl,
MapPatternElementImpl {
@override
final Token operator;
@override
final DartPatternImpl? pattern;
RestPatternElementImpl({
required this.operator,
required this.pattern,
});
@override
Token get beginToken => operator;
@override
Token get endToken => pattern?.endToken ?? operator;
@override
E? accept<E>(AstVisitor<E> visitor) {
return visitor.visitRestPatternElement(this);
}
@override
void visitChildren(AstVisitor visitor) {
pattern?.accept(visitor);
}
}
/// A rethrow expression.
///
/// rethrowExpression ::=

View file

@ -818,7 +818,7 @@ class ToSourceVisitor implements AstVisitor<void> {
void visitMapPattern(MapPattern node) {
_visitNode(node.typeArguments);
sink.write('{');
_visitNodeList(node.entries, separator: ', ');
_visitNodeList(node.elements, separator: ', ');
sink.write('}');
}
@ -1100,6 +1100,12 @@ class ToSourceVisitor implements AstVisitor<void> {
_visitNode(node.operand);
}
@override
void visitRestPatternElement(RestPatternElement node) {
sink.write(node.operator.lexeme);
_visitNode(node.pattern);
}
@override
void visitRethrowExpression(RethrowExpression node) {
sink.write('rethrow');

View file

@ -946,7 +946,7 @@ class AstComparator implements AstVisitor<bool> {
var other = _other as MapPattern;
return isEqualNodes(node.typeArguments, other.typeArguments) &&
isEqualTokens(node.leftBracket, other.leftBracket) &&
_isEqualNodeLists(node.entries, other.entries) &&
_isEqualNodeLists(node.elements, other.elements) &&
isEqualTokens(node.rightBracket, other.rightBracket);
}
@ -1243,6 +1243,13 @@ class AstComparator implements AstVisitor<bool> {
isEqualNodes(node.operand, other.operand);
}
@override
bool visitRestPatternElement(RestPatternElement node) {
var other = _other as RestPatternElement;
return isEqualTokens(node.operator, other.operator) &&
isEqualNodes(node.pattern, other.pattern);
}
@override
bool visitRethrowExpression(RethrowExpression node) {
RethrowExpression other = _other as RethrowExpression;

View file

@ -4341,13 +4341,16 @@ class AstBuilder extends StackListener {
assert(optional(']', rightBracket));
debugEvent("ListPattern");
var elements = popTypedList2<DartPatternImpl>(count);
var elements = popTypedList2<ListPatternElementImpl>(count);
var typeArguments = pop() as TypeArgumentListImpl?;
push(ListPatternImpl(
push(
ListPatternImpl(
typeArguments: typeArguments,
leftBracket: leftBracket,
elements: elements,
rightBracket: rightBracket));
rightBracket: rightBracket,
),
);
}
@override
@ -4469,13 +4472,16 @@ class AstBuilder extends StackListener {
void handleMapPattern(int count, Token leftBrace, Token rightBrace) {
debugEvent('MapPattern');
var entries = popTypedList2<MapPatternEntryImpl>(count);
var elements = popTypedList2<MapPatternElementImpl>(count);
var typeArguments = pop() as TypeArgumentListImpl?;
push(MapPatternImpl(
push(
MapPatternImpl(
typeArguments: typeArguments,
leftBracket: leftBrace,
entries: entries,
rightBracket: rightBrace));
elements: elements,
rightBracket: rightBrace,
),
);
}
@override

View file

@ -784,6 +784,12 @@ class LinterVisitor implements AstVisitor<void> {
node.visitChildren(this);
}
@override
void visitRestPatternElement(RestPatternElement node) {
_runSubscriptions(node, registry._forRestPatternElement);
node.visitChildren(this);
}
@override
void visitRethrowExpression(RethrowExpression node) {
_runSubscriptions(node, registry._forRethrowExpression);
@ -1177,6 +1183,7 @@ class NodeLintRegistry {
final List<_Subscription<RedirectingConstructorInvocation>>
_forRedirectingConstructorInvocation = [];
final List<_Subscription<RelationalPattern>> _forRelationalPattern = [];
final List<_Subscription<RestPatternElement>> _forRestPatternElement = [];
final List<_Subscription<RethrowExpression>> _forRethrowExpression = [];
final List<_Subscription<ReturnStatement>> _forReturnStatement = [];
final List<_Subscription<ScriptTag>> _forScriptTag = [];
@ -1773,6 +1780,11 @@ class NodeLintRegistry {
.add(_Subscription(linter, visitor, _getTimer(linter)));
}
void addRestPatternElement(LintRule linter, AstVisitor visitor) {
_forRestPatternElement
.add(_Subscription(linter, visitor, _getTimer(linter)));
}
void addRethrowExpression(LintRule linter, AstVisitor visitor) {
_forRethrowExpression
.add(_Subscription(linter, visitor, _getTimer(linter)));

View file

@ -763,7 +763,7 @@ void f(x) {
assertParsedNodeText(node, r'''
MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -3803,7 +3803,7 @@ MapPattern
token: int
rightBracket: >
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -3852,7 +3852,7 @@ void f(x) {
assertParsedNodeText(node, r'''
MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -3885,7 +3885,7 @@ void f(x) {
CastPattern
pattern: MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -3921,7 +3921,7 @@ MapPattern
token: int
rightBracket: >
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -3962,7 +3962,7 @@ void f(x) {
assertParsedNodeText(node, r'''
MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -3993,7 +3993,7 @@ void f(x) {
PostfixPattern
operand: MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -4020,7 +4020,7 @@ void f(x) {
PostfixPattern
operand: MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -4204,7 +4204,7 @@ void f(x) {
assertParsedNodeText(node, r'''
MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -4565,7 +4565,7 @@ void f(x) {
assertParsedNodeText(node, r'''
MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -5487,7 +5487,7 @@ PatternVariableDeclarationStatement
keyword: final
pattern: MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -5618,7 +5618,7 @@ PatternVariableDeclarationStatement
keyword: var
pattern: MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -5752,7 +5752,7 @@ PatternVariableDeclarationStatement
keyword: final
pattern: MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -5888,7 +5888,7 @@ PatternVariableDeclarationStatement
keyword: var
pattern: MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -6435,7 +6435,7 @@ void f(x) {
assertParsedNodeText(node, r'''
MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -7098,7 +7098,7 @@ void f(x) {
assertParsedNodeText(node, r'''
MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'

View file

@ -28,7 +28,7 @@ void f(x) {
CastPattern
pattern: MapPattern
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'
@ -84,7 +84,7 @@ MapPattern
token: int
rightBracket: >
leftBracket: {
entries
elements
MapPatternEntry
key: SimpleStringLiteral
literal: 'a'