@@ -116,8 +116,9 @@ namespace ts {
116
116
case SyntaxKind . PropertyAccessExpression :
117
117
return visitPropertyAccessExpression ( node as PropertyAccessExpression ) ;
118
118
case SyntaxKind . ClassDeclaration :
119
+ return visitClassDeclaration ( node as ClassDeclaration ) ;
119
120
case SyntaxKind . ClassExpression :
120
- return visitClassLikeDeclaration ( node as ClassLikeDeclaration ) ;
121
+ return visitClassExpression ( node as ClassExpression ) ;
121
122
default :
122
123
return visitEachChild ( node , visitor , context ) ;
123
124
}
@@ -159,12 +160,42 @@ namespace ts {
159
160
return visitEachChild ( node , visitor , context ) ;
160
161
}
161
162
162
- function visitClassLikeDeclaration ( node : ClassLikeDeclaration ) : Node [ ] {
163
+ function visitClassDeclaration ( node : ClassDeclaration ) {
164
+ startPrivateNameEnvironment ( ) ;
165
+ node = visitEachChild ( node , visitor , context ) ;
166
+ node = updateClassDeclaration (
167
+ node ,
168
+ node . decorators ,
169
+ node . modifiers ,
170
+ node . name ,
171
+ node . typeParameters ,
172
+ node . heritageClauses ,
173
+ transformClassMembers ( node . members )
174
+ ) ;
175
+ return [ ...endPrivateNameEnvironment ( ) , node ] ;
176
+ }
177
+
178
+ function visitClassExpression ( node : ClassExpression ) {
179
+ startPrivateNameEnvironment ( ) ;
180
+ node = visitEachChild ( node , visitor , context ) ;
181
+ node = updateClassExpression (
182
+ node ,
183
+ node . modifiers ,
184
+ node . name ,
185
+ node . typeParameters ,
186
+ node . heritageClauses ,
187
+ transformClassMembers ( node . members )
188
+ ) ;
189
+ return [ ...endPrivateNameEnvironment ( ) , node ] ;
190
+ }
191
+
192
+ function startPrivateNameEnvironment ( ) {
163
193
// Create private name environment.
164
194
privateNameEnvironmentStack [ ++ privateNameEnvironmentIndex ] = { } ;
165
- // Visit children.
166
- node = visitEachChild ( node , visitor , context ) ;
167
- // Create WeakMaps for private properties.
195
+ return currentPrivateNameEnvironment ( ) ;
196
+ }
197
+
198
+ function endPrivateNameEnvironment ( ) : Statement [ ] {
168
199
const privateNameEnvironment = currentPrivateNameEnvironment ( ) ;
169
200
const weakMapDeclarations = Object . keys ( privateNameEnvironment ) . map ( name => {
170
201
const weakMapName = privateNameEnvironment [ name ] ;
@@ -179,6 +210,15 @@ namespace ts {
179
210
) ) ]
180
211
) ;
181
212
} ) ;
213
+ // Destroy private name environment.
214
+ delete privateNameEnvironmentStack [ privateNameEnvironmentIndex -- ] ;
215
+ return weakMapDeclarations ;
216
+ }
217
+
218
+ function transformClassMembers ( members : ReadonlyArray < ClassElement > ) : ClassElement [ ] {
219
+ // Rewrite constructor with private name initializers.
220
+ const privateNameEnvironment = currentPrivateNameEnvironment ( ) ;
221
+ // Initialize private properties.
182
222
const initializerStatements = Object . keys ( privateNameEnvironment ) . map ( name => {
183
223
return createStatement (
184
224
createCall (
@@ -188,60 +228,33 @@ namespace ts {
188
228
)
189
229
) ;
190
230
} ) ;
191
- let members = [ ...node . members ] ;
192
- let ctor = find ( members , ( member ) => isConstructorDeclaration ( member ) ) ;
193
- if ( ! ctor ) {
194
- // Create constructor with private field initializers.
195
- ctor = createConstructor (
196
- /* decorators */ undefined ,
197
- /* modifiers */ undefined ,
198
- /* parameters */ [ ] ,
199
- createBlock ( initializerStatements )
200
- ) ;
201
- members . unshift ( ctor ) ;
202
- } else {
203
- // Update existing constructor to add private field initializers.
204
- members = members . map ( member => {
231
+ const ctor = find ( members , ( member ) => isConstructorDeclaration ( member ) ) as ConstructorDeclaration | undefined ;
232
+ if ( ctor ) {
233
+ const body = ctor . body ?
234
+ updateBlock ( ctor . body , [ ...initializerStatements , ...ctor . body . statements ] ) :
235
+ createBlock ( initializerStatements , /* multiLine */ undefined ) ;
236
+ return members . map ( member => {
205
237
if ( isConstructorDeclaration ( member ) ) {
206
- let statements = member . body ?
207
- [ ...initializerStatements , ...member . body . statements ] :
208
- initializerStatements ;
209
238
return updateConstructor (
210
- member ,
211
- member . decorators ,
212
- member . modifiers ,
213
- member . parameters ,
214
- createBlock ( statements , member . body ? member . body . multiLine : undefined )
239
+ ctor ,
240
+ ctor . decorators ,
241
+ ctor . modifiers ,
242
+ ctor . parameters ,
243
+ body
215
244
) ;
216
245
}
217
246
return member ;
218
- } )
219
- }
220
-
221
- // Update class members.
222
- if ( isClassDeclaration ( node ) ) {
223
- node = updateClassDeclaration (
224
- node ,
225
- node . decorators ,
226
- node . modifiers ,
227
- node . name ,
228
- node . typeParameters ,
229
- node . heritageClauses ,
230
- members
231
- ) ;
232
- } else if ( isClassExpression ( node ) ) {
233
- node = updateClassExpression (
234
- node ,
235
- node . modifiers ,
236
- node . name ,
237
- node . typeParameters ,
238
- node . heritageClauses ,
239
- members
240
- ) ;
247
+ } ) ;
241
248
}
242
- // Destroy private name environment.
243
- delete privateNameEnvironmentStack [ privateNameEnvironmentIndex -- ] ;
244
- return [ ...weakMapDeclarations , node ] ;
249
+ return [
250
+ createConstructor (
251
+ /* decorators */ undefined ,
252
+ /* modifiers */ undefined ,
253
+ /* parameters */ [ ] ,
254
+ createBlock ( initializerStatements )
255
+ ) ,
256
+ ...members
257
+ ] ;
245
258
}
246
259
247
260
function visitAwaitExpression ( node : AwaitExpression ) : Expression {
0 commit comments