summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-04-01 14:41:45 -0400
committergit <svn-admin@ruby-lang.org>2024-04-01 19:28:03 +0000
commitfee70c1ed71dd0db4ce9a2226dc5f4845e0a0c48 (patch)
tree0a46c2c0a929149d17aefe18c9c9953999c84855
parent1e737ec97760fa7dd5436e9e41fefb5f71566344 (diff)
[ruby/prism] Add better error messages for invalid block-locals
https://github.com/ruby/prism/commit/27ad452436
-rw-r--r--prism/prism.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/prism/prism.c b/prism/prism.c
index 7527e3c55c..01b920b2d0 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -1988,7 +1988,6 @@ pm_block_parameters_node_closing_set(pm_block_parameters_node_t *node, const pm_
*/
static pm_block_local_variable_node_t *
pm_block_local_variable_node_create(pm_parser_t *parser, const pm_token_t *name) {
- assert(name->type == PM_TOKEN_IDENTIFIER || name->type == PM_TOKEN_MISSING);
pm_block_local_variable_node_t *node = PM_ALLOC_NODE(parser, pm_block_local_variable_node_t);
*node = (pm_block_local_variable_node_t) {
@@ -13587,7 +13586,28 @@ parse_block_parameters(
if (accept1(parser, PM_TOKEN_SEMICOLON)) {
do {
- expect1(parser, PM_TOKEN_IDENTIFIER, PM_ERR_BLOCK_PARAM_LOCAL_VARIABLE);
+ switch (parser->current.type) {
+ case PM_TOKEN_CONSTANT:
+ pm_parser_err_current(parser, PM_ERR_ARGUMENT_FORMAL_CONSTANT);
+ parser_lex(parser);
+ break;
+ case PM_TOKEN_INSTANCE_VARIABLE:
+ pm_parser_err_current(parser, PM_ERR_ARGUMENT_FORMAL_IVAR);
+ parser_lex(parser);
+ break;
+ case PM_TOKEN_GLOBAL_VARIABLE:
+ pm_parser_err_current(parser, PM_ERR_ARGUMENT_FORMAL_GLOBAL);
+ parser_lex(parser);
+ break;
+ case PM_TOKEN_CLASS_VARIABLE:
+ pm_parser_err_current(parser, PM_ERR_ARGUMENT_FORMAL_CLASS);
+ parser_lex(parser);
+ break;
+ default:
+ expect1(parser, PM_TOKEN_IDENTIFIER, PM_ERR_BLOCK_PARAM_LOCAL_VARIABLE);
+ break;
+ }
+
bool repeated = pm_parser_parameter_name_check(parser, &parser->previous);
pm_parser_local_add_token(parser, &parser->previous);