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
@@ -0,0 +1,29 @@
1
+ module ToSource
2
+ class Emitter
3
+ class Assignment
4
+ # Emitter for various variabe assignments
5
+ class Variable < self
6
+
7
+ handle(Rubinius::AST::LocalVariableAssignment)
8
+ handle(Rubinius::AST::InstanceVariableAssignment)
9
+ handle(Rubinius::AST::GlobalVariableAssignment)
10
+ handle(Rubinius::AST::ClassVariableAssignment)
11
+
12
+ private
13
+
14
+ delegate(:value)
15
+
16
+ # Emit target
17
+ #
18
+ # @return [undefined]
19
+ #
20
+ # @api private
21
+ #
22
+ def emit_target
23
+ emit(node.name)
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,54 @@
1
+ module ToSource
2
+ class Emitter
3
+
4
+ # Base class for assignment operators
5
+ class AssignmentOperator < self
6
+
7
+ private
8
+
9
+ delegate(:left, :right)
10
+
11
+ # Perform dispatch
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ parantheses do
19
+ visit(left)
20
+ emit(" #{self.class::SYMBOL} ")
21
+ emit_right
22
+ end
23
+ end
24
+
25
+ # Emit right
26
+ #
27
+ # @return [undefined]
28
+ #
29
+ # @api private
30
+ #
31
+ def emit_right
32
+ parantheses do
33
+ visit(right.value)
34
+ end
35
+ end
36
+
37
+ # Emitter for or assigmnent operator
38
+ class Or < self
39
+
40
+ handle(Rubinius::AST::OpAssignOr19)
41
+ SYMBOL = :'||='
42
+
43
+ end
44
+
45
+ # Emitter for and assigmnent operator
46
+ class And < self
47
+
48
+ handle(Rubinius::AST::OpAssignAnd)
49
+ SYMBOL = :'&&='
50
+
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,23 @@
1
+ module ToSource
2
+ class Emitter
3
+
4
+ # Emitter for various access nodes
5
+ class BackRef < self
6
+
7
+ handle(Rubinius::AST::BackRef)
8
+
9
+ private
10
+
11
+ # Perform dispatch
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ emit("$#{node.kind}")
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -5,6 +5,23 @@ module ToSource
5
5
 
6
6
  private
7
7
 
8
+ delegate(:arguments)
9
+ predicate(:splat)
10
+
11
+ # Return splat
12
+ #
13
+ # @return [Rubinius::AST::Node]
14
+ # if splat is present
15
+ #
16
+ # @return [nil]
17
+ # otherwise
18
+ #
19
+ # @api private
20
+ #
21
+ def splat
22
+ arguments.splat
23
+ end
24
+
8
25
  # Perform dispatch
9
26
  #
10
27
  # @return [undefined]
@@ -14,11 +31,26 @@ module ToSource
14
31
  def dispatch
15
32
  parantheses do
16
33
  emit_left
17
- emit(" #{node.name} ")
34
+ emit_operator
18
35
  emit_right
19
36
  end
20
37
  end
21
38
 
39
+ # Emit operator
40
+ #
41
+ # @return [self]
42
+ #
43
+ # @api private
44
+ #
45
+ def emit_operator
46
+ name = node.name
47
+ if splat?
48
+ emit(".#{name}")
49
+ else
50
+ emit(" #{name} ")
51
+ end
52
+ end
53
+
22
54
  # Emit right
23
55
  #
24
56
  # @return [undefined]
@@ -50,7 +82,11 @@ module ToSource
50
82
  # @api private
51
83
  #
52
84
  def right
53
- node.arguments.array.first
85
+ if splat?
86
+ splat
87
+ else
88
+ arguments.array.first
89
+ end
54
90
  end
55
91
 
56
92
  end
@@ -0,0 +1,50 @@
1
+ module ToSource
2
+ class Emitter
3
+
4
+ # Emitter for collect splat nodes
5
+ class CollectSplat < self
6
+
7
+ handle(Rubinius::AST::CollectSplat)
8
+
9
+ private
10
+
11
+ # Perform dispatch
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ emit_splat
19
+ emit(', ')
20
+ emit_last
21
+ end
22
+
23
+ # Emit splat
24
+ #
25
+ # @return [undefined]
26
+ #
27
+ # @api private
28
+ #
29
+ def emit_last
30
+ # FIXME: Add attr reader
31
+ visit(node.instance_variable_get(:@last))
32
+ end
33
+
34
+ # Emit splat
35
+ #
36
+ # @return [undefined]
37
+ #
38
+ # @api private
39
+ #
40
+ def emit_splat
41
+ splat = node.instance_variable_get(:@splat)
42
+ if splat.kind_of?(Rubinius::AST::PushArgs)
43
+ run(PushArgs, splat)
44
+ else
45
+ visit(splat)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -17,12 +17,27 @@ module ToSource
17
17
  #
18
18
  def dispatch
19
19
  emit('[')
