@@ -26,6 +26,7 @@ pub(super) fn new(metadata: bool) -> TscDecorator {
26
26
enums : Default :: default ( ) ,
27
27
vars : Default :: default ( ) ,
28
28
appended_exprs : Default :: default ( ) ,
29
+ appended_private_access_exprs : Default :: default ( ) ,
29
30
prepended_exprs : Default :: default ( ) ,
30
31
class_name : Default :: default ( ) ,
31
32
@@ -41,6 +42,7 @@ pub(super) struct TscDecorator {
41
42
/// Used for computed keys, and this variables are not initialized.
42
43
vars : Vec < VarDeclarator > ,
43
44
appended_exprs : Vec < Box < Expr > > ,
45
+ appended_private_access_exprs : Vec < Box < Expr > > ,
44
46
prepended_exprs : Vec < Box < Expr > > ,
45
47
46
48
class_name : Option < Ident > ,
@@ -155,6 +157,17 @@ impl TscDecorator {
155
157
prop_name_to_expr_value ( k. clone ( ) )
156
158
}
157
159
160
+ fn has_private_access ( mut expr : & Expr ) -> bool {
161
+ while let Some ( MemberExpr { obj, prop, .. } ) = expr. as_member ( ) {
162
+ if prop. is_private_name ( ) {
163
+ return true ;
164
+ }
165
+ expr = obj;
166
+ }
167
+
168
+ false
169
+ }
170
+
158
171
/// Creates `__decorate` calls.
159
172
fn add_decorate_call (
160
173
& mut self ,
@@ -163,10 +176,17 @@ impl TscDecorator {
163
176
key : ExprOrSpread ,
164
177
mut desc : ExprOrSpread ,
165
178
) {
179
+ let mut has_private_access = false ;
166
180
let decorators = ArrayLit {
167
181
span : DUMMY_SP ,
168
182
elems : decorators
169
183
. into_iter ( )
184
+ . inspect ( |e| {
185
+ if has_private_access {
186
+ return ;
187
+ }
188
+ has_private_access = Self :: has_private_access ( e) ;
189
+ } )
170
190
. map ( |mut v| {
171
191
remove_span ( & mut v) ;
172
192
@@ -180,15 +200,18 @@ impl TscDecorator {
180
200
remove_span ( & mut target. expr ) ;
181
201
remove_span ( & mut desc. expr ) ;
182
202
183
- self . appended_exprs . push (
184
- CallExpr {
185
- span : DUMMY_SP ,
186
- callee : helper ! ( ts, ts_decorate) ,
187
- args : vec ! [ decorators, target, key, desc] ,
188
- ..Default :: default ( )
189
- }
190
- . into ( ) ,
191
- ) ;
203
+ let expr = CallExpr {
204
+ callee : helper ! ( ts, ts_decorate) ,
205
+ args : vec ! [ decorators, target, key, desc] ,
206
+ ..Default :: default ( )
207
+ }
208
+ . into ( ) ;
209
+
210
+ if has_private_access {
211
+ self . appended_private_access_exprs . push ( expr) ;
212
+ } else {
213
+ self . appended_exprs . push ( expr) ;
214
+ }
192
215
}
193
216
}
194
217
@@ -235,6 +258,8 @@ impl Visit for TscDecorator {
235
258
236
259
impl VisitMut for TscDecorator {
237
260
fn visit_mut_class ( & mut self , n : & mut Class ) {
261
+ let appended_private = self . appended_private_access_exprs . take ( ) ;
262
+
238
263
n. visit_mut_with ( & mut ParamMetadata ) ;
239
264
240
265
if self . metadata {
@@ -245,6 +270,32 @@ impl VisitMut for TscDecorator {
245
270
246
271
n. visit_mut_children_with ( self ) ;
247
272
273
+ let appended_private =
274
+ mem:: replace ( & mut self . appended_private_access_exprs , appended_private) ;
275
+
276
+ if !appended_private. is_empty ( ) {
277
+ let expr = if appended_private. len ( ) == 1 {
278
+ * appended_private. into_iter ( ) . next ( ) . unwrap ( )
279
+ } else {
280
+ SeqExpr {
281
+ exprs : appended_private,
282
+ ..Default :: default ( )
283
+ }
284
+ . into ( )
285
+ } ;
286
+
287
+ n. body . push (
288
+ StaticBlock {
289
+ body : BlockStmt {
290
+ stmts : vec ! [ expr. into_stmt( ) ] ,
291
+ ..Default :: default ( )
292
+ } ,
293
+ ..Default :: default ( )
294
+ }
295
+ . into ( ) ,
296
+ )
297
+ }
298
+
248
299
if let Some ( class_name) = self . class_name . clone ( ) {
249
300
if !n. decorators . is_empty ( ) {
250
301
let decorators = ArrayLit {
0 commit comments