Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix conditional #[wasm_bindgen] in impls #1208

Merged
merged 1 commit into from
Jan 28, 2019

Commits on Jan 28, 2019

  1. Fix conditional #[wasm_bindgen] in impls

    Reported in rustwasm#1191 the fix requires us to get a bit creative I think. The
    general gist is that a block like this:
    
        #[wasm_bindgen]
        impl Foo {
            pub fn foo() {}
        }
    
    was previously expanded all in one go. Now, however, it's expanded into:
    
        impl Foo {
            #[__wasm_bindgen_class_marker(Foo = "Foo")]
            pub fn foo() {}
        }
    
        // goop generated by orginal #[wasm_bindgen]
    
    This method of expansion takes advantage of rustc's recursive expansion
    feature. It also allows us to expand `impl` blocks and allow inner items
    to not be fully expanded yet, such as still having `#[cfg]` attributes
    (like in the original bug report).
    
    We use theinternal `__wasm_bindgen_class_marker` to indicate that we're
    parsing an `ImplItemMethod` unconditionally, and then generation
    proceeds as usual. The only final catch is that when we're expanding in
    an `impl` block we have to generate tokens for the `Program`
    (wasm-bindgen injected goop like the custom section) inside the body
    of the function itself instead of next to it. Otherwise we'd get syntax
    errors inside of impl blocks!
    
    Closes rustwasm#1191
    alexcrichton committed Jan 28, 2019
    Configuration menu
    Copy the full SHA
    c35d6f4 View commit details
    Browse the repository at this point in the history