mirror of
https://github.com/Shopify/liquid.git
synced 2026-10-03 00:55:11 -07:00
Refactor the Optimizer class no visit the AST
Just takes care of Variables for now. Increases performance.
This commit is contained in:
@@ -5,7 +5,7 @@ module Liquid
|
|||||||
def self.parse(tokens, parse_context)
|
def self.parse(tokens, parse_context)
|
||||||
doc = new(parse_context)
|
doc = new(parse_context)
|
||||||
doc.parse(tokens, parse_context)
|
doc.parse(tokens, parse_context)
|
||||||
Optimizer.new.optimize(doc)
|
doc
|
||||||
end
|
end
|
||||||
|
|
||||||
attr_reader :parse_context, :body
|
attr_reader :parse_context, :body
|
||||||
|
|||||||
+9
-45
@@ -2,54 +2,18 @@
|
|||||||
|
|
||||||
module Liquid
|
module Liquid
|
||||||
class Optimizer
|
class Optimizer
|
||||||
def optimize(node)
|
class << self
|
||||||
case node
|
attr_accessor :enabled
|
||||||
when Liquid::Template then optimize(node.root.body)
|
|
||||||
when Liquid::Document then optimize(node.body)
|
|
||||||
when Liquid::BlockBody then optimize_block(node)
|
|
||||||
when Liquid::Variable then optimize_variable(node)
|
|
||||||
when Liquid::Assign then optimize_assign(node)
|
|
||||||
when Liquid::For then optimize_for(node)
|
|
||||||
when Liquid::If then optimize_if(node)
|
|
||||||
end
|
|
||||||
node
|
|
||||||
end
|
|
||||||
|
|
||||||
def optimize_block(block)
|
def optimize_variable(node)
|
||||||
block.nodelist.each { |node| optimize(node) }
|
return unless enabled
|
||||||
end
|
|
||||||
|
|
||||||
def optimize_variable(node)
|
# Turn chained `| append: "..."| append: "..."`, into a single `append_all: [...]`
|
||||||
# Turn chained `| append: "..."| append: "..."`, into a single `append_all: [...]`
|
if node.filters.size > 1 && node.filters.all? { |f, _| f == "append" }
|
||||||
if node.filters.size > 1 && node.filters.all? { |f, _| f == "append" }
|
node.filters = [["append_all", node.filters.map { |f, (arg)| arg }]]
|
||||||
node.filters = [["append_all", node.filters.map { |f, (arg)| arg }]]
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def optimize_assign(node)
|
|
||||||
optimize(node.from)
|
|
||||||
end
|
|
||||||
|
|
||||||
def optimize_for(node)
|
|
||||||
optimize(node.collection_name)
|
|
||||||
optimize_block(node)
|
|
||||||
end
|
|
||||||
|
|
||||||
def optimize_if(node)
|
|
||||||
node.blocks.each do |block|
|
|
||||||
optimize_condition(block)
|
|
||||||
optimize(block.attachment)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def optimize_condition(node)
|
|
||||||
case node
|
|
||||||
when Liquid::ElseCondition
|
|
||||||
# noop
|
|
||||||
when Liquid::Condition
|
|
||||||
optimize(node.left)
|
|
||||||
optimize(node.right) if node.right
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
self.enabled = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -31,6 +31,8 @@ module Liquid
|
|||||||
@line_number = parse_context.line_number
|
@line_number = parse_context.line_number
|
||||||
|
|
||||||
parse_with_selected_parser(markup)
|
parse_with_selected_parser(markup)
|
||||||
|
|
||||||
|
Optimizer.optimize_variable(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def raw
|
def raw
|
||||||
|
|||||||
Reference in New Issue
Block a user