to_source 0.2.15 → 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 (76) hide show
  1. data/.gitignore +6 -6
  2. data/Changelog.md +4 -0
  3. data/README.md +1 -1
  4. data/bin/to_source +1 -0
  5. data/config/flay.yml +1 -1
  6. data/config/flog.yml +1 -1
  7. data/config/roodi.yml +4 -4
  8. data/config/site.reek +5 -2
  9. data/config/yardstick.yml +1 -1
  10. data/lib/to_source.rb +1 -1
  11. data/lib/to_source/command.rb +63 -1
  12. data/lib/to_source/emitter.rb +221 -32
  13. data/lib/to_source/emitter/access.rb +8 -0
  14. data/lib/to_source/emitter/actual_arguments.rb +51 -8
  15. data/lib/to_source/emitter/alias.rb +11 -2
  16. data/lib/to_source/emitter/assignment.rb +62 -22
  17. data/lib/to_source/emitter/attribute_assignment.rb +11 -2
  18. data/lib/to_source/emitter/begin.rb +34 -14
  19. data/lib/to_source/emitter/binary_operator.rb +34 -17
  20. data/lib/to_source/emitter/binary_operator_method.rb +36 -17
  21. data/lib/to_source/emitter/block.rb +7 -0
  22. data/lib/to_source/emitter/block_argument.rb +7 -0
  23. data/lib/to_source/emitter/block_pass.rb +7 -0
  24. data/lib/to_source/emitter/case.rb +85 -0
  25. data/lib/to_source/emitter/class.rb +21 -6
  26. data/lib/to_source/emitter/concat_arguments.rb +11 -3
  27. data/lib/to_source/emitter/default_arguments.rb +7 -0
  28. data/lib/to_source/emitter/define.rb +46 -8
  29. data/lib/to_source/emitter/defined.rb +7 -0
  30. data/lib/to_source/emitter/element_assignment.rb +10 -1
  31. data/lib/to_source/emitter/element_reference.rb +10 -1
  32. data/lib/to_source/emitter/empty_body.rb +9 -0
  33. data/lib/to_source/emitter/ensure.rb +34 -7
  34. data/lib/to_source/emitter/ensure_body.rb +14 -5
  35. data/lib/to_source/emitter/execute_string.rb +9 -0
  36. data/lib/to_source/emitter/formal_arguments.rb +131 -39
  37. data/lib/to_source/emitter/if.rb +59 -14
  38. data/lib/to_source/emitter/iter.rb +10 -3
  39. data/lib/to_source/emitter/keyword_value.rb +28 -4
  40. data/lib/to_source/emitter/literal.rb +99 -14
  41. data/lib/to_source/emitter/literal/dynamic.rb +88 -13
  42. data/lib/to_source/emitter/loop.rb +14 -11
  43. data/lib/to_source/emitter/match3.rb +7 -0
  44. data/lib/to_source/emitter/module.rb +10 -3
  45. data/lib/to_source/emitter/multiple_assignment.rb +19 -0
  46. data/lib/to_source/emitter/nth_ref.rb +7 -0
  47. data/lib/to_source/emitter/op_assign1.rb +7 -0
  48. data/lib/to_source/emitter/op_assign2.rb +7 -0
  49. data/lib/to_source/emitter/pattern_arguments.rb +7 -0
  50. data/lib/to_source/emitter/rescue.rb +10 -4
  51. data/lib/to_source/emitter/rescue_condition.rb +40 -3
  52. data/lib/to_source/emitter/scope.rb +7 -0
  53. data/lib/to_source/emitter/scope_name.rb +7 -0
  54. data/lib/to_source/emitter/scoped_name.rb +7 -0
  55. data/lib/to_source/emitter/send.rb +71 -5
  56. data/lib/to_source/emitter/send_with_arguments.rb +53 -7
  57. data/lib/to_source/emitter/singleton_class.rb +17 -5
  58. data/lib/to_source/emitter/splat.rb +7 -0
  59. data/lib/to_source/emitter/splat_when.rb +7 -0
  60. data/lib/to_source/emitter/static.rb +19 -0
  61. data/lib/to_source/emitter/super.rb +49 -4
  62. data/lib/to_source/emitter/to_array.rb +7 -0
  63. data/lib/to_source/emitter/to_string.rb +7 -0
  64. data/lib/to_source/emitter/toplevel.rb +9 -0
  65. data/lib/to_source/emitter/unary_operator_method.rb +7 -0
  66. data/lib/to_source/emitter/unless.rb +23 -4
  67. data/lib/to_source/emitter/util.rb +8 -0
  68. data/lib/to_source/emitter/when.rb +28 -3
  69. data/lib/to_source/emitter/yield.rb +9 -0
  70. data/lib/to_source/emitter/z_super.rb +7 -0
  71. data/lib/to_source/state.rb +95 -11
  72. data/spec/unit/to_source/class_methods/run_spec.rb +13 -0
  73. data/to_source.gemspec +1 -1
  74. metadata +3 -4
  75. data/lib/to_source/buffer.rb +0 -40
  76. data/lib/to_source/emitter/receiver_case.rb +0 -35
