@@ -2202,7 +2202,8 @@ namespace ts {
22022202 compilerOptions . downlevelIteration ? convertForOfStatementForIterable : convertForOfStatementForArray ) ;
22032203 }
22042204
2205- function convertForOfStatementHead ( statements : Statement [ ] , node : ForOfStatement , boundValue : Expression , convertedLoopBodyStatements : Statement [ ] ) {
2205+ function convertForOfStatementHead ( node : ForOfStatement , boundValue : Expression , convertedLoopBodyStatements : Statement [ ] ) {
2206+ const statements : Statement [ ] = [ ] ;
22062207 if ( isVariableDeclarationList ( node . initializer ) ) {
22072208 if ( node . initializer . flags & NodeFlags . BlockScoped ) {
22082209 enableSubstitutionsForBlockScopedBindings ( ) ;
@@ -2291,72 +2292,16 @@ namespace ts {
22912292 }
22922293 }
22932294
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
23542302 ) ,
2355- EmitFlags . NoTokenTrailingSourceMaps
2303+ EmitFlags . NoSourceMap | EmitFlags . NoTokenSourceMaps
23562304 ) ;
2357-
2358- statement = restoreEnclosingLabel ( statement , outermostLabeledStatement ) ;
2359- return closeIterator ( statement , iteratorRecord ) ;
23602305 }
23612306
23622307 function convertForOfStatementForArray ( node : ForOfStatement , outermostLabeledStatement : LabeledStatement , convertedLoopBodyStatements : Statement [ ] ) : Statement {
@@ -2382,51 +2327,37 @@ namespace ts {
23822327 // for-of bodies are always emitted as blocks.
23832328
23842329 const expression = visitNode ( node . expression , visitor , isExpression ) ;
2385- const statements : Statement [ ] = [ ] ;
23862330
23872331 // In the case where the user wrote an identifier as the RHS, like this:
23882332 //
23892333 // for (let v of arr) { }
23902334 //
23912335 // we don't want to emit a temporary variable for the RHS, just use it directly.
23922336 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 ) ;
24022338
24032339 // The old emitter does not emit source maps for the expression
24042340 setEmitFlags ( expression , EmitFlags . NoSourceMap | getEmitFlags ( expression ) ) ;
24052341
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-
24152342 const forStatement = createFor (
2416- setEmitFlags (
2343+ /*initializer*/ setEmitFlags (
24172344 createVariableDeclarationList ( [
24182345 createVariableDeclaration ( counter , /*type*/ undefined , createLiteral ( 0 ) , /*location*/ moveRangePos ( node . expression , - 1 ) ) ,
24192346 createVariableDeclaration ( rhsReference , /*type*/ undefined , expression , /*location*/ node . expression )
24202347 ] , /*location*/ node . expression ) ,
24212348 EmitFlags . NoHoisting
24222349 ) ,
2423- createLessThan (
2350+ /*condition*/ createLessThan (
24242351 counter ,
24252352 createPropertyAccess ( rhsReference , "length" ) ,
24262353 /*location*/ node . expression
24272354 ) ,
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+ ) ,
24302361 /*location*/ node
24312362 ) ;
24322363
@@ -2435,14 +2366,47 @@ namespace ts {
24352366 return restoreEnclosingLabel ( forStatement , outermostLabeledStatement , convertedLoopState && resetLabel ) ;
24362367 }
24372368
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 ) ;
24392373 const errorRecord = createUniqueName ( "e" ) ;
2440- hoistVariableDeclaration ( errorRecord ) ;
24412374 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+ ) ;
24422402
24432403 return createTry (
24442404 createBlock ( [
2445- statement
2405+ restoreEnclosingLabel (
2406+ forStatement ,
2407+ outermostLabeledStatement ,
2408+ convertedLoopState && resetLabel
2409+ )
24462410 ] ) ,
24472411 createCatchClause ( catchVariable ,
24482412 setEmitFlags (
@@ -2451,10 +2415,7 @@ namespace ts {
24512415 createAssignment (
24522416 errorRecord ,
24532417 createObjectLiteral ( [
2454- createPropertyAssignment (
2455- "error" ,
2456- catchVariable
2457- )
2418+ createPropertyAssignment ( "error" , catchVariable )
24582419 ] )
24592420 )
24602421 )
@@ -2463,39 +2424,44 @@ namespace ts {
24632424 )
24642425 ) ,
24652426 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 ( [
24802429 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" )
24902436 )
24912437 ) ,
2492- EmitFlags . SingleLine
2438+ createAssignment (
2439+ returnMethod ,
2440+ createPropertyAccess ( iterator , "return" )
2441+ )
2442+ ) ,
2443+ createStatement (
2444+ createFunctionCall ( returnMethod , iterator , [ ] )
24932445 )
2494- ] ) ,
2446+ ) ,
24952447 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+ )
24992465 )
25002466 ] )
25012467 ) ;
0 commit comments