njs_queue_link_t *current)
{
njs_parser_node_t *node;
+ njs_lexer_token_t *peek;
+
+ static const njs_str_t as_string = njs_str("as");
if (!parser->module) {
njs_parser_syntax_error(parser, "Illegal export statement");
}
if (token->type != NJS_TOKEN_DEFAULT) {
- njs_parser_syntax_error(parser, "Non-default export is not supported");
- return NJS_DONE;
+
+ if (token->type != NJS_TOKEN_OPEN_BRACE) {
+ njs_parser_syntax_error(parser,
+ "Non-default export is not supported");
+ return NJS_DONE;
+ }
+
+ /*
+ * 'export {'
+ * supported only: export {identifier as default};
+ */
+
+ njs_lexer_consume_token(parser->lexer, 1);
+
+ token = njs_lexer_token(parser->lexer, 0);
+ if (njs_slow_path(token == NULL)) {
+ return NJS_ERROR;
+ }
+
+ if (token->type != NJS_TOKEN_NAME) {
+ njs_parser_syntax_error(parser, "Identifier expected");
+ return NJS_DONE;
+ }
+
+ peek = njs_lexer_peek_token(parser->lexer, token, 0);
+ if (njs_slow_path(peek == NULL)) {
+ return NJS_ERROR;
+ }
+
+ if (peek->type != NJS_TOKEN_NAME ||
+ !njs_strstr_eq(&peek->text, &as_string))
+ {
+ njs_parser_syntax_error(parser, "'as' expected");
+ return NJS_DONE;
+ }
+
+ peek = njs_lexer_peek_token(parser->lexer, peek, 0);
+ if (njs_slow_path(peek == NULL)) {
+ return NJS_ERROR;
+ }
+
+ if (peek->type != NJS_TOKEN_DEFAULT) {
+ njs_parser_syntax_error(parser,
+ "Non-default export is not supported");
+ return NJS_DONE;
+ }
+
+ peek = njs_lexer_peek_token(parser->lexer, peek, 1);
+ if (njs_slow_path(token == NULL)) {
+ return NJS_ERROR;
+ }
+
+ if (peek->type != NJS_TOKEN_CLOSE_BRACE) {
+ njs_parser_syntax_error(parser, "Close brace is expected");
+ return NJS_DONE;
+ }
+
+ node = njs_parser_node_new(parser, NJS_TOKEN_EXPORT);
+ if (node == NULL) {
+ return NJS_ERROR;
+ }
+
+ node->token_line = parser->line;
+ node->right = njs_parser_reference(parser, token);
+ if (node->right == NULL) {
+ return NJS_ERROR;
+ }
+
+ parser->node = node;
+
+ njs_lexer_consume_token(parser->lexer, 4);
+
+ return njs_parser_stack_pop(parser);
}
njs_lexer_consume_token(parser->lexer, 1);