to_source 0.2.16 → 0.2.17

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 (42) hide show
  1. data/.rspec +1 -0
  2. data/Changelog.md +34 -1
  3. data/bin/to_source +2 -8
  4. data/config/flay.yml +1 -1
  5. data/config/site.reek +5 -0
  6. data/lib/to_source.rb +17 -3
  7. data/lib/to_source/emitter.rb +5 -1
  8. data/lib/to_source/emitter/alias.rb +23 -0
  9. data/lib/to_source/emitter/assignment.rb +23 -84
  10. data/lib/to_source/emitter/assignment/attribute.rb +52 -0
  11. data/lib/to_source/emitter/assignment/constant.rb +26 -0
  12. data/lib/to_source/emitter/assignment/element.rb +124 -0
  13. data/lib/to_source/emitter/assignment/variable.rb +29 -0
  14. data/lib/to_source/emitter/assignment_operator.rb +54 -0
  15. data/lib/to_source/emitter/back_ref.rb +23 -0
  16. data/lib/to_source/emitter/binary_operator_method.rb +38 -2
  17. data/lib/to_source/emitter/collect_splat.rb +50 -0
  18. data/lib/to_source/emitter/concat_arguments.rb +16 -1
  19. data/lib/to_source/emitter/element_reference.rb +1 -1
  20. data/lib/to_source/emitter/flip.rb +61 -0
  21. data/lib/to_source/emitter/for.rb +98 -0
  22. data/lib/to_source/emitter/iter.rb +23 -1
  23. data/lib/to_source/emitter/literal.rb +1 -18
  24. data/lib/to_source/emitter/literal/dynamic.rb +0 -23
  25. data/lib/to_source/emitter/literal/dynamic/regexp.rb +69 -0
  26. data/lib/to_source/emitter/literal/regexp.rb +27 -0
  27. data/lib/to_source/emitter/literal/regexp/options.rb +71 -0
  28. data/lib/to_source/emitter/match.rb +21 -0
  29. data/lib/to_source/emitter/match2.rb +25 -0
  30. data/lib/to_source/emitter/multiple_assignment.rb +43 -4
  31. data/lib/to_source/emitter/op_assign1.rb +37 -5
  32. data/lib/to_source/emitter/push_args.rb +42 -0
  33. data/lib/to_source/emitter/send.rb +21 -16
  34. data/lib/to_source/emitter/splat.rb +40 -1
  35. data/lib/to_source/emitter/static.rb +32 -0
  36. data/lib/to_source/emitter/toplevel.rb +2 -1
  37. data/lib/to_source/emitter/undef.rb +26 -0
  38. data/spec/unit/to_source/class_methods/run_spec.rb +245 -20
  39. data/to_source.gemspec +1 -1
  40. metadata +18 -4
  41. data/lib/to_source/emitter/attribute_assignment.rb +0 -28
  42. data/lib/to_source/emitter/element_assignment.rb +0 -29
@@ -171,24 +171,6 @@ module ToSource
171
171
  end
172
172
  end
173
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
174
  # Emitter for string litera nodes
193
175
  class String < self
194
176
 
@@ -212,6 +194,7 @@ module ToSource
212
194
  class PassThrough < self
213
195
 
214
196
  handle(Rubinius::AST::FixnumLiteral)
197
+ handle(Rubinius::AST::NumberLiteral)
215
198
  handle(Rubinius::AST::FloatLiteral)
216
199
 
217
200
  private
@@ -149,29 +149,6 @@ module ToSource
149
149
  OPEN = CLOSE = '`'.freeze
150
150
 
151
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
152
  end
176
153
  end
177
154
  end
