1#![cfg_attr(all(test, exhaustive), feature(non_exhaustive_omitted_patterns_lint))]
2#![allow(
3 clippy::cast_possible_truncation, clippy::needless_pass_by_value,
5 clippy::too_many_lines,
6 clippy::uninlined_format_args,
7)]
8
9mod args;
10mod attr;
11mod declaration;
12mod element;
13mod hash;
14mod linker;
15mod ty;
16
17use crate::args::Args;
18use crate::hash::hash;
19use proc_macro::TokenStream;
20use proc_macro2::{Ident, Span};
21use quote::{ToTokens, TokenStreamExt as _};
22use syn::parse_macro_input;
23
24#[proc_macro_attribute]
25pub fn distributed_slice(args: TokenStream, input: TokenStream) -> TokenStream {
26 let args = match ::syn::parse::<Args>(args) {
::syn::__private::Ok(data) => data,
::syn::__private::Err(err) => {
return ::syn::__private::TokenStream::from(err.to_compile_error());
}
}parse_macro_input!(args as Args);
27
28 let expanded = match args {
29 Args::None => declaration::expand(match ::syn::parse::<_>(input) {
::syn::__private::Ok(data) => data,
::syn::__private::Err(err) => {
return ::syn::__private::TokenStream::from(err.to_compile_error());
}
}parse_macro_input!(input)),
30 Args::Path(path) => element::expand(path, None, match ::syn::parse::<_>(input) {
::syn::__private::Ok(data) => data,
::syn::__private::Err(err) => {
return ::syn::__private::TokenStream::from(err.to_compile_error());
}
}parse_macro_input!(input)),
31 Args::PathPos(path, pos) => element::expand(path, pos, match ::syn::parse::<_>(input) {
::syn::__private::Ok(data) => data,
::syn::__private::Err(err) => {
return ::syn::__private::TokenStream::from(err.to_compile_error());
}
}parse_macro_input!(input)),
32 };
33
34 TokenStream::from(expanded)
35}
36
37#[allow(non_camel_case_types)]
38struct private;
39
40impl ToTokens for private {
41 fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
42 tokens.append(Ident::new(
43 "__private35"concat!("__private", env!("CARGO_PKG_VERSION_PATCH")),
44 Span::call_site(),
45 ));
46 }
47}