rune_macros/
item.rs
1use core::mem::take;
2
3use proc_macro2::Span;
4use rune_core::item::{ComponentRef, ItemBuf};
5
6pub(crate) fn build_item(path: &syn::Path) -> syn::Result<syn::ExprArray> {
8 let mut buf = ItemBuf::new();
9 let mut first = path.leading_colon.is_some();
10
11 for s in &path.segments {
12 let ident = s.ident.to_string();
13
14 let c = if take(&mut first) {
15 ComponentRef::Crate(&ident)
16 } else {
17 ComponentRef::Str(&ident)
18 };
19
20 buf.push(c)
21 .map_err(|error| syn::Error::new_spanned(s, error))?;
22
23 match &s.arguments {
24 syn::PathArguments::None => {}
25 syn::PathArguments::AngleBracketed(generics) => {
26 return Err(syn::Error::new_spanned(
27 generics,
28 "Generic arguments are not supported",
29 ));
30 }
31 syn::PathArguments::Parenthesized(generics) => {
32 return Err(syn::Error::new_spanned(
33 generics,
34 "Generic arguments are not supported",
35 ));
36 }
37 }
38 }
39
40 let mut elems = syn::punctuated::Punctuated::new();
41
42 for &byte in buf.as_bytes() {
43 let byte = syn::LitByte::new(byte, Span::call_site());
44
45 elems.push(syn::Expr::Lit(syn::ExprLit {
46 attrs: Vec::new(),
47 lit: syn::Lit::Byte(byte),
48 }));
49 }
50
51 Ok(syn::ExprArray {
52 attrs: Vec::new(),
53 bracket_token: syn::token::Bracket::default(),
54 elems,
55 })
56}