| 2985 | } |
| 2986 | |
| 2987 | void fxGroupExpression(txParser* parser, txUnsigned flag) |
| 2988 | { |
| 2989 | txBoolean commaFlag = 0; |
| 2990 | txBoolean spreadFlag = 0; |
| 2991 | txInteger aCount = 0; |
| 2992 | txInteger aLine; |
| 2993 | txUnsigned formerAwaitingYieldingFlags = parser->flags & (mxAwaitingFlag | mxYieldingFlag); |
| 2994 | parser->flags &= ~(mxAwaitingFlag | mxYieldingFlag); |
| 2995 | fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS); |
| 2996 | while ((parser->states[0].token == XS_TOKEN_SPREAD) || (gxTokenFlags[parser->states[0].token] & XS_TOKEN_BEGIN_EXPRESSION)) { |
| 2997 | aLine = parser->states[0].line; |
| 2998 | commaFlag = 0; |
| 2999 | if (parser->states[0].token == XS_TOKEN_SPREAD) { |
| 3000 | fxGetNextToken(parser); |
| 3001 | fxAssignmentExpression(parser); |
| 3002 | fxPushNodeStruct(parser, 1, XS_TOKEN_SPREAD, aLine); |
| 3003 | spreadFlag = 1; |
| 3004 | } |
| 3005 | else |
| 3006 | fxAssignmentExpression(parser); |
| 3007 | aCount++; |
| 3008 | if (parser->states[0].token != XS_TOKEN_COMMA) |
| 3009 | break; |
| 3010 | fxGetNextToken(parser); |
| 3011 | commaFlag = 1; |
| 3012 | } |
| 3013 | aLine = parser->states[0].line; |
| 3014 | fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS); |
| 3015 | if ((!parser->states[0].crlf) && (parser->states[0].token == XS_TOKEN_ARROW)) { |
| 3016 | fxPushNodeList(parser, aCount); |
| 3017 | fxPushNodeStruct(parser, 1, XS_TOKEN_EXPRESSIONS, aLine); |
| 3018 | if (commaFlag && spreadFlag) |
| 3019 | fxReportParserError(parser, parser->states[0].line, "invalid parameters"); |
| 3020 | if (!fxParametersBindingFromExpressions(parser, parser->root)) |
| 3021 | fxReportParserError(parser, parser->states[0].line, "no parameters"); |
| 3022 | fxCheckStrictBinding(parser, parser->root); |
| 3023 | parser->root->flags |= flag; |
| 3024 | if (parser->flags & mxAwaitingFlag) { |
| 3025 | if (flag || (parser->flags & mxAsyncFlag)) |
| 3026 | fxReportParserError(parser, parser->states[0].line, "invalid await"); |
| 3027 | else |
| 3028 | formerAwaitingYieldingFlags |= mxAwaitingFlag; |
| 3029 | } |
| 3030 | if (parser->flags & mxYieldingFlag) |
| 3031 | fxReportParserError(parser, parser->states[0].line, "invalid yield"); |
| 3032 | fxArrowExpression(parser, flag); |
| 3033 | } |
| 3034 | else if (flag) { |
| 3035 | fxPushNodeList(parser, aCount); |
| 3036 | fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS, aLine); |
| 3037 | if (spreadFlag) |
| 3038 | parser->root->flags |= mxSpreadFlag; |
| 3039 | |
| 3040 | fxPushSymbol(parser, parser->asyncSymbol); |
| 3041 | fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, aLine); |
| 3042 | fxSwapNodes(parser); |
| 3043 | fxPushNodeStruct(parser, 2, XS_TOKEN_CALL, aLine); |
| 3044 | } |
no test coverage detected