From a391d70baa1055b08bccf3725c787e0007e3504f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 23 Feb 2015 17:44:48 -0800 Subject: [PATCH 01/35] Stop using rewrites for object literal downlevel emit. --- src/compiler/emitter.ts | 195 +++++++++++++++++- .../baselines/reference/ES5SymbolProperty1.js | 7 +- .../reference/FunctionDeclaration8_es6.js | 4 +- .../reference/FunctionDeclaration9_es6.js | 4 +- .../FunctionPropertyAssignments5_es6.js | 3 +- .../reference/computedPropertyNames10_ES5.js | 16 +- .../reference/computedPropertyNames11_ES5.js | 60 +++++- .../reference/computedPropertyNames18_ES5.js | 7 +- .../reference/computedPropertyNames19_ES5.js | 7 +- .../reference/computedPropertyNames1_ES5.js | 16 +- .../reference/computedPropertyNames20_ES5.js | 7 +- .../reference/computedPropertyNames22_ES5.js | 6 +- .../reference/computedPropertyNames23_ES5.js | 4 +- .../reference/computedPropertyNames25_ES5.js | 6 +- .../reference/computedPropertyNames26_ES5.js | 4 +- .../reference/computedPropertyNames28_ES5.js | 6 +- .../reference/computedPropertyNames29_ES5.js | 6 +- .../reference/computedPropertyNames30_ES5.js | 9 +- .../reference/computedPropertyNames31_ES5.js | 6 +- .../reference/computedPropertyNames33_ES5.js | 6 +- .../reference/computedPropertyNames34_ES5.js | 6 +- .../reference/computedPropertyNames46_ES5.js | 7 +- .../reference/computedPropertyNames47_ES5.js | 7 +- .../reference/computedPropertyNames48_ES5.js | 21 +- .../reference/computedPropertyNames49_ES5.js | 51 +++-- .../reference/computedPropertyNames4_ES5.js | 27 +-- .../reference/computedPropertyNames50_ES5.js | 50 +++-- .../reference/computedPropertyNames5_ES5.js | 17 +- .../reference/computedPropertyNames6_ES5.js | 11 +- .../reference/computedPropertyNames7_ES5.js | 7 +- .../reference/computedPropertyNames8_ES5.js | 9 +- .../reference/computedPropertyNames9_ES5.js | 11 +- ...mputedPropertyNamesContextualType10_ES5.js | 9 +- ...omputedPropertyNamesContextualType1_ES5.js | 8 +- ...omputedPropertyNamesContextualType2_ES5.js | 8 +- ...omputedPropertyNamesContextualType3_ES5.js | 8 +- ...omputedPropertyNamesContextualType4_ES5.js | 9 +- ...omputedPropertyNamesContextualType5_ES5.js | 9 +- ...omputedPropertyNamesContextualType6_ES5.js | 17 +- ...omputedPropertyNamesContextualType7_ES5.js | 17 +- ...omputedPropertyNamesContextualType8_ES5.js | 9 +- ...omputedPropertyNamesContextualType9_ES5.js | 9 +- ...mputedPropertyNamesDeclarationEmit5_ES5.js | 18 +- .../computedPropertyNamesSourceMap2_ES5.js | 10 +- ...computedPropertyNamesSourceMap2_ES5.js.map | 2 +- ...dPropertyNamesSourceMap2_ES5.sourcemap.txt | 191 +++++++---------- .../parserES5ComputedPropertyName2.js | 4 +- .../parserES5ComputedPropertyName3.js | 3 +- .../parserES5ComputedPropertyName4.js | 7 +- tests/baselines/reference/privateIndexer2.js | 9 +- 50 files changed, 624 insertions(+), 326 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 3247b5ff1d1..78a4ea54b69 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2555,6 +2555,195 @@ module ts { } } + function emitObjectLiteralBody(node: ObjectLiteralExpression, numElements: number): void { + if (numElements === 0) { + write("{}"); + return; + } + + write("{"); + + if (numElements > 0) { + var properties = node.properties; + + + // If we are not doing a downlevel transformation for object literals, + // then try to preserve the original shape of the object literal. + // Otherwise just try to preserve the formatting. + if (numElements === properties.length) { + emitLinePreservingList(node, properties, /* allowTrailingComma */ languageVersion >= ScriptTarget.ES5, /* spacesBetweenBraces */ true); + } + else { + var multiLine = (node.flags & NodeFlags.MultiLine) !== 0; + if (!multiLine) { + write(" "); + } + else { + increaseIndent(); + } + + emitList(properties, 0, numElements, /*multiLine*/ multiLine, /*trailingComma*/ false); + + if (!multiLine) { + write(" "); + } + else { + decreaseIndent(); + } + } + } + + write("}"); + } + + function emitDownlevelObjectLiteralWithComputedProperties(node: ObjectLiteralExpression, firstComputedPropertyIndex: number) { + var multiLine = (node.flags & NodeFlags.MultiLine) !== 0; + var properties = node.properties; + + write("("); + + if (multiLine) { + increaseIndent(); + } + + // For computed properties, we need to create a unique handle to the object + // literal so we can modify it without risking internal assignments tainting the object. + var tempVar = createAndRecordTempVariable(node); + + // Write out the first non-computed properties + // (or all properties if none of them are computed), + // then emit the rest through indexing on the temp variable. + emit(tempVar) + write(" = "); + emitObjectLiteralBody(node, firstComputedPropertyIndex); + + + for (var i = firstComputedPropertyIndex, n = properties.length; i < n; i++) { + writeComma(); + + var property = properties[i]; + + emitStart(property) + if (property.kind === SyntaxKind.GetAccessor || property.kind === SyntaxKind.SetAccessor) { + // TODO (drosen): Reconcile with 'emitMemberFunctions'. + var accessors = getAllAccessorDeclarations(node.properties, property); + if (property !== accessors.firstAccessor) { + continue; + } + write("Object.defineProperty("); + emit(tempVar); + write(", "); + emitStart(node.name); + emitExpressionForPropertyName(property.name); + emitEnd(property.name); + write(", {"); + increaseIndent(); + if (accessors.getAccessor) { + writeLine() + emitLeadingComments(accessors.getAccessor); + write("get: "); + emitStart(accessors.getAccessor); + write("function "); + emitSignatureAndBody(accessors.getAccessor); + emitEnd(accessors.getAccessor); + emitTrailingComments(accessors.getAccessor); + write(","); + } + if (accessors.setAccessor) { + writeLine(); + emitLeadingComments(accessors.setAccessor); + write("set: "); + emitStart(accessors.setAccessor); + write("function "); + emitSignatureAndBody(accessors.setAccessor); + emitEnd(accessors.setAccessor); + emitTrailingComments(accessors.setAccessor); + write(","); + } + writeLine(); + write("enumerable: true,"); + writeLine(); + write("configurable: true"); + decreaseIndent(); + writeLine(); + write("})"); + emitEnd(property); + } + else { + emitLeadingComments(property); + emitStart(property.name); + emit(tempVar); + emitMemberAccessForPropertyName(property.name); + emitEnd(property.name); + + write(" = "); + + if (property.kind === SyntaxKind.PropertyAssignment) { + emit((property).initializer); + } + else if (property.kind === SyntaxKind.ShorthandPropertyAssignment) { + emitExpressionIdentifier((property).name); + } + else if (property.kind === SyntaxKind.MethodDeclaration) { + emitFunctionDeclaration(property); + } + else { + Debug.fail("ObjectLiteralElement type not accounted for: " + property.kind); + } + } + + emitEnd(property); + } + + writeComma(); + emit(tempVar); + + if (multiLine) { + decreaseIndent(); + writeLine(); + } + + write(")"); + + function writeComma() { + if (multiLine) { + write(","); + writeLine(); + } + else { + write(", "); + } + } + } + + function emitObjectLiteral(node: ObjectLiteralExpression): void { + var properties = node.properties; + + if (languageVersion < ScriptTarget.ES6) { + var numProperties = properties.length; + + // Find the first computed property. + // Everything until that point can be emitted as part of the initial object literal. + var numInitialNonComputedProperties = numProperties; + for (var i = 0, n = properties.length; i < n; i++) { + if (properties[i].name.kind === SyntaxKind.ComputedPropertyName) { + numInitialNonComputedProperties = i; + break; + } + } + + var hasComputedProperty = numInitialNonComputedProperties !== properties.length; + if (hasComputedProperty) { + emitDownlevelObjectLiteralWithComputedProperties(node, numInitialNonComputedProperties); + return; + } + } + + // Ordinary case: either the object has no computed properties + // or we're compiling with an ES6+ target. + emitObjectLiteralBody(node, properties.length); + } + function createSynthesizedNode(kind: SyntaxKind): Node { var node = createNode(kind); node.pos = -1; @@ -2563,7 +2752,7 @@ module ts { return node; } - function emitDownlevelObjectLiteralWithComputedProperties(node: ObjectLiteralExpression, firstComputedPropertyIndex: number): void { + function emitDownlevelObjectLiteralWithComputedPropertiesThroughRewrite(node: ObjectLiteralExpression, firstComputedPropertyIndex: number): void { var parenthesizedObjectLiteral = createDownlevelObjectLiteralWithComputedProperties(node, firstComputedPropertyIndex); return emit(parenthesizedObjectLiteral); } @@ -2763,7 +2952,7 @@ module ts { return result; } - function emitObjectLiteral(node: ObjectLiteralExpression): void { + function emitObjectLiteralThroughRewrite(node: ObjectLiteralExpression): void { var properties = node.properties; if (languageVersion < ScriptTarget.ES6) { @@ -2781,7 +2970,7 @@ module ts { var hasComputedProperty = numInitialNonComputedProperties !== properties.length; if (hasComputedProperty) { - emitDownlevelObjectLiteralWithComputedProperties(node, numInitialNonComputedProperties); + emitDownlevelObjectLiteralWithComputedPropertiesThroughRewrite(node, numInitialNonComputedProperties); return; } } diff --git a/tests/baselines/reference/ES5SymbolProperty1.js b/tests/baselines/reference/ES5SymbolProperty1.js index e977df7dc6b..1073a33163d 100644 --- a/tests/baselines/reference/ES5SymbolProperty1.js +++ b/tests/baselines/reference/ES5SymbolProperty1.js @@ -12,8 +12,9 @@ obj[Symbol.foo]; //// [ES5SymbolProperty1.js] var Symbol; -var obj = (_a = {}, _a[Symbol.foo] = -0, -_a); +var obj = (_a = {}, + _a[Symbol.foo] = 0, + _a +); obj[Symbol.foo]; var _a; diff --git a/tests/baselines/reference/FunctionDeclaration8_es6.js b/tests/baselines/reference/FunctionDeclaration8_es6.js index 3f6d2499cef..64f6bff50c0 100644 --- a/tests/baselines/reference/FunctionDeclaration8_es6.js +++ b/tests/baselines/reference/FunctionDeclaration8_es6.js @@ -2,7 +2,5 @@ var v = { [yield]: foo } //// [FunctionDeclaration8_es6.js] -var v = (_a = {}, _a[yield] = -foo, -_a); +var v = (_a = {}, _a[yield] = foo, _a); var _a; diff --git a/tests/baselines/reference/FunctionDeclaration9_es6.js b/tests/baselines/reference/FunctionDeclaration9_es6.js index 04c946a96eb..bca309d2d62 100644 --- a/tests/baselines/reference/FunctionDeclaration9_es6.js +++ b/tests/baselines/reference/FunctionDeclaration9_es6.js @@ -5,8 +5,6 @@ function * foo() { //// [FunctionDeclaration9_es6.js] function foo() { - var v = (_a = {}, _a[] = - foo, - _a); + var v = (_a = {}, _a[] = foo, _a); var _a; } diff --git a/tests/baselines/reference/FunctionPropertyAssignments5_es6.js b/tests/baselines/reference/FunctionPropertyAssignments5_es6.js index 0b786632bdf..188a843f751 100644 --- a/tests/baselines/reference/FunctionPropertyAssignments5_es6.js +++ b/tests/baselines/reference/FunctionPropertyAssignments5_es6.js @@ -2,6 +2,5 @@ var v = { *[foo()]() { } } //// [FunctionPropertyAssignments5_es6.js] -var v = (_a = {}, _a[foo()] = function () { }, -_a); +var v = (_a = {}, _a[foo()] = function () { }, _a); var _a; diff --git a/tests/baselines/reference/computedPropertyNames10_ES5.js b/tests/baselines/reference/computedPropertyNames10_ES5.js index ececb28b8cc..14d9235b12b 100644 --- a/tests/baselines/reference/computedPropertyNames10_ES5.js +++ b/tests/baselines/reference/computedPropertyNames10_ES5.js @@ -20,6 +20,18 @@ var v = { var s; var n; var a; -var v = (_a = {}, _a[s] = function () { }, _a[n] = function () { }, _a[s + s] = function () { }, _a[s + n] = function () { }, _a[+s] = function () { }, _a[""] = function () { }, _a[0] = function () { }, _a[a] = function () { }, _a[true] = function () { }, _a["hello bye"] = function () { }, _a["hello " + a + " bye"] = function () { }, -_a); +var v = (_a = {}, + _a[s] = function () { }, + _a[n] = function () { }, + _a[s + s] = function () { }, + _a[s + n] = function () { }, + _a[+s] = function () { }, + _a[""] = function () { }, + _a[0] = function () { }, + _a[a] = function () { }, + _a[true] = function () { }, + _a["hello bye"] = function () { }, + _a["hello " + a + " bye"] = function () { }, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames11_ES5.js b/tests/baselines/reference/computedPropertyNames11_ES5.js index d8450deb765..64c0b0bd67e 100644 --- a/tests/baselines/reference/computedPropertyNames11_ES5.js +++ b/tests/baselines/reference/computedPropertyNames11_ES5.js @@ -20,6 +20,62 @@ var v = { var s; var n; var a; -var v = (_a = {}, _a[s] = Object.defineProperty({ get: function () { return 0; }, enumerable: true, configurable: true }), _a[n] = Object.defineProperty({ set: function (v) { }, enumerable: true, configurable: true }), _a[s + s] = Object.defineProperty({ get: function () { return 0; }, enumerable: true, configurable: true }), _a[s + n] = Object.defineProperty({ set: function (v) { }, enumerable: true, configurable: true }), _a[+s] = Object.defineProperty({ get: function () { return 0; }, enumerable: true, configurable: true }), _a[""] = Object.defineProperty({ set: function (v) { }, enumerable: true, configurable: true }), _a[0] = Object.defineProperty({ get: function () { return 0; }, enumerable: true, configurable: true }), _a[a] = Object.defineProperty({ set: function (v) { }, enumerable: true, configurable: true }), _a[true] = Object.defineProperty({ get: function () { return 0; }, enumerable: true, configurable: true }), _a["hello bye"] = Object.defineProperty({ set: function (v) { }, enumerable: true, configurable: true }), _a["hello " + a + " bye"] = Object.defineProperty({ get: function () { return 0; }, enumerable: true, configurable: true }), -_a); +var v = (_a = {}, + Object.defineProperty(_a, s, { + get: function () { return 0; }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, n, { + set: function (v) { }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, s + s, { + get: function () { return 0; }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, s + n, { + set: function (v) { }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, +s, { + get: function () { return 0; }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, "", { + set: function (v) { }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, 0, { + get: function () { return 0; }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, a, { + set: function (v) { }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, true, { + get: function () { return 0; }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, "hello bye", { + set: function (v) { }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, "hello " + a + " bye", { + get: function () { return 0; }, + enumerable: true, + configurable: true + }), + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames18_ES5.js b/tests/baselines/reference/computedPropertyNames18_ES5.js index 0ccc0fb4e00..b65c7fd4f7d 100644 --- a/tests/baselines/reference/computedPropertyNames18_ES5.js +++ b/tests/baselines/reference/computedPropertyNames18_ES5.js @@ -7,8 +7,9 @@ function foo() { //// [computedPropertyNames18_ES5.js] function foo() { - var obj = (_a = {}, _a[this.bar] = - 0, - _a); + var obj = (_a = {}, + _a[this.bar] = 0, + _a + ); var _a; } diff --git a/tests/baselines/reference/computedPropertyNames19_ES5.js b/tests/baselines/reference/computedPropertyNames19_ES5.js index a18cb7b95c3..36f3e66c7c2 100644 --- a/tests/baselines/reference/computedPropertyNames19_ES5.js +++ b/tests/baselines/reference/computedPropertyNames19_ES5.js @@ -8,8 +8,9 @@ module M { //// [computedPropertyNames19_ES5.js] var M; (function (M) { - var obj = (_a = {}, _a[this.bar] = - 0, - _a); + var obj = (_a = {}, + _a[this.bar] = 0, + _a + ); var _a; })(M || (M = {})); diff --git a/tests/baselines/reference/computedPropertyNames1_ES5.js b/tests/baselines/reference/computedPropertyNames1_ES5.js index 36a7fd6052d..4fdec28c7aa 100644 --- a/tests/baselines/reference/computedPropertyNames1_ES5.js +++ b/tests/baselines/reference/computedPropertyNames1_ES5.js @@ -5,6 +5,18 @@ var v = { } //// [computedPropertyNames1_ES5.js] -var v = (_a = {}, _a[0 + 1] = Object.defineProperty({ get: function () { return 0; }, enumerable: true, configurable: true }), _a[0 + 1] = Object.defineProperty({ set: function (v) { }, enumerable: true, configurable: true }), -_a); +var v = (_a = {}, + Object.defineProperty(_a, 0 + 1, { + get: function () { return 0; }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, 0 + 1, { + set: function (v) { } //No error + , + enumerable: true, + configurable: true + }), + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames20_ES5.js b/tests/baselines/reference/computedPropertyNames20_ES5.js index 21af64d7e41..65acd7fa08f 100644 --- a/tests/baselines/reference/computedPropertyNames20_ES5.js +++ b/tests/baselines/reference/computedPropertyNames20_ES5.js @@ -4,7 +4,8 @@ var obj = { } //// [computedPropertyNames20_ES5.js] -var obj = (_a = {}, _a[this.bar] = -0, -_a); +var obj = (_a = {}, + _a[this.bar] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames22_ES5.js b/tests/baselines/reference/computedPropertyNames22_ES5.js index e3e685aa54b..e82bf673b52 100644 --- a/tests/baselines/reference/computedPropertyNames22_ES5.js +++ b/tests/baselines/reference/computedPropertyNames22_ES5.js @@ -13,8 +13,10 @@ var C = (function () { function C() { } C.prototype.bar = function () { - var obj = (_a = {}, _a[this.bar()] = function () { }, - _a); + var obj = (_a = {}, + _a[this.bar()] = function () { }, + _a + ); return 0; var _a; }; diff --git a/tests/baselines/reference/computedPropertyNames23_ES5.js b/tests/baselines/reference/computedPropertyNames23_ES5.js index 7b5a5a101a5..33a6d95ec47 100644 --- a/tests/baselines/reference/computedPropertyNames23_ES5.js +++ b/tests/baselines/reference/computedPropertyNames23_ES5.js @@ -15,9 +15,7 @@ var C = (function () { C.prototype.bar = function () { return 0; }; - C.prototype[(_a = {}, _a[this.bar()] = - 1, - _a)[0]] = function () { }; + C.prototype[(_a = {}, _a[this.bar()] = 1, _a)[0]] = function () { }; return C; })(); var _a; diff --git a/tests/baselines/reference/computedPropertyNames25_ES5.js b/tests/baselines/reference/computedPropertyNames25_ES5.js index bd2212b72b3..b6a8d254b26 100644 --- a/tests/baselines/reference/computedPropertyNames25_ES5.js +++ b/tests/baselines/reference/computedPropertyNames25_ES5.js @@ -34,8 +34,10 @@ var C = (function (_super) { _super.apply(this, arguments); } C.prototype.foo = function () { - var obj = (_a = {}, _a[_super.prototype.bar.call(this)] = function () { }, - _a); + var obj = (_a = {}, + _a[_super.prototype.bar.call(this)] = function () { }, + _a + ); return 0; var _a; }; diff --git a/tests/baselines/reference/computedPropertyNames26_ES5.js b/tests/baselines/reference/computedPropertyNames26_ES5.js index 5df2f6dc1b6..60f6590be9d 100644 --- a/tests/baselines/reference/computedPropertyNames26_ES5.js +++ b/tests/baselines/reference/computedPropertyNames26_ES5.js @@ -34,9 +34,7 @@ var C = (function (_super) { } // Gets emitted as super, not _super, which is consistent with // use of super in static properties initializers. - C.prototype[(_a = {}, _a[super.bar.call(this)] = - 1, - _a)[0]] = function () { }; + C.prototype[(_a = {}, _a[super.bar.call(this)] = 1, _a)[0]] = function () { }; return C; })(Base); var _a; diff --git a/tests/baselines/reference/computedPropertyNames28_ES5.js b/tests/baselines/reference/computedPropertyNames28_ES5.js index 7e548d4d6d3..5940c498db8 100644 --- a/tests/baselines/reference/computedPropertyNames28_ES5.js +++ b/tests/baselines/reference/computedPropertyNames28_ES5.js @@ -26,8 +26,10 @@ var C = (function (_super) { __extends(C, _super); function C() { _super.call(this); - var obj = (_a = {}, _a[(_super.call(this), "prop")] = function () { }, - _a); + var obj = (_a = {}, + _a[(_super.call(this), "prop")] = function () { }, + _a + ); var _a; } return C; diff --git a/tests/baselines/reference/computedPropertyNames29_ES5.js b/tests/baselines/reference/computedPropertyNames29_ES5.js index 27c7cd97988..4682ae9105e 100644 --- a/tests/baselines/reference/computedPropertyNames29_ES5.js +++ b/tests/baselines/reference/computedPropertyNames29_ES5.js @@ -17,8 +17,10 @@ var C = (function () { C.prototype.bar = function () { var _this = this; (function () { - var obj = (_a = {}, _a[_this.bar()] = function () { }, - _a); + var obj = (_a = {}, + _a[_this.bar()] = function () { }, + _a + ); var _a; }); return 0; diff --git a/tests/baselines/reference/computedPropertyNames30_ES5.js b/tests/baselines/reference/computedPropertyNames30_ES5.js index 505b149f62d..05196e23c5b 100644 --- a/tests/baselines/reference/computedPropertyNames30_ES5.js +++ b/tests/baselines/reference/computedPropertyNames30_ES5.js @@ -32,8 +32,13 @@ var C = (function (_super) { function C() { _super.call(this); (function () { - var obj = (_a = {}, _a[(_super.call(this), "prop")] = function () { }, - _a); + var obj = (_a = {}, + // Ideally, we would capture this. But the reference is + // illegal, and not capturing this is consistent with + //treatment of other similar violations. + _a[(_super.call(this), "prop")] = function () { }, + _a + ); var _a; }); } diff --git a/tests/baselines/reference/computedPropertyNames31_ES5.js b/tests/baselines/reference/computedPropertyNames31_ES5.js index 0c8cbac455f..173e3c7222b 100644 --- a/tests/baselines/reference/computedPropertyNames31_ES5.js +++ b/tests/baselines/reference/computedPropertyNames31_ES5.js @@ -38,8 +38,10 @@ var C = (function (_super) { C.prototype.foo = function () { var _this = this; (function () { - var obj = (_a = {}, _a[_super.prototype.bar.call(_this)] = function () { }, - _a); + var obj = (_a = {}, + _a[_super.prototype.bar.call(_this)] = function () { }, + _a + ); var _a; }); return 0; diff --git a/tests/baselines/reference/computedPropertyNames33_ES5.js b/tests/baselines/reference/computedPropertyNames33_ES5.js index 84df68fcc10..38029893bb1 100644 --- a/tests/baselines/reference/computedPropertyNames33_ES5.js +++ b/tests/baselines/reference/computedPropertyNames33_ES5.js @@ -15,8 +15,10 @@ var C = (function () { function C() { } C.prototype.bar = function () { - var obj = (_a = {}, _a[foo()] = function () { }, - _a); + var obj = (_a = {}, + _a[foo()] = function () { }, + _a + ); return 0; var _a; }; diff --git a/tests/baselines/reference/computedPropertyNames34_ES5.js b/tests/baselines/reference/computedPropertyNames34_ES5.js index 9e1de33be7c..4e5790c53b1 100644 --- a/tests/baselines/reference/computedPropertyNames34_ES5.js +++ b/tests/baselines/reference/computedPropertyNames34_ES5.js @@ -15,8 +15,10 @@ var C = (function () { function C() { } C.bar = function () { - var obj = (_a = {}, _a[foo()] = function () { }, - _a); + var obj = (_a = {}, + _a[foo()] = function () { }, + _a + ); return 0; var _a; }; diff --git a/tests/baselines/reference/computedPropertyNames46_ES5.js b/tests/baselines/reference/computedPropertyNames46_ES5.js index 3e4329b8a20..307dadcbe91 100644 --- a/tests/baselines/reference/computedPropertyNames46_ES5.js +++ b/tests/baselines/reference/computedPropertyNames46_ES5.js @@ -4,7 +4,8 @@ var o = { }; //// [computedPropertyNames46_ES5.js] -var o = (_a = {}, _a["" || 0] = -0, -_a); +var o = (_a = {}, + _a["" || 0] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames47_ES5.js b/tests/baselines/reference/computedPropertyNames47_ES5.js index 7874a25976f..6ba31fe3b06 100644 --- a/tests/baselines/reference/computedPropertyNames47_ES5.js +++ b/tests/baselines/reference/computedPropertyNames47_ES5.js @@ -14,7 +14,8 @@ var E2; (function (E2) { E2[E2["x"] = 0] = "x"; })(E2 || (E2 = {})); -var o = (_a = {}, _a[0 /* x */ || 0 /* x */] = -0, -_a); +var o = (_a = {}, + _a[0 /* x */ || 0 /* x */] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames48_ES5.js b/tests/baselines/reference/computedPropertyNames48_ES5.js index f3f9941aeae..859fb7a179c 100644 --- a/tests/baselines/reference/computedPropertyNames48_ES5.js +++ b/tests/baselines/reference/computedPropertyNames48_ES5.js @@ -23,13 +23,16 @@ var E; E[E["x"] = 0] = "x"; })(E || (E = {})); var a; -extractIndexer((_a = {}, _a[a] = -"", -_a)); // Should return string -extractIndexer((_b = {}, _b[0 /* x */] = -"", -_b)); // Should return string -extractIndexer((_c = {}, _c["" || 0] = -"", -_c)); // Should return any (widened form of undefined) +extractIndexer((_a = {}, + _a[a] = "", + _a +)); // Should return string +extractIndexer((_b = {}, + _b[0 /* x */] = "", + _b +)); // Should return string +extractIndexer((_c = {}, + _c["" || 0] = "", + _c +)); // Should return any (widened form of undefined) var _a, _b, _c; diff --git a/tests/baselines/reference/computedPropertyNames49_ES5.js b/tests/baselines/reference/computedPropertyNames49_ES5.js index a64d9431a9a..3427ea665a0 100644 --- a/tests/baselines/reference/computedPropertyNames49_ES5.js +++ b/tests/baselines/reference/computedPropertyNames49_ES5.js @@ -27,20 +27,41 @@ var x = { //// [computedPropertyNames49_ES5.js] var x = (_a = { - p1: 10 -}, _a.p1 = -10, _a[1 + 1] = Object.defineProperty({ get: function () { - throw 10; - }, enumerable: true, configurable: true }), _a[1 + 1] = Object.defineProperty({ get: function () { - return 10; - }, enumerable: true, configurable: true }), _a[1 + 1] = Object.defineProperty({ set: function () { - // just throw - throw 10; - }, enumerable: true, configurable: true }), _a.foo = Object.defineProperty({ get: function () { - if (1 == 1) { + p1: 10 + }, + Object.defineProperty(_a, 1 + 1, { + get: function () { + throw 10; + }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, 1 + 1, { + get: function () { return 10; - } - }, enumerable: true, configurable: true }), _a.p2 = -20, -_a); + }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, 1 + 1, { + set: function () { + // just throw + throw 10; + }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, "foo", { + get: function () { + if (1 == 1) { + return 10; + } + }, + enumerable: true, + configurable: true + }), + , + _a.p2 = 20, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames4_ES5.js b/tests/baselines/reference/computedPropertyNames4_ES5.js index 255b14eb970..f91476c79c1 100644 --- a/tests/baselines/reference/computedPropertyNames4_ES5.js +++ b/tests/baselines/reference/computedPropertyNames4_ES5.js @@ -20,17 +20,18 @@ var v = { var s; var n; var a; -var v = (_a = {}, _a[s] = -0, _a[n] = -n, _a[s + s] = -1, _a[s + n] = -2, _a[+s] = -s, _a[""] = -0, _a[0] = -0, _a[a] = -1, _a[true] = -0, _a["hello bye"] = -0, _a["hello " + a + " bye"] = -0, -_a); +var v = (_a = {}, + _a[s] = 0, + _a[n] = n, + _a[s + s] = 1, + _a[s + n] = 2, + _a[+s] = s, + _a[""] = 0, + _a[0] = 0, + _a[a] = 1, + _a[true] = 0, + _a["hello bye"] = 0, + _a["hello " + a + " bye"] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames50_ES5.js b/tests/baselines/reference/computedPropertyNames50_ES5.js index a0703eeac05..a74561295be 100644 --- a/tests/baselines/reference/computedPropertyNames50_ES5.js +++ b/tests/baselines/reference/computedPropertyNames50_ES5.js @@ -27,25 +27,37 @@ var x = { //// [computedPropertyNames50_ES5.js] var x = (_a = { - p1: 10, - get foo() { - if (1 == 1) { - return 10; + p1: 10, + get foo() { + if (1 == 1) { + return 10; + } } - } -}, _a.p1 = -10, _a.foo = Object.defineProperty({ get: function () { - if (1 == 1) { + }, + Object.defineProperty(_a, 1 + 1, { + get: function () { + throw 10; + }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, 1 + 1, { + set: function () { + // just throw + throw 10; + }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, 1 + 1, { + get: function () { return 10; - } - }, enumerable: true, configurable: true }), _a[1 + 1] = Object.defineProperty({ get: function () { - throw 10; - }, enumerable: true, configurable: true }), _a[1 + 1] = Object.defineProperty({ set: function () { - // just throw - throw 10; - }, enumerable: true, configurable: true }), _a[1 + 1] = Object.defineProperty({ get: function () { - return 10; - }, enumerable: true, configurable: true }), _a.p2 = -20, -_a); + }, + enumerable: true, + configurable: true + }), + , + _a.p2 = 20, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames5_ES5.js b/tests/baselines/reference/computedPropertyNames5_ES5.js index 722c0f3a74d..58c5af2efa3 100644 --- a/tests/baselines/reference/computedPropertyNames5_ES5.js +++ b/tests/baselines/reference/computedPropertyNames5_ES5.js @@ -11,12 +11,13 @@ var v = { //// [computedPropertyNames5_ES5.js] var b; -var v = (_a = {}, _a[b] = -0, _a[true] = -1, _a[[]] = -0, _a[{}] = -0, _a[undefined] = -undefined, _a[null] = -null, -_a); +var v = (_a = {}, + _a[b] = 0, + _a[true] = 1, + _a[[]] = 0, + _a[{}] = 0, + _a[undefined] = undefined, + _a[null] = null, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames6_ES5.js b/tests/baselines/reference/computedPropertyNames6_ES5.js index 4e3ed1b2e9f..7e9c6202940 100644 --- a/tests/baselines/reference/computedPropertyNames6_ES5.js +++ b/tests/baselines/reference/computedPropertyNames6_ES5.js @@ -12,9 +12,10 @@ var v = { var p1; var p2; var p3; -var v = (_a = {}, _a[p1] = -0, _a[p2] = -1, _a[p3] = -2, -_a); +var v = (_a = {}, + _a[p1] = 0, + _a[p2] = 1, + _a[p3] = 2, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames7_ES5.js b/tests/baselines/reference/computedPropertyNames7_ES5.js index 3e1bcc1151c..886cd8d85eb 100644 --- a/tests/baselines/reference/computedPropertyNames7_ES5.js +++ b/tests/baselines/reference/computedPropertyNames7_ES5.js @@ -11,7 +11,8 @@ var E; (function (E) { E[E["member"] = 0] = "member"; })(E || (E = {})); -var v = (_a = {}, _a[0 /* member */] = -0, -_a); +var v = (_a = {}, + _a[0 /* member */] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNames8_ES5.js b/tests/baselines/reference/computedPropertyNames8_ES5.js index 4db9ed2ec13..6eceee81adb 100644 --- a/tests/baselines/reference/computedPropertyNames8_ES5.js +++ b/tests/baselines/reference/computedPropertyNames8_ES5.js @@ -12,9 +12,10 @@ function f() { function f() { var t; var u; - var v = (_a = {}, _a[t] = - 0, _a[u] = - 1, - _a); + var v = (_a = {}, + _a[t] = 0, + _a[u] = 1, + _a + ); var _a; } diff --git a/tests/baselines/reference/computedPropertyNames9_ES5.js b/tests/baselines/reference/computedPropertyNames9_ES5.js index a7c4a74d5ec..6c1d7bcb4d0 100644 --- a/tests/baselines/reference/computedPropertyNames9_ES5.js +++ b/tests/baselines/reference/computedPropertyNames9_ES5.js @@ -12,9 +12,10 @@ var v = { //// [computedPropertyNames9_ES5.js] function f(x) { } -var v = (_a = {}, _a[f("")] = -0, _a[f(0)] = -0, _a[f(true)] = -0, -_a); +var v = (_a = {}, + _a[f("")] = 0, + _a[f(0)] = 0, + _a[f(true)] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType10_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType10_ES5.js index 5ea05124674..1f7a3ae123e 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType10_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType10_ES5.js @@ -9,8 +9,9 @@ var o: I = { } //// [computedPropertyNamesContextualType10_ES5.js] -var o = (_a = {}, _a[+"foo"] = -"", _a[+"bar"] = -0, -_a); +var o = (_a = {}, + _a[+"foo"] = "", + _a[+"bar"] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType1_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType1_ES5.js index a7994495411..c4bfde03531 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType1_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType1_ES5.js @@ -10,7 +10,9 @@ var o: I = { } //// [computedPropertyNamesContextualType1_ES5.js] -var o = (_a = {}, _a["" + 0] = function (y) { return y.length; }, _a["" + 1] = -function (y) { return y.length; }, -_a); +var o = (_a = {}, + _a["" + 0] = function (y) { return y.length; }, + _a["" + 1] = function (y) { return y.length; }, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType2_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType2_ES5.js index 0c6b80bbabb..945475f8533 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType2_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType2_ES5.js @@ -10,7 +10,9 @@ var o: I = { } //// [computedPropertyNamesContextualType2_ES5.js] -var o = (_a = {}, _a[+"foo"] = function (y) { return y.length; }, _a[+"bar"] = -function (y) { return y.length; }, -_a); +var o = (_a = {}, + _a[+"foo"] = function (y) { return y.length; }, + _a[+"bar"] = function (y) { return y.length; }, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType3_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType3_ES5.js index 4336808c558..98042f201e3 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType3_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType3_ES5.js @@ -9,7 +9,9 @@ var o: I = { } //// [computedPropertyNamesContextualType3_ES5.js] -var o = (_a = {}, _a[+"foo"] = function (y) { return y.length; }, _a[+"bar"] = -function (y) { return y.length; }, -_a); +var o = (_a = {}, + _a[+"foo"] = function (y) { return y.length; }, + _a[+"bar"] = function (y) { return y.length; }, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType4_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType4_ES5.js index b813da30496..b17f91be38b 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType4_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType4_ES5.js @@ -10,8 +10,9 @@ var o: I = { } //// [computedPropertyNamesContextualType4_ES5.js] -var o = (_a = {}, _a["" + "foo"] = -"", _a["" + "bar"] = -0, -_a); +var o = (_a = {}, + _a["" + "foo"] = "", + _a["" + "bar"] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType5_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType5_ES5.js index f75389de3e9..c7a728e5ef8 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType5_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType5_ES5.js @@ -10,8 +10,9 @@ var o: I = { } //// [computedPropertyNamesContextualType5_ES5.js] -var o = (_a = {}, _a[+"foo"] = -"", _a[+"bar"] = -0, -_a); +var o = (_a = {}, + _a[+"foo"] = "", + _a[+"bar"] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType6_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType6_ES5.js index bc724320d14..c97b7c5b1f8 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType6_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType6_ES5.js @@ -15,13 +15,12 @@ foo({ //// [computedPropertyNamesContextualType6_ES5.js] foo((_a = { - p: "", - 0: function () { } -}, _a.p = -"", _a[0] = -function () { }, _a["hi" + "bye"] = -true, _a[0 + 1] = -0, _a[+"hi"] = -[0], -_a)); + p: "", + 0: function () { } + }, + _a["hi" + "bye"] = true, + _a[0 + 1] = 0, + _a[+"hi"] = [0], + _a +)); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType7_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType7_ES5.js index 8d2386a1d14..9ca7e826aa7 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType7_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType7_ES5.js @@ -15,13 +15,12 @@ foo({ //// [computedPropertyNamesContextualType7_ES5.js] foo((_a = { - p: "", - 0: function () { } -}, _a.p = -"", _a[0] = -function () { }, _a["hi" + "bye"] = -true, _a[0 + 1] = -0, _a[+"hi"] = -[0], -_a)); + p: "", + 0: function () { } + }, + _a["hi" + "bye"] = true, + _a[0 + 1] = 0, + _a[+"hi"] = [0], + _a +)); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType8_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType8_ES5.js index 626f3d1a8e2..419ea906550 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType8_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType8_ES5.js @@ -10,8 +10,9 @@ var o: I = { } //// [computedPropertyNamesContextualType8_ES5.js] -var o = (_a = {}, _a["" + "foo"] = -"", _a["" + "bar"] = -0, -_a); +var o = (_a = {}, + _a["" + "foo"] = "", + _a["" + "bar"] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesContextualType9_ES5.js b/tests/baselines/reference/computedPropertyNamesContextualType9_ES5.js index c28db4ded97..d3beb8b8deb 100644 --- a/tests/baselines/reference/computedPropertyNamesContextualType9_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesContextualType9_ES5.js @@ -10,8 +10,9 @@ var o: I = { } //// [computedPropertyNamesContextualType9_ES5.js] -var o = (_a = {}, _a[+"foo"] = -"", _a[+"bar"] = -0, -_a); +var o = (_a = {}, + _a[+"foo"] = "", + _a[+"bar"] = 0, + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesDeclarationEmit5_ES5.js b/tests/baselines/reference/computedPropertyNamesDeclarationEmit5_ES5.js index a0666f166d4..e77eb79dc70 100644 --- a/tests/baselines/reference/computedPropertyNamesDeclarationEmit5_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesDeclarationEmit5_ES5.js @@ -7,9 +7,21 @@ var v = { } //// [computedPropertyNamesDeclarationEmit5_ES5.js] -var v = (_a = {}, _a["" + ""] = -0, _a["" + ""] = function () { }, _a["" + ""] = Object.defineProperty({ get: function () { return 0; }, enumerable: true, configurable: true }), _a["" + ""] = Object.defineProperty({ set: function (x) { }, enumerable: true, configurable: true }), -_a); +var v = (_a = {}, + _a["" + ""] = 0, + _a["" + ""] = function () { }, + Object.defineProperty(_a, "" + "", { + get: function () { return 0; }, + enumerable: true, + configurable: true + }), + Object.defineProperty(_a, "" + "", { + set: function (x) { }, + enumerable: true, + configurable: true + }), + _a +); var _a; diff --git a/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.js b/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.js index c5af22ef398..39e393c46cc 100644 --- a/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.js +++ b/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.js @@ -6,9 +6,11 @@ var v = { } //// [computedPropertyNamesSourceMap2_ES5.js] -var v = (_a = {}, _a["hello"] = function () { - debugger; -}, -_a); +var v = (_a = {}, + _a["hello"] = function () { + debugger; + }, + _a +); var _a; //# sourceMappingURL=computedPropertyNamesSourceMap2_ES5.js.map \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.js.map b/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.js.map index 82a729df957..2d9d4ea3088 100644 --- a/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.js.map +++ b/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.js.map @@ -1,2 +1,2 @@ //// [computedPropertyNamesSourceMap2_ES5.js.map] -{"version":3,"file":"computedPropertyNamesSourceMap2_ES5.js","sourceRoot":"","sources":["computedPropertyNamesSourceMap2_ES5.ts"],"names":[],"mappings":"AAAA,IAAI,CAAC,GAAG,AADA,CACA,EAAA,GADA,EAAA,EACA,EAAA,CACK,OAAO,CAFA,GAAA;IAGA,QAAQ,CAAC;AACb,CAAC,AAJA;AACA,EAAA,AADA,CAKA,CAAA;IAJD,EAAA"} \ No newline at end of file +{"version":3,"file":"computedPropertyNamesSourceMap2_ES5.js","sourceRoot":"","sources":["computedPropertyNamesSourceMap2_ES5.ts"],"names":["[\"hello\"]"],"mappings":"AAAA,IAAI,CAAC,GAAG,CAAR,EAAA;IACI,AADJ,EAAA,CACK,OAAO,CAAC;QACLA,QAAQA,CAACA;IACbA,CAACA;IAHL,EAAA;CAIC,CAAA;IAJD,EAAA"} \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.sourcemap.txt b/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.sourcemap.txt index 33a3a2b4c2c..4c49c91499b 100644 --- a/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.sourcemap.txt +++ b/tests/baselines/reference/computedPropertyNamesSourceMap2_ES5.sourcemap.txt @@ -8,153 +8,100 @@ sources: computedPropertyNamesSourceMap2_ES5.ts emittedFile:tests/cases/conformance/es6/computedProperties/computedPropertyNamesSourceMap2_ES5.js sourceFile:computedPropertyNamesSourceMap2_ES5.ts ------------------------------------------------------------------- ->>>var v = (_a = {}, _a["hello"] = function () { +>>>var v = (_a = {}, 1 > 2 >^^^^ 3 > ^ 4 > ^^^ -5 > -6 > ^ -7 > ^^ -8 > ^^^ -9 > ^^ -10> ^^ -11> ^^ -12> ^ -13> ^^^^^^^ -14> ^ -15> ^^^ +5 > ^ +6 > ^^ +7 > ^^^^^^^^^^^^^^^^^^^^^-> 1 > 2 >var 3 > v 4 > = -5 > !!^^ !!^^ There was decoding error in the sourcemap at this location: Invalid sourceLine found -5 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 9) Source(0, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 9) Source(0, NaN) + SourceIndex(0) nameIndex (-1) 5 > -6 > !!^^ !!^^ There was decoding error in the sourcemap at this location: Unsupported Error Format: No entries after emitted column -6 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 9) Source(0, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 10) Source(1, 1) + SourceIndex(0) nameIndex (-1) -6 > -7 > !!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -7 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 10) Source(1, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 12) Source(1, 1) + SourceIndex(0) nameIndex (-1) -7 > -8 > !!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -8 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 12) Source(1, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 15) Source(0, NaN) + SourceIndex(0) nameIndex (-1) -8 > -9 > !!^^ !!^^ There was decoding error in the sourcemap at this location: Invalid sourceLine found -9 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 15) Source(0, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 17) Source(0, NaN) + SourceIndex(0) nameIndex (-1) -9 > -10> !!^^ !!^^ There was decoding error in the sourcemap at this location: Unsupported Error Format: No entries after emitted column -10> !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 15) Source(0, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 19) Source(1, 1) + SourceIndex(0) nameIndex (-1) -10> -11> !!^^ !!^^ There was decoding error in the sourcemap at this location: Invalid sourceLine found -11> !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 17) Source(0, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 21) Source(1, 1) + SourceIndex(0) nameIndex (-1) -11> -12> !!^^ !!^^ There was decoding error in the sourcemap at this location: Unsupported Error Format: No entries after emitted column -12> !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 17) Source(0, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 22) Source(2, 6) + SourceIndex(0) nameIndex (-1) -12> var v = { - > [ -13> !!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -13> !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 19) Source(1, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 29) Source(2, 13) + SourceIndex(0) nameIndex (-1) -13> "hello" -14> !!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -14> !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 21) Source(1, 9) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 30) Source(0, NaN) + SourceIndex(0) nameIndex (-1) -14> -15> !!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -15> !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 22) Source(2, 14) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(1, 33) Source(0, NaN) + SourceIndex(0) nameIndex (-1) -15> +6 > 1 >Emitted(1, 1) Source(1, 1) + SourceIndex(0) 2 >Emitted(1, 5) Source(1, 5) + SourceIndex(0) 3 >Emitted(1, 6) Source(1, 6) + SourceIndex(0) 4 >Emitted(1, 9) Source(1, 9) + SourceIndex(0) -5 >Emitted(1, 9) Source(0, NaN) + SourceIndex(0) -6 >Emitted(1, 10) Source(1, 1) + SourceIndex(0) -7 >Emitted(1, 12) Source(1, 1) + SourceIndex(0) -8 >Emitted(1, 15) Source(0, NaN) + SourceIndex(0) -9 >Emitted(1, 17) Source(0, NaN) + SourceIndex(0) -10>Emitted(1, 19) Source(1, 1) + SourceIndex(0) -11>Emitted(1, 21) Source(1, 1) + SourceIndex(0) -12>Emitted(1, 22) Source(2, 6) + SourceIndex(0) -13>Emitted(1, 29) Source(2, 13) + SourceIndex(0) -14>Emitted(1, 30) Source(0, NaN) + SourceIndex(0) -15>Emitted(1, 33) Source(0, NaN) + SourceIndex(0) +5 >Emitted(1, 10) Source(1, 1) + SourceIndex(0) +6 >Emitted(1, 12) Source(1, 1) + SourceIndex(0) --- ->>> debugger; +>>> _a["hello"] = function () { +1->^^^^ +2 > +3 > ^^ +4 > ^ +5 > ^^^^^^^ +6 > ^ +7 > ^^^-> +1->var v = { + > +2 > +3 > +4 > var v = { + > [ +5 > "hello" +6 > ] +1->Emitted(2, 5) Source(2, 5) + SourceIndex(0) +2 >Emitted(2, 5) Source(1, 1) + SourceIndex(0) +3 >Emitted(2, 7) Source(1, 1) + SourceIndex(0) +4 >Emitted(2, 8) Source(2, 6) + SourceIndex(0) +5 >Emitted(2, 15) Source(2, 13) + SourceIndex(0) +6 >Emitted(2, 16) Source(2, 14) + SourceIndex(0) +--- +>>> debugger; +1->^^^^^^^^ +2 > ^^^^^^^^ +3 > ^ +1->() { + > +2 > debugger +3 > ; +1->Emitted(3, 9) Source(3, 9) + SourceIndex(0) name (["hello"]) +2 >Emitted(3, 17) Source(3, 17) + SourceIndex(0) name (["hello"]) +3 >Emitted(3, 18) Source(3, 18) + SourceIndex(0) name (["hello"]) +--- +>>> }, 1 >^^^^ -2 > ^^^^^^^^ -3 > ^ -1 >!!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -1 >!!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 29) Source(2, 21) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(2, 5) Source(3, 9) + SourceIndex(0) nameIndex (-1) -1 > -2 > !!^^ !!^^ There was decoding error in the sourcemap at this location: Invalid sourceLine found -2 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 30) Source(0, 21) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(2, 13) Source(3, 17) + SourceIndex(0) nameIndex (-1) -2 > debugger -3 > !!^^ !!^^ There was decoding error in the sourcemap at this location: Unsupported Error Format: No entries after emitted column -3 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 30) Source(0, 21) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(2, 14) Source(3, 18) + SourceIndex(0) nameIndex (-1) -3 > ; -1 >Emitted(2, 5) Source(3, 9) + SourceIndex(0) -2 >Emitted(2, 13) Source(3, 17) + SourceIndex(0) -3 >Emitted(2, 14) Source(3, 18) + SourceIndex(0) ---- ->>>}, -1 > -2 >^ -3 > -4 > ^^^^-> -1 >!!^^ !!^^ There was decoding error in the sourcemap at this location: Invalid sourceLine found -1 >!!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 33) Source(0, 21) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(3, 1) Source(4, 5) + SourceIndex(0) nameIndex (-1) +2 > ^ +3 > ^^-> 1 > > -2 >!!^^ !!^^ There was decoding error in the sourcemap at this location: Unsupported Error Format: No entries after emitted column -2 >!!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(1, 33) Source(0, 21) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(3, 2) Source(4, 6) + SourceIndex(0) nameIndex (-1) -2 >} -3 > !!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -3 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(2, 5) Source(3, 21) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(3, 2) Source(0, NaN) + SourceIndex(0) nameIndex (-1) -3 > -1 >Emitted(3, 1) Source(4, 5) + SourceIndex(0) -2 >Emitted(3, 2) Source(4, 6) + SourceIndex(0) -3 >Emitted(3, 2) Source(0, NaN) + SourceIndex(0) +2 > } +1 >Emitted(4, 5) Source(4, 5) + SourceIndex(0) name (["hello"]) +2 >Emitted(4, 6) Source(4, 6) + SourceIndex(0) name (["hello"]) --- ->>>_a); +>>> _a +1->^^^^ +2 > ^^ 1-> -2 >^^ -3 > -4 > ^ -5 > ^ -6 > ^^^^-> -1->!!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -1->!!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(2, 13) Source(3, 29) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(4, 1) Source(1, 1) + SourceIndex(0) nameIndex (-1) -1-> -2 >!!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -2 >!!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(2, 14) Source(3, 30) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(4, 3) Source(1, 1) + SourceIndex(0) nameIndex (-1) -2 > -3 > !!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -3 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(3, 1) Source(4, 17) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(4, 3) Source(0, NaN) + SourceIndex(0) nameIndex (-1) -3 > -4 > !!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -4 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(3, 2) Source(4, 18) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(4, 4) Source(5, 2) + SourceIndex(0) nameIndex (-1) -4 > -5 > !!^^ !!^^ There was decoding error in the sourcemap at this location: Invalid sourceLine found -5 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(3, 2) Source(0, 18) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(4, 5) Source(5, 2) + SourceIndex(0) nameIndex (-1) -5 > -1->Emitted(4, 1) Source(1, 1) + SourceIndex(0) -2 >Emitted(4, 3) Source(1, 1) + SourceIndex(0) -3 >Emitted(4, 3) Source(0, NaN) + SourceIndex(0) -4 >Emitted(4, 4) Source(5, 2) + SourceIndex(0) -5 >Emitted(4, 5) Source(5, 2) + SourceIndex(0) +2 > +1->Emitted(5, 5) Source(1, 1) + SourceIndex(0) +2 >Emitted(5, 7) Source(1, 1) + SourceIndex(0) +--- +>>>); +1 >^ +2 > ^ +3 > ^^^^^^-> +1 >var v = { + > ["hello"]() { + > debugger; + > } + >} +2 > +1 >Emitted(6, 2) Source(5, 2) + SourceIndex(0) +2 >Emitted(6, 3) Source(5, 2) + SourceIndex(0) --- >>>var _a; 1->^^^^ 2 > ^^ 3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-> -1->!!^^ !!^^ There was decoding error in the sourcemap at this location: Unsupported Error Format: No entries after emitted column -1->!!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(3, 2) Source(0, 18) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(5, 5) Source(1, 1) + SourceIndex(0) nameIndex (-1) 1-> -2 > !!^^ !!^^ The decoded span from sourcemap's mapping entry does not match what was encoded for this span: -2 > !!^^ !!^^ Decoded span from sourcemap's mappings entry: Emitted(4, 1) Source(1, 18) + SourceIndex(0) nameIndex (-1) Span encoded by the emitter:Emitted(5, 7) Source(1, 1) + SourceIndex(0) nameIndex (-1) 2 > -1->Emitted(5, 5) Source(1, 1) + SourceIndex(0) -2 >Emitted(5, 7) Source(1, 1) + SourceIndex(0) +1->Emitted(7, 5) Source(1, 1) + SourceIndex(0) +2 >Emitted(7, 7) Source(1, 1) + SourceIndex(0) --- -!!!! **** There are more source map entries in the sourceMap's mapping than what was encoded -!!!! **** Remaining decoded string: ,EAAA,AADA,CAKA,CAAA;IAJD,EAAA >>>//# sourceMappingURL=computedPropertyNamesSourceMap2_ES5.js.map \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName2.js b/tests/baselines/reference/parserES5ComputedPropertyName2.js index 2b39e305e07..4569c00d7b3 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName2.js +++ b/tests/baselines/reference/parserES5ComputedPropertyName2.js @@ -2,7 +2,5 @@ var v = { [e]: 1 }; //// [parserES5ComputedPropertyName2.js] -var v = (_a = {}, _a[e] = -1, -_a); +var v = (_a = {}, _a[e] = 1, _a); var _a; diff --git a/tests/baselines/reference/parserES5ComputedPropertyName3.js b/tests/baselines/reference/parserES5ComputedPropertyName3.js index 3247b0251f1..1fdb5ced65d 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName3.js +++ b/tests/baselines/reference/parserES5ComputedPropertyName3.js @@ -2,6 +2,5 @@ var v = { [e]() { } }; //// [parserES5ComputedPropertyName3.js] -var v = (_a = {}, _a[e] = function () { }, -_a); +var v = (_a = {}, _a[e] = function () { }, _a); var _a; diff --git a/tests/baselines/reference/parserES5ComputedPropertyName4.js b/tests/baselines/reference/parserES5ComputedPropertyName4.js index 436f967e8de..499e9a426d9 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName4.js +++ b/tests/baselines/reference/parserES5ComputedPropertyName4.js @@ -2,6 +2,9 @@ var v = { get [e]() { } }; //// [parserES5ComputedPropertyName4.js] -var v = (_a = {}, _a[e] = Object.defineProperty({ get: function () { }, enumerable: true, configurable: true }), -_a); +var v = (_a = {}, Object.defineProperty(_a, e, { + get: function () { }, + enumerable: true, + configurable: true +}), _a); var _a; diff --git a/tests/baselines/reference/privateIndexer2.js b/tests/baselines/reference/privateIndexer2.js index 5a36a9eae18..1268c6e4c25 100644 --- a/tests/baselines/reference/privateIndexer2.js +++ b/tests/baselines/reference/privateIndexer2.js @@ -11,9 +11,10 @@ var y: { //// [privateIndexer2.js] // private indexers not allowed -var x = (_a = {}, _a[x] = -string, _a.string = -, -_a); +var x = (_a = {}, + _a[x] = string, + _a.string = , + _a +); var y; var _a; From 0af4b8a2c281a6975ca961e9ba588663138755d4 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 23 Feb 2015 17:50:37 -0800 Subject: [PATCH 02/35] Removed tree rewriting code --- src/compiler/emitter.ts | 243 ---------------------------------------- 1 file changed, 243 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 78a4ea54b69..addb7234a97 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2744,249 +2744,6 @@ module ts { emitObjectLiteralBody(node, properties.length); } - function createSynthesizedNode(kind: SyntaxKind): Node { - var node = createNode(kind); - node.pos = -1; - node.end = -1; - - return node; - } - - function emitDownlevelObjectLiteralWithComputedPropertiesThroughRewrite(node: ObjectLiteralExpression, firstComputedPropertyIndex: number): void { - var parenthesizedObjectLiteral = createDownlevelObjectLiteralWithComputedProperties(node, firstComputedPropertyIndex); - return emit(parenthesizedObjectLiteral); - } - - function createDownlevelObjectLiteralWithComputedProperties(originalObjectLiteral: ObjectLiteralExpression, firstComputedPropertyIndex: number): ParenthesizedExpression { - // For computed properties, we need to create a unique handle to the object - // literal so we can modify it without risking internal assignments tainting the object. - var tempVar = createAndRecordTempVariable(originalObjectLiteral); - - // Hold onto the initial non-computed properties in a new object literal, - // then create the rest through property accesses on the temp variable. - var initialObjectLiteral = createSynthesizedNode(SyntaxKind.ObjectLiteralExpression); - initialObjectLiteral.properties = >originalObjectLiteral.properties.slice(0, firstComputedPropertyIndex); - initialObjectLiteral.flags |= NodeFlags.MultiLine; - - // The comma expressions that will patch the object literal. - // This will end up being something like '_a = { ... }, _a.x = 10, _a.y = 20, _a'. - var propertyPatches = createBinaryExpression(tempVar, SyntaxKind.EqualsToken, initialObjectLiteral); - - ts.forEach(originalObjectLiteral.properties, property => { - var patchedProperty = tryCreatePatchingPropertyAssignment(originalObjectLiteral, tempVar, property); - if (patchedProperty) { - // TODO(drosen): Preserve comments - //var leadingComments = getLeadingCommentRanges(currentSourceFile.text, property.pos); - //var trailingComments = getTrailingCommentRanges(currentSourceFile.text, property.end); - //addCommentsToSynthesizedNode(patchedProperty, leadingComments, trailingComments); - - propertyPatches = createBinaryExpression(propertyPatches, SyntaxKind.CommaToken, patchedProperty); - } - }); - - // Finally, return the temp variable. - propertyPatches = createBinaryExpression(propertyPatches, SyntaxKind.CommaToken, tempVar); - - var result = createParenthesizedExpression(propertyPatches); - - // TODO(drosen): Preserve comments - // var leadingComments = getLeadingCommentRanges(currentSourceFile.text, originalObjectLiteral.pos); - // var trailingComments = getTrailingCommentRanges(currentSourceFile.text, originalObjectLiteral.end); - //addCommentsToSynthesizedNode(result, leadingComments, trailingComments); - - return result; - } - - function addCommentsToSynthesizedNode(node: SynthesizedNode, leadingCommentRanges: CommentRange[], trailingCommentRanges: CommentRange[]): void { - node.leadingCommentRanges = leadingCommentRanges; - node.trailingCommentRanges = trailingCommentRanges; - } - - // Returns 'undefined' if a property has already been accounted for - // (e.g. a 'get' accessor which has already been emitted along with its 'set' accessor). - function tryCreatePatchingPropertyAssignment(objectLiteral: ObjectLiteralExpression, tempVar: Identifier, property: ObjectLiteralElement): Expression { - var leftHandSide = createMemberAccessForPropertyName(tempVar, property.name); - var maybeRightHandSide = tryGetRightHandSideOfPatchingPropertyAssignment(objectLiteral, property); - - return maybeRightHandSide && createBinaryExpression(leftHandSide, SyntaxKind.EqualsToken, maybeRightHandSide); - } - - function tryGetRightHandSideOfPatchingPropertyAssignment(objectLiteral: ObjectLiteralExpression, property: ObjectLiteralElement) { - switch (property.kind) { - case SyntaxKind.PropertyAssignment: - return (property).initializer; - - case SyntaxKind.ShorthandPropertyAssignment: - // TODO: (andersh) Technically it isn't correct to make an identifier here since getExpressionNamePrefix returns - // a string containing a dotted name. In general I'm not a fan of mini tree rewriters as this one, elsewhere we - // manage by just emitting strings (which is a lot more performant). - //var prefix = createIdentifier(resolver.getExpressionNamePrefix((property).name)); - //return createPropertyAccessExpression(prefix, (property).name); - return createIdentifier(resolver.getExpressionNameSubstitution((property).name)); - - case SyntaxKind.MethodDeclaration: - return createFunctionExpression((property).parameters, (property).body); - - case SyntaxKind.GetAccessor: - case SyntaxKind.SetAccessor: - var { firstAccessor, getAccessor, setAccessor } = getAllAccessorDeclarations(objectLiteral.properties, property); - - // Only emit the first accessor. - if (firstAccessor !== property) { - return undefined; - } - - var propertyDescriptor = createSynthesizedNode(SyntaxKind.ObjectLiteralExpression); - - var descriptorProperties = >[]; - if (getAccessor) { - var getProperty = createPropertyAssignment(createIdentifier("get"), createFunctionExpression(getAccessor.parameters, getAccessor.body)); - descriptorProperties.push(getProperty); - } - if (setAccessor) { - var setProperty = createPropertyAssignment(createIdentifier("set"), createFunctionExpression(setAccessor.parameters, setAccessor.body)); - descriptorProperties.push(setProperty); - } - - var trueExpr = createSynthesizedNode(SyntaxKind.TrueKeyword); - - var enumerableTrue = createPropertyAssignment(createIdentifier("enumerable"), trueExpr); - descriptorProperties.push(enumerableTrue); - - var configurableTrue = createPropertyAssignment(createIdentifier("configurable"), trueExpr); - descriptorProperties.push(configurableTrue); - - propertyDescriptor.properties = descriptorProperties; - - var objectDotDefineProperty = createPropertyAccessExpression(createIdentifier("Object"), createIdentifier("defineProperty")); - return createCallExpression(objectDotDefineProperty, createNodeArray(propertyDescriptor)); - - default: - Debug.fail(`ObjectLiteralElement kind ${property.kind} not accounted for.`); - } - } - - function createParenthesizedExpression(expression: Expression) { - var result = createSynthesizedNode(SyntaxKind.ParenthesizedExpression); - result.expression = expression; - - return result; - } - - function createNodeArray(...elements: T[]): NodeArray { - var result = >elements; - result.pos = -1; - result.end = -1; - - return result; - } - - function createBinaryExpression(left: Expression, operator: SyntaxKind, right: Expression): BinaryExpression { - var result = createSynthesizedNode(SyntaxKind.BinaryExpression); - result.operatorToken = createSynthesizedNode(operator); - result.left = left; - result.right = right; - - return result; - } - - function createMemberAccessForPropertyName(expression: LeftHandSideExpression, memberName: DeclarationName): PropertyAccessExpression | ElementAccessExpression { - if (memberName.kind === SyntaxKind.Identifier) { - return createPropertyAccessExpression(expression, memberName); - } - else if (memberName.kind === SyntaxKind.StringLiteral || memberName.kind === SyntaxKind.NumericLiteral) { - return createElementAccessExpression(expression, memberName); - } - else if (memberName.kind === SyntaxKind.ComputedPropertyName) { - return createElementAccessExpression(expression, (memberName).expression); - } - else { - Debug.fail(`Kind '${memberName.kind}' not accounted for.`); - } - } - - function createPropertyAssignment(name: LiteralExpression | Identifier, initializer: Expression) { - var result = createSynthesizedNode(SyntaxKind.PropertyAssignment); - result.name = name; - result.initializer = initializer; - - return result; - } - - function createFunctionExpression(parameters: NodeArray, body: Block): FunctionExpression { - var result = createSynthesizedNode(SyntaxKind.FunctionExpression); - result.parameters = parameters; - result.body = body; - - return result; - } - - function createPropertyAccessExpression(expression: LeftHandSideExpression, name: Identifier): PropertyAccessExpression { - var result = createSynthesizedNode(SyntaxKind.PropertyAccessExpression); - result.expression = expression; - result.name = name; - - return result; - } - - function createElementAccessExpression(expression: LeftHandSideExpression, argumentExpression: Expression): ElementAccessExpression { - var result = createSynthesizedNode(SyntaxKind.ElementAccessExpression); - result.expression = expression; - result.argumentExpression = argumentExpression; - - return result; - } - - function createIdentifier(name: string) { - var result = createSynthesizedNode(SyntaxKind.Identifier); - result.text = name; - - return result; - } - - function createCallExpression(invokedExpression: MemberExpression, arguments: NodeArray) { - var result = createSynthesizedNode(SyntaxKind.CallExpression); - result.expression = invokedExpression; - result.arguments = arguments; - - return result; - } - - function emitObjectLiteralThroughRewrite(node: ObjectLiteralExpression): void { - var properties = node.properties; - - if (languageVersion < ScriptTarget.ES6) { - var numProperties = properties.length; - - // Find the first computed property. - // Everything until that point can be emitted as part of the initial object literal. - var numInitialNonComputedProperties = numProperties; - for (var i = 0, n = properties.length; i < n; i++) { - if (properties[i].name.kind === SyntaxKind.ComputedPropertyName) { - numInitialNonComputedProperties = i; - break; - } - } - - var hasComputedProperty = numInitialNonComputedProperties !== properties.length; - if (hasComputedProperty) { - emitDownlevelObjectLiteralWithComputedPropertiesThroughRewrite(node, numInitialNonComputedProperties); - return; - } - } - - // Ordinary case: either the object has no computed properties - // or we're compiling with an ES6+ target. - write("{"); - - var properties = node.properties; - if (properties.length) { - emitLinePreservingList(node, properties, /*allowTrailingComma:*/ languageVersion >= ScriptTarget.ES5, /*spacesBetweenBraces:*/ true) - } - - write("}"); - } - function emitComputedPropertyName(node: ComputedPropertyName) { write("["); emit(node.expression); From abe4076417a9232377498a6e113b70ac7c9d2105 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 23 Mar 2015 17:29:01 -0700 Subject: [PATCH 03/35] Change error message to be more general --- src/compiler/checker.ts | 4 ++-- src/compiler/diagnosticInformationMap.generated.ts | 4 ++-- src/compiler/diagnosticMessages.json | 4 ++-- tests/baselines/reference/for-of14.errors.txt | 4 ++-- tests/baselines/reference/for-of16.errors.txt | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6fdaac79cea..867c9dbabaa 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9320,7 +9320,7 @@ module ts { let iteratorFunctionSignatures = iteratorFunction ? getSignaturesOfType(iteratorFunction, SignatureKind.Call) : emptyArray; if (iteratorFunctionSignatures.length === 0) { if (expressionForError) { - error(expressionForError, Diagnostics.The_right_hand_side_of_a_for_of_statement_must_have_a_Symbol_iterator_method_that_returns_an_iterator); + error(expressionForError, Diagnostics.Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator); } return undefined; } @@ -9338,7 +9338,7 @@ module ts { let iteratorNextFunctionSignatures = iteratorNextFunction ? getSignaturesOfType(iteratorNextFunction, SignatureKind.Call) : emptyArray; if (iteratorNextFunctionSignatures.length === 0) { if (expressionForError) { - error(expressionForError, Diagnostics.The_iterator_returned_by_the_right_hand_side_of_a_for_of_statement_must_have_a_next_method); + error(expressionForError, Diagnostics.An_iterator_must_have_a_next_method); } return undefined; } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 967afd171ba..d19a5a28357 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -340,8 +340,8 @@ module ts { The_left_hand_side_of_a_for_of_statement_cannot_be_a_previously_defined_constant: { code: 2485, category: DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot be a previously defined constant." }, The_left_hand_side_of_a_for_in_statement_cannot_be_a_previously_defined_constant: { code: 2486, category: DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot be a previously defined constant." }, Invalid_left_hand_side_in_for_of_statement: { code: 2487, category: DiagnosticCategory.Error, key: "Invalid left-hand side in 'for...of' statement." }, - The_right_hand_side_of_a_for_of_statement_must_have_a_Symbol_iterator_method_that_returns_an_iterator: { code: 2488, category: DiagnosticCategory.Error, key: "The right-hand side of a 'for...of' statement must have a '[Symbol.iterator]()' method that returns an iterator." }, - The_iterator_returned_by_the_right_hand_side_of_a_for_of_statement_must_have_a_next_method: { code: 2489, category: DiagnosticCategory.Error, key: "The iterator returned by the right-hand side of a 'for...of' statement must have a 'next()' method." }, + Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator: { code: 2488, category: DiagnosticCategory.Error, key: "Type must have a '[Symbol.iterator]()' method that returns an iterator." }, + An_iterator_must_have_a_next_method: { code: 2489, category: DiagnosticCategory.Error, key: "An iterator must have a 'next()' method." }, The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property: { code: 2490, category: DiagnosticCategory.Error, key: "The type returned by the 'next()' method of an iterator must have a 'value' property." }, The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern: { code: 2491, category: DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot be a destructuring pattern." }, Cannot_redeclare_identifier_0_in_catch_clause: { code: 2492, category: DiagnosticCategory.Error, key: "Cannot redeclare identifier '{0}' in catch clause" }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 6e24afad80c..a54e358be5a 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1352,11 +1352,11 @@ "category": "Error", "code": 2487 }, - "The right-hand side of a 'for...of' statement must have a '[Symbol.iterator]()' method that returns an iterator.": { + "Type must have a '[Symbol.iterator]()' method that returns an iterator.": { "category": "Error", "code": 2488 }, - "The iterator returned by the right-hand side of a 'for...of' statement must have a 'next()' method.": { + "An iterator must have a 'next()' method.": { "category": "Error", "code": 2489 }, diff --git a/tests/baselines/reference/for-of14.errors.txt b/tests/baselines/reference/for-of14.errors.txt index 5e8223381c7..ab95d042689 100644 --- a/tests/baselines/reference/for-of14.errors.txt +++ b/tests/baselines/reference/for-of14.errors.txt @@ -1,11 +1,11 @@ -tests/cases/conformance/es6/for-ofStatements/for-of14.ts(2,11): error TS2488: The right-hand side of a 'for...of' statement must have a '[Symbol.iterator]()' method that returns an iterator. +tests/cases/conformance/es6/for-ofStatements/for-of14.ts(2,11): error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. ==== tests/cases/conformance/es6/for-ofStatements/for-of14.ts (1 errors) ==== var v: string; for (v of new StringIterator) { } // Should fail because the iterator is not iterable ~~~~~~~~~~~~~~~~~~ -!!! error TS2488: The right-hand side of a 'for...of' statement must have a '[Symbol.iterator]()' method that returns an iterator. +!!! error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. class StringIterator { next() { diff --git a/tests/baselines/reference/for-of16.errors.txt b/tests/baselines/reference/for-of16.errors.txt index e3ecca1a256..20e3e876537 100644 --- a/tests/baselines/reference/for-of16.errors.txt +++ b/tests/baselines/reference/for-of16.errors.txt @@ -1,11 +1,11 @@ -tests/cases/conformance/es6/for-ofStatements/for-of16.ts(2,11): error TS2489: The iterator returned by the right-hand side of a 'for...of' statement must have a 'next()' method. +tests/cases/conformance/es6/for-ofStatements/for-of16.ts(2,11): error TS2489: An iterator must have a 'next()' method. ==== tests/cases/conformance/es6/for-ofStatements/for-of16.ts (1 errors) ==== var v: string; for (v of new StringIterator) { } // Should fail ~~~~~~~~~~~~~~~~~~ -!!! error TS2489: The iterator returned by the right-hand side of a 'for...of' statement must have a 'next()' method. +!!! error TS2489: An iterator must have a 'next()' method. class StringIterator { [Symbol.iterator]() { From 3497e27d561214174b9b686b36dae71b44cabad9 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 23 Mar 2015 18:22:43 -0700 Subject: [PATCH 04/35] Add spread to typeWriter --- src/harness/typeWriter.ts | 1 + .../reference/arrayLiteralSpread.types | 22 +++++++++++++++++++ .../reference/callWithSpreadES6.types | 13 +++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/harness/typeWriter.ts b/src/harness/typeWriter.ts index 54cdc27e3b3..e645c8b765c 100644 --- a/src/harness/typeWriter.ts +++ b/src/harness/typeWriter.ts @@ -53,6 +53,7 @@ class TypeWriterWalker { case ts.SyntaxKind.PostfixUnaryExpression: case ts.SyntaxKind.BinaryExpression: case ts.SyntaxKind.ConditionalExpression: + case ts.SyntaxKind.SpreadElementExpression: this.log(node, this.getTypeOfNode(node)); break; diff --git a/tests/baselines/reference/arrayLiteralSpread.types b/tests/baselines/reference/arrayLiteralSpread.types index 0dae59521bf..3122c0628af 100644 --- a/tests/baselines/reference/arrayLiteralSpread.types +++ b/tests/baselines/reference/arrayLiteralSpread.types @@ -9,44 +9,55 @@ function f0() { var a1 = [...a]; >a1 : number[] >[...a] : number[] +>...a : number[] >a : number[] var a2 = [1, ...a]; >a2 : number[] >[1, ...a] : number[] +>...a : number[] >a : number[] var a3 = [1, 2, ...a]; >a3 : number[] >[1, 2, ...a] : number[] +>...a : number[] >a : number[] var a4 = [...a, 1]; >a4 : number[] >[...a, 1] : number[] +>...a : number[] >a : number[] var a5 = [...a, 1, 2]; >a5 : number[] >[...a, 1, 2] : number[] +>...a : number[] >a : number[] var a6 = [1, 2, ...a, 1, 2]; >a6 : number[] >[1, 2, ...a, 1, 2] : number[] +>...a : number[] >a : number[] var a7 = [1, ...a, 2, ...a]; >a7 : number[] >[1, ...a, 2, ...a] : number[] +>...a : number[] >a : number[] +>...a : number[] >a : number[] var a8 = [...a, ...a, ...a]; >a8 : number[] >[...a, ...a, ...a] : number[] +>...a : number[] >a : number[] +>...a : number[] >a : number[] +>...a : number[] >a : number[] } @@ -60,6 +71,7 @@ function f1() { var b = ["hello", ...a, true]; >b : (string | number | boolean)[] >["hello", ...a, true] : (string | number | boolean)[] +>...a : number[] >a : number[] var b: (string | number | boolean)[]; @@ -72,19 +84,29 @@ function f2() { var a = [...[...[...[...[...[]]]]]]; >a : any[] >[...[...[...[...[...[]]]]]] : undefined[] +>...[...[...[...[...[]]]]] : undefined[] >[...[...[...[...[]]]]] : undefined[] +>...[...[...[...[]]]] : undefined[] >[...[...[...[]]]] : undefined[] +>...[...[...[]]] : undefined[] >[...[...[]]] : undefined[] +>...[...[]] : undefined[] >[...[]] : undefined[] +>...[] : undefined[] >[] : undefined[] var b = [...[...[...[...[...[5]]]]]]; >b : number[] >[...[...[...[...[...[5]]]]]] : number[] +>...[...[...[...[...[5]]]]] : number[] >[...[...[...[...[5]]]]] : number[] +>...[...[...[...[5]]]] : number[] >[...[...[...[5]]]] : number[] +>...[...[...[5]]] : number[] >[...[...[5]]] : number[] +>...[...[5]] : number[] >[...[5]] : number[] +>...[5] : number[] >[5] : number[] } diff --git a/tests/baselines/reference/callWithSpreadES6.types b/tests/baselines/reference/callWithSpreadES6.types index 8a75d21e4ef..1711926d773 100644 --- a/tests/baselines/reference/callWithSpreadES6.types +++ b/tests/baselines/reference/callWithSpreadES6.types @@ -38,11 +38,13 @@ foo(1, 2, "abc"); foo(1, 2, ...a); >foo(1, 2, ...a) : void >foo : (x: number, y: number, ...z: string[]) => void +>...a : string[] >a : string[] foo(1, 2, ...a, "abc"); >foo(1, 2, ...a, "abc") : void >foo : (x: number, y: number, ...z: string[]) => void +>...a : string[] >a : string[] obj.foo(1, 2, "abc"); @@ -56,6 +58,7 @@ obj.foo(1, 2, ...a); >obj.foo : (x: number, y: number, ...z: string[]) => any >obj : X >foo : (x: number, y: number, ...z: string[]) => any +>...a : string[] >a : string[] obj.foo(1, 2, ...a, "abc"); @@ -63,6 +66,7 @@ obj.foo(1, 2, ...a, "abc"); >obj.foo : (x: number, y: number, ...z: string[]) => any >obj : X >foo : (x: number, y: number, ...z: string[]) => any +>...a : string[] >a : string[] (obj.foo)(1, 2, "abc"); @@ -78,6 +82,7 @@ obj.foo(1, 2, ...a, "abc"); >obj.foo : (x: number, y: number, ...z: string[]) => any >obj : X >foo : (x: number, y: number, ...z: string[]) => any +>...a : string[] >a : string[] (obj.foo)(1, 2, ...a, "abc"); @@ -86,6 +91,7 @@ obj.foo(1, 2, ...a, "abc"); >obj.foo : (x: number, y: number, ...z: string[]) => any >obj : X >foo : (x: number, y: number, ...z: string[]) => any +>...a : string[] >a : string[] xa[1].foo(1, 2, "abc"); @@ -101,6 +107,7 @@ xa[1].foo(1, 2, ...a); >xa[1] : X >xa : X[] >foo : (x: number, y: number, ...z: string[]) => any +>...a : string[] >a : string[] xa[1].foo(1, 2, ...a, "abc"); @@ -109,6 +116,7 @@ xa[1].foo(1, 2, ...a, "abc"); >xa[1] : X >xa : X[] >foo : (x: number, y: number, ...z: string[]) => any +>...a : string[] >a : string[] (xa[1].foo)(...[1, 2, "abc"]); @@ -120,6 +128,7 @@ xa[1].foo(1, 2, ...a, "abc"); >xa[1] : X >xa : X[] >foo : (x: number, y: number, ...z: string[]) => any +>...[1, 2, "abc"] : (string | number)[] >[1, 2, "abc"] : (string | number)[] class C { @@ -145,6 +154,7 @@ class C { >foo : (x: number, y: number, ...z: string[]) => void >x : number >y : number +>...z : string[] >z : string[] } foo(x: number, y: number, ...z: string[]) { @@ -167,6 +177,7 @@ class D extends C { super(1, 2, ...a); >super(1, 2, ...a) : void >super : typeof C +>...a : string[] >a : string[] } foo() { @@ -183,6 +194,7 @@ class D extends C { >super.foo : (x: number, y: number, ...z: string[]) => void >super : C >foo : (x: number, y: number, ...z: string[]) => void +>...a : string[] >a : string[] } } @@ -192,5 +204,6 @@ var c = new C(1, 2, ...a); >c : C >new C(1, 2, ...a) : C >C : typeof C +>...a : string[] >a : string[] From b7f2990305d72c2084ad3b6ee67f3b9da878e636 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 23 Mar 2015 19:30:03 -0700 Subject: [PATCH 05/35] Refactor checkSpreadElementExpression to get the element type internally --- src/compiler/checker.ts | 45 +++++++++---------- .../reference/arrayLiteralSpread.types | 44 +++++++++--------- .../reference/callWithSpreadES6.types | 26 +++++------ 3 files changed, 55 insertions(+), 60 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 867c9dbabaa..f095c8574c5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5911,12 +5911,17 @@ module ts { } function checkSpreadElementExpression(node: SpreadElementExpression, contextualMapper?: TypeMapper): Type { - let type = checkExpressionCached(node.expression, contextualMapper); - if (!isArrayLikeType(type)) { - error(node.expression, Diagnostics.Type_0_is_not_an_array_type, typeToString(type)); - return unknownType; + let arrayOrIterableType = checkExpressionCached(node.expression, contextualMapper); + if (languageVersion >= ScriptTarget.ES6) { + // Check for iterable, not yet implemented } - return type; + + if (isArrayLikeType(arrayOrIterableType)) { + return getIndexTypeOfType(arrayOrIterableType, IndexKind.Number); + } + + error(node.expression, Diagnostics.Type_0_is_not_an_array_type, typeToString(arrayOrIterableType)); + return unknownType; } function checkArrayLiteral(node: ArrayLiteralExpression, contextualMapper?: TypeMapper): Type { @@ -5924,18 +5929,13 @@ module ts { if (!elements.length) { return createArrayType(undefinedType); } - let hasSpreadElement: boolean = false; + let hasSpreadElement = false; let elementTypes: Type[] = []; - forEach(elements, e => { + for (let e of elements) { let type = checkExpression(e, contextualMapper); - if (e.kind === SyntaxKind.SpreadElementExpression) { - elementTypes.push(getIndexTypeOfType(type, IndexKind.Number) || anyType); - hasSpreadElement = true; - } - else { - elementTypes.push(type); - } - }); + elementTypes.push(type); + hasSpreadElement = hasSpreadElement || e.kind === SyntaxKind.SpreadElementExpression; + } if (!hasSpreadElement) { let contextualType = getContextualType(node); if (contextualType && contextualTypeIsTupleLikeType(contextualType) || isAssignmentTarget(node)) { @@ -6558,7 +6558,7 @@ module ts { for (let i = 0; i < args.length; i++) { let arg = args[i]; if (arg.kind !== SyntaxKind.OmittedExpression) { - let paramType = getTypeAtPosition(signature, arg.kind === SyntaxKind.SpreadElementExpression ? -1 : i); + let paramType = getTypeAtPosition(signature, i); let argType: Type; if (i === 0 && args[i].parent.kind === SyntaxKind.TaggedTemplateExpression) { argType = globalTemplateStringsArrayType; @@ -6581,7 +6581,7 @@ module ts { // No need to check for omitted args and template expressions, their exlusion value is always undefined if (excludeArgument[i] === false) { let arg = args[i]; - let paramType = getTypeAtPosition(signature, arg.kind === SyntaxKind.SpreadElementExpression ? -1 : i); + let paramType = getTypeAtPosition(signature, i); inferTypes(context, checkExpressionWithContextualType(arg, paramType, inferenceMapper), paramType); } } @@ -6614,7 +6614,7 @@ module ts { let arg = args[i]; if (arg.kind !== SyntaxKind.OmittedExpression) { // Check spread elements against rest type (from arity check we know spread argument corresponds to a rest parameter) - let paramType = getTypeAtPosition(signature, arg.kind === SyntaxKind.SpreadElementExpression ? -1 : i); + let paramType = getTypeAtPosition(signature, i); // A tagged template expression provides a special first argument, and string literals get string literal types // unless we're reporting errors let argType = i === 0 && node.kind === SyntaxKind.TaggedTemplateExpression ? globalTemplateStringsArrayType : @@ -7088,14 +7088,9 @@ module ts { } function getTypeAtPosition(signature: Signature, pos: number): Type { - if (pos >= 0) { - return signature.hasRestParameter ? - pos < signature.parameters.length - 1 ? getTypeOfSymbol(signature.parameters[pos]) : getRestTypeOfSignature(signature) : - pos < signature.parameters.length ? getTypeOfSymbol(signature.parameters[pos]) : anyType; - } return signature.hasRestParameter ? - getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]) : - anyArrayType; + pos < signature.parameters.length - 1 ? getTypeOfSymbol(signature.parameters[pos]) : getRestTypeOfSignature(signature) : + pos < signature.parameters.length ? getTypeOfSymbol(signature.parameters[pos]) : anyType; } function assignContextualParameterTypes(signature: Signature, context: Signature, mapper: TypeMapper) { diff --git a/tests/baselines/reference/arrayLiteralSpread.types b/tests/baselines/reference/arrayLiteralSpread.types index 3122c0628af..73d4f6013ed 100644 --- a/tests/baselines/reference/arrayLiteralSpread.types +++ b/tests/baselines/reference/arrayLiteralSpread.types @@ -9,55 +9,55 @@ function f0() { var a1 = [...a]; >a1 : number[] >[...a] : number[] ->...a : number[] +>...a : number >a : number[] var a2 = [1, ...a]; >a2 : number[] >[1, ...a] : number[] ->...a : number[] +>...a : number >a : number[] var a3 = [1, 2, ...a]; >a3 : number[] >[1, 2, ...a] : number[] ->...a : number[] +>...a : number >a : number[] var a4 = [...a, 1]; >a4 : number[] >[...a, 1] : number[] ->...a : number[] +>...a : number >a : number[] var a5 = [...a, 1, 2]; >a5 : number[] >[...a, 1, 2] : number[] ->...a : number[] +>...a : number >a : number[] var a6 = [1, 2, ...a, 1, 2]; >a6 : number[] >[1, 2, ...a, 1, 2] : number[] ->...a : number[] +>...a : number >a : number[] var a7 = [1, ...a, 2, ...a]; >a7 : number[] >[1, ...a, 2, ...a] : number[] ->...a : number[] +>...a : number >a : number[] ->...a : number[] +>...a : number >a : number[] var a8 = [...a, ...a, ...a]; >a8 : number[] >[...a, ...a, ...a] : number[] ->...a : number[] +>...a : number >a : number[] ->...a : number[] +>...a : number >a : number[] ->...a : number[] +>...a : number >a : number[] } @@ -71,7 +71,7 @@ function f1() { var b = ["hello", ...a, true]; >b : (string | number | boolean)[] >["hello", ...a, true] : (string | number | boolean)[] ->...a : number[] +>...a : number >a : number[] var b: (string | number | boolean)[]; @@ -84,29 +84,29 @@ function f2() { var a = [...[...[...[...[...[]]]]]]; >a : any[] >[...[...[...[...[...[]]]]]] : undefined[] ->...[...[...[...[...[]]]]] : undefined[] +>...[...[...[...[...[]]]]] : undefined >[...[...[...[...[]]]]] : undefined[] ->...[...[...[...[]]]] : undefined[] +>...[...[...[...[]]]] : undefined >[...[...[...[]]]] : undefined[] ->...[...[...[]]] : undefined[] +>...[...[...[]]] : undefined >[...[...[]]] : undefined[] ->...[...[]] : undefined[] +>...[...[]] : undefined >[...[]] : undefined[] ->...[] : undefined[] +>...[] : undefined >[] : undefined[] var b = [...[...[...[...[...[5]]]]]]; >b : number[] >[...[...[...[...[...[5]]]]]] : number[] ->...[...[...[...[...[5]]]]] : number[] +>...[...[...[...[...[5]]]]] : number >[...[...[...[...[5]]]]] : number[] ->...[...[...[...[5]]]] : number[] +>...[...[...[...[5]]]] : number >[...[...[...[5]]]] : number[] ->...[...[...[5]]] : number[] +>...[...[...[5]]] : number >[...[...[5]]] : number[] ->...[...[5]] : number[] +>...[...[5]] : number >[...[5]] : number[] ->...[5] : number[] +>...[5] : number >[5] : number[] } diff --git a/tests/baselines/reference/callWithSpreadES6.types b/tests/baselines/reference/callWithSpreadES6.types index 1711926d773..10dd611d213 100644 --- a/tests/baselines/reference/callWithSpreadES6.types +++ b/tests/baselines/reference/callWithSpreadES6.types @@ -38,13 +38,13 @@ foo(1, 2, "abc"); foo(1, 2, ...a); >foo(1, 2, ...a) : void >foo : (x: number, y: number, ...z: string[]) => void ->...a : string[] +>...a : string >a : string[] foo(1, 2, ...a, "abc"); >foo(1, 2, ...a, "abc") : void >foo : (x: number, y: number, ...z: string[]) => void ->...a : string[] +>...a : string >a : string[] obj.foo(1, 2, "abc"); @@ -58,7 +58,7 @@ obj.foo(1, 2, ...a); >obj.foo : (x: number, y: number, ...z: string[]) => any >obj : X >foo : (x: number, y: number, ...z: string[]) => any ->...a : string[] +>...a : string >a : string[] obj.foo(1, 2, ...a, "abc"); @@ -66,7 +66,7 @@ obj.foo(1, 2, ...a, "abc"); >obj.foo : (x: number, y: number, ...z: string[]) => any >obj : X >foo : (x: number, y: number, ...z: string[]) => any ->...a : string[] +>...a : string >a : string[] (obj.foo)(1, 2, "abc"); @@ -82,7 +82,7 @@ obj.foo(1, 2, ...a, "abc"); >obj.foo : (x: number, y: number, ...z: string[]) => any >obj : X >foo : (x: number, y: number, ...z: string[]) => any ->...a : string[] +>...a : string >a : string[] (obj.foo)(1, 2, ...a, "abc"); @@ -91,7 +91,7 @@ obj.foo(1, 2, ...a, "abc"); >obj.foo : (x: number, y: number, ...z: string[]) => any >obj : X >foo : (x: number, y: number, ...z: string[]) => any ->...a : string[] +>...a : string >a : string[] xa[1].foo(1, 2, "abc"); @@ -107,7 +107,7 @@ xa[1].foo(1, 2, ...a); >xa[1] : X >xa : X[] >foo : (x: number, y: number, ...z: string[]) => any ->...a : string[] +>...a : string >a : string[] xa[1].foo(1, 2, ...a, "abc"); @@ -116,7 +116,7 @@ xa[1].foo(1, 2, ...a, "abc"); >xa[1] : X >xa : X[] >foo : (x: number, y: number, ...z: string[]) => any ->...a : string[] +>...a : string >a : string[] (xa[1].foo)(...[1, 2, "abc"]); @@ -128,7 +128,7 @@ xa[1].foo(1, 2, ...a, "abc"); >xa[1] : X >xa : X[] >foo : (x: number, y: number, ...z: string[]) => any ->...[1, 2, "abc"] : (string | number)[] +>...[1, 2, "abc"] : string | number >[1, 2, "abc"] : (string | number)[] class C { @@ -154,7 +154,7 @@ class C { >foo : (x: number, y: number, ...z: string[]) => void >x : number >y : number ->...z : string[] +>...z : string >z : string[] } foo(x: number, y: number, ...z: string[]) { @@ -177,7 +177,7 @@ class D extends C { super(1, 2, ...a); >super(1, 2, ...a) : void >super : typeof C ->...a : string[] +>...a : string >a : string[] } foo() { @@ -194,7 +194,7 @@ class D extends C { >super.foo : (x: number, y: number, ...z: string[]) => void >super : C >foo : (x: number, y: number, ...z: string[]) => void ->...a : string[] +>...a : string >a : string[] } } @@ -204,6 +204,6 @@ var c = new C(1, 2, ...a); >c : C >new C(1, 2, ...a) : C >C : typeof C ->...a : string[] +>...a : string >a : string[] From 2288946afc0dded99f92ef19bf5e3c5deaea1f51 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 24 Mar 2015 16:33:24 -0700 Subject: [PATCH 06/35] Support iterators in spread element --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f095c8574c5..c3a9b2960ef 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5913,7 +5913,7 @@ module ts { function checkSpreadElementExpression(node: SpreadElementExpression, contextualMapper?: TypeMapper): Type { let arrayOrIterableType = checkExpressionCached(node.expression, contextualMapper); if (languageVersion >= ScriptTarget.ES6) { - // Check for iterable, not yet implemented + return checkIteratedType(arrayOrIterableType, node.expression) || unknownType; } if (isArrayLikeType(arrayOrIterableType)) { From 376574d1be89195a34c5b04ce33ecc41282919f2 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 24 Mar 2015 16:33:56 -0700 Subject: [PATCH 07/35] Add tests for iterator spread in an array literal --- .../reference/iteratorSpreadInArray.js | 31 +++++++++ .../reference/iteratorSpreadInArray.types | 37 ++++++++++ .../iteratorSpreadInArray10.errors.txt | 13 ++++ .../reference/iteratorSpreadInArray10.js | 18 +++++ .../reference/iteratorSpreadInArray2.js | 56 +++++++++++++++ .../reference/iteratorSpreadInArray2.types | 68 +++++++++++++++++++ .../reference/iteratorSpreadInArray3.js | 35 ++++++++++ .../reference/iteratorSpreadInArray3.types | 39 +++++++++++ .../reference/iteratorSpreadInArray4.js | 33 +++++++++ .../reference/iteratorSpreadInArray4.types | 37 ++++++++++ .../iteratorSpreadInArray5.errors.txt | 24 +++++++ .../reference/iteratorSpreadInArray5.js | 33 +++++++++ .../iteratorSpreadInArray6.errors.txt | 21 ++++++ .../reference/iteratorSpreadInArray6.js | 36 ++++++++++ .../reference/iteratorSpreadInArray7.js | 33 +++++++++ .../reference/iteratorSpreadInArray7.types | 43 ++++++++++++ .../iteratorSpreadInArray8.errors.txt | 16 +++++ .../reference/iteratorSpreadInArray8.js | 24 +++++++ .../iteratorSpreadInArray9.errors.txt | 33 +++++++++ .../reference/iteratorSpreadInArray9.js | 29 ++++++++ .../es6/spread/iteratorSpreadInArray.ts | 15 ++++ .../es6/spread/iteratorSpreadInArray10.ts | 8 +++ .../es6/spread/iteratorSpreadInArray2.ts | 28 ++++++++ .../es6/spread/iteratorSpreadInArray3.ts | 15 ++++ .../es6/spread/iteratorSpreadInArray4.ts | 15 ++++ .../es6/spread/iteratorSpreadInArray5.ts | 15 ++++ .../es6/spread/iteratorSpreadInArray6.ts | 16 +++++ .../es6/spread/iteratorSpreadInArray7.ts | 16 +++++ .../es6/spread/iteratorSpreadInArray8.ts | 11 +++ .../es6/spread/iteratorSpreadInArray9.ts | 14 ++++ 30 files changed, 812 insertions(+) create mode 100644 tests/baselines/reference/iteratorSpreadInArray.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray.types create mode 100644 tests/baselines/reference/iteratorSpreadInArray10.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInArray10.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray2.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray2.types create mode 100644 tests/baselines/reference/iteratorSpreadInArray3.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray3.types create mode 100644 tests/baselines/reference/iteratorSpreadInArray4.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray4.types create mode 100644 tests/baselines/reference/iteratorSpreadInArray5.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInArray5.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray6.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInArray6.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray7.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray7.types create mode 100644 tests/baselines/reference/iteratorSpreadInArray8.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInArray8.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray9.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInArray9.js create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray10.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray2.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray3.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray4.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray5.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray6.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray7.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray8.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray9.ts diff --git a/tests/baselines/reference/iteratorSpreadInArray.js b/tests/baselines/reference/iteratorSpreadInArray.js new file mode 100644 index 00000000000..ae1a2c5916c --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray.js @@ -0,0 +1,31 @@ +//// [iteratorSpreadInArray.ts] +var array = [...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInArray.js] +var array = [ + ...new SymbolIterator +]; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray.types b/tests/baselines/reference/iteratorSpreadInArray.types new file mode 100644 index 00000000000..13b1a458eb9 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray.types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInArray.ts === +var array = [...new SymbolIterator]; +>array : symbol[] +>[...new SymbolIterator] : symbol[] +>...new SymbolIterator : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray10.errors.txt b/tests/baselines/reference/iteratorSpreadInArray10.errors.txt new file mode 100644 index 00000000000..90cde7d03b1 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray10.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInArray10.ts(1,17): error TS2489: An iterator must have a 'next()' method. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInArray10.ts (1 errors) ==== + var array = [...new SymbolIterator]; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2489: An iterator must have a 'next()' method. + + class SymbolIterator { + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInArray10.js b/tests/baselines/reference/iteratorSpreadInArray10.js new file mode 100644 index 00000000000..c33d7e8a015 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray10.js @@ -0,0 +1,18 @@ +//// [iteratorSpreadInArray10.ts] +var array = [...new SymbolIterator]; + +class SymbolIterator { + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInArray10.js] +var array = [ + ...new SymbolIterator +]; +class SymbolIterator { + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray2.js b/tests/baselines/reference/iteratorSpreadInArray2.js new file mode 100644 index 00000000000..4589d9bb904 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray2.js @@ -0,0 +1,56 @@ +//// [iteratorSpreadInArray2.ts] +var array = [...new NumberIterator, ...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class NumberIterator { + next() { + return { + value: 0, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInArray2.js] +var array = [ + ...new NumberIterator, + ...new SymbolIterator +]; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} +class NumberIterator { + next() { + return { + value: 0, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray2.types b/tests/baselines/reference/iteratorSpreadInArray2.types new file mode 100644 index 00000000000..3cb27445f57 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray2.types @@ -0,0 +1,68 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInArray2.ts === +var array = [...new NumberIterator, ...new SymbolIterator]; +>array : (number | symbol)[] +>[...new NumberIterator, ...new SymbolIterator] : (number | symbol)[] +>...new NumberIterator : number +>new NumberIterator : NumberIterator +>NumberIterator : typeof NumberIterator +>...new SymbolIterator : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} + +class NumberIterator { +>NumberIterator : NumberIterator + + next() { +>next : () => { value: number; done: boolean; } + + return { +>{ value: 0, done: false } : { value: number; done: boolean; } + + value: 0, +>value : number + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : NumberIterator + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray3.js b/tests/baselines/reference/iteratorSpreadInArray3.js new file mode 100644 index 00000000000..b9eac64b29f --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray3.js @@ -0,0 +1,35 @@ +//// [iteratorSpreadInArray3.ts] +var array = [...[0, 1], ...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInArray3.js] +var array = [ + ...[ + 0, + 1 + ], + ...new SymbolIterator +]; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray3.types b/tests/baselines/reference/iteratorSpreadInArray3.types new file mode 100644 index 00000000000..e5c25daabc7 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray3.types @@ -0,0 +1,39 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInArray3.ts === +var array = [...[0, 1], ...new SymbolIterator]; +>array : (number | symbol)[] +>[...[0, 1], ...new SymbolIterator] : (number | symbol)[] +>...[0, 1] : number +>[0, 1] : number[] +>...new SymbolIterator : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray4.js b/tests/baselines/reference/iteratorSpreadInArray4.js new file mode 100644 index 00000000000..22571495f05 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray4.js @@ -0,0 +1,33 @@ +//// [iteratorSpreadInArray4.ts] +var array = [0, 1, ...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInArray4.js] +var array = [ + 0, + 1, + ...new SymbolIterator +]; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray4.types b/tests/baselines/reference/iteratorSpreadInArray4.types new file mode 100644 index 00000000000..790fc9db1ba --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray4.types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInArray4.ts === +var array = [0, 1, ...new SymbolIterator]; +>array : (number | symbol)[] +>[0, 1, ...new SymbolIterator] : (number | symbol)[] +>...new SymbolIterator : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray5.errors.txt b/tests/baselines/reference/iteratorSpreadInArray5.errors.txt new file mode 100644 index 00000000000..498cc7d48ef --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray5.errors.txt @@ -0,0 +1,24 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInArray5.ts(1,5): error TS2322: Type '(number | symbol)[]' is not assignable to type 'number[]'. + Type 'number | symbol' is not assignable to type 'number'. + Type 'symbol' is not assignable to type 'number'. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInArray5.ts (1 errors) ==== + var array: number[] = [0, 1, ...new SymbolIterator]; + ~~~~~ +!!! error TS2322: Type '(number | symbol)[]' is not assignable to type 'number[]'. +!!! error TS2322: Type 'number | symbol' is not assignable to type 'number'. +!!! error TS2322: Type 'symbol' is not assignable to type 'number'. + + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInArray5.js b/tests/baselines/reference/iteratorSpreadInArray5.js new file mode 100644 index 00000000000..b5e4c95d22b --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray5.js @@ -0,0 +1,33 @@ +//// [iteratorSpreadInArray5.ts] +var array: number[] = [0, 1, ...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInArray5.js] +var array = [ + 0, + 1, + ...new SymbolIterator +]; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray6.errors.txt b/tests/baselines/reference/iteratorSpreadInArray6.errors.txt new file mode 100644 index 00000000000..b90ac5f203c --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray6.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInArray6.ts(2,14): error TS2345: Argument of type 'symbol[]' is not assignable to parameter of type 'number'. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInArray6.ts (1 errors) ==== + var array: number[] = [0, 1]; + array.concat([...new SymbolIterator]); + ~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type 'symbol[]' is not assignable to parameter of type 'number'. + + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInArray6.js b/tests/baselines/reference/iteratorSpreadInArray6.js new file mode 100644 index 00000000000..df34201b827 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray6.js @@ -0,0 +1,36 @@ +//// [iteratorSpreadInArray6.ts] +var array: number[] = [0, 1]; +array.concat([...new SymbolIterator]); + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInArray6.js] +var array = [ + 0, + 1 +]; +array.concat([ + ...new SymbolIterator +]); +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray7.js b/tests/baselines/reference/iteratorSpreadInArray7.js new file mode 100644 index 00000000000..ca7acd5a786 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray7.js @@ -0,0 +1,33 @@ +//// [iteratorSpreadInArray7.ts] +var array: symbol[]; +array.concat([...new SymbolIterator]); + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInArray7.js] +var array; +array.concat([ + ...new SymbolIterator +]); +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray7.types b/tests/baselines/reference/iteratorSpreadInArray7.types new file mode 100644 index 00000000000..c58d01f098b --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray7.types @@ -0,0 +1,43 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInArray7.ts === +var array: symbol[]; +>array : symbol[] + +array.concat([...new SymbolIterator]); +>array.concat([...new SymbolIterator]) : symbol[] +>array.concat : { (...items: U[]): symbol[]; (...items: symbol[]): symbol[]; } +>array : symbol[] +>concat : { (...items: U[]): symbol[]; (...items: symbol[]): symbol[]; } +>[...new SymbolIterator] : symbol[] +>...new SymbolIterator : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray8.errors.txt b/tests/baselines/reference/iteratorSpreadInArray8.errors.txt new file mode 100644 index 00000000000..365bc8db9c2 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray8.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInArray8.ts(1,17): error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInArray8.ts (1 errors) ==== + var array = [...new SymbolIterator]; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. + + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInArray8.js b/tests/baselines/reference/iteratorSpreadInArray8.js new file mode 100644 index 00000000000..e1edeee1168 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray8.js @@ -0,0 +1,24 @@ +//// [iteratorSpreadInArray8.ts] +var array = [...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } +} + +//// [iteratorSpreadInArray8.js] +var array = [ + ...new SymbolIterator +]; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInArray9.errors.txt b/tests/baselines/reference/iteratorSpreadInArray9.errors.txt new file mode 100644 index 00000000000..e0e3d061f16 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray9.errors.txt @@ -0,0 +1,33 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInArray9.ts(1,17): error TS2322: Type 'SymbolIterator' is not assignable to type 'Iterable'. + Types of property '[Symbol.iterator]' are incompatible. + Type '() => SymbolIterator' is not assignable to type '() => Iterator'. + Type 'SymbolIterator' is not assignable to type 'Iterator'. + Types of property 'next' are incompatible. + Type '() => { value: symbol; }' is not assignable to type '() => IteratorResult'. + Type '{ value: symbol; }' is not assignable to type 'IteratorResult'. + Property 'done' is missing in type '{ value: symbol; }'. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInArray9.ts (1 errors) ==== + var array = [...new SymbolIterator]; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2322: Type 'SymbolIterator' is not assignable to type 'Iterable'. +!!! error TS2322: Types of property '[Symbol.iterator]' are incompatible. +!!! error TS2322: Type '() => SymbolIterator' is not assignable to type '() => Iterator'. +!!! error TS2322: Type 'SymbolIterator' is not assignable to type 'Iterator'. +!!! error TS2322: Types of property 'next' are incompatible. +!!! error TS2322: Type '() => { value: symbol; }' is not assignable to type '() => IteratorResult'. +!!! error TS2322: Type '{ value: symbol; }' is not assignable to type 'IteratorResult'. +!!! error TS2322: Property 'done' is missing in type '{ value: symbol; }'. + + class SymbolIterator { + next() { + return { + value: Symbol() + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInArray9.js b/tests/baselines/reference/iteratorSpreadInArray9.js new file mode 100644 index 00000000000..93de78065fb --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray9.js @@ -0,0 +1,29 @@ +//// [iteratorSpreadInArray9.ts] +var array = [...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol() + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInArray9.js] +var array = [ + ...new SymbolIterator +]; +class SymbolIterator { + next() { + return { + value: Symbol() + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray.ts new file mode 100644 index 00000000000..4b4f3e8cc1c --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray.ts @@ -0,0 +1,15 @@ +//@target: ES6 +var array = [...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray10.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray10.ts new file mode 100644 index 00000000000..f8549b82b76 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray10.ts @@ -0,0 +1,8 @@ +//@target: ES6 +var array = [...new SymbolIterator]; + +class SymbolIterator { + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray2.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray2.ts new file mode 100644 index 00000000000..9db5d010874 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray2.ts @@ -0,0 +1,28 @@ +//@target: ES6 +var array = [...new NumberIterator, ...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class NumberIterator { + next() { + return { + value: 0, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray3.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray3.ts new file mode 100644 index 00000000000..174c97de7cc --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray3.ts @@ -0,0 +1,15 @@ +//@target: ES6 +var array = [...[0, 1], ...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray4.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray4.ts new file mode 100644 index 00000000000..47c2e633702 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray4.ts @@ -0,0 +1,15 @@ +//@target: ES6 +var array = [0, 1, ...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray5.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray5.ts new file mode 100644 index 00000000000..e6a8041a961 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray5.ts @@ -0,0 +1,15 @@ +//@target: ES6 +var array: number[] = [0, 1, ...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray6.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray6.ts new file mode 100644 index 00000000000..7495ca6aac6 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray6.ts @@ -0,0 +1,16 @@ +//@target: ES6 +var array: number[] = [0, 1]; +array.concat([...new SymbolIterator]); + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray7.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray7.ts new file mode 100644 index 00000000000..12ca478c738 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray7.ts @@ -0,0 +1,16 @@ +//@target: ES6 +var array: symbol[]; +array.concat([...new SymbolIterator]); + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray8.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray8.ts new file mode 100644 index 00000000000..0e2258aa5ea --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray8.ts @@ -0,0 +1,11 @@ +//@target: ES6 +var array = [...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray9.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray9.ts new file mode 100644 index 00000000000..2b8d93c9ccb --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray9.ts @@ -0,0 +1,14 @@ +//@target: ES6 +var array = [...new SymbolIterator]; + +class SymbolIterator { + next() { + return { + value: Symbol() + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file From 4a0af76064ae039efd99b47133eb35a21c1cc43f Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 24 Mar 2015 16:52:00 -0700 Subject: [PATCH 08/35] Add tests for iterator spread in call --- .../reference/iteratorSpreadInCall.errors.txt | 21 +++++ .../reference/iteratorSpreadInCall.js | 32 ++++++++ .../iteratorSpreadInCall10.errors.txt | 22 +++++ .../reference/iteratorSpreadInCall10.js | 34 ++++++++ .../reference/iteratorSpreadInCall11.js | 34 ++++++++ .../reference/iteratorSpreadInCall11.types | 45 +++++++++++ .../reference/iteratorSpreadInCall12.js | 66 +++++++++++++++ .../reference/iteratorSpreadInCall12.types | 81 +++++++++++++++++++ .../iteratorSpreadInCall2.errors.txt | 21 +++++ .../reference/iteratorSpreadInCall2.js | 32 ++++++++ .../reference/iteratorSpreadInCall3.js | 32 ++++++++ .../reference/iteratorSpreadInCall3.types | 41 ++++++++++ .../iteratorSpreadInCall4.errors.txt | 21 +++++ .../reference/iteratorSpreadInCall4.js | 32 ++++++++ .../reference/iteratorSpreadInCall5.js | 56 +++++++++++++ .../reference/iteratorSpreadInCall5.types | 72 +++++++++++++++++ .../iteratorSpreadInCall6.errors.txt | 36 +++++++++ .../reference/iteratorSpreadInCall6.js | 56 +++++++++++++ .../iteratorSpreadInCall7.errors.txt | 36 +++++++++ .../reference/iteratorSpreadInCall7.js | 57 +++++++++++++ .../iteratorSpreadInCall8.errors.txt | 39 +++++++++ .../reference/iteratorSpreadInCall8.js | 61 ++++++++++++++ .../iteratorSpreadInCall9.errors.txt | 39 +++++++++ .../reference/iteratorSpreadInCall9.js | 63 +++++++++++++++ .../es6/spread/iteratorSpreadInCall.ts | 16 ++++ .../es6/spread/iteratorSpreadInCall10.ts | 17 ++++ .../es6/spread/iteratorSpreadInCall11.ts | 17 ++++ .../es6/spread/iteratorSpreadInCall12.ts | 32 ++++++++ .../es6/spread/iteratorSpreadInCall2.ts | 16 ++++ .../es6/spread/iteratorSpreadInCall3.ts | 16 ++++ .../es6/spread/iteratorSpreadInCall4.ts | 16 ++++ .../es6/spread/iteratorSpreadInCall5.ts | 29 +++++++ .../es6/spread/iteratorSpreadInCall6.ts | 29 +++++++ .../es6/spread/iteratorSpreadInCall7.ts | 29 +++++++ .../es6/spread/iteratorSpreadInCall8.ts | 32 ++++++++ .../es6/spread/iteratorSpreadInCall9.ts | 32 ++++++++ 36 files changed, 1310 insertions(+) create mode 100644 tests/baselines/reference/iteratorSpreadInCall.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInCall.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall10.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInCall10.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall11.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall11.types create mode 100644 tests/baselines/reference/iteratorSpreadInCall12.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall12.types create mode 100644 tests/baselines/reference/iteratorSpreadInCall2.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInCall2.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall3.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall3.types create mode 100644 tests/baselines/reference/iteratorSpreadInCall4.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInCall4.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall5.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall5.types create mode 100644 tests/baselines/reference/iteratorSpreadInCall6.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInCall6.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall7.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInCall7.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall8.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInCall8.js create mode 100644 tests/baselines/reference/iteratorSpreadInCall9.errors.txt create mode 100644 tests/baselines/reference/iteratorSpreadInCall9.js create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall10.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall11.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall12.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall2.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall3.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall4.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall5.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall6.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall7.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall8.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInCall9.ts diff --git a/tests/baselines/reference/iteratorSpreadInCall.errors.txt b/tests/baselines/reference/iteratorSpreadInCall.errors.txt new file mode 100644 index 00000000000..614153192d7 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInCall.ts(1,1): error TS2346: Supplied parameters do not match any signature of call target. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInCall.ts (1 errors) ==== + foo(...new SymbolIterator); + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2346: Supplied parameters do not match any signature of call target. + + function foo(s: symbol) { } + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInCall.js b/tests/baselines/reference/iteratorSpreadInCall.js new file mode 100644 index 00000000000..0dcff404f53 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall.js @@ -0,0 +1,32 @@ +//// [iteratorSpreadInCall.ts] +foo(...new SymbolIterator); + +function foo(s: symbol) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall.js] +foo(...new SymbolIterator); +function foo(s) { +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall10.errors.txt b/tests/baselines/reference/iteratorSpreadInCall10.errors.txt new file mode 100644 index 00000000000..04d9045e86c --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall10.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInCall10.ts(1,1): error TS2346: Supplied parameters do not match any signature of call target. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInCall10.ts (1 errors) ==== + foo(...new SymbolIterator); + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2346: Supplied parameters do not match any signature of call target. + + function foo(s: T[]) { return s[0] } + + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInCall10.js b/tests/baselines/reference/iteratorSpreadInCall10.js new file mode 100644 index 00000000000..5c400ae2c30 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall10.js @@ -0,0 +1,34 @@ +//// [iteratorSpreadInCall10.ts] +foo(...new SymbolIterator); + +function foo(s: T[]) { return s[0] } + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall10.js] +foo(...new SymbolIterator); +function foo(s) { + return s[0]; +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall11.js b/tests/baselines/reference/iteratorSpreadInCall11.js new file mode 100644 index 00000000000..a3cccb96409 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall11.js @@ -0,0 +1,34 @@ +//// [iteratorSpreadInCall11.ts] +foo(...new SymbolIterator); + +function foo(...s: T[]) { return s[0] } + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall11.js] +foo(...new SymbolIterator); +function foo(...s) { + return s[0]; +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall11.types b/tests/baselines/reference/iteratorSpreadInCall11.types new file mode 100644 index 00000000000..a37fc6e2232 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall11.types @@ -0,0 +1,45 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInCall11.ts === +foo(...new SymbolIterator); +>foo(...new SymbolIterator) : symbol +>foo : (...s: T[]) => T +>...new SymbolIterator : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator + +function foo(...s: T[]) { return s[0] } +>foo : (...s: T[]) => T +>T : T +>s : T[] +>T : T +>s[0] : T +>s : T[] + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall12.js b/tests/baselines/reference/iteratorSpreadInCall12.js new file mode 100644 index 00000000000..dd95cab0cf8 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall12.js @@ -0,0 +1,66 @@ +//// [iteratorSpreadInCall12.ts] +new Foo(...[...new SymbolIterator, ...[...new StringIterator]]); + +class Foo { + constructor(...s: T[]) { } +} + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall12.js] +new Foo(...[ + ...new SymbolIterator, + ...[ + ...new StringIterator + ] +]); +class Foo { + constructor(...s) { + } +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall12.types b/tests/baselines/reference/iteratorSpreadInCall12.types new file mode 100644 index 00000000000..78ce973a532 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall12.types @@ -0,0 +1,81 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInCall12.ts === +new Foo(...[...new SymbolIterator, ...[...new StringIterator]]); +>new Foo(...[...new SymbolIterator, ...[...new StringIterator]]) : Foo +>Foo : typeof Foo +>...[...new SymbolIterator, ...[...new StringIterator]] : string | symbol +>[...new SymbolIterator, ...[...new StringIterator]] : (string | symbol)[] +>...new SymbolIterator : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator +>...[...new StringIterator] : string +>[...new StringIterator] : string[] +>...new StringIterator : string +>new StringIterator : StringIterator +>StringIterator : typeof StringIterator + +class Foo { +>Foo : Foo +>T : T + + constructor(...s: T[]) { } +>s : T[] +>T : T +} + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} + +class StringIterator { +>StringIterator : StringIterator + + next() { +>next : () => { value: string; done: boolean; } + + return { +>{ value: "", done: false } : { value: string; done: boolean; } + + value: "", +>value : string + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : StringIterator + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall2.errors.txt b/tests/baselines/reference/iteratorSpreadInCall2.errors.txt new file mode 100644 index 00000000000..bd994ab37b0 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall2.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInCall2.ts(1,1): error TS2346: Supplied parameters do not match any signature of call target. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInCall2.ts (1 errors) ==== + foo(...new SymbolIterator); + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2346: Supplied parameters do not match any signature of call target. + + function foo(s: symbol[]) { } + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInCall2.js b/tests/baselines/reference/iteratorSpreadInCall2.js new file mode 100644 index 00000000000..d833cd77fb0 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall2.js @@ -0,0 +1,32 @@ +//// [iteratorSpreadInCall2.ts] +foo(...new SymbolIterator); + +function foo(s: symbol[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall2.js] +foo(...new SymbolIterator); +function foo(s) { +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall3.js b/tests/baselines/reference/iteratorSpreadInCall3.js new file mode 100644 index 00000000000..17d0a3ed37d --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall3.js @@ -0,0 +1,32 @@ +//// [iteratorSpreadInCall3.ts] +foo(...new SymbolIterator); + +function foo(...s: symbol[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall3.js] +foo(...new SymbolIterator); +function foo(...s) { +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall3.types b/tests/baselines/reference/iteratorSpreadInCall3.types new file mode 100644 index 00000000000..07eb149ba31 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall3.types @@ -0,0 +1,41 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInCall3.ts === +foo(...new SymbolIterator); +>foo(...new SymbolIterator) : void +>foo : (...s: symbol[]) => void +>...new SymbolIterator : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator + +function foo(...s: symbol[]) { } +>foo : (...s: symbol[]) => void +>s : symbol[] + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall4.errors.txt b/tests/baselines/reference/iteratorSpreadInCall4.errors.txt new file mode 100644 index 00000000000..0e0a40a512f --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall4.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInCall4.ts(1,1): error TS2346: Supplied parameters do not match any signature of call target. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInCall4.ts (1 errors) ==== + foo(...new SymbolIterator); + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2346: Supplied parameters do not match any signature of call target. + + function foo(s1: symbol, ...s: symbol[]) { } + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInCall4.js b/tests/baselines/reference/iteratorSpreadInCall4.js new file mode 100644 index 00000000000..e1888f47634 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall4.js @@ -0,0 +1,32 @@ +//// [iteratorSpreadInCall4.ts] +foo(...new SymbolIterator); + +function foo(s1: symbol, ...s: symbol[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall4.js] +foo(...new SymbolIterator); +function foo(s1, ...s) { +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall5.js b/tests/baselines/reference/iteratorSpreadInCall5.js new file mode 100644 index 00000000000..2b7be4cdce6 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall5.js @@ -0,0 +1,56 @@ +//// [iteratorSpreadInCall5.ts] +foo(...new SymbolIterator, ...new StringIterator); + +function foo(...s: (symbol | string)[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall5.js] +foo(...new SymbolIterator, ...new StringIterator); +function foo(...s) { +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall5.types b/tests/baselines/reference/iteratorSpreadInCall5.types new file mode 100644 index 00000000000..6e924a1ef42 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall5.types @@ -0,0 +1,72 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInCall5.ts === +foo(...new SymbolIterator, ...new StringIterator); +>foo(...new SymbolIterator, ...new StringIterator) : void +>foo : (...s: (string | symbol)[]) => void +>...new SymbolIterator : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator +>...new StringIterator : string +>new StringIterator : StringIterator +>StringIterator : typeof StringIterator + +function foo(...s: (symbol | string)[]) { } +>foo : (...s: (string | symbol)[]) => void +>s : (string | symbol)[] + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} + +class StringIterator { +>StringIterator : StringIterator + + next() { +>next : () => { value: string; done: boolean; } + + return { +>{ value: "", done: false } : { value: string; done: boolean; } + + value: "", +>value : string + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : StringIterator + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall6.errors.txt b/tests/baselines/reference/iteratorSpreadInCall6.errors.txt new file mode 100644 index 00000000000..be085beb632 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall6.errors.txt @@ -0,0 +1,36 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInCall6.ts(1,28): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number | symbol'. + Type 'string' is not assignable to type 'symbol'. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInCall6.ts (1 errors) ==== + foo(...new SymbolIterator, ...new StringIterator); + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number | symbol'. +!!! error TS2345: Type 'string' is not assignable to type 'symbol'. + + function foo(...s: (symbol | number)[]) { } + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } + + class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInCall6.js b/tests/baselines/reference/iteratorSpreadInCall6.js new file mode 100644 index 00000000000..87e96d039de --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall6.js @@ -0,0 +1,56 @@ +//// [iteratorSpreadInCall6.ts] +foo(...new SymbolIterator, ...new StringIterator); + +function foo(...s: (symbol | number)[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall6.js] +foo(...new SymbolIterator, ...new StringIterator); +function foo(...s) { +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall7.errors.txt b/tests/baselines/reference/iteratorSpreadInCall7.errors.txt new file mode 100644 index 00000000000..51cae1d72b2 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall7.errors.txt @@ -0,0 +1,36 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInCall7.ts(1,1): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. + Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInCall7.ts (1 errors) ==== + foo(...new SymbolIterator, ...new StringIterator); + ~~~ +!!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. +!!! error TS2453: Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'. + + function foo(...s: T[]) { return s[0]; } + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } + + class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInCall7.js b/tests/baselines/reference/iteratorSpreadInCall7.js new file mode 100644 index 00000000000..1b7e53ba47a --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall7.js @@ -0,0 +1,57 @@ +//// [iteratorSpreadInCall7.ts] +foo(...new SymbolIterator, ...new StringIterator); + +function foo(...s: T[]) { return s[0]; } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall7.js] +foo(...new SymbolIterator, ...new StringIterator); +function foo(...s) { + return s[0]; +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall8.errors.txt b/tests/baselines/reference/iteratorSpreadInCall8.errors.txt new file mode 100644 index 00000000000..d7913458b6a --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall8.errors.txt @@ -0,0 +1,39 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInCall8.ts(1,5): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. + Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInCall8.ts (1 errors) ==== + new Foo(...new SymbolIterator, ...new StringIterator); + ~~~ +!!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. +!!! error TS2453: Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'. + + class Foo { + constructor(...s: T[]) { } + } + + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } + + class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInCall8.js b/tests/baselines/reference/iteratorSpreadInCall8.js new file mode 100644 index 00000000000..ac22bbcf5a3 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall8.js @@ -0,0 +1,61 @@ +//// [iteratorSpreadInCall8.ts] +new Foo(...new SymbolIterator, ...new StringIterator); + +class Foo { + constructor(...s: T[]) { } +} + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall8.js] +new Foo(...new SymbolIterator, ...new StringIterator); +class Foo { + constructor(...s) { + } +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iteratorSpreadInCall9.errors.txt b/tests/baselines/reference/iteratorSpreadInCall9.errors.txt new file mode 100644 index 00000000000..da2ee7f8efc --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall9.errors.txt @@ -0,0 +1,39 @@ +tests/cases/conformance/es6/spread/iteratorSpreadInCall9.ts(1,5): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. + Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'. + + +==== tests/cases/conformance/es6/spread/iteratorSpreadInCall9.ts (1 errors) ==== + new Foo(...new SymbolIterator, ...[...new StringIterator]); + ~~~ +!!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. +!!! error TS2453: Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'. + + class Foo { + constructor(...s: T[]) { } + } + + class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } + + class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iteratorSpreadInCall9.js b/tests/baselines/reference/iteratorSpreadInCall9.js new file mode 100644 index 00000000000..2efd94683c0 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInCall9.js @@ -0,0 +1,63 @@ +//// [iteratorSpreadInCall9.ts] +new Foo(...new SymbolIterator, ...[...new StringIterator]); + +class Foo { + constructor(...s: T[]) { } +} + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iteratorSpreadInCall9.js] +new Foo(...new SymbolIterator, ...[ + ...new StringIterator +]); +class Foo { + constructor(...s) { + } +} +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall.ts new file mode 100644 index 00000000000..85d07e56996 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall.ts @@ -0,0 +1,16 @@ +//@target: ES6 +foo(...new SymbolIterator); + +function foo(s: symbol) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall10.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall10.ts new file mode 100644 index 00000000000..bf8ad336fbf --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall10.ts @@ -0,0 +1,17 @@ +//@target: ES6 +foo(...new SymbolIterator); + +function foo(s: T[]) { return s[0] } + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall11.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall11.ts new file mode 100644 index 00000000000..182e454cfc8 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall11.ts @@ -0,0 +1,17 @@ +//@target: ES6 +foo(...new SymbolIterator); + +function foo(...s: T[]) { return s[0] } + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall12.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall12.ts new file mode 100644 index 00000000000..a0bd1ede193 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall12.ts @@ -0,0 +1,32 @@ +//@target: ES6 +new Foo(...[...new SymbolIterator, ...[...new StringIterator]]); + +class Foo { + constructor(...s: T[]) { } +} + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall2.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall2.ts new file mode 100644 index 00000000000..4a8fd9ff389 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall2.ts @@ -0,0 +1,16 @@ +//@target: ES6 +foo(...new SymbolIterator); + +function foo(s: symbol[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall3.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall3.ts new file mode 100644 index 00000000000..b6e8fe0c86b --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall3.ts @@ -0,0 +1,16 @@ +//@target: ES6 +foo(...new SymbolIterator); + +function foo(...s: symbol[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall4.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall4.ts new file mode 100644 index 00000000000..2a73fd6f3c9 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall4.ts @@ -0,0 +1,16 @@ +//@target: ES6 +foo(...new SymbolIterator); + +function foo(s1: symbol, ...s: symbol[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall5.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall5.ts new file mode 100644 index 00000000000..c17c4156e65 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall5.ts @@ -0,0 +1,29 @@ +//@target: ES6 +foo(...new SymbolIterator, ...new StringIterator); + +function foo(...s: (symbol | string)[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall6.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall6.ts new file mode 100644 index 00000000000..2c6150f8040 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall6.ts @@ -0,0 +1,29 @@ +//@target: ES6 +foo(...new SymbolIterator, ...new StringIterator); + +function foo(...s: (symbol | number)[]) { } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall7.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall7.ts new file mode 100644 index 00000000000..56fb7936eb7 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall7.ts @@ -0,0 +1,29 @@ +//@target: ES6 +foo(...new SymbolIterator, ...new StringIterator); + +function foo(...s: T[]) { return s[0]; } +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall8.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall8.ts new file mode 100644 index 00000000000..e5b969456b7 --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall8.ts @@ -0,0 +1,32 @@ +//@target: ES6 +new Foo(...new SymbolIterator, ...new StringIterator); + +class Foo { + constructor(...s: T[]) { } +} + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInCall9.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInCall9.ts new file mode 100644 index 00000000000..470f99844ba --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInCall9.ts @@ -0,0 +1,32 @@ +//@target: ES6 +new Foo(...new SymbolIterator, ...[...new StringIterator]); + +class Foo { + constructor(...s: T[]) { } +} + +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class StringIterator { + next() { + return { + value: "", + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file From 8c2cd2610317dcc0f22f3f57c60c959a2cb53e41 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 24 Mar 2015 18:29:52 -0700 Subject: [PATCH 09/35] Add createIterableType --- src/compiler/checker.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c3a9b2960ef..80e0ebfc665 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3408,6 +3408,10 @@ module ts { return globalESSymbolConstructorSymbol || (globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol")); } + function createIterableType(elementType: Type): Type { + return globalIterableType !== emptyObjectType ? createTypeReference(globalIterableType, [elementType]) : emptyObjectType; + } + function createArrayType(elementType: Type): Type { // globalArrayType will be undefined if we get here during creation of the Array type. This for example happens if // user code augments the Array type with call or construct signatures that have an array type as the return type. @@ -9268,10 +9272,7 @@ module ts { // Now even though we have extracted the iteratedType, we will have to validate that the type // passed in is actually an Iterable. if (expressionForError && iteratedType) { - let completeIterableType = globalIterableType !== emptyObjectType - ? createTypeReference(globalIterableType, [iteratedType]) - : emptyObjectType; - checkTypeAssignableTo(iterable, completeIterableType, expressionForError); + checkTypeAssignableTo(iterable, createIterableType(iteratedType), expressionForError); } return iteratedType; From 42ed6aab89ff1bd739f11ba6f0ab1bbfb57e38fe Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 24 Mar 2015 18:39:25 -0700 Subject: [PATCH 10/35] getTypeFromArrayBindingPattern returns an iterable in ES6 --- src/compiler/checker.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 80e0ebfc665..157ed8154c5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2153,7 +2153,16 @@ module ts { hasSpreadElement = true; } }); - return !elementTypes.length ? anyArrayType : hasSpreadElement ? createArrayType(getUnionType(elementTypes)) : createTupleType(elementTypes); + if (!elementTypes.length) { + return languageVersion >= ScriptTarget.ES6 ? createIterableType(anyType) : anyArrayType; + } + else if (hasSpreadElement) { + var unionOfElements = getUnionType(elementTypes); + return languageVersion >= ScriptTarget.ES6 ? createIterableType(unionOfElements) : createArrayType(unionOfElements); + } + + // If the pattern has at least one element, and no rest element, then it should imply a tuple type. + return createTupleType(elementTypes); } // Return the type implied by a binding pattern. This is the type implied purely by the binding pattern itself From 806c9ce25b1a78ac442b5f6de169b4b02f7a15b2 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 25 Mar 2015 12:08:19 -0700 Subject: [PATCH 11/35] Refactor iterable or array checks into checkIteratedTypeOrElementType --- src/compiler/checker.ts | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 157ed8154c5..c6c0300fd5a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2043,8 +2043,10 @@ module ts { } } else { - // For an array binding element the specified or inferred type of the parent must be an array-like type - if (!isArrayLikeType(parentType)) { + // In a ES3/ES5, we must be destructuring an array type. However, ES6 supports destructuring + // an iterator into an array pattern, so we suppress this error. If the parentType is not an iterator, + // there will be an error in checkIteratedType. + if (languageVersion < ScriptTarget.ES6 && !isArrayLikeType(parentType)) { error(pattern, Diagnostics.Type_0_is_not_an_array_type, typeToString(parentType)); return unknownType; } @@ -5925,16 +5927,7 @@ module ts { function checkSpreadElementExpression(node: SpreadElementExpression, contextualMapper?: TypeMapper): Type { let arrayOrIterableType = checkExpressionCached(node.expression, contextualMapper); - if (languageVersion >= ScriptTarget.ES6) { - return checkIteratedType(arrayOrIterableType, node.expression) || unknownType; - } - - if (isArrayLikeType(arrayOrIterableType)) { - return getIndexTypeOfType(arrayOrIterableType, IndexKind.Number); - } - - error(node.expression, Diagnostics.Type_0_is_not_an_array_type, typeToString(arrayOrIterableType)); - return unknownType; + return checkIteratedTypeOrElementType(arrayOrIterableType, node.expression, /*allowStringInput*/ false); } function checkArrayLiteral(node: ArrayLiteralExpression, contextualMapper?: TypeMapper): Type { @@ -9267,9 +9260,24 @@ module ts { function checkRightHandSideOfForOf(rhsExpression: Expression): Type { let expressionType = getTypeOfExpression(rhsExpression); - return languageVersion >= ScriptTarget.ES6 - ? checkIteratedType(expressionType, rhsExpression) - : checkElementTypeOfArrayOrString(expressionType, rhsExpression); + return checkIteratedTypeOrElementType(expressionType, rhsExpression, /*allowStringInput*/ true); + } + + function checkIteratedTypeOrElementType(inputType: Type, expressionForError: Expression, allowStringInput: boolean): Type { + if (languageVersion >= ScriptTarget.ES6) { + return checkIteratedType(inputType, expressionForError) || anyType; + } + + if (allowStringInput) { + return checkElementTypeOfArrayOrString(inputType, expressionForError); + } + + if (isArrayLikeType(inputType)) { + return getIndexTypeOfType(inputType, IndexKind.Number); + } + + error(expressionForError, Diagnostics.Type_0_is_not_an_array_type, typeToString(inputType)); + return unknownType; } /** From 06d6717859cb065492bfd65552f939ac9f3ed6e7 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 25 Mar 2015 13:35:27 -0700 Subject: [PATCH 12/35] Type of an array binding element is the iterated type of its parent in ES6 --- src/compiler/checker.ts | 48 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c6c0300fd5a..550ffa54103 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2046,14 +2046,12 @@ module ts { // In a ES3/ES5, we must be destructuring an array type. However, ES6 supports destructuring // an iterator into an array pattern, so we suppress this error. If the parentType is not an iterator, // there will be an error in checkIteratedType. - if (languageVersion < ScriptTarget.ES6 && !isArrayLikeType(parentType)) { - error(pattern, Diagnostics.Type_0_is_not_an_array_type, typeToString(parentType)); - return unknownType; - } if (!declaration.dotDotDotToken) { // Use specific property type when parent is a tuple or numeric index type when parent is an array let propName = "" + indexOf(pattern.elements, declaration); - type = isTupleLikeType(parentType) ? getTypeOfPropertyOfType(parentType, propName) : getIndexTypeOfType(parentType, IndexKind.Number); + type = isTupleLikeType(parentType) + ? getTypeOfPropertyOfType(parentType, propName) + : checkIteratedTypeOrElementType(parentType, pattern, /*allowStringInput*/ false); if (!type) { if (isTupleType(parentType)) { error(declaration, Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(parentType), (parentType).elementTypes.length, pattern.elements.length); @@ -2066,7 +2064,7 @@ module ts { } else { // Rest element has an array type with the same element type as the parent type - type = createArrayType(getIndexTypeOfType(parentType, IndexKind.Number)); + type = createArrayType(checkIteratedTypeOrElementType(parentType, pattern, /*allowStringInput*/ false)); } } return type; @@ -9263,38 +9261,38 @@ module ts { return checkIteratedTypeOrElementType(expressionType, rhsExpression, /*allowStringInput*/ true); } - function checkIteratedTypeOrElementType(inputType: Type, expressionForError: Expression, allowStringInput: boolean): Type { + function checkIteratedTypeOrElementType(inputType: Type, errorNode: Node, allowStringInput: boolean): Type { if (languageVersion >= ScriptTarget.ES6) { - return checkIteratedType(inputType, expressionForError) || anyType; + return checkIteratedType(inputType, errorNode) || anyType; } if (allowStringInput) { - return checkElementTypeOfArrayOrString(inputType, expressionForError); + return checkElementTypeOfArrayOrString(inputType, errorNode); } if (isArrayLikeType(inputType)) { return getIndexTypeOfType(inputType, IndexKind.Number); } - error(expressionForError, Diagnostics.Type_0_is_not_an_array_type, typeToString(inputType)); + error(errorNode, Diagnostics.Type_0_is_not_an_array_type, typeToString(inputType)); return unknownType; } /** - * When expressionForError is undefined, it means we should not report any errors. + * When errorNode is undefined, it means we should not report any errors. */ - function checkIteratedType(iterable: Type, expressionForError: Expression): Type { + function checkIteratedType(iterable: Type, errorNode: Node): Type { Debug.assert(languageVersion >= ScriptTarget.ES6); - let iteratedType = getIteratedType(iterable, expressionForError); + let iteratedType = getIteratedType(iterable, errorNode); // Now even though we have extracted the iteratedType, we will have to validate that the type // passed in is actually an Iterable. - if (expressionForError && iteratedType) { - checkTypeAssignableTo(iterable, createIterableType(iteratedType), expressionForError); + if (errorNode && iteratedType) { + checkTypeAssignableTo(iterable, createIterableType(iteratedType), errorNode); } return iteratedType; - function getIteratedType(iterable: Type, expressionForError: Expression) { + function getIteratedType(iterable: Type, errorNode: Node) { // We want to treat type as an iterable, and get the type it is an iterable of. The iterable // must have the following structure (annotated with the names of the variables below): // @@ -9332,8 +9330,8 @@ module ts { let iteratorFunctionSignatures = iteratorFunction ? getSignaturesOfType(iteratorFunction, SignatureKind.Call) : emptyArray; if (iteratorFunctionSignatures.length === 0) { - if (expressionForError) { - error(expressionForError, Diagnostics.Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator); + if (errorNode) { + error(errorNode, Diagnostics.Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator); } return undefined; } @@ -9350,8 +9348,8 @@ module ts { let iteratorNextFunctionSignatures = iteratorNextFunction ? getSignaturesOfType(iteratorNextFunction, SignatureKind.Call) : emptyArray; if (iteratorNextFunctionSignatures.length === 0) { - if (expressionForError) { - error(expressionForError, Diagnostics.An_iterator_must_have_a_next_method); + if (errorNode) { + error(errorNode, Diagnostics.An_iterator_must_have_a_next_method); } return undefined; } @@ -9363,8 +9361,8 @@ module ts { let iteratorNextValue = getTypeOfPropertyOfType(iteratorNextResult, "value"); if (!iteratorNextValue) { - if (expressionForError) { - error(expressionForError, Diagnostics.The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property); + if (errorNode) { + error(errorNode, Diagnostics.The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property); } return undefined; } @@ -9390,7 +9388,7 @@ module ts { * 1. Some constituent is neither a string nor an array. * 2. Some constituent is a string and target is less than ES5 (because in ES3 string is not indexable). */ - function checkElementTypeOfArrayOrString(arrayOrStringType: Type, expressionForError: Expression): Type { + function checkElementTypeOfArrayOrString(arrayOrStringType: Type, errorNode: Node): Type { Debug.assert(languageVersion < ScriptTarget.ES6); // After we remove all types that are StringLike, we will know if there was a string constituent @@ -9401,7 +9399,7 @@ module ts { let reportedError = false; if (hasStringConstituent) { if (languageVersion < ScriptTarget.ES5) { - error(expressionForError, Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher); + error(errorNode, Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher); reportedError = true; } @@ -9421,7 +9419,7 @@ module ts { let diagnostic = hasStringConstituent ? Diagnostics.Type_0_is_not_an_array_type : Diagnostics.Type_0_is_not_an_array_type_or_a_string_type; - error(expressionForError, diagnostic, typeToString(arrayType)); + error(errorNode, diagnostic, typeToString(arrayType)); } return hasStringConstituent ? stringType : unknownType; } From 17d201f92225370bf1a4521c1728bed1beb3f98a Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 25 Mar 2015 15:20:00 -0700 Subject: [PATCH 13/35] Use iterated type in checkArrayLiteralAssignment --- src/compiler/checker.ts | 29 +++++++++++-------- .../reference/ES5For-of30.errors.txt | 8 ++++- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 550ffa54103..841ec0a0716 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2043,15 +2043,20 @@ module ts { } } else { - // In a ES3/ES5, we must be destructuring an array type. However, ES6 supports destructuring - // an iterator into an array pattern, so we suppress this error. If the parentType is not an iterator, - // there will be an error in checkIteratedType. + // This elementType will be used if the specific property corresponding to this index is not + // present (aka the tuple element property). This call also checks that the parentType is in + // fact an iterable or array (depending on target language). + let elementType = checkIteratedTypeOrElementType(parentType, pattern, /*allowStringInput*/ false); if (!declaration.dotDotDotToken) { + if (elementType.flags & TypeFlags.Any) { + return elementType; + } + // Use specific property type when parent is a tuple or numeric index type when parent is an array let propName = "" + indexOf(pattern.elements, declaration); type = isTupleLikeType(parentType) ? getTypeOfPropertyOfType(parentType, propName) - : checkIteratedTypeOrElementType(parentType, pattern, /*allowStringInput*/ false); + : elementType; if (!type) { if (isTupleType(parentType)) { error(declaration, Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(parentType), (parentType).elementTypes.length, pattern.elements.length); @@ -2064,7 +2069,7 @@ module ts { } else { // Rest element has an array type with the same element type as the parent type - type = createArrayType(checkIteratedTypeOrElementType(parentType, pattern, /*allowStringInput*/ false)); + type = createArrayType(elementType); } } return type; @@ -7551,11 +7556,10 @@ module ts { } function checkArrayLiteralAssignment(node: ArrayLiteralExpression, sourceType: Type, contextualMapper?: TypeMapper): Type { - // TODOO(andersh): Allow iterable source type in ES6 - if (!isArrayLikeType(sourceType)) { - error(node, Diagnostics.Type_0_is_not_an_array_type, typeToString(sourceType)); - return sourceType; - } + // This elementType will be used if the specific property corresponding to this index is not + // present (aka the tuple element property). This call also checks that the parentType is in + // fact an iterable or array (depending on target language). + let elementType = checkIteratedTypeOrElementType(sourceType, node, /*allowStringInput*/ false); let elements = node.elements; for (let i = 0; i < elements.length; i++) { let e = elements[i]; @@ -7563,8 +7567,9 @@ module ts { if (e.kind !== SyntaxKind.SpreadElementExpression) { let propName = "" + i; let type = sourceType.flags & TypeFlags.Any ? sourceType : - isTupleLikeType(sourceType) ? getTypeOfPropertyOfType(sourceType, propName) : - getIndexTypeOfType(sourceType, IndexKind.Number); + isTupleLikeType(sourceType) + ? getTypeOfPropertyOfType(sourceType, propName) + : elementType; if (type) { checkDestructuringAssignment(e, type, contextualMapper); } diff --git a/tests/baselines/reference/ES5For-of30.errors.txt b/tests/baselines/reference/ES5For-of30.errors.txt index 0b02a55ba3f..e99b8284bf3 100644 --- a/tests/baselines/reference/ES5For-of30.errors.txt +++ b/tests/baselines/reference/ES5For-of30.errors.txt @@ -1,12 +1,18 @@ tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,6): error TS2461: Type 'string | number' is not an array type. +tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,7): error TS2322: Type 'number' is not assignable to type 'string'. +tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,14): error TS2322: Type 'string' is not assignable to type 'number'. -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts (1 errors) ==== +==== tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts (3 errors) ==== var a: string, b: number; var tuple: [number, string] = [2, "3"]; for ([a = 1, b = ""] of tuple) { ~~~~~~~~~~~~~~~ !!! error TS2461: Type 'string | number' is not an array type. + ~ +!!! error TS2322: Type 'number' is not assignable to type 'string'. + ~ +!!! error TS2322: Type 'string' is not assignable to type 'number'. a; b; } \ No newline at end of file From 6b2d5ceb7c40533cdb82617d38e78c9d0cd866a9 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 25 Mar 2015 15:21:00 -0700 Subject: [PATCH 14/35] Wrap elementType in createArrayType for rest element in checkArrayLiteralAssignment --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 841ec0a0716..dc05154e223 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7584,7 +7584,7 @@ module ts { } else { if (i === elements.length - 1) { - checkReferenceAssignment((e).expression, sourceType, contextualMapper); + checkReferenceAssignment((e).expression, createArrayType(elementType), contextualMapper); } else { error(e, Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern); From a477b63420407985b2df252604946d600cbdc4c3 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 25 Mar 2015 17:20:51 -0700 Subject: [PATCH 15/35] Adjust getTypeFromArrayBindingPattern to return an array if inside a rest parameter --- src/compiler/checker.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index dc05154e223..2eb2470f027 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2162,8 +2162,26 @@ module ts { return languageVersion >= ScriptTarget.ES6 ? createIterableType(anyType) : anyArrayType; } else if (hasSpreadElement) { - var unionOfElements = getUnionType(elementTypes); - return languageVersion >= ScriptTarget.ES6 ? createIterableType(unionOfElements) : createArrayType(unionOfElements); + let unionOfElements = getUnionType(elementTypes); + if (languageVersion >= ScriptTarget.ES6) { + // If the user has something like: + // + // function fun(...[a, ...b]) { } + // + // Normally, in ES6, the implied type of an array binding pattern with a rest element is + // an iterable. However, there is a requirement in our grammar checker that all rest + // parameters be array types. To satisfy this, we have an exception to the rule that + // says the type of an array binding pattern with a rest element is an array type + // if it is *itself* in a rest parameter. It will still be compatible with a spreaded + // iterable argument, but within the function it will be an array. + let parent = pattern.parent; + let isRestParameter = parent.kind === SyntaxKind.Parameter && + pattern === (parent).name && + (parent).dotDotDotToken !== undefined; + return isRestParameter ? createArrayType(unionOfElements) : createIterableType(unionOfElements); + } + + return createArrayType(unionOfElements); } // If the pattern has at least one element, and no rest element, then it should imply a tuple type. From e1f2fbff63cb6835dd557e4aa20b092145ce005c Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 25 Mar 2015 17:36:47 -0700 Subject: [PATCH 16/35] Add tests for array destructuring of iterables --- .../reference/iterableArrayPattern1.js | 28 +++++++++ .../reference/iterableArrayPattern1.types | 36 +++++++++++ .../iterableArrayPattern10.errors.txt | 24 ++++++++ .../reference/iterableArrayPattern10.js | 37 +++++++++++ .../reference/iterableArrayPattern11.js | 37 +++++++++++ .../reference/iterableArrayPattern11.types | 52 ++++++++++++++++ .../reference/iterableArrayPattern12.js | 37 +++++++++++ .../reference/iterableArrayPattern12.types | 52 ++++++++++++++++ .../reference/iterableArrayPattern13.js | 37 +++++++++++ .../reference/iterableArrayPattern13.types | 50 +++++++++++++++ .../reference/iterableArrayPattern14.js | 37 +++++++++++ .../reference/iterableArrayPattern14.types | 50 +++++++++++++++ .../reference/iterableArrayPattern15.js | 37 +++++++++++ .../reference/iterableArrayPattern15.types | 52 ++++++++++++++++ .../iterableArrayPattern16.errors.txt | 37 +++++++++++ .../reference/iterableArrayPattern16.js | 61 +++++++++++++++++++ .../iterableArrayPattern17.errors.txt | 24 ++++++++ .../reference/iterableArrayPattern17.js | 37 +++++++++++ .../iterableArrayPattern18.errors.txt | 24 ++++++++ .../reference/iterableArrayPattern18.js | 37 +++++++++++ .../iterableArrayPattern19.errors.txt | 24 ++++++++ .../reference/iterableArrayPattern19.js | 39 ++++++++++++ .../reference/iterableArrayPattern2.js | 28 +++++++++ .../reference/iterableArrayPattern2.types | 36 +++++++++++ .../reference/iterableArrayPattern20.js | 41 +++++++++++++ .../reference/iterableArrayPattern20.types | 58 ++++++++++++++++++ .../iterableArrayPattern21.errors.txt | 7 +++ .../reference/iterableArrayPattern21.js | 8 +++ .../iterableArrayPattern22.errors.txt | 7 +++ .../reference/iterableArrayPattern22.js | 8 +++ .../iterableArrayPattern23.errors.txt | 8 +++ .../reference/iterableArrayPattern23.js | 13 ++++ .../iterableArrayPattern24.errors.txt | 8 +++ .../reference/iterableArrayPattern24.js | 13 ++++ .../iterableArrayPattern25.errors.txt | 8 +++ .../reference/iterableArrayPattern25.js | 17 ++++++ .../iterableArrayPattern26.errors.txt | 10 +++ .../reference/iterableArrayPattern26.js | 17 ++++++ .../reference/iterableArrayPattern27.js | 17 ++++++ .../reference/iterableArrayPattern27.types | 18 ++++++ .../iterableArrayPattern28.errors.txt | 10 +++ .../reference/iterableArrayPattern28.js | 17 ++++++ .../iterableArrayPattern29.errors.txt | 12 ++++ .../reference/iterableArrayPattern29.js | 17 ++++++ .../reference/iterableArrayPattern3.js | 39 ++++++++++++ .../reference/iterableArrayPattern3.types | 53 ++++++++++++++++ .../reference/iterableArrayPattern30.js | 14 +++++ .../reference/iterableArrayPattern30.types | 12 ++++ .../reference/iterableArrayPattern4.js | 39 ++++++++++++ .../reference/iterableArrayPattern4.types | 54 ++++++++++++++++ .../iterableArrayPattern5.errors.txt | 22 +++++++ .../reference/iterableArrayPattern5.js | 39 ++++++++++++ .../iterableArrayPattern6.errors.txt | 24 ++++++++ .../reference/iterableArrayPattern6.js | 39 ++++++++++++ .../iterableArrayPattern7.errors.txt | 24 ++++++++ .../reference/iterableArrayPattern7.js | 39 ++++++++++++ .../iterableArrayPattern8.errors.txt | 22 +++++++ .../reference/iterableArrayPattern8.js | 39 ++++++++++++ .../reference/iterableArrayPattern9.js | 35 +++++++++++ .../reference/iterableArrayPattern9.types | 46 ++++++++++++++ .../destructuring/iterableArrayPattern1.ts | 14 +++++ .../destructuring/iterableArrayPattern10.ts | 17 ++++++ .../destructuring/iterableArrayPattern11.ts | 17 ++++++ .../destructuring/iterableArrayPattern12.ts | 17 ++++++ .../destructuring/iterableArrayPattern13.ts | 17 ++++++ .../destructuring/iterableArrayPattern14.ts | 17 ++++++ .../destructuring/iterableArrayPattern15.ts | 17 ++++++ .../destructuring/iterableArrayPattern16.ts | 30 +++++++++ .../destructuring/iterableArrayPattern17.ts | 17 ++++++ .../destructuring/iterableArrayPattern18.ts | 17 ++++++ .../destructuring/iterableArrayPattern19.ts | 17 ++++++ .../destructuring/iterableArrayPattern2.ts | 14 +++++ .../destructuring/iterableArrayPattern20.ts | 17 ++++++ .../destructuring/iterableArrayPattern21.ts | 2 + .../destructuring/iterableArrayPattern22.ts | 2 + .../destructuring/iterableArrayPattern23.ts | 3 + .../destructuring/iterableArrayPattern24.ts | 3 + .../destructuring/iterableArrayPattern25.ts | 3 + .../destructuring/iterableArrayPattern26.ts | 3 + .../destructuring/iterableArrayPattern27.ts | 3 + .../destructuring/iterableArrayPattern28.ts | 3 + .../destructuring/iterableArrayPattern29.ts | 3 + .../destructuring/iterableArrayPattern3.ts | 17 ++++++ .../destructuring/iterableArrayPattern30.ts | 2 + .../destructuring/iterableArrayPattern4.ts | 17 ++++++ .../destructuring/iterableArrayPattern5.ts | 17 ++++++ .../destructuring/iterableArrayPattern6.ts | 17 ++++++ .../destructuring/iterableArrayPattern7.ts | 17 ++++++ .../destructuring/iterableArrayPattern8.ts | 17 ++++++ .../destructuring/iterableArrayPattern9.ts | 16 +++++ 90 files changed, 2140 insertions(+) create mode 100644 tests/baselines/reference/iterableArrayPattern1.js create mode 100644 tests/baselines/reference/iterableArrayPattern1.types create mode 100644 tests/baselines/reference/iterableArrayPattern10.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern10.js create mode 100644 tests/baselines/reference/iterableArrayPattern11.js create mode 100644 tests/baselines/reference/iterableArrayPattern11.types create mode 100644 tests/baselines/reference/iterableArrayPattern12.js create mode 100644 tests/baselines/reference/iterableArrayPattern12.types create mode 100644 tests/baselines/reference/iterableArrayPattern13.js create mode 100644 tests/baselines/reference/iterableArrayPattern13.types create mode 100644 tests/baselines/reference/iterableArrayPattern14.js create mode 100644 tests/baselines/reference/iterableArrayPattern14.types create mode 100644 tests/baselines/reference/iterableArrayPattern15.js create mode 100644 tests/baselines/reference/iterableArrayPattern15.types create mode 100644 tests/baselines/reference/iterableArrayPattern16.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern16.js create mode 100644 tests/baselines/reference/iterableArrayPattern17.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern17.js create mode 100644 tests/baselines/reference/iterableArrayPattern18.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern18.js create mode 100644 tests/baselines/reference/iterableArrayPattern19.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern19.js create mode 100644 tests/baselines/reference/iterableArrayPattern2.js create mode 100644 tests/baselines/reference/iterableArrayPattern2.types create mode 100644 tests/baselines/reference/iterableArrayPattern20.js create mode 100644 tests/baselines/reference/iterableArrayPattern20.types create mode 100644 tests/baselines/reference/iterableArrayPattern21.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern21.js create mode 100644 tests/baselines/reference/iterableArrayPattern22.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern22.js create mode 100644 tests/baselines/reference/iterableArrayPattern23.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern23.js create mode 100644 tests/baselines/reference/iterableArrayPattern24.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern24.js create mode 100644 tests/baselines/reference/iterableArrayPattern25.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern25.js create mode 100644 tests/baselines/reference/iterableArrayPattern26.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern26.js create mode 100644 tests/baselines/reference/iterableArrayPattern27.js create mode 100644 tests/baselines/reference/iterableArrayPattern27.types create mode 100644 tests/baselines/reference/iterableArrayPattern28.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern28.js create mode 100644 tests/baselines/reference/iterableArrayPattern29.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern29.js create mode 100644 tests/baselines/reference/iterableArrayPattern3.js create mode 100644 tests/baselines/reference/iterableArrayPattern3.types create mode 100644 tests/baselines/reference/iterableArrayPattern30.js create mode 100644 tests/baselines/reference/iterableArrayPattern30.types create mode 100644 tests/baselines/reference/iterableArrayPattern4.js create mode 100644 tests/baselines/reference/iterableArrayPattern4.types create mode 100644 tests/baselines/reference/iterableArrayPattern5.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern5.js create mode 100644 tests/baselines/reference/iterableArrayPattern6.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern6.js create mode 100644 tests/baselines/reference/iterableArrayPattern7.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern7.js create mode 100644 tests/baselines/reference/iterableArrayPattern8.errors.txt create mode 100644 tests/baselines/reference/iterableArrayPattern8.js create mode 100644 tests/baselines/reference/iterableArrayPattern9.js create mode 100644 tests/baselines/reference/iterableArrayPattern9.types create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern1.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern10.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern11.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern12.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern13.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern14.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern15.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern16.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern17.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern18.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern19.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern2.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern20.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern21.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern22.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern23.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern24.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern26.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern27.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern28.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern29.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern3.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern30.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern4.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern5.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern6.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern7.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern8.ts create mode 100644 tests/cases/conformance/es6/destructuring/iterableArrayPattern9.ts diff --git a/tests/baselines/reference/iterableArrayPattern1.js b/tests/baselines/reference/iterableArrayPattern1.js new file mode 100644 index 00000000000..b45ac92d1fd --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern1.js @@ -0,0 +1,28 @@ +//// [iterableArrayPattern1.ts] +var [a, b] = new SymbolIterator; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern1.js] +var [a, b] = new SymbolIterator; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern1.types b/tests/baselines/reference/iterableArrayPattern1.types new file mode 100644 index 00000000000..8be8521c684 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern1.types @@ -0,0 +1,36 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern1.ts === +var [a, b] = new SymbolIterator; +>a : symbol +>b : symbol +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern10.errors.txt b/tests/baselines/reference/iterableArrayPattern10.errors.txt new file mode 100644 index 00000000000..f06c4d7de17 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern10.errors.txt @@ -0,0 +1,24 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern10.ts(2,5): error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type '[any, any]'. + Property '0' is missing in type 'FooIterator'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern10.ts (1 errors) ==== + function fun([a, b]) { } + fun(new FooIterator); + ~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type '[any, any]'. +!!! error TS2345: Property '0' is missing in type 'FooIterator'. + class Bar { x } + class Foo extends Bar { y } + class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern10.js b/tests/baselines/reference/iterableArrayPattern10.js new file mode 100644 index 00000000000..2e532e2b773 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern10.js @@ -0,0 +1,37 @@ +//// [iterableArrayPattern10.ts] +function fun([a, b]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern10.js] +function fun([a, b]) { +} +fun(new FooIterator); +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern11.js b/tests/baselines/reference/iterableArrayPattern11.js new file mode 100644 index 00000000000..a3940edc362 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern11.js @@ -0,0 +1,37 @@ +//// [iterableArrayPattern11.ts] +function fun([a, b] = new FooIterator) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern11.js] +function fun([a, b] = new FooIterator) { +} +fun(new FooIterator); +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern11.types b/tests/baselines/reference/iterableArrayPattern11.types new file mode 100644 index 00000000000..2b6f1d67336 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern11.types @@ -0,0 +1,52 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern11.ts === +function fun([a, b] = new FooIterator) { } +>fun : ([a, b]?: FooIterator) => void +>a : Foo +>b : Foo +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +fun(new FooIterator); +>fun(new FooIterator) : void +>fun : ([a, b]?: FooIterator) => void +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +class Bar { x } +>Bar : Bar +>x : any + +class Foo extends Bar { y } +>Foo : Foo +>Bar : Bar +>y : any + +class FooIterator { +>FooIterator : FooIterator + + next() { +>next : () => { value: Foo; done: boolean; } + + return { +>{ value: new Foo, done: false } : { value: Foo; done: boolean; } + + value: new Foo, +>value : Foo +>new Foo : Foo +>Foo : typeof Foo + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : FooIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern12.js b/tests/baselines/reference/iterableArrayPattern12.js new file mode 100644 index 00000000000..64581c54251 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern12.js @@ -0,0 +1,37 @@ +//// [iterableArrayPattern12.ts] +function fun([a, ...b] = new FooIterator) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern12.js] +function fun([a, ...b] = new FooIterator) { +} +fun(new FooIterator); +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern12.types b/tests/baselines/reference/iterableArrayPattern12.types new file mode 100644 index 00000000000..a415539b91c --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern12.types @@ -0,0 +1,52 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern12.ts === +function fun([a, ...b] = new FooIterator) { } +>fun : ([a, ...b]?: FooIterator) => void +>a : Foo +>b : Foo[] +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +fun(new FooIterator); +>fun(new FooIterator) : void +>fun : ([a, ...b]?: FooIterator) => void +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +class Bar { x } +>Bar : Bar +>x : any + +class Foo extends Bar { y } +>Foo : Foo +>Bar : Bar +>y : any + +class FooIterator { +>FooIterator : FooIterator + + next() { +>next : () => { value: Foo; done: boolean; } + + return { +>{ value: new Foo, done: false } : { value: Foo; done: boolean; } + + value: new Foo, +>value : Foo +>new Foo : Foo +>Foo : typeof Foo + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : FooIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern13.js b/tests/baselines/reference/iterableArrayPattern13.js new file mode 100644 index 00000000000..f4ea18d4fec --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern13.js @@ -0,0 +1,37 @@ +//// [iterableArrayPattern13.ts] +function fun([a, ...b]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern13.js] +function fun([a, ...b]) { +} +fun(new FooIterator); +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern13.types b/tests/baselines/reference/iterableArrayPattern13.types new file mode 100644 index 00000000000..dbfbf9a1ebc --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern13.types @@ -0,0 +1,50 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern13.ts === +function fun([a, ...b]) { } +>fun : ([a, ...b]: Iterable) => void +>a : any +>b : any[] + +fun(new FooIterator); +>fun(new FooIterator) : void +>fun : ([a, ...b]: Iterable) => void +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +class Bar { x } +>Bar : Bar +>x : any + +class Foo extends Bar { y } +>Foo : Foo +>Bar : Bar +>y : any + +class FooIterator { +>FooIterator : FooIterator + + next() { +>next : () => { value: Foo; done: boolean; } + + return { +>{ value: new Foo, done: false } : { value: Foo; done: boolean; } + + value: new Foo, +>value : Foo +>new Foo : Foo +>Foo : typeof Foo + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : FooIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern14.js b/tests/baselines/reference/iterableArrayPattern14.js new file mode 100644 index 00000000000..81b2c66f14d --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern14.js @@ -0,0 +1,37 @@ +//// [iterableArrayPattern14.ts] +function fun(...[a, ...b]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern14.js] +function fun(...[a, ...b]) { +} +fun(new FooIterator); +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern14.types b/tests/baselines/reference/iterableArrayPattern14.types new file mode 100644 index 00000000000..3f73f2973d1 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern14.types @@ -0,0 +1,50 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern14.ts === +function fun(...[a, ...b]) { } +>fun : (...[a, ...b]: any[]) => void +>a : any +>b : any[] + +fun(new FooIterator); +>fun(new FooIterator) : void +>fun : (...[a, ...b]: any[]) => void +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +class Bar { x } +>Bar : Bar +>x : any + +class Foo extends Bar { y } +>Foo : Foo +>Bar : Bar +>y : any + +class FooIterator { +>FooIterator : FooIterator + + next() { +>next : () => { value: Foo; done: boolean; } + + return { +>{ value: new Foo, done: false } : { value: Foo; done: boolean; } + + value: new Foo, +>value : Foo +>new Foo : Foo +>Foo : typeof Foo + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : FooIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern15.js b/tests/baselines/reference/iterableArrayPattern15.js new file mode 100644 index 00000000000..fcb5ec82508 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern15.js @@ -0,0 +1,37 @@ +//// [iterableArrayPattern15.ts] +function fun(...[a, b]: Bar[]) { } +fun(...new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern15.js] +function fun(...[a, b]) { +} +fun(...new FooIterator); +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern15.types b/tests/baselines/reference/iterableArrayPattern15.types new file mode 100644 index 00000000000..de548a91c26 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern15.types @@ -0,0 +1,52 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern15.ts === +function fun(...[a, b]: Bar[]) { } +>fun : (...[a, b]: Bar[]) => void +>a : Bar +>b : Bar +>Bar : Bar + +fun(...new FooIterator); +>fun(...new FooIterator) : void +>fun : (...[a, b]: Bar[]) => void +>...new FooIterator : Foo +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +class Bar { x } +>Bar : Bar +>x : any + +class Foo extends Bar { y } +>Foo : Foo +>Bar : Bar +>y : any + +class FooIterator { +>FooIterator : FooIterator + + next() { +>next : () => { value: Foo; done: boolean; } + + return { +>{ value: new Foo, done: false } : { value: Foo; done: boolean; } + + value: new Foo, +>value : Foo +>new Foo : Foo +>Foo : typeof Foo + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : FooIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern16.errors.txt b/tests/baselines/reference/iterableArrayPattern16.errors.txt new file mode 100644 index 00000000000..42236140be7 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern16.errors.txt @@ -0,0 +1,37 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern16.ts(2,5): error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type '[Bar, Bar]'. + Property '0' is missing in type 'FooIterator'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern16.ts (1 errors) ==== + function fun(...[a, b]: [Bar, Bar][]) { } + fun(...new FooIteratorIterator); + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type '[Bar, Bar]'. +!!! error TS2345: Property '0' is missing in type 'FooIterator'. + class Bar { x } + class Foo extends Bar { y } + class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } + + class FooIteratorIterator { + next() { + return { + value: new FooIterator, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern16.js b/tests/baselines/reference/iterableArrayPattern16.js new file mode 100644 index 00000000000..d3127991799 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern16.js @@ -0,0 +1,61 @@ +//// [iterableArrayPattern16.ts] +function fun(...[a, b]: [Bar, Bar][]) { } +fun(...new FooIteratorIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class FooIteratorIterator { + next() { + return { + value: new FooIterator, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern16.js] +function fun(...[a, b]) { +} +fun(...new FooIteratorIterator); +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} +class FooIteratorIterator { + next() { + return { + value: new FooIterator, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern17.errors.txt b/tests/baselines/reference/iterableArrayPattern17.errors.txt new file mode 100644 index 00000000000..306b00ea990 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern17.errors.txt @@ -0,0 +1,24 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern17.ts(2,5): error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type 'Bar'. + Property 'x' is missing in type 'FooIterator'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern17.ts (1 errors) ==== + function fun(...[a, b]: Bar[]) { } + fun(new FooIterator); + ~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type 'Bar'. +!!! error TS2345: Property 'x' is missing in type 'FooIterator'. + class Bar { x } + class Foo extends Bar { y } + class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern17.js b/tests/baselines/reference/iterableArrayPattern17.js new file mode 100644 index 00000000000..db5c4001c88 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern17.js @@ -0,0 +1,37 @@ +//// [iterableArrayPattern17.ts] +function fun(...[a, b]: Bar[]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern17.js] +function fun(...[a, b]) { +} +fun(new FooIterator); +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern18.errors.txt b/tests/baselines/reference/iterableArrayPattern18.errors.txt new file mode 100644 index 00000000000..c6f8c5e28bd --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern18.errors.txt @@ -0,0 +1,24 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern18.ts(2,5): error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type 'Bar[]'. + Property 'length' is missing in type 'FooIterator'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern18.ts (1 errors) ==== + function fun([a, b]: Bar[]) { } + fun(new FooIterator); + ~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type 'Bar[]'. +!!! error TS2345: Property 'length' is missing in type 'FooIterator'. + class Bar { x } + class Foo extends Bar { y } + class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern18.js b/tests/baselines/reference/iterableArrayPattern18.js new file mode 100644 index 00000000000..3e13f2ef619 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern18.js @@ -0,0 +1,37 @@ +//// [iterableArrayPattern18.ts] +function fun([a, b]: Bar[]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern18.js] +function fun([a, b]) { +} +fun(new FooIterator); +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern19.errors.txt b/tests/baselines/reference/iterableArrayPattern19.errors.txt new file mode 100644 index 00000000000..3f8b550d287 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern19.errors.txt @@ -0,0 +1,24 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern19.ts(2,5): error TS2345: Argument of type 'FooArrayIterator' is not assignable to parameter of type 'Bar[][]'. + Property 'length' is missing in type 'FooArrayIterator'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern19.ts (1 errors) ==== + function fun([[a], b]: Bar[][]) { } + fun(new FooArrayIterator); + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type 'FooArrayIterator' is not assignable to parameter of type 'Bar[][]'. +!!! error TS2345: Property 'length' is missing in type 'FooArrayIterator'. + class Bar { x } + class Foo extends Bar { y } + class FooArrayIterator { + next() { + return { + value: [new Foo], + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern19.js b/tests/baselines/reference/iterableArrayPattern19.js new file mode 100644 index 00000000000..60ace366eb7 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern19.js @@ -0,0 +1,39 @@ +//// [iterableArrayPattern19.ts] +function fun([[a], b]: Bar[][]) { } +fun(new FooArrayIterator); +class Bar { x } +class Foo extends Bar { y } +class FooArrayIterator { + next() { + return { + value: [new Foo], + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern19.js] +function fun([[a], b]) { +} +fun(new FooArrayIterator); +class Bar { +} +class Foo extends Bar { +} +class FooArrayIterator { + next() { + return { + value: [ + new Foo + ], + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern2.js b/tests/baselines/reference/iterableArrayPattern2.js new file mode 100644 index 00000000000..7392db7d6b2 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern2.js @@ -0,0 +1,28 @@ +//// [iterableArrayPattern2.ts] +var [a, ...b] = new SymbolIterator; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern2.js] +var [a, ...b] = new SymbolIterator; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern2.types b/tests/baselines/reference/iterableArrayPattern2.types new file mode 100644 index 00000000000..819516dfe05 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern2.types @@ -0,0 +1,36 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern2.ts === +var [a, ...b] = new SymbolIterator; +>a : symbol +>b : symbol[] +>new SymbolIterator : SymbolIterator +>SymbolIterator : typeof SymbolIterator + +class SymbolIterator { +>SymbolIterator : SymbolIterator + + next() { +>next : () => { value: symbol; done: boolean; } + + return { +>{ value: Symbol(), done: false } : { value: symbol; done: boolean; } + + value: Symbol(), +>value : symbol +>Symbol() : symbol +>Symbol : SymbolConstructor + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : SymbolIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern20.js b/tests/baselines/reference/iterableArrayPattern20.js new file mode 100644 index 00000000000..271a35b791d --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern20.js @@ -0,0 +1,41 @@ +//// [iterableArrayPattern20.ts] +function fun(...[[a = new Foo], b = [new Foo]]: Bar[][]) { } +fun(...new FooArrayIterator); +class Bar { x } +class Foo extends Bar { y } +class FooArrayIterator { + next() { + return { + value: [new Foo], + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern20.js] +function fun(...[[a = new Foo], b = [ + new Foo + ]]) { +} +fun(...new FooArrayIterator); +class Bar { +} +class Foo extends Bar { +} +class FooArrayIterator { + next() { + return { + value: [ + new Foo + ], + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern20.types b/tests/baselines/reference/iterableArrayPattern20.types new file mode 100644 index 00000000000..055dfa95859 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern20.types @@ -0,0 +1,58 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern20.ts === +function fun(...[[a = new Foo], b = [new Foo]]: Bar[][]) { } +>fun : (...[[a = new Foo], b = [new Foo]]: Bar[][]) => void +>a : Bar +>new Foo : Foo +>Foo : typeof Foo +>b : Bar[] +>[new Foo] : Foo[] +>new Foo : Foo +>Foo : typeof Foo +>Bar : Bar + +fun(...new FooArrayIterator); +>fun(...new FooArrayIterator) : void +>fun : (...[[a = new Foo], b = [new Foo]]: Bar[][]) => void +>...new FooArrayIterator : Foo[] +>new FooArrayIterator : FooArrayIterator +>FooArrayIterator : typeof FooArrayIterator + +class Bar { x } +>Bar : Bar +>x : any + +class Foo extends Bar { y } +>Foo : Foo +>Bar : Bar +>y : any + +class FooArrayIterator { +>FooArrayIterator : FooArrayIterator + + next() { +>next : () => { value: Foo[]; done: boolean; } + + return { +>{ value: [new Foo], done: false } : { value: Foo[]; done: boolean; } + + value: [new Foo], +>value : Foo[] +>[new Foo] : Foo[] +>new Foo : Foo +>Foo : typeof Foo + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : FooArrayIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern21.errors.txt b/tests/baselines/reference/iterableArrayPattern21.errors.txt new file mode 100644 index 00000000000..7e853c90b24 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern21.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern21.ts(1,5): error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern21.ts (1 errors) ==== + var [a, b] = { 0: "", 1: true }; + ~~~~~~ +!!! error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern21.js b/tests/baselines/reference/iterableArrayPattern21.js new file mode 100644 index 00000000000..f226406ec63 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern21.js @@ -0,0 +1,8 @@ +//// [iterableArrayPattern21.ts] +var [a, b] = { 0: "", 1: true }; + +//// [iterableArrayPattern21.js] +var [a, b] = { + 0: "", + 1: true +}; diff --git a/tests/baselines/reference/iterableArrayPattern22.errors.txt b/tests/baselines/reference/iterableArrayPattern22.errors.txt new file mode 100644 index 00000000000..3e40e4fd602 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern22.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern22.ts(1,5): error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern22.ts (1 errors) ==== + var [...a] = { 0: "", 1: true }; + ~~~~~~ +!!! error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern22.js b/tests/baselines/reference/iterableArrayPattern22.js new file mode 100644 index 00000000000..9c3afc0ffe5 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern22.js @@ -0,0 +1,8 @@ +//// [iterableArrayPattern22.ts] +var [...a] = { 0: "", 1: true }; + +//// [iterableArrayPattern22.js] +var [...a] = { + 0: "", + 1: true +}; diff --git a/tests/baselines/reference/iterableArrayPattern23.errors.txt b/tests/baselines/reference/iterableArrayPattern23.errors.txt new file mode 100644 index 00000000000..1df5d909aed --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern23.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern23.ts(2,1): error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern23.ts (1 errors) ==== + var a: string, b: boolean; + [a, b] = { 0: "", 1: true }; + ~~~~~~ +!!! error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern23.js b/tests/baselines/reference/iterableArrayPattern23.js new file mode 100644 index 00000000000..ffeb1abe32e --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern23.js @@ -0,0 +1,13 @@ +//// [iterableArrayPattern23.ts] +var a: string, b: boolean; +[a, b] = { 0: "", 1: true }; + +//// [iterableArrayPattern23.js] +var a, b; +[ + a, + b +] = { + 0: "", + 1: true +}; diff --git a/tests/baselines/reference/iterableArrayPattern24.errors.txt b/tests/baselines/reference/iterableArrayPattern24.errors.txt new file mode 100644 index 00000000000..e954c59f2ea --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern24.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern24.ts(2,1): error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern24.ts (1 errors) ==== + var a: string, b: boolean[]; + [a, ...b] = { 0: "", 1: true }; + ~~~~~~~~~ +!!! error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator. \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern24.js b/tests/baselines/reference/iterableArrayPattern24.js new file mode 100644 index 00000000000..89cc3e2dc99 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern24.js @@ -0,0 +1,13 @@ +//// [iterableArrayPattern24.ts] +var a: string, b: boolean[]; +[a, ...b] = { 0: "", 1: true }; + +//// [iterableArrayPattern24.js] +var a, b; +[ + a, + ...b +] = { + 0: "", + 1: true +}; diff --git a/tests/baselines/reference/iterableArrayPattern25.errors.txt b/tests/baselines/reference/iterableArrayPattern25.errors.txt new file mode 100644 index 00000000000..cc901523b55 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern25.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts(1,30): error TS2370: A rest parameter must be of an array type. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts (1 errors) ==== + function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { } + ~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2370: A rest parameter must be of an array type. + takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern25.js b/tests/baselines/reference/iterableArrayPattern25.js new file mode 100644 index 00000000000..63686f5a39e --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern25.js @@ -0,0 +1,17 @@ +//// [iterableArrayPattern25.ts] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { } +takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); + +//// [iterableArrayPattern25.js] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { +} +takeFirstTwoEntries(new Map([ + [ + "", + 0 + ], + [ + "hello", + 1 + ] +])); diff --git a/tests/baselines/reference/iterableArrayPattern26.errors.txt b/tests/baselines/reference/iterableArrayPattern26.errors.txt new file mode 100644 index 00000000000..9fb3e688039 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern26.errors.txt @@ -0,0 +1,10 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern26.ts(2,21): error TS2345: Argument of type 'Map' is not assignable to parameter of type '[string, number]'. + Property '0' is missing in type 'Map'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern26.ts (1 errors) ==== + function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } + takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type 'Map' is not assignable to parameter of type '[string, number]'. +!!! error TS2345: Property '0' is missing in type 'Map'. \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern26.js b/tests/baselines/reference/iterableArrayPattern26.js new file mode 100644 index 00000000000..7edcf52b6ba --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern26.js @@ -0,0 +1,17 @@ +//// [iterableArrayPattern26.ts] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } +takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); + +//// [iterableArrayPattern26.js] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { +} +takeFirstTwoEntries(new Map([ + [ + "", + 0 + ], + [ + "hello", + 1 + ] +])); diff --git a/tests/baselines/reference/iterableArrayPattern27.js b/tests/baselines/reference/iterableArrayPattern27.js new file mode 100644 index 00000000000..2d8a7e9d76e --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern27.js @@ -0,0 +1,17 @@ +//// [iterableArrayPattern27.ts] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } +takeFirstTwoEntries(...new Map([["", 0], ["hello", 1]])); + +//// [iterableArrayPattern27.js] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { +} +takeFirstTwoEntries(...new Map([ + [ + "", + 0 + ], + [ + "hello", + 1 + ] +])); diff --git a/tests/baselines/reference/iterableArrayPattern27.types b/tests/baselines/reference/iterableArrayPattern27.types new file mode 100644 index 00000000000..72d13ee0e00 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern27.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern27.ts === +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } +>takeFirstTwoEntries : (...[[k1, v1], [k2, v2]]: [string, number][]) => void +>k1 : string +>v1 : number +>k2 : string +>v2 : number + +takeFirstTwoEntries(...new Map([["", 0], ["hello", 1]])); +>takeFirstTwoEntries(...new Map([["", 0], ["hello", 1]])) : void +>takeFirstTwoEntries : (...[[k1, v1], [k2, v2]]: [string, number][]) => void +>...new Map([["", 0], ["hello", 1]]) : [string, number] +>new Map([["", 0], ["hello", 1]]) : Map +>Map : MapConstructor +>[["", 0], ["hello", 1]] : [string, number][] +>["", 0] : [string, number] +>["hello", 1] : [string, number] + diff --git a/tests/baselines/reference/iterableArrayPattern28.errors.txt b/tests/baselines/reference/iterableArrayPattern28.errors.txt new file mode 100644 index 00000000000..0190dd939e8 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern28.errors.txt @@ -0,0 +1,10 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern28.ts(2,28): error TS2453: The type argument for type parameter 'V' cannot be inferred from the usage. Consider specifying the type arguments explicitly. + Type argument candidate 'number' is not a valid type argument because it is not a supertype of candidate 'boolean'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern28.ts (1 errors) ==== + function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } + takeFirstTwoEntries(...new Map([["", 0], ["hello", true]])); + ~~~ +!!! error TS2453: The type argument for type parameter 'V' cannot be inferred from the usage. Consider specifying the type arguments explicitly. +!!! error TS2453: Type argument candidate 'number' is not a valid type argument because it is not a supertype of candidate 'boolean'. \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern28.js b/tests/baselines/reference/iterableArrayPattern28.js new file mode 100644 index 00000000000..03e9264f72d --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern28.js @@ -0,0 +1,17 @@ +//// [iterableArrayPattern28.ts] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } +takeFirstTwoEntries(...new Map([["", 0], ["hello", true]])); + +//// [iterableArrayPattern28.js] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { +} +takeFirstTwoEntries(...new Map([ + [ + "", + 0 + ], + [ + "hello", + true + ] +])); diff --git a/tests/baselines/reference/iterableArrayPattern29.errors.txt b/tests/baselines/reference/iterableArrayPattern29.errors.txt new file mode 100644 index 00000000000..632854ae952 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern29.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern29.ts(2,21): error TS2345: Argument of type '[string, boolean]' is not assignable to parameter of type '[string, number]'. + Types of property '1' are incompatible. + Type 'boolean' is not assignable to type 'number'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern29.ts (1 errors) ==== + function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } + takeFirstTwoEntries(...new Map([["", true], ["hello", true]])); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type '[string, boolean]' is not assignable to parameter of type '[string, number]'. +!!! error TS2345: Types of property '1' are incompatible. +!!! error TS2345: Type 'boolean' is not assignable to type 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern29.js b/tests/baselines/reference/iterableArrayPattern29.js new file mode 100644 index 00000000000..926f5608bd0 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern29.js @@ -0,0 +1,17 @@ +//// [iterableArrayPattern29.ts] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } +takeFirstTwoEntries(...new Map([["", true], ["hello", true]])); + +//// [iterableArrayPattern29.js] +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { +} +takeFirstTwoEntries(...new Map([ + [ + "", + true + ], + [ + "hello", + true + ] +])); diff --git a/tests/baselines/reference/iterableArrayPattern3.js b/tests/baselines/reference/iterableArrayPattern3.js new file mode 100644 index 00000000000..4180bac8960 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern3.js @@ -0,0 +1,39 @@ +//// [iterableArrayPattern3.ts] +var a: Bar, b: Bar; +[a, b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern3.js] +var a, b; +[ + a, + b +] = new FooIterator; +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern3.types b/tests/baselines/reference/iterableArrayPattern3.types new file mode 100644 index 00000000000..291eed9723a --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern3.types @@ -0,0 +1,53 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern3.ts === +var a: Bar, b: Bar; +>a : Bar +>Bar : Bar +>b : Bar +>Bar : Bar + +[a, b] = new FooIterator; +>[a, b] = new FooIterator : FooIterator +>[a, b] : [Bar, Bar] +>a : Bar +>b : Bar +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +class Bar { x } +>Bar : Bar +>x : any + +class Foo extends Bar { y } +>Foo : Foo +>Bar : Bar +>y : any + +class FooIterator { +>FooIterator : FooIterator + + next() { +>next : () => { value: Foo; done: boolean; } + + return { +>{ value: new Foo, done: false } : { value: Foo; done: boolean; } + + value: new Foo, +>value : Foo +>new Foo : Foo +>Foo : typeof Foo + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : FooIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern30.js b/tests/baselines/reference/iterableArrayPattern30.js new file mode 100644 index 00000000000..aafa09c3911 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern30.js @@ -0,0 +1,14 @@ +//// [iterableArrayPattern30.ts] +const [[k1, v1], [k2, v2]] = new Map([["", true], ["hello", true]]) + +//// [iterableArrayPattern30.js] +const [[k1, v1], [k2, v2]] = new Map([ + [ + "", + true + ], + [ + "hello", + true + ] +]); diff --git a/tests/baselines/reference/iterableArrayPattern30.types b/tests/baselines/reference/iterableArrayPattern30.types new file mode 100644 index 00000000000..998da11d651 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern30.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern30.ts === +const [[k1, v1], [k2, v2]] = new Map([["", true], ["hello", true]]) +>k1 : string +>v1 : boolean +>k2 : string +>v2 : boolean +>new Map([["", true], ["hello", true]]) : Map +>Map : MapConstructor +>[["", true], ["hello", true]] : [string, boolean][] +>["", true] : [string, boolean] +>["hello", true] : [string, boolean] + diff --git a/tests/baselines/reference/iterableArrayPattern4.js b/tests/baselines/reference/iterableArrayPattern4.js new file mode 100644 index 00000000000..a03263e3c5e --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern4.js @@ -0,0 +1,39 @@ +//// [iterableArrayPattern4.ts] +var a: Bar, b: Bar[]; +[a, ...b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern4.js] +var a, b; +[ + a, + ...b +] = new FooIterator; +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern4.types b/tests/baselines/reference/iterableArrayPattern4.types new file mode 100644 index 00000000000..531b2aa8275 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern4.types @@ -0,0 +1,54 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern4.ts === +var a: Bar, b: Bar[]; +>a : Bar +>Bar : Bar +>b : Bar[] +>Bar : Bar + +[a, ...b] = new FooIterator; +>[a, ...b] = new FooIterator : FooIterator +>[a, ...b] : Bar[] +>a : Bar +>...b : Bar +>b : Bar[] +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +class Bar { x } +>Bar : Bar +>x : any + +class Foo extends Bar { y } +>Foo : Foo +>Bar : Bar +>y : any + +class FooIterator { +>FooIterator : FooIterator + + next() { +>next : () => { value: Foo; done: boolean; } + + return { +>{ value: new Foo, done: false } : { value: Foo; done: boolean; } + + value: new Foo, +>value : Foo +>new Foo : Foo +>Foo : typeof Foo + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : FooIterator + } +} diff --git a/tests/baselines/reference/iterableArrayPattern5.errors.txt b/tests/baselines/reference/iterableArrayPattern5.errors.txt new file mode 100644 index 00000000000..ca540d805be --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern5.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern5.ts(2,5): error TS2322: Type 'Foo' is not assignable to type 'string'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern5.ts (1 errors) ==== + var a: Bar, b: string; + [a, b] = new FooIterator; + ~ +!!! error TS2322: Type 'Foo' is not assignable to type 'string'. + class Bar { x } + class Foo extends Bar { y } + class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern5.js b/tests/baselines/reference/iterableArrayPattern5.js new file mode 100644 index 00000000000..84e14644aa9 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern5.js @@ -0,0 +1,39 @@ +//// [iterableArrayPattern5.ts] +var a: Bar, b: string; +[a, b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern5.js] +var a, b; +[ + a, + b +] = new FooIterator; +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern6.errors.txt b/tests/baselines/reference/iterableArrayPattern6.errors.txt new file mode 100644 index 00000000000..e0a546d154c --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern6.errors.txt @@ -0,0 +1,24 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern6.ts(2,8): error TS2322: Type 'Foo[]' is not assignable to type 'string[]'. + Type 'Foo' is not assignable to type 'string'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern6.ts (1 errors) ==== + var a: Bar, b: string[]; + [a, ...b] = new FooIterator; + ~ +!!! error TS2322: Type 'Foo[]' is not assignable to type 'string[]'. +!!! error TS2322: Type 'Foo' is not assignable to type 'string'. + class Bar { x } + class Foo extends Bar { y } + class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern6.js b/tests/baselines/reference/iterableArrayPattern6.js new file mode 100644 index 00000000000..b4faf6394e6 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern6.js @@ -0,0 +1,39 @@ +//// [iterableArrayPattern6.ts] +var a: Bar, b: string[]; +[a, ...b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern6.js] +var a, b; +[ + a, + ...b +] = new FooIterator; +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern7.errors.txt b/tests/baselines/reference/iterableArrayPattern7.errors.txt new file mode 100644 index 00000000000..997cc21f38b --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern7.errors.txt @@ -0,0 +1,24 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern7.ts(2,5): error TS2322: Type 'Foo' is not assignable to type 'string[]'. + Property 'length' is missing in type 'Foo'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern7.ts (1 errors) ==== + var a: Bar, b: string[]; + [a, b] = new FooIterator; + ~ +!!! error TS2322: Type 'Foo' is not assignable to type 'string[]'. +!!! error TS2322: Property 'length' is missing in type 'Foo'. + class Bar { x } + class Foo extends Bar { y } + class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern7.js b/tests/baselines/reference/iterableArrayPattern7.js new file mode 100644 index 00000000000..30a8d24bbd2 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern7.js @@ -0,0 +1,39 @@ +//// [iterableArrayPattern7.ts] +var a: Bar, b: string[]; +[a, b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern7.js] +var a, b; +[ + a, + b +] = new FooIterator; +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern8.errors.txt b/tests/baselines/reference/iterableArrayPattern8.errors.txt new file mode 100644 index 00000000000..c06e0c9543f --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern8.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/es6/destructuring/iterableArrayPattern8.ts(2,8): error TS2322: Type 'Foo[]' is not assignable to type 'string'. + + +==== tests/cases/conformance/es6/destructuring/iterableArrayPattern8.ts (1 errors) ==== + var a: Bar, b: string; + [a, ...b] = new FooIterator; + ~ +!!! error TS2322: Type 'Foo[]' is not assignable to type 'string'. + class Bar { x } + class Foo extends Bar { y } + class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/iterableArrayPattern8.js b/tests/baselines/reference/iterableArrayPattern8.js new file mode 100644 index 00000000000..35a4a62a3df --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern8.js @@ -0,0 +1,39 @@ +//// [iterableArrayPattern8.ts] +var a: Bar, b: string; +[a, ...b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern8.js] +var a, b; +[ + a, + ...b +] = new FooIterator; +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern9.js b/tests/baselines/reference/iterableArrayPattern9.js new file mode 100644 index 00000000000..558758561a4 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern9.js @@ -0,0 +1,35 @@ +//// [iterableArrayPattern9.ts] +function fun([a, b] = new FooIterator) { } +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [iterableArrayPattern9.js] +function fun([a, b] = new FooIterator) { +} +class Bar { +} +class Foo extends Bar { +} +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + [Symbol.iterator]() { + return this; + } +} diff --git a/tests/baselines/reference/iterableArrayPattern9.types b/tests/baselines/reference/iterableArrayPattern9.types new file mode 100644 index 00000000000..67d4bab1a83 --- /dev/null +++ b/tests/baselines/reference/iterableArrayPattern9.types @@ -0,0 +1,46 @@ +=== tests/cases/conformance/es6/destructuring/iterableArrayPattern9.ts === +function fun([a, b] = new FooIterator) { } +>fun : ([a, b]?: FooIterator) => void +>a : Foo +>b : Foo +>new FooIterator : FooIterator +>FooIterator : typeof FooIterator + +class Bar { x } +>Bar : Bar +>x : any + +class Foo extends Bar { y } +>Foo : Foo +>Bar : Bar +>y : any + +class FooIterator { +>FooIterator : FooIterator + + next() { +>next : () => { value: Foo; done: boolean; } + + return { +>{ value: new Foo, done: false } : { value: Foo; done: boolean; } + + value: new Foo, +>value : Foo +>new Foo : Foo +>Foo : typeof Foo + + done: false +>done : boolean + + }; + } + + [Symbol.iterator]() { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + return this; +>this : FooIterator + } +} diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern1.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern1.ts new file mode 100644 index 00000000000..7b3be0365e9 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern1.ts @@ -0,0 +1,14 @@ +//@target: ES6 +var [a, b] = new SymbolIterator; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern10.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern10.ts new file mode 100644 index 00000000000..35d05ef1f9c --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern10.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun([a, b]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern11.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern11.ts new file mode 100644 index 00000000000..ed93b5175d0 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern11.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun([a, b] = new FooIterator) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern12.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern12.ts new file mode 100644 index 00000000000..b7e763694ea --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern12.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun([a, ...b] = new FooIterator) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern13.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern13.ts new file mode 100644 index 00000000000..f0b9b142f40 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern13.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun([a, ...b]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern14.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern14.ts new file mode 100644 index 00000000000..c327efa3ec2 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern14.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun(...[a, ...b]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern15.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern15.ts new file mode 100644 index 00000000000..21d632fd541 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern15.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun(...[a, b]: Bar[]) { } +fun(...new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern16.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern16.ts new file mode 100644 index 00000000000..ba2c74681fe --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern16.ts @@ -0,0 +1,30 @@ +//@target: ES6 +function fun(...[a, b]: [Bar, Bar][]) { } +fun(...new FooIteratorIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} + +class FooIteratorIterator { + next() { + return { + value: new FooIterator, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern17.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern17.ts new file mode 100644 index 00000000000..90db0e5edb5 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern17.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun(...[a, b]: Bar[]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern18.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern18.ts new file mode 100644 index 00000000000..e6e5ad617b2 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern18.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun([a, b]: Bar[]) { } +fun(new FooIterator); +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern19.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern19.ts new file mode 100644 index 00000000000..8513dd07649 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern19.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun([[a], b]: Bar[][]) { } +fun(new FooArrayIterator); +class Bar { x } +class Foo extends Bar { y } +class FooArrayIterator { + next() { + return { + value: [new Foo], + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern2.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern2.ts new file mode 100644 index 00000000000..587f1f0b056 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern2.ts @@ -0,0 +1,14 @@ +//@target: ES6 +var [a, ...b] = new SymbolIterator; +class SymbolIterator { + next() { + return { + value: Symbol(), + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern20.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern20.ts new file mode 100644 index 00000000000..b5be67b393f --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern20.ts @@ -0,0 +1,17 @@ +//@target: ES6 +function fun(...[[a = new Foo], b = [new Foo]]: Bar[][]) { } +fun(...new FooArrayIterator); +class Bar { x } +class Foo extends Bar { y } +class FooArrayIterator { + next() { + return { + value: [new Foo], + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern21.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern21.ts new file mode 100644 index 00000000000..c8f17395d14 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern21.ts @@ -0,0 +1,2 @@ +//@target: ES6 +var [a, b] = { 0: "", 1: true }; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern22.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern22.ts new file mode 100644 index 00000000000..8cf60df5597 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern22.ts @@ -0,0 +1,2 @@ +//@target: ES6 +var [...a] = { 0: "", 1: true }; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern23.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern23.ts new file mode 100644 index 00000000000..91ce911b04c --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern23.ts @@ -0,0 +1,3 @@ +//@target: ES6 +var a: string, b: boolean; +[a, b] = { 0: "", 1: true }; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern24.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern24.ts new file mode 100644 index 00000000000..462b3663b8b --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern24.ts @@ -0,0 +1,3 @@ +//@target: ES6 +var a: string, b: boolean[]; +[a, ...b] = { 0: "", 1: true }; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts new file mode 100644 index 00000000000..a47edb4e987 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts @@ -0,0 +1,3 @@ +//@target: ES6 +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { } +takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern26.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern26.ts new file mode 100644 index 00000000000..be295333b2e --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern26.ts @@ -0,0 +1,3 @@ +//@target: ES6 +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } +takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern27.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern27.ts new file mode 100644 index 00000000000..fcf6967cd4e --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern27.ts @@ -0,0 +1,3 @@ +//@target: ES6 +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } +takeFirstTwoEntries(...new Map([["", 0], ["hello", 1]])); \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern28.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern28.ts new file mode 100644 index 00000000000..111abd70ac3 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern28.ts @@ -0,0 +1,3 @@ +//@target: ES6 +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } +takeFirstTwoEntries(...new Map([["", 0], ["hello", true]])); \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern29.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern29.ts new file mode 100644 index 00000000000..403347d61e5 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern29.ts @@ -0,0 +1,3 @@ +//@target: ES6 +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } +takeFirstTwoEntries(...new Map([["", true], ["hello", true]])); \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern3.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern3.ts new file mode 100644 index 00000000000..31656b5661f --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern3.ts @@ -0,0 +1,17 @@ +//@target: ES6 +var a: Bar, b: Bar; +[a, b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern30.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern30.ts new file mode 100644 index 00000000000..075ff3fd467 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern30.ts @@ -0,0 +1,2 @@ +//@target: ES6 +const [[k1, v1], [k2, v2]] = new Map([["", true], ["hello", true]]) \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern4.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern4.ts new file mode 100644 index 00000000000..edd95be1598 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern4.ts @@ -0,0 +1,17 @@ +//@target: ES6 +var a: Bar, b: Bar[]; +[a, ...b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern5.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern5.ts new file mode 100644 index 00000000000..b51d0f09d08 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern5.ts @@ -0,0 +1,17 @@ +//@target: ES6 +var a: Bar, b: string; +[a, b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern6.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern6.ts new file mode 100644 index 00000000000..fc9395ed6a4 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern6.ts @@ -0,0 +1,17 @@ +//@target: ES6 +var a: Bar, b: string[]; +[a, ...b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern7.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern7.ts new file mode 100644 index 00000000000..85b2f2e54e3 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern7.ts @@ -0,0 +1,17 @@ +//@target: ES6 +var a: Bar, b: string[]; +[a, b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern8.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern8.ts new file mode 100644 index 00000000000..dd49205d6e0 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern8.ts @@ -0,0 +1,17 @@ +//@target: ES6 +var a: Bar, b: string; +[a, ...b] = new FooIterator; +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/iterableArrayPattern9.ts b/tests/cases/conformance/es6/destructuring/iterableArrayPattern9.ts new file mode 100644 index 00000000000..1573c55ca8e --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/iterableArrayPattern9.ts @@ -0,0 +1,16 @@ +//@target: ES6 +function fun([a, b] = new FooIterator) { } +class Bar { x } +class Foo extends Bar { y } +class FooIterator { + next() { + return { + value: new Foo, + done: false + }; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file From 197a42a692d818d683451820c8896c25320034b1 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 25 Mar 2015 18:38:14 -0700 Subject: [PATCH 17/35] Optimize direct Iterable reference in getIteratedType --- src/compiler/checker.ts | 6 ++++++ tests/baselines/reference/for-of57.js | 8 ++++++++ tests/baselines/reference/for-of57.types | 9 +++++++++ tests/baselines/reference/iteratorSpreadInArray11.js | 9 +++++++++ .../baselines/reference/iteratorSpreadInArray11.types | 11 +++++++++++ .../conformance/es6/for-ofStatements/for-of57.ts | 3 +++ .../conformance/es6/spread/iteratorSpreadInArray11.ts | 3 +++ 7 files changed, 49 insertions(+) create mode 100644 tests/baselines/reference/for-of57.js create mode 100644 tests/baselines/reference/for-of57.types create mode 100644 tests/baselines/reference/iteratorSpreadInArray11.js create mode 100644 tests/baselines/reference/iteratorSpreadInArray11.types create mode 100644 tests/cases/conformance/es6/for-ofStatements/for-of57.ts create mode 100644 tests/cases/conformance/es6/spread/iteratorSpreadInArray11.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2eb2470f027..844589ee851 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9346,6 +9346,12 @@ module ts { return undefined; } + // As an optimization, if the type is instantiated directly using the globalIterableType (Iterable), + // then just grab its type argument. + if ((iterable.flags & TypeFlags.Reference) && (iterable).target === globalIterableType) { + return (iterable).typeArguments[0]; + } + let iteratorFunction = getTypeOfPropertyOfType(iterable, getPropertyNameForKnownSymbolName("iterator")); if (iteratorFunction && allConstituentTypesHaveKind(iteratorFunction, TypeFlags.Any)) { return undefined; diff --git a/tests/baselines/reference/for-of57.js b/tests/baselines/reference/for-of57.js new file mode 100644 index 00000000000..0dedd6c3222 --- /dev/null +++ b/tests/baselines/reference/for-of57.js @@ -0,0 +1,8 @@ +//// [for-of57.ts] +var iter: Iterable; +for (let num of iter) { } + +//// [for-of57.js] +var iter; +for (let num of iter) { +} diff --git a/tests/baselines/reference/for-of57.types b/tests/baselines/reference/for-of57.types new file mode 100644 index 00000000000..cfd4f68cfca --- /dev/null +++ b/tests/baselines/reference/for-of57.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/es6/for-ofStatements/for-of57.ts === +var iter: Iterable; +>iter : Iterable +>Iterable : Iterable + +for (let num of iter) { } +>num : number +>iter : Iterable + diff --git a/tests/baselines/reference/iteratorSpreadInArray11.js b/tests/baselines/reference/iteratorSpreadInArray11.js new file mode 100644 index 00000000000..830fa04380b --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray11.js @@ -0,0 +1,9 @@ +//// [iteratorSpreadInArray11.ts] +var iter: Iterable; +var array = [...iter]; + +//// [iteratorSpreadInArray11.js] +var iter; +var array = [ + ...iter +]; diff --git a/tests/baselines/reference/iteratorSpreadInArray11.types b/tests/baselines/reference/iteratorSpreadInArray11.types new file mode 100644 index 00000000000..a3ed7826e07 --- /dev/null +++ b/tests/baselines/reference/iteratorSpreadInArray11.types @@ -0,0 +1,11 @@ +=== tests/cases/conformance/es6/spread/iteratorSpreadInArray11.ts === +var iter: Iterable; +>iter : Iterable +>Iterable : Iterable + +var array = [...iter]; +>array : number[] +>[...iter] : number[] +>...iter : number +>iter : Iterable + diff --git a/tests/cases/conformance/es6/for-ofStatements/for-of57.ts b/tests/cases/conformance/es6/for-ofStatements/for-of57.ts new file mode 100644 index 00000000000..f3c8dd97822 --- /dev/null +++ b/tests/cases/conformance/es6/for-ofStatements/for-of57.ts @@ -0,0 +1,3 @@ +//@target: ES6 +var iter: Iterable; +for (let num of iter) { } \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/iteratorSpreadInArray11.ts b/tests/cases/conformance/es6/spread/iteratorSpreadInArray11.ts new file mode 100644 index 00000000000..0c0108433aa --- /dev/null +++ b/tests/cases/conformance/es6/spread/iteratorSpreadInArray11.ts @@ -0,0 +1,3 @@ +//@target: ES6 +var iter: Iterable; +var array = [...iter]; \ No newline at end of file From 17719e85ff1d4f05e6df257c9a3f787c055c8ef9 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 25 Mar 2015 19:06:34 -0700 Subject: [PATCH 18/35] Fix comment to be more accurate --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 844589ee851..c1f729574eb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2169,7 +2169,7 @@ module ts { // function fun(...[a, ...b]) { } // // Normally, in ES6, the implied type of an array binding pattern with a rest element is - // an iterable. However, there is a requirement in our grammar checker that all rest + // an iterable. However, there is a requirement in our type system that all rest // parameters be array types. To satisfy this, we have an exception to the rule that // says the type of an array binding pattern with a rest element is an array type // if it is *itself* in a rest parameter. It will still be compatible with a spreaded From 903c1d8dd8b1768f843be86d6fdf2b6da1a036df Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 26 Mar 2015 15:15:02 -0700 Subject: [PATCH 19/35] Add clarifying comment about checkExpressionCached --- src/compiler/checker.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 09674139c34..677361c196a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5949,6 +5949,12 @@ module ts { } function checkSpreadElementExpression(node: SpreadElementExpression, contextualMapper?: TypeMapper): Type { + // It is usually not safe to call checkExpressionCached if we can be contextually typing. + // You can tell that we are contextually typing because of the contextualMapper parameter. + // While it is true that a spread element can have a contextual type, it does not do anything + // with this type. It is neither affected by it, nor does it propagate it to its operand. + // So the fact that contextualMapper is passed is not important, because the operand of a spread + // element is not contextually typed. let arrayOrIterableType = checkExpressionCached(node.expression, contextualMapper); return checkIteratedTypeOrElementType(arrayOrIterableType, node.expression, /*allowStringInput*/ false); } From 74e6b6eccc087f736a131acb8351b586c9f6c09f Mon Sep 17 00:00:00 2001 From: steveluc Date: Thu, 2 Apr 2015 00:13:06 -0700 Subject: [PATCH 20/35] Add an exit message for the server. --- src/server/editorServices.ts | 6 ++++-- src/server/protocol.d.ts | 7 +++++++ src/server/server.ts | 10 +++++++--- src/server/session.ts | 13 +++++++++++-- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index a3814c8fec1..3dfbc05ff9a 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -458,7 +458,7 @@ module ts.server { var info = this.filenameToScriptInfo[args.file]; if (info) { info.setFormatOptions(args.formatOptions); - this.log("Host configuration update for file " + args.file); + this.log("Host configuration update for file " + args.file, "Info"); } } else { @@ -823,7 +823,6 @@ module ts.server { */ closeClientFile(filename: string) { - // TODO: tsconfig check var info = ts.lookUp(this.filenameToScriptInfo, filename); if (info) { this.closeOpenFile(info); @@ -856,6 +855,9 @@ module ts.server { } printProjects() { + if (!this.psLogger.isVerbose()) { + return; + } this.psLogger.startGroup(); for (var i = 0, len = this.inferredProjects.length; i < len; i++) { var project = this.inferredProjects[i]; diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index 382ce8494af..b425f4941a1 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -405,6 +405,13 @@ declare module ts.server.protocol { arguments: OpenRequestArgs; } + /** + * Exit request; value of command field is "exit". Ask the server process + * to exit. + */ + export interface ExitRequest extends Request { + } + /** * Close request; value of command field is "close". Notify the * server that the client has closed a previously open file. If diff --git a/src/server/server.ts b/src/server/server.ts index 4c13be80c4c..828deca2b2d 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -177,6 +177,12 @@ module ts.server { super(host, logger); } + exit() { + this.projectService.log("Exiting...","Info"); + this.projectService.closeLog(); + process.exit(0); + } + listen() { rl.on('line',(input: string) => { var message = input.trim(); @@ -184,9 +190,7 @@ module ts.server { }); rl.on('close',() => { - this.projectService.log("Exiting..."); - this.projectService.closeLog(); - process.exit(0); + this.exit(); }); } } diff --git a/src/server/session.ts b/src/server/session.ts index 80831e69284..560f5869c08 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -76,13 +76,14 @@ module ts.server { } export module CommandNames { + export var Brace = "brace"; export var Change = "change"; export var Close = "close"; export var Completions = "completions"; export var CompletionDetails = "completionEntryDetails"; - export var SignatureHelp = "signatureHelp"; export var Configure = "configure"; export var Definition = "definition"; + export var Exit = "exit"; export var Format = "format"; export var Formatonkey = "formatonkey"; export var Geterr = "geterr"; @@ -94,7 +95,7 @@ module ts.server { export var Reload = "reload"; export var Rename = "rename"; export var Saveto = "saveto"; - export var Brace = "brace"; + export var SignatureHelp = "signatureHelp"; export var Unknown = "unknown"; } @@ -758,6 +759,9 @@ module ts.server { })); } + exit() { + } + onMessage(message: string) { if (this.logger.isVerbose()) { this.logger.info("request: " + message); @@ -769,6 +773,11 @@ module ts.server { var errorMessage: string; var responseRequired = true; switch (request.command) { + case CommandNames.Exit: { + this.exit(); + responseRequired = false; + break; + } case CommandNames.Definition: { var defArgs = request.arguments; response = this.getDefinition(defArgs.line, defArgs.offset, defArgs.file); From 4ff87b71a4018cc48cc418a622faf1ba0f5c0868 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Tue, 7 Apr 2015 11:42:08 -0700 Subject: [PATCH 21/35] Fixes #2601, incorrect resolution of this/super --- src/compiler/checker.ts | 2 +- src/compiler/utilities.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1b87578a26d..35c3c5fce55 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5600,7 +5600,7 @@ module ts { } } - if (container.kind === SyntaxKind.ComputedPropertyName) { + if (container && container.kind === SyntaxKind.ComputedPropertyName) { error(node, Diagnostics.super_cannot_be_referenced_in_a_computed_property_name); } else if (isCallExpression) { diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index e3efd12de0a..4df840c3241 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -526,6 +526,19 @@ module ts { // the *body* of the container. node = node.parent; break; + case SyntaxKind.Decorator: + // Decorators are always applied outside of the body of a class or method. + if (node.parent.kind === SyntaxKind.Parameter && isClassElement(node.parent.parent)) { + // If the decorator's parent is a Parameter, we resolve the this container from + // the grandparent class declaration. + node = node.parent.parent; + } + else if (isClassElement(node.parent)) { + // If the decorator's parent is a class element, we resolve the 'this' container + // from the parent class declaration. + node = node.parent; + } + break; case SyntaxKind.ArrowFunction: if (!includeArrowFunctions) { continue; @@ -568,6 +581,19 @@ module ts { // the *body* of the container. node = node.parent; break; + case SyntaxKind.Decorator: + // Decorators are always applied outside of the body of a class or method. + if (node.parent.kind === SyntaxKind.Parameter && isClassElement(node.parent.parent)) { + // If the decorator's parent is a Parameter, we resolve the this container from + // the grandparent class declaration. + node = node.parent.parent; + } + else if (isClassElement(node.parent)) { + // If the decorator's parent is a class element, we resolve the 'this' container + // from the parent class declaration. + node = node.parent; + } + break; case SyntaxKind.FunctionDeclaration: case SyntaxKind.FunctionExpression: case SyntaxKind.ArrowFunction: @@ -919,6 +945,7 @@ module ts { case SyntaxKind.MethodDeclaration: case SyntaxKind.GetAccessor: case SyntaxKind.SetAccessor: + case SyntaxKind.MethodSignature: case SyntaxKind.IndexSignature: return true; default: From 627c7f42117e7a440225aa3295e3a1c48c04fd9d Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Tue, 7 Apr 2015 13:17:57 -0700 Subject: [PATCH 22/35] Fix for #2619 --- src/compiler/emitter.ts | 6 ++-- .../reference/decoratorOnClassMethod11.js | 29 +++++++++++++++++++ .../reference/decoratorOnClassMethod11.types | 21 ++++++++++++++ .../class/method/decoratorOnClassMethod11.ts | 7 +++++ 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/decoratorOnClassMethod11.js create mode 100644 tests/baselines/reference/decoratorOnClassMethod11.types create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 43db3e69cd7..1af1f7275cd 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -1136,8 +1136,8 @@ var __param = this.__param || function(index, decorator) { return function (targ if (!computedPropertyNamesToGeneratedNames) { computedPropertyNamesToGeneratedNames = []; } - - let generatedName = computedPropertyNamesToGeneratedNames[node.id]; + + let generatedName = computedPropertyNamesToGeneratedNames[getNodeId(node)]; if (generatedName) { // we have already generated a variable for this node, write that value instead. write(generatedName); @@ -1145,7 +1145,7 @@ var __param = this.__param || function(index, decorator) { return function (targ } generatedName = createAndRecordTempVariable(TempFlags.Auto).text; - computedPropertyNamesToGeneratedNames[node.id] = generatedName; + computedPropertyNamesToGeneratedNames[getNodeId(node)] = generatedName; write(generatedName); write(" = "); } diff --git a/tests/baselines/reference/decoratorOnClassMethod11.js b/tests/baselines/reference/decoratorOnClassMethod11.js new file mode 100644 index 00000000000..085f84f1f83 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod11.js @@ -0,0 +1,29 @@ +//// [decoratorOnClassMethod11.ts] +declare function dec(): (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor; + +class C { + @dec ["1"]() { } + @dec ["b"]() { } +} + +//// [decoratorOnClassMethod11.js] +var __decorate = this.__decorate || (typeof Reflect === "object" && Reflect.decorate) || function (decorators, target, key, desc) { + switch (arguments.length) { + case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target); + case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0); + case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc); + } +}; +class C { + [_a = "1"]() { } + [_b = "b"]() { } +} +Object.defineProperty(C.prototype, _a, + __decorate([ + dec + ], C.prototype, _a, Object.getOwnPropertyDescriptor(C.prototype, _a))); +Object.defineProperty(C.prototype, _b, + __decorate([ + dec + ], C.prototype, _b, Object.getOwnPropertyDescriptor(C.prototype, _b))); +var _a, _b; diff --git a/tests/baselines/reference/decoratorOnClassMethod11.types b/tests/baselines/reference/decoratorOnClassMethod11.types new file mode 100644 index 00000000000..1035668ed51 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod11.types @@ -0,0 +1,21 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts === +declare function dec(): (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor; +>dec : () => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor +>T : T +>target : any +>propertyKey : string +>descriptor : TypedPropertyDescriptor +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T + +class C { +>C : C + + @dec ["1"]() { } +>dec : unknown + + @dec ["b"]() { } +>dec : unknown +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts new file mode 100644 index 00000000000..df0b847e99d --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts @@ -0,0 +1,7 @@ +// @target: ES6 +declare function dec(): (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor; + +class C { + @dec ["1"]() { } + @dec ["b"]() { } +} \ No newline at end of file From e9911a5e17308e62eb3780905d7984901a2f6db0 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Tue, 7 Apr 2015 17:43:10 -0700 Subject: [PATCH 23/35] Tests and baselines --- .../decoratorOnClassMethod11.errors.txt | 14 ++++++ .../reference/decoratorOnClassMethod11.js | 32 +++++++++++++ .../decoratorOnClassMethod12.errors.txt | 15 ++++++ .../reference/decoratorOnClassMethod12.js | 46 +++++++++++++++++++ .../class/method/decoratorOnClassMethod11.ts | 9 ++++ .../class/method/decoratorOnClassMethod12.ts | 10 ++++ 6 files changed, 126 insertions(+) create mode 100644 tests/baselines/reference/decoratorOnClassMethod11.errors.txt create mode 100644 tests/baselines/reference/decoratorOnClassMethod11.js create mode 100644 tests/baselines/reference/decoratorOnClassMethod12.errors.txt create mode 100644 tests/baselines/reference/decoratorOnClassMethod12.js create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts diff --git a/tests/baselines/reference/decoratorOnClassMethod11.errors.txt b/tests/baselines/reference/decoratorOnClassMethod11.errors.txt new file mode 100644 index 00000000000..5e56c0b62a8 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod11.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts(5,10): error TS2331: 'this' cannot be referenced in a module body. + + +==== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts (1 errors) ==== + module M { + class C { + decorator(target: Object, key: string): void { } + + @this.decorator + ~~~~ +!!! error TS2331: 'this' cannot be referenced in a module body. + method() { } + } + } \ No newline at end of file diff --git a/tests/baselines/reference/decoratorOnClassMethod11.js b/tests/baselines/reference/decoratorOnClassMethod11.js new file mode 100644 index 00000000000..f8276de2fe3 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod11.js @@ -0,0 +1,32 @@ +//// [decoratorOnClassMethod11.ts] +module M { + class C { + decorator(target: Object, key: string): void { } + + @this.decorator + method() { } + } +} + +//// [decoratorOnClassMethod11.js] +var __decorate = this.__decorate || (typeof Reflect === "object" && Reflect.decorate) || function (decorators, target, key, desc) { + switch (arguments.length) { + case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target); + case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0); + case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc); + } +}; +var M; +(function (M) { + var C = (function () { + function C() { + } + C.prototype.decorator = function (target, key) { }; + C.prototype.method = function () { }; + Object.defineProperty(C.prototype, "method", + __decorate([ + this.decorator + ], C.prototype, "method", Object.getOwnPropertyDescriptor(C.prototype, "method"))); + return C; + })(); +})(M || (M = {})); diff --git a/tests/baselines/reference/decoratorOnClassMethod12.errors.txt b/tests/baselines/reference/decoratorOnClassMethod12.errors.txt new file mode 100644 index 00000000000..14845839089 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod12.errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts(6,10): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class + + +==== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts (1 errors) ==== + module M { + class S { + decorator(target: Object, key: string): void { } + } + class C extends S { + @super.decorator + ~~~~~ +!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class + method() { } + } + } \ No newline at end of file diff --git a/tests/baselines/reference/decoratorOnClassMethod12.js b/tests/baselines/reference/decoratorOnClassMethod12.js new file mode 100644 index 00000000000..7f23947929c --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod12.js @@ -0,0 +1,46 @@ +//// [decoratorOnClassMethod12.ts] +module M { + class S { + decorator(target: Object, key: string): void { } + } + class C extends S { + @super.decorator + method() { } + } +} + +//// [decoratorOnClassMethod12.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var __decorate = this.__decorate || (typeof Reflect === "object" && Reflect.decorate) || function (decorators, target, key, desc) { + switch (arguments.length) { + case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target); + case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0); + case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc); + } +}; +var M; +(function (M) { + var S = (function () { + function S() { + } + S.prototype.decorator = function (target, key) { }; + return S; + })(); + var C = (function (_super) { + __extends(C, _super); + function C() { + _super.apply(this, arguments); + } + C.prototype.method = function () { }; + Object.defineProperty(C.prototype, "method", + __decorate([ + _super.decorator + ], C.prototype, "method", Object.getOwnPropertyDescriptor(C.prototype, "method"))); + return C; + })(S); +})(M || (M = {})); diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts new file mode 100644 index 00000000000..e3d94ff25d2 --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod11.ts @@ -0,0 +1,9 @@ +// @target: ES5 +module M { + class C { + decorator(target: Object, key: string): void { } + + @this.decorator + method() { } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts new file mode 100644 index 00000000000..a9a2607c39b --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts @@ -0,0 +1,10 @@ +// @target: ES5 +module M { + class S { + decorator(target: Object, key: string): void { } + } + class C extends S { + @super.decorator + method() { } + } +} \ No newline at end of file From 5b6c65ffe09bbdb150f8e8efee79b8124ed019e6 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 7 Apr 2015 23:31:09 -0700 Subject: [PATCH 24/35] Added support for getOccurrences to the server. --- src/server/client.ts | 22 +++++++++++++++++++++- src/server/protocol.d.ts | 19 +++++++++++++++++++ src/server/session.ts | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/server/client.ts b/src/server/client.ts index d395d2a832c..dfda9f23ed7 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -446,6 +446,7 @@ module ts.server { if (!response.body) { return undefined; } + var helpItems: protocol.SignatureHelpItems = response.body; var span = helpItems.applicableSpan; var start = this.lineOffsetToPosition(fileName, span.start); @@ -465,7 +466,26 @@ module ts.server { } getOccurrencesAtPosition(fileName: string, position: number): ReferenceEntry[] { - throw new Error("Not Implemented Yet."); + var lineOffset = this.positionToOneBasedLineOffset(fileName, position); + var args: protocol.FileLocationRequestArgs = { + file: fileName, + line: lineOffset.line, + offset: lineOffset.offset, + }; + + var request = this.processRequest(CommandNames.Occurrences, args); + var response = this.processResponse(request); + + return response.body.map(entry => { + var fileName = entry.file; + var start = this.lineOffsetToPosition(fileName, entry.start); + var end = this.lineOffsetToPosition(fileName, entry.end); + return { + fileName, + textSpan: ts.createTextSpanFromBounds(start, end), + isWriteAccess: entry.isWriteAccess, + }; + }); } getOutliningSpans(fileName: string): OutliningSpan[] { diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index 1d685be5d3a..5bc1ffbe4dc 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -165,6 +165,25 @@ declare module ts.server.protocol { body?: FileSpan[]; } + /** + * Get occurrences request; value of command field is + * "occurrences". Return response giving spans that are relevant + * in the file at a given line and column. + */ + export interface OccurrencesRequest extends FileLocationRequest { + } + + export interface OccurrencesResponseItem extends FileSpan { + /** + * True if the occurrence is a write location, false otherwise. + */ + isWriteAccess: boolean; + } + + export interface OccurrencesResponse extends Response { + body?: OccurrencesResponseItem[]; + } + /** * Find references request; value of command field is * "references". Return response giving the file locations that diff --git a/src/server/session.ts b/src/server/session.ts index 560f5869c08..f35235554e6 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -89,6 +89,7 @@ module ts.server { export var Geterr = "geterr"; export var NavBar = "navbar"; export var Navto = "navto"; + export var Occurrences = "occurrences"; export var Open = "open"; export var Quickinfo = "quickinfo"; export var References = "references"; From 6b997487ee077c2cd3f46248af9682b72d39fd8d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 7 Apr 2015 23:34:45 -0700 Subject: [PATCH 25/35] Fixed /// +/// //////curly braces ////module Foo [|{ diff --git a/tests/cases/fourslash/server/completions.ts b/tests/cases/fourslash/server/completions.ts index 2af0393283f..a837a74849d 100644 --- a/tests/cases/fourslash/server/completions.ts +++ b/tests/cases/fourslash/server/completions.ts @@ -1,4 +1,4 @@ -/// +/// ////var x: string[] = []; ////x.forEach(function (y) { y/*1*/ diff --git a/tests/cases/fourslash/server/completions2.ts b/tests/cases/fourslash/server/completions2.ts index 3e7e77b588c..b6c39a5c723 100644 --- a/tests/cases/fourslash/server/completions2.ts +++ b/tests/cases/fourslash/server/completions2.ts @@ -1,4 +1,4 @@ -/// +/// ////class Foo { ////} diff --git a/tests/cases/fourslash/server/definition.ts b/tests/cases/fourslash/server/definition.ts index f403965fe12..8bf6e73c840 100644 --- a/tests/cases/fourslash/server/definition.ts +++ b/tests/cases/fourslash/server/definition.ts @@ -1,4 +1,4 @@ -/// +/// // @Filename: b.ts ////import n = require('a/*1*/'); diff --git a/tests/cases/fourslash/server/format.ts b/tests/cases/fourslash/server/format.ts index 75d06eef0c2..f4541152201 100644 --- a/tests/cases/fourslash/server/format.ts +++ b/tests/cases/fourslash/server/format.ts @@ -1,4 +1,4 @@ -/// +/// /////**/module Default{var x= ( { } ) ;} diff --git a/tests/cases/fourslash/server/formatonkey.ts b/tests/cases/fourslash/server/formatonkey.ts index 64cd74ca858..73e817ce3b3 100644 --- a/tests/cases/fourslash/server/formatonkey.ts +++ b/tests/cases/fourslash/server/formatonkey.ts @@ -1,4 +1,4 @@ -/// +/// ////switch (1) { //// case 1: diff --git a/tests/cases/fourslash/server/navbar.ts b/tests/cases/fourslash/server/navbar.ts index 67e14fe1009..82ded5e6f54 100644 --- a/tests/cases/fourslash/server/navbar.ts +++ b/tests/cases/fourslash/server/navbar.ts @@ -1,4 +1,4 @@ -/// +/// ////// Interface ////{| "itemName": "IPoint", "kind": "interface", "parentName": "" |}interface IPoint { diff --git a/tests/cases/fourslash/server/navto.ts b/tests/cases/fourslash/server/navto.ts index ba907e985fd..1072c64494f 100644 --- a/tests/cases/fourslash/server/navto.ts +++ b/tests/cases/fourslash/server/navto.ts @@ -1,4 +1,4 @@ -/// +/// /////// Module ////{| "itemName": "MyShapes", "kind": "module", "parentName": "", "matchKind": "substring" |}module MyShapes { diff --git a/tests/cases/fourslash/server/quickinfo.ts b/tests/cases/fourslash/server/quickinfo.ts index 5292eb6c2c8..9008505e447 100644 --- a/tests/cases/fourslash/server/quickinfo.ts +++ b/tests/cases/fourslash/server/quickinfo.ts @@ -1,4 +1,4 @@ -/// +/// ////interface One { //// commonProperty: number; diff --git a/tests/cases/fourslash/server/references.ts b/tests/cases/fourslash/server/references.ts index 55b21615551..0ecbeb43de3 100644 --- a/tests/cases/fourslash/server/references.ts +++ b/tests/cases/fourslash/server/references.ts @@ -1,4 +1,4 @@ -/// +/// // Global class reference. diff --git a/tests/cases/fourslash/server/rename.ts b/tests/cases/fourslash/server/rename.ts index 4f8b7b98cd4..2da25f87ba7 100644 --- a/tests/cases/fourslash/server/rename.ts +++ b/tests/cases/fourslash/server/rename.ts @@ -1,4 +1,4 @@ -/// +/// /////// diff --git a/tests/cases/fourslash/server/signatureHelp.ts b/tests/cases/fourslash/server/signatureHelp.ts index 294df367f07..73303ecce4c 100644 --- a/tests/cases/fourslash/server/signatureHelp.ts +++ b/tests/cases/fourslash/server/signatureHelp.ts @@ -1,4 +1,4 @@ -/// +/// ////function foo(data: number) { ////} From de0347fa0f5da14873ae64fa988ed179b6a2d245 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 7 Apr 2015 23:39:13 -0700 Subject: [PATCH 26/35] Rename tests. --- tests/cases/fourslash/server/{brace.ts => brace01.ts} | 0 tests/cases/fourslash/server/{completions.ts => completions01.ts} | 0 .../cases/fourslash/server/{completions2.ts => completions02.ts} | 0 tests/cases/fourslash/server/{definition.ts => definition01.ts} | 0 tests/cases/fourslash/server/{format.ts => format01.ts} | 0 tests/cases/fourslash/server/{formatonkey.ts => formatonkey01.ts} | 0 tests/cases/fourslash/server/{navbar.ts => navbar01.ts} | 0 tests/cases/fourslash/server/{navto.ts => navto01.ts} | 0 tests/cases/fourslash/server/{quickinfo.ts => quickinfo01.ts} | 0 tests/cases/fourslash/server/{references.ts => references01.ts} | 0 tests/cases/fourslash/server/{rename.ts => rename01.ts} | 0 .../fourslash/server/{signatureHelp.ts => signatureHelp01.ts} | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename tests/cases/fourslash/server/{brace.ts => brace01.ts} (100%) rename tests/cases/fourslash/server/{completions.ts => completions01.ts} (100%) rename tests/cases/fourslash/server/{completions2.ts => completions02.ts} (100%) rename tests/cases/fourslash/server/{definition.ts => definition01.ts} (100%) rename tests/cases/fourslash/server/{format.ts => format01.ts} (100%) rename tests/cases/fourslash/server/{formatonkey.ts => formatonkey01.ts} (100%) rename tests/cases/fourslash/server/{navbar.ts => navbar01.ts} (100%) rename tests/cases/fourslash/server/{navto.ts => navto01.ts} (100%) rename tests/cases/fourslash/server/{quickinfo.ts => quickinfo01.ts} (100%) rename tests/cases/fourslash/server/{references.ts => references01.ts} (100%) rename tests/cases/fourslash/server/{rename.ts => rename01.ts} (100%) rename tests/cases/fourslash/server/{signatureHelp.ts => signatureHelp01.ts} (100%) diff --git a/tests/cases/fourslash/server/brace.ts b/tests/cases/fourslash/server/brace01.ts similarity index 100% rename from tests/cases/fourslash/server/brace.ts rename to tests/cases/fourslash/server/brace01.ts diff --git a/tests/cases/fourslash/server/completions.ts b/tests/cases/fourslash/server/completions01.ts similarity index 100% rename from tests/cases/fourslash/server/completions.ts rename to tests/cases/fourslash/server/completions01.ts diff --git a/tests/cases/fourslash/server/completions2.ts b/tests/cases/fourslash/server/completions02.ts similarity index 100% rename from tests/cases/fourslash/server/completions2.ts rename to tests/cases/fourslash/server/completions02.ts diff --git a/tests/cases/fourslash/server/definition.ts b/tests/cases/fourslash/server/definition01.ts similarity index 100% rename from tests/cases/fourslash/server/definition.ts rename to tests/cases/fourslash/server/definition01.ts diff --git a/tests/cases/fourslash/server/format.ts b/tests/cases/fourslash/server/format01.ts similarity index 100% rename from tests/cases/fourslash/server/format.ts rename to tests/cases/fourslash/server/format01.ts diff --git a/tests/cases/fourslash/server/formatonkey.ts b/tests/cases/fourslash/server/formatonkey01.ts similarity index 100% rename from tests/cases/fourslash/server/formatonkey.ts rename to tests/cases/fourslash/server/formatonkey01.ts diff --git a/tests/cases/fourslash/server/navbar.ts b/tests/cases/fourslash/server/navbar01.ts similarity index 100% rename from tests/cases/fourslash/server/navbar.ts rename to tests/cases/fourslash/server/navbar01.ts diff --git a/tests/cases/fourslash/server/navto.ts b/tests/cases/fourslash/server/navto01.ts similarity index 100% rename from tests/cases/fourslash/server/navto.ts rename to tests/cases/fourslash/server/navto01.ts diff --git a/tests/cases/fourslash/server/quickinfo.ts b/tests/cases/fourslash/server/quickinfo01.ts similarity index 100% rename from tests/cases/fourslash/server/quickinfo.ts rename to tests/cases/fourslash/server/quickinfo01.ts diff --git a/tests/cases/fourslash/server/references.ts b/tests/cases/fourslash/server/references01.ts similarity index 100% rename from tests/cases/fourslash/server/references.ts rename to tests/cases/fourslash/server/references01.ts diff --git a/tests/cases/fourslash/server/rename.ts b/tests/cases/fourslash/server/rename01.ts similarity index 100% rename from tests/cases/fourslash/server/rename.ts rename to tests/cases/fourslash/server/rename01.ts diff --git a/tests/cases/fourslash/server/signatureHelp.ts b/tests/cases/fourslash/server/signatureHelp01.ts similarity index 100% rename from tests/cases/fourslash/server/signatureHelp.ts rename to tests/cases/fourslash/server/signatureHelp01.ts From a6788d22ef79f35e7c61a19d5055ca205e0e8eeb Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 7 Apr 2015 23:53:47 -0700 Subject: [PATCH 27/35] Added occurrences tests. --- tests/cases/fourslash/server/occurrences01.ts | 27 +++++++++++++++++++ tests/cases/fourslash/server/occurrences02.ts | 16 +++++++++++ 2 files changed, 43 insertions(+) create mode 100644 tests/cases/fourslash/server/occurrences01.ts create mode 100644 tests/cases/fourslash/server/occurrences02.ts diff --git a/tests/cases/fourslash/server/occurrences01.ts b/tests/cases/fourslash/server/occurrences01.ts new file mode 100644 index 00000000000..62f445ac693 --- /dev/null +++ b/tests/cases/fourslash/server/occurrences01.ts @@ -0,0 +1,27 @@ +/// + +////foo: [|switch|] (10) { +//// [|case|] 1: +//// [|case|] 2: +//// [|case|] 3: +//// [|break|]; +//// [|break|] foo; +//// co/*1*/ntinue; +//// contin/*2*/ue foo; +////} + +let ranges = test.ranges(); + +for (let r of ranges) { + goTo.position(r.start); + verify.occurrencesAtPositionCount(ranges.length); + + for (let range of ranges) { + verify.occurrencesAtPositionContains(range, false); + } +} + +for (let m of test.markers()) { + goTo.position(m.position); + verify.occurrencesAtPositionCount(0); +} \ No newline at end of file diff --git a/tests/cases/fourslash/server/occurrences02.ts b/tests/cases/fourslash/server/occurrences02.ts new file mode 100644 index 00000000000..511e7887c21 --- /dev/null +++ b/tests/cases/fourslash/server/occurrences02.ts @@ -0,0 +1,16 @@ +/// + +////function [|f|](x: typeof [|f|]) { +//// [|f|]([|f|]); +////} + +let ranges = test.ranges(); + +for (let r of ranges) { + goTo.position(r.start); + verify.occurrencesAtPositionCount(ranges.length); + + for (let range of ranges) { + verify.occurrencesAtPositionContains(range, false); + } +} \ No newline at end of file From 93bb224545ec753bb4c40190dd811d365b48fcb4 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 00:35:34 -0700 Subject: [PATCH 28/35] Actually implemented the session-side logic. --- src/server/session.ts | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/server/session.ts b/src/server/session.ts index f35235554e6..9c77747f349 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -285,6 +285,36 @@ module ts.server { })); } + getOccurrences(line: number, offset: number, fileName: string): protocol.OccurrencesResponseItem[] { + fileName = ts.normalizePath(fileName); + let project = this.projectService.getProjectForFile(fileName); + + if (!project) { + throw Errors.NoProject; + } + + let { compilerService } = project; + let position = compilerService.host.lineOffsetToPosition(fileName, line, offset); + + let occurrences = compilerService.languageService.getOccurrencesAtPosition(fileName, position); + + if (!occurrences) { + return undefined; + } + + return occurrences.map(occurrence => { + let { fileName, isWriteAccess, textSpan } = occurrence; + let start = compilerService.host.positionToLineOffset(fileName, textSpan.start); + let end = compilerService.host.positionToLineOffset(fileName, ts.textSpanEnd(textSpan)); + return { + start, + end, + file: fileName, + isWriteAccess + } + }); + } + getRenameLocations(line: number, offset: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -379,7 +409,7 @@ module ts.server { var nameSpan = nameInfo.textSpan; var nameColStart = compilerService.host.positionToLineOffset(file, nameSpan.start).offset; var nameText = compilerService.host.getScriptSnapshot(file).getText(nameSpan.start, ts.textSpanEnd(nameSpan)); - var bakedRefs: protocol.ReferencesResponseItem[] = references.map((ref) => { + var bakedRefs: protocol.ReferencesResponseItem[] = references.map(ref => { var start = compilerService.host.positionToLineOffset(ref.fileName, ref.textSpan.start); var refLineSpan = compilerService.host.lineToTextSpan(ref.fileName, start.line - 1); var snap = compilerService.host.getScriptSnapshot(ref.fileName); @@ -885,6 +915,10 @@ module ts.server { response = this.getNavigationBarItems(navBarArgs.file); break; } + case CommandNames.Occurrences: { + var occurrencesArgs = request.arguments; + response = this + } default: { this.projectService.log("Unrecognized JSON command: " + message); this.output(undefined, CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command); From d8d494d4da42d8b79902affd39140f19b34acd62 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 00:41:12 -0700 Subject: [PATCH 29/35] *Actually dispatched* on the logic. --- src/server/session.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/server/session.ts b/src/server/session.ts index 9c77747f349..faedce0e1af 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -916,8 +916,9 @@ module ts.server { break; } case CommandNames.Occurrences: { - var occurrencesArgs = request.arguments; - response = this + var { line, offset, file: fileName } = request.arguments; + response = this.getOccurrences(line, offset, fileName); + break; } default: { this.projectService.log("Unrecognized JSON command: " + message); From 81d62cf57d5ce411cc17883c455de6e48d5caa44 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 01:09:54 -0700 Subject: [PATCH 30/35] Fixed 'isWriteAccess' check. --- tests/cases/fourslash/server/occurrences02.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cases/fourslash/server/occurrences02.ts b/tests/cases/fourslash/server/occurrences02.ts index 511e7887c21..e0d39cb92fd 100644 --- a/tests/cases/fourslash/server/occurrences02.ts +++ b/tests/cases/fourslash/server/occurrences02.ts @@ -11,6 +11,6 @@ for (let r of ranges) { verify.occurrencesAtPositionCount(ranges.length); for (let range of ranges) { - verify.occurrencesAtPositionContains(range, false); + verify.occurrencesAtPositionContains(range); } } \ No newline at end of file From 12ccdb63dbd795ab4ecec98968bdb3fde4dc427a Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 01:19:45 -0700 Subject: [PATCH 31/35] Apparently our server tests can't handle negative tests. --- src/server/client.ts | 2 +- tests/cases/fourslash/server/occurrences01.ts | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index dfda9f23ed7..3306bd5a9d4 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -104,7 +104,7 @@ module ts.server { var response: T = JSON.parse(responseBody); } catch (e) { - throw new Error("Malformed response: Failed to parse server response: " + lastMessage + ". \r\n Error detailes: " + e.message); + throw new Error("Malformed response: Failed to parse server response: " + lastMessage + ". \r\n Error details: " + e.message); } // verify the sequence numbers diff --git a/tests/cases/fourslash/server/occurrences01.ts b/tests/cases/fourslash/server/occurrences01.ts index 62f445ac693..db2fa64f38d 100644 --- a/tests/cases/fourslash/server/occurrences01.ts +++ b/tests/cases/fourslash/server/occurrences01.ts @@ -6,8 +6,8 @@ //// [|case|] 3: //// [|break|]; //// [|break|] foo; -//// co/*1*/ntinue; -//// contin/*2*/ue foo; +//// continue; +//// continue foo; ////} let ranges = test.ranges(); @@ -17,11 +17,6 @@ for (let r of ranges) { verify.occurrencesAtPositionCount(ranges.length); for (let range of ranges) { - verify.occurrencesAtPositionContains(range, false); + verify.occurrencesAtPositionContains(range, /*isWriteAccess*/ false); } -} - -for (let m of test.markers()) { - goTo.position(m.position); - verify.occurrencesAtPositionCount(0); } \ No newline at end of file From 37025689163e060caa0b424423a4271660036c56 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Tue, 7 Apr 2015 13:17:57 -0700 Subject: [PATCH 32/35] Fix for #2619 --- src/compiler/emitter.ts | 6 ++-- .../reference/decoratorOnClassMethod11.js | 14 ++++----- .../reference/decoratorOnClassMethod13.js | 29 +++++++++++++++++++ .../reference/decoratorOnClassMethod13.types | 21 ++++++++++++++ .../class/method/decoratorOnClassMethod13.ts | 7 +++++ 5 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 tests/baselines/reference/decoratorOnClassMethod13.js create mode 100644 tests/baselines/reference/decoratorOnClassMethod13.types create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod13.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index d8493895d9c..940edf04191 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -1136,8 +1136,8 @@ var __param = this.__param || function(index, decorator) { return function (targ if (!computedPropertyNamesToGeneratedNames) { computedPropertyNamesToGeneratedNames = []; } - - let generatedName = computedPropertyNamesToGeneratedNames[node.id]; + + let generatedName = computedPropertyNamesToGeneratedNames[getNodeId(node)]; if (generatedName) { // we have already generated a variable for this node, write that value instead. write(generatedName); @@ -1145,7 +1145,7 @@ var __param = this.__param || function(index, decorator) { return function (targ } generatedName = createAndRecordTempVariable(TempFlags.Auto).text; - computedPropertyNamesToGeneratedNames[node.id] = generatedName; + computedPropertyNamesToGeneratedNames[getNodeId(node)] = generatedName; write(generatedName); write(" = "); } diff --git a/tests/baselines/reference/decoratorOnClassMethod11.js b/tests/baselines/reference/decoratorOnClassMethod11.js index f8276de2fe3..71d4298f02c 100644 --- a/tests/baselines/reference/decoratorOnClassMethod11.js +++ b/tests/baselines/reference/decoratorOnClassMethod11.js @@ -1,11 +1,11 @@ //// [decoratorOnClassMethod11.ts] -module M { - class C { - decorator(target: Object, key: string): void { } - - @this.decorator - method() { } - } +module M { + class C { + decorator(target: Object, key: string): void { } + + @this.decorator + method() { } + } } //// [decoratorOnClassMethod11.js] diff --git a/tests/baselines/reference/decoratorOnClassMethod13.js b/tests/baselines/reference/decoratorOnClassMethod13.js new file mode 100644 index 00000000000..4321bbb0156 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod13.js @@ -0,0 +1,29 @@ +//// [decoratorOnClassMethod13.ts] +declare function dec(): (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor; + +class C { + @dec ["1"]() { } + @dec ["b"]() { } +} + +//// [decoratorOnClassMethod13.js] +var __decorate = this.__decorate || (typeof Reflect === "object" && Reflect.decorate) || function (decorators, target, key, desc) { + switch (arguments.length) { + case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target); + case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0); + case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc); + } +}; +class C { + [_a = "1"]() { } + [_b = "b"]() { } +} +Object.defineProperty(C.prototype, _a, + __decorate([ + dec + ], C.prototype, _a, Object.getOwnPropertyDescriptor(C.prototype, _a))); +Object.defineProperty(C.prototype, _b, + __decorate([ + dec + ], C.prototype, _b, Object.getOwnPropertyDescriptor(C.prototype, _b))); +var _a, _b; diff --git a/tests/baselines/reference/decoratorOnClassMethod13.types b/tests/baselines/reference/decoratorOnClassMethod13.types new file mode 100644 index 00000000000..8c34805792f --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod13.types @@ -0,0 +1,21 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod13.ts === +declare function dec(): (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor; +>dec : () => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor +>T : T +>target : any +>propertyKey : string +>descriptor : TypedPropertyDescriptor +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T + +class C { +>C : C + + @dec ["1"]() { } +>dec : unknown + + @dec ["b"]() { } +>dec : unknown +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod13.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod13.ts new file mode 100644 index 00000000000..df0b847e99d --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod13.ts @@ -0,0 +1,7 @@ +// @target: ES6 +declare function dec(): (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor; + +class C { + @dec ["1"]() { } + @dec ["b"]() { } +} \ No newline at end of file From 846c2252970b9f59d9c1ea8af53549f001ebd751 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 8 Apr 2015 16:41:56 -0700 Subject: [PATCH 33/35] Update baselines for preserving newlines --- tests/baselines/reference/for-of57.js | 3 +-- .../baselines/reference/iterableArrayPattern10.js | 3 +-- .../baselines/reference/iterableArrayPattern11.js | 3 +-- .../baselines/reference/iterableArrayPattern12.js | 3 +-- .../baselines/reference/iterableArrayPattern13.js | 3 +-- .../baselines/reference/iterableArrayPattern14.js | 3 +-- .../baselines/reference/iterableArrayPattern15.js | 3 +-- .../baselines/reference/iterableArrayPattern16.js | 3 +-- .../baselines/reference/iterableArrayPattern17.js | 3 +-- .../baselines/reference/iterableArrayPattern18.js | 3 +-- .../baselines/reference/iterableArrayPattern19.js | 7 ++----- .../baselines/reference/iterableArrayPattern20.js | 9 ++------- .../baselines/reference/iterableArrayPattern21.js | 5 +---- .../baselines/reference/iterableArrayPattern22.js | 5 +---- .../baselines/reference/iterableArrayPattern23.js | 8 +------- .../baselines/reference/iterableArrayPattern24.js | 8 +------- .../baselines/reference/iterableArrayPattern25.js | 14 ++------------ .../baselines/reference/iterableArrayPattern26.js | 14 ++------------ .../baselines/reference/iterableArrayPattern27.js | 14 ++------------ .../baselines/reference/iterableArrayPattern28.js | 14 ++------------ .../baselines/reference/iterableArrayPattern29.js | 14 ++------------ tests/baselines/reference/iterableArrayPattern3.js | 5 +---- .../baselines/reference/iterableArrayPattern30.js | 11 +---------- tests/baselines/reference/iterableArrayPattern4.js | 5 +---- tests/baselines/reference/iterableArrayPattern5.js | 5 +---- tests/baselines/reference/iterableArrayPattern6.js | 5 +---- tests/baselines/reference/iterableArrayPattern7.js | 5 +---- tests/baselines/reference/iterableArrayPattern8.js | 5 +---- tests/baselines/reference/iterableArrayPattern9.js | 3 +-- tests/baselines/reference/iteratorSpreadInArray.js | 4 +--- .../baselines/reference/iteratorSpreadInArray10.js | 4 +--- .../baselines/reference/iteratorSpreadInArray11.js | 4 +--- .../baselines/reference/iteratorSpreadInArray2.js | 5 +---- .../baselines/reference/iteratorSpreadInArray3.js | 8 +------- .../baselines/reference/iteratorSpreadInArray4.js | 6 +----- .../baselines/reference/iteratorSpreadInArray5.js | 6 +----- .../baselines/reference/iteratorSpreadInArray6.js | 9 ++------- .../baselines/reference/iteratorSpreadInArray7.js | 4 +--- .../baselines/reference/iteratorSpreadInArray8.js | 4 +--- .../baselines/reference/iteratorSpreadInArray9.js | 4 +--- tests/baselines/reference/iteratorSpreadInCall.js | 3 +-- .../baselines/reference/iteratorSpreadInCall10.js | 4 +--- .../baselines/reference/iteratorSpreadInCall11.js | 4 +--- .../baselines/reference/iteratorSpreadInCall12.js | 7 +------ tests/baselines/reference/iteratorSpreadInCall2.js | 3 +-- tests/baselines/reference/iteratorSpreadInCall3.js | 3 +-- tests/baselines/reference/iteratorSpreadInCall4.js | 3 +-- tests/baselines/reference/iteratorSpreadInCall5.js | 3 +-- tests/baselines/reference/iteratorSpreadInCall6.js | 3 +-- tests/baselines/reference/iteratorSpreadInCall7.js | 4 +--- tests/baselines/reference/iteratorSpreadInCall9.js | 4 +--- 51 files changed, 59 insertions(+), 226 deletions(-) diff --git a/tests/baselines/reference/for-of57.js b/tests/baselines/reference/for-of57.js index 0dedd6c3222..5a867c332f7 100644 --- a/tests/baselines/reference/for-of57.js +++ b/tests/baselines/reference/for-of57.js @@ -4,5 +4,4 @@ for (let num of iter) { } //// [for-of57.js] var iter; -for (let num of iter) { -} +for (let num of iter) { } diff --git a/tests/baselines/reference/iterableArrayPattern10.js b/tests/baselines/reference/iterableArrayPattern10.js index 2e532e2b773..c8d37e3f894 100644 --- a/tests/baselines/reference/iterableArrayPattern10.js +++ b/tests/baselines/reference/iterableArrayPattern10.js @@ -17,8 +17,7 @@ class FooIterator { } //// [iterableArrayPattern10.js] -function fun([a, b]) { -} +function fun([a, b]) { } fun(new FooIterator); class Bar { } diff --git a/tests/baselines/reference/iterableArrayPattern11.js b/tests/baselines/reference/iterableArrayPattern11.js index a3940edc362..85ed4ab9710 100644 --- a/tests/baselines/reference/iterableArrayPattern11.js +++ b/tests/baselines/reference/iterableArrayPattern11.js @@ -17,8 +17,7 @@ class FooIterator { } //// [iterableArrayPattern11.js] -function fun([a, b] = new FooIterator) { -} +function fun([a, b] = new FooIterator) { } fun(new FooIterator); class Bar { } diff --git a/tests/baselines/reference/iterableArrayPattern12.js b/tests/baselines/reference/iterableArrayPattern12.js index 64581c54251..4856af9cb48 100644 --- a/tests/baselines/reference/iterableArrayPattern12.js +++ b/tests/baselines/reference/iterableArrayPattern12.js @@ -17,8 +17,7 @@ class FooIterator { } //// [iterableArrayPattern12.js] -function fun([a, ...b] = new FooIterator) { -} +function fun([a, ...b] = new FooIterator) { } fun(new FooIterator); class Bar { } diff --git a/tests/baselines/reference/iterableArrayPattern13.js b/tests/baselines/reference/iterableArrayPattern13.js index f4ea18d4fec..06f9901a851 100644 --- a/tests/baselines/reference/iterableArrayPattern13.js +++ b/tests/baselines/reference/iterableArrayPattern13.js @@ -17,8 +17,7 @@ class FooIterator { } //// [iterableArrayPattern13.js] -function fun([a, ...b]) { -} +function fun([a, ...b]) { } fun(new FooIterator); class Bar { } diff --git a/tests/baselines/reference/iterableArrayPattern14.js b/tests/baselines/reference/iterableArrayPattern14.js index 81b2c66f14d..a3595b0df0c 100644 --- a/tests/baselines/reference/iterableArrayPattern14.js +++ b/tests/baselines/reference/iterableArrayPattern14.js @@ -17,8 +17,7 @@ class FooIterator { } //// [iterableArrayPattern14.js] -function fun(...[a, ...b]) { -} +function fun(...[a, ...b]) { } fun(new FooIterator); class Bar { } diff --git a/tests/baselines/reference/iterableArrayPattern15.js b/tests/baselines/reference/iterableArrayPattern15.js index fcb5ec82508..1c2050129ce 100644 --- a/tests/baselines/reference/iterableArrayPattern15.js +++ b/tests/baselines/reference/iterableArrayPattern15.js @@ -17,8 +17,7 @@ class FooIterator { } //// [iterableArrayPattern15.js] -function fun(...[a, b]) { -} +function fun(...[a, b]) { } fun(...new FooIterator); class Bar { } diff --git a/tests/baselines/reference/iterableArrayPattern16.js b/tests/baselines/reference/iterableArrayPattern16.js index d3127991799..bda2ec37f63 100644 --- a/tests/baselines/reference/iterableArrayPattern16.js +++ b/tests/baselines/reference/iterableArrayPattern16.js @@ -30,8 +30,7 @@ class FooIteratorIterator { } //// [iterableArrayPattern16.js] -function fun(...[a, b]) { -} +function fun(...[a, b]) { } fun(...new FooIteratorIterator); class Bar { } diff --git a/tests/baselines/reference/iterableArrayPattern17.js b/tests/baselines/reference/iterableArrayPattern17.js index db5c4001c88..c6274aabcd9 100644 --- a/tests/baselines/reference/iterableArrayPattern17.js +++ b/tests/baselines/reference/iterableArrayPattern17.js @@ -17,8 +17,7 @@ class FooIterator { } //// [iterableArrayPattern17.js] -function fun(...[a, b]) { -} +function fun(...[a, b]) { } fun(new FooIterator); class Bar { } diff --git a/tests/baselines/reference/iterableArrayPattern18.js b/tests/baselines/reference/iterableArrayPattern18.js index 3e13f2ef619..e2016c47690 100644 --- a/tests/baselines/reference/iterableArrayPattern18.js +++ b/tests/baselines/reference/iterableArrayPattern18.js @@ -17,8 +17,7 @@ class FooIterator { } //// [iterableArrayPattern18.js] -function fun([a, b]) { -} +function fun([a, b]) { } fun(new FooIterator); class Bar { } diff --git a/tests/baselines/reference/iterableArrayPattern19.js b/tests/baselines/reference/iterableArrayPattern19.js index 60ace366eb7..bc3cf33afc2 100644 --- a/tests/baselines/reference/iterableArrayPattern19.js +++ b/tests/baselines/reference/iterableArrayPattern19.js @@ -17,8 +17,7 @@ class FooArrayIterator { } //// [iterableArrayPattern19.js] -function fun([[a], b]) { -} +function fun([[a], b]) { } fun(new FooArrayIterator); class Bar { } @@ -27,9 +26,7 @@ class Foo extends Bar { class FooArrayIterator { next() { return { - value: [ - new Foo - ], + value: [new Foo], done: false }; } diff --git a/tests/baselines/reference/iterableArrayPattern20.js b/tests/baselines/reference/iterableArrayPattern20.js index 271a35b791d..489f97a29f3 100644 --- a/tests/baselines/reference/iterableArrayPattern20.js +++ b/tests/baselines/reference/iterableArrayPattern20.js @@ -17,10 +17,7 @@ class FooArrayIterator { } //// [iterableArrayPattern20.js] -function fun(...[[a = new Foo], b = [ - new Foo - ]]) { -} +function fun(...[[a = new Foo], b = [new Foo]]) { } fun(...new FooArrayIterator); class Bar { } @@ -29,9 +26,7 @@ class Foo extends Bar { class FooArrayIterator { next() { return { - value: [ - new Foo - ], + value: [new Foo], done: false }; } diff --git a/tests/baselines/reference/iterableArrayPattern21.js b/tests/baselines/reference/iterableArrayPattern21.js index f226406ec63..bdc4d401e54 100644 --- a/tests/baselines/reference/iterableArrayPattern21.js +++ b/tests/baselines/reference/iterableArrayPattern21.js @@ -2,7 +2,4 @@ var [a, b] = { 0: "", 1: true }; //// [iterableArrayPattern21.js] -var [a, b] = { - 0: "", - 1: true -}; +var [a, b] = { 0: "", 1: true }; diff --git a/tests/baselines/reference/iterableArrayPattern22.js b/tests/baselines/reference/iterableArrayPattern22.js index 9c3afc0ffe5..9ec41bd3076 100644 --- a/tests/baselines/reference/iterableArrayPattern22.js +++ b/tests/baselines/reference/iterableArrayPattern22.js @@ -2,7 +2,4 @@ var [...a] = { 0: "", 1: true }; //// [iterableArrayPattern22.js] -var [...a] = { - 0: "", - 1: true -}; +var [...a] = { 0: "", 1: true }; diff --git a/tests/baselines/reference/iterableArrayPattern23.js b/tests/baselines/reference/iterableArrayPattern23.js index ffeb1abe32e..d932c29506d 100644 --- a/tests/baselines/reference/iterableArrayPattern23.js +++ b/tests/baselines/reference/iterableArrayPattern23.js @@ -4,10 +4,4 @@ var a: string, b: boolean; //// [iterableArrayPattern23.js] var a, b; -[ - a, - b -] = { - 0: "", - 1: true -}; +[a, b] = { 0: "", 1: true }; diff --git a/tests/baselines/reference/iterableArrayPattern24.js b/tests/baselines/reference/iterableArrayPattern24.js index 89cc3e2dc99..f089e35dad8 100644 --- a/tests/baselines/reference/iterableArrayPattern24.js +++ b/tests/baselines/reference/iterableArrayPattern24.js @@ -4,10 +4,4 @@ var a: string, b: boolean[]; //// [iterableArrayPattern24.js] var a, b; -[ - a, - ...b -] = { - 0: "", - 1: true -}; +[a, ...b] = { 0: "", 1: true }; diff --git a/tests/baselines/reference/iterableArrayPattern25.js b/tests/baselines/reference/iterableArrayPattern25.js index 63686f5a39e..1dc44c0dba7 100644 --- a/tests/baselines/reference/iterableArrayPattern25.js +++ b/tests/baselines/reference/iterableArrayPattern25.js @@ -3,15 +3,5 @@ function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { } takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); //// [iterableArrayPattern25.js] -function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { -} -takeFirstTwoEntries(new Map([ - [ - "", - 0 - ], - [ - "hello", - 1 - ] -])); +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { } +takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); diff --git a/tests/baselines/reference/iterableArrayPattern26.js b/tests/baselines/reference/iterableArrayPattern26.js index 7edcf52b6ba..63c188febb7 100644 --- a/tests/baselines/reference/iterableArrayPattern26.js +++ b/tests/baselines/reference/iterableArrayPattern26.js @@ -3,15 +3,5 @@ function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); //// [iterableArrayPattern26.js] -function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { -} -takeFirstTwoEntries(new Map([ - [ - "", - 0 - ], - [ - "hello", - 1 - ] -])); +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { } +takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])); diff --git a/tests/baselines/reference/iterableArrayPattern27.js b/tests/baselines/reference/iterableArrayPattern27.js index 2d8a7e9d76e..3e936eb51f4 100644 --- a/tests/baselines/reference/iterableArrayPattern27.js +++ b/tests/baselines/reference/iterableArrayPattern27.js @@ -3,15 +3,5 @@ function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } takeFirstTwoEntries(...new Map([["", 0], ["hello", 1]])); //// [iterableArrayPattern27.js] -function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { -} -takeFirstTwoEntries(...new Map([ - [ - "", - 0 - ], - [ - "hello", - 1 - ] -])); +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { } +takeFirstTwoEntries(...new Map([["", 0], ["hello", 1]])); diff --git a/tests/baselines/reference/iterableArrayPattern28.js b/tests/baselines/reference/iterableArrayPattern28.js index 03e9264f72d..70953475372 100644 --- a/tests/baselines/reference/iterableArrayPattern28.js +++ b/tests/baselines/reference/iterableArrayPattern28.js @@ -3,15 +3,5 @@ function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } takeFirstTwoEntries(...new Map([["", 0], ["hello", true]])); //// [iterableArrayPattern28.js] -function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { -} -takeFirstTwoEntries(...new Map([ - [ - "", - 0 - ], - [ - "hello", - true - ] -])); +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { } +takeFirstTwoEntries(...new Map([["", 0], ["hello", true]])); diff --git a/tests/baselines/reference/iterableArrayPattern29.js b/tests/baselines/reference/iterableArrayPattern29.js index 926f5608bd0..912d336263f 100644 --- a/tests/baselines/reference/iterableArrayPattern29.js +++ b/tests/baselines/reference/iterableArrayPattern29.js @@ -3,15 +3,5 @@ function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]: [string, number][]) { } takeFirstTwoEntries(...new Map([["", true], ["hello", true]])); //// [iterableArrayPattern29.js] -function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { -} -takeFirstTwoEntries(...new Map([ - [ - "", - true - ], - [ - "hello", - true - ] -])); +function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { } +takeFirstTwoEntries(...new Map([["", true], ["hello", true]])); diff --git a/tests/baselines/reference/iterableArrayPattern3.js b/tests/baselines/reference/iterableArrayPattern3.js index 4180bac8960..7136c6ab209 100644 --- a/tests/baselines/reference/iterableArrayPattern3.js +++ b/tests/baselines/reference/iterableArrayPattern3.js @@ -18,10 +18,7 @@ class FooIterator { //// [iterableArrayPattern3.js] var a, b; -[ - a, - b -] = new FooIterator; +[a, b] = new FooIterator; class Bar { } class Foo extends Bar { diff --git a/tests/baselines/reference/iterableArrayPattern30.js b/tests/baselines/reference/iterableArrayPattern30.js index aafa09c3911..10f7df53aa3 100644 --- a/tests/baselines/reference/iterableArrayPattern30.js +++ b/tests/baselines/reference/iterableArrayPattern30.js @@ -2,13 +2,4 @@ const [[k1, v1], [k2, v2]] = new Map([["", true], ["hello", true]]) //// [iterableArrayPattern30.js] -const [[k1, v1], [k2, v2]] = new Map([ - [ - "", - true - ], - [ - "hello", - true - ] -]); +const [[k1, v1], [k2, v2]] = new Map([["", true], ["hello", true]]); diff --git a/tests/baselines/reference/iterableArrayPattern4.js b/tests/baselines/reference/iterableArrayPattern4.js index a03263e3c5e..6e60dadbd7a 100644 --- a/tests/baselines/reference/iterableArrayPattern4.js +++ b/tests/baselines/reference/iterableArrayPattern4.js @@ -18,10 +18,7 @@ class FooIterator { //// [iterableArrayPattern4.js] var a, b; -[ - a, - ...b -] = new FooIterator; +[a, ...b] = new FooIterator; class Bar { } class Foo extends Bar { diff --git a/tests/baselines/reference/iterableArrayPattern5.js b/tests/baselines/reference/iterableArrayPattern5.js index 84e14644aa9..77e71cac6d3 100644 --- a/tests/baselines/reference/iterableArrayPattern5.js +++ b/tests/baselines/reference/iterableArrayPattern5.js @@ -18,10 +18,7 @@ class FooIterator { //// [iterableArrayPattern5.js] var a, b; -[ - a, - b -] = new FooIterator; +[a, b] = new FooIterator; class Bar { } class Foo extends Bar { diff --git a/tests/baselines/reference/iterableArrayPattern6.js b/tests/baselines/reference/iterableArrayPattern6.js index b4faf6394e6..8c797e819f5 100644 --- a/tests/baselines/reference/iterableArrayPattern6.js +++ b/tests/baselines/reference/iterableArrayPattern6.js @@ -18,10 +18,7 @@ class FooIterator { //// [iterableArrayPattern6.js] var a, b; -[ - a, - ...b -] = new FooIterator; +[a, ...b] = new FooIterator; class Bar { } class Foo extends Bar { diff --git a/tests/baselines/reference/iterableArrayPattern7.js b/tests/baselines/reference/iterableArrayPattern7.js index 30a8d24bbd2..3f79e6bfba8 100644 --- a/tests/baselines/reference/iterableArrayPattern7.js +++ b/tests/baselines/reference/iterableArrayPattern7.js @@ -18,10 +18,7 @@ class FooIterator { //// [iterableArrayPattern7.js] var a, b; -[ - a, - b -] = new FooIterator; +[a, b] = new FooIterator; class Bar { } class Foo extends Bar { diff --git a/tests/baselines/reference/iterableArrayPattern8.js b/tests/baselines/reference/iterableArrayPattern8.js index 35a4a62a3df..dd1c76c1f51 100644 --- a/tests/baselines/reference/iterableArrayPattern8.js +++ b/tests/baselines/reference/iterableArrayPattern8.js @@ -18,10 +18,7 @@ class FooIterator { //// [iterableArrayPattern8.js] var a, b; -[ - a, - ...b -] = new FooIterator; +[a, ...b] = new FooIterator; class Bar { } class Foo extends Bar { diff --git a/tests/baselines/reference/iterableArrayPattern9.js b/tests/baselines/reference/iterableArrayPattern9.js index 558758561a4..a85ca9c347b 100644 --- a/tests/baselines/reference/iterableArrayPattern9.js +++ b/tests/baselines/reference/iterableArrayPattern9.js @@ -16,8 +16,7 @@ class FooIterator { } //// [iterableArrayPattern9.js] -function fun([a, b] = new FooIterator) { -} +function fun([a, b] = new FooIterator) { } class Bar { } class Foo extends Bar { diff --git a/tests/baselines/reference/iteratorSpreadInArray.js b/tests/baselines/reference/iteratorSpreadInArray.js index ae1a2c5916c..8e25a2e7ecf 100644 --- a/tests/baselines/reference/iteratorSpreadInArray.js +++ b/tests/baselines/reference/iteratorSpreadInArray.js @@ -15,9 +15,7 @@ class SymbolIterator { } //// [iteratorSpreadInArray.js] -var array = [ - ...new SymbolIterator -]; +var array = [...new SymbolIterator]; class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInArray10.js b/tests/baselines/reference/iteratorSpreadInArray10.js index c33d7e8a015..1004dbd7b34 100644 --- a/tests/baselines/reference/iteratorSpreadInArray10.js +++ b/tests/baselines/reference/iteratorSpreadInArray10.js @@ -8,9 +8,7 @@ class SymbolIterator { } //// [iteratorSpreadInArray10.js] -var array = [ - ...new SymbolIterator -]; +var array = [...new SymbolIterator]; class SymbolIterator { [Symbol.iterator]() { return this; diff --git a/tests/baselines/reference/iteratorSpreadInArray11.js b/tests/baselines/reference/iteratorSpreadInArray11.js index 830fa04380b..fa86c152123 100644 --- a/tests/baselines/reference/iteratorSpreadInArray11.js +++ b/tests/baselines/reference/iteratorSpreadInArray11.js @@ -4,6 +4,4 @@ var array = [...iter]; //// [iteratorSpreadInArray11.js] var iter; -var array = [ - ...iter -]; +var array = [...iter]; diff --git a/tests/baselines/reference/iteratorSpreadInArray2.js b/tests/baselines/reference/iteratorSpreadInArray2.js index 4589d9bb904..aa4a1099a40 100644 --- a/tests/baselines/reference/iteratorSpreadInArray2.js +++ b/tests/baselines/reference/iteratorSpreadInArray2.js @@ -28,10 +28,7 @@ class NumberIterator { } //// [iteratorSpreadInArray2.js] -var array = [ - ...new NumberIterator, - ...new SymbolIterator -]; +var array = [...new NumberIterator, ...new SymbolIterator]; class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInArray3.js b/tests/baselines/reference/iteratorSpreadInArray3.js index b9eac64b29f..1d468e4483e 100644 --- a/tests/baselines/reference/iteratorSpreadInArray3.js +++ b/tests/baselines/reference/iteratorSpreadInArray3.js @@ -15,13 +15,7 @@ class SymbolIterator { } //// [iteratorSpreadInArray3.js] -var array = [ - ...[ - 0, - 1 - ], - ...new SymbolIterator -]; +var array = [...[0, 1], ...new SymbolIterator]; class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInArray4.js b/tests/baselines/reference/iteratorSpreadInArray4.js index 22571495f05..82a08bfa964 100644 --- a/tests/baselines/reference/iteratorSpreadInArray4.js +++ b/tests/baselines/reference/iteratorSpreadInArray4.js @@ -15,11 +15,7 @@ class SymbolIterator { } //// [iteratorSpreadInArray4.js] -var array = [ - 0, - 1, - ...new SymbolIterator -]; +var array = [0, 1, ...new SymbolIterator]; class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInArray5.js b/tests/baselines/reference/iteratorSpreadInArray5.js index b5e4c95d22b..0aa158a5dc2 100644 --- a/tests/baselines/reference/iteratorSpreadInArray5.js +++ b/tests/baselines/reference/iteratorSpreadInArray5.js @@ -15,11 +15,7 @@ class SymbolIterator { } //// [iteratorSpreadInArray5.js] -var array = [ - 0, - 1, - ...new SymbolIterator -]; +var array = [0, 1, ...new SymbolIterator]; class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInArray6.js b/tests/baselines/reference/iteratorSpreadInArray6.js index df34201b827..02d1c435b8c 100644 --- a/tests/baselines/reference/iteratorSpreadInArray6.js +++ b/tests/baselines/reference/iteratorSpreadInArray6.js @@ -16,13 +16,8 @@ class SymbolIterator { } //// [iteratorSpreadInArray6.js] -var array = [ - 0, - 1 -]; -array.concat([ - ...new SymbolIterator -]); +var array = [0, 1]; +array.concat([...new SymbolIterator]); class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInArray7.js b/tests/baselines/reference/iteratorSpreadInArray7.js index ca7acd5a786..72a614ae4ec 100644 --- a/tests/baselines/reference/iteratorSpreadInArray7.js +++ b/tests/baselines/reference/iteratorSpreadInArray7.js @@ -17,9 +17,7 @@ class SymbolIterator { //// [iteratorSpreadInArray7.js] var array; -array.concat([ - ...new SymbolIterator -]); +array.concat([...new SymbolIterator]); class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInArray8.js b/tests/baselines/reference/iteratorSpreadInArray8.js index e1edeee1168..08378699129 100644 --- a/tests/baselines/reference/iteratorSpreadInArray8.js +++ b/tests/baselines/reference/iteratorSpreadInArray8.js @@ -11,9 +11,7 @@ class SymbolIterator { } //// [iteratorSpreadInArray8.js] -var array = [ - ...new SymbolIterator -]; +var array = [...new SymbolIterator]; class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInArray9.js b/tests/baselines/reference/iteratorSpreadInArray9.js index 93de78065fb..ed0a9b4ebe9 100644 --- a/tests/baselines/reference/iteratorSpreadInArray9.js +++ b/tests/baselines/reference/iteratorSpreadInArray9.js @@ -14,9 +14,7 @@ class SymbolIterator { } //// [iteratorSpreadInArray9.js] -var array = [ - ...new SymbolIterator -]; +var array = [...new SymbolIterator]; class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall.js b/tests/baselines/reference/iteratorSpreadInCall.js index 0dcff404f53..f3bf17c0327 100644 --- a/tests/baselines/reference/iteratorSpreadInCall.js +++ b/tests/baselines/reference/iteratorSpreadInCall.js @@ -17,8 +17,7 @@ class SymbolIterator { //// [iteratorSpreadInCall.js] foo(...new SymbolIterator); -function foo(s) { -} +function foo(s) { } class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall10.js b/tests/baselines/reference/iteratorSpreadInCall10.js index 5c400ae2c30..14a08c97009 100644 --- a/tests/baselines/reference/iteratorSpreadInCall10.js +++ b/tests/baselines/reference/iteratorSpreadInCall10.js @@ -18,9 +18,7 @@ class SymbolIterator { //// [iteratorSpreadInCall10.js] foo(...new SymbolIterator); -function foo(s) { - return s[0]; -} +function foo(s) { return s[0]; } class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall11.js b/tests/baselines/reference/iteratorSpreadInCall11.js index a3cccb96409..d01eb259ef3 100644 --- a/tests/baselines/reference/iteratorSpreadInCall11.js +++ b/tests/baselines/reference/iteratorSpreadInCall11.js @@ -18,9 +18,7 @@ class SymbolIterator { //// [iteratorSpreadInCall11.js] foo(...new SymbolIterator); -function foo(...s) { - return s[0]; -} +function foo(...s) { return s[0]; } class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall12.js b/tests/baselines/reference/iteratorSpreadInCall12.js index dd95cab0cf8..90b9d9b900b 100644 --- a/tests/baselines/reference/iteratorSpreadInCall12.js +++ b/tests/baselines/reference/iteratorSpreadInCall12.js @@ -32,12 +32,7 @@ class StringIterator { } //// [iteratorSpreadInCall12.js] -new Foo(...[ - ...new SymbolIterator, - ...[ - ...new StringIterator - ] -]); +new Foo(...[...new SymbolIterator, ...[...new StringIterator]]); class Foo { constructor(...s) { } diff --git a/tests/baselines/reference/iteratorSpreadInCall2.js b/tests/baselines/reference/iteratorSpreadInCall2.js index d833cd77fb0..6c3517857d5 100644 --- a/tests/baselines/reference/iteratorSpreadInCall2.js +++ b/tests/baselines/reference/iteratorSpreadInCall2.js @@ -17,8 +17,7 @@ class SymbolIterator { //// [iteratorSpreadInCall2.js] foo(...new SymbolIterator); -function foo(s) { -} +function foo(s) { } class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall3.js b/tests/baselines/reference/iteratorSpreadInCall3.js index 17d0a3ed37d..b33ceae7bfd 100644 --- a/tests/baselines/reference/iteratorSpreadInCall3.js +++ b/tests/baselines/reference/iteratorSpreadInCall3.js @@ -17,8 +17,7 @@ class SymbolIterator { //// [iteratorSpreadInCall3.js] foo(...new SymbolIterator); -function foo(...s) { -} +function foo(...s) { } class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall4.js b/tests/baselines/reference/iteratorSpreadInCall4.js index e1888f47634..7819a1ba6f9 100644 --- a/tests/baselines/reference/iteratorSpreadInCall4.js +++ b/tests/baselines/reference/iteratorSpreadInCall4.js @@ -17,8 +17,7 @@ class SymbolIterator { //// [iteratorSpreadInCall4.js] foo(...new SymbolIterator); -function foo(s1, ...s) { -} +function foo(s1, ...s) { } class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall5.js b/tests/baselines/reference/iteratorSpreadInCall5.js index 2b7be4cdce6..a4a30ee0166 100644 --- a/tests/baselines/reference/iteratorSpreadInCall5.js +++ b/tests/baselines/reference/iteratorSpreadInCall5.js @@ -30,8 +30,7 @@ class StringIterator { //// [iteratorSpreadInCall5.js] foo(...new SymbolIterator, ...new StringIterator); -function foo(...s) { -} +function foo(...s) { } class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall6.js b/tests/baselines/reference/iteratorSpreadInCall6.js index 87e96d039de..8ad60be911e 100644 --- a/tests/baselines/reference/iteratorSpreadInCall6.js +++ b/tests/baselines/reference/iteratorSpreadInCall6.js @@ -30,8 +30,7 @@ class StringIterator { //// [iteratorSpreadInCall6.js] foo(...new SymbolIterator, ...new StringIterator); -function foo(...s) { -} +function foo(...s) { } class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall7.js b/tests/baselines/reference/iteratorSpreadInCall7.js index 1b7e53ba47a..4a56b75d236 100644 --- a/tests/baselines/reference/iteratorSpreadInCall7.js +++ b/tests/baselines/reference/iteratorSpreadInCall7.js @@ -30,9 +30,7 @@ class StringIterator { //// [iteratorSpreadInCall7.js] foo(...new SymbolIterator, ...new StringIterator); -function foo(...s) { - return s[0]; -} +function foo(...s) { return s[0]; } class SymbolIterator { next() { return { diff --git a/tests/baselines/reference/iteratorSpreadInCall9.js b/tests/baselines/reference/iteratorSpreadInCall9.js index 2efd94683c0..2a73ee29c34 100644 --- a/tests/baselines/reference/iteratorSpreadInCall9.js +++ b/tests/baselines/reference/iteratorSpreadInCall9.js @@ -32,9 +32,7 @@ class StringIterator { } //// [iteratorSpreadInCall9.js] -new Foo(...new SymbolIterator, ...[ - ...new StringIterator -]); +new Foo(...new SymbolIterator, ...[...new StringIterator]); class Foo { constructor(...s) { } From 180f17d088215da098612f9f5b37d8ecc0ef058f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 17:02:42 -0700 Subject: [PATCH 34/35] Destructure arguments at dispatched calls. --- src/server/session.ts | 114 +++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 69 deletions(-) diff --git a/src/server/session.ts b/src/server/session.ts index faedce0e1af..09373d6bf96 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -118,7 +118,7 @@ module ts.server { constructor(private host: ServerHost, private logger: Logger) { this.projectService = - new ProjectService(host, logger, (eventName,project,fileName) => { + new ProjectService(host, logger, (eventName, project, fileName) => { this.handleEvent(eventName, project, fileName); }); } @@ -263,7 +263,7 @@ module ts.server { } } - getDefinition(line: number, offset: number, fileName: string): protocol.FileSpan[] { + getDefinition({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.FileSpan[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -285,7 +285,7 @@ module ts.server { })); } - getOccurrences(line: number, offset: number, fileName: string): protocol.OccurrencesResponseItem[] { + getOccurrences({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.OccurrencesResponseItem[] { fileName = ts.normalizePath(fileName); let project = this.projectService.getProjectForFile(fileName); @@ -315,7 +315,7 @@ module ts.server { }); } - getRenameLocations(line: number, offset: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody { + getRenameLocations({line, offset, file: fileName, findInComments, findInStrings }: protocol.RenameRequestArgs): protocol.RenameResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -383,7 +383,7 @@ module ts.server { return { info: renameInfo, locs: bakedRenameLocs }; } - getReferences(line: number, offset: number, fileName: string): protocol.ReferencesResponseBody { + getReferences({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.ReferencesResponseBody { // TODO: get all projects for this file; report refs for all projects deleting duplicates // can avoid duplicates by eliminating same ref file from subsequent projects var file = ts.normalizePath(fileName); @@ -430,12 +430,12 @@ module ts.server { }; } - openClientFile(fileName: string) { + openClientFile({ file: fileName }: protocol.OpenRequestArgs) { var file = ts.normalizePath(fileName); this.projectService.openClientFile(file); } - getQuickInfo(line: number, offset: number, fileName: string): protocol.QuickInfoResponseBody { + getQuickInfo({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.QuickInfoResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -461,7 +461,7 @@ module ts.server { }; } - getFormattingEditsForRange(line: number, offset: number, endLine: number, endOffset: number, fileName: string): protocol.CodeEdit[] { + getFormattingEditsForRange({line, offset, endLine, endOffset, file: fileName}: protocol.FormatRequestArgs): protocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -488,7 +488,7 @@ module ts.server { }); } - getFormattingEditsAfterKeystroke(line: number, offset: number, key: string, fileName: string): protocol.CodeEdit[] { + getFormattingEditsAfterKeystroke({line, offset, key, file: fileName}: protocol.FormatOnKeyRequestArgs): protocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -561,7 +561,7 @@ module ts.server { }); } - getCompletions(line: number, offset: number, prefix: string, fileName: string): protocol.CompletionEntry[] { + getCompletions({ line, offset, prefix, file: fileName}: protocol.CompletionsRequestArgs): protocol.CompletionEntry[] { if (!prefix) { prefix = ""; } @@ -587,8 +587,7 @@ module ts.server { }, []).sort((a, b) => a.name.localeCompare(b.name)); } - getCompletionEntryDetails(line: number, offset: number, - entryNames: string[], fileName: string): protocol.CompletionEntryDetails[] { + getCompletionEntryDetails({ line, offset, entryNames, file: fileName}: protocol.CompletionDetailsRequestArgs): protocol.CompletionEntryDetails[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -607,20 +606,20 @@ module ts.server { }, []); } - getSignatureHelpItems(line: number, offset: number, fileName: string): protocol.SignatureHelpItems { + getSignatureHelpItems({ line, offset, file: fileName }: protocol.SignatureHelpRequestArgs): protocol.SignatureHelpItems { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { throw Errors.NoProject; } - + var compilerService = project.compilerService; var position = compilerService.host.lineOffsetToPosition(file, line, offset); var helpItems = compilerService.languageService.getSignatureHelpItems(file, position); if (!helpItems) { return undefined; } - + var span = helpItems.applicableSpan; var result: protocol.SignatureHelpItems = { items: helpItems.items, @@ -632,11 +631,11 @@ module ts.server { argumentIndex: helpItems.argumentIndex, argumentCount: helpItems.argumentCount, } - + return result; } - - getDiagnostics(delay: number, fileNames: string[]) { + + getDiagnostics({ delay, files: fileNames }: protocol.GeterrRequestArgs): void { var checkList = fileNames.reduce((accum: PendingErrorCheck[], fileName: string) => { fileName = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(fileName); @@ -647,11 +646,11 @@ module ts.server { }, []); if (checkList.length > 0) { - this.updateErrorCheck(checkList, this.changeSeq,(n) => n == this.changeSeq, delay) + this.updateErrorCheck(checkList, this.changeSeq, (n) => n == this.changeSeq, delay) } } - change(line: number, offset: number, endLine: number, endOffset: number, insertString: string, fileName: string) { + change({ line, offset, endLine, endOffset, insertString, file: fileName }: protocol.ChangeRequestArgs): void { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (project) { @@ -666,7 +665,7 @@ module ts.server { } } - reload(fileName: string, tempFileName: string, reqSeq = 0) { + reload({ file: fileName, tmpfile: tempFileName }: protocol.ReloadRequestArgs, reqSeq = 0): void { var file = ts.normalizePath(fileName); var tmpfile = ts.normalizePath(tempFileName); var project = this.projectService.getProjectForFile(file); @@ -679,7 +678,7 @@ module ts.server { } } - saveToTmp(fileName: string, tempFileName: string) { + saveToTmp({ file: fileName, tmpfile: tempFileName }: protocol.SavetoRequestArgs): void { var file = ts.normalizePath(fileName); var tmpfile = ts.normalizePath(tempFileName); @@ -689,7 +688,7 @@ module ts.server { } } - closeClientFile(fileName: string) { + closeClientFile({ file: fileName }: protocol.FileRequestArgs) { var file = ts.normalizePath(fileName); this.projectService.closeClientFile(file); } @@ -713,7 +712,7 @@ module ts.server { })); } - getNavigationBarItems(fileName: string): protocol.NavigationBarItem[] { + getNavigationBarItems({ file: fileName }: protocol.FileRequestArgs): protocol.NavigationBarItem[]{ var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -729,7 +728,7 @@ module ts.server { return this.decorateNavigationBarItem(project, fileName, items); } - getNavigateToItems(searchValue: string, fileName: string, maxResultCount?: number): protocol.NavtoItem[] { + getNavigateToItems({ searchValue, file: fileName, maxResultCount }: protocol.NavtoRequestArgs): protocol.NavtoItem[]{ var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -768,7 +767,7 @@ module ts.server { }); } - getBraceMatching(line: number, offset: number, fileName: string): protocol.TextSpan[] { + getBraceMatching({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.TextSpan[]{ var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -810,114 +809,91 @@ module ts.server { break; } case CommandNames.Definition: { - var defArgs = request.arguments; - response = this.getDefinition(defArgs.line, defArgs.offset, defArgs.file); + response = this.getDefinition(request.arguments); break; } case CommandNames.References: { - var refArgs = request.arguments; - response = this.getReferences(refArgs.line, refArgs.offset, refArgs.file); + response = this.getReferences(request.arguments); break; } case CommandNames.Rename: { - var renameArgs = request.arguments; - response = this.getRenameLocations(renameArgs.line, renameArgs.offset, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings); + response = this.getRenameLocations(request.arguments); break; } case CommandNames.Open: { - var openArgs = request.arguments; - this.openClientFile(openArgs.file); + this.openClientFile(request.arguments); responseRequired = false; break; } case CommandNames.Quickinfo: { - var quickinfoArgs = request.arguments; - response = this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.offset, quickinfoArgs.file); + response = this.getQuickInfo(request.arguments); break; } case CommandNames.Format: { - var formatArgs = request.arguments; - response = this.getFormattingEditsForRange(formatArgs.line, formatArgs.offset, formatArgs.endLine, formatArgs.endOffset, formatArgs.file); + response = this.getFormattingEditsForRange(request.arguments); break; } case CommandNames.Formatonkey: { - var formatOnKeyArgs = request.arguments; - response = this.getFormattingEditsAfterKeystroke(formatOnKeyArgs.line, formatOnKeyArgs.offset, formatOnKeyArgs.key, formatOnKeyArgs.file); + response = this.getFormattingEditsAfterKeystroke(request.arguments); break; } case CommandNames.Completions: { - var completionsArgs = request.arguments; - response = this.getCompletions(completionsArgs.line, completionsArgs.offset, completionsArgs.prefix, completionsArgs.file); + response = this.getCompletions(request.arguments); break; } case CommandNames.CompletionDetails: { - var completionDetailsArgs = request.arguments; - response = - this.getCompletionEntryDetails(completionDetailsArgs.line,completionDetailsArgs.offset, - completionDetailsArgs.entryNames,completionDetailsArgs.file); + response = this.getCompletionEntryDetails(request.arguments); break; } case CommandNames.SignatureHelp: { - var signatureHelpArgs = request.arguments; - response = this.getSignatureHelpItems(signatureHelpArgs.line, signatureHelpArgs.offset, signatureHelpArgs.file); + response = this.getSignatureHelpItems(request.arguments); break; } case CommandNames.Geterr: { - var geterrArgs = request.arguments; - response = this.getDiagnostics(geterrArgs.delay, geterrArgs.files); + this.getDiagnostics(request.arguments); responseRequired = false; break; } case CommandNames.Change: { - var changeArgs = request.arguments; - this.change(changeArgs.line, changeArgs.offset, changeArgs.endLine, changeArgs.endOffset, - changeArgs.insertString, changeArgs.file); + this.change(request.arguments); responseRequired = false; break; } case CommandNames.Configure: { - var configureArgs = request.arguments; - this.projectService.setHostConfiguration(configureArgs); + this.projectService.setHostConfiguration(request.arguments); this.output(undefined, CommandNames.Configure, request.seq); responseRequired = false; break; } case CommandNames.Reload: { - var reloadArgs = request.arguments; - this.reload(reloadArgs.file, reloadArgs.tmpfile, request.seq); + this.reload(request.arguments); responseRequired = false; break; } case CommandNames.Saveto: { - var savetoArgs = request.arguments; - this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile); + this.saveToTmp(request.arguments); responseRequired = false; break; } case CommandNames.Close: { - var closeArgs = request.arguments; - this.closeClientFile(closeArgs.file); + this.closeClientFile(request.arguments); responseRequired = false; break; } case CommandNames.Navto: { - var navtoArgs = request.arguments; - response = this.getNavigateToItems(navtoArgs.searchValue, navtoArgs.file, navtoArgs.maxResultCount); + response = this.getNavigateToItems(request.arguments); break; } case CommandNames.Brace: { - var braceArguments = request.arguments; - response = this.getBraceMatching(braceArguments.line, braceArguments.offset, braceArguments.file); + response = this.getBraceMatching(request.arguments); break; } case CommandNames.NavBar: { - var navBarArgs = request.arguments; - response = this.getNavigationBarItems(navBarArgs.file); + response = this.getNavigationBarItems(request.arguments); break; } case CommandNames.Occurrences: { - var { line, offset, file: fileName } = request.arguments; - response = this.getOccurrences(line, offset, fileName); + response = this.getOccurrences(request.arguments); break; } default: { From 55d6e1068754a3c227d5408a7a91e0952376f201 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 9 Apr 2015 15:19:17 +0200 Subject: [PATCH 35/35] support URI patterns --- src/compiler/core.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 4b93081dc31..65c711475d6 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -434,7 +434,7 @@ module ts { return path.replace(/\\/g, "/"); } - // Returns length of path root (i.e. length of "/", "x:/", "//server/share/") + // Returns length of path root (i.e. length of "/", "x:/", "//server/share/, file:///user/files") export function getRootLength(path: string): number { if (path.charCodeAt(0) === CharacterCodes.slash) { if (path.charCodeAt(1) !== CharacterCodes.slash) return 1; @@ -448,6 +448,8 @@ module ts { if (path.charCodeAt(2) === CharacterCodes.slash) return 3; return 2; } + let idx = path.indexOf('://'); + if (idx !== -1) return idx + 3 return 0; }