Working commit

This commit is contained in:
2025-06-20 21:48:23 +10:00
parent 94e1cf2eb0
commit 06d3eebaa1
18 changed files with 316 additions and 159 deletions

View File

@@ -2,7 +2,7 @@ use crate::utils::{ffi_crate, syn_assert, syn_error};
use darling::FromMeta;
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
use syn::{spanned::*, *};
use syn::*;
#[derive(Debug, FromMeta)]
pub struct Args {}

View File

@@ -5,8 +5,16 @@ use syn::parse_macro_input;
mod cdef;
mod metatype;
mod module;
mod utils;
#[proc_macro_attribute]
pub fn module(_args: TokenStream1, input: TokenStream1) -> TokenStream1 {
module::transform(parse_macro_input!(input))
.unwrap_or_else(|err| err.into_compile_error().into_token_stream())
.into()
}
#[proc_macro_attribute]
pub fn cdef(args: TokenStream1, input: TokenStream1) -> TokenStream1 {
NestedMeta::parse_meta_list(args.into())
@@ -17,7 +25,7 @@ pub fn cdef(args: TokenStream1, input: TokenStream1) -> TokenStream1 {
}
#[proc_macro_attribute]
pub fn metatype(args: TokenStream1, input: TokenStream1) -> TokenStream1 {
pub fn metatype(_args: TokenStream1, input: TokenStream1) -> TokenStream1 {
metatype::transform(parse_macro_input!(input))
.unwrap_or_else(|err| err.into_compile_error().into_token_stream())
.into()

View File

@@ -1,7 +1,7 @@
use crate::utils::{ffi_crate, is_primitive, is_unit, pat_ident, syn_assert, syn_error, ty_name};
use crate::utils::{ffi_crate, is_primitive, is_unit, pat_ident, syn_assert, ty_name};
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
use syn::{spanned::*, *};
use syn::*;
pub fn transform(mut imp: ItemImpl) -> Result<TokenStream> {
syn_assert!(
@@ -146,7 +146,7 @@ enum FfiArgType {
Default,
}
fn get_ffi_arg_type(ty: &Type) -> FfiArgType {
fn get_ffi_arg_type(_ty: &Type) -> FfiArgType {
FfiArgType::Default
}

View File

@@ -0,0 +1,26 @@
use crate::utils::syn_assert;
use proc_macro2::TokenStream;
use quote::quote;
use syn::*;
pub fn transform(func: ItemFn) -> Result<TokenStream> {
syn_assert!(
func.sig.generics.params.is_empty(),
func.sig.generics,
"cannot be generic (not yet implemented)"
);
// let impls = generate_impls(&mut imp)?;
// let mod_name = format_ident!("__metatype__{}", ty_name(&imp.self_ty)?);
Ok(quote! {
#func
// #[doc(hidden)]
// #[allow(unused, non_snake_case)]
// mod #mod_name {
// use super::*;
// #impls
// }
})
}

View File

@@ -1,8 +1,9 @@
use std::env;
use syn::{spanned::*, *};
use syn::*;
macro_rules! syn_error {
($src:expr, $($fmt:expr),+) => {{
use syn::spanned::*;
return Err(syn::Error::new($src.span(), format!($($fmt),*)));
}};
}
@@ -10,7 +11,7 @@ macro_rules! syn_error {
macro_rules! syn_assert {
($cond:expr, $src:expr, $($fmt:expr),+) => {{
if !$cond {
syn_error!($src, $($fmt),+);
crate::utils::syn_error!($src, $($fmt),+);
}
}};
}