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,99 @@
1
+ module ToSource
2
+ class Emitter
3
+
4
+ # Emitter for define singleton nodes
5
+ class DefineSingleton < self
6
+
7
+ handle(Rubinius::AST::DefineSingleton)
8
+
9
+ private
10
+
11
+ delegate(:receiver, :body)
12
+
13
+ # Perform dispatch
14
+ #
15
+ # @return [undefined]
16
+ #
17
+ # @api private
18
+ #
19
+ def dispatch
20
+ emit('def ')
21
+ visit(receiver)
22
+ emit('.')
23
+ visit(body)
24
+ end
25
+ end
26
+
27
+ # Base class for define emitters
28
+ class Define < self
29
+
30
+ private
31
+
32
+ delegate(:name, :body)
33
+
34
+ # Perform dispatch
35
+ #
36
+ # @return [undefined]
37
+ #
38
+ # @api private
39
+ #
40
+ def shared_dispatch
41
+ emit(name)
42
+ emit_arguments
43
+ indented do
44
+ visit(body)
45
+ end
46
+ emit_end
47
+ end
48
+
49
+ # Emit arguments
50
+ #
51
+ # @return [undefined]
52
+ #
53
+ # @api private
54
+ #
55
+ def emit_arguments
56
+ run(FormalArguments::Method)
57
+ end
58
+
59
+ # Emitter for singeton level defines
60
+ class Singleton < self
61
+
62
+ handle(Rubinius::AST::DefineSingletonScope)
63
+
64
+ private
65
+
66
+ # Perform dispatch
67
+ #
68
+ # @return [undefined]
69
+ #
70
+ # @api private
71
+ #
72
+ def dispatch
73
+ shared_dispatch
74
+ end
75
+
76
+ end
77
+
78
+ # Emitter for instance level defines
79
+ class Instance < self
80
+
81
+ handle(Rubinius::AST::Define)
82
+
83
+ private
84
+
85
+ # Perform dispatch
86
+ #
87
+ # @return [undefined]
88
+ #
89
+ # @api private
90
+ #
91
+ def dispatch
92
+ emit('def ')
93
+ shared_dispatch
94
+ end
95
+
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,24 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for defined? node
4
+ class Defined < self
5
+
6
+ handle(Rubinius::AST::Defined)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit('defined?(')
18
+ visit(node.expression)
19
+ emit(')')
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for element assignment nodes
4
+ class ElementAssignment < self
5
+
6
+ handle(Rubinius::AST::ElementAssignment)
7
+
8
+ private
9
+
10
+ delegate(:receiver)
11
+
12
+ # Perform dispatch
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ index, value = node.arguments.array
20
+ visit(receiver)
21
+ emit('[')
22
+ visit(index)
23
+ emit('] = ')
24
+ visit(value)
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for element reference nodes
4
+ class ElementReference < self
5
+
6
+ private
7
+
8
+ delegate(:receiver)
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ visit(receiver)
18
+ emit('[')
19
+ visit(node.arguments.array.first)
20
+ emit(']')
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for empty body
4
+ class EmptyBody < self
5
+
6
+ handle(Rubinius::AST::EmptyBody)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,50 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for ensure nodes
4
+ class Ensure < self
5
+
6
+ handle(Rubinius::AST::Ensure)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit_begin
18
+ emit_enusure
19
+ end
20
+
21
+ # Emit begin
22
+ #
23
+ # @return [undefined]
24
+ #
25
+ # @api private
26
+ #
27
+ def emit_begin
28
+ emit(:begin)
29
+ indented do
30
+ visit(node.body)
31
+ end
32
+ end
33
+
34
+ # Emit ensure
35
+ #
36
+ # @return [undefined]
37
+ #
38
+ # @api private
39
+ #
40
+ def emit_enusure
41
+ emit(:ensure)
42
+ indented do
43
+ visit(node.ensure)
44
+ end
45
+ emit_end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,27 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for ensure body
4
+ class EnsureBody < self
5
+
6
+ private
7
+
8
+ delegate(:body)
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ visit(body)
18
+ unindent
19
+ emit(:ensure)
20
+ indented do
21
+ visit(node.ensure)
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for execute string
4
+ class ExecuteString < self
5
+
6
+ handle(Rubinius::AST::ExecuteString)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit("`#{node.string}`")
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,212 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for formal arguments
4
+ class FormalArguments < self
5
+
6
+ private
7
+
8
+ delegate(:arguments)
9
+ predicate(:splat, :block_arg, :defaults)
10
+
11
+ # Perform dispatch
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ return unless any?
19
+ util = self.class
20
+ emit(util::OPEN)
21
+ emit_required
22
+ emit_defaults
23
+ emit_splat
24
+ emit_block_arg
25
+ emit(util::CLOSE)
26
+ end
27
+
28
+ # Test if any argument is present
29
+ #
30
+ # @return [true]
31
+ # if any argument is present
32
+ #
33
+ # @return [false]
34
+ # otherwise
35
+ #
36
+ # @api private
37
+ #
38
+ def any?
39
+ required? || defaults? || splat? || block_arg?
40
+ end
41
+
42
+ # Return required
43
+ #
44
+ # @return [Array]
45
+ #
46
+ # @api private
47
+ #
48
+ def required
49
+ arguments.required
50
+ end
51
+
52
+ # Test if any required arguments are present
53
+ #
54
+ # @return [true]
55
+ # if any required arguments are presnet
56
+ #
57
+ # @return [false]
58
+ # otherwise
59
+ #
60
+ # @api private
61
+ #
62
+ def required?
63
+ required.any?
64
+ end
65
+
66
+ # Return defaults
67
+ #
68
+ # @return [Rubinius::AST::Node]
69
+ #
70
+ # @api private
71
+ #
72
+ def defaults
73
+ arguments.defaults
74
+ end
75
+
76
+ # Return splat arguments
77
+ #
78
+ # @return [Rubinius::AST::Node]
79
+ #
80
+ # @api private
81
+ #
82
+ def splat
83
+ arguments.splat
84
+ end
85
+
86
+ # Return block argument
87
+ #
88
+ # @return [Rubinius::AST::Node]
89
+ #
90
+ # @api private
91
+ #
92
+ def block_arg
93
+ arguments.block_arg
94
+ end
95
+
96
+ # Emit required
97
+ #
98
+ # @return [undefined]
99
+ #
100
+ # @api private
101
+ #
102
+ def emit_required
103
+ array = required
104
+ max = array.length - 1
105
+ array.each_with_index do |member, index|
106
+ emit_member(member)
107
+ emit(', ') if index < max
108
+ end
109
+ end
110
+
111
+ # Emit member
112
+ #
113
+ # @param [Object, Rubinius::AST::Node] member
114
+ #
115
+ # @return [undefined]
116
+ #
117
+ # @api private
118
+ #
119
+ def emit_member(member)
120
+ if member.kind_of?(Rubinius::AST::Node)
121
+ visit(member)
122
+ else
123
+ emit(member)
124
+ end
125
+ end
126
+
127
+ # Emit defaults
128
+ #
129
+ # @return [undefined]
130
+ #
131
+ # @api private
132
+ #
133
+ def emit_defaults
134
+ return unless defaults?
135
+ emit(', ') if required?
136
+ visit(defaults)
137
+ end
138
+
139
+ # Emit splat
140
+ #
141
+ # @return [undefined]
142
+ #
143
+ # @api private
144
+ #
145
+ def emit_splat
146
+ return unless splat?
147
+
148
+ emit(', ') if required? or defaults?
149
+ emit('*')
150
+ emit_splat_value(splat)
151
+ end
152
+
153
+ # Emit splat value
154
+ #
155
+ # @param [Object] value
156
+ #
157
+ # @return [undefined]
158
+ #
159
+ # @api private
160
+ #
161
+ def emit_splat_value(value)
162
+ unless value == :@unnamed_splat
163
+ emit(value)
164
+ end
165
+ end
166
+
167
+ # Emit block arg
168
+ #
169
+ # @return [undefined]
170
+ #
171
+ # @api private
172
+ #
173
+ def emit_block_arg
174
+ return unless block_arg?
175
+ emit(', ') if required? or defaults? or splat?
176
+ visit(block_arg)
177
+ end
178
+
179
+ # Emmiter for block arguments
180
+ class Block < self
181
+ OPEN = ' |'.freeze
182
+ CLOSE = '|'.freeze
183
+ end
184
+
185
+ # Emitter for method arguments
186
+ class Method < self
187
+ OPEN = '('.freeze
188
+ CLOSE = ')'.freeze
189
+
190
+ # Generic emitter for method arguments
191
+ class Generic < self
192
+
193
+ handle(Rubinius::AST::FormalArguments19)
194
+
195
+ private
196
+
197
+ # Return arguments
198
+ #
199
+ # @return [Rubnius::AST::Node]
200
+ #
201
+ # @api private
202
+ #
203
+ def arguments
204
+ node
205
+ end
206
+
207
+ end
208
+
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,96 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for if nodes
4
+ class If < self
5
+
6
+ handle(Rubinius::AST::If)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ if else_branch? and !if_branch?
18
+ run(Unless, node)
19
+ return
20
+ end
21
+
22
+ normal_dispatch
23
+ end
24
+
25
+ # Test if if branch is present
26
+ #
27
+ # @return [true]
28
+ # if if branch is present
29
+ #
30
+ # @return [false]
31
+ # otherwise
32
+ #
33
+ # @api private
34
+ #
35
+ def if_branch?
36
+ !node.body.kind_of?(Rubinius::AST::NilLiteral)
37
+ end
38
+
39
+ # Test if else branch is present
40
+ #
41
+ # @return [true]
42
+ # if else branch is present
43
+ #
44
+ # @return [false]
45
+ # otherwise
46
+ #
47
+ # @api private
48
+ #
49
+ def else_branch?
50
+ !node.else.kind_of?(Rubinius::AST::NilLiteral)
51
+ end
52
+
53
+ # Perform normal dispatch
54
+ #
55
+ # @return [undefined]
56
+ #
57
+ # @api private
58
+ #
59
+ def normal_dispatch
60
+ emit('if ')
61
+ visit(node.condition)
62
+ emit_if_branch
63
+ emit_else_branch
64
+ emit('end')
65
+ end
66
+
67
+ # Emit if brnach
68
+ #
69
+ # @return [undefined]
70
+ #
71
+ # @api private
72
+ #
73
+ def emit_if_branch
74
+ indented do
75
+ visit(node.body)
76
+ end
77
+ end
78
+
79
+ # Emit else branch
80
+ #
81
+ # @return [undefined]
82
+ #
83
+ # @api private
84
+ #
85
+ def emit_else_branch
86
+ body = node.else
87
+ return unless else_branch?
88
+ emit('else')
89
+ indented do
90
+ visit(body)
91
+ end
92
+ end
93
+
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,27 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for iter nodes
4
+ class Iter < self
5
+
6
+ handle(Rubinius::AST::Iter19)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit(' do')
18
+ run(FormalArguments::Block)
19
+ indented do
20
+ visit(node.body)
21
+ end
22
+ emit_end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,67 @@
1
+ module ToSource
2
+ class Emitter
3
+
4
+ # Base class for keyword with value emitters
5
+ class KeywordValue < self
6
+
7
+ private
8
+
9
+ # Perform dispatch
10
+ #
11
+ # @return [undefined]
12
+ #
13
+ # @api private
14
+ #
15
+ def dispatch
16
+ emit(self.class::SYMBOL)
17
+ if value?
18
+ emit('(')
19
+ visit(node.value)
20
+ emit(')')
21
+ end
22
+ end
23
+
24
+ # Emitter for return nodes
25
+ class Return < self
26
+
27
+ handle(Rubinius::AST::Return)
28
+ SYMBOL = :return
29
+
30
+ private
31
+
32
+ # Perform dispatch
33
+ #
34
+ # @return [undefined]
35
+ #
36
+ # @api private
37
+ #
38
+ def value?
39
+ !!node.value
40
+ end
41
+ end
42
+
43
+ # Emitter for break nodes
44
+ class Break < self
45
+
46
+ handle(Rubinius::AST::Break)
47
+ SYMBOL = :break
48
+
49
+ # Test if value is present
50
+ #
51
+ # @return [true]
52
+ # if value is present
53
+ #
54
+ # @return [false]
55
+ # otherwise
56
+ #
57
+ # @api private
58
+ #
59
+ def value?
60
+ !node.value.kind_of?(Rubinius::AST::NilLiteral)
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+ end
67
+ end