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,17 +1,24 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for iter nodes
3
4
  class Iter < self
4
5
 
5
6
  handle(Rubinius::AST::Iter19)
6
7
 
7
8
  private
8
9
 
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
9
16
  def dispatch
10
17
  emit(' do')
11
18
  run(FormalArguments::Block)
12
- indent
13
- visit(node.body)
14
- unindent
19
+ indented do
20
+ visit(node.body)
21
+ end
15
22
  emit_end
16
23
  end
17
24
 
@@ -1,10 +1,17 @@
1
1
  module ToSource
2
2
  class Emitter
3
3
 
4
+ # Base class for keyword with value emitters
4
5
  class KeywordValue < self
5
6
 
6
7
  private
7
8
 
9
+ # Perform dispatch
10
+ #
11
+ # @return [undefined]
12
+ #
13
+ # @api private
14
+ #
8
15
  def dispatch
9
16
  emit(self.class::SYMBOL)
10
17
  if value?
@@ -14,23 +21,41 @@ module ToSource
14
21
  end
15
22
  end
16
23
 
24
+ # Emitter for return nodes
17
25
  class Return < self
18
- SYMBOL = :return
26
+
19
27
  handle(Rubinius::AST::Return)
28
+ SYMBOL = :return
20
29
 
21
30
  private
22
-
31
+
32
+ # Perform dispatch
33
+ #
34
+ # @return [undefined]
35
+ #
36
+ # @api private
37
+ #
23
38
  def value?
24
39
  !!node.value
25
40
  end
26
41
  end
27
42
 
43
+ # Emitter for break nodes
28
44
  class Break < self
29
45
 
30
46
  handle(Rubinius::AST::Break)
31
-
32
47
  SYMBOL = :break
33
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
+ #
34
59
  def value?
35
60
  !node.value.kind_of?(Rubinius::AST::NilLiteral)
36
61
  end
@@ -38,6 +63,5 @@ module ToSource
38
63
  end
39
64
 
40
65
  end
41
-
42
66
  end
43
67
  end
@@ -1,22 +1,39 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Base class for literal emitters
3
4
  class Literal < self
4
5
 
6
+ # Emitter for empty array nodes
5
7
  class EmptyArray < self
6
8
 
7
9
  handle(Rubinius::AST::EmptyArray)
8
10
 
11
+ private
12
+
13
+ # Perform dispatch
14
+ #
15
+ # @return [undefined]
16
+ #
17
+ # @api private
18
+ #
9
19
  def dispatch
10
20
  emit('[]')
11
21
  end
12
22
  end
13
23
 
24
+ # Emitter for array nodes
14
25
  class Array < self
15
26
 
16
27
  handle(Rubinius::AST::ArrayLiteral)
17
28
 
18
29
  private
19
-
30
+
31
+ # Perform dispatch
32
+ #
33
+ # @return [undefined]
34
+ #
35
+ # @api private
36
+ #
20
37
  def dispatch
21
38
  emit('[')
22
39
  run(Util::DelimitedBody, node.body)
@@ -24,45 +41,67 @@ module ToSource
24
41
  end
25
42
  end
26
43
 
44
+ # Base class for range emitters
27
45
  class Range < self
28
46
 
29
47
  private
30
-
48
+
49
+ # Perform dispatch
50
+ #
51
+ # @return [undefined]
52
+ #
53
+ # @api private
54
+ #
31
55
  def dispatch
32
56
  util = node
33
57
  visit(util.start)
34
- emit(token)
58
+ emit(self.class::TOKEN)
35
59
  visit(util.finish)
36
60
  end
37
61
 
38
- def token
39
- self.class::TOKEN
40
- end
41
-
62
+ # Emitter for incluive range nodes
42
63
  class Inclusive < self
64
+
43
65
  handle(Rubinius::AST::Range)
44
- TOKEN = '..'
66
+ TOKEN = '..'.freeze
67
+
45
68
  end
46
69
 
70
+ # Emitter for exclusive range nodes
47
71
  class Exclude < self
72
+
48
73
  handle(Rubinius::AST::RangeExclude)
49
- TOKEN = '...'
74
+ TOKEN = '...'.freeze
75
+
50
76
  end
51
77
 
52
78
  end
53
79
 
