Skip to content

Commit 39f5855

Browse files
committed
Extract Parser#range_lookup out of Expression.parse
1 parent 9f9e8f0 commit 39f5855

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
@@ -58,8 +58,10 @@ def expression
5858
string
5959
when :number
6060
number
61+
when :open_round
62+
range_lookup
6163
else
62-
parse_expression(expression_string)
64+
raise SyntaxError, "#{token} is not a valid expression"
6365
end
6466
end
6567

@@ -88,6 +90,15 @@ def unnamed_variable_lookup
8890
VariableLookup.new(name, lookups, command_flags)
8991
end
9092

93+
def range_lookup
94+
consume(:open_round)
95+
first = expression
96+
consume(:dotdot)
97+
last = expression
98+
consume(:close_round)
99+
RangeLookup.create(first, last)
100+
end
101+
91102
def expression_string
92103
token = @tokens[@p]
93104
case token[0]

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)