@@ -0,0 +1,69 @@
1
+ module ToSource
2
+ class Emitter
3
+ class Literal
4
+ class Dynamic
5
+
6
+ # Emitter for dynamic regexp literals
7
+ class Regex < self
8
+
9
+ handle(Rubinius::AST::DynamicRegex)
10
+ OPEN = CLOSE = '/'.freeze
11
+
12
+ private
13
+
14
+ # Perform dispatch
15
+ #
16
+ # @return [undefined]
17
+ #
18
+ # @api private
19
+ #
20
+ def dispatch
21
+ super
22
+ emit_flags
23
+ end
24
+
25
+ # Emit flags
26
+ #
27
+ # @return [undefined]
28
+ #
29
+ # @api private
30
+ #
31
+ def emit_flags
32
+ run(Literal::Regexp::Options, node.options)
33
+ end
34
+
35
+ # Emit literal
36
+ #
37
+ # @param [String] literal
38
+ #
39
+ # @return [undefined]
40
+ #
41
+ # @api private
42
+ #
43
+ def emit_literal(literal)
44
+ emit(literal)
45
+ end
46
+
47
+ class Once < self
48
+
49
+ handle(Rubinius::AST::DynamicOnceRegex)
50
+
51
+ private
52
+
53
+ # Emit flags
54
+ #
55
+ # @return [undefined]
56
+ #
57
+ # @api private
58
+ #
59
+ def emit_flags
60
+ emit('o')
61
+ super
62
+ end
63
+
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,27 @@
1
+ module ToSource
2
+ class Emitter
3
+ class Literal
4
+ # Emitter for regexp literal nodes
5
+ class Regexp < self
6
+
7
+ handle(Rubinius::AST::RegexLiteral)
8
+
9
+ private
10
+
11
+ delegate(:options)
12
+
13
+ # Perform dispatch
14
+ #
15
+ # @return [undefined]
16
+ #
17
+ # @api private
18
+ #
19
+ def dispatch
20
+ emit("/#{node.source}/")
21
+ run(Options, options)
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,71 @@
1
+ module ToSource
2
+ class Emitter
3
+ class Literal
4
+ class Regexp
5
+ class Options < Emitter
6
+
7
+ # No constants for this under ::Regexp in MRI
8
+ # So stole this from nice player rubinius kernel/common/regexp.rb
9
+ KCODE_NONE = (1 << 9)
10
+ KCODE_EUC = (2 << 9)
11
+ KCODE_SJIS = (3 << 9)
12
+ KCODE_UTF8 = (4 << 9)
13
+ KCODE_MASK = KCODE_NONE | KCODE_EUC | KCODE_SJIS | KCODE_UTF8
14
+
15
+ GENERIC = IceNine.deep_freeze(
16
+ ::Regexp::EXTENDED => 'x',
17
+ # FIXME: Documented but no option flag?
18
+ #::Regexp::FIXEDENCODING => '',
19
+ ::Regexp::IGNORECASE => 'i',
20
+ ::Regexp::MULTILINE => 'm'
21
+ )
22
+
23
+ KCODES = IceNine.deep_freeze(
24
+ KCODE_NONE => 'n',
25
+ KCODE_EUC => 'e',
26
+ KCODE_SJIS => 's',
27
+ KCODE_UTF8 => 'u'
28
+ )
29
+
30
+ private
31
+
32
+ # Perform dispatch
33
+ #
34
+ # @return [self]
35
+ #
36
+ # @api private
37
+ #
38
+ def dispatch
39
+ emit_generic_flags
40
+ emit_kcode_flag
41
+ end
42
+
43
+ # Emit kcode flag
44
+ #
45
+ # @return [undefined]
46
+ #
47
+ # @api private
48
+ #
49
+ def emit_kcode_flag
50
+ emit(KCODES.fetch(node & KCODE_MASK, ''))
51
+ end
52
+
53
+ # Emit generic flags
54
+ #
55
+ # @return [undefined]
56
+ #
57
+ # @api private
58
+ #
59
+ def emit_generic_flags
60
+ GENERIC.each do |option, flag|
61
+ unless (node & option).zero?
62
+ emit(flag)
63
+ end
64
+ end
65
+ end
66
+
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,21 @@
1
+ module ToSource
2
+ class Emitter
3
+ class Match < self
4
+
5
+ handle(Rubinius::AST::Match)
6
+
7
+ private
8
+
9
+ # Perform dispatch
10
+ #
11
+ # @return [undefined]
12
+ #
13
+ # @api private
14
+ #
15
+ def dispatch
16
+ visit(node.pattern)
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for match operator
4
+ class Match2 < self
5
+
6
+ handle(Rubinius::AST::Match2)
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.pattern)
19
+ emit(' =~ ')
20
+ visit(util.value)
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -1,5 +1,25 @@
1
1
  module ToSource