@@ -1,11 +1,20 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for element reference nodes
3
4
  class ElementReference < self
4
5
 
5
6
  private
6
7
 
8
+ delegate(:receiver)
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
7
16
  def dispatch
8
- visit(node.receiver)
17
+ visit(receiver)
9
18
  emit('[')
10
19
  visit(node.arguments.array.first)
11
20
  emit(']')
@@ -1,9 +1,18 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for empty body
3
4
  class EmptyBody < self
4
5
 
5
6
  handle(Rubinius::AST::EmptyBody)
6
7
 
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
7
16
  def dispatch
8
17
  end
9
18
 
@@ -1,20 +1,47 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for ensure nodes
3
4
  class Ensure < self
4
5
 
5
6
  handle(Rubinius::AST::Ensure)
6
7
 
7
8
  private
8
9
 
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
9
16
  def dispatch
10
- emit('begin')
11
- indent
12
- visit(node.body)
13
- unindent
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
14
41
  emit(:ensure)
15
- indent
16
- visit(node.ensure)
17
- unindent
42
+ indented do
43
+ visit(node.ensure)
44
+ end
18
45
  emit_end
19
46
  end
20
47
 
@@ -1,16 +1,25 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for ensure body
3
4
  class EnsureBody < self
4
5
 
5
6
  private
6
7
 
8
+ delegate(:body)
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
7
16
  def dispatch
8
- visit(node.body)
9
- unindent
10
- emit('ensure')
11
- indent
12
- visit(node.ensure)
17
+ visit(body)
13
18
  unindent
19
+ emit(:ensure)
20
+ indented do
21
+ visit(node.ensure)
22
+ end
14
23
  end
15
24
 
16
25
  end
@@ -1,9 +1,18 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for execute string
3
4
  class ExecuteString < self
4
5
 
5
6
  handle(Rubinius::AST::ExecuteString)
6
7
 
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
7
16
  def dispatch
8
17
  emit("`#{node.string}`")
9
18
  end
@@ -1,112 +1,205 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for formal arguments
3
4
  class FormalArguments < self
4
5
 
5
6
  private
6
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
+ #
7
38
  def any?
8
- required? or defaults? or splat? or block_arg?
39
+ required? || defaults? || splat? || block_arg?
9
40
  end
10
41
 
42
+ # Return required
43
+ #
44
+ # @return [Array]
45
+ #
46
+ # @api private
47
+ #
11
48
  def required
12
49
  arguments.required
13
50
  end
14
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
+ #
15
62
  def required?
16
63
  required.any?
17
64
  end
18
65
 
66
+ # Return defaults
67
+ #
68
+ # @return [Rubinius::AST::Node]
69
+ #
70
+ # @api private
71
+ #
19
72
  def defaults
20
73
  arguments.defaults
21
74
  end
22
75
 
23
- def defaults?
24
- !!defaults
25
- end
26
-
76
+ # Return splat arguments
77
+ #
78
+ # @return [Rubinius::AST::Node]
79
+ #
80
+ # @api private
81
+ #
27
82
  def splat
28
83
  arguments.splat
29
84
  end
30
85
 
31
- def splat?
32
- !!splat
33
- end
34
-
86
+ # Return block argument
87
+ #
88
+ # @return [Rubinius::AST::Node]
89
+ #
90
+ # @api private
91
+ #
35
92
  def block_arg
36
93
  arguments.block_arg
37
94
  end
38
95
 
39
- def block_arg?
40
- !!block_arg
41
- end
42
-
96
+ # Emit required
97
+ #
98
+ # @return [undefined]
99
+ #
100
+ # @api private
101
+ #
43
102
  def emit_required
