Skip to content

Commit c72509b

Browse files
committed
Added iterationMode switch, consolidate some tests, cleanup
1 parent 2f6ac58 commit c72509b

File tree

1,275 files changed

+34646
-44690
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,275 files changed

+34646
-44690
lines changed

src/compiler/binder.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ namespace ts {
954954
addAntecedent(preLoopLabel, currentFlow);
955955
currentFlow = preLoopLabel;
956956
if (node.kind === SyntaxKind.ForOfStatement) {
957-
bind(node.modifierToken);
957+
bind(node.awaitModifier);
958958
}
959959
bind(node.expression);
960960
addAntecedent(postLoopLabel, currentFlow);
@@ -3125,7 +3125,7 @@ namespace ts {
31253125
break;
31263126

31273127
case SyntaxKind.ForOfStatement:
3128-
if ((<ForOfStatement>node).modifierToken) {
3128+
if ((<ForOfStatement>node).awaitModifier) {
31293129
transformFlags |= TransformFlags.AssertES2017;
31303130
}
31313131

@@ -3146,17 +3146,10 @@ namespace ts {
31463146

31473147
case SyntaxKind.ForOfStatement:
31483148
// This node is either ES2015 syntax or ES2017 syntax (if it is a for-await-of).
3149-
switch (getForOfModifierKind(<ForOfStatement>node)) {
3150-
case SyntaxKind.AwaitKeyword:
3151-
transformFlags |= TransformFlags.AssertES2017;
3152-
break;
3153-
case SyntaxKind.EachKeyword:
3154-
transformFlags |= TransformFlags.AssertTypeScript;
3155-
break;
3156-
default:
3157-
transformFlags |= TransformFlags.AssertES2015;
3158-
break;
3149+
if ((<ForOfStatement>node).awaitModifier) {
3150+
transformFlags |= TransformFlags.AssertES2017;
31593151
}
3152+
transformFlags |= TransformFlags.AssertES2015;
31603153
break;
31613154

31623155
case SyntaxKind.YieldExpression:

src/compiler/checker.ts

Lines changed: 39 additions & 38 deletions
Large diffs are not rendered by default.

src/compiler/commandLineParser.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,15 @@ namespace ts {
332332
type: "boolean",
333333
description: Diagnostics.Disallow_inconsistently_cased_references_to_the_same_file
334334
},
335+
{
336+
name: "iterationMode",
337+
type: createMap({
338+
"array": IterationMode.Array,
339+
"iterable": IterationMode.Iterable
340+
}),
341+
description: Diagnostics.Specify_how_to_emit_for_of_spread_and_destructuring_in_ES5_Slash3_Colon_array_arrays_only_default_or_iterable_support_arrays_and_Symbol_iterator,
342+
paramType: Diagnostics.MODE
343+
},
335344
{
336345
name: "baseUrl",
337346
type: "string",
@@ -436,6 +445,7 @@ namespace ts {
436445
"es2017.object": "lib.es2017.object.d.ts",
437446
"es2017.sharedmemory": "lib.es2017.sharedmemory.d.ts",
438447
"es2017.string": "lib.es2017.string.d.ts",
448+
"es2017.asynciterable": "lib.es2017.asynciterable.d.ts",
439449
}),
440450
},
441451
description: Diagnostics.Specify_library_files_to_be_included_in_the_compilation_Colon

src/compiler/core.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,10 @@ namespace ts {
13911391
getEmitScriptTarget(compilerOptions) >= ScriptTarget.ES2015 ? ModuleKind.ES2015 : ModuleKind.CommonJS;
13921392
}
13931393

1394+
export function getEmitIterationMode(compilerOptions: CompilerOptions) {
1395+
return getEmitScriptTarget(compilerOptions) >= ScriptTarget.ES2015 ? IterationMode.Iterable : compilerOptions.iterationMode || IterationMode.Array;
1396+
}
1397+
13941398
export function getEmitModuleResolutionKind(compilerOptions: CompilerOptions) {
13951399
let moduleResolution = compilerOptions.moduleResolution;
13961400
if (moduleResolution === undefined) {

src/compiler/diagnosticMessages.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2553,6 +2553,10 @@
25532553
"category": "Message",
25542554
"code": 6039
25552555
},
2556+
"MODE": {
2557+
"category": "Message",
2558+
"code": 6040
2559+
},
25562560
"Compilation complete. Watching for file changes.": {
25572561
"category": "Message",
25582562
"code": 6042
@@ -2689,6 +2693,10 @@
26892693
"category": "Message",
26902694
"code": 6080
26912695
},
2696+
"Specify how to emit for-of, spread, and destructuring in ES5/3: 'array' (arrays only; default) or 'iterable' (support arrays and Symbol.iterator)": {
2697+
"category": "Message",
2698+
"code": 6081
2699+
},
26922700
"Only 'amd' and 'system' modules are supported alongside --{0}.": {
26932701
"category": "Error",
26942702
"code": 6082

src/compiler/emitter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1368,7 +1368,7 @@ namespace ts {
13681368
function emitForOfStatement(node: ForOfStatement) {
13691369
const openParenPos = writeToken(SyntaxKind.ForKeyword, node.pos);
13701370
write(" ");
1371-
emitWithSuffix(node.modifierToken, " ");
1371+
emitWithSuffix(node.awaitModifier, " ");
13721372
writeToken(SyntaxKind.OpenParenToken, openParenPos);
13731373
emitForBinding(node.initializer);
13741374
write(" of ");

src/compiler/factory.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -926,17 +926,17 @@ namespace ts {
926926
return node;
927927
}
928928

929-
export function createForOf(modifierToken: AwaitKeywordToken | EachKeywordToken, initializer: ForInitializer, expression: Expression, statement: Statement, location?: TextRange) {
929+
export function createForOf(modifierToken: AwaitKeywordToken, initializer: ForInitializer, expression: Expression, statement: Statement, location?: TextRange) {
930930
const node = <ForOfStatement>createNode(SyntaxKind.ForOfStatement, location);
931-
node.modifierToken = modifierToken;
931+
node.awaitModifier = modifierToken;
932932
node.initializer = initializer;
933933
node.expression = expression;
934934
node.statement = statement;
935935
return node;
936936
}
937937

938-
export function updateForOf(node: ForOfStatement, modifierToken: AwaitKeywordToken | EachKeywordToken, initializer: ForInitializer, expression: Expression, statement: Statement) {
939-
if (node.modifierToken !== modifierToken || node.initializer !== initializer || node.expression !== expression || node.statement !== statement) {
938+
export function updateForOf(node: ForOfStatement, modifierToken: AwaitKeywordToken, initializer: ForInitializer, expression: Expression, statement: Statement) {
939+
if (node.awaitModifier !== modifierToken || node.initializer !== initializer || node.expression !== expression || node.statement !== statement) {
940940
return updateNode(createForOf(modifierToken, initializer, expression, statement, node), node);
941941
}
942942
return node;

src/compiler/parser.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ namespace ts {
240240
visitNode(cbNode, (<ForInStatement>node).expression) ||
241241
visitNode(cbNode, (<ForInStatement>node).statement);
242242
case SyntaxKind.ForOfStatement:
243-
return visitNode(cbNode, (<ForOfStatement>node).modifierToken) ||
243+
return visitNode(cbNode, (<ForOfStatement>node).awaitModifier) ||
244244
visitNode(cbNode, (<ForOfStatement>node).initializer) ||
245245
visitNode(cbNode, (<ForOfStatement>node).expression) ||
246246
visitNode(cbNode, (<ForOfStatement>node).statement);
@@ -4427,7 +4427,7 @@ namespace ts {
44274427
function parseForOrForInOrForOfStatement(): Statement {
44284428
const pos = getNodePos();
44294429
parseExpected(SyntaxKind.ForKeyword);
4430-
const modifierToken = parseOptionalToken(SyntaxKind.AwaitKeyword) || parseOptionalToken(SyntaxKind.EachKeyword);
4430+
const awaitToken = parseOptionalToken(SyntaxKind.AwaitKeyword);
44314431
parseExpected(SyntaxKind.OpenParenToken);
44324432

44334433
let initializer: VariableDeclarationList | Expression = undefined;
@@ -4440,9 +4440,9 @@ namespace ts {
44404440
}
44414441
}
44424442
let forOrForInOrForOfStatement: IterationStatement;
4443-
if (modifierToken ? parseExpected(SyntaxKind.OfKeyword) : parseOptional(SyntaxKind.OfKeyword)) {
4443+
if (awaitToken ? parseExpected(SyntaxKind.OfKeyword) : parseOptional(SyntaxKind.OfKeyword)) {
44444444
const forOfStatement = <ForOfStatement>createNode(SyntaxKind.ForOfStatement, pos);
4445-
forOfStatement.modifierToken = modifierToken;
4445+
forOfStatement.awaitModifier = awaitToken;
44464446
forOfStatement.initializer = initializer;
44474447
forOfStatement.expression = allowInAnd(parseAssignmentExpressionOrHigher);
44484448
parseExpected(SyntaxKind.CloseParenToken);

src/compiler/scanner.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ namespace ts {
126126
"yield": SyntaxKind.YieldKeyword,
127127
"async": SyntaxKind.AsyncKeyword,
128128
"await": SyntaxKind.AwaitKeyword,
129-
"each": SyntaxKind.EachKeyword,
130129
"of": SyntaxKind.OfKeyword,
131130
"{": SyntaxKind.OpenBraceToken,
132131
"}": SyntaxKind.CloseBraceToken,

src/compiler/transformers/destructuring.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace ts {
66
interface FlattenContext {
77
context: TransformationContext;
88
level: FlattenLevel;
9+
iterationMode: IterationMode;
910
hoistTempVariables: boolean;
1011
emitExpression: (value: Expression) => void;
1112
emitBindingOrAssignment: (target: BindingOrAssignmentElementTarget, value: Expression, location: TextRange, original: Node) => void;
@@ -57,6 +58,7 @@ namespace ts {
5758
const flattenContext: FlattenContext = {
5859
context,
5960
level,
61+
iterationMode: getEmitIterationMode(context.getCompilerOptions()),
6062
hoistTempVariables: true,
6163
emitExpression,
6264
emitBindingOrAssignment,
@@ -143,6 +145,7 @@ namespace ts {
143145
const flattenContext: FlattenContext = {
144146
context,
145147
level,
148+
iterationMode: getEmitIterationMode(context.getCompilerOptions()),
146149
hoistTempVariables,
147150
emitExpression,
148151
emitBindingOrAssignment,
@@ -308,7 +311,7 @@ namespace ts {
308311
function flattenArrayBindingOrAssignmentPattern(flattenContext: FlattenContext, parent: BindingOrAssignmentElement, pattern: ArrayBindingOrAssignmentPattern, value: Expression, location: TextRange) {
309312
const elements = getElementsOfBindingOrAssignmentPattern(pattern);
310313
const numElements = elements.length;
311-
if (flattenContext.level < FlattenLevel.ObjectRest && !isArrayLiteralExpression(value)) {
314+
if (flattenContext.level < FlattenLevel.ObjectRest && flattenContext.iterationMode === IterationMode.Iterable) {
312315
// Read the elements of the iterable into an array
313316
value = ensureIdentifier(
314317
flattenContext,

0 commit comments

Comments
 (0)