aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreileencodes <eileencodes@gmail.com>2023-12-04 15:40:43 -0500
committerJemma Issroff <jemmaissroff@gmail.com>2023-12-04 16:45:18 -0500
commit7d371ca25d8e8f6524894be4413484cc9b04cb72 (patch)
tree4154b755aed9716d5081acd2f7c59335aef08723
parent09e8d37f5b60f1cd1076c354128309cdf74d0df7 (diff)
downloadruby-7d371ca25d8e8f6524894be4413484cc9b04cb72.tar.gz
[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 ```
-rw-r--r--prism_compile.c1
-rw-r--r--test/ruby/test_compile_prism.rb11
2 files changed, 12 insertions, 0 deletions
diff --git a/prism_compile.c b/prism_compile.c
index 7c9f368ef5..6526718d70 100644
--- a/prism_compile.c
+++ b/prism_compile.c
@@ -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:
diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb
index 3ca1dd3431..b4e24c6c67 100644
--- a/test/ruby/test_compile_prism.rb
+++ b/test/ruby/test_compile_prism.rb
@@ -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")