plugin-ruby: comparison operators being incorrectly formatted

Metadata

Input

class SomeClass
  def obfuscate_number(number)
    number = number.to_s
    return number if number.length <= 4
    '...' + number[-4, number.length]
  end
end

Output

class SomeClass
  def obfuscate_number(number)
    number = number.to_s
    return number if number.length > 4
    '...' + number[-4, number.length]
  end
end

it appears that comparison operators are being formatted incorrectly

before

  • return '12345' if number.length <= 4 # '...2345'
  • return '1234' if number.length <= 4 # '1234'

after

  • return '12345' if number.length > 4 # '12345'
  • return '123' if number.length > 4 which leads to '...' + number[-4, number.length] # TypeError (no implicit conversion of nil into String)

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 15 (8 by maintainers)

Most upvoted comments

Ahh I see the difference. The issue is comparison operators are coming back as @op nodes when they should be just symbols to match cruby.

# jruby
[:program,
 [[:binary, [:@int, "1", [1, 0]], [:@op, "<", [1, 2]], [:@int, "2", [1, 4]]]]]

# cruby
[:program, [[:binary, [:@int, "1", [1, 0]], :<, [:@int, "2", [1, 4]]]]]

I’ll fix it so it handles either.

@Jukejc I opened this issue on jruby as a result: https://github.com/jruby/jruby/issues/6413

Oh interesting! I hadn’t considered other Ruby runtimes, that makes total sense. They’ve probably got some slick deoptimization thing doing on.