Fix the constructor and catch attributes combined

This commit fixes annotations that include both the `constructor` and `catch`
attributes on imported types, ensuring that we infer the right type being
returned after extracting the first type parameter of the `Result`.

Closes #735
This commit is contained in:
Alex Crichton
2018-08-20 10:40:54 -07:00
parent adcc0dd23e
commit 4195af68e7
3 changed files with 19 additions and 1 deletions

View File

@ -486,7 +486,7 @@ impl<'a> ConvertToAst<(BindgenAttrs, &'a Option<String>)> for syn::ForeignItemFn
ast::ImportFunctionKind::Method { class, ty, kind }
} else if opts.constructor() {
let class = match wasm.ret {
let class = match js_ret {
Some(ref ty) => ty,
_ => bail_span!(self, "constructor returns must be bare types"),
};

View File

@ -123,3 +123,11 @@ exports.run_rust_option_tests = function() {
assert.strictEqual(wasm.rust_return_none(), undefined);
assert.strictEqual(wasm.rust_return_some() === undefined, false);
};
exports.CatchConstructors = class {
constructor(x) {
if (x == 0) {
throw new Error('bad!');
}
}
};

View File

@ -76,6 +76,10 @@ extern {
fn return_undefined() -> Option<Options>;
fn return_some() -> Option<Options>;
fn run_rust_option_tests();
type CatchConstructors;
#[wasm_bindgen(constructor, catch)]
fn new(x: u32) -> Result<CatchConstructors, JsValue>;
}
#[wasm_bindgen]
@ -199,3 +203,9 @@ pub fn rust_return_none() -> Option<Options> {
pub fn rust_return_some() -> Option<Options> {
Some(Options::new())
}
#[wasm_bindgen_test]
fn catch_constructors() {
assert!(CatchConstructors::new(0).is_err());
assert!(CatchConstructors::new(1).is_ok());
}