@@ -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 {
@@ -721,7 +720,7 @@ impl<'a> Context<'a> {
721
720
dst. push_str ( "}\n " ) ;
722
721
ts_dst. push_str ( "}\n " ) ;
723
722
724
- self . export ( & name, & dst, Some ( class. comments . clone ( ) ) ) ?;
723
+ self . export ( & name, & dst, Some ( & class. comments ) ) ?;
725
724
self . typescript . push_str ( & ts_dst) ;
726
725
727
726
Ok ( ( ) )
@@ -2067,41 +2066,58 @@ impl<'a> Context<'a> {
2067
2066
// on what's being exported.
2068
2067
match kind {
2069
2068
Kind :: Export ( export) => {
2069
+ let ts_sig = match export. generate_typescript {
2070
+ true => Some ( ts_sig. as_str ( ) ) ,
2071
+ false => None
2072
+ } ;
2073
+
2070
2074
let docs = format_doc_comments ( & export. comments , Some ( js_doc) ) ;
2071
2075
match & export. kind {
2072
2076
AuxExportKind :: Function ( name) => {
2073
- self . export ( & name, & format ! ( "function{}" , code) , Some ( docs) ) ?;
2077
+ if let Some ( ts_sig) = ts_sig {
2078
+ self . typescript . push_str ( & docs) ;
2079
+ self . typescript . push_str ( "export function " ) ;
2080
+ self . typescript . push_str ( & name) ;
2081
+ self . typescript . push_str ( ts_sig) ;
2082
+ self . typescript . push_str ( ";\n " ) ;
2083
+ }
2084
+ self . export ( & name, & format ! ( "function{}" , code) , Some ( & docs) ) ?;
2074
2085
self . globals . push_str ( "\n " ) ;
2075
- self . typescript . push_str ( "export function " ) ;
2076
- self . typescript . push_str ( & name) ;
2077
- self . typescript . push_str ( & ts_sig) ;
2078
- self . typescript . push_str ( ";\n " ) ;
2079
2086
}
2080
2087
AuxExportKind :: Constructor ( class) => {
2081
2088
let exported = require_class ( & mut self . exported_classes , class) ;
2082
2089
if exported. has_constructor {
2083
2090
bail ! ( "found duplicate constructor for class `{}`" , class) ;
2084
2091
}
2085
2092
exported. has_constructor = true ;
2086
- exported. push ( & docs, "constructor" , "" , & code, & ts_sig) ;
2093
+ exported. push ( & docs, "constructor" , "" , & code, ts_sig) ;
2087
2094
}
2088
2095
AuxExportKind :: Getter { class, field } => {
2089
- let ret_ty = ts_ret_ty. unwrap ( ) ;
2096
+ let ret_ty = match export. generate_typescript {
2097
+ true => match & ts_ret_ty {
2098
+ Some ( s) => Some ( s. as_str ( ) ) ,
2099
+ _ => None ,
2100
+ } ,
2101
+ false => None
2102
+ } ;
2090
2103
let exported = require_class ( & mut self . exported_classes , class) ;
2091
- exported. push_getter ( & docs, field, & code, & ret_ty) ;
2104
+ exported. push_getter ( & docs, field, & code, ret_ty) ;
2092
2105
}
2093
2106
AuxExportKind :: Setter { class, field } => {
2094
- let arg_ty = ts_arg_tys[ 0 ] . clone ( ) ;
2107
+ let arg_ty = match export. generate_typescript {
2108
+ true => Some ( ts_arg_tys[ 0 ] . as_str ( ) ) ,
2109
+ false => None
2110
+ } ;
2095
2111
let exported = require_class ( & mut self . exported_classes , class) ;
2096
- exported. push_setter ( & docs, field, & code, & arg_ty, might_be_optional_field) ;
2112
+ exported. push_setter ( & docs, field, & code, arg_ty, might_be_optional_field) ;
2097
2113
}
2098
2114
AuxExportKind :: StaticFunction { class, name } => {
2099
2115
let exported = require_class ( & mut self . exported_classes , class) ;
2100
- exported. push ( & docs, name, "static " , & code, & ts_sig) ;
2116
+ exported. push ( & docs, name, "static " , & code, ts_sig) ;
2101
2117
}
2102
2118
AuxExportKind :: Method { class, name, .. } => {
2103
2119
let exported = require_class ( & mut self . exported_classes , class) ;
2104
- exported. push ( & docs, name, "" , & code, & ts_sig) ;
2120
+ exported. push ( & docs, name, "" , & code, ts_sig) ;
2105
2121
}
2106
2122
}
2107
2123
}
@@ -2780,19 +2796,27 @@ impl<'a> Context<'a> {
2780
2796
}
2781
2797
2782
2798
fn generate_enum ( & mut self , enum_ : & AuxEnum ) -> Result < ( ) , Error > {
2799
+ let docs = format_doc_comments ( & enum_. comments , None ) ;
2783
2800
let mut variants = String :: new ( ) ;
2784
2801
2785
- self . typescript
2786
- . push_str ( & format ! ( "export enum {} {{" , enum_. name) ) ;
2802
+ if enum_. generate_typescript {
2803
+ self . typescript . push_str ( & docs) ;
2804
+ self . typescript
2805
+ . push_str ( & format ! ( "export enum {} {{" , enum_. name) ) ;
2806
+ }
2787
2807
for ( name, value) in enum_. variants . iter ( ) {
2788
2808
variants. push_str ( & format ! ( "{}:{}," , name, value) ) ;
2789
- self . typescript . push_str ( & format ! ( "\n {}," , name) ) ;
2809
+ if enum_. generate_typescript {
2810
+ self . typescript . push_str ( & format ! ( "\n {}," , name) ) ;
2811
+ }
2812
+ }
2813
+ if enum_. generate_typescript {
2814
+ self . typescript . push_str ( "\n }\n " ) ;
2790
2815
}
2791
- self . typescript . push_str ( "\n }\n " ) ;
2792
2816
self . export (
2793
2817
& enum_. name ,
2794
2818
& format ! ( "Object.freeze({{ {} }})" , variants) ,
2795
- Some ( format_doc_comments ( & enum_ . comments , None ) ) ,
2819
+ Some ( & docs ) ,
2796
2820
) ?;
2797
2821
2798
2822
Ok ( ( ) )
@@ -3078,24 +3102,29 @@ fn require_class<'a>(
3078
3102
}
3079
3103
3080
3104
impl ExportedClass {
3081
- fn push ( & mut self , docs : & str , function_name : & str , function_prefix : & str , js : & str , ts : & str ) {
3105
+ fn push ( & mut self , docs : & str , function_name : & str , function_prefix : & str , js : & str , ts : Option < & str > ) {
3082
3106
self . contents . push_str ( docs) ;
3083
3107
self . contents . push_str ( function_prefix) ;
3084
3108
self . contents . push_str ( function_name) ;
3085
3109
self . contents . push_str ( js) ;
3086
3110
self . contents . push_str ( "\n " ) ;
3087
- self . typescript . push_str ( docs) ;
3088
- self . typescript . push_str ( " " ) ;
3089
- self . typescript . push_str ( function_prefix) ;
3090
- self . typescript . push_str ( function_name) ;
3091
- self . typescript . push_str ( ts) ;
3092
- self . typescript . push_str ( ";\n " ) ;
3111
+ if let Some ( ts) = ts {
3112
+ self . typescript . push_str ( docs) ;
3113
+ self . typescript . push_str ( " " ) ;
3114
+ self . typescript . push_str ( function_prefix) ;
3115
+ self . typescript . push_str ( function_name) ;
3116
+ self . typescript . push_str ( ts) ;
3117
+ self . typescript . push_str ( ";\n " ) ;
3118
+ }
3093
3119
}
3094
3120
3095
3121
/// Used for adding a getter to a class, mainly to ensure that TypeScript
3096
3122
/// generation is handled specially.
3097
- fn push_getter ( & mut self , docs : & str , field : & str , js : & str , ret_ty : & str ) {
3098
- self . push_accessor ( docs, field, js, "get " , ret_ty) ;
3123
+ fn push_getter ( & mut self , docs : & str , field : & str , js : & str , ret_ty : Option < & str > ) {
3124
+ self . push_accessor ( docs, field, js, "get " ) ;
3125
+ if let Some ( ret_ty) = ret_ty {
3126
+ self . push_accessor_ts ( field, ret_ty) ;
3127
+ }
3099
3128
self . readable_properties . push ( field. to_string ( ) ) ;
3100
3129
}
3101
3130
@@ -3106,28 +3135,22 @@ impl ExportedClass {
3106
3135
docs : & str ,
3107
3136
field : & str ,
3108
3137
js : & str ,
3109
- ret_ty : & str ,
3138
+ ret_ty : Option < & str > ,
3110
3139
might_be_optional_field : bool ,
3111
3140
) {
3112
- let ( has_setter, is_optional) = self . push_accessor ( docs, field, js, "set " , ret_ty) ;
3113
- * has_setter = true ;
3114
- * is_optional = might_be_optional_field;
3141
+ self . push_accessor ( docs, field, js, "set " ) ;
3142
+ if let Some ( ret_ty) = ret_ty {
3143
+ let ( has_setter, is_optional) = self . push_accessor_ts ( field, ret_ty) ;
3144
+ * has_setter = true ;
3145
+ * is_optional = might_be_optional_field;
3146
+ }
3115
3147
}
3116
3148
3117
- fn push_accessor (
3149
+ fn push_accessor_ts (
3118
3150
& mut self ,
3119
- docs : & str ,
3120
3151
field : & str ,
3121
- js : & str ,
3122
- prefix : & str ,
3123
3152
ret_ty : & str ,
3124
3153
) -> ( & mut bool , & mut bool ) {
3125
- self . contents . push_str ( docs) ;
3126
- self . contents . push_str ( prefix) ;
3127
- self . contents . push_str ( field) ;
3128
- self . contents . push_str ( js) ;
3129
- self . contents . push_str ( "\n " ) ;
3130
-
3131
3154
let ( ty, has_setter, is_optional) = self
3132
3155
. typescript_fields
3133
3156
. entry ( field. to_string ( ) )
@@ -3136,6 +3159,20 @@ impl ExportedClass {
3136
3159
* ty = ret_ty. to_string ( ) ;
3137
3160
( has_setter, is_optional)
3138
3161
}
3162
+
3163
+ fn push_accessor (
3164
+ & mut self ,
3165
+ docs : & str ,
3166
+ field : & str ,
3167
+ js : & str ,
3168
+ prefix : & str ,
3169
+ ) {
3170
+ self . contents . push_str ( docs) ;
3171
+ self . contents . push_str ( prefix) ;
3172
+ self . contents . push_str ( field) ;
3173
+ self . contents . push_str ( js) ;
3174
+ self . contents . push_str ( "\n " ) ;
3175
+ }
3139
3176
}
3140
3177
3141
3178
#[ test]
0 commit comments