Class: Sorcerer::Subexpression

Inherits:
Object
  • Object
show all
Defined in:
lib/sorcerer/subexpression.rb

Instance Method Summary collapse

Constructor Details

#initialize(sexp) ⇒ Subexpression

Returns a new instance of Subexpression.



3
4
5
# File 'lib/sorcerer/subexpression.rb', line 3

def initialize(sexp)
  @sexp = sexp
end

Instance Method Details

#list_sexp(sexp) ⇒ Object



27
28
29
30
31
# File 'lib/sorcerer/subexpression.rb', line 27

def list_sexp(sexp)
  sexp.each do |s|
    recur(s)
  end
end

#recur(sexp) ⇒ Object



17
18
19
20
21
22
23
24
25
# File 'lib/sorcerer/subexpression.rb', line 17

def recur(sexp)
  if sexp.is_a?(Array)
    if sexp.first.is_a?(Symbol)
      tagged_sexp(sexp)
    else
      list_sexp(sexp)
    end
  end
end

#sub_expObject



11
12
13
14
15
# File 'lib/sorcerer/subexpression.rb', line 11

def sub_exp
  @result = []
  recur(@sexp)
  @result
end

#subexpressionsObject



7
8
9
# File 'lib/sorcerer/subexpression.rb', line 7

def subexpressions
  sub_exp.map { |s| Sorcerer.source(s) }
end

#tagged_sexp(sexp) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/sorcerer/subexpression.rb', line 33

def tagged_sexp(sexp)
  case sexp.first
  when :var_ref
    list_sexp(sexp)
  when :vcall               # [:vcall, target]
    @result << sexp
  when :fcall               # [:fcall, target]
    # ignore
  when :call                # [:call, target, ".", meth]
    @result << sexp
    recur(sexp[3])
    recur(sexp[1])
  when :method_add_arg      # [:method_add_arg, call, args]
    @result << sexp
    recur(sexp[2])
    within_method_sexp(sexp[1])
  when :method_add_block    # [:method_add_block, call, block]
    @result << sexp
    within_method_sexp(sexp[1])
  when :binary, :array, :hash, :unary, :defined
    @result << sexp
    list_sexp(sexp)
  when :aref
    @result << sexp
    recur(sexp[1])
    recur(sexp[2])
  when :brace_block         # [:brace_block, nil, statments]
    # ignore
  when :const_path_ref
    @result << sexp
    recur(sexp[1])
  when :@kw
    # ignore
  when :@const
    @result << sexp
  when :zsuper, :super
    @result << sexp
    list_sexp(sexp)
  else
    list_sexp(sexp)
  end
end

#within_method_sexp(sexp) ⇒ Object

When already handling a method call, we don’t need to recur on some items.



78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/sorcerer/subexpression.rb', line 78

def within_method_sexp(sexp)
  case sexp.first
  when :call                # [:call, target, ".", meth]
    recur(sexp[1])
  when :method_add_block    # [:method_add_block, call, block]
    within_method_sexp(sexp[1])
  when :method_add_arg      # [:method_add_arg, call, args]
    recur(sexp[2])
    within_method_sexp(sexp[1])
  else
    recur(sexp)
  end
end