Skip to content

Commit a160865

Browse files
committed
Extract Parser#range_lookup out of Expression.parse
1 parent 34b8340 commit a160865

4 files changed

Lines changed: 25 additions & 3 deletions

File tree

lib/liquid/parser.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,10 @@ def expression
8383
string
8484
when :number
8585
number
86+
when :open_round
87+
range_lookup
8688
else
87-
parse_expression(expression_string)
89+
raise SyntaxError, "#{token} is not a valid expression"
8890
end
8991
end
9092

@@ -141,6 +143,15 @@ def unnamed_variable_lookup
141143
VariableLookup.new(name, lookups, command_flags)
142144
end
143145

146+
def range_lookup
147+
consume(:open_round)
148+
first = expression
149+
consume(:dotdot)
150+
last = expression
151+
consume(:close_round)
152+
RangeLookup.create(first, last)
153+
end
154+
144155
# Assumes safe input. For cases where you need the string.
145156
# Don't use this unless you're sure about what you're doing.
146157
def unsafe_parse_expression(markup)

lib/liquid/range_lookup.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
module Liquid
44
class RangeLookup
5-
def self.create(start_obj, end_obj, start_markup, end_markup)
5+
def self.create(start_obj, end_obj, start_markup = nil, end_markup = nil)
66
if start_obj.respond_to?(:evaluate) || end_obj.respond_to?(:evaluate)
77
new(start_obj, end_obj)
88
else
99
begin
1010
start_obj.to_i..end_obj.to_i
1111
rescue NoMethodError
12+
start_markup = start_obj.to_s unless start_markup
13+
end_markup = end_obj.to_s unless end_markup
1214
invalid_expr = start_markup unless start_obj.respond_to?(:to_i)
1315
invalid_expr ||= end_markup unless end_obj.respond_to?(:to_i)
1416
if invalid_expr

test/integration/expression_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def test_range
4646
"{{ (false..true) }}",
4747
)
4848
assert_match_syntax_error(
49-
"Liquid syntax error (line 1): Invalid expression type '(1..2)' in range expression",
49+
"Liquid syntax error (line 1): Invalid expression type '1..2' in range expression",
5050
"{{ ((1..2)..3) }}",
5151
)
5252
end

test/unit/parser_unit_test.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ def test_unnamed_variable_lookup
102102
assert_equal('title', v.lookups[0])
103103
end
104104

105+
def test_range_lookup
106+
p = new_parser('(0..5) (a..b)')
107+
assert_equal((0..5), p.expression)
108+
109+
r2 = p.expression
110+
assert(r2.is_a?(RangeLookup))
111+
assert_equal((1..4), r2.evaluate(Context.new({ 'a' => 1, 'b' => 4 })))
112+
end
113+
105114
def test_ranges
106115
p = new_parser("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
107116
assert_equal('(5..7)', p.expression_string)

0 commit comments

Comments
 (0)