@@ -111,17 +111,16 @@ impl<'a> Context<'a> {
111
111
& mut self ,
112
112
export_name : & str ,
113
113
contents : & str ,
114
- comments : Option < String > ,
114
+ comments : Option < & str > ,
115
115
) -> Result < ( ) , Error > {
116
116
let definition_name = generate_identifier ( export_name, & mut self . defined_identifiers ) ;
117
117
if contents. starts_with ( "class" ) && definition_name != export_name {
118
118
bail ! ( "cannot shadow already defined class `{}`" , export_name) ;
119
119
}
120
120
121
121
let contents = contents. trim ( ) ;
122
- if let Some ( ref c) = comments {
122
+ if let Some ( c) = comments {
123
123
self . globals . push_str ( c) ;
124
- self . typescript . push_str ( c) ;
125
124
}
126
125
let global = match self . config . mode {
127
126
OutputMode :: Node {
@@ -804,7 +803,7 @@ impl<'a> Context<'a> {
804
803
dst. push_str ( "}\n " ) ;
805
804
ts_dst. push_str ( "}\n " ) ;
806
805
807
- self . export ( & name, & dst, Some ( class. comments . clone ( ) ) ) ?;
806
+ self . export ( & name, & dst, Some ( & class. comments ) ) ?;
808
807
self . typescript . push_str ( & ts_dst) ;
809
808
810
809
Ok ( ( ) )
@@ -2153,41 +2152,58 @@ impl<'a> Context<'a> {
2153
2152
// on what's being exported.
2154
2153
match kind {
2155
2154
Kind :: Export ( export) => {
2155
+ let ts_sig = match export. generate_typescript {
2156
+ true => Some ( ts_sig. as_str ( ) ) ,
2157
+ false => None ,
2158
+ } ;
2159
+
2156
2160
let docs = format_doc_comments ( & export. comments , Some ( js_doc) ) ;
2157
2161
match & export. kind {
2158
2162
AuxExportKind :: Function ( name) => {
2159
- self . export ( & name, & format ! ( "function{}" , code) , Some ( docs) ) ?;
2163
+ if let Some ( ts_sig) = ts_sig {
2164
+ self . typescript . push_str ( & docs) ;
2165
+ self . typescript . push_str ( "export function " ) ;
2166
+ self . typescript . push_str ( & name) ;
2167
+ self . typescript . push_str ( ts_sig) ;
2168
+ self . typescript . push_str ( ";\n " ) ;
2169
+ }
2170
+ self . export ( & name, & format ! ( "function{}" , code) , Some ( & docs) ) ?;
2160
2171
self . globals . push_str ( "\n " ) ;
2161
- self . typescript . push_str ( "export function " ) ;
2162
- self . typescript . push_str ( & name) ;
2163
- self . typescript . push_str ( & ts_sig) ;
2164
- self . typescript . push_str ( ";\n " ) ;
2165
2172
}
2166
2173
AuxExportKind :: Constructor ( class) => {
2167
2174
let exported = require_class ( & mut self . exported_classes , class) ;
2168
2175
if exported. has_constructor {
2169
2176
bail ! ( "found duplicate constructor for class `{}`" , class) ;
2170
2177
}
2171
2178
exported. has_constructor = true ;
2172
- exported. push ( & docs, "constructor" , "" , & code, & ts_sig) ;
2179
+ exported. push ( & docs, "constructor" , "" , & code, ts_sig) ;
2173
2180
}
2174
2181
AuxExportKind :: Getter { class, field } => {
2175
- let ret_ty = ts_ret_ty. unwrap ( ) ;
2182
+ let ret_ty = match export. generate_typescript {
2183
+ true => match & ts_ret_ty {
2184
+ Some ( s) => Some ( s. as_str ( ) ) ,
2185
+ _ => None ,
2186
+ } ,
2187
+ false => None ,
2188
+ } ;
2176
2189
let exported = require_class ( & mut self . exported_classes , class) ;
2177
- exported. push_getter ( & docs, field, & code, & ret_ty) ;
2190
+ exported. push_getter ( & docs, field, & code, ret_ty) ;
2178
2191
}
2179
2192
AuxExportKind :: Setter { class, field } => {
2180
- let arg_ty = ts_arg_tys[ 0 ] . clone ( ) ;
2193
+ let arg_ty = match export. generate_typescript {
2194
+ true => Some ( ts_arg_tys[ 0 ] . as_str ( ) ) ,
2195
+ false => None ,
2196
+ } ;
2181
2197
let exported = require_class ( & mut self . exported_classes , class) ;
2182
- exported. push_setter ( & docs, field, & code, & arg_ty, might_be_optional_field) ;
2198
+ exported. push_setter ( & docs, field, & code, arg_ty, might_be_optional_field) ;
2183
2199
}
2184
2200
AuxExportKind :: StaticFunction { class, name } => {
2185
2201
let exported = require_class ( & mut self . exported_classes , class) ;
2186
- exported. push ( & docs, name, "static " , & code, & ts_sig) ;
2202
+ exported. push ( & docs, name, "static " , & code, ts_sig) ;
2187
2203
}
2188
2204
AuxExportKind :: Method { class, name, .. } => {
2189
2205
let exported = require_class ( & mut self . exported_classes , class) ;
2190
- exported. push ( & docs, name, "" , & code, & ts_sig) ;
2206
+ exported. push ( & docs, name, "" , & code, ts_sig) ;
2191
2207
}
2192
2208
}
2193
2209
}
@@ -2865,19 +2881,27 @@ impl<'a> Context<'a> {
2865
2881
}
2866
2882
2867
2883
fn generate_enum ( & mut self , enum_ : & AuxEnum ) -> Result < ( ) , Error > {
2884
+ let docs = format_doc_comments ( & enum_. comments , None ) ;
2868
2885
let mut variants = String :: new ( ) ;
2869
2886
2870
- self . typescript
2871
- . push_str ( & format ! ( "export enum {} {{" , enum_. name) ) ;
2887
+ if enum_. generate_typescript {
2888
+ self . typescript . push_str ( & docs) ;
2889
+ self . typescript
2890
+ . push_str ( & format ! ( "export enum {} {{" , enum_. name) ) ;
2891
+ }
2872
2892
for ( name, value) in enum_. variants . iter ( ) {
2873
2893
variants. push_str ( & format ! ( "{}:{}," , name, value) ) ;
2874
- self . typescript . push_str ( & format ! ( "\n {}," , name) ) ;
2894
+ if enum_. generate_typescript {
2895
+ self . typescript . push_str ( & format ! ( "\n {}," , name) ) ;
2896
+ }
2897
+ }
2898
+ if enum_. generate_typescript {
2899
+ self . typescript . push_str ( "\n }\n " ) ;
2875
2900
}
2876
- self . typescript . push_str ( "\n }\n " ) ;
2877
2901
self . export (
2878
2902
& enum_. name ,
2879
2903
& format ! ( "Object.freeze({{ {} }})" , variants) ,
2880
- Some ( format_doc_comments ( & enum_ . comments , None ) ) ,
2904
+ Some ( & docs ) ,
2881
2905
) ?;
2882
2906
2883
2907
Ok ( ( ) )
@@ -3163,24 +3187,36 @@ fn require_class<'a>(
3163
3187
}
3164
3188
3165
3189
impl ExportedClass {
3166
- fn push ( & mut self , docs : & str , function_name : & str , function_prefix : & str , js : & str , ts : & str ) {
3190
+ fn push (
3191
+ & mut self ,
3192
+ docs : & str ,
3193
+ function_name : & str ,
3194
+ function_prefix : & str ,
3195
+ js : & str ,
3196
+ ts : Option < & str > ,
3197
+ ) {
3167
3198
self . contents . push_str ( docs) ;
3168
3199
self . contents . push_str ( function_prefix) ;
3169
3200
self . contents . push_str ( function_name) ;
3170
3201
self . contents . push_str ( js) ;
3171
3202
self . contents . push_str ( "\n " ) ;
3172
- self . typescript . push_str ( docs) ;
3173
- self . typescript . push_str ( " " ) ;
3174
- self . typescript . push_str ( function_prefix) ;
3175
- self . typescript . push_str ( function_name) ;
3176
- self . typescript . push_str ( ts) ;
3177
- self . typescript . push_str ( ";\n " ) ;
3203
+ if let Some ( ts) = ts {
3204
+ self . typescript . push_str ( docs) ;
3205
+ self . typescript . push_str ( " " ) ;
3206
+ self . typescript . push_str ( function_prefix) ;
3207
+ self . typescript . push_str ( function_name) ;
3208
+ self . typescript . push_str ( ts) ;
3209
+ self . typescript . push_str ( ";\n " ) ;
3210
+ }
3178
3211
}
3179
3212
3180
3213
/// Used for adding a getter to a class, mainly to ensure that TypeScript
3181
3214
/// generation is handled specially.
3182
- fn push_getter ( & mut self , docs : & str , field : & str , js : & str , ret_ty : & str ) {
3183
- self . push_accessor ( docs, field, js, "get " , ret_ty) ;
3215
+ fn push_getter ( & mut self , docs : & str , field : & str , js : & str , ret_ty : Option < & str > ) {
3216
+ self . push_accessor ( docs, field, js, "get " ) ;
3217
+ if let Some ( ret_ty) = ret_ty {
3218
+ self . push_accessor_ts ( field, ret_ty) ;
3219
+ }
3184
3220
self . readable_properties . push ( field. to_string ( ) ) ;
3185
3221
}
3186
3222
@@ -3191,28 +3227,18 @@ impl ExportedClass {
3191
3227
docs : & str ,
3192
3228
field : & str ,
3193
3229
js : & str ,
3194
- ret_ty : & str ,
3230
+ ret_ty : Option < & str > ,
3195
3231
might_be_optional_field : bool ,
3196
3232
) {
3197
- let ( has_setter, is_optional) = self . push_accessor ( docs, field, js, "set " , ret_ty) ;
3198
- * has_setter = true ;
3199
- * is_optional = might_be_optional_field;
3233
+ self . push_accessor ( docs, field, js, "set " ) ;
3234
+ if let Some ( ret_ty) = ret_ty {
3235
+ let ( has_setter, is_optional) = self . push_accessor_ts ( field, ret_ty) ;
3236
+ * has_setter = true ;
3237
+ * is_optional = might_be_optional_field;
3238
+ }
3200
3239
}
3201
3240
3202
- fn push_accessor (
3203
- & mut self ,
3204
- docs : & str ,
3205
- field : & str ,
3206
- js : & str ,
3207
- prefix : & str ,
3208
- ret_ty : & str ,
3209
- ) -> ( & mut bool , & mut bool ) {
3210
- self . contents . push_str ( docs) ;
3211
- self . contents . push_str ( prefix) ;
3212
- self . contents . push_str ( field) ;
3213
- self . contents . push_str ( js) ;
3214
- self . contents . push_str ( "\n " ) ;
3215
-
3241
+ fn push_accessor_ts ( & mut self , field : & str , ret_ty : & str ) -> ( & mut bool , & mut bool ) {
3216
3242
let ( ty, has_setter, is_optional) = self
3217
3243
. typescript_fields
3218
3244
. entry ( field. to_string ( ) )
@@ -3221,6 +3247,14 @@ impl ExportedClass {
3221
3247
* ty = ret_ty. to_string ( ) ;
3222
3248
( has_setter, is_optional)
3223
3249
}
3250
+
3251
+ fn push_accessor ( & mut self , docs : & str , field : & str , js : & str , prefix : & str ) {
3252
+ self . contents . push_str ( docs) ;
3253
+ self . contents . push_str ( prefix) ;
3254
+ self . contents . push_str ( field) ;
3255
+ self . contents . push_str ( js) ;
3256
+ self . contents . push_str ( "\n " ) ;
3257
+ }
3224
3258
}
3225
3259
3226
3260
#[ test]
0 commit comments