use vyre_foundation::ir::{Expr, Node};
use super::fnlike_replacement::*;
use super::paste_branch::*;
use super::regular_branch::*;
use super::string_branch::*;
use super::MacroByteLayout;
pub(super) struct MaterializedFunctionLikeSpec<'a> {
pub(super) in_tok_types: &'a str,
pub(super) in_tok_starts: &'a str,
pub(super) in_tok_lens: &'a str,
pub(super) source_words: &'a str,
pub(super) source_layout: MacroByteLayout,
pub(super) macro_vals: &'a str,
pub(super) macro_replacement_params: &'a str,
pub(super) macro_replacement_starts: &'a str,
pub(super) macro_replacement_lens: &'a str,
pub(super) macro_replacement_words: &'a str,
pub(super) macro_replacement_layout: MacroByteLayout,
pub(super) out_tok_types: &'a str,
pub(super) out_tok_starts: &'a str,
pub(super) out_tok_lens: &'a str,
pub(super) out_source_words: &'a str,
pub(super) macro_arg_starts: &'a str,
pub(super) macro_arg_ends: &'a str,
pub(super) num_tokens: Expr,
pub(super) source_len: Expr,
pub(super) macro_replacement_source_len: Expr,
pub(super) max_out_tokens: u32,
pub(super) max_out_source_bytes: u32,
}
pub(super) fn emit_materialized_function_like_replacement(
spec: MaterializedFunctionLikeSpec<'_>,
) -> Vec<Node> {
let stringify = emit_materialized_stringification_branch(
spec.macro_replacement_params,
spec.macro_replacement_starts,
spec.macro_replacement_lens,
spec.macro_replacement_words,
spec.macro_replacement_layout,
spec.macro_replacement_source_len.clone(),
spec.macro_arg_starts,
spec.macro_arg_ends,
spec.in_tok_starts,
spec.in_tok_lens,
spec.source_words,
spec.source_layout,
spec.source_len.clone(),
spec.out_tok_types,
spec.out_tok_starts,
spec.out_tok_lens,
spec.out_source_words,
spec.max_out_tokens,
spec.max_out_source_bytes,
spec.num_tokens.clone(),
);
let paste = emit_materialized_function_paste_branch(MaterializedPasteBranchSpec {
in_tok_types: spec.in_tok_types,
in_tok_starts: spec.in_tok_starts,
in_tok_lens: spec.in_tok_lens,
source_words: spec.source_words,
source_layout: spec.source_layout,
macro_vals: spec.macro_vals,
macro_replacement_params: spec.macro_replacement_params,
macro_replacement_starts: spec.macro_replacement_starts,
macro_replacement_lens: spec.macro_replacement_lens,
macro_replacement_words: spec.macro_replacement_words,
macro_replacement_layout: spec.macro_replacement_layout,
out_tok_types: spec.out_tok_types,
out_tok_starts: spec.out_tok_starts,
out_tok_lens: spec.out_tok_lens,
out_source_words: spec.out_source_words,
macro_arg_starts: spec.macro_arg_starts,
macro_arg_ends: spec.macro_arg_ends,
num_tokens: spec.num_tokens.clone(),
source_len: spec.source_len.clone(),
macro_replacement_source_len: spec.macro_replacement_source_len.clone(),
max_out_tokens: spec.max_out_tokens,
max_out_source_bytes: spec.max_out_source_bytes,
});
let regular = emit_materialized_regular_replacement_branch(
spec.in_tok_types,
spec.in_tok_starts,
spec.in_tok_lens,
spec.source_words,
spec.source_layout,
spec.macro_replacement_starts,
spec.macro_replacement_lens,
spec.macro_replacement_words,
spec.macro_replacement_layout,
spec.out_tok_types,
spec.out_tok_starts,
spec.out_tok_lens,
spec.out_source_words,
spec.macro_arg_starts,
spec.macro_arg_ends,
spec.num_tokens.clone(),
spec.source_len.clone(),
spec.macro_replacement_source_len.clone(),
spec.max_out_tokens,
spec.max_out_source_bytes,
);
emit_function_like_replacement_walk(FunctionLikeReplacementSpec {
in_tok_types: spec.in_tok_types,
macro_vals: spec.macro_vals,
macro_replacement_params: spec.macro_replacement_params,
macro_arg_starts: spec.macro_arg_starts,
macro_arg_ends: spec.macro_arg_ends,
num_tokens: spec.num_tokens,
stringify,
paste,
regular,
})
}