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:
Dylan Thacker-Smith
2020-10-19 13:43:26 -04:00
committed by GitHub
2 changed files with 28 additions and 17 deletions
+24 -17
View File
@@ -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
+4
View File
@@ -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