80
+ # Emitter for hash nodes
54
81
  class Hash < self
55
82
 
56
83
  handle(Rubinius::AST::HashLiteral)
57
84
 
58
85
  private
59
-
86
+
87
+ # Perform dispatch
88
+ #
89
+ # @return [undefined]
90
+ #
91
+ # @api private
92
+ #
60
93
  def dispatch
61
94
  emit '{'
62
95
  emit_body
63
96
  emit '}'
64
97
  end
65
98
 
99
+ # Emit body
100
+ #
101
+ # @return [undefined]
102
+ #
103
+ # @api private
104
+ #
66
105
  def emit_body
67
106
  body = node.array.each_slice(2).to_a
68
107
  max = body.length - 1
@@ -79,64 +118,110 @@ module ToSource
79
118
 
80
119
  end
81
120
 
121
+ # Base class for emiiters that emit via #inspect
82
122
  class Inspect < self
83
123
 
84
124
  handle(Rubinius::AST::SymbolLiteral)
85
125
 
126
+ private
127
+
128
+ # Perform dispatch
129
+ #
130
+ # @return [undefined]
131
+ #
132
+ # @api private
133
+ #
86
134
  def dispatch
87
135
  emit(value.inspect)
88
136
  end
89
137
 
90
- def value
91
- node.value
92
- end
138
+ delegate :value
93
139
 
140
+ # Base class for emitters with static value
94
141
  class Static < self
142
+
143
+ private
144
+
145
+ # Return value
146
+ #
147
+ # @return [Object]
148
+ #
149
+ # @api private
150
+ #
95
151
  def value
96
152
  self.class::VALUE
97
153
  end
98
154
 
155
+ # Emitter for true literal nodes
99
156
  class True < self
100
157
  handle(Rubinius::AST::TrueLiteral)
101
158
  VALUE = true
102
159
  end
103
160
 
161
+ # Emitter for false literal nodes
104
162
  class False < self
105
163
  handle(Rubinius::AST::FalseLiteral)
106
164
  VALUE = false
107
165
  end
108
166
 
167
+ # Emitter for nil literal nodes
109
168
  class Nil < self
110
169
  handle(Rubinius::AST::NilLiteral)
111
170
  VALUE = nil
112
171
  end
113
172
  end
114
173
 
174
+ # Emitter for regexp literal nodes
115
175
  class Regexp < self
116
176
 
117
177
  handle(Rubinius::AST::RegexLiteral)
118
178
 
179
+ private
180
+
181
+ # Return value to inspect
182
+ #
183
+ # @return [Regexp]
184
+ #
185
+ # @api private
186
+ #
119
187
  def value
120
188
  ::Regexp.new(node.source)
121
189
  end
122
190
  end
123
191
 
192
+ # Emitter for string litera nodes
124
193
  class String < self
125
194
 
126
195
  handle(Rubinius::AST::StringLiteral)
127
196
 
197
+ private
198
+
199
+ # Return value to inspect
200
+ #
201
+ # @return [String]
202
+ #
203
+ # @api private
204
+ #
128
205
  def value
129
206
  node.string
130
207
  end
131
208
  end
132
209
  end
133
210
 
134
-
211
+ # Emitters that emitt via vlaue pass through
135
212
  class PassThrough < self
136
213
 
137
214
  handle(Rubinius::AST::FixnumLiteral)
138
215
  handle(Rubinius::AST::FloatLiteral)
139
216
 
217
+ private
218
+
219
+ # Perform dispatch
220
+ #
221
+ # @return [undefined]
222
+ #
223
+ # @api private
224
+ #
140
225
  def dispatch
141
226
  emit(node.value)
142
227
  end
@@ -1,10 +1,17 @@
1
1
  module ToSource
2
2
  class Emitter
3
3
  class Literal
4
+ # Base class for dynamic literal emitters
4
5
  class Dynamic < self
5
6
 
6
7
  private
7
-
8
+
9
+ # Perform dispatch
10
+ #
11
+ # @return [undefined]
12
+ #
13
+ # @api private
14
+ #
8
15
  def dispatch
9
16
  emit_open
10
17
  emit_first
@@ -12,37 +19,91 @@ module ToSource
12
19
  emit_close
13
20
  end
14
21
 
