Skip to content

Commit 10ea614

Browse files
authored
Add Liquid::ParseContext#parse_expression for liquid-c node disabling (#1333)
We would like to be able to disable liquid-c VM rendering at runtime, but right now expression parsing is done using Expression.parse, which isn't aware of the parse context. That prevents us from conditionally compiling to VM code based on a parse option.
1 parent 0e52706 commit 10ea614

10 files changed

Lines changed: 29 additions & 19 deletions

File tree

lib/liquid/condition.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ def self.operators
4545
@@operators
4646
end
4747

48-
def self.parse_expression(markup)
49-
@@method_literals[markup] || Expression.parse(markup)
48+
def self.parse_expression(parse_context, markup)
49+
@@method_literals[markup] || parse_context.parse_expression(markup)
5050
end
5151

5252
attr_reader :attachment, :child_condition

lib/liquid/parse_context.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ def new_block_body
2323
Liquid::BlockBody.new
2424
end
2525

26+
def parse_expression(markup)
27+
Expression.parse(markup)
28+
end
29+
2630
def partial=(value)
2731
@partial = value
2832
@options = value ? partial_options : @template_options

lib/liquid/tag.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,11 @@ def render_to_output_buffer(context, output)
5555
def blank?
5656
false
5757
end
58+
59+
private
60+
61+
def parse_expression(markup)
62+
parse_context.parse_expression(markup)
63+
end
5864
end
5965
end

lib/liquid/tags/case.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def initialize(tag_name, markup, options)
1212
@blocks = []
1313

1414
if markup =~ Syntax
15-
@left = Expression.parse(Regexp.last_match(1))
15+
@left = parse_expression(Regexp.last_match(1))
1616
else
1717
raise SyntaxError, options[:locale].t("errors.syntax.case")
1818
end
@@ -68,7 +68,7 @@ def record_when_condition(markup)
6868

6969
markup = Regexp.last_match(2)
7070

71-
block = Condition.new(@left, '==', Condition.parse_expression(Regexp.last_match(1)))
71+
block = Condition.new(@left, '==', Condition.parse_expression(parse_context, Regexp.last_match(1)))
7272
block.attach(body)
7373
@blocks << block
7474
end

lib/liquid/tags/cycle.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def initialize(tag_name, markup, options)
2424
case markup
2525
when NamedSyntax
2626
@variables = variables_from_string(Regexp.last_match(2))
27-
@name = Expression.parse(Regexp.last_match(1))
27+
@name = parse_expression(Regexp.last_match(1))
2828
when SimpleSyntax
2929
@variables = variables_from_string(markup)
3030
@name = @variables.to_s
@@ -61,7 +61,7 @@ def render_to_output_buffer(context, output)
6161
def variables_from_string(markup)
6262
markup.split(',').collect do |var|
6363
var =~ /\s*(#{QuotedFragment})\s*/o
64-
Regexp.last_match(1) ? Expression.parse(Regexp.last_match(1)) : nil
64+
Regexp.last_match(1) ? parse_expression(Regexp.last_match(1)) : nil
6565
end.compact
6666
end
6767

lib/liquid/tags/for.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def lax_parse(markup)
9797
collection_name = Regexp.last_match(2)
9898
@reversed = !!Regexp.last_match(3)
9999
@name = "#{@variable_name}-#{collection_name}"
100-
@collection_name = Expression.parse(collection_name)
100+
@collection_name = parse_expression(collection_name)
101101
markup.scan(TagAttributes) do |key, value|
102102
set_attribute(key, value)
103103
end
@@ -112,7 +112,7 @@ def strict_parse(markup)
112112
raise SyntaxError, options[:locale].t("errors.syntax.for_invalid_in") unless p.id?('in')
113113

114114
collection_name = p.expression
115-
@collection_name = Expression.parse(collection_name)
115+
@collection_name = parse_expression(collection_name)
116116

117117
@name = "#{@variable_name}-#{collection_name}"
118118
@reversed = p.id?('reversed')
@@ -198,10 +198,10 @@ def set_attribute(key, expr)
198198
@from = if expr == 'continue'
199199
:continue
200200
else
201-
Expression.parse(expr)
201+
parse_expression(expr)
202202
end
203203
when 'limit'
204-
@limit = Expression.parse(expr)
204+
@limit = parse_expression(expr)
205205
end
206206
end
207207

lib/liquid/tags/if.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def push_block(tag, markup)
7171
end
7272

7373
def parse_expression(markup)
74-
Condition.parse_expression(markup)
74+
Condition.parse_expression(parse_context, markup)
7575
end
7676

7777
def lax_parse(markup)

lib/liquid/tags/include.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ def initialize(tag_name, markup, options)
3232
variable_name = Regexp.last_match(3)
3333

3434
@alias_name = Regexp.last_match(5)
35-
@variable_name_expr = variable_name ? Expression.parse(variable_name) : nil
36-
@template_name_expr = Expression.parse(template_name)
35+
@variable_name_expr = variable_name ? parse_expression(variable_name) : nil
36+
@template_name_expr = parse_expression(template_name)
3737
@attributes = {}
3838

3939
markup.scan(TagAttributes) do |key, value|
40-
@attributes[key] = Expression.parse(value)
40+
@attributes[key] = parse_expression(value)
4141
end
4242

4343
else

lib/liquid/tags/render.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ def initialize(tag_name, markup, options)
1919
variable_name = Regexp.last_match(4)
2020

2121
@alias_name = Regexp.last_match(6)
22-
@variable_name_expr = variable_name ? Expression.parse(variable_name) : nil
23-
@template_name_expr = Expression.parse(template_name)
22+
@variable_name_expr = variable_name ? parse_expression(variable_name) : nil
23+
@template_name_expr = parse_expression(template_name)
2424
@for = (with_or_for == FOR)
2525

2626
@attributes = {}
2727
markup.scan(TagAttributes) do |key, value|
28-
@attributes[key] = Expression.parse(value)
28+
@attributes[key] = parse_expression(value)
2929
end
3030
end
3131

lib/liquid/tags/table_row.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ def initialize(tag_name, markup, options)
1010
super
1111
if markup =~ Syntax
1212
@variable_name = Regexp.last_match(1)
13-
@collection_name = Expression.parse(Regexp.last_match(2))
13+
@collection_name = parse_expression(Regexp.last_match(2))
1414
@attributes = {}
1515
markup.scan(TagAttributes) do |key, value|
16-
@attributes[key] = Expression.parse(value)
16+
@attributes[key] = parse_expression(value)
1717
end
1818
else
1919
raise SyntaxError, options[:locale].t("errors.syntax.table_row")

0 commit comments

Comments
 (0)