to_source 0.1.3 → 0.2.16

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 (89) hide show
  1. data/.gitignore +6 -6
  2. data/.rspec +1 -0
  3. data/.travis.yml +12 -1
  4. data/Changelog.md +115 -0
  5. data/Gemfile +5 -3
  6. data/Gemfile.devtools +67 -0
  7. data/Guardfile +18 -0
  8. data/LICENSE +21 -0
  9. data/README.md +52 -0
  10. data/Rakefile +3 -8
  11. data/TODO +9 -0
  12. data/bin/to_source +17 -0
  13. data/config/flay.yml +3 -0
  14. data/config/flog.yml +2 -0
  15. data/config/roodi.yml +26 -0
  16. data/config/site.reek +97 -0
  17. data/config/yardstick.yml +2 -0
  18. data/lib/to_source/command.rb +106 -0
  19. data/lib/to_source/emitter/access.rb +28 -0
  20. data/lib/to_source/emitter/actual_arguments.rb +89 -0
  21. data/lib/to_source/emitter/alias.rb +27 -0
  22. data/lib/to_source/emitter/assignment.rb +119 -0
  23. data/lib/to_source/emitter/attribute_assignment.rb +28 -0
  24. data/lib/to_source/emitter/begin.rb +71 -0
  25. data/lib/to_source/emitter/binary_operator.rb +63 -0
  26. data/lib/to_source/emitter/binary_operator_method.rb +58 -0
  27. data/lib/to_source/emitter/block.rb +29 -0
  28. data/lib/to_source/emitter/block_argument.rb +23 -0
  29. data/lib/to_source/emitter/block_pass.rb +23 -0
  30. data/lib/to_source/emitter/case.rb +85 -0
  31. data/lib/to_source/emitter/class.rb +44 -0
  32. data/lib/to_source/emitter/concat_arguments.rb +28 -0
  33. data/lib/to_source/emitter/default_arguments.rb +22 -0
  34. data/lib/to_source/emitter/define.rb +99 -0
  35. data/lib/to_source/emitter/defined.rb +24 -0
  36. data/lib/to_source/emitter/element_assignment.rb +29 -0
  37. data/lib/to_source/emitter/element_reference.rb +25 -0
  38. data/lib/to_source/emitter/empty_body.rb +21 -0
  39. data/lib/to_source/emitter/ensure.rb +50 -0
  40. data/lib/to_source/emitter/ensure_body.rb +27 -0
  41. data/lib/to_source/emitter/execute_string.rb +22 -0
  42. data/lib/to_source/emitter/formal_arguments.rb +212 -0
  43. data/lib/to_source/emitter/if.rb +96 -0
  44. data/lib/to_source/emitter/iter.rb +27 -0
  45. data/lib/to_source/emitter/keyword_value.rb +67 -0
  46. data/lib/to_source/emitter/literal/dynamic.rb +178 -0
  47. data/lib/to_source/emitter/literal.rb +232 -0
  48. data/lib/to_source/emitter/loop.rb +40 -0
  49. data/lib/to_source/emitter/match3.rb +25 -0
  50. data/lib/to_source/emitter/module.rb +28 -0
  51. data/lib/to_source/emitter/multiple_assignment.rb +49 -0
  52. data/lib/to_source/emitter/nth_ref.rb +22 -0
  53. data/lib/to_source/emitter/op_assign1.rb +27 -0
  54. data/lib/to_source/emitter/op_assign2.rb +27 -0
  55. data/lib/to_source/emitter/pattern_arguments.rb +24 -0
  56. data/lib/to_source/emitter/rescue.rb +28 -0
  57. data/lib/to_source/emitter/rescue_condition.rb +93 -0
  58. data/lib/to_source/emitter/scope.rb +24 -0
  59. data/lib/to_source/emitter/scope_name.rb +23 -0
  60. data/lib/to_source/emitter/scoped_name.rb +28 -0
  61. data/lib/to_source/emitter/send.rb +133 -0
  62. data/lib/to_source/emitter/send_with_arguments.rb +103 -0
  63. data/lib/to_source/emitter/singleton_class.rb +38 -0
  64. data/lib/to_source/emitter/splat.rb +24 -0
  65. data/lib/to_source/emitter/splat_when.rb +23 -0
  66. data/lib/to_source/emitter/static.rb +52 -0
  67. data/lib/to_source/emitter/super.rb +92 -0
  68. data/lib/to_source/emitter/to_array.rb +22 -0
  69. data/lib/to_source/emitter/to_string.rb +24 -0
  70. data/lib/to_source/emitter/toplevel.rb +24 -0
  71. data/lib/to_source/emitter/unary_operator_method.rb +27 -0
  72. data/lib/to_source/emitter/unless.rb +45 -0
  73. data/lib/to_source/emitter/util.rb +28 -0
  74. data/lib/to_source/emitter/when.rb +63 -0
  75. data/lib/to_source/emitter/yield.rb +28 -0
  76. data/lib/to_source/emitter/z_super.rb +24 -0
  77. data/lib/to_source/emitter.rb +278 -0
  78. data/lib/to_source/state.rb +144 -0
  79. data/lib/to_source.rb +78 -11
  80. data/spec/spec_helper.rb +11 -0
  81. data/spec/unit/to_source/class_methods/run_spec.rb +1254 -0
  82. data/to_source.gemspec +16 -14
  83. metadata +160 -20
  84. data/.rvmrc +0 -1
  85. data/Readme.md +0 -38
  86. data/lib/to_source/core_ext/node.rb +0 -22
  87. data/lib/to_source/version.rb +0 -3
  88. data/lib/to_source/visitor.rb +0 -377
  89. data/test/to_source/visitor_test.rb +0 -202
