}
parser->node->token_type = NJS_TOKEN_END;
+ parser->node->token_line = parser->lexer->line;
njs_parser_chain_top_set(parser, parser->node);
}
+static njs_int_t
+njs_parser_set_line_state(njs_parser_t *parser,
+ njs_lexer_token_t *token, njs_queue_link_t *current)
+{
+ parser->node->token_line = (uint32_t) (uintptr_t) parser->target;
+ parser->target = NULL;
+
+ return njs_parser_stack_pop(parser);
+}
+
+
/*
* 12.2 Primary Expression.
*/
}
node->u.value = njs_value_true;
+ node->token_line = token->line;
parser->node = node;
goto done;
}
node->u.value = njs_value_false;
+ node->token_line = token->line;
parser->node = node;
goto done;
}
njs_set_number(&node->u.value, token->number);
+ node->token_line = token->line;
parser->node = node;
goto done;
return NJS_ERROR;
}
+ node->token_line = token->line;
+
ret = njs_parser_string_create(parser->vm, token, &node->u.value);
if (ret != NJS_OK) {
return NJS_ERROR;
return NJS_ERROR;
}
+ node->token_line = token->line;
+
ret = njs_parser_escape_string_create(parser, token, &node->u.value);
if (ret != NJS_TOKEN_STRING) {
return NJS_ERROR;
/* ArrayLiteral */
case NJS_TOKEN_OPEN_BRACKET:
+ node = njs_parser_node_new(parser, NJS_TOKEN_ARRAY);
+ if (node == NULL) {
+ return NJS_ERROR;
+ }
+
+ node->token_line = token->line;
+ parser->node = node;
+
njs_parser_next(parser, njs_parser_array_literal);
break;
/* ObjectLiteral */
case NJS_TOKEN_OPEN_BRACE:
+ node = njs_parser_node_new(parser, NJS_TOKEN_OBJECT);
+ if (node == NULL) {
+ return NJS_ERROR;
+ }
+
+ node->token_line = token->line;
+ parser->node = node;
+
njs_parser_next(parser, njs_parser_object_literal);
break;
}
node->token_line = token->line;
-
parser->node = node;
njs_parser_next(parser, njs_parser_function_expression);
return NJS_ERROR;
}
+ node->token_line = token->line;
parser->node = node;
ret = njs_parser_regexp_literal(parser, token, current);
return NJS_ERROR;
}
+ node->token_line = token->line;
parser->node = node;
njs_parser_next(parser, njs_parser_template_literal);
return NJS_ERROR;
}
+ node->token_line = token->line;
parser->node = node;
done:
return NJS_ERROR;
}
+ array->token_line = token->line;
+
template = parser->node;
index = NJS_SCOPE_CALLEE_ARGUMENTS;
njs_parser_array_literal(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *array;
-
- array = njs_parser_node_new(parser, NJS_TOKEN_ARRAY);
- if (array == NULL) {
- return NJS_ERROR;
- }
-
- parser->target = array;
+ parser->target = parser->node;
+ parser->node = NULL;
njs_parser_next(parser, njs_parser_array_element_list);
njs_parser_object_literal(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *object, *node;
-
- object = njs_parser_node_new(parser, NJS_TOKEN_OBJECT);
- if (object == NULL) {
- return NJS_ERROR;
- }
+ njs_parser_node_t *node;
node = njs_parser_node_new(parser, 0);
if (node == NULL) {
return NJS_ERROR;
}
- node->left = object;
+ node->left = parser->node;
+ parser->node = NULL;
parser->target = node;
njs_parser_next(parser, njs_parser_property_definition_list);
property = njs_parser_node_string(parser->vm, token, parser);
}
+ if (property != NULL) {
+ property->token_line = token->line;
+ }
+
return property;
}
switch (token->type) {
case NJS_TOKEN_OPEN_BRACKET:
- njs_lexer_consume_token(parser->lexer, 1);
-
node = njs_parser_node_new(parser, NJS_TOKEN_PROPERTY);
if (node == NULL) {
return NJS_ERROR;
node->u.operation = NJS_VMCODE_PROPERTY_GET;
node->left = parser->node;
+ node->token_line = token->line;
parser->node = NULL;
+ njs_lexer_consume_token(parser->lexer, 1);
+
njs_parser_next(parser, njs_parser_expression);
return njs_parser_after(parser, current, node, 1,
}
node->u.operation = NJS_VMCODE_PROPERTY_GET;
+ node->token_line = token->line;
prop_node = njs_parser_node_string(parser->vm, token, parser);
if (prop_node == NULL) {
return NJS_ERROR;
}
+ prop_node->token_line = token->line;
+
node->left = parser->node;
node->right = prop_node;
return NJS_DECLINED;
case NJS_TOKEN_GRAVE:
- njs_lexer_consume_token(parser->lexer, 1);
-
node = njs_parser_create_call(parser, parser->node, 0);
if (node == NULL) {
return NJS_ERROR;
}
+ node->token_line = token->line;
+
parser->node = node;
+ njs_lexer_consume_token(parser->lexer, 1);
+
njs_parser_next(parser, njs_parser_template_literal);
break;
return NJS_ERROR;
}
+ parser->node->token_line = token->line;
+
return njs_parser_stack_pop(parser);
}
- njs_lexer_consume_token(parser->lexer, 1);
-
func = njs_parser_create_call(parser, parser->node, 1);
if (func == NULL) {
return NJS_ERROR;
}
+ func->token_line = token->line;
parser->node = func;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_arguments);
return njs_parser_after(parser, current, func, 1,
return njs_parser_failed(parser);
}
- njs_lexer_consume_token(parser->lexer, 1);
-
func = njs_parser_create_call(parser, parser->node, 0);
if (func == NULL) {
return NJS_ERROR;
}
+ func->token_line = token->line;
parser->node = func;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_arguments);
return njs_parser_after(parser, current, func, 1,
switch (token->type) {
case NJS_TOKEN_OPEN_PARENTHESIS:
- njs_lexer_consume_token(parser->lexer, 1);
-
func = njs_parser_create_call(parser, parser->node, 0);
if (func == NULL) {
return NJS_ERROR;
}
+ func->token_line = token->line;
parser->node = func;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_arguments);
ret = njs_parser_after(parser, current, func, 1,
node->index = parser->target->index + sizeof(njs_value_t);
}
+ node->token_line = token->line;
node->left = parser->node;
- parser->node->dest = node;
+ parser->node->dest = node;
parser->target->right = node;
parser->node = node;
switch (token->type) {
case NJS_TOKEN_OPEN_PARENTHESIS:
- njs_lexer_consume_token(parser->lexer, 2);
-
func = njs_parser_create_call(parser, parser->node, 0);
if (func == NULL) {
return NJS_ERROR;
}
+ func->token_line = token->line;
parser->node = func;
+ njs_lexer_consume_token(parser->lexer, 2);
njs_parser_next(parser, njs_parser_arguments);
ret = njs_parser_after(parser, current, func, 1,
switch (token->type) {
case NJS_TOKEN_OPEN_PARENTHESIS:
- njs_lexer_consume_token(parser->lexer, 1);
-
func = njs_parser_create_call(parser, parser->node, 0);
if (func == NULL) {
return NJS_ERROR;
}
+ func->token_line = token->line;
parser->node = func;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_arguments);
ret = njs_parser_after(parser, current, func, 1,
return NJS_ERROR;
}
+ func->token_line = token->line;
parser->node = func;
return njs_parser_stack_pop(parser);
switch (token->type) {
/* CallExpression */
case NJS_TOKEN_OPEN_PARENTHESIS:
- njs_lexer_consume_token(parser->lexer, 1);
-
func = njs_parser_create_call(parser, parser->node, 0);
if (func == NULL) {
return NJS_ERROR;
}
+ func->token_line = token->line;
parser->node = func;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_arguments);
ret = njs_parser_after(parser, current, func, 1,
return njs_parser_stack_pop(parser);
}
- njs_lexer_consume_token(parser->lexer, 1);
-
node = njs_parser_node_new(parser, type);
if (node == NULL) {
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
node->left = parser->node;
node->left->dest = node;
+ njs_lexer_consume_token(parser->lexer, 1);
+
return njs_parser_after(parser, current, node, 0, after);
}
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
njs_lexer_consume_token(parser->lexer, 1);
return njs_parser_stack_pop(parser);
}
- njs_lexer_consume_token(parser->lexer, 1);
-
if (!njs_parser_is_lvalue(parser->node)) {
+ njs_lexer_consume_token(parser->lexer, 1);
+
njs_parser_ref_error(parser,
"Invalid left-hand side in postfix operation");
return NJS_DONE;
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
node->left = parser->node;
+
parser->node = node;
+ njs_lexer_consume_token(parser->lexer, 1);
+
return njs_parser_stack_pop(parser);
}
njs_parser_unary_expression_after);
}
- njs_lexer_consume_token(parser->lexer, 1);
-
node = njs_parser_node_new(parser, type);
if (node == NULL) {
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
parser->target = node;
+ njs_lexer_consume_token(parser->lexer, 1);
+
return njs_parser_after(parser, current, node, 0,
njs_parser_unary_expression_next);
}
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = NJS_VMCODE_EXPONENTIATION;
node->left = parser->node;
node->left->dest = node;
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
node->left = parser->node;
node->left->dest = node;
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
node->left = parser->node;
node->left->dest = node;
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
node->left = parser->node;
node->left->dest = node;
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
node->left = parser->node;
node->left->dest = node;
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
node->left = parser->node;
node->left->dest = node;
return njs_parser_failed(parser);
}
- njs_lexer_consume_token(parser->lexer, 1);
-
node = njs_parser_node_new(parser, NJS_TOKEN_COALESCE);
if (node == NULL) {
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = NJS_VMCODE_COALESCE;
node->left = parser->node;
node->left->dest = node;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_bitwise_OR_expression);
return njs_parser_after(parser, current, node, 0,
return njs_parser_stack_pop(parser);
}
- njs_lexer_consume_token(parser->lexer, 1);
-
cond = njs_parser_node_new(parser, NJS_TOKEN_CONDITIONAL);
if (cond == NULL) {
return NJS_ERROR;
}
+ cond->token_line = token->line;
cond->left = parser->node;
node = njs_parser_node_new(parser, NJS_TOKEN_BRANCHING);
return NJS_ERROR;
}
+ node->token_line = token->line;
cond->right = node;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_assignment_expression);
return njs_parser_after(parser, current, cond, 1,
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.operation = operation;
node->left = parser->node;
return njs_parser_stack_pop(parser);
case NJS_TOKEN_EXPORT:
- njs_lexer_consume_token(parser->lexer, 1);
+ parser->line = token->line;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_export);
return njs_parser_after(parser, current, parser->node, 1,
njs_parser_statement_after);
case NJS_TOKEN_IMPORT:
- njs_lexer_consume_token(parser->lexer, 1);
+ parser->line = token->line;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_import);
return njs_parser_after(parser, current, parser->node, 1,
break;
case NJS_TOKEN_CONTINUE:
- parser->line = token->line;
njs_parser_next(parser, njs_parser_continue_statement);
break;
case NJS_TOKEN_BREAK:
- parser->line = token->line;
njs_parser_next(parser, njs_parser_break_statement);
break;
return NJS_OK;
}
+ parser->line = token->line;
+
njs_lexer_consume_token(parser->lexer, 1);
return NJS_OK;
njs_parser_block_statement(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
+ void *target;
njs_int_t ret;
ret = njs_parser_scope_begin(parser, NJS_SCOPE_BLOCK);
return NJS_ERROR;
}
+ target = (void *) (uintptr_t) parser->line;
parser->node = NULL;
if (token->type == NJS_TOKEN_CLOSE_BRACE) {
+ parser->target = target;
+
njs_parser_next(parser, njs_parser_block_statement_close_brace);
return NJS_OK;
}
njs_parser_next(parser, njs_parser_statement_list);
- return njs_parser_after(parser, current, NULL, 1,
+ return njs_parser_after(parser, current, target, 1,
njs_parser_block_statement_close_brace);
}
return njs_parser_failed(parser);
}
+ parser->line = token->line;
+
njs_lexer_consume_token(parser->lexer, 1);
token = njs_lexer_token(parser->lexer, 0);
return NJS_ERROR;
}
+ node->token_line = (uint32_t) (uintptr_t) parser->target;
node->left = parser->node;
node->right = NULL;
+
+ parser->target = NULL;
parser->node = node;
njs_parser_scope_end(parser);
return NJS_ERROR;
}
+ name->token_line = token->line;
+
parser->node = name;
njs_lexer_consume_token(parser->lexer, 1);
}
ret = njs_parser_initializer_assign(parser, NJS_TOKEN_VAR);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ parser->node->token_line = token->line;
if (token->type == NJS_TOKEN_ASSIGNMENT) {
njs_parser_next(parser, njs_parser_initializer);
- return ret;
+ return NJS_OK;
}
parser->target = parser->node;
njs_parser_next(parser, njs_parser_initializer_after);
- return ret;
+ return NJS_OK;
}
return NJS_ERROR;
}
+ node->token_line = parser->line;
+
parser->node = NULL;
njs_parser_next(parser, njs_parser_expression);
njs_parser_else_statement(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
+ njs_parser_node_t *node;
+
parser->target->right = parser->node;
parser->node = NULL;
if (token->type == NJS_TOKEN_ELSE) {
- njs_lexer_consume_token(parser->lexer, 1);
+ node = njs_parser_node_new(parser, NJS_TOKEN_BRANCHING);
+ if (node == NULL) {
+ return NJS_ERROR;
+ }
+
+ node->token_line = token->line;
+ node->left = parser->target->right;
+ parser->target->right = node;
+
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_statement_wo_node);
return njs_parser_after(parser, current, parser->target, 1,
njs_parser_else_statement_after(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *node;
-
- node = njs_parser_node_new(parser, NJS_TOKEN_BRANCHING);
- if (node == NULL) {
- return NJS_ERROR;
- }
-
- node->left = parser->target->right;
- node->right = parser->node;
-
- parser->target->right = node;
+ parser->target->right->right = parser->node;
parser->node = parser->target;
njs_parser_iteration_statement_do(njs_parser_t *parser,
njs_lexer_token_t *token, njs_queue_link_t *current)
{
+ njs_parser_node_t *node;
+
+ node = njs_parser_node_new(parser, NJS_TOKEN_DO);
+ if (node == NULL) {
+ return NJS_ERROR;
+ }
+
+ node->token_line = parser->line;
+
parser->node = NULL;
njs_parser_next(parser, njs_parser_statement_wo_node);
- return njs_parser_after(parser, current, NULL, 1,
+ return njs_parser_after(parser, current, node, 1,
njs_parser_iteration_statement_do_while);
}
return njs_parser_failed(parser);
}
+ parser->target->left = parser->node;
+
njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_expression_parenthesis);
- return njs_parser_after(parser, current, parser->node, 1,
+ return njs_parser_after(parser, current, parser->target, 1,
njs_parser_do_while_semicolon);
}
njs_parser_do_while_semicolon(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *node;
-
if (parser->strict_semicolon) {
return njs_parser_failed(parser);
}
- node = njs_parser_node_new(parser, NJS_TOKEN_DO);
- if (node == NULL) {
- return NJS_ERROR;
- }
-
- node->left = parser->target;
- node->right = parser->node;
- parser->node = node;
+ parser->target->right = parser->node;
+ parser->node = parser->target;
return njs_parser_stack_pop(parser);
}
njs_parser_iteration_statement_while(njs_parser_t *parser,
njs_lexer_token_t *token, njs_queue_link_t *current)
{
+ njs_parser_node_t *node;
+
+ node = njs_parser_node_new(parser, NJS_TOKEN_WHILE);
+ if (node == NULL) {
+ return NJS_ERROR;
+ }
+
+ node->token_line = token->line;
+
njs_parser_next(parser, njs_parser_expression_parenthesis);
- return njs_parser_after(parser, current, NULL, 1,
+ return njs_parser_after(parser, current, node, 1,
njs_parser_while_statement);
}
njs_parser_while_statement(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *node;
-
- node = parser->node;
-
+ parser->target->right = parser->node;
parser->node = NULL;
njs_parser_next(parser, njs_parser_statement_wo_node);
- return njs_parser_after(parser, current, node, 1, njs_parser_while_after);
+ return njs_parser_after(parser, current, parser->target, 1,
+ njs_parser_while_after);
}
njs_parser_while_after(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *node;
-
- node = njs_parser_node_new(parser, NJS_TOKEN_WHILE);
- if (node == NULL) {
- return NJS_ERROR;
- }
-
- node->left = parser->node;
- node->right = parser->target;
- parser->node = node;
+ parser->target->left = parser->node;
+ parser->node = parser->target;
return njs_parser_stack_pop(parser);
}
njs_parser_next(parser, njs_parser_iteration_statement_for_map);
- return NJS_OK;
+ return njs_parser_after(parser, current,
+ (void *) (uintptr_t) parser->line, 1,
+ njs_parser_set_line_state);
}
if (token->type == NJS_TOKEN_AWAIT) {
{
njs_int_t ret;
njs_lexer_token_t *next;
- njs_parser_node_t *node;
+ njs_parser_node_t *node, *var;
switch (token->type) {
/* BindingPattern */
return NJS_OK;
}
- node = njs_parser_variable_node(parser, token->unique_id,
+ var = njs_parser_variable_node(parser, token->unique_id,
NJS_VARIABLE_VAR);
- if (node == NULL) {
+ if (var == NULL) {
return NJS_ERROR;
}
+ var->token_line = token->line;
+
parser->node = NULL;
+ node = njs_parser_node_new(parser, NJS_TOKEN_IN);
+ if (node == NULL) {
+ return NJS_ERROR;
+ }
+
+ node->token_line = next->line;
+ node->left = var;
+
njs_parser_next(parser, njs_parser_expression);
ret = njs_parser_after(parser, current, node, 1,
njs_parser_for_var_in_statement(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *node;
-
if (token->type != NJS_TOKEN_CLOSE_PARENTHESIS) {
return njs_parser_failed(parser);
}
njs_lexer_consume_token(parser->lexer, 1);
- node = njs_parser_node_new(parser, NJS_TOKEN_IN);
- if (node == NULL) {
- return NJS_ERROR;
- }
-
- node->left = parser->target;
- node->right = parser->node;
-
+ parser->target->right = parser->node;
parser->node = NULL;
njs_parser_next(parser, njs_parser_statement_wo_node);
- return njs_parser_after(parser, current, node, 1,
+ return njs_parser_after(parser, current, parser->target, 1,
njs_parser_for_var_in_statement_after);
}
return NJS_ERROR;
}
+ node->token_line = parser->line;
+
switch (token->type) {
case NJS_TOKEN_SEMICOLON:
break;
return NJS_ERROR;
}
+ swtch->token_line = parser->line;
+
njs_parser_next(parser, njs_parser_expression_parenthesis);
ret = njs_parser_after(parser, current, swtch, 1,
return NJS_ERROR;
}
+ branch->token_line = token->line;
branch->right = node;
njs_parser_next(parser, njs_parser_expression);
return NJS_DONE;
}
- njs_lexer_consume_token(parser->lexer, 1);
-
if (parser->target->token_type == NJS_TOKEN_SWITCH) {
parser->target->right = node;
parser->target->left = node;
}
+ node->token_line = token->line;
node->token_type = NJS_TOKEN_DEFAULT;
parser->target = node;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_switch_case_after_wo_def);
break;
return NJS_ERROR;
}
+ node->token_line = parser->line;
+
if (parser->lexer->prev_type == NJS_TOKEN_LINE_END) {
njs_parser_syntax_error(parser, "Illegal newline after throw");
return NJS_DONE;
return NJS_ERROR;
}
+ try->token_line = parser->line;
+
parser->node = NULL;
njs_parser_next(parser, njs_parser_block_statement_open_brace);
try->left = parser->node;
if (token->type == NJS_TOKEN_FINALLY) {
- njs_lexer_consume_token(parser->lexer, 1);
+ node = njs_parser_node_new(parser, NJS_TOKEN_FINALLY);
+ if (node == NULL) {
+ return NJS_ERROR;
+ }
+
+ node->token_line = token->line;
+
+ if (try->right != NULL) {
+ node->left = try->right;
+ }
+ try->right = node;
parser->node = NULL;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_block_statement_open_brace);
return njs_parser_after(parser, current, try, 0,
return NJS_DONE;
}
- njs_lexer_consume_token(parser->lexer, 1);
-
catch = njs_parser_node_new(parser, NJS_TOKEN_CATCH);
if (catch == NULL) {
return NJS_ERROR;
}
+ catch->token_line = token->line;
+
+ njs_lexer_consume_token(parser->lexer, 1);
+
token = njs_lexer_token(parser->lexer, 0);
if (token == NULL) {
return NJS_ERROR;
return NJS_ERROR;
}
+ node->token_line = token->line;
+
catch->left = node;
njs_lexer_consume_token(parser->lexer, 1);
njs_parser_catch_after(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
+ njs_parser_node_t *node;
+
njs_parser_scope_end(parser);
parser->target->right->right = parser->node;
if (token->type == NJS_TOKEN_FINALLY) {
- njs_lexer_consume_token(parser->lexer, 1);
+ node = njs_parser_node_new(parser, NJS_TOKEN_FINALLY);
+ if (node == NULL) {
+ return NJS_ERROR;
+ }
+
+ node->token_line = token->line;
+
+ if (parser->target->right != NULL) {
+ node->left = parser->target->right;
+ }
+ parser->target->right = node;
parser->node = NULL;
+ njs_lexer_consume_token(parser->lexer, 1);
njs_parser_next(parser, njs_parser_block_statement_open_brace);
return njs_parser_after(parser, current, parser->target, 1,
njs_parser_catch_finally(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *node;
-
if (parser->ret != NJS_OK) {
return njs_parser_failed(parser);
}
- node = njs_parser_node_new(parser, NJS_TOKEN_FINALLY);
- if (node == NULL) {
- return NJS_ERROR;
- }
-
- node->right = parser->node;
-
- if (parser->target->right != NULL) {
- node->left = parser->target->right;
- }
-
- parser->target->right = node;
+ parser->target->right->right = parser->node;
parser->node = parser->target;
return njs_parser_stack_pop(parser);
return njs_parser_failed(parser);
}
- njs_lexer_consume_token(parser->lexer, 1);
-
parent = parser->target;
last = NULL;
if (body == NULL) {
return NJS_ERROR;
}
+
+ body->right->token_line = token->line;
}
parent->right = body;
njs_parser_scope_end(parser);
+ njs_lexer_consume_token(parser->lexer, 1);
+
return njs_parser_stack_pop(parser);
}
return NJS_ERROR;
}
+ node->token_line = parser->line;
parser->node = node;
njs_parser_next(parser, njs_parser_expression);
njs_parser_import(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *name;
+ njs_parser_node_t *name, *import;
if (parser->scope->type != NJS_SCOPE_GLOBAL && !parser->scope->module) {
njs_parser_syntax_error(parser, "Illegal import statement");
return NJS_ERROR;
}
+ name->token_line = token->line;
+
njs_lexer_consume_token(parser->lexer, 1);
token = njs_lexer_token(parser->lexer, 0);
return njs_parser_failed(parser);
}
+ import = njs_parser_node_new(parser, NJS_TOKEN_IMPORT);
+ if (import == NULL) {
+ return NJS_ERROR;
+ }
+
+ import->token_line = parser->line;
+ import->left = name;
+
njs_parser_next(parser, njs_parser_module);
- return njs_parser_after(parser, current, name, 1, njs_parser_import_after);
+ return njs_parser_after(parser, current, import, 1,
+ njs_parser_import_after);
}
njs_parser_import_after(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
- njs_parser_node_t *import;
-
if (njs_parser_expect_semicolon(parser, token) != NJS_OK) {
return njs_parser_failed(parser);
}
- import = njs_parser_node_new(parser, NJS_TOKEN_IMPORT);
- if (import == NULL) {
- return NJS_ERROR;
- }
-
- import->left = parser->target;
- import->right = parser->node;
+ parser->target->right = parser->node;
- parser->node = import;
+ parser->node = parser->target;
parser->node->hoist = 1;
return njs_parser_stack_pop(parser);
return NJS_ERROR;
}
- node->token_line = token->line;
-
lambda = njs_function_lambda_alloc(parser->vm, 1);
if (lambda == NULL) {
return NJS_ERROR;
}
+ node->token_line = token->line;
node->u.value.data.u.lambda = lambda;
+
parser->node = node;
ret = njs_parser_scope_begin(parser, NJS_SCOPE_FUNCTION);
}
parser->target->right = njs_parser_chain_top(parser);
- parser->target->right->token_line = 1;
parser->node = parser->target;
return NULL;
}
+ if (expr != NULL) {
+ node->token_line = expr->token_line;
+ }
+
node->right = expr;
stmt = njs_parser_node_new(parser, NJS_TOKEN_STATEMENT);
} else {
node->token_type = NJS_TOKEN_NON_LOCAL_THIS;
-
node->token_line = token->line;
ret = njs_variable_reference(parser->vm, scope, node,
return NULL;
}
+ node->token_line = expr->token_line;
node->index = index;
node->left = expr;
return NJS_TOKEN_ERROR;
}
+ object->token_line = value->token_line;
object->u.object = parent;
type = proto_init ? NJS_TOKEN_PROTO_INIT : NJS_TOKEN_PROPERTY_INIT;
return NJS_ERROR;
}
+ propref->token_line = value->token_line;
propref->left = object;
propref->right = property;
return NJS_ERROR;
}
+ assign->token_line = value->token_line;
assign->u.operation = NJS_VMCODE_MOVE;
assign->left = propref;
assign->right = value;
return NJS_TOKEN_ERROR;
}
+ object->token_line = value->token_line;
object->u.object = parent;
propref = njs_parser_node_new(parser, 0);
return NJS_ERROR;
}
+ node->token_line = value->token_line;
node->left = propref;
node->right = value;
njs_set_number(&number->u.value, array->u.length);
+ number->token_line = value->token_line;
+
ret = njs_parser_object_property(parser, array, number, value, 0);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
return NJS_ERROR;
}
+ node->token_line = token->line;
+
if (escape) {
ret = njs_parser_escape_string_create(parser, token, &node->u.value);
if (njs_slow_path(ret != NJS_TOKEN_STRING)) {
*ret |= njs_parser_serialize_node(chain, node);
- njs_chb_append_literal(chain, "\"");
+ njs_chb_append_literal(chain, "\",\n");
+ njs_parser_serialize_indent(chain, indent);
+ njs_chb_sprintf(chain, 32, " \"line\": %d", node->token_line);
switch (node->token_type) {
case NJS_TOKEN_NUMBER: