codeminer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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