Skip to main content

derive_expand

Function derive_expand 

Source
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.