@@ -10,6 +10,8 @@ extern crate proc_macro2;
10
10
extern crate serde_json;
11
11
extern crate wasm_bindgen_shared as shared;
12
12
13
+ use std:: borrow:: Cow ;
14
+ use std:: env;
13
15
use std:: sync:: atomic:: * ;
14
16
15
17
use proc_macro:: TokenStream ;
@@ -39,6 +41,24 @@ pub fn wasm_bindgen(attr: TokenStream, input: TokenStream) -> TokenStream {
39
41
ret. into ( )
40
42
}
41
43
44
+ fn to_ident_name ( s : & str ) -> Cow < str > {
45
+ if s. chars ( ) . all ( |c| match c {
46
+ 'a' ...'z' | 'A' ...'Z' | '0' ...'9' | '_' => true ,
47
+ _ => false ,
48
+ } ) {
49
+ return Cow :: from ( s) ;
50
+ }
51
+
52
+ Cow :: from (
53
+ s. chars ( )
54
+ . map ( |c| match c {
55
+ 'a' ...'z' | 'A' ...'Z' | '0' ...'9' | '_' => c,
56
+ _ => '_' ,
57
+ } )
58
+ . collect :: < String > ( ) ,
59
+ )
60
+ }
61
+
42
62
// Generate wrappers for all the items that we've found
43
63
fn generate_wrappers ( program : ast:: Program , tokens : & mut Tokens ) {
44
64
for export in program. exports . iter ( ) {
@@ -62,9 +82,18 @@ fn generate_wrappers(program: ast::Program, tokens: &mut Tokens) {
62
82
// eventually have it actually in its own section.
63
83
64
84
static CNT : AtomicUsize = ATOMIC_USIZE_INIT ;
65
- let generated_static_name = format ! ( "__WASM_BINDGEN_GENERATED{}" ,
66
- CNT . fetch_add( 1 , Ordering :: SeqCst ) ) ;
85
+
86
+ let crate_name = env:: var ( "CARGO_PKG_NAME" ) . expect ( "should have CARGO_PKG_NAME env var" ) ;
87
+ let crate_vers = env:: var ( "CARGO_PKG_VERSION" ) . expect ( "should have CARGO_PKG_VERSION env var" ) ;
88
+
89
+ let generated_static_name = format ! (
90
+ "__WASM_BINDGEN_GENERATED_{}_{}_{}" ,
91
+ to_ident_name( & crate_name) ,
92
+ to_ident_name( & crate_vers) ,
93
+ CNT . fetch_add( 1 , Ordering :: SeqCst )
94
+ ) ;
67
95
let generated_static_name = syn:: Ident :: from ( generated_static_name) ;
96
+
68
97
let mut generated_static_value = Tokens :: new ( ) ;
69
98
let generated_static_length = program. wbg_literal ( & mut generated_static_value) ;
70
99
0 commit comments