to_source 0.2.15 → 0.2.16

Sign up to get free protection for your applications and to get access to all the features.
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