| // Copyright (c) 2026, 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. |
| |
| part of '../pattern.dart'; |
| |
| /// A list pattern `[p1, p2, ...rest]`. |
| class ListPattern extends Pattern { |
| final List<Pattern> elements; |
| final Reference? type; |
| |
| /// An optional pattern to match against the rest of the elements in the list |
| /// (e.g. `...rest` or `..._`). |
| /// |
| /// If `null`, an anonymous rest element `...` is emitted at [restIndex] if |
| /// [restIndex] is specified. |
| final Pattern? rest; |
| |
| /// The index at which the [rest] element appears among [elements]. |
| /// |
| /// If [rest] is provided and [restIndex] is omitted, the rest element is |
| /// placed at the end of the list pattern (index `elements.length`). |
| final int? restIndex; |
| |
| const ListPattern._(this.elements, {this.type, this.rest, this.restIndex}); |
| |
| bool get hasRest => rest != null || restIndex != null; |
| |
| @override |
| R accept<R>(covariant PatternVisitor<R> visitor, [R? context]) => |
| visitor.visitListPattern(this, context); |
| } |
| |
| /// An entry in a [MapPattern]. |
| class MapPatternEntry { |
| final Expression key; |
| final Pattern value; |
| |
| const MapPatternEntry(this.key, this.value); |
| } |
| |
| /// A map pattern `{'key': pattern}`. |
| class MapPattern extends Pattern { |
| final List<MapPatternEntry> entries; |
| final (Reference, Reference)? type; |
| |
| const MapPattern._(this.entries, {this.type}); |
| |
| @override |
| R accept<R>(covariant PatternVisitor<R> visitor, [R? context]) => |
| visitor.visitMapPattern(this, context); |
| } |
| |
| /// A record destructuring pattern `(p1, name: p2)`. |
| class RecordPattern extends Pattern { |
| final List<Pattern> positional; |
| final Map<String, Pattern> named; |
| |
| const RecordPattern._({this.positional = const [], this.named = const {}}); |
| |
| @override |
| R accept<R>(covariant PatternVisitor<R> visitor, [R? context]) => |
| visitor.visitRecordPattern(this, context); |
| } |
| |
| /// An object destructuring pattern `SomeClass(p1, name: p2)`. |
| class ObjectPattern extends Pattern { |
| final Reference type; |
| final List<Pattern> positional; |
| final Map<String, Pattern> named; |
| |
| const ObjectPattern._( |
| this.type, { |
| this.positional = const [], |
| this.named = const {}, |
| }); |
| |
| @override |
| R accept<R>(covariant PatternVisitor<R> visitor, [R? context]) => |
| visitor.visitObjectPattern(this, context); |
| } |