mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-06-12 12:31:22 +00:00
Remove the need for a ConstructorToken
This commit removes the need for an injected `ConstructorToken` type and also cleans up the story we have for generating constructors a bit. After this commit a `constructor()` is omitted entirely if we're in non-debug mode and there's no actual listed constructor. Additionally we don't deal with splat arguments and rerouting constructors, Nick was kind enough to enlighten me about `Object.create` which is creating an instance without running the constructor! Instances of an exported type are now created through one of two methods: * If `#[wasm_bindgen(constructor)]` is present, then a `constructor` is generated with the appropriate signature. If a constructor is not present and we're in debug mode, a throwing constructor is generated. If we're in release mode and there's no constructor, no constructor is generated. * Otherwise if a binding returns an instance of a type (or otherwise needs to manfuacture an instance, then it will cause an internal `__wrap` function to be generated. This function will use `Object.create` to create an instance without running the constructor. This should ideally clean up our generated JS for classes quite a bit, making it much more lean-and-mean!
This commit is contained in:
@ -729,7 +729,7 @@ impl<'a> MacroParse<(Option<BindgenAttrs>, &'a mut TokenStream)> for syn::Item {
|
||||
program.exports.push(ast::Export {
|
||||
class: None,
|
||||
method_self: None,
|
||||
constructor: None,
|
||||
is_constructor: false,
|
||||
comments,
|
||||
rust_name: f.ident.clone(),
|
||||
function: f.convert(opts)?,
|
||||
@ -852,12 +852,6 @@ impl<'a, 'b> MacroParse<()> for (&'a Ident, &'b mut syn::ImplItem) {
|
||||
let opts = BindgenAttrs::find(&mut method.attrs)?;
|
||||
let comments = extract_doc_comments(&method.attrs);
|
||||
let is_constructor = opts.constructor();
|
||||
let constructor = if is_constructor {
|
||||
Some(method.sig.ident.to_string())
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let (function, method_self) = function_from_decl(
|
||||
opts.js_name().unwrap_or(&method.sig.ident.to_string()),
|
||||
Box::new(method.sig.decl.clone()),
|
||||
@ -870,7 +864,7 @@ impl<'a, 'b> MacroParse<()> for (&'a Ident, &'b mut syn::ImplItem) {
|
||||
program.exports.push(ast::Export {
|
||||
class: Some(class.clone()),
|
||||
method_self,
|
||||
constructor,
|
||||
is_constructor,
|
||||
function,
|
||||
comments,
|
||||
rust_name: method.sig.ident.clone(),
|
||||
|
Reference in New Issue
Block a user