Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Object spread #11150

Merged
merged 103 commits into from
Nov 10, 2016
Merged
Show file tree
Hide file tree
Changes from 74 commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
a3ffe6f
Parse, bind and check spread types and elements
sandersn Sep 26, 2016
7004652
Declaration emit spread types and downlevel spread
sandersn Sep 26, 2016
bf866ce
Update build files
sandersn Sep 26, 2016
0fea59f
Add spread tests
sandersn Sep 26, 2016
c8db211
Update baselines
sandersn Sep 26, 2016
3938559
Move interfaceSpread to correct location
sandersn Sep 26, 2016
63f8c99
Object.assign uses spread types now
sandersn Sep 26, 2016
a0db197
Rename Spread[Element]Expression
sandersn Sep 26, 2016
9a7ebb0
Change new file to use CRLF
sandersn Sep 26, 2016
cfdf751
Make index signatures work on spread types
sandersn Sep 27, 2016
d6e414c
Test spread type index signatures
sandersn Sep 27, 2016
429b0d9
Union multiple spread index signatures
sandersn Sep 27, 2016
78420ad
Test object spread index signatures
sandersn Sep 27, 2016
7e7a26a
Spreads w/a single type parameter assignable to that type parameter
sandersn Sep 27, 2016
0f773c5
Add object spread scenario tests
sandersn Sep 27, 2016
484e66f
Merge branch 'master' into object-spread
sandersn Sep 28, 2016
62c5bda
isDeclaredProperty: Use optional-boolean idiom
sandersn Sep 28, 2016
05ef9dd
Merge branch 'master' into object-spread
sandersn Sep 29, 2016
b9af986
Update object spread scenarios test
sandersn Oct 3, 2016
d4e910f
Merge branch 'master' into object-spread
sandersn Oct 3, 2016
57850ec
Add more generic assignability cases
sandersn Oct 3, 2016
cec3a37
Merge branch 'master' into object-spread
sandersn Oct 7, 2016
d770c56
Switch spread types to a binary representation.
sandersn Oct 7, 2016
9872075
Spread type:new assignability+simplification tests
sandersn Oct 7, 2016
df73579
Update baselines
sandersn Oct 7, 2016
0d3f567
Merge branch 'master' into object-spread
sandersn Oct 10, 2016
4eedfea
Support unions/intersections in spread types
sandersn Oct 10, 2016
0dd1f0c
Add tests and update baselines.
sandersn Oct 10, 2016
4ee4b6b
Merge branch 'master' into object-spread
sandersn Oct 11, 2016
1b3b35f
Type inference for spread types
sandersn Oct 11, 2016
4bc4a00
Test spread type inference+more index signature tests
sandersn Oct 11, 2016
7417af6
Update baselines
sandersn Oct 11, 2016
ce373d9
Revert lib.d.ts error message baseline (unrelated)
sandersn Oct 11, 2016
97dda6e
Remove emacs-added newline at end of baseline
sandersn Oct 12, 2016
c5228d3
Remove space at end of line in baseline
sandersn Oct 12, 2016
5a037ad
Add numeric indexer to strings and remove lint
sandersn Oct 12, 2016
1728ae1
Update baselines with spread string's numeric indexers
sandersn Oct 12, 2016
ab1b2bb
Reset baseline line number to the locally incorrect value
sandersn Oct 12, 2016
3a85312
Remove trailing newline from baseline again
sandersn Oct 12, 2016
dceebcd
Refactor getTypeFromTypeLiteral, from PR comments
sandersn Oct 12, 2016
ce84cee
Fix lint
sandersn Oct 12, 2016
b6819dc
Merge branch 'master' into object-spread
sandersn Oct 14, 2016
f9fe01a
Merge branch 'master' into object-spread
sandersn Oct 19, 2016
18c692a
Remove type inference for spread types
sandersn Oct 19, 2016
62c1868
Update inference test for spread types
sandersn Oct 19, 2016
a909053
Make spread assignability and apparent type stricter
sandersn Oct 19, 2016
ad10ec5
Update tests w/spread assignability+apparent type
sandersn Oct 19, 2016
76d1944
Spread no longer distributes intersections
sandersn Oct 20, 2016
d9afa34
Update spread w/intersection tests
sandersn Oct 20, 2016
7d05ccb
Merge branch 'master' into object-spread
sandersn Oct 20, 2016
3cbac65
Merge branch 'master' into object-spread
sandersn Oct 20, 2016
ce61b34
Resolve all-object intersections inside spreads
sandersn Oct 21, 2016
422f73b
Update and improve spread intersection tests
sandersn Oct 21, 2016
fdfb159
Simplify expression in resolveObjectIntersection
sandersn Oct 21, 2016
ff92afd
Update baselines with new index signature rules
sandersn Oct 21, 2016
510ab1c
Move n-ary spread handling into separate function.
sandersn Oct 21, 2016
485e249
Move multiple-spread handling out of getSpreadType
sandersn Oct 22, 2016
16dfdc4
Clean up and reorder getSpreadType body
sandersn Oct 22, 2016
66d4798
Error for call/construct signatures in spread type
sandersn Oct 24, 2016
2430093
Update baselines with new spread type index errors
sandersn Oct 24, 2016
a94fb2f
Explain writeSpreadType a little better
sandersn Oct 24, 2016
35be8c3
Add more commentary to getSpreadType
sandersn Oct 24, 2016
8f59993
Merge branch 'master' into object-spread
sandersn Oct 24, 2016
32af046
Merge branch 'master' into object-spread
sandersn Oct 24, 2016
58ffb4e
Merge branch 'master' into object-spread
sandersn Oct 27, 2016
39b9163
Rename Experimental transform to ESNext
sandersn Oct 27, 2016
988bf1f
Rename TransformFlags.Experimental -> ESNext
sandersn Oct 28, 2016
2ae6ecc
Merge branch 'master' into object-spread
sandersn Nov 2, 2016
f2d739f
Spread types handle nested index [access] types
sandersn Nov 2, 2016
f65dd21
Test index [access] types inside spread types
sandersn Nov 2, 2016
a7c1836
Parse, bind and check rest elements
sandersn Nov 2, 2016
e3a08ed
Downlevel emit of rest elements
sandersn Nov 2, 2016
ac20b46
Add rest tests
sandersn Nov 2, 2016
9d4ddb6
Update baselines
sandersn Nov 2, 2016
334820c
Remove spread types, leaving spread syntax/emit
sandersn Nov 2, 2016
a632020
Fix lint
sandersn Nov 2, 2016
a077fd1
Remove spread type tests from spread tests
sandersn Nov 3, 2016
7a2c7ad
Spread handles index signatures from singleton spreads
sandersn Nov 3, 2016
7ff8876
Merge branch 'object-spread' into object-rest-syntax
sandersn Nov 3, 2016
7ed5204
Update objectRestAssignment test and baselines
sandersn Nov 3, 2016
14f8b99
Update objectRestAssignment test
sandersn Nov 3, 2016
c9c5f49
Improve readability of ES next destructuring emit
sandersn Nov 3, 2016
71f3157
Address PR comments
sandersn Nov 4, 2016
cc342d1
Move convertForOf to factory for esnext and es2015
sandersn Nov 4, 2016
4337369
Update improved baselines
sandersn Nov 4, 2016
4c365bd
Move transformFunctionBody to factory
sandersn Nov 4, 2016
a55ed26
Spread any types to any
sandersn Nov 4, 2016
a84c7ae
Rename SpreadElementExpression -> SpreadAssignment
sandersn Nov 7, 2016
6a82ae4
Add SpreadAssignment to visitors
sandersn Nov 7, 2016
7b9a42f
Add --target esnext
sandersn Nov 7, 2016
d4a5b08
Add --target esnext tests and update baselines
sandersn Nov 7, 2016
83e95d4
Revert unneeded change and comments per PR
sandersn Nov 7, 2016
f03fecb
Merge branch 'master' into object-spread
sandersn Nov 7, 2016
609cd00
Merge branch 'object-spread' into object-rest
sandersn Nov 7, 2016
9977936
Do not emit __rest for --target esnext
sandersn Nov 7, 2016
567f563
Create spread property types eagerly
sandersn Nov 7, 2016
bd5ce28
Set spread type symbols in checkObjectLiteral
sandersn Nov 7, 2016
e1c50e1
Address more PR comments
sandersn Nov 7, 2016
214ce38
Downlevel array destructuring to ES6 in object rest
sandersn Nov 9, 2016
0196947
Improve nested destructuring test for ESNext emit
sandersn Nov 9, 2016
fcf32c4
Treat `| undefined` like optionality in spread type
sandersn Nov 9, 2016
9b1f43b
Add strictNullChecks test for object spread
sandersn Nov 9, 2016
25462c9
Merge pull request #12028 from Microsoft/object-rest
sandersn Nov 10, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Jakefile.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ var compilerSources = [
"transformers/destructuring.ts",
"transformers/ts.ts",
"transformers/jsx.ts",
"transformers/esnext.ts",
"transformers/es2017.ts",
"transformers/es2016.ts",
"transformers/es2015.ts",
Expand Down Expand Up @@ -107,6 +108,7 @@ var servicesSources = [
"transformers/destructuring.ts",
"transformers/ts.ts",
"transformers/jsx.ts",
"transformers/esnext.ts",
"transformers/es2017.ts",
"transformers/es2016.ts",
"transformers/es2015.ts",
Expand Down
31 changes: 21 additions & 10 deletions src/compiler/binder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1138,8 +1138,8 @@ namespace ts {
}
else if (node.kind === SyntaxKind.ArrayLiteralExpression) {
for (const e of (<ArrayLiteralExpression>node).elements) {
if (e.kind === SyntaxKind.SpreadElementExpression) {
bindAssignmentTargetFlow((<SpreadElementExpression>e).expression);
if (e.kind === SyntaxKind.SpreadExpression) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why SpreadExpression here, but SpreadElementExpression on 1157?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[ x, ...y] produces a SpreadExpression (now SpreadElement) for ...y. { x: 1, ...y } produces SpreadElementExpression (now SpreadAssignment) for ...y. So the nodes are actually different for arrays vs objects.

bindAssignmentTargetFlow((<SpreadExpression>e).expression);
}
else {
bindDestructuringTargetFlow(e);
Expand All @@ -1154,6 +1154,9 @@ namespace ts {
else if (p.kind === SyntaxKind.ShorthandPropertyAssignment) {
bindAssignmentTargetFlow((<ShorthandPropertyAssignment>p).name);
}
else if (p.kind === SyntaxKind.SpreadElementExpression) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been debating renaming this to remove the "Expression" part, since the node itself is not an Expression, and can only be used in an array literal, argument list, or binding pattern.

bindAssignmentTargetFlow((<SpreadElementExpression>p).expression);
}
}
}
}
Expand Down Expand Up @@ -1926,8 +1929,9 @@ namespace ts {
case SyntaxKind.EnumMember:
return bindPropertyOrMethodOrAccessor(<Declaration>node, SymbolFlags.EnumMember, SymbolFlags.EnumMemberExcludes);

case SyntaxKind.SpreadElementExpression:
case SyntaxKind.JsxSpreadAttribute:
emitFlags |= NodeFlags.HasJsxSpreadAttributes;
emitFlags |= NodeFlags.HasSpreadAttribute;
return;

case SyntaxKind.CallSignature:
Expand Down Expand Up @@ -2492,9 +2496,9 @@ namespace ts {
transformFlags |= TransformFlags.AssertTypeScript;
}

if (subtreeFlags & TransformFlags.ContainsSpreadElementExpression
if (subtreeFlags & TransformFlags.ContainsSpreadExpression
|| isSuperOrSuperProperty(expression, expressionKind)) {
// If the this node contains a SpreadElementExpression, or is a super call, then it is an ES6
// If the this node contains a SpreadExpression, or is a super call, then it is an ES6
// node.
transformFlags |= TransformFlags.AssertES2015;
}
Expand Down Expand Up @@ -2523,7 +2527,7 @@ namespace ts {
if (node.typeArguments) {
transformFlags |= TransformFlags.AssertTypeScript;
}
if (subtreeFlags & TransformFlags.ContainsSpreadElementExpression) {
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
// If the this node contains a SpreadElementExpression then it is an ES6
// node.
transformFlags |= TransformFlags.AssertES2015;
Expand Down Expand Up @@ -3123,9 +3127,10 @@ namespace ts {
}
break;

case SyntaxKind.SpreadExpression:
case SyntaxKind.SpreadElementExpression:
// This node is ES6 syntax, but is handled by a containing node.
transformFlags |= TransformFlags.ContainsSpreadElementExpression;
// This node is ES6 or ES future syntax, but is handled by a containing node.
transformFlags |= TransformFlags.ContainsSpreadExpression;
break;

case SyntaxKind.SuperKeyword:
Expand Down Expand Up @@ -3163,13 +3168,19 @@ namespace ts {
transformFlags |= TransformFlags.ContainsLexicalThis;
}

if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
// If an ObjectLiteralExpression contains a spread element, then it
// is an ES next node.
transformFlags |= TransformFlags.AssertESNext;
}

break;

case SyntaxKind.ArrayLiteralExpression:
case SyntaxKind.NewExpression:
excludeFlags = TransformFlags.ArrayLiteralOrCallOrNewExcludes;
if (subtreeFlags & TransformFlags.ContainsSpreadElementExpression) {
// If the this node contains a SpreadElementExpression, then it is an ES6
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
// If the this node contains a SpreadExpression, then it is an ES6
// node.
transformFlags |= TransformFlags.AssertES2015;
}
Expand Down
Loading