fix(napi-derive): remove ts type on field attrs (#1436)
This commit is contained in:
parent
84921fc0a3
commit
976acc773e
1 changed files with 51 additions and 7 deletions
|
@ -17,21 +17,23 @@ use std::{
|
||||||
io::{BufWriter, Result as IOResult, Write},
|
io::{BufWriter, Result as IOResult, Write},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use napi_derive_backend::BindgenResult;
|
||||||
#[cfg(not(feature = "noop"))]
|
#[cfg(not(feature = "noop"))]
|
||||||
use napi_derive_backend::{BindgenResult, TryToTokens};
|
use napi_derive_backend::TryToTokens;
|
||||||
#[cfg(all(feature = "type-def", not(feature = "noop")))]
|
#[cfg(all(feature = "type-def", not(feature = "noop")))]
|
||||||
use napi_derive_backend::{ToTypeDef, TypeDef};
|
use napi_derive_backend::{ToTypeDef, TypeDef};
|
||||||
#[cfg(not(feature = "noop"))]
|
#[cfg(not(feature = "noop"))]
|
||||||
use parser::{attrs::BindgenAttrs, ParseNapi};
|
use parser::{attrs::BindgenAttrs, ParseNapi};
|
||||||
use proc_macro::TokenStream as RawStream;
|
use proc_macro::TokenStream as RawStream;
|
||||||
|
use proc_macro2::TokenStream;
|
||||||
#[cfg(not(feature = "noop"))]
|
#[cfg(not(feature = "noop"))]
|
||||||
use proc_macro2::{TokenStream, TokenTree};
|
use proc_macro2::TokenTree;
|
||||||
#[cfg(not(feature = "noop"))]
|
|
||||||
use quote::ToTokens;
|
use quote::ToTokens;
|
||||||
|
use syn::Attribute;
|
||||||
|
#[cfg(not(feature = "noop"))]
|
||||||
|
use syn::Item;
|
||||||
#[cfg(feature = "compat-mode")]
|
#[cfg(feature = "compat-mode")]
|
||||||
use syn::{fold::Fold, parse_macro_input, ItemFn};
|
use syn::{fold::Fold, parse_macro_input, ItemFn};
|
||||||
#[cfg(not(feature = "noop"))]
|
|
||||||
use syn::{Attribute, Item};
|
|
||||||
|
|
||||||
/// ```ignore
|
/// ```ignore
|
||||||
/// #[napi]
|
/// #[napi]
|
||||||
|
@ -59,8 +61,50 @@ pub fn napi(attr: RawStream, input: RawStream) -> RawStream {
|
||||||
|
|
||||||
#[cfg(feature = "noop")]
|
#[cfg(feature = "noop")]
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn napi(_attr: RawStream, input: RawStream) -> RawStream {
|
pub fn napi(attr: RawStream, input: RawStream) -> RawStream {
|
||||||
input
|
match expand(attr.into(), input.into()) {
|
||||||
|
Ok(tokens) => tokens.into(),
|
||||||
|
Err(diagnostic) => {
|
||||||
|
println!("`napi` macro expand failed.");
|
||||||
|
|
||||||
|
(quote! { #diagnostic }).into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "noop")]
|
||||||
|
fn expand(_attr: TokenStream, input: TokenStream) -> BindgenResult<TokenStream> {
|
||||||
|
let mut item = syn::parse2::<syn::Item>(input.into())?;
|
||||||
|
let mut tokens = proc_macro2::TokenStream::new();
|
||||||
|
|
||||||
|
match item {
|
||||||
|
syn::Item::Struct(ref mut struct_) => struct_
|
||||||
|
.fields
|
||||||
|
.iter_mut()
|
||||||
|
.for_each(|field| find_and_remove_napi_attr(&mut field.attrs)),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
item.to_tokens(&mut tokens);
|
||||||
|
|
||||||
|
Ok(tokens)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "noop")]
|
||||||
|
fn find_and_remove_napi_attr(attrs: &mut Vec<Attribute>) {
|
||||||
|
loop {
|
||||||
|
let napi_attr = attrs
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.find(|&(_, m)| m.path.segments[0].ident == "napi");
|
||||||
|
|
||||||
|
let pos = match napi_attr {
|
||||||
|
Some((pos, _raw_attr)) => pos,
|
||||||
|
None => break,
|
||||||
|
};
|
||||||
|
|
||||||
|
attrs.remove(pos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "noop"))]
|
#[cfg(not(feature = "noop"))]
|
||||||
|
|
Loading…
Reference in a new issue