xidl_parser_derive/
lib.rs1mod 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 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}