[ruby/prism] Fix hash pattern rest
https://github.com/ruby/prism/commit/43c4232cfc
This commit is contained in:
parent
74b6e70ef4
commit
b7e89d4b17
@ -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_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_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_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] = "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_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",
|
[PM_ERR_PATTERN_IDENT_AFTER_HROCKET] = "expected an identifier after the `=>` operator",
|
||||||
|
@ -211,6 +211,7 @@ typedef enum {
|
|||||||
PM_ERR_PATTERN_EXPRESSION_AFTER_PIN,
|
PM_ERR_PATTERN_EXPRESSION_AFTER_PIN,
|
||||||
PM_ERR_PATTERN_EXPRESSION_AFTER_PIPE,
|
PM_ERR_PATTERN_EXPRESSION_AFTER_PIPE,
|
||||||
PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE,
|
PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE,
|
||||||
|
PM_ERR_PATTERN_EXPRESSION_AFTER_REST,
|
||||||
PM_ERR_PATTERN_HASH_KEY,
|
PM_ERR_PATTERN_HASH_KEY,
|
||||||
PM_ERR_PATTERN_HASH_KEY_LABEL,
|
PM_ERR_PATTERN_HASH_KEY_LABEL,
|
||||||
PM_ERR_PATTERN_IDENT_AFTER_HROCKET,
|
PM_ERR_PATTERN_IDENT_AFTER_HROCKET,
|
||||||
|
@ -13121,10 +13121,15 @@ parse_pattern_hash(pm_parser_t *parser, pm_node_t *first_assoc) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_node_t *assoc;
|
|
||||||
|
|
||||||
if (match1(parser, PM_TOKEN_USTAR_STAR)) {
|
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 {
|
} else {
|
||||||
expect1(parser, PM_TOKEN_LABEL, PM_ERR_PATTERN_LABEL_AFTER_COMMA);
|
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);
|
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);
|
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);
|
||||||
}
|
|
||||||
|
|
||||||
pm_node_list_append(&assocs, assoc);
|
if (rest != NULL) {
|
||||||
|
pm_parser_err_node(parser, assoc, PM_ERR_PATTERN_EXPRESSION_AFTER_REST);
|
||||||
|
}
|
||||||
|
|
||||||
|
pm_node_list_append(&assocs, assoc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_hash_pattern_node_t *node = pm_hash_pattern_node_node_list_create(parser, &assocs, rest);
|
pm_hash_pattern_node_t *node = pm_hash_pattern_node_node_list_create(parser, &assocs, rest);
|
||||||
|
@ -16,27 +16,27 @@
|
|||||||
│ ├── pattern:
|
│ ├── pattern:
|
||||||
│ │ @ HashPatternNode (location: (2,3)-(2,15))
|
│ │ @ HashPatternNode (location: (2,3)-(2,15))
|
||||||
│ │ ├── constant: ∅
|
│ │ ├── constant: ∅
|
||||||
│ │ ├── elements: (length: 2)
|
│ │ ├── elements: (length: 1)
|
||||||
│ │ │ ├── @ AssocNode (location: (2,3)-(2,7))
|
│ │ │ └── @ AssocNode (location: (2,3)-(2,7))
|
||||||
│ │ │ │ ├── key:
|
│ │ │ ├── key:
|
||||||
│ │ │ │ │ @ SymbolNode (location: (2,3)-(2,5))
|
│ │ │ │ @ SymbolNode (location: (2,3)-(2,5))
|
||||||
│ │ │ │ │ ├── flags: ∅
|
│ │ │ │ ├── flags: ∅
|
||||||
│ │ │ │ │ ├── opening_loc: ∅
|
│ │ │ │ ├── opening_loc: ∅
|
||||||
│ │ │ │ │ ├── value_loc: (2,3)-(2,4) = "b"
|
│ │ │ │ ├── value_loc: (2,3)-(2,4) = "b"
|
||||||
│ │ │ │ │ ├── closing_loc: (2,4)-(2,5) = ":"
|
│ │ │ │ ├── closing_loc: (2,4)-(2,5) = ":"
|
||||||
│ │ │ │ │ └── unescaped: "b"
|
│ │ │ │ └── unescaped: "b"
|
||||||
│ │ │ │ ├── value:
|
|
||||||
│ │ │ │ │ @ LocalVariableTargetNode (location: (2,6)-(2,7))
|
|
||||||
│ │ │ │ │ ├── name: :c
|
|
||||||
│ │ │ │ │ └── depth: 0
|
|
||||||
│ │ │ │ └── operator_loc: ∅
|
|
||||||
│ │ │ └── @ AssocSplatNode (location: (2,9)-(2,15))
|
|
||||||
│ │ │ ├── value:
|
│ │ │ ├── value:
|
||||||
│ │ │ │ @ LocalVariableTargetNode (location: (2,11)-(2,15))
|
│ │ │ │ @ LocalVariableTargetNode (location: (2,6)-(2,7))
|
||||||
│ │ │ │ ├── name: :rest
|
│ │ │ │ ├── name: :c
|
||||||
│ │ │ │ └── depth: 0
|
│ │ │ │ └── depth: 0
|
||||||
│ │ │ └── operator_loc: (2,9)-(2,11) = "**"
|
│ │ │ └── operator_loc: ∅
|
||||||
│ │ ├── rest: ∅
|
│ │ ├── rest:
|
||||||
|
│ │ │ @ AssocSplatNode (location: (2,9)-(2,15))
|
||||||
|
│ │ │ ├── value:
|
||||||
|
│ │ │ │ @ LocalVariableTargetNode (location: (2,11)-(2,15))
|
||||||
|
│ │ │ │ ├── name: :rest
|
||||||
|
│ │ │ │ └── depth: 0
|
||||||
|
│ │ │ └── operator_loc: (2,9)-(2,11) = "**"
|
||||||
│ │ ├── opening_loc: ∅
|
│ │ ├── opening_loc: ∅
|
||||||
│ │ └── closing_loc: ∅
|
│ │ └── closing_loc: ∅
|
||||||
│ ├── statements:
|
│ ├── statements:
|
||||||
|
@ -26,24 +26,24 @@
|
|||||||
│ ├── pattern:
|
│ ├── pattern:
|
||||||
│ │ @ HashPatternNode (location: (2,3)-(2,15))
|
│ │ @ HashPatternNode (location: (2,3)-(2,15))
|
||||||
│ │ ├── constant: ∅
|
│ │ ├── constant: ∅
|
||||||
│ │ ├── elements: (length: 2)
|
│ │ ├── elements: (length: 1)
|
||||||
│ │ │ ├── @ AssocNode (location: (2,4)-(2,6))
|
│ │ │ └── @ AssocNode (location: (2,4)-(2,6))
|
||||||
│ │ │ │ ├── key:
|
│ │ │ ├── key:
|
||||||
│ │ │ │ │ @ SymbolNode (location: (2,4)-(2,6))
|
│ │ │ │ @ SymbolNode (location: (2,4)-(2,6))
|
||||||
│ │ │ │ │ ├── flags: ∅
|
│ │ │ │ ├── flags: ∅
|
||||||
│ │ │ │ │ ├── opening_loc: ∅
|
│ │ │ │ ├── opening_loc: ∅
|
||||||
│ │ │ │ │ ├── value_loc: (2,4)-(2,5) = "a"
|
│ │ │ │ ├── value_loc: (2,4)-(2,5) = "a"
|
||||||
│ │ │ │ │ ├── closing_loc: (2,5)-(2,6) = ":"
|
│ │ │ │ ├── closing_loc: (2,5)-(2,6) = ":"
|
||||||
│ │ │ │ │ └── unescaped: "a"
|
│ │ │ │ └── unescaped: "a"
|
||||||
│ │ │ │ ├── value: ∅
|
│ │ │ ├── value: ∅
|
||||||
│ │ │ │ └── operator_loc: ∅
|
│ │ │ └── operator_loc: ∅
|
||||||
│ │ │ └── @ AssocSplatNode (location: (2,8)-(2,14))
|
│ │ ├── rest:
|
||||||
│ │ │ ├── value:
|
│ │ │ @ AssocSplatNode (location: (2,8)-(2,14))
|
||||||
│ │ │ │ @ LocalVariableTargetNode (location: (2,10)-(2,14))
|
│ │ │ ├── value:
|
||||||
│ │ │ │ ├── name: :rest
|
│ │ │ │ @ LocalVariableTargetNode (location: (2,10)-(2,14))
|
||||||
│ │ │ │ └── depth: 0
|
│ │ │ │ ├── name: :rest
|
||||||
│ │ │ └── operator_loc: (2,8)-(2,10) = "**"
|
│ │ │ │ └── depth: 0
|
||||||
│ │ ├── rest: ∅
|
│ │ │ └── operator_loc: (2,8)-(2,10) = "**"
|
||||||
│ │ ├── opening_loc: (2,3)-(2,4) = "{"
|
│ │ ├── opening_loc: (2,3)-(2,4) = "{"
|
||||||
│ │ └── closing_loc: (2,14)-(2,15) = "}"
|
│ │ └── closing_loc: (2,14)-(2,15) = "}"
|
||||||
│ ├── statements:
|
│ ├── statements:
|
||||||
|
@ -26,21 +26,21 @@
|
|||||||
│ ├── pattern:
|
│ ├── pattern:
|
||||||
│ │ @ HashPatternNode (location: (2,3)-(2,11))
|
│ │ @ HashPatternNode (location: (2,3)-(2,11))
|
||||||
│ │ ├── constant: ∅
|
│ │ ├── constant: ∅
|
||||||
│ │ ├── elements: (length: 2)
|
│ │ ├── elements: (length: 1)
|
||||||
│ │ │ ├── @ AssocNode (location: (2,4)-(2,6))
|
│ │ │ └── @ AssocNode (location: (2,4)-(2,6))
|
||||||
│ │ │ │ ├── key:
|
│ │ │ ├── key:
|
||||||
│ │ │ │ │ @ SymbolNode (location: (2,4)-(2,6))
|
│ │ │ │ @ SymbolNode (location: (2,4)-(2,6))
|
||||||
│ │ │ │ │ ├── flags: ∅
|
│ │ │ │ ├── flags: ∅
|
||||||
│ │ │ │ │ ├── opening_loc: ∅
|
│ │ │ │ ├── opening_loc: ∅
|
||||||
│ │ │ │ │ ├── value_loc: (2,4)-(2,5) = "a"
|
│ │ │ │ ├── value_loc: (2,4)-(2,5) = "a"
|
||||||
│ │ │ │ │ ├── closing_loc: (2,5)-(2,6) = ":"
|
│ │ │ │ ├── closing_loc: (2,5)-(2,6) = ":"
|
||||||
│ │ │ │ │ └── unescaped: "a"
|
│ │ │ │ └── unescaped: "a"
|
||||||
│ │ │ │ ├── value: ∅
|
|
||||||
│ │ │ │ └── operator_loc: ∅
|
|
||||||
│ │ │ └── @ AssocSplatNode (location: (2,8)-(2,10))
|
|
||||||
│ │ │ ├── value: ∅
|
│ │ │ ├── value: ∅
|
||||||
│ │ │ └── operator_loc: (2,8)-(2,10) = "**"
|
│ │ │ └── operator_loc: ∅
|
||||||
│ │ ├── rest: ∅
|
│ │ ├── rest:
|
||||||
|
│ │ │ @ AssocSplatNode (location: (2,8)-(2,10))
|
||||||
|
│ │ │ ├── value: ∅
|
||||||
|
│ │ │ └── operator_loc: (2,8)-(2,10) = "**"
|
||||||
│ │ ├── opening_loc: (2,3)-(2,4) = "{"
|
│ │ ├── opening_loc: (2,3)-(2,4) = "{"
|
||||||
│ │ └── closing_loc: (2,10)-(2,11) = "}"
|
│ │ └── closing_loc: (2,10)-(2,11) = "}"
|
||||||
│ ├── statements:
|
│ ├── statements:
|
||||||
|
@ -26,23 +26,23 @@
|
|||||||
│ ├── pattern:
|
│ ├── pattern:
|
||||||
│ │ @ HashPatternNode (location: (2,3)-(2,16))
|
│ │ @ HashPatternNode (location: (2,3)-(2,16))
|
||||||
│ │ ├── constant: ∅
|
│ │ ├── constant: ∅
|
||||||
│ │ ├── elements: (length: 2)
|
│ │ ├── elements: (length: 1)
|
||||||
│ │ │ ├── @ AssocNode (location: (2,4)-(2,8))
|
│ │ │ └── @ AssocNode (location: (2,4)-(2,8))
|
||||||
│ │ │ │ ├── key:
|
│ │ │ ├── key:
|
||||||
│ │ │ │ │ @ SymbolNode (location: (2,4)-(2,6))
|
│ │ │ │ @ SymbolNode (location: (2,4)-(2,6))
|
||||||
│ │ │ │ │ ├── flags: ∅
|
│ │ │ │ ├── flags: ∅
|
||||||
│ │ │ │ │ ├── opening_loc: ∅
|
│ │ │ │ ├── opening_loc: ∅
|
||||||
│ │ │ │ │ ├── value_loc: (2,4)-(2,5) = "a"
|
│ │ │ │ ├── value_loc: (2,4)-(2,5) = "a"
|
||||||
│ │ │ │ │ ├── closing_loc: (2,5)-(2,6) = ":"
|
│ │ │ │ ├── closing_loc: (2,5)-(2,6) = ":"
|
||||||
│ │ │ │ │ └── unescaped: "a"
|
│ │ │ │ └── unescaped: "a"
|
||||||
│ │ │ │ ├── value:
|
│ │ │ ├── value:
|
||||||
│ │ │ │ │ @ IntegerNode (location: (2,7)-(2,8))
|
│ │ │ │ @ IntegerNode (location: (2,7)-(2,8))
|
||||||
│ │ │ │ │ └── flags: decimal
|
│ │ │ │ └── flags: decimal
|
||||||
│ │ │ │ └── operator_loc: ∅
|
│ │ │ └── operator_loc: ∅
|
||||||
│ │ │ └── @ NoKeywordsParameterNode (location: (2,10)-(2,15))
|
│ │ ├── rest:
|
||||||
│ │ │ ├── operator_loc: (2,10)-(2,12) = "**"
|
│ │ │ @ NoKeywordsParameterNode (location: (2,10)-(2,15))
|
||||||
│ │ │ └── keyword_loc: (2,12)-(2,15) = "nil"
|
│ │ │ ├── operator_loc: (2,10)-(2,12) = "**"
|
||||||
│ │ ├── rest: ∅
|
│ │ │ └── keyword_loc: (2,12)-(2,15) = "nil"
|
||||||
│ │ ├── opening_loc: (2,3)-(2,4) = "{"
|
│ │ ├── opening_loc: (2,3)-(2,4) = "{"
|
||||||
│ │ └── closing_loc: (2,15)-(2,16) = "}"
|
│ │ └── closing_loc: (2,15)-(2,16) = "}"
|
||||||
│ ├── statements:
|
│ ├── statements:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user