| 3056 | } |
| 3057 | |
| 3058 | void fxNewExpression(txParser* parser) |
| 3059 | { |
| 3060 | txInteger aLine = parser->states[0].line; |
| 3061 | fxMatchToken(parser, XS_TOKEN_NEW); |
| 3062 | if (parser->states[0].token == XS_TOKEN_DOT) { |
| 3063 | fxGetNextToken(parser); |
| 3064 | if (fxIsKeyword(parser, parser->targetSymbol)) { |
| 3065 | if (!(parser->flags & mxTargetFlag)) |
| 3066 | fxReportParserError(parser, parser->states[0].line, "invalid new.target"); |
| 3067 | fxGetNextToken(parser); |
| 3068 | fxPushNodeStruct(parser, 0, XS_TOKEN_TARGET, aLine); |
| 3069 | } |
| 3070 | else |
| 3071 | fxReportParserError(parser, parser->states[0].line, "missing target"); |
| 3072 | return; |
| 3073 | } |
| 3074 | fxLiteralExpression(parser, 1); |
| 3075 | fxCheckArrowFunction(parser, 1); |
| 3076 | for (;;) { |
| 3077 | txInteger aMemberLine = parser->states[0].line; |
| 3078 | if (parser->states[0].token == XS_TOKEN_DOT) { |
| 3079 | fxGetNextToken(parser); |
| 3080 | if (parser->states[0].token == XS_TOKEN_IDENTIFIER) { |
| 3081 | fxPushSymbol(parser, parser->states[0].symbol); |
| 3082 | fxPushNodeStruct(parser, 2, XS_TOKEN_MEMBER, aMemberLine); |
| 3083 | fxGetNextToken(parser); |
| 3084 | } |
| 3085 | else if (parser->states[0].token == XS_TOKEN_PRIVATE_IDENTIFIER) { |
| 3086 | fxPushSymbol(parser, parser->states[0].symbol); |
| 3087 | fxSwapNodes(parser); |
| 3088 | fxPushNodeStruct(parser, 2, XS_TOKEN_PRIVATE_MEMBER, aMemberLine); |
| 3089 | fxGetNextToken(parser); |
| 3090 | } |
| 3091 | else |
| 3092 | fxReportParserError(parser, parser->states[0].line, "missing property"); |
| 3093 | } |
| 3094 | else if (parser->states[0].token == XS_TOKEN_LEFT_BRACKET) { |
| 3095 | fxGetNextToken(parser); |
| 3096 | fxCommaExpression(parser); |
| 3097 | fxPushNodeStruct(parser, 2, XS_TOKEN_MEMBER_AT, aMemberLine); |
| 3098 | fxMatchToken(parser, XS_TOKEN_RIGHT_BRACKET); |
| 3099 | } |
| 3100 | else if (parser->states[0].token == XS_TOKEN_TEMPLATE) { |
| 3101 | fxPushStringNode(parser, parser->states[0].stringLength, parser->states[0].string, aLine); |
| 3102 | fxPushRawNode(parser, parser->states[0].rawLength, parser->states[0].raw, aLine); |
| 3103 | fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE_MIDDLE, aLine); |
| 3104 | fxGetNextToken(parser); |
| 3105 | fxPushNodeList(parser, 1); |
| 3106 | fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE, aLine); |
| 3107 | } |
| 3108 | else if (parser->states[0].token == XS_TOKEN_TEMPLATE_HEAD) { |
| 3109 | fxTemplateExpression(parser); |
| 3110 | fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE, aLine); |
| 3111 | } |
| 3112 | else |
| 3113 | break; |
| 3114 | } |
| 3115 | if (parser->states[0].token == XS_TOKEN_LEFT_PARENTHESIS) |
no test coverage detected