Skip to content

Commit b0ea401

Browse files
author
Yui T
committed
Emit Arrow function natively in ES6
1 parent 436baaf commit b0ea401

12 files changed

Lines changed: 45 additions & 31 deletions

src/compiler/emitter.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3219,7 +3219,15 @@ module ts {
32193219
// Methods will emit the comments as part of emitting method declaration
32203220
emitLeadingComments(node);
32213221
}
3222-
write("function ");
3222+
3223+
if (node.kind !== SyntaxKind.ArrowFunction) {
3224+
write("function ");
3225+
}
3226+
else if (node.kind === SyntaxKind.ArrowFunction && compilerOptions.target < ScriptTarget.ES6) {
3227+
// When targeting ES6, emit arrow function natively in ES6 by omitting function keyword and using fat arrow instead
3228+
write("function ");
3229+
}
3230+
32233231
if (node.kind === SyntaxKind.FunctionDeclaration || (node.kind === SyntaxKind.FunctionExpression && node.name)) {
32243232
emit(node.name);
32253233
}
@@ -3258,6 +3266,12 @@ module ts {
32583266
tempVariables = undefined;
32593267
tempParameters = undefined;
32603268
emitSignatureParameters(node);
3269+
3270+
// When targeting ES6, emit arrow function natively in ES6
3271+
if (node.kind === SyntaxKind.ArrowFunction && compilerOptions.target >= ScriptTarget.ES6) {
3272+
write(" => ");
3273+
}
3274+
32613275
write(" {");
32623276
scopeEmitStart(node);
32633277
increaseIndent();

src/harness/projectsRunner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ class ProjectRunner extends RunnerBase {
165165
sourceRoot: testCase.resolveSourceRoot && testCase.sourceRoot ? ts.sys.resolvePath(testCase.sourceRoot) : testCase.sourceRoot,
166166
module: moduleKind,
167167
noResolve: testCase.noResolve,
168-
target: ts.ScriptTarget.ES6
168+
target: ts.ScriptTarget.Latest
169169
};
170170
}
171171

