[PRISM] Handle percent literals for defined?

Tests all the possible percent literal with `defined?`. Implements the
missing `PM_X_STRING_NODE` for the `%x` literal.

Code:

```ruby
defined?(%x[1,2,3])
```

```
"********* Ruby *************"
== disasm: #<ISeq:<compiled>@<compiled>:0 (0,0)-(0,19)>
0000 putobject                              "expression"
0002 leave

"********* PRISM *************"
== disasm: #<ISeq:<compiled>@<compiled>:0 (0,0)-(0,19)>
0000 putobject                              "expression"
0002 leave
```
This commit is contained in:
eileencodes 2023-12-04 15:40:43 -05:00 committed by Jemma Issroff
parent 09e8d37f5b
commit 7d371ca25d
2 changed files with 12 additions and 0 deletions

View File

@ -1486,6 +1486,7 @@ pm_compile_defined_expr0(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *co
case PM_REGULAR_EXPRESSION_NODE:
case PM_STRING_NODE:
case PM_SYMBOL_NODE:
case PM_X_STRING_NODE:
dtype = DEFINED_EXPR;
break;
case PM_LOCAL_VARIABLE_READ_NODE:

View File

@ -110,6 +110,17 @@ module Prism
assert_prism_eval("defined? a && b")
assert_prism_eval("defined? a || b")
assert_prism_eval("defined? %[1,2,3]")
assert_prism_eval("defined? %q[1,2,3]")
assert_prism_eval("defined? %Q[1,2,3]")
assert_prism_eval("defined? %r[1,2,3]")
assert_prism_eval("defined? %i[1,2,3]")
assert_prism_eval("defined? %I[1,2,3]")
assert_prism_eval("defined? %w[1,2,3]")
assert_prism_eval("defined? %W[1,2,3]")
assert_prism_eval("defined? %s[1,2,3]")
assert_prism_eval("defined? %x[1,2,3]")
assert_prism_eval("defined? @a")
assert_prism_eval("defined? $a")
assert_prism_eval("defined? @@a")