Associated Proc Macro Pattern

It's a common pattern to provide a foo crate with trait definitions, and foo-derive crate with a proc-macro derive implementation. Typically, you want foo and foo-derive to be versioned in lockstep, because derive crates like to use #[doc(hidden)] non-semver-guarded API. Usually, this is solved by a derive feature, which makes foo depend on foo-derive with =x.y.z constraint.

This, however, is problematic for compile times! It means that compilation of foo-derive is sequenced before compilation of foo. As foo-derive is a derive macro, it needs to parse the Rust language. Rust is not a small language, so parsing it is fundamentally hard, and requires loads of code to do correctly. So it takes some time to compile foo-derive. What's worse, while normally Cargo pipelines compilation such that .rmeta files are all that's needed to unblock compilation of dependent crates, for proc macros Cargo really needs to link the whole

...