[ruby/prism] Change binding power for modifiers in case-in nodes

https://github.com/ruby/prism/commit/c31eeba54c
This commit is contained in:
Max Prokopiev 2024-01-26 18:27:08 +01:00 коммит произвёл git
Родитель 1949a04f81
Коммит 8e5bc8f7c2
3 изменённых файлов: 98 добавлений и 24 удалений

Просмотреть файл

@ -14856,11 +14856,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
// for guard clauses in the form of `if` or `unless` statements.
if (accept1(parser, PM_TOKEN_KEYWORD_IF_MODIFIER)) {
pm_token_t keyword = parser->previous;
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, true, PM_ERR_CONDITIONAL_IF_PREDICATE);
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_IF_PREDICATE);
pattern = (pm_node_t *) pm_if_node_modifier_create(parser, pattern, &keyword, predicate);
} else if (accept1(parser, PM_TOKEN_KEYWORD_UNLESS_MODIFIER)) {
pm_token_t keyword = parser->previous;
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE);
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE);
pattern = (pm_node_t *) pm_unless_node_modifier_create(parser, pattern, &keyword, predicate);
}

Просмотреть файл

@ -43,6 +43,11 @@ end
case 1 in 2; in 3; end
case a
in b if c and d
e
end
1.then do
case 1
in ^_1

Просмотреть файл

