mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-19 19:00:39 -07:00
Move safe_parse_expression into Parser.expression_node
- Make `Parser` accept the expression cache - Remove `safe_parse_expression` from `ParseContext` - Replace all usage of `safe_parse_expression` with `parser.expression_node`
This commit is contained in:
@@ -37,7 +37,7 @@ module Liquid
|
||||
|
||||
def new_parser(input)
|
||||
@string_scanner.string = input
|
||||
Parser.new(@string_scanner)
|
||||
Parser.new(@string_scanner, @expression_cache)
|
||||
end
|
||||
|
||||
def new_tokenizer(source, start_line_number: nil, for_liquid_tag: false)
|
||||
@@ -49,10 +49,6 @@ module Liquid
|
||||
)
|
||||
end
|
||||
|
||||
def safe_parse_expression(parser)
|
||||
Expression.safe_parse(parser, @string_scanner, @expression_cache)
|
||||
end
|
||||
|
||||
def parse_expression(markup, safe: false)
|
||||
# markup MUST come from a string returned by the parser
|
||||
# (e.g., parser.expression). We're not calling the parser here to
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
|
||||
module Liquid
|
||||
class Parser
|
||||
def initialize(input)
|
||||
ss = input.is_a?(StringScanner) ? input : StringScanner.new(input)
|
||||
@tokens = Lexer.tokenize(ss)
|
||||
def initialize(input, expression_cache = nil)
|
||||
@ss = input.is_a?(StringScanner) ? input : StringScanner.new(input)
|
||||
@cache = expression_cache
|
||||
@tokens = Lexer.tokenize(@ss)
|
||||
@p = 0 # pointer to current location
|
||||
end
|
||||
|
||||
@@ -71,6 +72,11 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
def expression_node
|
||||
expr = expression
|
||||
Expression.parse(expr, @ss, @cache)
|
||||
end
|
||||
|
||||
def argument
|
||||
str = +""
|
||||
# might be a keyword argument (identifier: expression)
|
||||
|
||||
@@ -68,10 +68,6 @@ module Liquid
|
||||
|
||||
private
|
||||
|
||||
def safe_parse_expression(parser)
|
||||
parse_context.safe_parse_expression(parser)
|
||||
end
|
||||
|
||||
def parse_expression(markup, safe: false)
|
||||
parse_context.parse_expression(markup, safe: safe)
|
||||
end
|
||||
|
||||
@@ -85,7 +85,7 @@ module Liquid
|
||||
|
||||
def parse_markup(markup)
|
||||
parser = @parse_context.new_parser(markup)
|
||||
@left = safe_parse_expression(parser)
|
||||
@left = parser.expression_node
|
||||
parser.consume(:end_of_string)
|
||||
end
|
||||
|
||||
@@ -99,7 +99,7 @@ module Liquid
|
||||
parser = @parse_context.new_parser(markup)
|
||||
|
||||
loop do
|
||||
expr = Condition.parse_expression(parse_context, parser.expression, safe: true)
|
||||
expr = parser.expression_node
|
||||
block = Condition.new(@left, '==', expr)
|
||||
block.attach(body)
|
||||
@blocks << block
|
||||
|
||||
@@ -61,14 +61,14 @@ module Liquid
|
||||
|
||||
raise SyntaxError, options[:locale].t("errors.syntax.cycle") if p.look(:end_of_string)
|
||||
|
||||
first_expression = safe_parse_expression(p)
|
||||
first_expression = p.expression_node
|
||||
if p.look(:colon)
|
||||
# cycle name: expr1, expr2, ...
|
||||
@name = first_expression
|
||||
@is_named = true
|
||||
p.consume(:colon)
|
||||
# After the colon, parse the first variable (required for named cycles)
|
||||
@variables << maybe_dup_lookup(safe_parse_expression(p))
|
||||
@variables << maybe_dup_lookup(p.expression_node)
|
||||
else
|
||||
# cycle expr1, expr2, ...
|
||||
@variables << maybe_dup_lookup(first_expression)
|
||||
@@ -78,7 +78,7 @@ module Liquid
|
||||
while p.consume?(:comma)
|
||||
break if p.look(:end_of_string)
|
||||
|
||||
@variables << maybe_dup_lookup(safe_parse_expression(p))
|
||||
@variables << maybe_dup_lookup(p.expression_node)
|
||||
end
|
||||
|
||||
p.consume(:end_of_string)
|
||||
|
||||
@@ -84,8 +84,8 @@ module Liquid
|
||||
def parse_markup(markup)
|
||||
p = @parse_context.new_parser(markup)
|
||||
|
||||
@template_name_expr = safe_parse_expression(p)
|
||||
@variable_name_expr = safe_parse_expression(p) if p.id?("for") || p.id?("with")
|
||||
@template_name_expr = p.expression_node
|
||||
@variable_name_expr = p.expression_node if p.id?("for") || p.id?("with")
|
||||
@alias_name = p.consume(:id) if p.id?("as")
|
||||
|
||||
p.consume?(:comma)
|
||||
@@ -94,7 +94,7 @@ module Liquid
|
||||
while p.look(:id)
|
||||
key = p.consume
|
||||
p.consume(:colon)
|
||||
@attributes[key] = safe_parse_expression(p)
|
||||
@attributes[key] = p.expression_node
|
||||
p.consume?(:comma)
|
||||
end
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ module Liquid
|
||||
|
||||
@template_name_expr = parse_expression(template_name(p), safe: true)
|
||||
with_or_for = p.id?("for") || p.id?("with")
|
||||
@variable_name_expr = safe_parse_expression(p) if with_or_for
|
||||
@variable_name_expr = p.expression_node if with_or_for
|
||||
@alias_name = p.consume(:id) if p.id?("as")
|
||||
@is_for_loop = (with_or_for == FOR)
|
||||
|
||||
@@ -99,7 +99,7 @@ module Liquid
|
||||
while p.look(:id)
|
||||
key = p.consume
|
||||
p.consume(:colon)
|
||||
@attributes[key] = safe_parse_expression(p)
|
||||
@attributes[key] = p.expression_node
|
||||
p.consume?(:comma)
|
||||
end
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ module Liquid
|
||||
raise SyntaxError, options[:locale].t("errors.syntax.for_invalid_in")
|
||||
end
|
||||
|
||||
@collection_name = safe_parse_expression(p)
|
||||
@collection_name = p.expression_node
|
||||
|
||||
p.consume?(:comma)
|
||||
|
||||
@@ -54,7 +54,7 @@ module Liquid
|
||||
end
|
||||
|
||||
p.consume(:colon)
|
||||
@attributes[key] = safe_parse_expression(p)
|
||||
@attributes[key] = p.expression_node
|
||||
p.consume?(:comma)
|
||||
end
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ module Liquid
|
||||
|
||||
return if p.look(:end_of_string)
|
||||
|
||||
@name = parse_context.safe_parse_expression(p)
|
||||
@name = p.expression_node
|
||||
@filters << parse_filter_expressions(p) while p.consume?(:pipe)
|
||||
p.consume(:end_of_string)
|
||||
end
|
||||
@@ -121,10 +121,10 @@ module Liquid
|
||||
if p.look(:id) && p.look(:colon, 1)
|
||||
key = p.consume(:id)
|
||||
p.consume(:colon)
|
||||
value = parse_context.safe_parse_expression(p)
|
||||
value = p.expression_node
|
||||
keyword_arguments[key] = value
|
||||
else
|
||||
positional_arguments << parse_context.safe_parse_expression(p)
|
||||
positional_arguments << p.expression_node
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user