22
+ # Emit open
23
+ #
24
+ # @return [undefined]
25
+ #
26
+ # @api private
27
+ #
15
28
  def emit_open
16
29
  emit(self.class::OPEN)
17
30
  end
18
31
 
32
+ # Emit close
33
+ #
34
+ # @return [undefined]
35
+ #
36
+ # @api private
37
+ #
19
38
  def emit_close
20
39
  emit(self.class::CLOSE)
21
40
  end
22
41
 
42
+ # Return first value
43
+ #
44
+ # @return [String]
45
+ #
46
+ # @api private
47
+ #
23
48
  def first_value
24
49
  node.string
25
50
  end
26
51
 
52
+ # Emit literal
53
+ #
54
+ # @param [Object] literal
55
+ #
56
+ # @return [undefined]
57
+ #
58
+ # @api private
59
+ #
27
60
  def emit_literal(literal)
28
61
  emit(literal.inspect[1..-2])
29
62
  end
30
63
 
64
+ # Emit literal node
65
+ #
66
+ # @param [Rubinius::AST::Node] node
67
+ #
68
+ # @return [undefined]
69
+ #
70
+ # @api private
71
+ #
31
72
  def emit_literal_node(node)
32
73
  emit_literal(node.string)
33
74
  end
34
75
 
76
+ # Emit first
77
+ #
78
+ # @return [undefined]
79
+ #
80
+ # @api private
81
+ #
35
82
  def emit_first
36
83
  emit_literal(first_value)
37
84
  end
38
85
 
86
+ # Emit segments
87
+ #
88
+ # @return [undefined]
89
+ #
90
+ # @api private
91
+ #
39
92
  def emit_segments
40
- array.each_with_index do |segment, index|
41
- emit_segment(segment, index)
93
+ array.each do |segment|
94
+ emit_segment(segment)
42
95
  end
43
96
  end
44
97
 
45
- def emit_segment(segment, index)
98
+ # Emit segment
99
+ #
100
+ # @param [Rubinius::AST::Node] segment
101
+ #
102
+ # @return [undefined]
103
+ #
104
+ # @api private
105
+ #
106
+ def emit_segment(segment)
46
107
  case segment
47
108
  when Rubinius::AST::StringLiteral
48
109
  emit_literal_node(segment)
@@ -51,46 +112,60 @@ module ToSource
51
112
  end
52
113
  end
53
114
 
54
- def array
55
- node.array
56
- end
115
+ delegate :array
57
116
 
117
+ # Return max segment number
118
+ #
119
+ # @return [Fixnum]
120
+ #
121
+ # @api private
122
+ #
58
123
  def max
59
124
  array.length - 1
60
125
  end
61
126
  memoize :max
62
127
 
128
+ # Emitter for dynamic symbol literals
63
129
  class Symbol < self
64
130
 
65
131
  handle(Rubinius::AST::DynamicSymbol)
66
-
67
- OPEN = ':"'
68
- CLOSE = '"'
132
+ OPEN = ':"'.freeze
133
+ CLOSE = '"'.freeze
69
134
 
70
135
  end
71
136
 
137
+ # Emitter for dynamic string literals
72
138
  class String < self
73
139
 
74
140
  handle(Rubinius::AST::DynamicString)
75
-
76
141
  OPEN = CLOSE = '"'.freeze
77
142
 
78
143
  end
79
144
 
145
+ # Emitter for dynamic execute string literals
80
146
  class Execute < self
81
147
 
82
148
  handle(Rubinius::AST::DynamicExecuteString)
83
-
84
149
  OPEN = CLOSE = '`'.freeze
85
150
 
86
151
  end
87
152
 
153
+ # Emitter for dynamic regexp literals
88
154
  class Regex < self
89
155
 
156
+ handle(Rubinius::AST::DynamicRegex)
90
157
  OPEN = CLOSE = '/'.freeze
91
158
 
92
- handle(Rubinius::AST::DynamicRegex)
159
+ private
93
160
 
161
+ # Emit literal
162
+ #
163
+ # @param [String] literal
164
+ #
165
+ # @return [undefined]
166
+ #
167
+ # @api private
168
+ #
94
169
  def emit_literal(literal)
95
170
  emit(literal)
96
171
  end