···11911191 // exception in case the pattern doesn't match.
11921192 let case = builder.start_case();
11931193 self.maybe_block_expr(builder, value);
11941194+ let case = builder.end_case_subject(case);
1194119511951196 // This is the first branch for when the asserted pattern matches: it's
11961197 // going to run all the remaining statements in its body.
···14311432 builder.binary_operator(erlang_operator);
14321433 self.runtime_value(builder, &left);
14331434 self.runtime_value(builder, &right);
14351435+ let case = builder.end_case_subject(case);
1434143614351437 // If the operator evaluates to true the assertion succeeded.
14361438 // We can just return nil.
···1481148314821484 let case = builder.start_case();
14831485 self.call_in_assert(builder, fun, &call_arguments);
14861486+ let case = builder.end_case_subject(case);
1484148714851488 // If the operator evaluates to true the assertion succeeded.
14861489 // We can just return nil.
···15321535 | TypedExpr::Invalid { .. } => {
15331536 let case = builder.start_case();
15341537 self.maybe_block_expr(builder, value);
15381538+ let case = builder.end_case_subject(case);
1535153915361540 // If the expression evaluates to true the assertion succeeded.
15371541 // We can just return nil.
···15961600 ) {
15971601 let case = builder.start_case();
15981602 self.maybe_block_expr(builder, left);
16031603+ let case = builder.end_case_subject(case);
1599160416001605 // In case the first expression is true, we get to evaluate the second
16011606 // one as well, then we will be able to tell if the assertion failed or
···16081613 // Now we have to match on the right hand side!
16091614 let case = builder.start_case();
16101615 self.maybe_block_expr(builder, right);
16161616+ let case = builder.end_case_subject(case);
1611161716121618 // If it's true the assertion succeded! We can return `nil`.
16131619 let clause = builder.start_case_clause();
···16761682 builder.binary_operator("orelse");
16771683 self.maybe_block_expr(builder, left);
16781684 self.maybe_block_expr(builder, right);
16851685+ let case = builder.end_case_subject(case);
1679168616801687 // If the result is true, then the assertion succeeded, we can return
16811688 // nil.
···21192126 builder.end_tuple(tuple);
21202127 }
21212128 }
21292129+ let case = builder.end_case_subject(case);
2122213021232131 for clause in clauses {
21242132 let taken_names_before_clause = self.taken_names.clone();
···2548255625492557 let case = builder.start_case();
25502558 self.maybe_block_expr(builder, right);
25592559+ let case = builder.end_case_subject(case);
2551256025522561 // +0.0 -> +0.0
25532562 let clause = builder.start_case_clause();
···2637264626382647 let case = builder.start_case();
26392648 self.maybe_block_expr(builder, right);
26492649+ let case = builder.end_case_subject(case);
2640265026412651 // 0 -> 0
26422652 let clause = builder.start_case_clause();
···406406 } else {
407407 let case = builder.start_case();
408408 self.bit_array_size(builder, right);
409409+ let case = builder.end_case_subject(case);
409410410411 let clause = builder.start_case_clause();
411412 builder.int_pattern(BigInt::ZERO);
···9898 /// Represents an open case expression that has yet to be closed.
9999 type Case;
100100101101+ /// Represents an open case subject that has yet to be closed.
102102+ type CaseSubject;
103103+101104 /// Represents an open case clause pattern that has yet to be generated.
102105 type ClausePattern;
103106···867870 /// This starts a new case expression.
868871 /// After this function is called you're supposed to first generate a single
869872 /// expression; that's going to be the case subject being matched on.
873873+ /// After that you must call `end_case_subject`.
870874 ///
871875 /// After that you're supposed to generate the case branches using the
872876 /// `start_case_clause` function.
···876880 /// ```ignore
877881 /// let case = builder.start_case();
878882 /// builder.variable("wibble");
883883+ /// let case = builder.end_case_subject();
879884 ///
880885 /// let clause = builder.start_case_clause();
881886 /// builder.discard_pattern();
···895900 /// end.
896901 /// ```
897902 ///
898898- fn start_case(&mut self) -> Self::Case;
903903+ fn start_case(&mut self) -> Self::CaseSubject;
904904+905905+ /// This ends the open case subject, after this you can start generating the
906906+ /// case clauses.
907907+ fn end_case_subject(&mut self, case: Self::CaseSubject) -> Self::Case;
899908900909 /// This ends an open case expression.
901910 /// Any code generated after this is not going to be part of it.
···16931702 type Block = ();
16941703 type Call = ();
16951704 type Case = ();
17051705+ type CaseSubject = ();
16961706 type ClauseBody = ();
16971707 type ClauseGuards = ();
16981708 type ClausePattern = ();
···22312241 self.position.push(ErlangSourceBuilderPosition::Case {
22322242 expected: ExpectedCaseItem::Subject,
22332243 });
22442244+ }
22452245+22462246+ fn end_case_subject(&mut self, _case: Self::CaseSubject) -> Self::Case {
22472247+ // We need to make sure that just a single expression was generated as
22482248+ // the subject and then this function was called.
22492249+ // So we can assert that we're no longer expecting the subject but the
22502250+ // clauses and none has been generated yet.
22512251+ self.pop_leftover_items();
22522252+ let Some(ErlangSourceBuilderPosition::Case {
22532253+ expected: ExpectedCaseItem::Branches { first: true },
22542254+ }) = self.position.last()
22552255+ else {
22562256+ invalid_code_for_position!(self, "end case subject")
22572257+ };
22342258 }
2235225922362260 fn end_case(&mut self, _case: Self::Case) {