func build_match_expr(consume subject: Syntax<Expr>, consume patterns: [Syntax<Pattern>], consume bodies: [Syntax<Expr>], source_id: Int, source_span: Range<Int>, context: &QuoteContext) -> SyntaxResult<Expr>Build one match expression from heterogeneous, already-validated syntax categories. This keeps all arms in one match so ordinary exhaustiveness and ownership checking see the same structure the author wrote.
View Source
pub func build_match_expr(consume subject: Syntax<Expr>, consume patterns: [Syntax<Pattern>], consume bodies: [Syntax<Expr>], source_id: Int, source_span: Range<Int>, context: &QuoteContext) -> SyntaxResult<Expr> {
if patterns.count == 0 || patterns.count != bodies.count {
return SyntaxResult<Expr>(value: .none, failure: .some(SyntaxFailure(code: "syntax.match.invalid-arms", message: "Match syntax requires equally many patterns and bodies", span: source_span)))
}
let ordered_patterns: [Syntax<Pattern>] = []
let ordered_bodies: [Syntax<Expr>] = []
loop patterns.count > 0 {
if let .some(pattern) = patterns.pop() { ordered_patterns.push(consume pattern) }
if let .some(body) = bodies.pop() { ordered_bodies.push(consume body) }
}
let pieces: [SyntaxPiece] = []
pieces.push(.token(generated_syntax_token(kind: .keyword_match, spelling: "match", leading: "", source_id: source_id, source_span: source_span, context: context)))
pieces.push(.splice(" ", [subject.raw]))
pieces.push(.token(generated_syntax_token(kind: .left_brace, spelling: "{", leading: " ", source_id: source_id, source_span: source_span, context: context)))
loop ordered_patterns.count > 0 {
let pattern = ordered_patterns.pop()
let body = ordered_bodies.pop()
if let .some(pattern_value) = pattern {
if let .some(body_value) = body {
pieces.push(.splice(" ", [ungrouped_raw(raw: consume pattern_value.raw)]))
pieces.push(.token(generated_syntax_token(kind: .arrow, spelling: "->", leading: " ", source_id: source_id, source_span: source_span, context: context)))
pieces.push(.splice(" ", [body_value.raw]))
if ordered_patterns.count > 0 {
pieces.push(.token(generated_syntax_token(kind: .comma, spelling: ",", leading: "", source_id: source_id, source_span: source_span, context: context)))
}
}
}
}
pieces.push(.token(generated_syntax_token(kind: .right_brace, spelling: "}", leading: " ", source_id: source_id, source_span: source_span, context: context)))
SyntaxResult<Expr>(value: .some(Syntax<Expr>(raw: RawSyntax(category: .expr, pieces: pieces, trailing: "", group_when_spliced: true))), failure: .none)
}