@@ -0,0 +1,178 @@
1
+ module ToSource
2
+ class Emitter
3
+ class Literal
4
+ # Base class for dynamic literal emitters
5
+ class Dynamic < self
6
+
7
+ private
8
+
9
+ # Perform dispatch
10
+ #
11
+ # @return [undefined]
12
+ #
13
+ # @api private
14
+ #
15
+ def dispatch
16
+ emit_open
17
+ emit_first
18
+ emit_segments
19
+ emit_close
20
+ end
21
+
22
+ # Emit open
23
+ #
24
+ # @return [undefined]
25
+ #
26
+ # @api private
27
+ #
28
+ def emit_open
29
+ emit(self.class::OPEN)
30
+ end
31
+
32
+ # Emit close
33
+ #
34
+ # @return [undefined]
35
+ #
36
+ # @api private
37
+ #
38
+ def emit_close
39
+ emit(self.class::CLOSE)
40
+ end
41
+
42
+ # Return first value
43
+ #
44
+ # @return [String]
45
+ #
46
+ # @api private
47
+ #
48
+ def first_value
49
+ node.string
50
+ end
51
+
52
+ # Emit literal
53
+ #
54
+ # @param [Object] literal
55
+ #
56
+ # @return [undefined]
57
+ #
58
+ # @api private
59
+ #
60
+ def emit_literal(literal)
61
+ emit(literal.inspect[1..-2])
62
+ end
63
+
64
+ # Emit literal node
65
+ #
66
+ # @param [Rubinius::AST::Node] node
67
+ #
68
+ # @return [undefined]
69
+ #
70
+ # @api private
71
+ #
72
+ def emit_literal_node(node)
73
+ emit_literal(node.string)
74
+ end
75
+
76
+ # Emit first
77
+ #
78
+ # @return [undefined]
79
+ #
80
+ # @api private
81
+ #
82
+ def emit_first
83
+ emit_literal(first_value)
84
+ end
85
+
86
+ # Emit segments
87
+ #
88
+ # @return [undefined]
89
+ #
90
+ # @api private
91
+ #
92
+ def emit_segments
93
+ array.each do |segment|
94
+ emit_segment(segment)
95
+ end
96
+ end
97
+
98
+ # Emit segment
99
+ #
100
+ # @param [Rubinius::AST::Node] segment
101
+ #
102
+ # @return [undefined]
103
+ #
104
+ # @api private
105
+ #
106
+ def emit_segment(segment)
107
+ case segment
108
+ when Rubinius::AST::StringLiteral
109
+ emit_literal_node(segment)
110
+ else
111
+ visit(segment)
112
+ end
113
+ end
114
+
115
+ delegate :array
116
+
117
+ # Return max segment number
118
+ #
119
+ # @return [Fixnum]
120
+ #
121
+ # @api private
122
+ #
123
+ def max
124
+ array.length - 1
125
+ end
126
+ memoize :max
127
+
128
+ # Emitter for dynamic symbol literals
129
+ class Symbol < self
130
+
131
+ handle(Rubinius::AST::DynamicSymbol)
132
+ OPEN = ':"'.freeze
133
+ CLOSE = '"'.freeze
134
+
135
+ end
136
+
137
+ # Emitter for dynamic string literals
138
+ class String < self
139
+
140
+ handle(Rubinius::AST::DynamicString)
141
+ OPEN = CLOSE = '"'.freeze
142
+
143
+ end
144
+
145
+ # Emitter for dynamic execute string literals
146
+ class Execute < self
147
+
148
+ handle(Rubinius::AST::DynamicExecuteString)
149
+ OPEN = CLOSE = '`'.freeze
150
+
151
+ end
152
+
153
+ # Emitter for dynamic regexp literals
154
+ class Regex < self
155
+
156
+ handle(Rubinius::AST::DynamicRegex)
157
+ OPEN = CLOSE = '/'.freeze
158
+
159
+ private
160
+
161
+ # Emit literal
162
+ #
163
+ # @param [String] literal
164
+ #
165
+ # @return [undefined]
166
+ #
167
+ # @api private
168
+ #
169
+ def emit_literal(literal)
170
+ emit(literal)
171
+ end
172
+
173
+ end
174
+
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,232 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Base class for literal emitters
4
+ class Literal < self
5
+
6
+ # Emitter for empty array nodes
7
+ class EmptyArray < self
8
+
9
+ handle(Rubinius::AST::EmptyArray)
10
+
11
+ private
12
+
13
+ # Perform dispatch
14
+ #
15
+ # @return [undefined]
16
+ #
17
+ # @api private
18
+ #
19
+ def dispatch
20
+ emit('[]')
21
+ end
22
+ end
23
+
24
+ # Emitter for array nodes
25
+ class Array < self
26
+
27
+ handle(Rubinius::AST::ArrayLiteral)
28
+
29
+ private
30
+
31
+ # Perform dispatch
32
+ #
33
+ # @return [undefined]
34
+ #
35
+ # @api private
36
+ #
37
+ def dispatch
38
+ emit('[')
39
+ run(Util::DelimitedBody, node.body)
40
+ emit(']')
41
+ end
42
+ end
43
+
44
+ # Base class for range emitters
45
+ class Range < self
46
+
47
+ private
48
+
49
+ # Perform dispatch
50
+ #
51
+ # @return [undefined]
52
+ #
53
+ # @api private
54
+ #
55
+ def dispatch
56
+ util = node
57
+ visit(util.start)
58
+ emit(self.class::TOKEN)
59
+ visit(util.finish)
60
+ end
61
+
62
+ # Emitter for incluive range nodes
63
+ class Inclusive < self
64
+
65
+ handle(Rubinius::AST::Range)
66
+ TOKEN = '..'.freeze
67
+
68
+ end
69
+
70
+ # Emitter for exclusive range nodes
71
+ class Exclude < self
72
+
73
+ handle(Rubinius::AST::RangeExclude)
74
+ TOKEN = '...'.freeze
75
+
76
+ end
77
+
78
+ end
79
+
80
+ # Emitter for hash nodes
81
+ class Hash < self
82
+
83
+ handle(Rubinius::AST::HashLiteral)
84
+
85
+ private
86
+
87
+ # Perform dispatch
88
+ #
89
+ # @return [undefined]
90
+ #
91
+ # @api private
92
+ #
93
+ def dispatch
94
+ emit '{'
95
+ emit_body
96
+ emit '}'
97
+ end
98
+
99
+ # Emit body
100
+ #
101
+ # @return [undefined]
102
+ #
103
+ # @api private
104
+ #
105
+ def emit_body
106
+ body = node.array.each_slice(2).to_a
107
+ max = body.length - 1
108
+ body.each_with_index do |(key, value), index|
109
+ visit(key)
110
+ emit(' => ')
111
+ visit(value)
112
+
113
+ if index < max
114
+ emit(', ')
115
+ end
116
+ end
117
+ end
118
+
119
+ end
120
+
121
+ # Base class for emiiters that emit via #inspect
122
+ class Inspect < self
123
+
124
+ handle(Rubinius::AST::SymbolLiteral)
125
+
126
+ private
127
+
128
+ # Perform dispatch
129
+ #
130
+ # @return [undefined]
131
+ #
132
+ # @api private
133
+ #
134
+ def dispatch
135
+ emit(value.inspect)
136
+ end
137
+
138
+ delegate :value
139
+
140
+ # Base class for emitters with static value
141
+ class Static < self
142
+
143
+ private
144
+
145
+ # Return value
146
+ #
147
+ # @return [Object]
148
+ #
149
+ # @api private
150
+ #
151
+ def value
152
+ self.class::VALUE
153
+ end
154
+
155
+ # Emitter for true literal nodes
156
+ class True < self
157
+ handle(Rubinius::AST::TrueLiteral)
158
+ VALUE = true
159
+ end
160
+
161
+ # Emitter for false literal nodes
162
+ class False < self
163
+ handle(Rubinius::AST::FalseLiteral)
164
+ VALUE = false
165
+ end
166
+
167
+ # Emitter for nil literal nodes
168
+ class Nil < self
169
+ handle(Rubinius::AST::NilLiteral)
170
+ VALUE = nil
171
+ end
172
+ end
173
+
174
+ # Emitter for regexp literal nodes
175
+ class Regexp < self
176
+
177
+ handle(Rubinius::AST::RegexLiteral)
178
+
179
+ private
180
+
181
+ # Return value to inspect
182
+ #
183
+ # @return [Regexp]
184
+ #
185
+ # @api private
186
+ #
187
+ def value
188
+ ::Regexp.new(node.source)
189
+ end
190
+ end
191
+
192
+ # Emitter for string litera nodes
193
+ class String < self
194
+
195
+ handle(Rubinius::AST::StringLiteral)
196
+
197
+ private
198
+
199
+ # Return value to inspect
200
+ #
201
+ # @return [String]
202
+ #
203
+ # @api private
204
+ #
205
+ def value
206
+ node.string
207
+ end
208
+ end
209
+ end
210
+
211
+ # Emitters that emitt via vlaue pass through
212
+ class PassThrough < self
213
+
214
+ handle(Rubinius::AST::FixnumLiteral)
215
+ handle(Rubinius::AST::FloatLiteral)
216
+
217
+ private
218
+
219
+ # Perform dispatch
220
+ #
221
+ # @return [undefined]
222
+ #
223
+ # @api private
224
+ #
225
+ def dispatch
226
+ emit(node.value)
227
+ end
228
+
229
+ end
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,40 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Base class for loop node emittrs
4
+ class Loop < self
5
+
6
+ private
7
+
8
+ # Perform dispatch
9
+ #
10
+ # @return [undefined]
11
+ #
12
+ # @api private
13
+ #
14
+ def dispatch
15
+ emit(self.class::KEYWORD)
16
+ space
17
+ visit(condition)
18
+ indented do
19
+ visit(body)
20
+ end
21
+ emit_end
22
+ end
23
+
24
+ delegate :condition, :body
25
+
26
+ # Emitter for while nodes
27
+ class While < self
28
+ handle(Rubinius::AST::While)
29
+ KEYWORD = :while
30
+ end
31
+
32
+ # Emitter for until nodes
33
+ class Until < self
34
+ handle(Rubinius::AST::Until)
35
+ KEYWORD = :until
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for match operator
4
+ class Match3 < self
5
+
6
+ handle(Rubinius::AST::Match3)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ util = node
18
+ visit(util.value)
19
+ emit(' =~ ')
20
+ visit(util.pattern)
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for module nodes
4
+ class Module < self
5
+
6
+ handle(Rubinius::AST::Module)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ util = node
18
+ emit('module ')
19
+ visit(util.name)
20
+ indented do
21
+ visit(util.body)
22
+ end
23
+ emit_end
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,49 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for multiple assignment nodes
4
+ class MultipleAssignment < self
5
+
6
+ handle(Rubinius::AST::MultipleAssignment)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit_left
18
+ emit(' = ')
19
+ emit_right
20
+ end
21
+
22
+ # Emit left
23
+ #
24
+ # @return [undefined]
25
+ #
26
+ # @api private
27
+ #
28
+ def emit_left
29
+ run(Util::DelimitedBody, node.left.body)
30
+ end
31
+
32
+ # Emit left
33
+ #
34
+ # @return [undefined]
35
+ #
36
+ # @api private
37
+ #
38
+ def emit_right
39
+ right = node.right
40
+ if right.kind_of?(Rubinius::AST::ArrayLiteral)
41
+ run(Util::DelimitedBody, right.body)
42
+ else
43
+ visit(right)
44
+ end
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,22 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for nth global variable reference
4
+ class NthRef < self
5
+
6
+ handle(Rubinius::AST::NthRef)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit("$#{node.which}")
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for conditiona element assignment
4
+ class OpAssign1 < self
5
+
6
+ handle(Rubinius::AST::OpAssign1)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ util = node
18
+ visit(util.receiver)
19
+ emit('[')
20
+ visit(util.arguments.array.first)
21
+ emit('] ||= ')
22
+ visit(util.value)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for conditiona attribute assignment
4
+ class OpAssign2 < self
5
+
6
+ handle(Rubinius::AST::OpAssign2)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ util = node
18
+ visit(util.receiver)
19
+ emit('.')
20
+ emit(util.name)
21
+ emit(' |= ')
22
+ visit(util.value)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,24 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for pattern argument node
4
+ class PatternArguments < self
5
+
6
+ handle(Rubinius::AST::PatternArguments)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit('(')
18
+ run(Util::DelimitedBody, node.arguments.body)
19
+ emit(')')
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for rescue nodes
4
+ class Rescue < self
5
+
6
+ handle(Rubinius::AST::Rescue)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ util = node
18
+ emit('begin')
19
+ indented do
20
+ visit(util.body)
21
+ end
22
+ visit(util.rescue)
23
+ emit_end
24
+ end
25
+
26
+ end
27
+ end
28
+ end