20
- run(Util::DelimitedBody, node.array.body)
20
+ emit_array_body
21
21
  emit(', *')
22
22
  visit(rest)
23
23
  emit(']')
24
24
  end
25
25
 
26
+ # Emit array body
27
+ #
28
+ # @return [undefined]
29
+ #
30
+ # @api private
31
+ #
32
+ def emit_array_body
33
+ array = node.array
34
+ case array
35
+ when Rubinius::AST::ArrayLiteral
36
+ run(Util::DelimitedBody, array.body)
37
+ else
38
+ visit(array)
39
+ end
40
+ end
26
41
  end
27
42
  end
28
43
  end
@@ -16,7 +16,7 @@ module ToSource
16
16
  def dispatch
17
17
  visit(receiver)
18
18
  emit('[')
19
- visit(node.arguments.array.first)
19
+ visit(node.arguments)
20
20
  emit(']')
21
21
  end
22
22
 
@@ -0,0 +1,61 @@
1
+ module ToSource
2
+ class Emitter
3
+ class Flip < self
4
+
5
+ private
6
+
7
+ # Perform dispatch
8
+ #
9
+ # @return [undefined]
10
+ #
11
+ # @api private
12
+ #
13
+ def dispatch
14
+ emit_start
15
+ emit(self.class::SYMBOL)
16
+ emit_finish
17
+ end
18
+
19
+ # Emit start
20
+ #
21
+ # @return [undefined]
22
+ #
23
+ # @api private
24
+ #
25
+ def emit_start
26
+ parantheses do
27
+ # FIXME: Add reader
28
+ visit(node.instance_variable_get(:@start))
29
+ end
30
+ end
31
+
32
+ # Emit finish
33
+ #
34
+ # @return [undefined]
35
+ #
36
+ # @api private
37
+ #
38
+ def emit_finish
39
+ parantheses do
40
+ # FIXME: Add reader
41
+ visit(node.instance_variable_get(:@finish))
42
+ end
43
+ end
44
+
45
+ class Flip2 < self
46
+
47
+ handle(Rubinius::AST::Flip2)
48
+ SYMBOL = :'..'
49
+
50
+ end
51
+
52
+ class Flip3 < self
53
+
54
+ handle(Rubinius::AST::Flip3)
55
+ SYMBOL = :'...'
56
+
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,98 @@
1
+ module ToSource
2
+ class Emitter
3
+ class ForArguments < self
4
+
5
+ handle(Rubinius::AST::For19Arguments)
6
+
7
+ private
8
+
9
+ # Perform dispatch
10
+ #
11
+ # @return [undefined]
12
+ #
13
+ # @api private
14
+ #
15
+ def dispatch
16
+ visit(arguments)
17
+ end
18
+
19
+ # Return arguments
20
+ #
21
+ # @return [Rubinius::AST::Node]
22
+ #
23
+ # @api private
24
+ #
25
+ def arguments
26
+ # FIXME: Add accessor
27
+ node.instance_variable_get(:@arguments)
28
+ end
29
+
30
+ end
31
+
32
+ class For < self
33
+
34
+ private
35
+
36
+ delegate(:block, :receiver, :privately)
37
+
38
+ # Return block arguments
39
+ #
40
+ # @return [Rubinius::AST::ActualArguments]
41
+ #
42
+ # @api private
43
+ #
44
+ def block_arguments
45
+ block.arguments
46
+ end
47
+
48
+ # Perform dispatch
49
+ #
50
+ # @return [undefined]
51
+ #
52
+ # @api private
53
+ #
54
+ def dispatch
55
+ emit('for ')
56
+ visit(block_arguments)
57
+ emit(' in ')
58
+ emit_receiver
59
+ visit(block)
60
+ end
61
+
62
+ # Emit receiver
63
+ #
64
+ # @return [undefined]
65
+ #
66
+ # @api private
67
+ #
68
+ def emit_receiver
69
+ return if privately
70
+ visit(receiver)
71
+ end
72
+
73
+ end
74
+
75
+ class For19 < self
76
+
77
+ handle(Rubinius::AST::For19)
78
+
79
+ private
80
+
81
+ # Perform dispatch
82
+ #
83
+ # @return [undefined]
84
+ #
85
+ # @api private
86
+ #
87
+ def dispatch
88
+ emit(' do')
89
+ indented do
90
+ visit(node.body)
91
+ end
92
+ emit_end
93
+ end
94
+
95
+ end
96
+ end
97
+ end
98
+
@@ -1,7 +1,29 @@
1
1
  module ToSource
2
2
  class Emitter
3
- # Emitter for iter nodes
3
+
4
4
  class Iter < self
5
+ handle(Rubinius::AST::Iter)
6
+
7
+ private
8
+
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit(' do')
18
+ indented do
19
+ visit(node.body)
20
+ end
21
+ emit_end
22
+ end
23
+ end
24
+
25
+ # Emitter for iter nodes
26
+ class Iter19 < self
5
27
 
6
28
  handle(Rubinius::AST::Iter19)
7
29