I was under the impression that cargo's "feature unification" would unify these two.
Running commands like cargo tree -f "{p} {f}" only shows dependencies to first variant.
It's hard to tell without any information. Does cargo tree -e features -i syn provide more clues? I assume it's resolver 2?
I'm not sure how the features resolve in the presence of cfg(not(...)) attributes; I see there's a cfg(not(extra-traits)), but it's only minor (a non-public declarative macro).
Typically, syn would only be used in macros and only be needed at compile time. With something that calls itself a "powerful reflection library", I would be surprise to me if this "mirror-mirror" crate has an actual run-time use for syn as dependency, too. Nonetheless, your dependency tree uses more of syn's features at compile time, which is why this duplication happens. More work at compile time, but less code needing to be linked into your compiled binary