Skip to content

Commit 609cd00

Browse files
committed
Merge branch 'object-spread' into object-rest
2 parents 4c365bd + f03fecb commit 609cd00

File tree

86 files changed

+1927
-583
lines changed

Some content is hidden

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

86 files changed

+1927
-583
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
"travis-fold": "latest",
7777
"ts-node": "latest",
7878
"tsd": "latest",
79-
"tslint": "next",
79+
"tslint": "4.0.0-dev.0",
8080
"typescript": "next"
8181
},
8282
"scripts": {

src/compiler/binder.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,8 +1138,8 @@ namespace ts {
11381138
}
11391139
else if (node.kind === SyntaxKind.ArrayLiteralExpression) {
11401140
for (const e of (<ArrayLiteralExpression>node).elements) {
1141-
if (e.kind === SyntaxKind.SpreadExpression) {
1142-
bindAssignmentTargetFlow((<SpreadExpression>e).expression);
1141+
if (e.kind === SyntaxKind.SpreadElement) {
1142+
bindAssignmentTargetFlow((<SpreadElement>e).expression);
11431143
}
11441144
else {
11451145
bindDestructuringTargetFlow(e);
@@ -1154,8 +1154,8 @@ namespace ts {
11541154
else if (p.kind === SyntaxKind.ShorthandPropertyAssignment) {
11551155
bindAssignmentTargetFlow((<ShorthandPropertyAssignment>p).name);
11561156
}
1157-
else if (p.kind === SyntaxKind.SpreadElementExpression) {
1158-
bindAssignmentTargetFlow((<SpreadElementExpression>p).expression);
1157+
else if (p.kind === SyntaxKind.SpreadAssignment) {
1158+
bindAssignmentTargetFlow((<SpreadAssignment>p).expression);
11591159
}
11601160
}
11611161
}
@@ -1237,9 +1237,11 @@ namespace ts {
12371237
const postExpressionLabel = createBranchLabel();
12381238
bindCondition(node.condition, trueLabel, falseLabel);
12391239
currentFlow = finishFlowLabel(trueLabel);
1240+
bind(node.questionToken);
12401241
bind(node.whenTrue);
12411242
addAntecedent(postExpressionLabel, currentFlow);
12421243
currentFlow = finishFlowLabel(falseLabel);
1244+
bind(node.colonToken);
12431245
bind(node.whenFalse);
12441246
addAntecedent(postExpressionLabel, currentFlow);
12451247
currentFlow = finishFlowLabel(postExpressionLabel);
@@ -1932,7 +1934,7 @@ namespace ts {
19321934
case SyntaxKind.EnumMember:
19331935
return bindPropertyOrMethodOrAccessor(<Declaration>node, SymbolFlags.EnumMember, SymbolFlags.EnumMemberExcludes);
19341936

1935-
case SyntaxKind.SpreadElementExpression:
1937+
case SyntaxKind.SpreadAssignment:
19361938
case SyntaxKind.JsxSpreadAttribute:
19371939
let root = container;
19381940
let hasRest = false;
@@ -3174,9 +3176,9 @@ namespace ts {
31743176
}
31753177
break;
31763178

3177-
case SyntaxKind.SpreadExpression:
3178-
case SyntaxKind.SpreadElementExpression:
3179-
// This node is ES2015 or ES next syntax, but is handled by a containing node.
3179+
case SyntaxKind.SpreadElement:
3180+
case SyntaxKind.SpreadAssignment:
3181+
// This node is ES6 or ES next syntax, but is handled by a containing node.
31803182
transformFlags |= TransformFlags.ContainsSpreadExpression;
31813183
break;
31823184

src/compiler/checker.ts

Lines changed: 81 additions & 42 deletions
Large diffs are not rendered by default.

src/compiler/commandLineParser.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ namespace ts {
265265
"es2015": ScriptTarget.ES2015,
266266
"es2016": ScriptTarget.ES2016,
267267
"es2017": ScriptTarget.ES2017,
268+
"esnext": ScriptTarget.ESNext,
268269
}),
269270
description: Diagnostics.Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES2015,
270271
paramType: Diagnostics.VERSION,

src/compiler/core.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,18 @@ namespace ts {
11271127
};
11281128
}
11291129

1130+
export function createCompilerDiagnosticFromMessageChain(chain: DiagnosticMessageChain): Diagnostic {
1131+
return {
1132+
file: undefined,
1133+
start: undefined,
1134+
length: undefined,
1135+
1136+
code: chain.code,
1137+
category: chain.category,
1138+
messageText: chain.next ? chain : chain.messageText
1139+
};
1140+
}
1141+
11301142
export function chainDiagnosticMessages(details: DiagnosticMessageChain, message: DiagnosticMessage, ...args: any[]): DiagnosticMessageChain;
11311143
export function chainDiagnosticMessages(details: DiagnosticMessageChain, message: DiagnosticMessage): DiagnosticMessageChain {
11321144
let text = getLocaleSpecificMessage(message);

src/compiler/diagnosticMessages.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2897,6 +2897,14 @@
28972897
"category": "Error",
28982898
"code": 6143
28992899
},
2900+
"Module '{0}' was resolved as locally declared ambient module in file '{1}'.": {
2901+
"category": "Message",
2902+
"code": 6144
2903+
},
2904+
"Module '{0}' was resolved as ambient module declared in '{1}' since this file was not modified.": {
2905+
"category": "Message",
2906+
"code": 6145
2907+
},
29002908
"Variable '{0}' implicitly has an '{1}' type.": {
29012909
"category": "Error",
29022910
"code": 7005
@@ -3158,5 +3166,9 @@
31583166
"Implement inherited abstract class": {
31593167
"category": "Message",
31603168
"code": 90007
3169+
},
3170+
"Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig": {
3171+
"category": "Error",
3172+
"code": 90009
31613173
}
31623174
}

src/compiler/emitter.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,8 @@ const _super = (function (geti, seti) {
741741
return emitPropertyAssignment(<PropertyAssignment>node);
742742
case SyntaxKind.ShorthandPropertyAssignment:
743743
return emitShorthandPropertyAssignment(<ShorthandPropertyAssignment>node);
744+
case SyntaxKind.SpreadAssignment:
745+
return emitSpreadAssignment(node as SpreadAssignment);
744746

745747
// Enum
746748
case SyntaxKind.EnumMember:
@@ -831,8 +833,8 @@ const _super = (function (geti, seti) {
831833
return emitTemplateExpression(<TemplateExpression>node);
832834
case SyntaxKind.YieldExpression:
833835
return emitYieldExpression(<YieldExpression>node);
834-
case SyntaxKind.SpreadExpression:
835-
return emitSpreadExpression(<SpreadExpression>node);
836+
case SyntaxKind.SpreadElement:
837+
return emitSpreadExpression(<SpreadElement>node);
836838
case SyntaxKind.ClassExpression:
837839
return emitClassExpression(<ClassExpression>node);
838840
case SyntaxKind.OmittedExpression:
@@ -1383,7 +1385,7 @@ const _super = (function (geti, seti) {
13831385
emitExpressionWithPrefix(" ", node.expression);
13841386
}
13851387

1386-
function emitSpreadExpression(node: SpreadExpression) {
1388+
function emitSpreadExpression(node: SpreadElement) {
13871389
write("...");
13881390
emitExpression(node.expression);
13891391
}
@@ -2111,6 +2113,13 @@ const _super = (function (geti, seti) {
21112113
}
21122114
}
21132115

2116+
function emitSpreadAssignment(node: SpreadAssignment) {
2117+
if (node.expression) {
2118+
write("...");
2119+
emitExpression(node.expression);
2120+
}
2121+
}
2122+
21142123
//
21152124
// Enum
21162125
//
@@ -2214,7 +2223,10 @@ const _super = (function (geti, seti) {
22142223
helpersEmitted = true;
22152224
}
22162225

2217-
if (compilerOptions.jsx !== JsxEmit.Preserve && !assignEmitted && (node.flags & NodeFlags.HasSpreadAttribute)) {
2226+
if ((languageVersion < ScriptTarget.ESNext || currentSourceFile.scriptKind === ScriptKind.JSX || currentSourceFile.scriptKind === ScriptKind.TSX) &&
2227+
compilerOptions.jsx !== JsxEmit.Preserve &&
2228+
!assignEmitted &&
2229+
node.flags & NodeFlags.HasSpreadAttribute) {
22182230
writeLines(assignHelper);
22192231
assignEmitted = true;
22202232
}

src/compiler/factory.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -692,12 +692,12 @@ namespace ts {
692692
}
693693

694694
export function createSpread(expression: Expression, location?: TextRange) {
695-
const node = <SpreadExpression>createNode(SyntaxKind.SpreadExpression, location);
695+
const node = <SpreadElement>createNode(SyntaxKind.SpreadElement, location);
696696
node.expression = parenthesizeExpressionForList(expression);
697697
return node;
698698
}
699699

700-
export function updateSpread(node: SpreadExpression, expression: Expression) {
700+
export function updateSpread(node: SpreadElement, expression: Expression) {
701701
if (node.expression !== expression) {
702702
return updateNode(createSpread(expression, node), node);
703703
}
@@ -1399,14 +1399,27 @@ namespace ts {
13991399
return node;
14001400
}
14011401

1402-
export function updateShorthandPropertyAssignment(node: ShorthandPropertyAssignment, name: Identifier, objectAssignmentInitializer: Expression) {
1402+
export function createSpreadAssignment(expression: Expression, location?: TextRange) {
1403+
const node = <SpreadAssignment>createNode(SyntaxKind.SpreadAssignment, location);
1404+
node.expression = expression !== undefined ? parenthesizeExpressionForList(expression) : undefined;
1405+
return node;
1406+
}
1407+
1408+
export function updateShorthandPropertyAssignment(node: ShorthandPropertyAssignment, name: Identifier, objectAssignmentInitializer: Expression) {
14031409
if (node.name !== name || node.objectAssignmentInitializer !== objectAssignmentInitializer) {
14041410
return updateNode(createShorthandPropertyAssignment(name, objectAssignmentInitializer, node), node);
14051411
}
14061412
return node;
14071413
}
14081414

1409-
// Top-level nodes
1415+
export function updateSpreadAssignment(node: SpreadAssignment, expression: Expression) {
1416+
if (node.expression !== expression) {
1417+
return updateNode(createSpreadAssignment(expression, node), node);
1418+
}
1419+
return node;
1420+
}
1421+
1422+
// Top-level nodes
14101423

14111424
export function updateSourceFileNode(node: SourceFile, statements: Statement[]) {
14121425
if (node.statements !== statements) {

src/compiler/moduleNameResolver.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
/// <reference path="diagnosticInformationMap.generated.ts" />
33

44
namespace ts {
5-
function trace(host: ModuleResolutionHost, message: DiagnosticMessage, ...args: any[]): void;
6-
function trace(host: ModuleResolutionHost): void {
5+
6+
/* @internal */
7+
export function trace(host: ModuleResolutionHost, message: DiagnosticMessage, ...args: any[]): void;
8+
export function trace(host: ModuleResolutionHost): void {
79
host.trace(formatMessage.apply(undefined, arguments));
810
}
911

10-
function isTraceEnabled(compilerOptions: CompilerOptions, host: ModuleResolutionHost): boolean {
12+
/* @internal */
13+
export function isTraceEnabled(compilerOptions: CompilerOptions, host: ModuleResolutionHost): boolean {
1114
return compilerOptions.traceResolution && host.trace !== undefined;
1215
}
1316

src/compiler/parser.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ namespace ts {
7474
visitNode(cbNode, (<ShorthandPropertyAssignment>node).questionToken) ||
7575
visitNode(cbNode, (<ShorthandPropertyAssignment>node).equalsToken) ||
7676
visitNode(cbNode, (<ShorthandPropertyAssignment>node).objectAssignmentInitializer);
77-
case SyntaxKind.SpreadElementExpression:
78-
return visitNode(cbNode, (<SpreadElementExpression>node).expression);
77+
case SyntaxKind.SpreadAssignment:
78+
return visitNode(cbNode, (<SpreadAssignment>node).expression);
7979
case SyntaxKind.Parameter:
8080
case SyntaxKind.PropertyDeclaration:
8181
case SyntaxKind.PropertySignature:
@@ -199,8 +199,8 @@ namespace ts {
199199
visitNode(cbNode, (<ConditionalExpression>node).whenTrue) ||
200200
visitNode(cbNode, (<ConditionalExpression>node).colonToken) ||
201201
visitNode(cbNode, (<ConditionalExpression>node).whenFalse);
202-
case SyntaxKind.SpreadExpression:
203-
return visitNode(cbNode, (<SpreadExpression>node).expression);
202+
case SyntaxKind.SpreadElement:
203+
return visitNode(cbNode, (<SpreadElement>node).expression);
204204
case SyntaxKind.Block:
205205
case SyntaxKind.ModuleBlock:
206206
return visitNodes(cbNodes, (<Block>node).statements);
@@ -4130,15 +4130,15 @@ namespace ts {
41304130
return finishNode(node);
41314131
}
41324132

4133-
function parseSpreadExpression(): Expression {
4134-
const node = <SpreadExpression>createNode(SyntaxKind.SpreadExpression);
4133+
function parseSpreadElement(): Expression {
4134+
const node = <SpreadElement>createNode(SyntaxKind.SpreadElement);
41354135
parseExpected(SyntaxKind.DotDotDotToken);
41364136
node.expression = parseAssignmentExpressionOrHigher();
41374137
return finishNode(node);
41384138
}
41394139

41404140
function parseArgumentOrArrayLiteralElement(): Expression {
4141-
return token() === SyntaxKind.DotDotDotToken ? parseSpreadExpression() :
4141+
return token() === SyntaxKind.DotDotDotToken ? parseSpreadElement() :
41424142
token() === SyntaxKind.CommaToken ? <Expression>createNode(SyntaxKind.OmittedExpression) :
41434143
parseAssignmentExpressionOrHigher();
41444144
}
@@ -4173,7 +4173,7 @@ namespace ts {
41734173
const fullStart = scanner.getStartPos();
41744174
const dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken);
41754175
if (dotDotDotToken) {
4176-
const spreadElement = <SpreadElementExpression>createNode(SyntaxKind.SpreadElementExpression, fullStart);
4176+
const spreadElement = <SpreadAssignment>createNode(SyntaxKind.SpreadAssignment, fullStart);
41774177
spreadElement.expression = parseAssignmentExpressionOrHigher();
41784178
return addJSDocComment(finishNode(spreadElement));
41794179
}

0 commit comments

Comments
 (0)