build_match_expr

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)
}