Skip to content

Commit 903c53c

Browse files
committed
Add support for async/await.
Spec proposal: https://github.com/lukehoban/ecmascript-asyncawait
1 parent 472cbce commit 903c53c

2 files changed

Lines changed: 1658 additions & 29 deletions

File tree

escodegen.js

Lines changed: 54 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*
22
Copyright (C) 2012-2014 Yusuke Suzuki <utatane.tea@gmail.com>
3+
Copyright (C) 2015 Ingvar Stepanyan <me@rreverser.com>
34
Copyright (C) 2014 Ivan Nikulin <ifaaan@gmail.com>
45
Copyright (C) 2012-2013 Michael Ficarra <escodegen.copyright@michael.ficarra.me>
56
Copyright (C) 2012-2013 Mathias Bynens <mathias@qiwi.be>
@@ -82,6 +83,7 @@
8283
Precedence = {
8384
Sequence: 0,
8485
Yield: 1,
86+
Await: 1,
8587
Assignment: 1,
8688
Conditional: 2,
8789
ArrowFunction: 2,
@@ -864,6 +866,25 @@
864866
return toSourceNodeWhenNeeded(node.name, node);
865867
}
866868

869+
function generateAsyncPrefix(node, spaceRequired) {
870+
return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : '';
871+
}
872+
873+
function generateStarSuffix(node) {
874+
var isGenerator = node.generator && !extra.moz.starlessGenerator;
875+
return isGenerator ? '*' + space : '';
876+
}
877+
878+
function generateMethodPrefix(prop) {
879+
var func = prop.value;
880+
if (func.async) {
881+
return generateAsyncPrefix(func, !prop.computed);
882+
} else {
883+
// avoid space before method name
884+
return generateStarSuffix(func) ? '*' : '';
885+
}
886+
}
887+
867888
CodeGenerator.prototype.generatePattern = function (node, precedence, flags) {
868889
if (node.type === Syntax.Identifier) {
869890
return generateIdentifier(node);
@@ -880,9 +901,10 @@
880901
!node.rest && (!node.defaults || node.defaults.length === 0) &&
881902
node.params.length === 1 && node.params[0].type === Syntax.Identifier) {
882903
// arg => { } case
883-
result = [generateIdentifier(node.params[0])];
904+
result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])];
884905
} else {
885-
result = ['('];
906+
result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : [];
907+
result.push('(');
886908
if (node.defaults) {
887909
hasDefault = true;
888910
}
@@ -1652,10 +1674,10 @@
16521674
},
16531675

16541676
FunctionDeclaration: function (stmt, flags) {
1655-
var isGenerator = stmt.generator && !extra.moz.starlessGenerator;
16561677
return [
1657-
(isGenerator ? 'function*' : 'function'),
1658-
(isGenerator ? space : noEmptySpace()),
1678+
generateAsyncPrefix(stmt, true),
1679+
'function',
1680+
generateStarSuffix(stmt) || noEmptySpace(),
16591681
generateIdentifier(stmt.id),
16601682
this.generateFunctionBody(stmt)
16611683
];
@@ -1912,6 +1934,14 @@
19121934
return parenthesize(result, Precedence.Yield, precedence);
19131935
},
19141936

1937+
AwaitExpression: function (expr, precedence, flags) {
1938+
var result = join(
1939+
expr.delegate ? 'await*' : 'await',
1940+
this.generateExpression(expr.argument, Precedence.Await, E_TTT)
1941+
);
1942+
return parenthesize(result, Precedence.Await, precedence);
1943+
},
1944+
19151945
UpdateExpression: function (expr, precedence, flags) {
19161946
if (expr.prefix) {
19171947
return parenthesize(
@@ -1934,14 +1964,18 @@
19341964
},
19351965

19361966
FunctionExpression: function (expr, precedence, flags) {
1937-
var result, isGenerator;
1938-
isGenerator = expr.generator && !extra.moz.starlessGenerator;
1939-
result = isGenerator ? 'function*' : 'function';
1940-
1967+
var result = [
1968+
generateAsyncPrefix(expr, true),
1969+
'function'
1970+
];
19411971
if (expr.id) {
1942-
return [result, (isGenerator) ? space : noEmptySpace(), generateIdentifier(expr.id), this.generateFunctionBody(expr)];
1972+
result.push(generateStarSuffix(expr) || noEmptySpace());
1973+
result.push(generateIdentifier(expr.id));
1974+
} else {
1975+
result.push(generateStarSuffix(expr) || space);
19431976
}
1944-
return [result + space, this.generateFunctionBody(expr)];
1977+
result.push(this.generateFunctionBody(expr));
1978+
return result;
19451979
},
19461980

19471981
ExportBatchSpecifier: function (expr, precedence, flags) {
@@ -2008,29 +2042,22 @@
20082042
} else {
20092043
result = [];
20102044
}
2011-
20122045
if (expr.kind === 'get' || expr.kind === 'set') {
2013-
result = join(result, [
2046+
fragment = [
20142047
join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
20152048
this.generateFunctionBody(expr.value)
2016-
]);
2049+
];
20172050
} else {
20182051
fragment = [
2052+
generateMethodPrefix(expr),
20192053
this.generatePropertyKey(expr.key, expr.computed),
20202054
this.generateFunctionBody(expr.value)
20212055
];
2022-
if (expr.value.generator) {
2023-
result.push('*');
2024-
result.push(fragment);
2025-
} else {
2026-
result = join(result, fragment);
2027-
}
20282056
}
2029-
return result;
2057+
return join(result, fragment);
20302058
},
20312059

20322060
Property: function (expr, precedence, flags) {
2033-
var result;
20342061
if (expr.kind === 'get' || expr.kind === 'set') {
20352062
return [
20362063
expr.kind, noEmptySpace(),
@@ -2044,13 +2071,11 @@
20442071
}
20452072

20462073
if (expr.method) {
2047-
result = [];
2048-
if (expr.value.generator) {
2049-
result.push('*');
2050-
}
2051-
result.push(this.generatePropertyKey(expr.key, expr.computed));
2052-
result.push(this.generateFunctionBody(expr.value));
2053-
return result;
2074+
return [
2075+
generateMethodPrefix(expr),
2076+
this.generatePropertyKey(expr.key, expr.computed),
2077+
this.generateFunctionBody(expr.value)
2078+
];
20542079
}
20552080

20562081
return [

0 commit comments

Comments
 (0)