]>
git.proxmox.com Git - rustc.git/blob - compiler/rustc_macros/src/type_visitable.rs
4 pub fn type_visitable_derive(mut s
: synstructure
::Structure
<'_
>) -> proc_macro2
::TokenStream
{
5 if let syn
::Data
::Union(_
) = s
.ast().data
{
6 panic
!("cannot derive on union")
9 if !s
.ast().generics
.lifetimes().any(|lt
| lt
.lifetime
.ident
== "tcx") {
10 s
.add_impl_generic(parse_quote
! { 'tcx }
);
13 s
.add_bounds(synstructure
::AddBounds
::Generics
);
14 let body_visit
= s
.each(|bind
| {
16 ::rustc_middle
::ty
::visit
::TypeVisitable
::visit_with(#bind, __visitor)?;
19 s
.bind_with(|_
| synstructure
::BindStyle
::Move
);
22 quote
!(::rustc_middle
::ty
::visit
::TypeVisitable
<'tcx
>),
24 fn visit_with
<__V
: ::rustc_middle
::ty
::visit
::TypeVisitor
<'tcx
>>(
27 ) -> ::std
::ops
::ControlFlow
<__V
::BreakTy
> {
28 match *self { #body_visit }
29 ::std
::ops
::ControlFlow
::Continue(())