fn derive_expand(
db: &dyn SourceDatabase,
id: MacroCallId,
tt: &TopSubtree,
span: Span,
) -> ExpandResult<TopSubtree>Expand description
We generate a very specific expansion here, as we do not actually expand the #[derive] attribute
itself in name res, but we do want to expand it to something for the IDE layer, so that the input
derive attributes can be downmapped, and resolved as proper paths.
This is basically a hack, that simplifies the hacks we need in a lot of ide layer places to
somewhat inconsistently resolve derive attributes.
As such, we expand #[derive(Foo, bar::Bar)] into
#![Foo]
#![bar::Bar]which allows fallback path resolution in hir::Semantics to properly identify our derives. Since we do not expand the attribute in nameres though, we keep the original item.
The ideal expansion here would be for the #[derive] to re-emit the annotated item and somehow
use the input paths in its output as well.
But that would bring two problems with it, for one every derive would duplicate the item token tree
wasting a lot of memory, and it would also require some way to use a path in a way that makes it
always resolve as a derive without nameres recollecting them.
So this hacky approach is a lot more friendly for us, though it does require a bit of support in
hir::Semantics to make this work.