44
103
  array = required
45
104
  max = array.length - 1
46
105
  array.each_with_index do |member, index|
47
- if member.kind_of?(Rubinius::AST::Node)
48
- visit(member)
49
- else
50
- emit(member)
51
- end
106
+ emit_member(member)
52
107
  emit(', ') if index < max
53
108
  end
54
109
  end
55
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
+ #
56
133
  def emit_defaults
57
134
  return unless defaults?
58
135
  emit(', ') if required?
59
136
  visit(defaults)
60
137
  end
61
138
 
139
+ # Emit splat
140
+ #
141
+ # @return [undefined]
142
+ #
143
+ # @api private
144
+ #
62
145
  def emit_splat
63
146
  return unless splat?
64
147
 
65
148
  emit(', ') if required? or defaults?
66
149
  emit('*')
67
- value = splat
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)
68
162
  unless value == :@unnamed_splat
69
163
  emit(value)
70
164
  end
71
165
  end
72
166
 
167
+ # Emit block arg
168
+ #
169
+ # @return [undefined]
170
+ #
171
+ # @api private
172
+ #
73
173
  def emit_block_arg
74
174
  return unless block_arg?
75
175
  emit(', ') if required? or defaults? or splat?
76
176
  visit(block_arg)
77
177
  end
78
178
 
79
- def arguments
80
- node.arguments
81
- end
82
-
83
- def dispatch
84
- return unless any?
85
-
86
- util = self.class
87
-
88
- emit(util::OPEN)
89
-
90
- emit_required
91
- emit_defaults
92
- emit_splat
93
- emit_block_arg
94
-
95
- emit(util::CLOSE)
96
- end
97
-
179
+ # Emmiter for block arguments
98
180
  class Block < self
99
181
  OPEN = ' |'.freeze
100
182
  CLOSE = '|'.freeze
101
183
  end
102
184
 
185
+ # Emitter for method arguments
103
186
  class Method < self
104
187
  OPEN = '('.freeze
105
188
  CLOSE = ')'.freeze
106
189
 
190
+ # Generic emitter for method arguments
107
191
  class Generic < self
192
+
108
193
  handle(Rubinius::AST::FormalArguments19)
109
194
 
195
+ private
196
+
197
+ # Return arguments
198
+ #
199
+ # @return [Rubnius::AST::Node]
200
+ #
201
+ # @api private
202
+ #
110
203
  def arguments
111
204
  node
112
205
  end
@@ -114,7 +207,6 @@ module ToSource
114
207
  end
115
208
 
116
209
  end
117
-
118
210
  end
119
211
  end
120
212
  end
@@ -1,19 +1,18 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for if nodes
3
4
  class If < self
4
5
 
5
6
  handle(Rubinius::AST::If)
6
7
 
7
8
  private
8
9
 
9
- def if_branch?
10
- !node.body.kind_of?(Rubinius::AST::NilLiteral)
11
- end
12
-
13
- def else_branch?
14
- !node.else.kind_of?(Rubinius::AST::NilLiteral)
15
- end
16
-
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
17
16
  def dispatch
18
17
  if else_branch? and !if_branch?
19
18
  run(Unless, node)
@@ -23,6 +22,40 @@ module ToSource
23
22
  normal_dispatch
24
23
  end
25
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
+ #
26
59
  def normal_dispatch
27
60
  emit('if ')
28
61
  visit(node.condition)
@@ -31,19 +64,31 @@ module ToSource
31
64
  emit('end')
32
65
  end
33
66
 
67
+ # Emit if brnach
68
+ #
69
+ # @return [undefined]
70
+ #
71
+ # @api private
72
+ #
34
73
  def emit_if_branch
35
- indent
36
- visit(node.body)
37
- unindent
74
+ indented do
75
+ visit(node.body)
76
+ end
38
77
  end
39
78
 
79
+ # Emit else branch
80
+ #
81
+ # @return [undefined]
82
+ #
83
+ # @api private
84
+ #
40
85
  def emit_else_branch
41
86
  body = node.else
42
87
  return unless else_branch?
43
88
  emit('else')
44
- indent
45
- visit(body)
46
- unindent
89
+ indented do
90
+ visit(body)
91
+ end
47
92
  end
48
93
 
49
94
  end