Extract Parser#range_lookup out of Expression.parse

This commit is contained in:
Charles-P. Clermont
2026-01-26 16:52:17 -05:00
parent 8b04c52ab2
commit dff829ec72
4 changed files with 25 additions and 3 deletions
+12 -1
View File
@@ -58,8 +58,10 @@ module Liquid
string
when :number
number
when :open_round
range_lookup
else
parse_expression(expression_string)
raise SyntaxError, "#{token} is not a valid expression"
end
end
@@ -88,6 +90,15 @@ module Liquid
VariableLookup.new(name, lookups, command_flags)
end
def range_lookup
consume(:open_round)
first = expression
consume(:dotdot)
last = expression
consume(:close_round)
RangeLookup.create(first, last)
end
def expression_string
token = @tokens[@p]
case token[0]
+3 -1
View File
@@ -2,13 +2,15 @@
module Liquid
class RangeLookup
def self.create(start_obj, end_obj, start_markup, end_markup)
def self.create(start_obj, end_obj, start_markup = nil, end_markup = nil)
if start_obj.respond_to?(:evaluate) || end_obj.respond_to?(:evaluate)
new(start_obj, end_obj)
else
begin
start_obj.to_i..end_obj.to_i
rescue NoMethodError
start_markup = start_obj.to_s unless start_markup
end_markup = end_obj.to_s unless end_markup
invalid_expr = start_markup unless start_obj.respond_to?(:to_i)
invalid_expr ||= end_markup unless end_obj.respond_to?(:to_i)
if invalid_expr
+1 -1
View File
@@ -46,7 +46,7 @@ class ExpressionTest < Minitest::Test
"{{ (false..true) }}",
)
assert_match_syntax_error(
"Liquid syntax error (line 1): Invalid expression type '(1..2)' in range expression",
"Liquid syntax error (line 1): Invalid expression type '1..2' in range expression",
"{{ ((1..2)..3) }}",
)
end
+9
View File
@@ -102,6 +102,15 @@ class ParserUnitTest < Minitest::Test
assert_equal('title', v.lookups[0])
end
def test_range_lookup
p = new_parser('(0..5) (a..b)')
assert_equal((0..5), p.expression)
r2 = p.expression
assert(r2.is_a?(RangeLookup))
assert_equal((1..4), r2.evaluate(Context.new({ 'a' => 1, 'b' => 4 })))
end
def test_ranges
p = new_parser("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
assert_equal('(5..7)', p.expression_string)