2
2
  class Emitter
3
+
4
+ class Splat < self
5
+ handle(Rubinius::AST::SplatArray)
6
+ handle(Rubinius::AST::SplatAssignment)
7
+ handle(Rubinius::AST::SplatWrapped)
8
+
9
+ private
10
+
11
+ # Perform dispatch
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ emit('*')
19
+ visit(node.value)
20
+ end
21
+ end
22
+
3
23
  # Emitter for multiple assignment nodes
4
24
  class MultipleAssignment < self
5
25
 
@@ -7,6 +27,9 @@ module ToSource
7
27
 
8
28
  private
9
29
 
30
+ delegate(:right, :splat, :left)
31
+ predicate(:right, :splat, :left)
32
+
10
33
  # Perform dispatch
11
34
  #
12
35
  # @return [undefined]
@@ -15,8 +38,11 @@ module ToSource
15
38
  #
16
39
  def dispatch
17
40
  emit_left
18
- emit(' = ')
19
- emit_right
41
+ emit_splat
42
+ if right?
43
+ emit(' = ')
44
+ emit_right
45
+ end
20
46
  end
21
47
 
22
48
  # Emit left
@@ -26,10 +52,23 @@ module ToSource
26
52
  # @api private
27
53
  #
28
54
  def emit_left
29
- run(Util::DelimitedBody, node.left.body)
55
+ return unless left?
56
+ run(Util::DelimitedBody, left.body)
30
57
  end
31
58
 
32
- # Emit left
59
+ # Emit splat
60
+ #
61
+ # @return [undefined]
62
+ #
63
+ # @api private
64
+ #
65
+ def emit_splat
66
+ return unless splat?
67
+ emit(', ') if left?
68
+ visit(splat)
69
+ end
70
+
71
+ # Emit right
33
72
  #
34
73
  # @return [undefined]
35
74
  #
@@ -7,6 +7,8 @@ module ToSource
7
7
 
8
8
  private
9
9
 
10
+ delegate(:receiver, :value)
11
+
10
12
  # Perform dispatch
11
13
  #
12
14
  # @return [undefined]
@@ -14,12 +16,42 @@ module ToSource
14
16
  # @api private
15
17
  #
16
18
  def dispatch
17
- util = node
18
- visit(util.receiver)
19
+ visit(receiver)
19
20
  emit('[')
20
- visit(util.arguments.array.first)
21
- emit('] ||= ')
22
- visit(util.value)
21
+ emit_index
22
+ emit("] #{operator} ")
23
+ visit(value)
24
+ end
25
+
26
+ # Emit index
27
+ #
28
+ # @return [undefined]
29
+ #
30
+ # @api private
31
+ #
32
+ def emit_index
33
+ arguments = node.arguments
34
+ array = arguments.array
35
+ if array.any?
36
+ visit(array.first)
37
+ return
38
+ end
39
+ end
40
+
41
+ MAPPING = {
42
+ :or => :'||',
43
+ :and => :'&&'
44
+ }.freeze
45
+
46
+ # Return operator
47
+ #
48
+ # @return [String]
49
+ #
50
+ # @api private
51
+ #
52
+ def operator
53
+ op = node.op
54
+ "#{MAPPING.fetch(op, op)}="
23
55
  end
24
56
 
25
57
  end
@@ -0,0 +1,42 @@
1
+ module ToSource
2
+ class Emitter
3
+
4
+ class PushArgs < self
5
+
6
+ private
7
+
8
+ delegate(:arguments, :value)
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ visit(arguments)
18
+ emit(', ')
19
+ visit(value)
20
+ end
21
+
22
+ class Array < self
23
+
24
+ handle(Rubinius::AST::PushArgs)
25
+
26
+ private
27
+
28
+ # Perform dispatch
29
+ #
30
+ # @return [undefined]
31
+ #
32
+ # @api private
33
+ #
34
+ def dispatch
35
+ emit('[')
36
+ super
37
+ emit(']')
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end