From f79891751500773df0a0521c75f0cc1ce27b3cef Mon Sep 17 00:00:00 2001 From: yingrueil Date: Wed, 19 Feb 2020 13:26:58 +0800 Subject: [PATCH 1/4] parser: extract condition for abstractions --- src/bindgen/parser.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/bindgen/parser.rs b/src/bindgen/parser.rs index f514fe74..6e9f855f 100644 --- a/src/bindgen/parser.rs +++ b/src/bindgen/parser.rs @@ -637,8 +637,11 @@ impl Parse { }; if let syn::Visibility::Public(_) = vis { - if sig.abi.is_omitted() || sig.abi.is_c() { - if let Some(exported_name) = named_symbol.exported_name() { + let is_extern_c = sig.abi.is_omitted() || sig.abi.is_c(); + let exported_name = named_symbol.exported_name(); + + if is_extern_c { + if let Some(exported_name) = exported_name { let path = Path::new(exported_name); match Function::load(path, self_type, &sig, false, &attrs, mod_cfg) { Ok(func) => { From 6085a0cfd04ee15013ae776678222ff8653fbc5a Mon Sep 17 00:00:00 2001 From: yingrueil Date: Wed, 19 Feb 2020 13:31:57 +0800 Subject: [PATCH 2/4] parser: use match statement to replace nested if-else statement --- src/bindgen/parser.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/bindgen/parser.rs b/src/bindgen/parser.rs index 6e9f855f..c9484614 100644 --- a/src/bindgen/parser.rs +++ b/src/bindgen/parser.rs @@ -640,8 +640,8 @@ impl Parse { let is_extern_c = sig.abi.is_omitted() || sig.abi.is_c(); let exported_name = named_symbol.exported_name(); - if is_extern_c { - if let Some(exported_name) = exported_name { + match (is_extern_c, exported_name) { + (true, Some(exported_name)) => { let path = Path::new(exported_name); match Function::load(path, self_type, &sig, false, &attrs, mod_cfg) { Ok(func) => { @@ -652,14 +652,16 @@ impl Parse { error!("Cannot use fn {} ({}).", loggable_item_name(), msg); } } - } else { + } + (true, None) => { warn!( "Skipping {} - (not `no_mangle`, and has no `export_name` attribute)", loggable_item_name() ); } - } else { - warn!("Skipping {} - (not `extern \"C\"`", loggable_item_name()); + (false, _) => { + warn!("Skipping {} - (not `extern \"C\"`", loggable_item_name()); + } } } else { warn!("Skipping {} - (not `pub`)", loggable_item_name()); From 754216c00a1bd2fbd8321473b8fb5dea8f724f7f Mon Sep 17 00:00:00 2001 From: yingrueil Date: Wed, 19 Feb 2020 13:35:27 +0800 Subject: [PATCH 3/4] parser: don't warn when function is not extern c and not no_mangle --- src/bindgen/parser.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bindgen/parser.rs b/src/bindgen/parser.rs index c9484614..c82b1d3d 100644 --- a/src/bindgen/parser.rs +++ b/src/bindgen/parser.rs @@ -659,9 +659,10 @@ impl Parse { loggable_item_name() ); } - (false, _) => { + (false, Some(_exported_name)) => { warn!("Skipping {} - (not `extern \"C\"`", loggable_item_name()); } + (false, None) => {} } } else { warn!("Skipping {} - (not `pub`)", loggable_item_name()); From cdcb52f58aa59f5ea8927845ef90166fe9896f7b Mon Sep 17 00:00:00 2001 From: yingrueil Date: Fri, 21 Feb 2020 13:32:39 +0800 Subject: [PATCH 4/4] parser: warn when function is partial exported Functions will be fully exported when they are `pub, `no_mangle`, and `extern "C"`. Only two cases we should not generate warning which are `pub, `no_mangle`, and `extern "C"` are all enabled or disabled. --- src/bindgen/parser.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/bindgen/parser.rs b/src/bindgen/parser.rs index c82b1d3d..7281234f 100644 --- a/src/bindgen/parser.rs +++ b/src/bindgen/parser.rs @@ -636,10 +636,10 @@ impl Parse { items.join("::") }; - if let syn::Visibility::Public(_) = vis { - let is_extern_c = sig.abi.is_omitted() || sig.abi.is_c(); - let exported_name = named_symbol.exported_name(); + let is_extern_c = sig.abi.is_omitted() || sig.abi.is_c(); + let exported_name = named_symbol.exported_name(); + if let syn::Visibility::Public(_) = vis { match (is_extern_c, exported_name) { (true, Some(exported_name)) => { let path = Path::new(exported_name); @@ -665,7 +665,27 @@ impl Parse { (false, None) => {} } } else { - warn!("Skipping {} - (not `pub`)", loggable_item_name()); + match (is_extern_c, exported_name) { + (true, Some(exported_name)) => { + warn!( + "Skipping {} - (not `pub` but is `extern \"C\"` and `no_mangle`)", + loggable_item_name() + ); + } + (true, None) => { + warn!( + "Skipping {} - (not `pub` but is `extern \"C\"`)", + loggable_item_name() + ); + } + (false, Some(_exported_name)) => { + warn!( + "Skipping {} - (not `pub` but is `no_mangle`)", + loggable_item_name() + ); + } + (false, None) => {} + } } }