Skip to main content

xidl_parser_derive/
lib.rs

1mod parser;
2use proc_macro::TokenStream;
3use proc_macro2::Span;
4use quote::quote;
5
6#[proc_macro_derive(Parser, attributes(ts))]
7pub fn derive_parser(input: TokenStream) -> TokenStream {
8    parser::tree_sitter_parser(input)
9}
10
11#[proc_macro]
12pub fn node_id(input: TokenStream) -> TokenStream {
13    let name = syn::parse_macro_input!(input as syn::LitStr);
14    let name = name.value();
15
16    let l = &tree_sitter_idl::language();
17    let id = l.id_for_node_kind(&name, true);
18    let id = id as usize;
19    if id == 0 {
20        eprintln!("unknown node kind: {name}");
21    }
22    // if id == 0 {
23    //     return syn::Error::new(Span::call_site(), format!("unknown node kind: {name}"))
24    //         .into_compile_error()
25    //         .into();
26    // }
27    let id = syn::LitInt::new(&id.to_string(), Span::call_site());
28
29    quote! {
30        #id
31    }
32    .into()
33}
34
35#[proc_macro]
36pub fn name(input: TokenStream) -> TokenStream {
37    let id = syn::parse_macro_input!(input as syn::LitInt);
38    let Ok(id) = id.base10_parse() else {
39        return syn::Error::new(Span::call_site(), format!("unknown field id: {id}"))
40            .into_compile_error()
41            .into();
42    };
43
44    let l = &tree_sitter_idl::language();
45    let Some(id) = l.field_name_for_id(id) else {
46        return syn::Error::new(Span::call_site(), format!("unknown field name: {id}"))
47            .into_compile_error()
48            .into();
49    };
50
51    quote! {
52        #id
53    }
54    .into()
55}