mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-20 03:10:39 -07:00
Merge pull request #1317 from Shopify/strict-parse-dynamic-find-var
Fix strict parsing of find variable with a name expression
This commit is contained in:
+24
-17
@@ -46,16 +46,20 @@ module Liquid
|
|||||||
tok[0] == type
|
tok[0] == type
|
||||||
end
|
end
|
||||||
|
|
||||||
SINGLE_TOKEN_EXPRESSION_TYPES = [:string, :number].freeze
|
|
||||||
private_constant :SINGLE_TOKEN_EXPRESSION_TYPES
|
|
||||||
|
|
||||||
def expression
|
def expression
|
||||||
token = @tokens[@p]
|
token = @tokens[@p]
|
||||||
if token[0] == :id
|
case token[0]
|
||||||
variable_signature
|
when :id
|
||||||
elsif SINGLE_TOKEN_EXPRESSION_TYPES.include?(token[0])
|
str = consume
|
||||||
|
str << variable_lookups
|
||||||
|
when :open_square
|
||||||
|
str = consume
|
||||||
|
str << expression
|
||||||
|
str << consume(:close_square)
|
||||||
|
str << variable_lookups
|
||||||
|
when :string, :number
|
||||||
consume
|
consume
|
||||||
elsif token.first == :open_round
|
when :open_round
|
||||||
consume
|
consume
|
||||||
first = expression
|
first = expression
|
||||||
consume(:dotdot)
|
consume(:dotdot)
|
||||||
@@ -78,16 +82,19 @@ module Liquid
|
|||||||
str
|
str
|
||||||
end
|
end
|
||||||
|
|
||||||
def variable_signature
|
def variable_lookups
|
||||||
str = consume(:id)
|
str = +""
|
||||||
while look(:open_square)
|
loop do
|
||||||
str << consume
|
if look(:open_square)
|
||||||
str << expression
|
str << consume
|
||||||
str << consume(:close_square)
|
str << expression
|
||||||
end
|
str << consume(:close_square)
|
||||||
if look(:dot)
|
elsif look(:dot)
|
||||||
str << consume
|
str << consume
|
||||||
str << variable_signature
|
str << consume(:id)
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
end
|
end
|
||||||
str
|
str
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -95,4 +95,8 @@ class VariableTest < Minitest::Test
|
|||||||
def test_render_symbol
|
def test_render_symbol
|
||||||
assert_template_result('bar', '{{ foo }}', 'foo' => :bar)
|
assert_template_result('bar', '{{ foo }}', 'foo' => :bar)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_dynamic_find_var
|
||||||
|
assert_template_result('bar', '{{ [key] }}', 'key' => 'foo', 'foo' => 'bar')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user