lib/temple/filters/static_analyzer.rb
# frozen_string_literal: true
module Temple
module Filters
# Convert [:dynamic, code] to [:static, text] if code is static Ruby expression.
class StaticAnalyzer < Filter
def call(exp)
# Optimize only when Ripper is available.
if ::Temple::StaticAnalyzer.available?
super
else
exp
end
end
def on_dynamic(code)
if ::Temple::StaticAnalyzer.static?(code)
exp = [:static, eval(code).to_s]
newlines = code.count("\n")
if newlines == 0
exp
else
[:multi, exp, *newlines.times.map { [:newline] }]
end
else
[:dynamic, code]
end
end
end
end
end