Как вы получаете тип блока impl в процедурном макросе Rust? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь написать процедурный макрос Rust, который можно применить к блоку impl, например:

struct SomeStruct { }

#[my_macro]
impl SomeStruct { }

Я использую синтаксис и кавычки для анализа и форматирования TokenStream s вмакро.Это выглядит примерно так:

#[proc_macro_attribute]
pub fn my_macro(meta: TokenStream, code: TokenStream) -> TokenStream {
    let input = parse_macro_input!(code as ItemImpl);

    // ...

    TokenStream::from(quote!(#input))
}

Есть ли способ получить доступ к имени типа блока impl с помощью syn?Я не вижу ни одного поля в ItemImpl, которое бы дало мне эту информацию.

1 Ответ

0 голосов
/ 26 декабря 2018

В документации перечислены 9 полей в ItemImpl:

  1. attrs: Vec<Attribute>
  2. defaultness: Option<Default>
  3. unsafety: Option<Unsafe>
  4. impl_token: Impl
  5. generics: Generics
  6. trait_: Option<(Option<Bang>, Path, For)>
  7. self_ty: Box<Type>
  8. brace_token: Brace
  9. items: Vec<ImplItem>

Только у одного из них есть слово "тип": self_ty.

use syn; // 0.15.23

fn example(input: syn::ItemImpl) {
    println!("{:#?}", input.self_ty);
}

fn main() {
    let code = syn::parse_str(
        r###"
        impl Foo {}
        "###,
    )
    .unwrap();

    example(code);
}
Path(
    TypePath {
        qself: None,
        path: Path {
            leading_colon: None,
            segments: [
                PathSegment {
                    ident: Ident(
                        Foo
                    ),
                    arguments: None
                }
            ]
        }
    }
)
...