@@ -2426,6 +2426,7 @@ namespace ts {
2426
2426
const statements : Statement [ ] = [ ] ;
2427
2427
startLexicalEnvironment ( ) ;
2428
2428
const members = map ( node . members , transformEnumMember ) ;
2429
+ members . push ( transformEnumMembersToIterator ( node . members ) ) ;
2429
2430
insertStatementsAfterStandardPrologue ( statements , endLexicalEnvironment ( ) ) ;
2430
2431
addRange ( statements , members ) ;
2431
2432
@@ -2474,6 +2475,52 @@ namespace ts {
2474
2475
) ;
2475
2476
}
2476
2477
2478
+ /**
2479
+ * Transforms all enum members into a generator function that yields
2480
+ * the enum members.
2481
+ *
2482
+ * @param members The enum member nodes.
2483
+ */
2484
+ function transformEnumMembersToIterator ( members : readonly EnumMember [ ] ) : Statement {
2485
+ const symbolIterator = factory . createPropertyAccessExpression (
2486
+ factory . createIdentifier ( "Symbol" ) ,
2487
+ "iterator" ,
2488
+ ) ;
2489
+ const iteratorMember = factory . createElementAccessExpression (
2490
+ currentNamespaceContainerName ,
2491
+ symbolIterator ,
2492
+ ) ;
2493
+
2494
+ const generatorBody = factory . createBlock ( members . map ( member => {
2495
+ // Todo: don't call these twice.
2496
+ const name = getExpressionForPropertyName ( member , /*generateNameForComputedPropertyName*/ false ) ;
2497
+ const valueExpression = transformEnumMemberDeclarationValue ( member ) ;
2498
+ const yieldExpression = factory . createYieldExpression (
2499
+ undefined ,
2500
+ factory . createArrayLiteralExpression ( [
2501
+ name ,
2502
+ valueExpression ,
2503
+ ] ) ,
2504
+ ) ;
2505
+ return factory . createExpressionStatement ( yieldExpression ) ;
2506
+ } ) ) ;
2507
+
2508
+ const iteratorGenerator = factory . createFunctionExpression (
2509
+ undefined ,
2510
+ factory . createToken ( SyntaxKind . AsteriskToken ) ,
2511
+ undefined ,
2512
+ undefined ,
2513
+ [ ] ,
2514
+ undefined ,
2515
+ generatorBody ,
2516
+ ) ;
2517
+ const outerAssignment = factory . createAssignment (
2518
+ iteratorMember ,
2519
+ iteratorGenerator ,
2520
+ ) ;
2521
+ return factory . createExpressionStatement ( outerAssignment ) ;
2522
+ }
2523
+
2477
2524
/**
2478
2525
* Transforms the value of an enum member.
2479
2526
*
0 commit comments