Store richer adapter types, don't use instructions for TypeScript (#1945)

This commit updates how TypeScript signature are generated from adapters
in wasm-bindgen. A richer set of `AdapterType` types are now stored
which record information about optional types and such. These direct
`AdapterType` values are then used to calculate the TypeScript
signature, rather than following the instructions in an adapter function
(which only works anyway for wasm-bindgen generated adapters).

This should be more robust since it reads the actual true signature of
the adapter to generate the TypeScript signature, rather than attempting
to ad-hoc-ly infer it from the various instructions, which was already
broken.

A number of refactorings were involved here, but the main pieces are:

* The `AdapterType` type is a bit more rich now to describe more
  Rust-like types.
* The `TypescriptArg` structure is now gone and instead return values
  are directly inferred from type signatures of adapters.
* The `typescript_{required,optional}` methods are no longer needed.
* The return of `JsBuilder::process` was enhanced to return more values,
  rather than storing some return values on the structure itself.

Closes #1926
This commit is contained in:
Alex Crichton
2020-01-07 11:34:02 -06:00
committed by GitHub
parent 6c27376ac2
commit f66d83ff70
8 changed files with 206 additions and 209 deletions

View File

@ -13,4 +13,8 @@ impl A {
pub fn other() {}
pub fn foo(&self) {}
pub fn ret_bool(&self) -> bool { true }
pub fn take_bool(&self, _: bool) {}
pub fn take_many(&self, _: bool, _: f64, _: u32) {}
}

View File

@ -4,3 +4,6 @@ const a = new wbg.A();
wbg.A.other();
a.foo();
a.free();
const b: boolean = a.ret_bool()
a.take_bool(b);
a.take_many(b, 1, 2);