Module: Temple::StaticAnalyzer

Defined in:
lib/temple/static_analyzer.rb

Defined Under Namespace

Classes: SyntaxChecker

Constant Summary collapse

STATIC_TOKENS =
[
  :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, :on_ignored_nl,
].freeze
DYNAMIC_TOKENS =
[
  :on_ident, :on_period,
].freeze
STATIC_KEYWORDS =
[
  'true', 'false', 'nil',
].freeze
STATIC_OPERATORS =
[
  '=>',
].freeze

Class Method Summary collapse

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/temple/static_analyzer.rb', line 33

def available?
  defined?(Ripper) && Ripper.respond_to?(:lex)
end

.static?(code) ⇒ Boolean

Returns:

  • (Boolean)


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/temple/static_analyzer.rb', line 37

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

  Ripper.lex(code).each do |_, 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

.syntax_error?(code) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
61
62
63
# File 'lib/temple/static_analyzer.rb', line 58

def syntax_error?(code)
  SyntaxChecker.new(code).parse
  false
rescue SyntaxChecker::ParseError
  true
end