|
1 | 1 | /* |
2 | 2 | Copyright (C) 2012-2014 Yusuke Suzuki <utatane.tea@gmail.com> |
| 3 | + Copyright (C) 2015 Ingvar Stepanyan <me@rreverser.com> |
3 | 4 | Copyright (C) 2014 Ivan Nikulin <ifaaan@gmail.com> |
4 | 5 | Copyright (C) 2012-2013 Michael Ficarra <escodegen.copyright@michael.ficarra.me> |
5 | 6 | Copyright (C) 2012-2013 Mathias Bynens <mathias@qiwi.be> |
|
82 | 83 | Precedence = { |
83 | 84 | Sequence: 0, |
84 | 85 | Yield: 1, |
| 86 | + Await: 1, |
85 | 87 | Assignment: 1, |
86 | 88 | Conditional: 2, |
87 | 89 | ArrowFunction: 2, |
|
864 | 866 | return toSourceNodeWhenNeeded(node.name, node); |
865 | 867 | } |
866 | 868 |
|
| 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 | + |
867 | 888 | CodeGenerator.prototype.generatePattern = function (node, precedence, flags) { |
868 | 889 | if (node.type === Syntax.Identifier) { |
869 | 890 | return generateIdentifier(node); |
|
880 | 901 | !node.rest && (!node.defaults || node.defaults.length === 0) && |
881 | 902 | node.params.length === 1 && node.params[0].type === Syntax.Identifier) { |
882 | 903 | // arg => { } case |
883 | | - result = [generateIdentifier(node.params[0])]; |
| 904 | + result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])]; |
884 | 905 | } else { |
885 | | - result = ['(']; |
| 906 | + result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : []; |
| 907 | + result.push('('); |
886 | 908 | if (node.defaults) { |
887 | 909 | hasDefault = true; |
888 | 910 | } |
|
1652 | 1674 | }, |
1653 | 1675 |
|
1654 | 1676 | FunctionDeclaration: function (stmt, flags) { |
1655 | | - var isGenerator = stmt.generator && !extra.moz.starlessGenerator; |
1656 | 1677 | return [ |
1657 | | - (isGenerator ? 'function*' : 'function'), |
1658 | | - (isGenerator ? space : noEmptySpace()), |
| 1678 | + generateAsyncPrefix(stmt, true), |
| 1679 | + 'function', |
| 1680 | + generateStarSuffix(stmt) || noEmptySpace(), |
1659 | 1681 | generateIdentifier(stmt.id), |
1660 | 1682 | this.generateFunctionBody(stmt) |
1661 | 1683 | ]; |
|
1912 | 1934 | return parenthesize(result, Precedence.Yield, precedence); |
1913 | 1935 | }, |
1914 | 1936 |
|
| 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 | + |
1915 | 1945 | UpdateExpression: function (expr, precedence, flags) { |
1916 | 1946 | if (expr.prefix) { |
1917 | 1947 | return parenthesize( |
|
1934 | 1964 | }, |
1935 | 1965 |
|
1936 | 1966 | 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 | + ]; |
1941 | 1971 | 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); |
1943 | 1976 | } |
1944 | | - return [result + space, this.generateFunctionBody(expr)]; |
| 1977 | + result.push(this.generateFunctionBody(expr)); |
| 1978 | + return result; |
1945 | 1979 | }, |
1946 | 1980 |
|
1947 | 1981 | ExportBatchSpecifier: function (expr, precedence, flags) { |
|
2008 | 2042 | } else { |
2009 | 2043 | result = []; |
2010 | 2044 | } |
2011 | | - |
2012 | 2045 | if (expr.kind === 'get' || expr.kind === 'set') { |
2013 | | - result = join(result, [ |
| 2046 | + fragment = [ |
2014 | 2047 | join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)), |
2015 | 2048 | this.generateFunctionBody(expr.value) |
2016 | | - ]); |
| 2049 | + ]; |
2017 | 2050 | } else { |
2018 | 2051 | fragment = [ |
| 2052 | + generateMethodPrefix(expr), |
2019 | 2053 | this.generatePropertyKey(expr.key, expr.computed), |
2020 | 2054 | this.generateFunctionBody(expr.value) |
2021 | 2055 | ]; |
2022 | | - if (expr.value.generator) { |
2023 | | - result.push('*'); |
2024 | | - result.push(fragment); |
2025 | | - } else { |
2026 | | - result = join(result, fragment); |
2027 | | - } |
2028 | 2056 | } |
2029 | | - return result; |
| 2057 | + return join(result, fragment); |
2030 | 2058 | }, |
2031 | 2059 |
|
2032 | 2060 | Property: function (expr, precedence, flags) { |
2033 | | - var result; |
2034 | 2061 | if (expr.kind === 'get' || expr.kind === 'set') { |
2035 | 2062 | return [ |
2036 | 2063 | expr.kind, noEmptySpace(), |
|
2044 | 2071 | } |
2045 | 2072 |
|
2046 | 2073 | 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 | + ]; |
2054 | 2079 | } |
2055 | 2080 |
|
2056 | 2081 | return [ |
|
0 commit comments