MCPcopy Create free account
hub / github.com/ForLoveOfCats/fae / generate_expression_impl

Function generate_expression_impl

src/codegen/codegen.rs:332–456  ·  view source on GitHub ↗
(
	context: &mut Context<'a, 'b>,
	generator: &mut G,
	expression: &'b Expression<'a>,
)

Source from the content-addressed store, hash-verified

330pub fn generate_expression<'a, 'b, G: Generator>(
331 context: &mut Context<'a, 'b>,
332 generator: &mut G,
333 expression: &'b Expression<'a>,
334) -> Option<G::Binding> {
335 generate_expression_impl::<_, false>(context, generator, expression)
336}
337
338pub fn generate_statement_expression<'a, 'b, G: Generator>(
339 context: &mut Context<'a, 'b>,
340 generator: &mut G,
341 expression: &'b Expression<'a>,
342) {
343 generate_expression_impl::<_, true>(context, generator, expression);
344}
345
346fn generate_expression_impl<'a, 'b, G: Generator, const IS_STATEMENT: bool>(
347 context: &mut Context<'a, 'b>,
348 generator: &mut G,
349 expression: &'b Expression<'a>,
350) -> Option<G::Binding> {
351 let debug_location = expression.debug_location;
352
353 match &expression.kind {
354 ExpressionKind::Block(block) => {
355 let start_index = context.defer_stack.len();
356 context.yield_target_stack.push(DeferMarker { start_index });
357 let result = generate_block(context, generator, block);
358 context.yield_target_stack.pop();
359 result
360 }
361
362 ExpressionKind::IfElseChain(chain_expression) => {
363 let start_index = context.defer_stack.len();
364 context.yield_target_stack.push(DeferMarker { start_index });
365 let result = generate_if_else_chain(context, generator, chain_expression);
366 context.yield_target_stack.pop();
367 result
368 }
369
370 ExpressionKind::Match(match_expression) => {
371 let start_index = context.defer_stack.len();
372 context.yield_target_stack.push(DeferMarker { start_index });
373 let result = generate_match(context, generator, match_expression);
374 context.yield_target_stack.pop();
375 result
376 }
377
378 ExpressionKind::NumberValue(value) => {
379 if IS_STATEMENT {
380 None
381 } else {
382 generate_number_value(context, generator, value)
383 }
384 }
385
386 &ExpressionKind::BooleanLiteral(literal) => {
387 if IS_STATEMENT {
388 None
389 } else {

Callers

nothing calls this directly

Calls 15

generate_blockFunction · 0.85
generate_if_else_chainFunction · 0.85
generate_matchFunction · 0.85
generate_number_valueFunction · 0.85
generate_boolean_literalFunction · 0.85
generate_string_literalFunction · 0.85
generate_array_literalFunction · 0.85
generate_slice_literalFunction · 0.85
generate_struct_literalFunction · 0.85

Tested by

no test coverage detected