tests/baselines/reference/constDeclarations-scopes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ function F() {
220220
const c = 0;
221221
n = c;
222222
}
223-
var F2 = function () {
223+
var F2 = () => {
224224
const c = 0;
225225
n = c;
226226
};
@@ -269,7 +269,7 @@ var o = {
269269
const c = 0;
270270
n = c;
271271
},
272-
f2: function () {
272+
f2: () => {
273273
const c = 0;
274274
n = c;
275275
}

tests/baselines/reference/constDeclarations-validContexts.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ const c18 = 0;
183183
function F() {
184184
const c19 = 0;
185185
}
186-
var F2 = function () {
186+
var F2 = () => {
187187
const c20 = 0;
188188
};
189189
var F3 = function () {
@@ -223,7 +223,7 @@ var o = {
223223
f() {
224224
const c28 = 0;
225225
},
226-
f2: function () {
226+
f2: () => {
227227
const c29 = 0;
228228
}
229229
};

tests/baselines/reference/letDeclarations-scopes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ function F() {
236236
let l = 0;
237237
n = l;
238238
}
239-
var F2 = function () {
239+
var F2 = () => {
240240
let l = 0;
241241
n = l;
242242
};
@@ -286,7 +286,7 @@ var o = {
286286
let l = 0;
287287
n = l;
288288
},
289-
f2: function () {
289+
f2: () => {
290290
let l = 0;
291291
n = l;
292292
}

tests/baselines/reference/letDeclarations-validContexts.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ let l18 = 0;
203203
function F() {
204204
let l19 = 0;
205205
}
206-
var F2 = function () {
206+
var F2 = () => {
207207
let l20 = 0;
208208
};
209209
var F3 = function () {
@@ -243,7 +243,7 @@ var o = {
243243
f() {
244244
let l28 = 0;
245245
},
246-
f2: function () {
246+
f2: () => {
247247
let l29 = 0;
248248
}
249249
};

tests/baselines/reference/project/prologueEmit/amd/out.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
var _this = this;
22
// Add a lambda to ensure global 'this' capture is triggered
3-
(function () { return _this.window; });
3+
(() => { return _this.window; });
44
var __extends = this.__extends || function (d, b) {
55
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
66
function __() { this.constructor = d; }

tests/baselines/reference/project/prologueEmit/node/out.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
var _this = this;
22
// Add a lambda to ensure global 'this' capture is triggered
3-
(function () { return _this.window; });
3+
(() => { return _this.window; });
44
var __extends = this.__extends || function (d, b) {
55
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
66
function __() { this.constructor = d; }

tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -111,40 +111,40 @@ someGenerics1b `${3}`;
111111
// Generic tag with argument of function type whose parameter is of type parameter type
112112
function someGenerics2a(strs, n) {
113113
}
114-
someGenerics2a `${function (n) { return n; }}`;
114+
someGenerics2a `${(n) => { return n; }}`;
115115
function someGenerics2b(strs, n) {
116116
}
117-
someGenerics2b `${function (n, x) { return n; }}`;
117+
someGenerics2b `${(n, x) => { return n; }}`;
118118
// Generic tag with argument of function type whose parameter is not of type parameter type but body/return type uses type parameter
119119
function someGenerics3(strs, producer) {
120120
}
121-
someGenerics3 `${function () { return ''; }}`;
122-
someGenerics3 `${function () { return undefined; }}`;
123-
someGenerics3 `${function () { return 3; }}`;
121+
someGenerics3 `${() => { return ''; }}`;
122+
someGenerics3 `${() => { return undefined; }}`;
123+
someGenerics3 `${() => { return 3; }}`;
124124
// 2 parameter generic tag with argument 1 of type parameter type and argument 2 of function type whose parameter is of type parameter type
125125
function someGenerics4(strs, n, f) {
126126
}
127-
someGenerics4 `${4}${function () { return null; }}`;
128-
someGenerics4 `${''}${function () { return 3; }}`;
127+
someGenerics4 `${4}${() => { return null; }}`;
128+
someGenerics4 `${''}${() => { return 3; }}`;
129129
someGenerics4 `${null}${null}`;
130130
// 2 parameter generic tag with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type
131131
function someGenerics5(strs, n, f) {
132132
}
133-
someGenerics5 `${4} ${function () { return null; }}`;
134-
someGenerics5 `${''}${function () { return 3; }}`;
133+
someGenerics5 `${4} ${() => { return null; }}`;
134+
someGenerics5 `${''}${() => { return 3; }}`;
135135
someGenerics5 `${null}${null}`;
136136
// Generic tag with multiple arguments of function types that each have parameters of the same generic type
137137
function someGenerics6(strs, a, b, c) {
138138
}
139-
someGenerics6 `${function (n) { return n; }}${function (n) { return n; }}${function (n) { return n; }}`;
140-
someGenerics6 `${function (n) { return n; }}${function (n) { return n; }}${function (n) { return n; }}`;
141-
someGenerics6 `${function (n) { return n; }}${function (n) { return n; }}${function (n) { return n; }}`;
139+
someGenerics6 `${(n) => { return n; }}${(n) => { return n; }}${(n) => { return n; }}`;
140+
someGenerics6 `${(n) => { return n; }}${(n) => { return n; }}${(n) => { return n; }}`;
141+
someGenerics6 `${(n) => { return n; }}${(n) => { return n; }}${(n) => { return n; }}`;
142142
// Generic tag with multiple arguments of function types that each have parameters of different generic type
143143
function someGenerics7(strs, a, b, c) {
144144
}
145-
someGenerics7 `${function (n) { return n; }}${function (n) { return n; }}${function (n) { return n; }}`;
146-
someGenerics7 `${function (n) { return n; }}${function (n) { return n; }}${function (n) { return n; }}`;
147-
someGenerics7 `${function (n) { return n; }}${function (n) { return n; }}${function (n) { return n; }}`;
145+
someGenerics7 `${(n) => { return n; }}${(n) => { return n; }}${(n) => { return n; }}`;
146+
someGenerics7 `${(n) => { return n; }}${(n) => { return n; }}${(n) => { return n; }}`;
147+
someGenerics7 `${(n) => { return n; }}${(n) => { return n; }}${(n) => { return n; }}`;
148148
// Generic tag with argument of generic function type
149149
function someGenerics8(strs, n) {
150150
return n;

tests/baselines/reference/taggedTemplateStringsWithOverloadResolution3_ES6.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,5 @@ fn4 `${null}${true}`;
118118
function fn5() {
119119
return undefined;
120120
}
121-
fn5 `${function (n) { return n.toFixed(); }}`; // will error; 'n' should have type 'string'.
122-
fn5 `${function (n) { return n.substr(0); }}`;
121+
fn5 `${(n) => { return n.toFixed(); }}`; // will error; 'n' should have type 'string'.
122+
fn5 `${(n) => { return n.substr(0); }}`;

0 commit comments

Comments
 (0)