rune_macros/
item.rs

1use core::mem::take;
2
3use proc_macro2::Span;
4use rune_core::item::{ComponentRef, ItemBuf};
5
6/// Construct a static item from a path.
7pub(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}