From 3658798dbb60fe55beaebc157ba43c8fe617c4a0 Mon Sep 17 00:00:00 2001 From: TSUYUSATO Kitsune Date: Fri, 15 Dec 2023 01:30:22 +0900 Subject: [ruby/prism] Make equality operators non-associative Fix https://github.com/ruby/prism/pull/2073 https://github.com/ruby/prism/commit/0f747d9240 --- prism/prism.c | 12 ++++++------ test/prism/errors_test.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index dfb1affa88..14bd5542fc 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -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), diff --git a/test/prism/errors_test.rb b/test/prism/errors_test.rb index e11a7bdc82..51ac7bc5cf 100644 --- a/test/prism/errors_test.rb +++ b/test/prism/errors_test.rb @@ -2004,6 +2004,33 @@ module Prism ] 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") -- cgit v1.2.3