esprima icon indicating copy to clipboard operation
esprima copied to clipboard

Fails to parse 'Spread' syntax: Unexpected token ...

Open rob4629 opened this issue 5 years ago • 8 comments

Steps to reproduce

I'm using the ES2018 syntax in my code, and Esprima is failing to parse the "spread" syntax (...), for creating iterables and concatenating objects.

// Spread syntax:
const obj1 = { key: "value"};
const obj2 = { ...obj1, key2: "value"};

esprima.parse(obj2);

Expected output

I would expect the Spread syntax to be correctly parsed.

Actual output

Here's a demo link to the current issue being faced

Here's the full stack trace:
Unexpected token ...
      at ErrorHandler.constructError (node_modules/esprima/dist/esprima.js:5012:22)
      at ErrorHandler.createError (node_modules/esprima/dist/esprima.js:5028:27)
      at Parser.unexpectedTokenError (node_modules/esprima/dist/esprima.js:1985:39)
      at Parser.throwUnexpectedToken (node_modules/esprima/dist/esprima.js:1995:21)
      at Parser.parseObjectPropertyKey (node_modules/esprima/dist/esprima.js:2499:33)
      at Parser.parseObjectProperty (node_modules/esprima/dist/esprima.js:2534:25)
      at Parser.parseObjectInitializer (node_modules/esprima/dist/esprima.js:2602:35)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parsePrimaryExpression (node_modules/esprima/dist/esprima.js:2354:38)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseLeftHandSideExpressionAllowCall (node_modules/esprima/dist/esprima.js:2899:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseUpdateExpression (node_modules/esprima/dist/esprima.js:3004:26)
      at Parser.parseUnaryExpression (node_modules/esprima/dist/esprima.js:3048:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseExponentiationExpression (node_modules/esprima/dist/esprima.js:3054:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseBinaryExpression (node_modules/esprima/dist/esprima.js:3089:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseConditionalExpression (node_modules/esprima/dist/esprima.js:3141:26)
      at Parser.parseAssignmentExpression (node_modules/esprima/dist/esprima.js:3250:26)
      at Parser.isolateCoverGrammar (node_modules/esprima/dist/esprima.js:2269:37)
      at Parser.parseLexicalBinding (node_modules/esprima/dist/esprima.js:3425:34)
      at Parser.parseBindingList (node_modules/esprima/dist/esprima.js:3439:27)
      at Parser.parseLexicalDeclaration (node_modules/esprima/dist/esprima.js:3461:34)
      at Parser.parseStatementListItem (node_modules/esprima/dist/esprima.js:3376:39)
      at Parser.parseFunctionSourceElements (node_modules/esprima/dist/esprima.js:4195:29)
      at Parser.parseAssignmentExpression (node_modules/esprima/dist/esprima.js:3286:38)
      at Parser.isolateCoverGrammar (node_modules/esprima/dist/esprima.js:2269:37)
      at Parser.parseArguments (node_modules/esprima/dist/esprima.js:2807:27)
      at Parser.parseLeftHandSideExpressionAllowCall (node_modules/esprima/dist/esprima.js:2913:76)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseUpdateExpression (node_modules/esprima/dist/esprima.js:3004:26)
      at Parser.parseUnaryExpression (node_modules/esprima/dist/esprima.js:3048:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseExponentiationExpression (node_modules/esprima/dist/esprima.js:3054:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseBinaryExpression (node_modules/esprima/dist/esprima.js:3089:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseConditionalExpression (node_modules/esprima/dist/esprima.js:3141:26)
      at Parser.parseAssignmentExpression (node_modules/esprima/dist/esprima.js:3250:26)
      at Parser.isolateCoverGrammar (node_modules/esprima/dist/esprima.js:2269:37)
      at Parser.parseExpression (node_modules/esprima/dist/esprima.js:3341:26)
      at Parser.parseLabelledStatement (node_modules/esprima/dist/esprima.js:3996:26)
      at Parser.parseStatement (node_modules/esprima/dist/esprima.js:4122:97)
      at Parser.parseStatementListItem (node_modules/esprima/dist/esprima.js:3393:31)
      at Parser.parseFunctionSourceElements (node_modules/esprima/dist/esprima.js:4195:29)
      at Parser.parseFunctionExpression (node_modules/esprima/dist/esprima.js:4408:26)
      at Parser.parsePrimaryExpression (node_modules/esprima/dist/esprima.js:2380:38)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseLeftHandSideExpressionAllowCall (node_modules/esprima/dist/esprima.js:2899:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseUpdateExpression (node_modules/esprima/dist/esprima.js:3004:26)
      at Parser.parseUnaryExpression (node_modules/esprima/dist/esprima.js:3048:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseExponentiationExpression (node_modules/esprima/dist/esprima.js:3054:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseBinaryExpression (node_modules/esprima/dist/esprima.js:3089:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseConditionalExpression (node_modules/esprima/dist/esprima.js:3141:26)
      at Parser.parseAssignmentExpression (node_modules/esprima/dist/esprima.js:3250:26)
      at Parser.isolateCoverGrammar (node_modules/esprima/dist/esprima.js:2269:37)
      at Parser.parseArguments (node_modules/esprima/dist/esprima.js:2807:27)
      at Parser.parseLeftHandSideExpressionAllowCall (node_modules/esprima/dist/esprima.js:2913:76)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseUpdateExpression (node_modules/esprima/dist/esprima.js:3004:26)
      at Parser.parseUnaryExpression (node_modules/esprima/dist/esprima.js:3048:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseExponentiationExpression (node_modules/esprima/dist/esprima.js:3054:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseBinaryExpression (node_modules/esprima/dist/esprima.js:3089:26)
      at Parser.inheritCoverGrammar (node_modules/esprima/dist/esprima.js:2285:37)
      at Parser.parseConditionalExpression (node_modules/esprima/dist/esprima.js:3141:26)
      at Parser.parseAssignmentExpression (node_modules/esprima/dist/esprima.js:3250:26)
      at Parser.isolateCoverGrammar (node_modules/esprima/dist/esprima.js:2269:37)
      at Parser.parseExpression (node_modules/esprima/dist/esprima.js:3341:26)
      at Parser.parseLabelledStatement (node_modules/esprima/dist/esprima.js:3996:26)
      at Parser.parseStatement (node_modules/esprima/dist/esprima.js:4122:97)
      at Parser.parseStatementListItem (node_modules/esprima/dist/esprima.js:3393:31)
      at Parser.parseModule (node_modules/esprima/dist/esprima.js:4715:29)
      at parse (node_modules/esprima/dist/esprima.js:122:38)

Relevant references

You can see the Spread syntax here.

rob4629 avatar Sep 02 '20 22:09 rob4629

这么长时间了还没修复!

fzxs8 avatar Jan 27 '21 12:01 fzxs8

Actually, the spread operator seems to be correctly parsed in almost every case (function parameters, array initialization). It is even present in the parseObjectInitializer at line 936 so I think it should be working, but as OP found out, it actually breaks with Unexpected token inside parseObjectPropertyKey. I solved by adding a single else inside the parseObjectPropertyKey, just before the last else: else if (this.match('...')) { return this.parseSpreadElement(); }

I'm not entirely sure why the parseSpreadElement handled in parseObjectInitializer isn't triggering, but at least with this fix I was able to proceed with parsing of our files.

Jamby93 avatar Apr 13 '21 08:04 Jamby93

The solution from @Jamby93 worked for me. If you want to patch the node_modules source directly without having to compile the source, look for the following line (currently line 2511 in dist/esprima.js):

Parser.prototype.parseObjectProperty = function (hasProto) {

0x00C5 avatar Nov 05 '21 17:11 0x00C5

这么长时间了还没修复!

I upgraded bootstrap to V5, suffering the same problem, feeling so bad.

GrayYoung avatar Dec 31 '21 05:12 GrayYoung

@jogibear9988 is this supported in https://github.com/node-projects/esprima-next ?

Meir017 avatar Dec 31 '21 05:12 Meir017

don't know. test it, if it does not work, create an issue and I will fix

jogibear9988 avatar Dec 31 '21 10:12 jogibear9988

@Meir017 @GrayYoung I've tried, this works in my fork esprima-next

jogibear9988 avatar Jan 01 '22 11:01 jogibear9988

For anyone else struggling with this, one option is to run Babel on the offending file(s)

mjaggard avatar Feb 10 '22 10:02 mjaggard