Add useful comments on ExprKind::If variants.

Things that aren't obvious and took me a while to work out.
This commit is contained in:
Nicholas Nethercote 2025-04-28 06:33:22 +10:00
parent 251cda5e1f
commit 0ea204a5ff
3 changed files with 9 additions and 0 deletions

View File

@ -1633,6 +1633,9 @@ pub enum ExprKind {
/// An `if` block, with an optional `else` block. /// An `if` block, with an optional `else` block.
/// ///
/// `if expr { block } else { expr }` /// `if expr { block } else { expr }`
///
/// If present, the "else" expr is always `ExprKind::Block` (for `else`) or
/// `ExprKind::If` (for `else if`).
If(P<Expr>, P<Block>, Option<P<Expr>>), If(P<Expr>, P<Block>, Option<P<Expr>>),
/// A while loop, with an optional label. /// A while loop, with an optional label.
/// ///

View File

@ -2730,6 +2730,9 @@ pub enum ExprKind<'hir> {
/// An `if` block, with an optional else block. /// An `if` block, with an optional else block.
/// ///
/// I.e., `if <expr> { <expr> } else { <expr> }`. /// I.e., `if <expr> { <expr> } else { <expr> }`.
///
/// The "then" expr is always `ExprKind::Block`. If present, the "else" expr is always
/// `ExprKind::Block` (for `else`) or `ExprKind::If` (for `else if`).
If(&'hir Expr<'hir>, &'hir Expr<'hir>, Option<&'hir Expr<'hir>>), If(&'hir Expr<'hir>, &'hir Expr<'hir>, Option<&'hir Expr<'hir>>),
/// A conditionless loop (can be exited with `break`, `continue`, or `return`). /// A conditionless loop (can be exited with `break`, `continue`, or `return`).
/// ///

View File

@ -292,7 +292,10 @@ pub enum ExprKind<'tcx> {
If { If {
if_then_scope: region::Scope, if_then_scope: region::Scope,
cond: ExprId, cond: ExprId,
/// `then` is always `ExprKind::Block`.
then: ExprId, then: ExprId,
/// If present, the `else_opt` expr is always `ExprKind::Block` (for
/// `else`) or `ExprKind::If` (for `else if`).
else_opt: Option<ExprId>, else_opt: Option<ExprId>,
}, },
/// A function call. Method calls and overloaded operators are converted to plain function calls. /// A function call. Method calls and overloaded operators are converted to plain function calls.