summaryrefslogtreecommitdiff
path: root/prism
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2023-12-13 21:35:42 -0500
committergit <svn-admin@ruby-lang.org>2023-12-14 02:43:32 +0000
commitb7e89d4b175a88be333134066b595d1e34c33fd3 (patch)
tree4967eb17940cd97d13616457c7158af7cb0fa75d /prism
parent74b6e70ef4cf1e625ff968ebf3e62dc9a0760ac1 (diff)
[ruby/prism] Fix hash pattern rest
https://github.com/ruby/prism/commit/43c4232cfc
Diffstat (limited to 'prism')
-rw-r--r--prism/diagnostic.c1
-rw-r--r--prism/diagnostic.h1
-rw-r--r--prism/prism.c21
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);