-
-
Notifications
You must be signed in to change notification settings - Fork 99
Description
👋 Hey there! In writing the prism translator, I've come across a couple of things that look like they might be bugs in ruby_parser. I wanted to flag them in case you wanted to fix them. I don't imagine they're common at all. They're listed below.
These raise errors:
alias %s[abc] %s[xyz]
foo class Bar baz do end end
foo module Bar baz do end end
def f x:-a; end
def f x:+a; end
def foo x:%(xx); end
while class Foo; tap do end; end; break; end
while class Foo a = tap do end; end; break; end
while class << self; tap do end; end; break; end
while class << self; a = tap do end; end; break; end
class if true; Object end::Kernel; end
class while true; break Object end::Kernel; end
not()These should be flip-flops:
not foo .. bar
not (foo .. bar)
!(foo .. bar)This should be a match node:
!/wat/These should be arrays not array patterns:
1 in %w[]
1 in %i[]
1 in %W[]
1 in %I[]These should introduce local variables:
/(?<match>bar)/ =~ 'bar'; match
[1, 2] => a, b; a
[1, 2] in a, b; a
{a: 1} => a:; a
{a: 1} in a:; a
{key: :value} => key: value; value
{key: :value} in key: value; value
1 => [a]; a
1 in [a]; aThis one I'm a little unsure of, but I think that the following should be s(:and, s(:and, s(:true), s(:call, s(:false), :!)), s(:true)) and not s(:and, s(:true), s(:and, s(:call, s(:false), :!), s(:true))):
true and
not false and
trueThis one is dropping a value from the rescued expression:
foo, bar = 1, 2 rescue nilThis heredoc is counting an escaped newline as if it were a real newline:
p <<~"E"
x\n y
EThis heredoc should have not dedent:
<<~EOF
a
#{1}
a
EOFThis heredoc should only dedent by 2:
p <<~"E"
x
#{" y"}
EThis should be a constant declaration, not a call:
foo::A += m fooThese should have UTF-8 as the encoding of the string, not ASCII-8BIT:
s = <<eos
a\xE9b
eos
s = <<-EOS
a\247b
cöd
EOSThis heredoc should be beforeafter\r\n not before\nafter\n (there's a \r\n after the ):
str = <<-XXX
before\
after
XXXThese are all horrible heredoc behavior that I'm sorry to even bring up:
<<A+%
A
<<A+%r
A
<<A+%q
A
<<A+%Q
A
<<A+%s
A
<<A+%x
A
pp <<-A.gsub(/b\
a
A
b/, "")
pp <<-A, "d\
c
A
d"
pp <<-A, %q[f\
e
A
f]
pp <<-A, %Q[h\
g
A
h]
pp <<-A, %w[j\
i
A
j]
pp <<-A, %W[l\
k
A
l]
pp <<-A, %i[n\
m
A
n]
pp <<-A, %I[p\
o
A
p]
<<A; /\
A
(?<a>)/ =~ ''
<<A; :'a
A
b'
<<A; :"a
A
b"
This has a line number that is very odd (the xstring is saying it's starting on line 2, maybe the \\ isn't incrementing a line count?):
:"a\\
b"
` x
#{foo}
#`And then just to mention, I basically turned off support for numbered parameters, e.g., marking the following as a call instead of a local variable read:
-> { _1 }