Skip to content

Commit

Permalink
Disallow both structural and host_binding
Browse files Browse the repository at this point in the history
  • Loading branch information
alexcrichton committed Nov 9, 2018
1 parent 4c42aba commit 8ba467e
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 8 deletions.
21 changes: 13 additions & 8 deletions crates/macro-support/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,11 +150,11 @@ impl BindgenAttrs {
}

/// Whether the `host_binding` attribute is present
fn host_binding(&self) -> bool {
self.attrs.iter().any(|a| match *a {
BindgenAttr::HostBinding => true,
_ => false,
})
fn host_binding(&self) -> Option<&Ident> {
self.attrs.iter().filter_map(|a| match a {
BindgenAttr::HostBinding(i) => Some(i),
_ => None,
}).next()
}

/// Whether the readonly attributes is present
Expand Down Expand Up @@ -237,7 +237,7 @@ pub enum BindgenAttr {
IndexingSetter,
IndexingDeleter,
Structural,
HostBinding,
HostBinding(Ident),
Readonly,
JsName(String, Span),
JsClass(String),
Expand Down Expand Up @@ -272,7 +272,7 @@ impl Parse for BindgenAttr {
return Ok(BindgenAttr::Structural);
}
if attr == "host_binding" {
return Ok(BindgenAttr::HostBinding);
return Ok(BindgenAttr::HostBinding(attr))
}
if attr == "readonly" {
return Ok(BindgenAttr::Readonly);
Expand Down Expand Up @@ -555,13 +555,18 @@ impl<'a> ConvertToAst<(BindgenAttrs, &'a Option<String>)> for syn::ForeignItemFn
ShortHash(data)
)
};
if let Some(ident) = opts.host_binding() {
if opts.structural() {
bail_span!(ident, "cannot specify both `structural` and `host_binding`");
}
}
Ok(ast::ImportKind::Function(ast::ImportFunction {
function: wasm,
kind,
js_ret,
catch,
variadic,
structural: opts.structural() || !opts.host_binding(),
structural: opts.structural() || opts.host_binding().is_none(),
rust_name: self.ident.clone(),
shim: Ident::new(&shim, Span::call_site()),
doc_comment: None,
Expand Down
11 changes: 11 additions & 0 deletions crates/macro/ui-tests/structural-and-host-binding.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern "C" {
type Foo;

#[wasm_bindgen(method, structural, host_binding)]
fn bar(this: &Foo);
}
8 changes: 8 additions & 0 deletions crates/macro/ui-tests/structural-and-host-binding.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: cannot specify both `structural` and `host_binding`
--> $DIR/structural-and-host-binding.rs:9:40
|
9 | #[wasm_bindgen(method, structural, host_binding)]
| ^^^^^^^^^^^^

error: aborting due to previous error

0 comments on commit 8ba467e

Please sign in to comment.