Skip to content

Commit

Permalink
Make equality operators non-associative
Browse files Browse the repository at this point in the history
Fix #2073
  • Loading branch information
makenowjust committed Dec 14, 2023
1 parent f4b5737 commit 0f747d9
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/prism.c
Original file line number Diff line number Diff line change
Expand Up @@ -10287,12 +10287,12 @@ pm_binding_powers_t pm_binding_powers[PM_TOKEN_MAXIMUM] = {
[PM_TOKEN_AMPERSAND_AMPERSAND] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_LOGICAL_AND),

// != !~ == === =~ <=>
[PM_TOKEN_BANG_EQUAL] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_BANG_TILDE] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_EQUAL_EQUAL] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_EQUAL_EQUAL_EQUAL] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_EQUAL_TILDE] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_LESS_EQUAL_GREATER] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_BANG_EQUAL] = NON_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_BANG_TILDE] = NON_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_EQUAL_EQUAL] = NON_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_EQUAL_EQUAL_EQUAL] = NON_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_EQUAL_TILDE] = NON_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),
[PM_TOKEN_LESS_EQUAL_GREATER] = NON_ASSOCIATIVE(PM_BINDING_POWER_EQUALITY),

// > >= < <=
[PM_TOKEN_GREATER] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_COMPARISON),
Expand Down
27 changes: 27 additions & 0 deletions test/prism/errors_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2004,6 +2004,33 @@ def test_constant_assignment_in_method
]
end

def test_non_assoc_equality
source = <<~RUBY
1 == 2 == 3
1 != 2 != 3
1 === 2 === 3
1 =~ 2 =~ 3
1 !~ 2 !~ 3
1 <=> 2 <=> 3
RUBY
message1 = 'expected a newline or semicolon after the statement'
message2 = 'cannot parse the expression'
assert_errors expression(source), source, [
[message1, 6..6],
[message2, 6..6],
[message1, 18..18],
[message2, 18..18],
[message1, 31..31],
[message2, 31..31],
[message1, 44..44],
[message2, 44..44],
[message1, 56..56],
[message2, 56..56],
[message1, 69..69],
[message2, 69..69],
]
end

private

def assert_errors(expected, source, errors, compare_ripper: RUBY_ENGINE == "ruby")
Expand Down

0 comments on commit 0f747d9

Please sign in to comment.