Class: Parser::AST::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/synvert/node_ext.rb

Instance Method Summary collapse

Instance Method Details

#arguments ⇒ Object



26
27
28
29
30
31
32
33
34
35
# File 'lib/synvert/node_ext.rb', line 26

def arguments
  case self.type
  when :send
    self.children[2..-1]
  when :block
    self.children[1].children
  else
    raise NotImplementedError.new "arguments is not handled for #{self.inspect}"
  end
end

#caller ⇒ Object



37
38
39
40
41
42
43
# File 'lib/synvert/node_ext.rb', line 37

def caller
  if :block == self.type
    self.children[0]
  else
    raise NotImplementedError.new "caller is not handled for #{self.inspect}"
  end
end

#grep_node(options) ⇒ Object



70
71
72
73
74
# File 'lib/synvert/node_ext.rb', line 70

def grep_node(options)
  self.recursive_children do |child|
    return child if child.match?(options)
  end
end

#indent ⇒ Object



57
58
59
# File 'lib/synvert/node_ext.rb', line 57

def indent
  self.loc.expression.column
end

#match?(options) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
79
80
81
82
# File 'lib/synvert/node_ext.rb', line 76

def match?(options)
  flat_hash(options).keys.all? do |key|
    actual = actual_value(self, key)
    expected = expected_value(options, key)
    match_value?(actual, expected)
  end
end

#message ⇒ Object



18
19
20
21
22
23
24
# File 'lib/synvert/node_ext.rb', line 18

def message
  if :send == self.type
    self.children[1]
  else
    raise NotImplementedError.new "message is not handled for #{self.inspect}"
  end
end

#name ⇒ Object



2
3
4
5
6
7
8
# File 'lib/synvert/node_ext.rb', line 2

def name
  if :class == self.type
    self.children[0]
  else
    raise NotImplementedError.new "name is not handled for #{self.inspect}"
  end
end

#receiver ⇒ Object



10
11
12
13
14
15
16
# File 'lib/synvert/node_ext.rb', line 10

def receiver
  if :send == self.type
    self.children[0]
  else
    raise NotImplementedError.new "receiver is not handled for #{self.inspect}"
  end
end

#recursive_children ⇒ Object



61
62
63
64
65
66
67
68
# File 'lib/synvert/node_ext.rb', line 61

def recursive_children
  self.children.each do |child|
    if Parser::AST::Node === child
      yield child
      child.recursive_children { |c| yield c }
    end
  end
end

#to_s ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/synvert/node_ext.rb', line 45

def to_s
  case self.type
  when :const
    self.children.compact.map(&:to_s).join('::')
  when :sym
    ':' + self.children[0].to_s
  when :str, :arg, :lvar, :ivar
    self.children[0].to_s
  else
  end
end

#to_source(code) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/synvert/node_ext.rb', line 84

def to_source(code)
  code.gsub(/{{(.*)}}/) do
    node = self # node is used in eval
    evaluated = eval($1)
    if Parser::AST::Node === evaluated
      source = evaluated.loc.expression.source_buffer.source
      source[evaluated.loc.expression.begin_pos...evaluated.loc.expression.end_pos]
    else # Array
      source = evaluated.first.loc.expression.source_buffer.source
      source[evaluated.first.loc.expression.begin_pos...evaluated.last.loc.expression.end_pos]
    end
  end
end