#compiler-plugin #monomorphization

macro momo

A procedural macro to de-monomorphize generic methods

2 releases

0.2.2 Nov 11, 2021
0.2.1 Oct 28, 2019

#1061 in Rust patterns




Keep your compile time during MOnoMOrphization badge

This is a proc_macro crate to help keeping the code footprint of generic methods in check. Often, generics are used in libraries to improve ergonomics. However, this has a cost in compile time and binary size. Optimally, one creates a small shell function that does the generic conversions and then calls an inner function, but that makes the code less readable.

Add a #[momo] annotation from this crate to split your function into an outer conversion and a private inner function. In return, you get some compile time for a tiny bit of runtime (if at all) – without impairing readability.

Conversions currently supported are Into (.into()), AsRef (.as_ref()), and AsMut (.as_mut()). See enum Conversions in code.

Notes on watt

This new updated version uses D. Tolnay's watt runtime to speed up the compile time, which was negatively affected with proc macro baggage.

The main crate uses a pre-built wasm containing the tagged version. Rebuilding the wasm can be done with the commands:

cd wasm
cargo build --release --target wasm32-unknown-unknown
# If wasm-opt is unavailable, copying the file is fine.
wasm-opt target/wasm32-unknown-unknown/release/momo_watt.wasm -Oz \
--strip-debug --simplify-globals --vacuum -o ../src/momo.wasm

You might need to add the wasm32-unknown-unknown target to your Rust toolchain.

(If you are tagging a new version, remember to commit the new wasm file. Also change the versions in both Cargo.toml files.)

Debugging the macro

The cargo-expand tool may be used to expand the output of macro expansion, including from this proc-macro. To examine the results of the example file, use cargo expand --example check.