Add trace attribute

This commit is contained in:
dalance 2019-07-16 10:27:09 +09:00
parent 5211f96d95
commit d0ed56e092
5 changed files with 78 additions and 57 deletions

View File

@ -10,5 +10,5 @@ edition = "2018"
proc-macro = true
[dependencies]
syn = "0.14.4"
quote = "0.6.3"
syn = { version = "0.15.18", features = ["full", "fold", "parsing"] }
quote = "0.6.9"

View File

@ -4,7 +4,7 @@ extern crate proc_macro;
use crate::proc_macro::TokenStream;
use quote::quote;
use syn;
use syn::{self, parse_macro_input, ItemFn};
#[proc_macro_derive(Node)]
pub fn node_derive(input: TokenStream) -> TokenStream {
@ -113,3 +113,25 @@ fn impl_any_node(ast: &syn::DeriveInput) -> TokenStream {
};
gen.into()
}
#[proc_macro_attribute]
pub fn trace(_attr: TokenStream, item: TokenStream) -> TokenStream {
let item = parse_macro_input!(item as ItemFn);
impl_trace(&item)
}
fn impl_trace(item: &syn::ItemFn) -> TokenStream {
let ident = &item.ident;
let mut item = item.clone();
let tracer = quote! {
println!("{}: {:?}", stringify!(#ident), s);
};
let tracer: TokenStream = tracer.into();
let tracer = parse_macro_input!(tracer as syn::Stmt);
item.block.stmts.insert(0, tracer);
let gen = quote! {
#item
};
gen.into()
}

View File

@ -151,8 +151,26 @@ pub fn nonrange_variable_lvalue(s: Span) -> IResult<Span, NonrangeVariableLvalue
#[cfg(test)]
mod tests {
//use super::*;
use super::*;
#[test]
fn test() {}
fn test_net_lvalue() {
parser_test!(net_lvalue, "A", Ok((_, _)));
parser_test!(net_lvalue, "{A[7:0],A[15:8],A[23:16]}", Ok((_, _)));
parser_test!(net_lvalue, "'{A[7:0],A[15:8]}", Ok((_, _)));
}
#[test]
fn test_variable_lvalue() {
parser_test!(variable_lvalue, "A", Ok((_, _)));
parser_test!(variable_lvalue, "{A[7:0],A[15:8],A[23:16]}", Ok((_, _)));
parser_test!(variable_lvalue, "'{A[7:0],A[15:8]}", Ok((_, _)));
}
#[test]
fn test_nonrange_variable_lvalue() {
parser_test!(nonrange_variable_lvalue, "A", Ok((_, _)));
parser_test!(nonrange_variable_lvalue, "A[][2][3]", Ok((_, _)));
//parser_test!(nonrange_variable_lvalue, "A[][]", Ok((_, _)));
}
}

View File

@ -548,16 +548,4 @@ mod tests {
parser_test!(unbased_unsized_literal, "'x", Ok((_, _)));
parser_test!(unbased_unsized_literal, "'z", Ok((_, _)));
}
#[test]
fn test_node() {
if let Ok((_, x)) = all_consuming(number)(Span::new_extra("10.00", 0)) {
//assert_eq!(x.test(), "aaaa");
//let y: AnyNode = (&x).into();
for a in &x {
dbg!(a);
//assert_eq!(format!("{:?}", a), "aaa");
}
}
}
}

View File

@ -587,45 +587,38 @@ mod tests {
#[test]
fn test_primary() {
let ret = all_consuming(primary)(Span::new_extra("2.1ns", 0));
if let Ok((_, Primary::PrimaryLiteral(PrimaryLiteral::TimeLiteral(_)))) = ret {
} else {
assert!(false, "{:?}", ret)
}
let ret = all_consuming(primary)(Span::new_extra("40 ps", 0));
if let Ok((_, Primary::PrimaryLiteral(PrimaryLiteral::TimeLiteral(_)))) = ret {
} else {
assert!(false, "{:?}", ret)
}
let ret = all_consuming(primary)(Span::new_extra("'0", 0));
if let Ok((_, Primary::PrimaryLiteral(PrimaryLiteral::UnbasedUnsizedLiteral(_)))) = ret {
} else {
assert!(false, "{:?}", ret)
}
let ret = all_consuming(primary)(Span::new_extra("10", 0));
if let Ok((_, Primary::PrimaryLiteral(PrimaryLiteral::Number(_)))) = ret {
} else {
assert!(false, "{:?}", ret)
}
let ret = all_consuming(primary)(Span::new_extra("\"aaa\"", 0));
if let Ok((_, Primary::PrimaryLiteral(PrimaryLiteral::StringLiteral(_)))) = ret {
} else {
assert!(false, "{:?}", ret)
}
let ret = all_consuming(primary)(Span::new_extra("this", 0));
if let Ok((_, Primary::This(_))) = ret {
} else {
assert!(false, "{:?}", ret)
}
let ret = all_consuming(primary)(Span::new_extra("$", 0));
if let Ok((_, Primary::Dollar(_))) = ret {
} else {
assert!(false, "{:?}", ret)
}
let ret = all_consuming(primary)(Span::new_extra("null", 0));
if let Ok((_, Primary::Null(_))) = ret {
} else {
assert!(false, "{:?}", ret)
}
parser_test!(
primary,
"2.1ns",
Ok((_, Primary::PrimaryLiteral(PrimaryLiteral::TimeLiteral(_))))
);
parser_test!(
primary,
"40 ps",
Ok((_, Primary::PrimaryLiteral(PrimaryLiteral::TimeLiteral(_))))
);
parser_test!(
primary,
"'0",
Ok(
(
_,
Primary::PrimaryLiteral(PrimaryLiteral::UnbasedUnsizedLiteral(_))
),
)
);
parser_test!(
primary,
"10",
Ok((_, Primary::PrimaryLiteral(PrimaryLiteral::Number(_))))
);
parser_test!(
primary,
"\"aaa\"",
Ok((_, Primary::PrimaryLiteral(PrimaryLiteral::StringLiteral(_))))
);
parser_test!(primary, "this", Ok((_, Primary::This(_))));
parser_test!(primary, "$", Ok((_, Primary::Dollar(_))));
parser_test!(primary, "null", Ok((_, Primary::Null(_))));
}
}