[ruby/prism] Fix parser translator scope issues for implicit hash values

`builder.pair_label` is no good since it makes use of variables that the parser gem encountered.
Since the prism translator doesn't keep proper track of that information, the following code interprets
the implicit value as a local variable, even though it is not in scope:

```rb
def foo
  bar = 123
end

{ bar: }
```

https://github.com/ruby/prism/commit/bbeb5b083a
This commit is contained in:
Earlopain 2025-01-19 12:09:51 +01:00 committed by git
parent c6c1e7a92a
commit 769cccba56

View File

@ -128,14 +128,17 @@ module Prism
builder.pair_quoted(token(key.opening_loc), [builder.string_internal([key.unescaped, srange(key.value_loc)])], token(key.closing_loc), visit(node.value)) builder.pair_quoted(token(key.opening_loc), [builder.string_internal([key.unescaped, srange(key.value_loc)])], token(key.closing_loc), visit(node.value))
end end
elsif node.value.is_a?(ImplicitNode) elsif node.value.is_a?(ImplicitNode)
if (value = node.value.value).is_a?(LocalVariableReadNode) value = node.value.value
builder.pair_keyword(
[key.unescaped, srange(key)], implicit_value = if value.is_a?(CallNode)
builder.ident([value.name, srange(key.value_loc)]).updated(:lvar) builder.call_method(nil, nil, [value.name, srange(value.message_loc)])
) elsif value.is_a?(ConstantReadNode)
builder.const([value.name, srange(key.value_loc)])
else else
builder.pair_label([key.unescaped, srange(key.location)]) builder.ident([value.name, srange(key.value_loc)]).updated(:lvar)
end end
builder.pair_keyword([key.unescaped, srange(key)], implicit_value)
elsif node.operator_loc elsif node.operator_loc
builder.pair(visit(key), token(node.operator_loc), visit(node.value)) builder.pair(visit(key), token(node.operator_loc), visit(node.value))
elsif key.is_a?(SymbolNode) && key.opening_loc.nil? elsif key.is_a?(SymbolNode) && key.opening_loc.nil?