blob: 4fc6fe41a8f7adc5c1ae84d8d4a84ada034bb4f2 [file] [edit]
// 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 '../control.dart';
/// A `for` loop statement.
///
/// ```dart
/// for (var i = 0; i < 10; i++) {
/// body
/// }
/// ```
abstract class ForLoop implements Built<ForLoop, ForLoopBuilder>, Code, Spec {
factory ForLoop([void Function(ForLoopBuilder) updates]) = _$ForLoop;
ForLoop._();
/// An optional label for the loop.
String? get label;
/// The initializer expression.
Expression? get initialize;
/// The loop condition.
Expression? get condition;
/// The step/advance expression.
Expression? get advance;
/// The loop body.
Code? get body;
@override
R accept<R>(covariant ControlVisitor<R> visitor, [R? context]) =>
visitor.visitForLoop(this, context);
}
abstract class ForLoopBuilder implements Builder<ForLoop, ForLoopBuilder> {
factory ForLoopBuilder() = _$ForLoopBuilder;
ForLoopBuilder._();
String? label;
Expression? initialize;
Expression? condition;
Expression? advance;
Code? body;
}
/// A `for-in` loop statement.
///
/// ```dart
/// for (final x in items) {
/// body
/// }
/// ```
///
/// When [async] is `true`, emits an `await for` loop:
/// ```dart
/// await for (final x in stream) {
/// body
/// }
/// ```
abstract class ForInLoop
implements Built<ForInLoop, ForInLoopBuilder>, Code, Spec {
factory ForInLoop([void Function(ForInLoopBuilder) updates]) = _$ForInLoop;
ForInLoop._();
/// An optional label for the loop.
String? get label;
/// Whether this is an asynchronous (`await for`) loop.
bool get async;
/// The loop variable declaration or expression (before `in`).
Expression get variable;
/// The iterable or stream object (after `in`).
Expression get object;
/// The loop body.
Code? get body;
@override
R accept<R>(covariant ControlVisitor<R> visitor, [R? context]) =>
visitor.visitForInLoop(this, context);
}
abstract class ForInLoopBuilder
implements Builder<ForInLoop, ForInLoopBuilder> {
factory ForInLoopBuilder() = _$ForInLoopBuilder;
ForInLoopBuilder._();
String? label;
bool async = false;
Expression? variable;
Expression? object;
Code? body;
}
/// A `while` or `do-while` loop statement.
///
/// ```dart
/// while (condition) {
/// body
/// }
/// ```
///
/// When [doWhile] is `true`, emits a `do-while` loop:
/// ```dart
/// do {
/// body
/// } while (condition);
/// ```
abstract class WhileLoop
implements Built<WhileLoop, WhileLoopBuilder>, Code, Spec {
factory WhileLoop([void Function(WhileLoopBuilder) updates]) = _$WhileLoop;
WhileLoop._();
/// An optional label for the loop.
String? get label;
/// Whether this is a `do-while` loop.
bool get doWhile;
/// The loop condition.
Expression get condition;
/// The loop body.
Code? get body;
@override
R accept<R>(covariant ControlVisitor<R> visitor, [R? context]) =>
visitor.visitWhileLoop(this, context);
}
abstract class WhileLoopBuilder
implements Builder<WhileLoop, WhileLoopBuilder> {
factory WhileLoopBuilder() = _$WhileLoopBuilder;
WhileLoopBuilder._();
String? label;
bool doWhile = false;
Expression? condition;
Code? body;
}