linkme_impl/
lib.rs

1#![cfg_attr(all(test, exhaustive), feature(non_exhaustive_omitted_patterns_lint))]
2#![allow(
3    clippy::cast_possible_truncation, // https://github.com/rust-lang/rust-clippy/issues/7486
4    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}