| // 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 condition in a [Branch] (`if` or `else if`). |
| abstract class Condition implements Spec { |
| const Condition(); |
| |
| /// A boolean expression condition: `if (expression)`. |
| static BooleanCondition expression(Expression expression) => |
| BooleanCondition._(expression); |
| |
| /// An if-case pattern matching condition: |
| /// `if (object case pattern [when guard])`. |
| static CaseCondition ifCase( |
| Expression object, |
| Pattern pattern, { |
| Expression? guard, |
| }) => CaseCondition._(object, pattern, guard: guard); |
| } |
| |
| /// A boolean expression condition. |
| class BooleanCondition extends Condition { |
| final Expression expression; |
| |
| const BooleanCondition._(this.expression); |
| |
| @override |
| R accept<R>(covariant ControlVisitor<R> visitor, [R? context]) => |
| visitor.visitBooleanCondition(this, context); |
| } |
| |
| /// An `if-case` condition: `object case pattern [when guard]`. |
| class CaseCondition extends Condition { |
| final Expression object; |
| final Pattern pattern; |
| final Expression? guard; |
| |
| const CaseCondition._(this.object, this.pattern, {this.guard}); |
| |
| @override |
| R accept<R>(covariant ControlVisitor<R> visitor, [R? context]) => |
| visitor.visitCaseCondition(this, context); |
| } |
| |
| /// A branch within a [Conditional] (`if` or `else if`). |
| abstract class Branch implements Built<Branch, BranchBuilder> { |
| factory Branch([void Function(BranchBuilder) updates]) = _$Branch; |
| |
| Branch._(); |
| |
| /// The condition for this branch. |
| Condition get condition; |
| |
| /// The body of this branch. |
| Code? get body; |
| } |
| |
| abstract class BranchBuilder implements Builder<Branch, BranchBuilder> { |
| factory BranchBuilder() = _$BranchBuilder; |
| BranchBuilder._(); |
| |
| Condition? condition; |
| Code? body; |
| } |
| |
| /// An `if`/`else if`/`else` conditional statement. |
| abstract class Conditional |
| implements Built<Conditional, ConditionalBuilder>, Code, Spec { |
| factory Conditional([void Function(ConditionalBuilder) updates]) = |
| _$Conditional; |
| |
| Conditional._() { |
| if (branches.isEmpty) { |
| throw ArgumentError.value( |
| branches, |
| 'branches', |
| 'A conditional must have at least one branch.', |
| ); |
| } |
| } |
| |
| /// The `if` and `else if` branches in this conditional. |
| /// |
| /// The first branch is emitted as `if (condition) { body }`, and any |
| /// subsequent branches are emitted as `else if (condition) { body }`. |
| BuiltList<Branch> get branches; |
| |
| /// The optional `else` body. |
| Code? get orElse; |
| |
| @override |
| R accept<R>(covariant ControlVisitor<R> visitor, [R? context]) => |
| visitor.visitConditional(this, context); |
| } |
| |
| abstract class ConditionalBuilder |
| implements Builder<Conditional, ConditionalBuilder> { |
| factory ConditionalBuilder() = _$ConditionalBuilder; |
| ConditionalBuilder._(); |
| |
| ListBuilder<Branch> branches = ListBuilder<Branch>(); |
| Code? orElse; |
| } |