mirror of
https://github.com/rustwasm/wasm-bindgen.git
synced 2024-12-18 07:11:56 +03:00
c35d6f4b0a
Reported in #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 #1191
63 lines
1.4 KiB
Plaintext
63 lines
1.4 KiB
Plaintext
error: #[wasm_bindgen] default impls are not supported
|
|
--> $DIR/invalid-methods.rs:11:1
|
|
|
|
|
11 | default impl A {
|
|
| ^^^^^^^
|
|
|
|
error: #[wasm_bindgen] unsafe impls are not supported
|
|
--> $DIR/invalid-methods.rs:15:1
|
|
|
|
|
15 | unsafe impl A {
|
|
| ^^^^^^
|
|
|
|
error: #[wasm_bindgen] trait impls are not supported
|
|
--> $DIR/invalid-methods.rs:19:6
|
|
|
|
|
19 | impl Clone for A {
|
|
| ^^^^^
|
|
|
|
error: #[wasm_bindgen] generic impls aren't supported
|
|
--> $DIR/invalid-methods.rs:23:5
|
|
|
|
|
23 | impl<T> A {
|
|
| ^^^
|
|
|
|
error: unsupported self type in #[wasm_bindgen] impl
|
|
--> $DIR/invalid-methods.rs:27:6
|
|
|
|
|
27 | impl &'static A {
|
|
| ^^^^^^^^^^
|
|
|
|
error: const definitions aren't supported with #[wasm_bindgen]
|
|
--> $DIR/invalid-methods.rs:34:5
|
|
|
|
|
34 | const X: u32 = 3;
|
|
| ^^^^^^^^^^^^^^^^^
|
|
|
|
error: type definitions in impls aren't supported with #[wasm_bindgen]
|
|
--> $DIR/invalid-methods.rs:35:5
|
|
|
|
|
35 | type Y = u32;
|
|
| ^^^^^^^^^^^^^
|
|
|
|
error: macros in impls aren't supported
|
|
--> $DIR/invalid-methods.rs:36:5
|
|
|
|
|
36 | x!();
|
|
| ^^^^^
|
|
|
|
error: can only #[wasm_bindgen] non-const functions
|
|
--> $DIR/invalid-methods.rs:43:9
|
|
|
|
|
43 | pub const fn foo() {}
|
|
| ^^^^^
|
|
|
|
error: can only bindgen safe functions
|
|
--> $DIR/invalid-methods.rs:48:9
|
|
|
|
|
48 | pub unsafe fn foo() {}
|
|
| ^^^^^^
|
|
|
|
error: aborting due to 10 previous errors
|
|
|