Parse unsafety on function signatures
diff --git a/syntax/impls.rs b/syntax/impls.rs
index c34e3e5..ebebb3e 100644
--- a/syntax/impls.rs
+++ b/syntax/impls.rs
@@ -149,6 +149,7 @@
impl PartialEq for Signature {
fn eq(&self, other: &Signature) -> bool {
let Signature {
+ unsafety,
fn_token: _,
receiver,
args,
@@ -158,6 +159,7 @@
throws_tokens: _,
} = self;
let Signature {
+ unsafety: unsafety2,
fn_token: _,
receiver: receiver2,
args: args2,
@@ -166,7 +168,8 @@
paren_token: _,
throws_tokens: _,
} = other;
- receiver == receiver2
+ unsafety.is_some() == unsafety2.is_some()
+ && receiver == receiver2
&& ret == ret2
&& throws == throws2
&& args.len() == args2.len()
@@ -177,6 +180,7 @@
impl Hash for Signature {
fn hash<H: Hasher>(&self, state: &mut H) {
let Signature {
+ unsafety,
fn_token: _,
receiver,
args,
@@ -185,6 +189,7 @@
paren_token: _,
throws_tokens: _,
} = self;
+ unsafety.is_some().hash(state);
receiver.hash(state);
for arg in args {
arg.hash(state);
diff --git a/syntax/mod.rs b/syntax/mod.rs
index 03422d1..f52a582 100644
--- a/syntax/mod.rs
+++ b/syntax/mod.rs
@@ -87,6 +87,7 @@
}
pub struct Signature {
+ pub unsafety: Option<Token![unsafe]>,
pub fn_token: Token![fn],
pub receiver: Option<Receiver>,
pub args: Punctuated<Var, Token![,]>,
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 415b802..3ac5304 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -353,6 +353,7 @@
let ret = parse_return_type(&foreign_fn.sig.output, &mut throws_tokens)?;
let throws = throws_tokens.is_some();
let doc = attrs::parse_doc(cx, &foreign_fn.attrs);
+ let unsafety = foreign_fn.sig.unsafety;
let fn_token = foreign_fn.sig.fn_token;
let ident = foreign_fn.sig.ident.clone();
let paren_token = foreign_fn.sig.paren_token;
@@ -367,6 +368,7 @@
doc,
ident,
sig: Signature {
+ unsafety,
fn_token,
receiver,
args,
@@ -578,6 +580,7 @@
let ret = parse_return_type(&ty.output, &mut throws_tokens)?;
let throws = throws_tokens.is_some();
Ok(Type::Fn(Box::new(Signature {
+ unsafety: ty.unsafety,
fn_token: ty.fn_token,
receiver: None,
args,