mirror of
https://github.com/ruby/ruby.git
synced 2025-09-15 16:44:01 +02:00
[ruby/prism] Improve error handling for missing parentheses after 'not' in command calls
d9151b8a82
This commit is contained in:
parent
4cf85fe214
commit
4eb0a6cd4d
4 changed files with 20 additions and 4 deletions
|
@ -101,7 +101,8 @@ errors:
|
||||||
- EXPECT_FOR_DELIMITER
|
- EXPECT_FOR_DELIMITER
|
||||||
- EXPECT_IDENT_REQ_PARAMETER
|
- EXPECT_IDENT_REQ_PARAMETER
|
||||||
- EXPECT_IN_DELIMITER
|
- EXPECT_IN_DELIMITER
|
||||||
- EXPECT_LPAREN_AFTER_NOT
|
- EXPECT_LPAREN_AFTER_NOT_LPAREN
|
||||||
|
- EXPECT_LPAREN_AFTER_NOT_OTHER
|
||||||
- EXPECT_LPAREN_REQ_PARAMETER
|
- EXPECT_LPAREN_REQ_PARAMETER
|
||||||
- EXPECT_MESSAGE
|
- EXPECT_MESSAGE
|
||||||
- EXPECT_RBRACKET
|
- EXPECT_RBRACKET
|
||||||
|
|
|
@ -19775,8 +19775,17 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
||||||
pm_arguments_t arguments = { 0 };
|
pm_arguments_t arguments = { 0 };
|
||||||
pm_node_t *receiver = NULL;
|
pm_node_t *receiver = NULL;
|
||||||
|
|
||||||
|
// If we do not accept a command call, then we also do not accept a
|
||||||
|
// not without parentheses. In this case we need to reject this
|
||||||
|
// syntax.
|
||||||
if (!accepts_command_call && !match1(parser, PM_TOKEN_PARENTHESIS_LEFT)) {
|
if (!accepts_command_call && !match1(parser, PM_TOKEN_PARENTHESIS_LEFT)) {
|
||||||
pm_parser_err_current(parser, PM_ERR_EXPECT_LPAREN_AFTER_NOT);
|
if (match1(parser, PM_TOKEN_PARENTHESIS_LEFT_PARENTHESES)) {
|
||||||
|
pm_parser_err(parser, parser->previous.end, parser->previous.end + 1, PM_ERR_EXPECT_LPAREN_AFTER_NOT_LPAREN);
|
||||||
|
} else {
|
||||||
|
accept1(parser, PM_TOKEN_NEWLINE);
|
||||||
|
pm_parser_err_current(parser, PM_ERR_EXPECT_LPAREN_AFTER_NOT_OTHER);
|
||||||
|
}
|
||||||
|
|
||||||
return (pm_node_t *) pm_missing_node_create(parser, parser->current.start, parser->current.end);
|
return (pm_node_t *) pm_missing_node_create(parser, parser->current.start, parser->current.end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -184,7 +184,8 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
|
||||||
[PM_ERR_EXPECT_FOR_DELIMITER] = { "unexpected %s; expected a 'do', newline, or ';' after the 'for' loop collection", PM_ERROR_LEVEL_SYNTAX },
|
[PM_ERR_EXPECT_FOR_DELIMITER] = { "unexpected %s; expected a 'do', newline, or ';' after the 'for' loop collection", PM_ERROR_LEVEL_SYNTAX },
|
||||||
[PM_ERR_EXPECT_IDENT_REQ_PARAMETER] = { "expected an identifier for the required parameter", PM_ERROR_LEVEL_SYNTAX },
|
[PM_ERR_EXPECT_IDENT_REQ_PARAMETER] = { "expected an identifier for the required parameter", PM_ERROR_LEVEL_SYNTAX },
|
||||||
[PM_ERR_EXPECT_IN_DELIMITER] = { "expected a delimiter after the patterns of an `in` clause", PM_ERROR_LEVEL_SYNTAX },
|
[PM_ERR_EXPECT_IN_DELIMITER] = { "expected a delimiter after the patterns of an `in` clause", PM_ERROR_LEVEL_SYNTAX },
|
||||||
[PM_ERR_EXPECT_LPAREN_AFTER_NOT] = { "expected a `(` after `not`", PM_ERROR_LEVEL_SYNTAX },
|
[PM_ERR_EXPECT_LPAREN_AFTER_NOT_LPAREN] = { "expected a `(` immediately after `not`", PM_ERROR_LEVEL_SYNTAX },
|
||||||
|
[PM_ERR_EXPECT_LPAREN_AFTER_NOT_OTHER] = { "expected a `(` after `not`", PM_ERROR_LEVEL_SYNTAX },
|
||||||
[PM_ERR_EXPECT_LPAREN_REQ_PARAMETER] = { "expected a `(` to start a required parameter", PM_ERROR_LEVEL_SYNTAX },
|
[PM_ERR_EXPECT_LPAREN_REQ_PARAMETER] = { "expected a `(` to start a required parameter", PM_ERROR_LEVEL_SYNTAX },
|
||||||
[PM_ERR_EXPECT_MESSAGE] = { "unexpected %s; expecting a message to send to the receiver", PM_ERROR_LEVEL_SYNTAX },
|
[PM_ERR_EXPECT_MESSAGE] = { "unexpected %s; expecting a message to send to the receiver", PM_ERROR_LEVEL_SYNTAX },
|
||||||
[PM_ERR_EXPECT_RBRACKET] = { "expected a matching `]`", PM_ERROR_LEVEL_SYNTAX },
|
[PM_ERR_EXPECT_RBRACKET] = { "expected a matching `]`", PM_ERROR_LEVEL_SYNTAX },
|
||||||
|
|
|
@ -7,6 +7,11 @@ true || not true
|
||||||
^~~~ unexpected 'true', expecting end-of-input
|
^~~~ unexpected 'true', expecting end-of-input
|
||||||
|
|
||||||
true && not (true)
|
true && not (true)
|
||||||
^ expected a `(` after `not`
|
^ expected a `(` immediately after `not`
|
||||||
^ unexpected '(', expecting end-of-input
|
^ unexpected '(', expecting end-of-input
|
||||||
|
|
||||||
|
true && not
|
||||||
|
true
|
||||||
|
^~~~ expected a `(` after `not`
|
||||||
|
^~~~ unexpected 'true', expecting end-of-input
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue