codeminer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/codeminer.gemspec +28 -0
  3. data/lib/codeminer.rb +112 -0
  4. data/lib/codeminer/expression_processor.rb +29 -0
  5. data/lib/codeminer/expressions/alias_expression.rb +23 -0
  6. data/lib/codeminer/expressions/ambiguous_operator_expression.rb +27 -0
  7. data/lib/codeminer/expressions/aref_assign_expression.rb +23 -0
  8. data/lib/codeminer/expressions/aref_field_expression.rb +28 -0
  9. data/lib/codeminer/expressions/arguments_expression.rb +29 -0
  10. data/lib/codeminer/expressions/array_expression.rb +22 -0
  11. data/lib/codeminer/expressions/attribute_assign_expression.rb +35 -0
  12. data/lib/codeminer/expressions/backref_variable_expression.rb +22 -0
  13. data/lib/codeminer/expressions/begin_expression.rb +38 -0
  14. data/lib/codeminer/expressions/binary_expression.rb +31 -0
  15. data/lib/codeminer/expressions/block_expression.rb +24 -0
  16. data/lib/codeminer/expressions/block_param_expression.rb +24 -0
  17. data/lib/codeminer/expressions/body_expression.rb +35 -0
  18. data/lib/codeminer/expressions/bodystmt_expression.rb +25 -0
  19. data/lib/codeminer/expressions/break_expression.rb +22 -0
  20. data/lib/codeminer/expressions/call_expression.rb +35 -0
  21. data/lib/codeminer/expressions/case_expression.rb +27 -0
  22. data/lib/codeminer/expressions/class_expression.rb +28 -0
  23. data/lib/codeminer/expressions/class_variable_assign_expression.rb +27 -0
  24. data/lib/codeminer/expressions/class_variable_expression.rb +22 -0
  25. data/lib/codeminer/expressions/colon2_assign_expression.rb +23 -0
  26. data/lib/codeminer/expressions/colon2_expression.rb +27 -0
  27. data/lib/codeminer/expressions/colon3_assign_expression.rb +23 -0
  28. data/lib/codeminer/expressions/colon3_expression.rb +26 -0
  29. data/lib/codeminer/expressions/command_expression.rb +30 -0
  30. data/lib/codeminer/expressions/condition_expression.rb +25 -0
  31. data/lib/codeminer/expressions/constant_assign_expression.rb +27 -0
  32. data/lib/codeminer/expressions/constant_variable_expression.rb +24 -0
  33. data/lib/codeminer/expressions/defined_expression.rb +22 -0
  34. data/lib/codeminer/expressions/defn_expression.rb +24 -0
  35. data/lib/codeminer/expressions/defs_expression.rb +29 -0
  36. data/lib/codeminer/expressions/destructured_param_expression.rb +24 -0
  37. data/lib/codeminer/expressions/dynamic_string_expression.rb +36 -0
  38. data/lib/codeminer/expressions/dynamic_symbol_expression.rb +22 -0
  39. data/lib/codeminer/expressions/else_expression.rb +26 -0
  40. data/lib/codeminer/expressions/empty_expression.rb +19 -0
  41. data/lib/codeminer/expressions/ensure_expression.rb +22 -0
  42. data/lib/codeminer/expressions/expression.rb +24 -0
  43. data/lib/codeminer/expressions/expression_container.rb +41 -0
  44. data/lib/codeminer/expressions/false_expression.rb +22 -0
  45. data/lib/codeminer/expressions/field_expression.rb +27 -0
  46. data/lib/codeminer/expressions/for_expression.rb +24 -0
  47. data/lib/codeminer/expressions/global_variable_assign_expression.rb +27 -0
  48. data/lib/codeminer/expressions/global_variable_expression.rb +22 -0
  49. data/lib/codeminer/expressions/hash_expression.rb +22 -0
  50. data/lib/codeminer/expressions/hash_pair_expression.rb +23 -0
  51. data/lib/codeminer/expressions/instance_variable_assign_expression.rb +27 -0
  52. data/lib/codeminer/expressions/instance_variable_expression.rb +22 -0
  53. data/lib/codeminer/expressions/int_expression.rb +24 -0
  54. data/lib/codeminer/expressions/keyword_param_expression.rb +31 -0
  55. data/lib/codeminer/expressions/lambda_expression.rb +25 -0
  56. data/lib/codeminer/expressions/local_assign_expression.rb +35 -0
  57. data/lib/codeminer/expressions/local_variable_expression.rb +24 -0
  58. data/lib/codeminer/expressions/magic_comment_expression.rb +23 -0
  59. data/lib/codeminer/expressions/module_expression.rb +27 -0
  60. data/lib/codeminer/expressions/multiple_assignment_expression.rb +25 -0
  61. data/lib/codeminer/expressions/next_expression.rb +22 -0
  62. data/lib/codeminer/expressions/nil_expression.rb +22 -0
  63. data/lib/codeminer/expressions/op_assign_expression.rb +26 -0
  64. data/lib/codeminer/expressions/optional_param_expression.rb +31 -0
  65. data/lib/codeminer/expressions/params_expression.rb +67 -0
  66. data/lib/codeminer/expressions/positional_param_expression.rb +32 -0
  67. data/lib/codeminer/expressions/range_expression.rb +28 -0
  68. data/lib/codeminer/expressions/redo_expression.rb +21 -0
  69. data/lib/codeminer/expressions/regexp_expression.rb +26 -0
  70. data/lib/codeminer/expressions/rescue_body_expression.rb +22 -0
  71. data/lib/codeminer/expressions/rescue_expression.rb +25 -0
  72. data/lib/codeminer/expressions/retry_expression.rb +21 -0
  73. data/lib/codeminer/expressions/return_expression.rb +26 -0
  74. data/lib/codeminer/expressions/root_expression.rb +22 -0
  75. data/lib/codeminer/expressions/sclass_expression.rb +23 -0
  76. data/lib/codeminer/expressions/self_expression.rb +22 -0
  77. data/lib/codeminer/expressions/splat_expression.rb +24 -0
  78. data/lib/codeminer/expressions/string_content_expression.rb +29 -0
  79. data/lib/codeminer/expressions/string_embedded_expression.rb +22 -0
  80. data/lib/codeminer/expressions/string_expression.rb +45 -0
  81. data/lib/codeminer/expressions/super_expression.rb +26 -0
  82. data/lib/codeminer/expressions/symbol_expression.rb +32 -0
  83. data/lib/codeminer/expressions/true_expression.rb +22 -0
  84. data/lib/codeminer/expressions/unary_expression.rb +23 -0
  85. data/lib/codeminer/expressions/undef_expression.rb +22 -0
  86. data/lib/codeminer/expressions/unknown_expression.rb +35 -0
  87. data/lib/codeminer/expressions/until_expression.rb +23 -0
  88. data/lib/codeminer/expressions/variable_expression.rb +20 -0
  89. data/lib/codeminer/expressions/void_expression.rb +21 -0
  90. data/lib/codeminer/expressions/when_expression.rb +24 -0
  91. data/lib/codeminer/expressions/while_expression.rb +23 -0
  92. data/lib/codeminer/expressions/xstring_expression.rb +24 -0
  93. data/lib/codeminer/expressions/yield_expression.rb +22 -0
  94. data/lib/codeminer/parser.rb +215 -0
  95. data/lib/codeminer/processors/argument_processor.rb +25 -0
  96. data/lib/codeminer/processors/array_processor.rb +86 -0
  97. data/lib/codeminer/processors/assignment_processor.rb +42 -0
  98. data/lib/codeminer/processors/binary_processor.rb +12 -0
  99. data/lib/codeminer/processors/call_processor.rb +32 -0
  100. data/lib/codeminer/processors/class_processor.rb +19 -0
  101. data/lib/codeminer/processors/command_processor.rb +15 -0
  102. data/lib/codeminer/processors/condition_processor.rb +59 -0
  103. data/lib/codeminer/processors/default_processor.rb +33 -0
  104. data/lib/codeminer/processors/hash_processor.rb +27 -0
  105. data/lib/codeminer/processors/loop_processor.rb +30 -0
  106. data/lib/codeminer/processors/method_processor.rb +58 -0
  107. data/lib/codeminer/processors/params_processor.rb +97 -0
  108. data/lib/codeminer/processors/range_processor.rb +15 -0
  109. data/lib/codeminer/processors/regexp_processor.rb +27 -0
  110. data/lib/codeminer/processors/return_processor.rb +15 -0
  111. data/lib/codeminer/processors/string_processor.rb +79 -0
  112. data/lib/codeminer/processors/symbol_processor.rb +31 -0
  113. data/lib/codeminer/processors/token_processor.rb +41 -0
  114. data/lib/codeminer/processors/variable_processor.rb +70 -0
  115. data/lib/codeminer/source_extract.rb +120 -0
  116. data/lib/codeminer/substitution.rb +48 -0
  117. data/lib/codeminer/token.rb +19 -0
  118. metadata +172 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 87e6c5fc088b7426bbd290c30432131c9eef2a01
4
+ data.tar.gz: b1bbc69b9634a247d1d59585621fec02a92e7e17
5
+ SHA512:
6
+ metadata.gz: eb5540dab6c63c8d8bfd1c2116f50318325559453b90fb2143041b12c623eb6bc86307b81eb9c0996ea26537a81a78f87f4f686d0e2729b4acd321c8cad0dd3a
7
+ data.tar.gz: 3f90069d2fb224d74b31c581b14bca0a27785de8d3b64553a8f5dc2d27e157f1847c8ef2a1d5421de80c8f9dd120fb4f14015485680e2d01d2500a5ea2184425
@@ -0,0 +1,28 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'codeminer'
3
+ s.version = '0.1.0'
4
+ s.date = '2014-06-30'
5
+
6
+ s.summary = 'Mines Ruby code'
7
+ s.description = 'Streamlined parsing and processing of Ruby code using Ripper'
8
+
9
+ s.authors = ['Jacob Richardson']
10
+ s.email = 'jacob.ninja.dev@gmail.com'
11
+
12
+ s.require_paths = %w[lib]
13
+
14
+ s.add_development_dependency('test-unit', '2.5.5')
15
+
16
+ s.files = %w[
17
+ codeminer.gemspec
18
+ lib/codeminer.rb
19
+ lib/codeminer/parser.rb
20
+ lib/codeminer/expression_processor.rb
21
+ lib/codeminer/source_extract.rb
22
+ lib/codeminer/substitution.rb
23
+ lib/codeminer/token.rb
24
+ ]
25
+ s.files += Dir.glob('lib/codeminer/expressions/*.rb')
26
+ s.files += Dir.glob('lib/codeminer/processors/*.rb')
27
+
28
+ end
@@ -0,0 +1,112 @@
1
+ require File.expand_path('../codeminer/source_extract', __FILE__)
2
+
3
+ require File.expand_path('../codeminer/expressions/expression', __FILE__)
4
+ require File.expand_path('../codeminer/expressions/alias_expression', __FILE__)
5
+ require File.expand_path('../codeminer/expressions/ambiguous_operator_expression', __FILE__)
6
+ require File.expand_path('../codeminer/expressions/aref_assign_expression', __FILE__)
7
+ require File.expand_path('../codeminer/expressions/aref_field_expression', __FILE__)
8
+ require File.expand_path('../codeminer/expressions/array_expression', __FILE__)
9
+ require File.expand_path('../codeminer/expressions/arguments_expression', __FILE__)
10
+ require File.expand_path('../codeminer/expressions/attribute_assign_expression', __FILE__)
11
+ require File.expand_path('../codeminer/expressions/backref_variable_expression', __FILE__)
12
+ require File.expand_path('../codeminer/expressions/begin_expression', __FILE__)
13
+ require File.expand_path('../codeminer/expressions/binary_expression', __FILE__)
14
+ require File.expand_path('../codeminer/expressions/block_expression', __FILE__)
15
+ require File.expand_path('../codeminer/expressions/block_param_expression', __FILE__)
16
+ require File.expand_path('../codeminer/expressions/body_expression', __FILE__)
17
+ require File.expand_path('../codeminer/expressions/bodystmt_expression', __FILE__)
18
+ require File.expand_path('../codeminer/expressions/break_expression', __FILE__)
19
+ require File.expand_path('../codeminer/expressions/call_expression', __FILE__)
20
+ require File.expand_path('../codeminer/expressions/case_expression', __FILE__)
21
+ require File.expand_path('../codeminer/expressions/class_expression', __FILE__)
22
+ require File.expand_path('../codeminer/expressions/class_variable_assign_expression', __FILE__)
23
+ require File.expand_path('../codeminer/expressions/class_variable_expression', __FILE__)
24
+ require File.expand_path('../codeminer/expressions/colon2_assign_expression', __FILE__)
25
+ require File.expand_path('../codeminer/expressions/colon2_expression', __FILE__)
26
+ require File.expand_path('../codeminer/expressions/colon3_assign_expression', __FILE__)
27
+ require File.expand_path('../codeminer/expressions/colon3_expression', __FILE__)
28
+ require File.expand_path('../codeminer/expressions/command_expression', __FILE__)
29
+ require File.expand_path('../codeminer/expressions/condition_expression', __FILE__)
30
+ require File.expand_path('../codeminer/expressions/constant_assign_expression', __FILE__)
31
+ require File.expand_path('../codeminer/expressions/constant_variable_expression', __FILE__)
32
+ require File.expand_path('../codeminer/expressions/defined_expression', __FILE__)
33
+ require File.expand_path('../codeminer/expressions/defn_expression', __FILE__)
34
+ require File.expand_path('../codeminer/expressions/defs_expression', __FILE__)
35
+ require File.expand_path('../codeminer/expressions/destructured_param_expression', __FILE__)
36
+ require File.expand_path('../codeminer/expressions/dynamic_symbol_expression', __FILE__)
37
+ require File.expand_path('../codeminer/expressions/else_expression', __FILE__)
38
+ require File.expand_path('../codeminer/expressions/empty_expression', __FILE__)
39
+ require File.expand_path('../codeminer/expressions/ensure_expression', __FILE__)
40
+ require File.expand_path('../codeminer/expressions/false_expression', __FILE__)
41
+ require File.expand_path('../codeminer/expressions/field_expression', __FILE__)
42
+ require File.expand_path('../codeminer/expressions/for_expression', __FILE__)
43
+ require File.expand_path('../codeminer/expressions/global_variable_assign_expression', __FILE__)
44
+ require File.expand_path('../codeminer/expressions/global_variable_expression', __FILE__)
45
+ require File.expand_path('../codeminer/expressions/hash_expression', __FILE__)
46
+ require File.expand_path('../codeminer/expressions/hash_pair_expression', __FILE__)
47
+ require File.expand_path('../codeminer/expressions/instance_variable_assign_expression', __FILE__)
48
+ require File.expand_path('../codeminer/expressions/instance_variable_expression', __FILE__)
49
+ require File.expand_path('../codeminer/expressions/int_expression', __FILE__)
50
+ require File.expand_path('../codeminer/expressions/keyword_param_expression', __FILE__)
51
+ require File.expand_path('../codeminer/expressions/lambda_expression', __FILE__)
52
+ require File.expand_path('../codeminer/expressions/local_assign_expression', __FILE__)
53
+ require File.expand_path('../codeminer/expressions/local_variable_expression', __FILE__)
54
+ require File.expand_path('../codeminer/expressions/magic_comment_expression', __FILE__)
55
+ require File.expand_path('../codeminer/expressions/module_expression', __FILE__)
56
+ require File.expand_path('../codeminer/expressions/multiple_assignment_expression', __FILE__)
57
+ require File.expand_path('../codeminer/expressions/next_expression', __FILE__)
58
+ require File.expand_path('../codeminer/expressions/nil_expression', __FILE__)
59
+ require File.expand_path('../codeminer/expressions/op_assign_expression', __FILE__)
60
+ require File.expand_path('../codeminer/expressions/optional_param_expression', __FILE__)
61
+ require File.expand_path('../codeminer/expressions/params_expression', __FILE__)
62
+ require File.expand_path('../codeminer/expressions/expression_container', __FILE__)
63
+ require File.expand_path('../codeminer/expressions/positional_param_expression', __FILE__)
64
+ require File.expand_path('../codeminer/expressions/range_expression', __FILE__)
65
+ require File.expand_path('../codeminer/expressions/redo_expression', __FILE__)
66
+ require File.expand_path('../codeminer/expressions/regexp_expression', __FILE__)
67
+ require File.expand_path('../codeminer/expressions/rescue_body_expression', __FILE__)
68
+ require File.expand_path('../codeminer/expressions/rescue_expression', __FILE__)
69
+ require File.expand_path('../codeminer/expressions/retry_expression', __FILE__)
70
+ require File.expand_path('../codeminer/expressions/return_expression', __FILE__)
71
+ require File.expand_path('../codeminer/expressions/root_expression', __FILE__)
72
+ require File.expand_path('../codeminer/expressions/sclass_expression', __FILE__)
73
+ require File.expand_path('../codeminer/expressions/self_expression', __FILE__)
74
+ require File.expand_path('../codeminer/expressions/splat_expression', __FILE__)
75
+ require File.expand_path('../codeminer/expressions/string_expression', __FILE__)
76
+ require File.expand_path('../codeminer/expressions/string_content_expression', __FILE__)
77
+ require File.expand_path('../codeminer/expressions/string_embedded_expression', __FILE__)
78
+ require File.expand_path('../codeminer/expressions/super_expression', __FILE__)
79
+ require File.expand_path('../codeminer/expressions/symbol_expression', __FILE__)
80
+ require File.expand_path('../codeminer/expressions/true_expression', __FILE__)
81
+ require File.expand_path('../codeminer/expressions/unknown_expression', __FILE__)
82
+ require File.expand_path('../codeminer/expressions/unary_expression', __FILE__)
83
+ require File.expand_path('../codeminer/expressions/undef_expression', __FILE__)
84
+ require File.expand_path('../codeminer/expressions/until_expression', __FILE__)
85
+ require File.expand_path('../codeminer/expressions/variable_expression', __FILE__)
86
+ require File.expand_path('../codeminer/expressions/void_expression', __FILE__)
87
+ require File.expand_path('../codeminer/expressions/when_expression', __FILE__)
88
+ require File.expand_path('../codeminer/expressions/while_expression', __FILE__)
89
+ require File.expand_path('../codeminer/expressions/xstring_expression', __FILE__)
90
+ require File.expand_path('../codeminer/expressions/yield_expression', __FILE__)
91
+
92
+ require File.expand_path('../codeminer/token', __FILE__)
93
+ require File.expand_path('../codeminer/parser', __FILE__)
94
+ require File.expand_path('../codeminer/substitution', __FILE__)
95
+
96
+ module CodeMiner
97
+
98
+ ParseError = Class.new(RuntimeError)
99
+
100
+ def self.parse(code)
101
+ Parser.parse(code)
102
+ end
103
+
104
+ def self.process(code, processors)
105
+ Parser.process(code, processors)
106
+ end
107
+
108
+ def self.sexp(code, formatters={})
109
+ Parser.sexp(code, formatters)
110
+ end
111
+
112
+ end
@@ -0,0 +1,29 @@
1
+ module CodeMiner
2
+
3
+ module ExpressionProcessor
4
+
5
+ Ripper::PARSER_EVENT_TABLE.each do |event, arity|
6
+ next if event == :parse_error
7
+ next if /_new\z/ =~ event.to_s and arity == 0
8
+ next if /_add\z/ =~ event.to_s
9
+ next if /_from_[a-z]+\z/ =~ event.to_s
10
+
11
+ define_method :"on_#{event}" do |*args|
12
+ super(*args).tap do |node|
13
+ invoke_processor(node, event)
14
+ end
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def invoke_processor(node, event)
21
+ @processors.each do |p|
22
+ meth = :"process_#{event}"
23
+ p.public_send(meth, node) if p.respond_to?(meth)
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,23 @@
1
+ module CodeMiner
2
+
3
+ class AliasExpression < Expression
4
+
5
+ attr_reader :left, :right, :value
6
+
7
+ def initialize(left, right, src)
8
+ @left = left
9
+ @right = right
10
+ @src = src
11
+ end
12
+
13
+ def type
14
+ :alias
15
+ end
16
+
17
+ def each
18
+ [@left, @right]
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,27 @@
1
+ module CodeMiner
2
+
3
+ class AmbiguousOperatorExpression < Expression
4
+
5
+ attr_reader :msg
6
+
7
+ def initialize(token, msg, src)
8
+ @token = token
9
+ @msg = msg
10
+ @src = src
11
+ end
12
+
13
+ def type
14
+ :ambiguous_operator
15
+ end
16
+
17
+ def value
18
+ @token.value
19
+ end
20
+
21
+ def each
22
+ [msg]
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,23 @@
1
+ module CodeMiner
2
+
3
+ class ArefAssignExpression < Expression
4
+
5
+ attr_reader :body, :receiver, :value
6
+
7
+ def initialize(receiver, body, src)
8
+ @receiver = receiver
9
+ @body = body
10
+ @src = src
11
+ end
12
+
13
+ def type
14
+ :aref_assign
15
+ end
16
+
17
+ def each
18
+ [receiver, body]
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,28 @@
1
+ module CodeMiner
2
+
3
+ class ArefFieldExpression < Expression
4
+
5
+ attr_reader :receiver, :args
6
+
7
+ def initialize(token, receiver, args, src)
8
+ @token = token
9
+ @receiver = receiver
10
+ @args = args
11
+ @src = src
12
+ end
13
+
14
+ def value
15
+ @token.value
16
+ end
17
+
18
+ def type
19
+ :aref_field
20
+ end
21
+
22
+ def each
23
+ [receiver, args]
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,29 @@
1
+ module CodeMiner
2
+
3
+ class ArgumentsExpression < Expression
4
+
5
+ attr_reader :value, :token
6
+
7
+ def initialize(src=nil, token=nil)
8
+ @arguments = []
9
+ @src = src
10
+ @token = token
11
+ end
12
+
13
+ def add(exp)
14
+ @arguments << exp
15
+ adjust_src(exp.src_extract)
16
+ self
17
+ end
18
+
19
+ def type
20
+ :arguments
21
+ end
22
+
23
+ def each
24
+ @arguments
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,22 @@
1
+ module CodeMiner
2
+
3
+ class ArrayExpression < Expression
4
+
5
+ attr_reader :value
6
+
7
+ def initialize(args, src)
8
+ @args = args
9
+ @src = src
10
+ end
11
+
12
+ def type
13
+ :array
14
+ end
15
+
16
+ def each
17
+ Array(args)
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,35 @@
1
+ module CodeMiner
2
+
3
+ class AttributeAssignExpression < Expression
4
+
5
+ attr_reader :body
6
+
7
+ def initialize(field, body, src)
8
+ @field = field
9
+ @body = body
10
+ @src = src
11
+ end
12
+
13
+ def type
14
+ :attribute_assign
15
+ end
16
+
17
+ def token
18
+ @field.token
19
+ end
20
+
21
+ def value
22
+ token.value
23
+ end
24
+
25
+ def each
26
+ [receiver, @body]
27
+ end
28
+
29
+ def receiver
30
+ @field.receiver
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,22 @@
1
+ module CodeMiner
2
+
3
+ class BackrefVariableExpression < Expression
4
+
5
+ attr_reader :value
6
+
7
+ def initialize(value, src)
8
+ @value = value
9
+ @src = src
10
+ end
11
+
12
+ def type
13
+ :backref_variable
14
+ end
15
+
16
+ def each
17
+ []
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,38 @@
1
+ module CodeMiner
2
+
3
+ class BeginExpression < Expression
4
+
5
+ attr_reader :bodystmt, :value
6
+
7
+ def initialize(bodystmt, src)
8
+ @bodystmt = bodystmt
9
+ @src = src
10
+ end
11
+
12
+ def type
13
+ :begin
14
+ end
15
+
16
+ def body
17
+ @bodystmt.body
18
+ end
19
+
20
+ def ensure
21
+ @bodystmt.ensure
22
+ end
23
+
24
+ def rescue
25
+ @bodystmt.rescue
26
+ end
27
+
28
+ def else
29
+ @bodystmt.else
30
+ end
31
+
32
+ def each
33
+ body.each
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,31 @@
1
+ module CodeMiner
2
+
3
+ class BinaryExpression < Expression
4
+
5
+ attr_reader :left, :right
6
+
7
+ def initialize(token, left, right, src)
8
+ @token = token
9
+ @left = left
10
+ @right = right
11
+ @src = src
12
+ end
13
+
14
+ def each
15
+ [left, right]
16
+ end
17
+
18
+ def type
19
+ :binary
20
+ end
21
+
22
+ def value
23
+ @token.value
24
+ end
25
+
26
+ alias receiver left
27
+ alias body right
28
+
29
+ end
30
+
31
+ end