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

Skip to content

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) => 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