@ -1,8 +1,8 @@
@ ProgramNode (location: (1,0)-(50,3))
├── locals: []
@ ProgramNode (location: (1,0)-(55,3))
├── locals: [:b]
└── statements:
@ StatementsNode (location: (1,0)-(50,3))
└── body: (length: 14)
@ StatementsNode (location: (1,0)-(55,3))
└── body: (length: 15)
├── @ CaseNode (location: (1,0)-(3,3))
│ ├── predicate:
│ │ @ SymbolNode (location: (1,5)-(1,8))
@ -356,45 +356,114 @@
│ ├── consequent: ∅
│ ├── case_keyword_loc: (44,0)-(44,4) = "case"
│ └── end_keyword_loc: (44,19)-(44,22) = "end"
└── @ CallNode (location: (46,0)-(50,3))
├── @ CaseMatchNode (location: (46,0)-(49,3))
│ ├── predicate:
│ │ @ CallNode (location: (46,5)-(46,6))
│ │ ├── flags: variable_call, ignore_visibility
│ │ ├── receiver: ∅
│ │ ├── call_operator_loc: ∅
│ │ ├── name: :a
│ │ ├── message_loc: (46,5)-(46,6) = "a"
│ │ ├── opening_loc: ∅
│ │ ├── arguments: ∅
│ │ ├── closing_loc: ∅
│ │ └── block: ∅
│ ├── conditions: (length: 1)
│ │ └── @ InNode (location: (47,0)-(48,3))
│ │ ├── pattern:
│ │ │ @ IfNode (location: (47,3)-(47,15))
│ │ │ ├── if_keyword_loc: (47,5)-(47,7) = "if"
│ │ │ ├── predicate:
│ │ │ │ @ AndNode (location: (47,8)-(47,15))
│ │ │ │ ├── left:
│ │ │ │ │ @ CallNode (location: (47,8)-(47,9))
│ │ │ │ │ ├── flags: variable_call, ignore_visibility
│ │ │ │ │ ├── receiver: ∅
│ │ │ │ │ ├── call_operator_loc: ∅
│ │ │ │ │ ├── name: :c
│ │ │ │ │ ├── message_loc: (47,8)-(47,9) = "c"
│ │ │ │ │ ├── opening_loc: ∅
│ │ │ │ │ ├── arguments: ∅
│ │ │ │ │ ├── closing_loc: ∅
│ │ │ │ │ └── block: ∅
│ │ │ │ ├── right:
│ │ │ │ │ @ CallNode (location: (47,14)-(47,15))
│ │ │ │ │ ├── flags: variable_call, ignore_visibility
│ │ │ │ │ ├── receiver: ∅
│ │ │ │ │ ├── call_operator_loc: ∅
│ │ │ │ │ ├── name: :d
│ │ │ │ │ ├── message_loc: (47,14)-(47,15) = "d"
│ │ │ │ │ ├── opening_loc: ∅
│ │ │ │ │ ├── arguments: ∅
│ │ │ │ │ ├── closing_loc: ∅
│ │ │ │ │ └── block: ∅
│ │ │ │ └── operator_loc: (47,10)-(47,13) = "and"
│ │ │ ├── then_keyword_loc: ∅
│ │ │ ├── statements:
│ │ │ │ @ StatementsNode (location: (47,3)-(47,4))
│ │ │ │ └── body: (length: 1)
│ │ │ │ └── @ LocalVariableTargetNode (location: (47,3)-(47,4))
│ │ │ │ ├── name: :b
│ │ │ │ └── depth: 0
│ │ │ ├── consequent: ∅
│ │ │ └── end_keyword_loc: ∅
│ │ ├── statements:
│ │ │ @ StatementsNode (location: (48,2)-(48,3))
│ │ │ └── body: (length: 1)
│ │ │ └── @ CallNode (location: (48,2)-(48,3))
│ │ │ ├── flags: variable_call, ignore_visibility
│ │ │ ├── receiver: ∅
│ │ │ ├── call_operator_loc: ∅
│ │ │ ├── name: :e
│ │ │ ├── message_loc: (48,2)-(48,3) = "e"
│ │ │ ├── opening_loc: ∅
│ │ │ ├── arguments: ∅
│ │ │ ├── closing_loc: ∅
│ │ │ └── block: ∅
│ │ ├── in_loc: (47,0)-(47,2) = "in"
│ │ └── then_loc: ∅
│ ├── consequent: ∅
│ ├── case_keyword_loc: (46,0)-(46,4) = "case"
│ └── end_keyword_loc: (49,0)-(49,3) = "end"
└── @ CallNode (location: (51,0)-(55,3))
├── flags: ∅
├── receiver:
│ @ IntegerNode (location: (46,0)-(46,1))
│ @ IntegerNode (location: (51,0)-(51,1))
│ └── flags: decimal
├── call_operator_loc: (46,1)-(46,2) = "."
├── call_operator_loc: (51,1)-(51,2) = "."
├── name: :then
├── message_loc: (46,2)-(46,6) = "then"
├── message_loc: (51,2)-(51,6) = "then"
├── opening_loc: ∅
├── arguments: ∅
├── closing_loc: ∅
└── block:
@ BlockNode (location: (46,7)-(50,3))
@ BlockNode (location: (51,7)-(55,3))
├── locals: [:_1]
├── locals_body_index: 1
├── parameters:
│ @ NumberedParametersNode (location: (46,7)-(50,3))
│ @ NumberedParametersNode (location: (51,7)-(55,3))
│ └── maximum: 1
├── body:
│ @ StatementsNode (location: (47,2)-(49,5))
│ @ StatementsNode (location: (52,2)-(54,5))
│ └── body: (length: 1)
│ └── @ CaseMatchNode (location: (47,2)-(49,5))
│ └── @ CaseMatchNode (location: (52,2)-(54,5))
│ ├── predicate:
│ │ @ IntegerNode (location: (47,7)-(47,8))
│ │ @ IntegerNode (location: (52,7)-(52,8))
│ │ └── flags: decimal
│ ├── conditions: (length: 1)
│ │ └── @ InNode (location: (48,2)-(48,8))
│ │ └── @ InNode (location: (53,2)-(53,8))
│ │ ├── pattern:
│ │ │ @ PinnedVariableNode (location: (48,5)-(48,8))
│ │ │ @ PinnedVariableNode (location: (53,5)-(53,8))
│ │ │ ├── variable:
│ │ │ │ @ LocalVariableReadNode (location: (48,6)-(48,8))
│ │ │ │ @ LocalVariableReadNode (location: (53,6)-(53,8))
│ │ │ │ ├── name: :_1
│ │ │ │ └── depth: 0
│ │ │ └── operator_loc: (48,5)-(48,6) = "^"
│ │ │ └── operator_loc: (53,5)-(53,6) = "^"
│ │ ├── statements: ∅
│ │ ├── in_loc: (48,2)-(48,4) = "in"
│ │ ├── in_loc: (53,2)-(53,4) = "in"
│ │ └── then_loc: ∅
│ ├── consequent: ∅
│ ├── case_keyword_loc: (47,2)-(47,6) = "case"
│ └── end_keyword_loc: (49,2)-(49,5) = "end"
├── opening_loc: (46,7)-(46,9) = "do"
└── closing_loc: (50,0)-(50,3) = "end"
│ ├── case_keyword_loc: (52,2)-(52,6) = "case"
│ └── end_keyword_loc: (54,2)-(54,5) = "end"
├── opening_loc: (51,7)-(51,9) = "do"
└── closing_loc: (55,0)-(55,3) = "end"