| 4447 | } |
| 4448 | |
| 4449 | void fxJSXElement(txParser* parser) |
| 4450 | { |
| 4451 | txBoolean closed = 0; |
| 4452 | txInteger line = parser->states[0].line; |
| 4453 | txNode* name = NULL; |
| 4454 | txInteger nodeCount = parser->nodeCount; |
| 4455 | txInteger propertyCount = 0; |
| 4456 | fxCheckParserStack(parser, line); |
| 4457 | fxPushSymbol(parser, parser->__jsx__Symbol); |
| 4458 | fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, parser->states[0].line); |
| 4459 | if (parser->states[0].token == XS_TOKEN_IDENTIFIER) { |
| 4460 | fxJSXElementName(parser); |
| 4461 | name = parser->root; |
| 4462 | } |
| 4463 | else { |
| 4464 | fxReportParserError(parser, parser->states[0].line, "missing identifier"); |
| 4465 | fxPushNULL(parser); |
| 4466 | } |
| 4467 | for (;;) { |
| 4468 | if (parser->states[0].token == XS_TOKEN_MORE) |
| 4469 | break; |
| 4470 | if (parser->states[0].token == XS_TOKEN_DIVIDE) { |
| 4471 | fxGetNextToken(parser); |
| 4472 | if (parser->states[0].token != XS_TOKEN_MORE) |
| 4473 | fxReportParserError(parser, parser->states[0].line, "missing >"); |
| 4474 | closed = 1; |
| 4475 | break; |
| 4476 | } |
| 4477 | if (gxTokenFlags[parser->states[0].token] & XS_TOKEN_IDENTIFIER_NAME) { |
| 4478 | fxJSXAttributeName(parser); |
| 4479 | if (parser->states[0].token == XS_TOKEN_ASSIGN) |
| 4480 | fxJSXAttributeValue(parser); |
| 4481 | else |
| 4482 | fxPushNodeStruct(parser, 0, XS_TOKEN_TRUE, parser->states[0].line); |
| 4483 | fxPushNodeStruct(parser, 2, XS_TOKEN_PROPERTY, parser->states[0].line); |
| 4484 | propertyCount++; |
| 4485 | } |
| 4486 | else if (parser->states[0].token == XS_TOKEN_LEFT_BRACE) { |
| 4487 | fxGetNextToken(parser); |
| 4488 | if (parser->states[0].token == XS_TOKEN_SPREAD) { |
| 4489 | fxGetNextToken(parser); |
| 4490 | fxAssignmentExpression(parser); |
| 4491 | if (parser->states[0].token == XS_TOKEN_RIGHT_BRACE) |
| 4492 | fxGetNextToken(parser); |
| 4493 | else |
| 4494 | fxReportParserError(parser, parser->states[0].line, "missing }"); |
| 4495 | fxPushNodeStruct(parser, 1, XS_TOKEN_SPREAD, parser->states[0].line); |
| 4496 | propertyCount++; |
| 4497 | } |
| 4498 | else |
| 4499 | fxReportParserError(parser, parser->states[0].line, "invalid %s", gxTokenNames[parser->states[0].token]); |
| 4500 | } |
| 4501 | else { |
| 4502 | fxReportParserError(parser, parser->states[0].line, "invalid %s", gxTokenNames[parser->states[0].token]); |
| 4503 | break; |
| 4504 | } |
| 4505 | } |
| 4506 | if (propertyCount > 0) { |
no test coverage detected