Class: Hamlit::StaticAnalyzer

Inherits:
Temple::Filter
  • Object
show all
Defined in:
lib/hamlit/static_analyzer.rb

Constant Summary collapse

STATIC_TOKENS =
%i[
  on_tstring_beg on_tstring_end on_tstring_content
  on_embexpr_beg on_embexpr_end
  on_lbracket on_rbracket
  on_qwords_beg on_words_sep on_qwords_sep
  on_lparen on_rparen
  on_lbrace on_rbrace on_label
  on_int on_float on_imaginary
  on_comma on_sp
].freeze
DYNAMIC_TOKENS =
%i[
  on_ident on_period
].freeze
STATIC_KEYWORDS =
%w[
  true false nil
].freeze
STATIC_OPERATORS =
%w[
  =>
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.static?(code) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/hamlit/static_analyzer.rb', line 29

def self.static?(code)
  return false if code.nil? || code.strip.empty?
  return false if RubyExpression.syntax_error?(code)

  Ripper.lex(code).each do |(_, col), token, str|
    case token
    when *STATIC_TOKENS
      # noop
    when :on_kw
      return false unless STATIC_KEYWORDS.include?(str)
    when :on_op
      return false unless STATIC_OPERATORS.include?(str)
    when *DYNAMIC_TOKENS
      return false
    else
      return false
    end
  end
  true
end

Instance Method Details

#on_dynamic(code) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/hamlit/static_analyzer.rb', line 50

def on_dynamic(code)
  if StaticAnalyzer.static?(code)
    [:static, eval(code).to_s]
  else
    [:dynamic, code]
  end
end