Skip to content

Commit 4defd1d

Browse files
committed
Merge branch 'master' of https://github.com/Microsoft/TypeScript into feature/eslint
2 parents 9f47415 + e8bf958 commit 4defd1d

318 files changed

Lines changed: 6258 additions & 1767 deletions

File tree

Some content is hidden

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

src/compiler/builderState.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,8 +429,8 @@ namespace ts.BuilderState {
429429
const references = state.referencedMap.get(path);
430430
if (references) {
431431
const iterator = references.keys();
432-
for (let { value, done } = iterator.next(); !done; { value, done } = iterator.next()) {
433-
queue.push(value as Path);
432+
for (let iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) {
433+
queue.push(iterResult.value as Path);
434434
}
435435
}
436436
}

src/compiler/checker.ts

Lines changed: 913 additions & 385 deletions
Large diffs are not rendered by default.

src/compiler/commandLineParser.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ namespace ts {
4040
["es2017.string", "lib.es2017.string.d.ts"],
4141
["es2017.intl", "lib.es2017.intl.d.ts"],
4242
["es2017.typedarrays", "lib.es2017.typedarrays.d.ts"],
43+
["es2018.asyncgenerator", "lib.es2018.asyncgenerator.d.ts"],
4344
["es2018.asynciterable", "lib.es2018.asynciterable.d.ts"],
4445
["es2018.intl", "lib.es2018.intl.d.ts"],
4546
["es2018.promise", "lib.es2018.promise.d.ts"],
@@ -1899,7 +1900,9 @@ namespace ts {
18991900
case "object":
19001901
return {};
19011902
default:
1902-
return option.type.keys().next().value;
1903+
const iterResult = option.type.keys().next();
1904+
if (!iterResult.done) return iterResult.value;
1905+
return Debug.fail("Expected 'option.type' to have entries.");
19031906
}
19041907
}
19051908

src/compiler/core.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ namespace ts {
2525
" __sortedArrayBrand": any;
2626
}
2727

28-
2928
/** ES6 Map interface, only read methods included. */
3029
export interface ReadonlyMap<T> {
3130
get(key: string): T | undefined;
@@ -46,7 +45,7 @@ namespace ts {
4645

4746
/** ES6 Iterator type. */
4847
export interface Iterator<T> {
49-
next(): { value: T, done: false } | { value: never, done: true };
48+
next(): { value: T, done?: false } | { value: never, done: true };
5049
}
5150

5251
/** Array that is only intended to be pushed to, never read. */
@@ -299,12 +298,13 @@ namespace ts {
299298
forEach(action: (value: T, key: string) => void): void {
300299
const iterator = this.entries();
301300
while (true) {
302-
const { value: entry, done } = iterator.next();
303-
if (done) {
301+
const iterResult = iterator.next();
302+
if (iterResult.done) {
304303
break;
305304
}
306305

307-
action(entry[1], entry[0]);
306+
const [key, value] = iterResult.value;
307+
action(value, key);
308308
}
309309
}
310310
};
@@ -348,11 +348,11 @@ namespace ts {
348348

349349
export function firstDefinedIterator<T, U>(iter: Iterator<T>, callback: (element: T) => U | undefined): U | undefined {
350350
while (true) {
351-
const { value, done } = iter.next();
352-
if (done) {
351+
const iterResult = iter.next();
352+
if (iterResult.done) {
353353
return undefined;
354354
}
355-
const result = callback(value);
355+
const result = callback(iterResult.value);
356356
if (result !== undefined) {
357357
return result;
358358
}
@@ -377,7 +377,7 @@ namespace ts {
377377
return { value: undefined as never, done: true };
378378
}
379379
i++;
380-
return { value: [arrayA[i - 1], arrayB[i - 1]], done: false };
380+
return { value: [arrayA[i - 1], arrayB[i - 1]] as [T, U], done: false };
381381
}
382382
};
383383
}
@@ -569,7 +569,7 @@ namespace ts {
569569
return {
570570
next() {
571571
const iterRes = iter.next();
572-
return iterRes.done ? iterRes : { value: mapFn(iterRes.value), done: false };
572+
return iterRes.done ? iterRes as { done: true, value: never } : { value: mapFn(iterRes.value), done: false };
573573
}
574574
};
575575
}
@@ -680,7 +680,7 @@ namespace ts {
680680
}
681681
const iterRes = iter.next();
682682
if (iterRes.done) {
683-
return iterRes;
683+
return iterRes as { done: true, value: never };
684684
}
685685
currentIter = getIterator(iterRes.value);
686686
}
@@ -755,7 +755,7 @@ namespace ts {
755755
while (true) {
756756
const res = iter.next();
757757
if (res.done) {
758-
return res;
758+
return res as { done: true, value: never };
759759
}
760760
const value = mapFn(res.value);
761761
if (value !== undefined) {
@@ -1081,6 +1081,7 @@ namespace ts {
10811081
* @param value The value to append to the array. If `value` is `undefined`, nothing is
10821082
* appended.
10831083
*/
1084+
export function append<TArray extends any[] | undefined, TValue extends NonNullable<TArray>[number] | undefined>(to: TArray, value: TValue): [undefined, undefined] extends [TArray, TValue] ? TArray : NonNullable<TArray>[number][];
10841085
export function append<T>(to: T[], value: T | undefined): T[];
10851086
export function append<T>(to: T[] | undefined, value: T): T[];
10861087
export function append<T>(to: T[] | undefined, value: T | undefined): T[] | undefined;
@@ -1405,8 +1406,8 @@ namespace ts {
14051406
export function arrayFrom<T>(iterator: Iterator<T> | IterableIterator<T>): T[];
14061407
export function arrayFrom<T, U>(iterator: Iterator<T> | IterableIterator<T>, map?: (t: T) => U): (T | U)[] {
14071408
const result: (T | U)[] = [];
1408-
for (let { value, done } = iterator.next(); !done; { value, done } = iterator.next()) {
1409-
result.push(map ? map(value) : value);
1409+
for (let iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) {
1410+
result.push(map ? map(iterResult.value) : iterResult.value);
14101411
}
14111412
return result;
14121413
}

src/compiler/diagnosticMessages.json

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1764,7 +1764,7 @@
17641764
"category": "Error",
17651765
"code": 2489
17661766
},
1767-
"The type returned by the 'next()' method of an iterator must have a 'value' property.": {
1767+
"The type returned by the '{0}()' method of an iterator must have a 'value' property.": {
17681768
"category": "Error",
17691769
"code": 2490
17701770
},
@@ -1992,7 +1992,7 @@
19921992
"category": "Error",
19931993
"code": 2546
19941994
},
1995-
"The type returned by the 'next()' method of an async iterator must be a promise for a type with a 'value' property.": {
1995+
"The type returned by the '{0}()' method of an async iterator must be a promise for a type with a 'value' property.": {
19961996
"category": "Error",
19971997
"code": 2547
19981998
},
@@ -2653,6 +2653,30 @@
26532653
"category": "Error",
26542654
"code": 2762
26552655
},
2656+
"Cannot iterate value because the 'next' method of its iterator expects type '{1}', but for-of will always send '{0}'.": {
2657+
"category": "Error",
2658+
"code": 2763
2659+
},
2660+
"Cannot iterate value because the 'next' method of its iterator expects type '{1}', but array spread will always send '{0}'.": {
2661+
"category": "Error",
2662+
"code": 2764
2663+
},
2664+
"Cannot iterate value because the 'next' method of its iterator expects type '{1}', but array destructuring will always send '{0}'.": {
2665+
"category": "Error",
2666+
"code": 2765
2667+
},
2668+
"Cannot delegate iteration to value because the 'next' method of its iterator expects type '{1}', but the containing generator will always send '{0}'.": {
2669+
"category": "Error",
2670+
"code": 2766
2671+
},
2672+
"The '{0}' property of an iterator must be a method.": {
2673+
"category": "Error",
2674+
"code": 2767
2675+
},
2676+
"The '{0}' property of an async iterator must be a method.": {
2677+
"category": "Error",
2678+
"code": 2768
2679+
},
26562680

26572681
"Import declaration '{0}' is using private name '{1}'.": {
26582682
"category": "Error",
@@ -4214,7 +4238,7 @@
42144238
"category": "Error",
42154239
"code": 7024
42164240
},
4217-
"Generator implicitly has type '{0}' because it does not yield any values. Consider supplying a return type.": {
4241+
"Generator implicitly has yield type '{0}' because it does not yield any values. Consider supplying a return type annotation.": {
42184242
"category": "Error",
42194243
"code": 7025
42204244
},
@@ -4336,6 +4360,11 @@
43364360
"category": "Error",
43374361
"code": 7054
43384362
},
4363+
"'{0}', which lacks return-type annotation, implicitly has an '{1}' yield type.": {
4364+
"category": "Error",
4365+
"code": 7055
4366+
},
4367+
43394368
"You cannot rename this element.": {
43404369
"category": "Error",
43414370
"code": 8000

src/compiler/parser.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,8 @@ namespace ts {
466466
visitNode(cbNode, (<JSDocPropertyLikeTag>node).typeExpression)
467467
: visitNode(cbNode, (<JSDocPropertyLikeTag>node).typeExpression) ||
468468
visitNode(cbNode, (<JSDocPropertyLikeTag>node).name));
469+
case SyntaxKind.JSDocAuthorTag:
470+
return visitNode(cbNode, (node as JSDocTag).tagName);
469471
case SyntaxKind.JSDocAugmentsTag:
470472
return visitNode(cbNode, (node as JSDocTag).tagName) ||
471473
visitNode(cbNode, (<JSDocAugmentsTag>node).class);
@@ -6616,6 +6618,9 @@ namespace ts {
66166618

66176619
let tag: JSDocTag | undefined;
66186620
switch (tagName.escapedText) {
6621+
case "author":
6622+
tag = parseAuthorTag(start, tagName, margin);
6623+
break;
66196624
case "augments":
66206625
case "extends":
66216626
tag = parseAugmentsTag(start, tagName);
@@ -6895,6 +6900,69 @@ namespace ts {
68956900
return finishNode(result);
68966901
}
68976902

6903+
function parseAuthorTag(start: number, tagName: Identifier, indent: number): JSDocAuthorTag {
6904+
const result = <JSDocAuthorTag>createNode(SyntaxKind.JSDocAuthorTag, start);
6905+
result.tagName = tagName;
6906+
6907+
const authorInfoWithEmail = tryParse(() => tryParseAuthorNameAndEmail());
6908+
if (!authorInfoWithEmail) {
6909+
return finishNode(result);
6910+
}
6911+
6912+
result.comment = authorInfoWithEmail;
6913+
6914+
if (lookAhead(() => nextToken() !== SyntaxKind.NewLineTrivia)) {
6915+
const comment = parseTagComments(indent);
6916+
if (comment) {
6917+
result.comment += comment;
6918+
}
6919+
}
6920+
6921+
return finishNode(result);
6922+
}
6923+
6924+
function tryParseAuthorNameAndEmail(): string | undefined {
6925+
const comments: string[] = [];
6926+
let seenLessThan = false;
6927+
let seenGreaterThan = false;
6928+
let token = scanner.getToken();
6929+
6930+
loop: while (true) {
6931+
switch (token) {
6932+
case SyntaxKind.Identifier:
6933+
case SyntaxKind.WhitespaceTrivia:
6934+
case SyntaxKind.DotToken:
6935+
case SyntaxKind.AtToken:
6936+
comments.push(scanner.getTokenText());
6937+
break;
6938+
case SyntaxKind.LessThanToken:
6939+
if (seenLessThan || seenGreaterThan) {
6940+
return;
6941+
}
6942+
seenLessThan = true;
6943+
comments.push(scanner.getTokenText());
6944+
break;
6945+
case SyntaxKind.GreaterThanToken:
6946+
if (!seenLessThan || seenGreaterThan) {
6947+
return;
6948+
}
6949+
seenGreaterThan = true;
6950+
comments.push(scanner.getTokenText());
6951+
scanner.setTextPos(scanner.getTokenPos() + 1);
6952+
break loop;
6953+
case SyntaxKind.NewLineTrivia:
6954+
case SyntaxKind.EndOfFileToken:
6955+
break loop;
6956+
}
6957+
6958+
token = nextTokenJSDoc();
6959+
}
6960+
6961+
if (seenLessThan && seenGreaterThan) {
6962+
return comments.length === 0 ? undefined : comments.join("");
6963+
}
6964+
}
6965+
68986966
function parseAugmentsTag(start: number, tagName: Identifier): JSDocAugmentsTag {
68996967
const result = <JSDocAugmentsTag>createNode(SyntaxKind.JSDocAugmentsTag, start);
69006968
result.tagName = tagName;

src/compiler/scanner.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2087,6 +2087,8 @@ namespace ts {
20872087
return token = SyntaxKind.CloseBracketToken;
20882088
case CharacterCodes.lessThan:
20892089
return token = SyntaxKind.LessThanToken;
2090+
case CharacterCodes.greaterThan:
2091+
return token = SyntaxKind.GreaterThanToken;
20902092
case CharacterCodes.equals:
20912093
return token = SyntaxKind.EqualsToken;
20922094
case CharacterCodes.comma:

src/compiler/sourcemap.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ namespace ts {
148148
const sourceIndexToNewSourceIndexMap: number[] = [];
149149
let nameIndexToNewNameIndexMap: number[] | undefined;
150150
const mappingIterator = decodeMappings(map.mappings);
151-
for (let { value: raw, done } = mappingIterator.next(); !done; { value: raw, done } = mappingIterator.next()) {
151+
for (let iterResult = mappingIterator.next(); !iterResult.done; iterResult = mappingIterator.next()) {
152+
const raw = iterResult.value;
152153
if (end && (
153154
raw.generatedLine > end.line ||
154155
(raw.generatedLine === end.line && raw.generatedCharacter > end.character))) {

src/compiler/types.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ namespace ts {
1717
| SyntaxKind.OpenBraceToken
1818
| SyntaxKind.CloseBraceToken
1919
| SyntaxKind.LessThanToken
20+
| SyntaxKind.GreaterThanToken
2021
| SyntaxKind.OpenBracketToken
2122
| SyntaxKind.CloseBracketToken
2223
| SyntaxKind.EqualsToken
@@ -459,6 +460,7 @@ namespace ts {
459460
JSDocSignature,
460461
JSDocTag,
461462
JSDocAugmentsTag,
463+
JSDocAuthorTag,
462464
JSDocClassTag,
463465
JSDocCallbackTag,
464466
JSDocEnumTag,
@@ -2456,6 +2458,10 @@ namespace ts {
24562458
class: ExpressionWithTypeArguments & { expression: Identifier | PropertyAccessEntityNameExpression };
24572459
}
24582460

2461+
export interface JSDocAuthorTag extends JSDocTag {
2462+
kind: SyntaxKind.JSDocAuthorTag;
2463+
}
2464+
24592465
export interface JSDocClassTag extends JSDocTag {
24602466
kind: SyntaxKind.JSDocClassTag;
24612467
}
@@ -4289,13 +4295,23 @@ namespace ts {
42894295
regularType: ResolvedType; // Regular version of fresh type
42904296
}
42914297

4298+
/* @internal */
4299+
export interface IterationTypes {
4300+
readonly yieldType: Type;
4301+
readonly returnType: Type;
4302+
readonly nextType: Type;
4303+
}
4304+
42924305
// Just a place to cache element types of iterables and iterators
42934306
/* @internal */
42944307
export interface IterableOrIteratorType extends ObjectType, UnionType {
4295-
iteratedTypeOfIterable?: Type;
4296-
iteratedTypeOfIterator?: Type;
4297-
iteratedTypeOfAsyncIterable?: Type;
4298-
iteratedTypeOfAsyncIterator?: Type;
4308+
iterationTypesOfGeneratorReturnType?: IterationTypes;
4309+
iterationTypesOfAsyncGeneratorReturnType?: IterationTypes;
4310+
iterationTypesOfIterable?: IterationTypes;
4311+
iterationTypesOfIterator?: IterationTypes;
4312+
iterationTypesOfAsyncIterable?: IterationTypes;
4313+
iterationTypesOfAsyncIterator?: IterationTypes;
4314+
iterationTypesOfIteratorResult?: IterationTypes;
42994315
}
43004316

43014317
/* @internal */

src/compiler/utilities.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ namespace ts {
151151
export function forEachEntry<T, U>(map: ReadonlyMap<T>, callback: (value: T, key: string) => U | undefined): U | undefined;
152152
export function forEachEntry<T, U>(map: ReadonlyUnderscoreEscapedMap<T> | ReadonlyMap<T>, callback: (value: T, key: (string & __String)) => U | undefined): U | undefined {
153153
const iterator = map.entries();
154-
for (let { value: pair, done } = iterator.next(); !done; { value: pair, done } = iterator.next()) {
155-
const [key, value] = pair;
154+
for (let iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) {
155+
const [key, value] = iterResult.value;
156156
const result = callback(value, key as (string & __String));
157157
if (result) {
158158
return result;
@@ -166,8 +166,8 @@ namespace ts {
166166
export function forEachKey<T>(map: ReadonlyMap<{}>, callback: (key: string) => T | undefined): T | undefined;
167167
export function forEachKey<T>(map: ReadonlyUnderscoreEscapedMap<{}> | ReadonlyMap<{}>, callback: (key: string & __String) => T | undefined): T | undefined {
168168
const iterator = map.keys();
169-
for (let { value: key, done } = iterator.next(); !done; { value: key, done } = iterator.next()) {
170-
const result = callback(key as string & __String);
169+
for (let iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) {
170+
const result = callback(iterResult.value as string & __String);
171171
if (result) {
172172
return result;
173173
}
@@ -6078,6 +6078,10 @@ namespace ts {
60786078
return node.kind === SyntaxKind.JSDocComment;
60796079
}
60806080

6081+
export function isJSDocAuthorTag(node: Node): node is JSDocAuthorTag {
6082+
return node.kind === SyntaxKind.JSDocAuthorTag;
6083+
}
6084+
60816085
export function isJSDocAugmentsTag(node: Node): node is JSDocAugmentsTag {
60826086
return node.kind === SyntaxKind.JSDocAugmentsTag;
60836087
}

0 commit comments

Comments
 (0)