@@ -2202,7 +2202,8 @@ namespace ts {
2202
2202
compilerOptions . downlevelIteration ? convertForOfStatementForIterable : convertForOfStatementForArray ) ;
2203
2203
}
2204
2204
2205
- function convertForOfStatementHead ( statements : Statement [ ] , node : ForOfStatement , boundValue : Expression , convertedLoopBodyStatements : Statement [ ] ) {
2205
+ function convertForOfStatementHead ( node : ForOfStatement , boundValue : Expression , convertedLoopBodyStatements : Statement [ ] ) {
2206
+ const statements : Statement [ ] = [ ] ;
2206
2207
if ( isVariableDeclarationList ( node . initializer ) ) {
2207
2208
if ( node . initializer . flags & NodeFlags . BlockScoped ) {
2208
2209
enableSubstitutionsForBlockScopedBindings ( ) ;
@@ -2291,72 +2292,16 @@ namespace ts {
2291
2292
}
2292
2293
}
2293
2294
2294
- return { bodyLocation, statementsLocation } ;
2295
- }
2296
-
2297
- function convertForOfStatementForIterable ( node : ForOfStatement , outermostLabeledStatement : LabeledStatement , convertedLoopBodyStatements : Statement [ ] ) : Statement {
2298
- const expression = visitNode ( node . expression , visitor , isExpression ) ;
2299
- const iteratorRecord = isIdentifier ( node . expression )
2300
- ? getGeneratedNameForNode ( node . expression )
2301
- : createUniqueName ( "iterator" ) ;
2302
-
2303
- const statements : Statement [ ] = [ ] ;
2304
- const { bodyLocation, statementsLocation } = convertForOfStatementHead (
2305
- statements ,
2306
- node ,
2307
- createPropertyAccess (
2308
- createPropertyAccess ( iteratorRecord , "result" ) ,
2309
- "value"
2310
- ) ,
2311
- convertedLoopBodyStatements ) ;
2312
-
2313
- let statement : Statement = setEmitFlags (
2314
- createFor (
2315
- createVariableDeclarationList (
2316
- [
2317
- createVariableDeclaration (
2318
- iteratorRecord ,
2319
- /*type*/ undefined ,
2320
- createObjectLiteral (
2321
- [
2322
- createPropertyAssignment (
2323
- "iterator" ,
2324
- createValuesHelper (
2325
- context ,
2326
- expression ,
2327
- node . expression
2328
- ) ,
2329
- node . expression
2330
- )
2331
- ] ,
2332
- node . expression
2333
- ) ,
2334
- node . expression
2335
- )
2336
- ] ,
2337
- node . expression
2338
- ) ,
2339
- /*condition*/ createStepHelper (
2340
- context ,
2341
- iteratorRecord ,
2342
- node . initializer
2343
- ) ,
2344
- /*incrementor*/ undefined ,
2345
- setEmitFlags (
2346
- createBlock (
2347
- createNodeArray ( statements , statementsLocation ) ,
2348
- bodyLocation ,
2349
- /*multiLine*/ true
2350
- ) ,
2351
- EmitFlags . NoSourceMap | EmitFlags . NoTokenSourceMaps
2352
- ) ,
2353
- /*location*/ node
2295
+ // The old emitter does not emit source maps for the block.
2296
+ // We add the location to preserve comments.
2297
+ return setEmitFlags (
2298
+ createBlock (
2299
+ createNodeArray ( statements , /*location*/ statementsLocation ) ,
2300
+ /*location*/ bodyLocation ,
2301
+ /*multiLine*/ true
2354
2302
) ,
2355
- EmitFlags . NoTokenTrailingSourceMaps
2303
+ EmitFlags . NoSourceMap | EmitFlags . NoTokenSourceMaps
2356
2304
) ;
2357
-
2358
- statement = restoreEnclosingLabel ( statement , outermostLabeledStatement ) ;
2359
- return closeIterator ( statement , iteratorRecord ) ;
2360
2305
}
2361
2306
2362
2307
function convertForOfStatementForArray ( node : ForOfStatement , outermostLabeledStatement : LabeledStatement , convertedLoopBodyStatements : Statement [ ] ) : Statement {
@@ -2382,51 +2327,37 @@ namespace ts {
2382
2327
// for-of bodies are always emitted as blocks.
2383
2328
2384
2329
const expression = visitNode ( node . expression , visitor , isExpression ) ;
2385
- const statements : Statement [ ] = [ ] ;
2386
2330
2387
2331
// In the case where the user wrote an identifier as the RHS, like this:
2388
2332
//
2389
2333
// for (let v of arr) { }
2390
2334
//
2391
2335
// we don't want to emit a temporary variable for the RHS, just use it directly.
2392
2336
const counter = createLoopVariable ( ) ;
2393
- const rhsReference = expression . kind === SyntaxKind . Identifier
2394
- ? createUniqueName ( ( < Identifier > expression ) . text )
2395
- : createTempVariable ( /*recordTempVariable*/ undefined ) ;
2396
-
2397
- const { bodyLocation, statementsLocation } = convertForOfStatementHead (
2398
- statements ,
2399
- node ,
2400
- createElementAccess ( rhsReference , counter ) ,
2401
- convertedLoopBodyStatements ) ;
2337
+ const rhsReference = isIdentifier ( expression ) ? getGeneratedNameForNode ( expression ) : createTempVariable ( /*recordTempVariable*/ undefined ) ;
2402
2338
2403
2339
// The old emitter does not emit source maps for the expression
2404
2340
setEmitFlags ( expression , EmitFlags . NoSourceMap | getEmitFlags ( expression ) ) ;
2405
2341
2406
- // The old emitter does not emit source maps for the block.
2407
- // We add the location to preserve comments.
2408
- const body = createBlock (
2409
- createNodeArray ( statements , /*location*/ statementsLocation ) ,
2410
- /*location*/ bodyLocation
2411
- ) ;
2412
-
2413
- setEmitFlags ( body , EmitFlags . NoSourceMap | EmitFlags . NoTokenSourceMaps ) ;
2414
-
2415
2342
const forStatement = createFor (
2416
- setEmitFlags (
2343
+ /*initializer*/ setEmitFlags (
2417
2344
createVariableDeclarationList ( [
2418
2345
createVariableDeclaration ( counter , /*type*/ undefined , createLiteral ( 0 ) , /*location*/ moveRangePos ( node . expression , - 1 ) ) ,
2419
2346
createVariableDeclaration ( rhsReference , /*type*/ undefined , expression , /*location*/ node . expression )
2420
2347
] , /*location*/ node . expression ) ,
2421
2348
EmitFlags . NoHoisting
2422
2349
) ,
2423
- createLessThan (
2350
+ /*condition*/ createLessThan (
2424
2351
counter ,
2425
2352
createPropertyAccess ( rhsReference , "length" ) ,
2426
2353
/*location*/ node . expression
2427
2354
) ,
2428
- createPostfixIncrement ( counter , /*location*/ node . expression ) ,
2429
- body ,
2355
+ /*incrementor*/ createPostfixIncrement ( counter , /*location*/ node . expression ) ,
2356
+ /*statement*/ convertForOfStatementHead (
2357
+ node ,
2358
+ createElementAccess ( rhsReference , counter ) ,
2359
+ convertedLoopBodyStatements
2360
+ ) ,
2430
2361
/*location*/ node
2431
2362
) ;
2432
2363
@@ -2435,14 +2366,47 @@ namespace ts {
2435
2366
return restoreEnclosingLabel ( forStatement , outermostLabeledStatement , convertedLoopState && resetLabel ) ;
2436
2367
}
2437
2368
2438
- function closeIterator ( statement : Statement , iteratorRecord : Expression ) {
2369
+ function convertForOfStatementForIterable ( node : ForOfStatement , outermostLabeledStatement : LabeledStatement , convertedLoopBodyStatements : Statement [ ] ) : Statement {
2370
+ const expression = visitNode ( node . expression , visitor , isExpression ) ;
2371
+ const iterator = isIdentifier ( expression ) ? getGeneratedNameForNode ( expression ) : createTempVariable ( /*recordTempVariable*/ undefined ) ;
2372
+ const result = isIdentifier ( expression ) ? getGeneratedNameForNode ( iterator ) : createTempVariable ( /*recordTempVariable*/ undefined ) ;
2439
2373
const errorRecord = createUniqueName ( "e" ) ;
2440
- hoistVariableDeclaration ( errorRecord ) ;
2441
2374
const catchVariable = getGeneratedNameForNode ( errorRecord ) ;
2375
+ const returnMethod = createTempVariable ( /*recordTempVariable*/ undefined ) ;
2376
+ const values = createValuesHelper ( context , expression , node . expression ) ;
2377
+ const next = createCall ( createPropertyAccess ( iterator , "next" ) , /*typeArguments*/ undefined , [ ] ) ;
2378
+
2379
+ hoistVariableDeclaration ( errorRecord ) ;
2380
+ hoistVariableDeclaration ( returnMethod ) ;
2381
+
2382
+ const forStatement = setEmitFlags (
2383
+ createFor (
2384
+ /*initializer*/ setEmitFlags (
2385
+ createVariableDeclarationList ( [
2386
+ createVariableDeclaration ( iterator , /*type*/ undefined , values , /*location*/ node . expression ) ,
2387
+ createVariableDeclaration ( result , /*type*/ undefined , next )
2388
+ ] , /*location*/ node . expression ) ,
2389
+ EmitFlags . NoHoisting
2390
+ ) ,
2391
+ /*condition*/ createLogicalNot ( createPropertyAccess ( result , "done" ) ) ,
2392
+ /*incrementor*/ createAssignment ( result , next ) ,
2393
+ /*statement*/ convertForOfStatementHead (
2394
+ node ,
2395
+ createPropertyAccess ( result , "value" ) ,
2396
+ convertedLoopBodyStatements
2397
+ ) ,
2398
+ /*location*/ node
2399
+ ) ,
2400
+ EmitFlags . NoTokenTrailingSourceMaps
2401
+ ) ;
2442
2402
2443
2403
return createTry (
2444
2404
createBlock ( [
2445
- statement
2405
+ restoreEnclosingLabel (
2406
+ forStatement ,
2407
+ outermostLabeledStatement ,
2408
+ convertedLoopState && resetLabel
2409
+ )
2446
2410
] ) ,
2447
2411
createCatchClause ( catchVariable ,
2448
2412
setEmitFlags (
@@ -2451,10 +2415,7 @@ namespace ts {
2451
2415
createAssignment (
2452
2416
errorRecord ,
2453
2417
createObjectLiteral ( [
2454
- createPropertyAssignment (
2455
- "error" ,
2456
- catchVariable
2457
- )
2418
+ createPropertyAssignment ( "error" , catchVariable )
2458
2419
] )
2459
2420
)
2460
2421
)
@@ -2463,39 +2424,44 @@ namespace ts {
2463
2424
)
2464
2425
) ,
2465
2426
createBlock ( [
2466
- setEmitFlags (
2467
- createTry (
2468
- setEmitFlags (
2469
- createBlock ( [
2470
- createStatement (
2471
- createCloseHelper (
2472
- context ,
2473
- iteratorRecord
2474
- )
2475
- )
2476
- ] ) ,
2477
- EmitFlags . SingleLine
2478
- ) ,
2479
- undefined ,
2427
+ createTry (
2428
+ /*tryBlock*/ createBlock ( [
2480
2429
setEmitFlags (
2481
- createBlock ( [
2482
- setEmitFlags (
2483
- createIf (
2484
- errorRecord ,
2485
- createThrow (
2486
- createPropertyAccess (
2487
- errorRecord ,
2488
- "error"
2489
- )
2430
+ createIf (
2431
+ createLogicalAnd (
2432
+ createLogicalAnd (
2433
+ result ,
2434
+ createLogicalNot (
2435
+ createPropertyAccess ( result , "done" )
2490
2436
)
2491
2437
) ,
2492
- EmitFlags . SingleLine
2438
+ createAssignment (
2439
+ returnMethod ,
2440
+ createPropertyAccess ( iterator , "return" )
2441
+ )
2442
+ ) ,
2443
+ createStatement (
2444
+ createFunctionCall ( returnMethod , iterator , [ ] )
2493
2445
)
2494
- ] ) ,
2446
+ ) ,
2495
2447
EmitFlags . SingleLine
2496
- )
2497
- ) ,
2498
- EmitFlags . SingleLine
2448
+ ) ,
2449
+ ] ) ,
2450
+ /*catchClause*/ undefined ,
2451
+ /*finallyBlock*/ setEmitFlags (
2452
+ createBlock ( [
2453
+ setEmitFlags (
2454
+ createIf (
2455
+ errorRecord ,
2456
+ createThrow (
2457
+ createPropertyAccess ( errorRecord , "error" )
2458
+ )
2459
+ ) ,
2460
+ EmitFlags . SingleLine
2461
+ )
2462
+ ] ) ,
2463
+ EmitFlags . SingleLine
2464
+ )
2499
2465
)
2500
2466
] )
2501
2467
) ;
0 commit comments