8000 Early support for generators. · nycdotnet/TypeScript@d506e92 · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d506e92

Browse files
committed
Early support for generators.
1 parent 72bfd2f commit d506e92

File tree

16 files changed

+3734
-185
lines changed

16 files changed

+3734
-185
lines changed

Jakefile.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ var compilerSources = [
4949
"transformers/module/module.ts",
5050
"transformers/jsx.ts",
5151
"transformers/es7.ts",
52+
"transformers/generators.ts",
5253
"transformers/es6.ts",
5354
"transformer.ts",
5455
"sourcemap.ts",
@@ -82,6 +83,7 @@ var servicesSources = [
8283
"transformers/module/module.ts",
8384
"transformers/jsx.ts",
8485
"transformers/es7.ts",
86+
"transformers/generators.ts",
8587
"transformers/es6.ts",
8688
"transformer.ts",
8789
"sourcemap.ts",

src/compiler/binder.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,7 +1115,7 @@ namespace ts {
11151115
}
11161116
}
11171117

1118-
function checkStrictModeNumericLiteral(node: LiteralExpression) {
1118+
function checkStrictModeNumericLiteral(node: NumericLiteral) {
11191119
if (inStrictMode && node.isOctalLiteral) {
11201120
file.bindDiagnostics.push(createDiagnosticForNode(node, Diagnostics.Octal_literals_are_not_allowed_in_strict_mode));
11211121
}
@@ -1296,7 +1296,7 @@ namespace ts {
12961296
case SyntaxKind.DeleteExpression:
12971297
return checkStrictModeDeleteExpression(<DeleteExpression>node);
12981298
case SyntaxKind.NumericLiteral:
1299-
return checkStrictModeNumericLiteral(<LiteralExpression>node);
1299+
return checkStrictModeNumericLiteral(<NumericLiteral>node);
13001300
case SyntaxKind.PostfixUnaryExpression:
13011301
return checkStrictModePostfixUnaryExpression(<PostfixUnaryExpression>node);
13021302
case SyntaxKind.PrefixUnaryExpression:
@@ -1852,11 +1852,14 @@ namespace ts {
18521852
case SyntaxKind.TaggedTemplateExpression:
18531853
case SyntaxKind.ShorthandPropertyAssignment:
18541854
case SyntaxKind.ForOfStatement:
1855-
case SyntaxKind.YieldExpression:
18561855
// These nodes are ES6 syntax.
18571856
transformFlags |= TransformFlags.AssertES6;
18581857
break;
18591858

1859+
case SyntaxKind.YieldExpression:
1860+
// This node is ES6 syntax.
1861+
transformFlags |= TransformFlags.AssertES6 | TransformFlags.ContainsYield;
1862+
break;
18601863

18611864
case SyntaxKind.AnyKeyword:
18621865
case SyntaxKind.NumberKeyword:
@@ -2026,10 +2029,13 @@ namespace ts {
20262029
// A FunctionExpression excludes markers that should not escape the scope of a FunctionExpression.
20272030
excludeFlags = TransformFlags.FunctionExcludes;
20282031

2032+
if ((<FunctionExpression>node).asteriskToken) {
2033+
transformFlags |= TransformFlags.ContainsGenerators;
2034+
}
2035+
20292036
// If a FunctionExpression contains an asterisk token, or its subtree has marked the container
20302037
// as needing to capture the lexical this, then this node is ES6 syntax.
2031-
if ((<FunctionLikeDeclaration>node).asteriskToken
2032-
|| subtreeFlags & TransformFlags.ContainsCapturedLexicalThis
2038+
if (subtreeFlags & TransformFlags.ContainsCapturedLexicalThis
20332039
|| subtreeFlags & TransformFlags.ContainsDefaultValueAssignments) {
20342040
transformFlags |= TransformFlags.AssertES6;
20352041
}
@@ -2051,11 +2057,14 @@ namespace ts {
20512057
break;
20522058
}
20532059

2060+
if ((<FunctionDeclaration>node).asteriskToken) {
2061+
transformFlags |= TransformFlags.ContainsGenerators;
2062+
}
2063+
20542064
// If a FunctionDeclaration has an asterisk token, is exported, or its
20552065
// subtree has marked the container as needing to capture the lexical `this`,
20562066
// then this node is ES6 syntax.
2057-
if ((<FunctionDeclaration>node).asteriskToken
2058-
|| node.flags & NodeFlags.Export
2067+
if (node.flags & NodeFlags.Export
20592068
|| subtreeFlags & TransformFlags.ContainsCapturedLexicalThis
20602069
|| subtreeFlags & TransformFlags.ContainsDefaultValueAssignments) {
20612070
transformFlags |= TransformFlags.AssertES6;
@@ -2183,6 +2192,10 @@ namespace ts {
21832192
excludeFlags = TransformFlags.MethodOrAccessorExcludes;
21842193
transformFlags |= TransformFlags.AssertES6;
21852194

2195+
if ((<MethodDeclaration>node).asteriskToken) {
2196+
transformFlags |= TransformFlags.ContainsGenerators;
2197+
}
2198+
21862199
// A MethodDeclaration is TypeScript syntax if it is either async, abstract, overloaded,
21872200
// generic, or has both a computed property name and a decorator.
21882201
if ((<MethodDeclaration>node).body === undefined

src/compiler/checker.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11404,7 +11404,7 @@ namespace ts {
1140411404
return type;
1140511405
}
1140611406

11407-
function checkNumericLiteral(node: LiteralExpression): Type {
11407+
function checkNumericLiteral(node: NumericLiteral): Type {
1140811408
// Grammar checking
1140911409
checkGrammarNumericLiteral(node);
1141011410
return numberType;
@@ -11424,7 +11424,7 @@ namespace ts {
1142411424
case SyntaxKind.FalseKeyword:
1142511425
return booleanType;
1142611426
case SyntaxKind.NumericLiteral:
11427-
return checkNumericLiteral(<LiteralExpression>node);
11427+
return checkNumericLiteral(<NumericLiteral>node);
1142811428
case SyntaxKind.TemplateExpression:
1142911429
return checkTemplateExpression(<TemplateExpression>node);
1143011430
case SyntaxKind.StringLiteral:
@@ -14328,7 +14328,7 @@ namespace ts {
1432814328
}
1432914329
return undefined;
1433014330
case SyntaxKind.NumericLiteral:
14331-
return +(<LiteralExpression>e).text;
14331+
return +(<NumericLiteral>e).text;
1433214332
case SyntaxKind.ParenthesizedExpression:
1433314333
return evalConstant((<ParenthesizedExpression>e).expression);
1433414334
case SyntaxKind.Identifier:
@@ -15499,7 +15499,7 @@ namespace ts {
1549915499
if (objectType === unknownType) return undefined;
1550015500
const apparentType = getApparentType(objectType);
1550115501
if (apparentType === unknownType) return undefined;
15502-
return getPropertyOfType(apparentType, (<LiteralExpression>node).text);
15502+
return getPropertyOfType(apparentType, (<NumericLiteral>node).text);
1550315503
}
1550415504
break;
1550515505
}
@@ -16693,7 +16693,7 @@ namespace ts {
1669316693
// Grammar checking for computedPropertName and shorthandPropertyAssignment
1669416694
checkGrammarForInvalidQuestionMark(prop, (<PropertyAssignment>prop).questionToken, Diagnostics.An_object_member_cannot_be_declared_optional);
1669516695
if (name.kind === SyntaxKind.NumericLiteral) {
16696-
checkGrammarNumericLiteral(<LiteralExpression>name);
16696+
checkGrammarNumericLiteral(<NumericLiteral>name);
1669716697
}
1669816698
currentKind = Property;
1669916699
}
@@ -17194,7 +17194,7 @@ namespace ts {
1719417194
}
1719517195
}
1719617196

17197-
function checkGrammarNumericLiteral(node: LiteralExpression): boolean {
17197+
function checkGrammarNumericLiteral(node: NumericLiteral): boolean {
1719817198
// Grammar checking
1719917199
if (node.isOctalLiteral && languageVersion >= ScriptTarget.ES5) {
1720017200
return grammarErrorOnNode(node, Diagnostics.Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher);

src/compiler/core.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -307,13 +307,14 @@ namespace ts {
307307
return ~low;
308308
}
309309

310-
export function reduceLeft<T, U>(array: T[], f: (memo: U, value: T, i: number) =&g EED3 t; U, initial: U): U;
310+
export function reduceLeft<T, U>(array: T[], f: (memo: U, value: T, i: number) => U, initial: U, start?: number, count?: number): U;
311311
export function reduceLeft<T>(array: T[], f: (memo: T, value: T, i: number) => T): T;
312-
export function reduceLeft<T>(array: T[], f: (memo: T, value: T, i: number) => T, initial?: T): T {
313-
if (array) {
314-
const count = array.length;
315-
if (count > 0) {
316-
let pos = 0;
312+
export function reduceLeft<T>(array: T[], f: (memo: T, value: T, i: number) => T, initial?: T, start?: number, count?: number): T {
313+
if (array && array.length > 0) {
314+
const size = array.length;
315+
if (size > 0) {
316+
let pos = start === undefined || start < 0 ? 0 : start;
317+
const end = count === undefined || pos + count > size - 1 ? size - 1 : pos + count;
317318
let result: T;
318319
if (arguments.length <= 2) {
319320
result = array[pos];
@@ -322,7 +323,7 @@ namespace ts {
322323
else {
323324
result = initial;
324325
}
325-
while (pos < count) {
326+
while (pos <= end) {
326327
result = f(result, array[pos], pos);
327328
pos++;
328329
}
@@ -332,12 +333,14 @@ namespace ts {
332333
return initial;
333334
}
334335

335-
export function reduceRight<T, U>(array: T[], f: (memo: U, value: T, i: number) => U, initial: U): U;
336+
export function reduceRight<T, U>(array: T[], f: (memo: U, value: T, i: number) => U, initial: U, start?: number, count?: number): U;
336337
export function reduceRight<T>(array: T[], f: (memo: T, value: T, i: number) => T): T;
337-
export function reduceRight<T>(array: T[], f: (memo: T, value: T, i: number) => T, initial?: T): T {
338+
export function reduceRight<T>(array: T[], f: (memo: T, value: T, i: number) => T, initial?: T, start?: number, count?: number): T {
338339
if (array) {
339-
let pos = array.length - 1;
340-
if (pos >= 0) {
340+
const size = array.length;
341+
if (size > 0) {
342+
let pos = start === undefined || start > size - 1 ? size - 1 : start;
343+
const end = count === undefined || pos - count < 0 ? 0 : pos - count;
341344
let result: T;
342345
if (arguments.length <= 2) {
343346
result = array[pos];
@@ -346,7 +349,7 @@ namespace ts {
346349
else {
347350
result = initial;
348351
}
349-
while (pos >= 0) {
352+
while (pos >= end) {
350353
result = f(result, array[pos], pos);
351354
pos--;
352355
}

src/compiler/emitter.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,7 +1406,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
14061406
write("\"");
14071407

14081408
if (node.kind === SyntaxKind.NumericLiteral) {
1409-
write((<LiteralExpression>node).text);
1409+
write((<NumericLiteral>node).text);
14101410
}
14111411
else {
14121412
writeTextOfNode(currentText, node);
@@ -3645,7 +3645,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
36453645
}
36463646

36473647
function createVoidZero(): Expression {
3648-
const zero = <LiteralExpression>createSynthesizedNode(SyntaxKind.NumericLiteral);
3648+
const zero = <NumericLiteral>createSynthesizedNode(SyntaxKind.NumericLiteral);
36493649
zero.text = "0";
36503650
const result = <VoidExpression>createSynthesizedNode(SyntaxKind.VoidExpression);
36513651
result.expression = zero;
@@ -3889,7 +3889,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
38893889
}
38903890

38913891
function createNumericLiteral(value: number) {
3892-
const node = <LiteralExpression>createSynthesizedNode(SyntaxKind.NumericLiteral);
3892+
const node = <NumericLiteral>createSynthesizedNode(SyntaxKind.NumericLiteral);
38933893
node.text = "" + value;
38943894
return node;
38953895
}

0 commit comments

Comments
 (0)
0