acorn
Advanced tools
Comparing version 2.5.2 to 2.6.0
{ | ||
"name": "acorn", | ||
"description": "ECMAScript parser", | ||
"homepage": "https://github.com/marijnh/acorn", | ||
"homepage": "https://github.com/ternjs/acorn", | ||
"main": "dist/acorn.js", | ||
"version": "2.5.2", | ||
"version": "2.6.0", | ||
"engines": { | ||
@@ -24,3 +24,3 @@ "node": ">=0.4.0" | ||
"type": "git", | ||
"url": "https://github.com/marijnh/acorn.git" | ||
"url": "https://github.com/ternjs/acorn.git" | ||
}, | ||
@@ -27,0 +27,0 @@ "license": "MIT", |
# Acorn | ||
[![Build Status](https://travis-ci.org/marijnh/acorn.svg?branch=master)](https://travis-ci.org/marijnh/acorn) | ||
[![Build Status](https://travis-ci.org/ternjs/acorn.svg?branch=master)](https://travis-ci.org/ternjs/acorn) | ||
[![NPM version](https://img.shields.io/npm/v/acorn.svg)](https://www.npmjs.org/package/acorn) | ||
@@ -9,2 +9,13 @@ [Author funding status: ![maintainer happiness](https://marijnhaverbeke.nl/fund/status_s.png?force)](https://marijnhaverbeke.nl/fund/) | ||
## Community | ||
Acorn is open source software released under an | ||
[MIT license](https://github.com/ternjs/acorn/blob/master/LICENSE). | ||
You are welcome to | ||
[report bugs](https://github.com/ternjs/acorn/issues) or create pull | ||
requests on [github](https://github.com/ternjs/acorn). For questions | ||
and discussion, please use the | ||
[Tern discussion forum](https://discuss.ternjs.net). | ||
## Installation | ||
@@ -23,3 +34,3 @@ | ||
```sh | ||
git clone https://github.com/marijnh/acorn.git | ||
git clone https://github.com/ternjs/acorn.git | ||
``` | ||
@@ -26,0 +37,0 @@ |
#!/usr/bin/env node | ||
import {basename} from "path" | ||
import {readFileSync as read} from "fs" | ||
import {readFileSync as readFile} from "fs" | ||
import * as acorn from "../dist/acorn.js" | ||
let infile, parsed, tokens, silent = false, compact = false, tokenize = false | ||
let infile, forceFile, silent = false, compact = false, tokenize = false | ||
const options = {} | ||
@@ -13,3 +13,3 @@ | ||
print("usage: " + basename(process.argv[1]) + " [--ecma3|--ecma5|--ecma6]") | ||
print(" [--tokenize] [--locations] [---allow-hash-bang] [--compact] [--silent] [--module] [--help] [--] infile") | ||
print(" [--tokenize] [--locations] [---allow-hash-bang] [--compact] [--silent] [--module] [--help] [--] [infile]") | ||
process.exit(status) | ||
@@ -20,4 +20,4 @@ } | ||
const arg = process.argv[i] | ||
if (arg[0] != "-" && !infile) infile = arg | ||
else if (arg == "--" && !infile && i + 2 == process.argv.length) infile = process.argv[++i] | ||
if ((arg == "-" || arg[0] != "-") && !infile) infile = arg | ||
else if (arg == "--" && !infile && i + 2 == process.argv.length) forceFile = infile = process.argv[++i] | ||
else if (arg == "--ecma3") options.ecmaVersion = 3 | ||
@@ -37,23 +37,27 @@ else if (arg == "--ecma5") options.ecmaVersion = 5 | ||
try { | ||
const code = read(infile, "utf8") | ||
if (!tokenize) | ||
parsed = acorn.parse(code, options) | ||
else { | ||
const tokenizer = acorn.tokenizer(code, options) | ||
tokens = [] | ||
function run(code) { | ||
let result | ||
if (!tokenize) { | ||
try { result = acorn.parse(code, options) } | ||
catch(e) { console.error(e.message); process.exit(1) } | ||
} else { | ||
result = [] | ||
let tokenizer = acorn.tokenizer(code, options), token | ||
while (true) { | ||
const token = tokenizer.getToken() | ||
tokens.push(token) | ||
if (token.type == acorn.tokTypes.eof) | ||
break | ||
try { token = tokenizer.getToken() } | ||
catch(e) { console.error(e.message); process.exit(1) } | ||
result.push(token) | ||
if (token.type == acorn.tokTypes.eof) break | ||
} | ||
} | ||
} catch(e) { | ||
console.log(e.message) | ||
process.exit(1) | ||
if (!silent) console.log(JSON.stringify(result, null, compact ? null : 2)) | ||
} | ||
if (!silent) | ||
console.log(JSON.stringify(tokenize ? tokens : parsed, null, compact ? null : 2)) | ||
if (forceFile || infile && infile != "-") { | ||
run(readFile(infile, "utf8")) | ||
} else { | ||
let code = "" | ||
process.stdin.resume() | ||
process.stdin.on("data", chunk => code += chunk) | ||
process.stdin.on("end", () => run(code)) | ||
} |
@@ -77,9 +77,9 @@ // A recursive descent parser operates by defining functions for all | ||
pp.parseExpression = function(noIn, refShorthandDefaultPos) { | ||
pp.parseExpression = function(noIn, refDestructuringErrors) { | ||
let startPos = this.start, startLoc = this.startLoc | ||
let expr = this.parseMaybeAssign(noIn, refShorthandDefaultPos) | ||
let expr = this.parseMaybeAssign(noIn, refDestructuringErrors) | ||
if (this.type === tt.comma) { | ||
let node = this.startNodeAt(startPos, startLoc) | ||
node.expressions = [expr] | ||
while (this.eat(tt.comma)) node.expressions.push(this.parseMaybeAssign(noIn, refShorthandDefaultPos)) | ||
while (this.eat(tt.comma)) node.expressions.push(this.parseMaybeAssign(noIn, refDestructuringErrors)) | ||
return this.finishNode(node, "SequenceExpression") | ||
@@ -93,11 +93,9 @@ } | ||
pp.parseMaybeAssign = function(noIn, refShorthandDefaultPos, afterLeftParse) { | ||
pp.parseMaybeAssign = function(noIn, refDestructuringErrors, afterLeftParse) { | ||
if (this.type == tt._yield && this.inGenerator) return this.parseYield() | ||
let failOnShorthandAssign | ||
if (!refShorthandDefaultPos) { | ||
refShorthandDefaultPos = {start: 0} | ||
failOnShorthandAssign = true | ||
} else { | ||
failOnShorthandAssign = false | ||
let validateDestructuring = false | ||
if (!refDestructuringErrors) { | ||
refDestructuringErrors = {shorthandAssign: 0, trailingComma: 0} | ||
validateDestructuring = true | ||
} | ||
@@ -107,9 +105,10 @@ let startPos = this.start, startLoc = this.startLoc | ||
this.potentialArrowAt = this.start | ||
let left = this.parseMaybeConditional(noIn, refShorthandDefaultPos) | ||
let left = this.parseMaybeConditional(noIn, refDestructuringErrors) | ||
if (afterLeftParse) left = afterLeftParse.call(this, left, startPos, startLoc) | ||
if (this.type.isAssign) { | ||
if (validateDestructuring) this.checkPatternErrors(refDestructuringErrors, true) | ||
let node = this.startNodeAt(startPos, startLoc) | ||
node.operator = this.value | ||
node.left = this.type === tt.eq ? this.toAssignable(left) : left | ||
refShorthandDefaultPos.start = 0 // reset because shorthand default was used correctly | ||
refDestructuringErrors.shorthandAssign = 0 // reset because shorthand default was used correctly | ||
this.checkLVal(left) | ||
@@ -119,4 +118,4 @@ this.next() | ||
return this.finishNode(node, "AssignmentExpression") | ||
} else if (failOnShorthandAssign && refShorthandDefaultPos.start) { | ||
this.unexpected(refShorthandDefaultPos.start) | ||
} else { | ||
if (validateDestructuring) this.checkExpressionErrors(refDestructuringErrors, true) | ||
} | ||
@@ -128,6 +127,6 @@ return left | ||
pp.parseMaybeConditional = function(noIn, refShorthandDefaultPos) { | ||
pp.parseMaybeConditional = function(noIn, refDestructuringErrors) { | ||
let startPos = this.start, startLoc = this.startLoc | ||
let expr = this.parseExprOps(noIn, refShorthandDefaultPos) | ||
if (refShorthandDefaultPos && refShorthandDefaultPos.start) return expr | ||
let expr = this.parseExprOps(noIn, refDestructuringErrors) | ||
if (this.checkExpressionErrors(refDestructuringErrors)) return expr | ||
if (this.eat(tt.question)) { | ||
@@ -146,6 +145,6 @@ let node = this.startNodeAt(startPos, startLoc) | ||
pp.parseExprOps = function(noIn, refShorthandDefaultPos) { | ||
pp.parseExprOps = function(noIn, refDestructuringErrors) { | ||
let startPos = this.start, startLoc = this.startLoc | ||
let expr = this.parseMaybeUnary(refShorthandDefaultPos) | ||
if (refShorthandDefaultPos && refShorthandDefaultPos.start) return expr | ||
let expr = this.parseMaybeUnary(refDestructuringErrors) | ||
if (this.checkExpressionErrors(refDestructuringErrors)) return expr | ||
return this.parseExprOp(expr, startPos, startLoc, -1, noIn) | ||
@@ -180,3 +179,3 @@ } | ||
pp.parseMaybeUnary = function(refShorthandDefaultPos) { | ||
pp.parseMaybeUnary = function(refDestructuringErrors) { | ||
if (this.type.prefix) { | ||
@@ -188,3 +187,3 @@ let node = this.startNode(), update = this.type === tt.incDec | ||
node.argument = this.parseMaybeUnary() | ||
if (refShorthandDefaultPos && refShorthandDefaultPos.start) this.unexpected(refShorthandDefaultPos.start) | ||
this.checkExpressionErrors(refDestructuringErrors, true) | ||
if (update) this.checkLVal(node.argument) | ||
@@ -197,4 +196,4 @@ else if (this.strict && node.operator === "delete" && | ||
let startPos = this.start, startLoc = this.startLoc | ||
let expr = this.parseExprSubscripts(refShorthandDefaultPos) | ||
if (refShorthandDefaultPos && refShorthandDefaultPos.start) return expr | ||
let expr = this.parseExprSubscripts(refDestructuringErrors) | ||
if (this.checkExpressionErrors(refDestructuringErrors)) return expr | ||
while (this.type.postfix && !this.canInsertSemicolon()) { | ||
@@ -214,7 +213,7 @@ let node = this.startNodeAt(startPos, startLoc) | ||
pp.parseExprSubscripts = function(refShorthandDefaultPos) { | ||
pp.parseExprSubscripts = function(refDestructuringErrors) { | ||
let startPos = this.start, startLoc = this.startLoc | ||
let expr = this.parseExprAtom(refShorthandDefaultPos) | ||
let expr = this.parseExprAtom(refDestructuringErrors) | ||
let skipArrowSubscripts = expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")"; | ||
if ((refShorthandDefaultPos && refShorthandDefaultPos.start) || skipArrowSubscripts) return expr | ||
if (this.checkExpressionErrors(refDestructuringErrors) || skipArrowSubscripts) return expr | ||
return this.parseSubscripts(expr, startPos, startLoc) | ||
@@ -259,3 +258,3 @@ } | ||
pp.parseExprAtom = function(refShorthandDefaultPos) { | ||
pp.parseExprAtom = function(refDestructuringErrors) { | ||
let node, canBeArrow = this.potentialArrowAt == this.start | ||
@@ -308,7 +307,7 @@ switch (this.type) { | ||
} | ||
node.elements = this.parseExprList(tt.bracketR, true, true, refShorthandDefaultPos) | ||
node.elements = this.parseExprList(tt.bracketR, true, true, refDestructuringErrors) | ||
return this.finishNode(node, "ArrayExpression") | ||
case tt.braceL: | ||
return this.parseObj(false, refShorthandDefaultPos) | ||
return this.parseObj(false, refDestructuringErrors) | ||
@@ -360,3 +359,3 @@ case tt._function: | ||
let exprList = [], first = true | ||
let refShorthandDefaultPos = {start: 0}, spreadStart, innerParenStart | ||
let refDestructuringErrors = {shorthandAssign: 0, trailingComma: 0}, spreadStart, innerParenStart | ||
while (this.type !== tt.parenR) { | ||
@@ -372,3 +371,3 @@ first ? first = false : this.expect(tt.comma) | ||
} | ||
exprList.push(this.parseMaybeAssign(false, refShorthandDefaultPos, this.parseParenItem)) | ||
exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem)) | ||
} | ||
@@ -380,2 +379,3 @@ } | ||
if (canBeArrow && !this.canInsertSemicolon() && this.eat(tt.arrow)) { | ||
this.checkPatternErrors(refDestructuringErrors, true) | ||
if (innerParenStart) this.unexpected(innerParenStart) | ||
@@ -387,3 +387,3 @@ return this.parseParenArrowList(startPos, startLoc, exprList) | ||
if (spreadStart) this.unexpected(spreadStart) | ||
if (refShorthandDefaultPos.start) this.unexpected(refShorthandDefaultPos.start) | ||
this.checkExpressionErrors(refDestructuringErrors, true) | ||
@@ -474,3 +474,3 @@ if (exprList.length > 1) { | ||
pp.parseObj = function(isPattern, refShorthandDefaultPos) { | ||
pp.parseObj = function(isPattern, refDestructuringErrors) { | ||
let node = this.startNode(), first = true, propHash = {} | ||
@@ -489,3 +489,3 @@ node.properties = [] | ||
prop.shorthand = false | ||
if (isPattern || refShorthandDefaultPos) { | ||
if (isPattern || refDestructuringErrors) { | ||
startPos = this.start | ||
@@ -498,3 +498,3 @@ startLoc = this.startLoc | ||
this.parsePropertyName(prop) | ||
this.parsePropertyValue(prop, isPattern, isGenerator, startPos, startLoc, refShorthandDefaultPos) | ||
this.parsePropertyValue(prop, isPattern, isGenerator, startPos, startLoc, refDestructuringErrors) | ||
this.checkPropClash(prop, propHash) | ||
@@ -506,5 +506,5 @@ node.properties.push(this.finishNode(prop, "Property")) | ||
pp.parsePropertyValue = function(prop, isPattern, isGenerator, startPos, startLoc, refShorthandDefaultPos) { | ||
pp.parsePropertyValue = function(prop, isPattern, isGenerator, startPos, startLoc, refDestructuringErrors) { | ||
if (this.eat(tt.colon)) { | ||
prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refShorthandDefaultPos) | ||
prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors) | ||
prop.kind = "init" | ||
@@ -538,5 +538,5 @@ } else if (this.options.ecmaVersion >= 6 && this.type === tt.parenL) { | ||
prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key) | ||
} else if (this.type === tt.eq && refShorthandDefaultPos) { | ||
if (!refShorthandDefaultPos.start) | ||
refShorthandDefaultPos.start = this.start | ||
} else if (this.type === tt.eq && refDestructuringErrors) { | ||
if (!refDestructuringErrors.shorthandAssign) | ||
refDestructuringErrors.shorthandAssign = this.start | ||
prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key) | ||
@@ -644,3 +644,3 @@ } else { | ||
pp.parseExprList = function(close, allowTrailingComma, allowEmpty, refShorthandDefaultPos) { | ||
pp.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) { | ||
let elts = [], first = true | ||
@@ -650,2 +650,5 @@ while (!this.eat(close)) { | ||
this.expect(tt.comma) | ||
if (this.type === close && refDestructuringErrors && !refDestructuringErrors.trailingComma) { | ||
refDestructuringErrors.trailingComma = this.lastTokStart | ||
} | ||
if (allowTrailingComma && this.afterTrailingComma(close)) break | ||
@@ -658,5 +661,5 @@ } else first = false | ||
else if (this.type === tt.ellipsis) | ||
elt = this.parseSpread(refShorthandDefaultPos) | ||
elt = this.parseSpread(refDestructuringErrors) | ||
else | ||
elt = this.parseMaybeAssign(false, refShorthandDefaultPos) | ||
elt = this.parseMaybeAssign(false, refDestructuringErrors) | ||
elts.push(elt) | ||
@@ -675,4 +678,3 @@ } | ||
if (this.type === tt.name) { | ||
if (!liberal && | ||
(this.strict ? this.reservedWordsStrict : this.reservedWords).test(this.value) && | ||
if (!liberal && (this.strict ? this.reservedWordsStrict : this.reservedWords).test(this.value) && | ||
(this.options.ecmaVersion >= 6 || | ||
@@ -679,0 +681,0 @@ this.input.slice(this.start, this.end).indexOf("\\") == -1)) |
@@ -35,3 +35,3 @@ // This is a trick taken from Esprima. It turns out that, on | ||
// code point above 128. | ||
// Generated by `tools/generate-identifier-regex.js`. | ||
// Generated by `bin/generate-identifier-regex.js`. | ||
@@ -38,0 +38,0 @@ let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b2\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua7ad\ua7b0\ua7b1\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab5f\uab64\uab65\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc" |
@@ -9,7 +9,7 @@ // Acorn is a tiny, fast JavaScript parser written in JavaScript. | ||
// http://marijnhaverbeke.nl/git/acorn | ||
// https://github.com/marijnh/acorn.git | ||
// https://github.com/ternjs/acorn.git | ||
// | ||
// Please use the [github bug tracker][ghbt] to report issues. | ||
// | ||
// [ghbt]: https://github.com/marijnh/acorn/issues | ||
// [ghbt]: https://github.com/ternjs/acorn/issues | ||
// | ||
@@ -40,3 +40,3 @@ // This file defines the main parser interface. The library also comes | ||
export const version = "2.5.2" | ||
export const version = "2.6.0" | ||
@@ -43,0 +43,0 @@ // The main exported interface (under `self.acorn` when in the |
@@ -16,3 +16,2 @@ import {types as tt} from "./tokentype" | ||
case "ArrayPattern": | ||
case "AssignmentPattern": | ||
break | ||
@@ -38,7 +37,13 @@ | ||
delete node.operator | ||
// falls through to AssignmentPattern | ||
} else { | ||
this.raise(node.left.end, "Only '=' operator can be used for specifying default value.") | ||
break; | ||
} | ||
break | ||
case "AssignmentPattern": | ||
if (node.right.type === "YieldExpression") | ||
this.raise(node.right.start, "Yield expression cannot be a default value") | ||
break; | ||
case "ParenthesizedExpression": | ||
@@ -87,6 +92,6 @@ node.expression = this.toAssignable(node.expression, isBinding) | ||
pp.parseSpread = function(refShorthandDefaultPos) { | ||
pp.parseSpread = function(refDestructuringErrors) { | ||
let node = this.startNode() | ||
this.next() | ||
node.argument = this.parseMaybeAssign(refShorthandDefaultPos) | ||
node.argument = this.parseMaybeAssign(refDestructuringErrors) | ||
return this.finishNode(node, "SpreadElement") | ||
@@ -93,0 +98,0 @@ } |
@@ -94,3 +94,3 @@ import {has, isArray} from "./util" | ||
if (options.allowReserved == null) | ||
options.allowReserved = options.ecmaVersion >= 5 | ||
options.allowReserved = options.ecmaVersion < 5 | ||
@@ -97,0 +97,0 @@ if (isArray(options.onToken)) { |
@@ -91,1 +91,13 @@ import {types as tt} from "./tokentype" | ||
} | ||
pp.checkPatternErrors = function(refDestructuringErrors, andThrow) { | ||
let pos = refDestructuringErrors && refDestructuringErrors.trailingComma | ||
if (!andThrow) return !!pos | ||
if (pos) this.raise(pos, "Trailing comma is not permitted in destructuring patterns") | ||
} | ||
pp.checkExpressionErrors = function(refDestructuringErrors, andThrow) { | ||
let pos = refDestructuringErrors && refDestructuringErrors.shorthandAssign | ||
if (!andThrow) return !!pos | ||
if (pos) this.raise(pos, "Shorthand property assignments are valid only in destructuring patterns") | ||
} |
@@ -159,10 +159,11 @@ import {types as tt} from "./tokentype" | ||
} | ||
let refShorthandDefaultPos = {start: 0} | ||
let init = this.parseExpression(true, refShorthandDefaultPos) | ||
let refDestructuringErrors = {shorthandAssign: 0, trailingComma: 0} | ||
let init = this.parseExpression(true, refDestructuringErrors) | ||
if (this.type === tt._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) { | ||
this.checkPatternErrors(refDestructuringErrors, true) | ||
this.toAssignable(init) | ||
this.checkLVal(init) | ||
return this.parseForIn(node, init) | ||
} else if (refShorthandDefaultPos.start) { | ||
this.unexpected(refShorthandDefaultPos.start) | ||
} else { | ||
this.checkExpressionErrors(refDestructuringErrors, true) | ||
} | ||
@@ -169,0 +170,0 @@ return this.parseFor(node, init) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
369462
8689
384