MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / fxGroupExpression

Function fxGroupExpression

xs/sources/xsSyntaxical.c:2987–3056  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2985}
2986
2987void 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 }

Callers 1

fxLiteralExpressionFunction · 0.85

Calls 12

fxMatchTokenFunction · 0.85
fxGetNextTokenFunction · 0.85
fxAssignmentExpressionFunction · 0.85
fxPushNodeStructFunction · 0.85
fxPushNodeListFunction · 0.85
fxReportParserErrorFunction · 0.85
fxCheckStrictBindingFunction · 0.85
fxArrowExpressionFunction · 0.85
fxPushSymbolFunction · 0.85
fxSwapNodesFunction · 0.85
fxPushNULLFunction · 0.85

Tested by

no test coverage detected