diff options
author | Kevin Newton <kddnewton@gmail.com> | 2023-12-13 21:35:42 -0500 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2023-12-14 02:43:32 +0000 |
commit | b7e89d4b175a88be333134066b595d1e34c33fd3 (patch) | |
tree | 4967eb17940cd97d13616457c7158af7cb0fa75d /prism | |
parent | 74b6e70ef4cf1e625ff968ebf3e62dc9a0760ac1 (diff) |
[ruby/prism] Fix hash pattern rest
https://github.com/ruby/prism/commit/43c4232cfc
Diffstat (limited to 'prism')
-rw-r--r-- | prism/diagnostic.c | 1 | ||||
-rw-r--r-- | prism/diagnostic.h | 1 | ||||
-rw-r--r-- | prism/prism.c | 21 |
3 files changed, 17 insertions, 6 deletions
diff --git a/prism/diagnostic.c b/prism/diagnostic.c index eaf6112d18..1fc8c50cb5 100644 --- a/prism/diagnostic.c +++ b/prism/diagnostic.c @@ -219,6 +219,7 @@ static const char* const diagnostic_messages[PM_DIAGNOSTIC_ID_LEN] = { [PM_ERR_PATTERN_EXPRESSION_AFTER_PIN] = "expected a pattern expression after the `^` pin operator", [PM_ERR_PATTERN_EXPRESSION_AFTER_PIPE] = "expected a pattern expression after the `|` operator", [PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE] = "expected a pattern expression after the range operator", + [PM_ERR_PATTERN_EXPRESSION_AFTER_REST] = "unexpected pattern expression after the `**` expression", [PM_ERR_PATTERN_HASH_KEY] = "expected a key in the hash pattern", [PM_ERR_PATTERN_HASH_KEY_LABEL] = "expected a label as the key in the hash pattern", // TODO // THIS // AND // ABOVE // IS WEIRD [PM_ERR_PATTERN_IDENT_AFTER_HROCKET] = "expected an identifier after the `=>` operator", diff --git a/prism/diagnostic.h b/prism/diagnostic.h index a1e0b6d0d8..fc1f0c2b4b 100644 --- a/prism/diagnostic.h +++ b/prism/diagnostic.h @@ -211,6 +211,7 @@ typedef enum { PM_ERR_PATTERN_EXPRESSION_AFTER_PIN, PM_ERR_PATTERN_EXPRESSION_AFTER_PIPE, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, + PM_ERR_PATTERN_EXPRESSION_AFTER_REST, PM_ERR_PATTERN_HASH_KEY, PM_ERR_PATTERN_HASH_KEY_LABEL, PM_ERR_PATTERN_IDENT_AFTER_HROCKET, diff --git a/prism/prism.c b/prism/prism.c index 4b15f65859..dfb1affa88 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -13121,10 +13121,15 @@ parse_pattern_hash(pm_parser_t *parser, pm_node_t *first_assoc) { break; } - pm_node_t *assoc; - if (match1(parser, PM_TOKEN_USTAR_STAR)) { - assoc = parse_pattern_keyword_rest(parser); + pm_node_t *assoc = parse_pattern_keyword_rest(parser); + + if (rest == NULL) { + rest = assoc; + } else { + pm_parser_err_node(parser, assoc, PM_ERR_PATTERN_EXPRESSION_AFTER_REST); + pm_node_list_append(&assocs, assoc); + } } else { expect1(parser, PM_TOKEN_LABEL, PM_ERR_PATTERN_LABEL_AFTER_COMMA); pm_node_t *key = (pm_node_t *) pm_symbol_node_label_create(parser, &parser->previous); @@ -13138,10 +13143,14 @@ parse_pattern_hash(pm_parser_t *parser, pm_node_t *first_assoc) { } pm_token_t operator = not_provided(parser); - assoc = (pm_node_t *) pm_assoc_node_create(parser, key, &operator, value); - } + pm_node_t *assoc = (pm_node_t *) pm_assoc_node_create(parser, key, &operator, value); + + if (rest != NULL) { + pm_parser_err_node(parser, assoc, PM_ERR_PATTERN_EXPRESSION_AFTER_REST); + } - pm_node_list_append(&assocs, assoc); + pm_node_list_append(&assocs, assoc); + } } pm_hash_pattern_node_t *node = pm_hash_pattern_node_node_list_create(parser, &assocs, rest); |