Skip to content

Commit

Permalink
[ruby/prism] Update ordering of integer base flags
Browse files Browse the repository at this point in the history
  • Loading branch information
kddnewton authored and matzbot committed Dec 7, 2023
1 parent 0dc40bd commit c05278e
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
4 changes: 2 additions & 2 deletions prism/config.yml
Expand Up @@ -357,10 +357,10 @@ flags:
values:
- name: BINARY
comment: "0b prefix"
- name: OCTAL
comment: "0o or 0 prefix"
- name: DECIMAL
comment: "0d or no prefix"
- name: OCTAL
comment: "0o or 0 prefix"
- name: HEXADECIMAL
comment: "0x prefix"
comment: Flags for integer nodes that correspond to the base of the integer.
Expand Down
23 changes: 23 additions & 0 deletions test/prism/ruby_api_test.rb
Expand Up @@ -124,6 +124,29 @@ def test_heredoc?
assert parse_expression("<<~`HERE`\nfoo \#{1}\nHERE\n").heredoc?
end

# Through some bit hackery, we want to allow consumers to use the integer
# base flags as the base itself. It has a nice property that the current
# alignment provides them in the correct order. So here we test that our
# assumption holds so that it doesn't change out from under us.
#
# In C, this would look something like:
#
# ((flags & ~DECIMAL) << 1) || 10
#
# We have to do some other work in Ruby because 0 is truthy and ~ on an
# integer doesn't have a fixed width.
def test_integer_base_flags
base = -> (node) do
value = (node.send(:flags) & (0b1111 - IntegerBaseFlags::DECIMAL)) << 1
value == 0 ? 10 : value
end

assert_equal 2, base[parse_expression("0b1")]
assert_equal 8, base[parse_expression("0o1")]
assert_equal 10, base[parse_expression("0d1")]
assert_equal 16, base[parse_expression("0x1")]
end

private

def parse_expression(source)
Expand Down

0 comments on commit c05278e

Please sign in to comment.