|
1 tahun lalu | |
---|---|---|
.. | ||
test | 1 tahun lalu | |
.npmignore | 1 tahun lalu | |
LICENSE | 1 tahun lalu | |
README.md | 1 tahun lalu | |
acorn-es7-plugin.js | 1 tahun lalu | |
acorn-v3.js | 1 tahun lalu | |
acorn-v4.js | 1 tahun lalu | |
package.json | 1 tahun lalu |
acorn-es7-plugin is a plugin for the Acorn parser that generates ESTrees following the 'experimental' specification for asynchronous functions.
npm install --save acorn-es7-plugin
Adding the plugin
// Require acorn as usual
var acorn = require("acorn");
// Add the es7-plugin
require('./acorn-es7-plugin')(acorn) ;
Using the plugin
var code = "async function x(){ if (x) return await(x-1) ; return 0 ; }\n";
var ast = acorn.parse(code,{
// Specify use of the plugin
plugins:{asyncawait:true},
// Specify the ecmaVersion
ecmaVersion:7
}) ;
// Show the AST
console.log(JSON.stringify(ast,null,2)) ;
Output:
{
"type": "Program",
"body": [
{
"type": "FunctionDeclaration",
"id": {
"type": "Identifier",
"name": "x"
},
"generator": false,
"expression": false,
"params": [],
"body": {
"type": "BlockStatement",
"body": [
{
"type": "IfStatement",
"test": {
"type": "Identifier",
"name": "x"
},
"consequent": {
"type": "ReturnStatement",
"argument": {
"type": "AwaitExpression",
"operator": "await",
"argument": {
"type": "BinaryExpression",
"left": {
"type": "Identifier",
"name": "x"
},
"operator": "-",
"right": {
"type": "Literal",
"value": 1,
"raw": "1"
}
}
}
},
"alternate": null
},
{
"type": "ReturnStatement",
"argument": {
"type": "Literal",
"value": 0,
"raw": "0"
}
}
]
},
"async": true
}
],
"sourceType": "script"
}
The parser attempts to enforce strict contextualisation of async
and await
. Specifically, async
is only a keyword if it precedes a function declaration, function expression or arrow function. await
is only a keyword inside an async
function. Outside of these contexts, both tokens are treated as identifiers (as they were in ES6 and earlier).
When using the plugin, you can supply an object in place of the 'true' flag with the following options.
flag | meaning |
---|---|
awaitAnywhere | If await is used outside of an async function and could not be an identifier, generate an AwaitExpression node. This typically means you can use await anywhere except when its argument would require parentheses, as this parses to a call to 'await(....)'. Should not be used with inAsyncFunction option |
inAsyncFunction | Parse the code as if it is the body of an async function . This means await cannot be an identifier and is always an AwaitExpression, even if the argument is parenthesized. Should not be used with the awaitAnywhere option |
asyncExits | Allow the additional sequences async return <optional-expression> and async throw <expression> . These sequences are used with nodent. In each case, as with async functions, a standard ReturnStatement (or ThrowStatement) node is generated, with an additional member 'async' set to true. |
The parser also accepts async getters in object literals and classes, which is currently disallowed by the ES7 specification.
30-Mar-17: v1.1.7
(async function (){ }())
with acorn v3.07-Oct-16: v1.1.1
Code | Interpretation |
---|---|
get async(){} |
Is a standard ES6 getter called 'async' |
set async(v){} |
Is a standard ES6 setter called 'async' |
async get(...){} |
Is a standard ES7 async method called 'get' |
async set(...){} |
Is a standard ES7 async method called 'set' |
async get x(){} |
Is an extension that defines an async getter called 'x' |
get async x(){} |
Is an extension that defines an async getter called 'x', but is deprecated (async should proceed get ) |
In previous version of the plugin, the standard ES7 constructs were hidden by the plugin extensions and a SyntaxError was incorrectly thrown
25-Sep-16: v1.1.0
async
and await
are fully parsed by acorn v4. The only use case for the plugin with acorn v4 is with the flags above which are enable specific parsing modes.24-Sep-16: v1.0.18
async(()=>0)
as a call to the Identifer 'async', not a failed attempt to define an async arrow.20-Jul-16: v1.0.17
27-Jun-16: v1.0.15
awaitAnywhere
option (see https://github.com/MatAtBread/acorn-es7-plugin/issues/12)03-May-16: v1.0.14
03-May-16: v1.0.13
export async function name(){...}
as async function name(){...} is a valid named declaration.26-Feb-16: v1.0.12
19-Dec-15: v1.0.11
10-Dec-15: v1.0.10