to_source 0.1.3 → 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 (89) hide show
  1. data/.gitignore +6 -6
  2. data/.rspec +1 -0
  3. data/.travis.yml +12 -1
  4. data/Changelog.md +115 -0
  5. data/Gemfile +5 -3
  6. data/Gemfile.devtools +67 -0
  7. data/Guardfile +18 -0
  8. data/LICENSE +21 -0
  9. data/README.md +52 -0
  10. data/Rakefile +3 -8
  11. data/TODO +9 -0
  12. data/bin/to_source +17 -0
  13. data/config/flay.yml +3 -0
  14. data/config/flog.yml +2 -0
  15. data/config/roodi.yml +26 -0
  16. data/config/site.reek +97 -0
  17. data/config/yardstick.yml +2 -0
  18. data/lib/to_source/command.rb +106 -0
  19. data/lib/to_source/emitter/access.rb +28 -0
  20. data/lib/to_source/emitter/actual_arguments.rb +89 -0
  21. data/lib/to_source/emitter/alias.rb +27 -0
  22. data/lib/to_source/emitter/assignment.rb +119 -0
  23. data/lib/to_source/emitter/attribute_assignment.rb +28 -0
  24. data/lib/to_source/emitter/begin.rb +71 -0
  25. data/lib/to_source/emitter/binary_operator.rb +63 -0
  26. data/lib/to_source/emitter/binary_operator_method.rb +58 -0
  27. data/lib/to_source/emitter/block.rb +29 -0
  28. data/lib/to_source/emitter/block_argument.rb +23 -0
  29. data/lib/to_source/emitter/block_pass.rb +23 -0
  30. data/lib/to_source/emitter/case.rb +85 -0
  31. data/lib/to_source/emitter/class.rb +44 -0
  32. data/lib/to_source/emitter/concat_arguments.rb +28 -0
  33. data/lib/to_source/emitter/default_arguments.rb +22 -0
  34. data/lib/to_source/emitter/define.rb +99 -0
  35. data/lib/to_source/emitter/defined.rb +24 -0
  36. data/lib/to_source/emitter/element_assignment.rb +29 -0
  37. data/lib/to_source/emitter/element_reference.rb +25 -0
  38. data/lib/to_source/emitter/empty_body.rb +21 -0
  39. data/lib/to_source/emitter/ensure.rb +50 -0
  40. data/lib/to_source/emitter/ensure_body.rb +27 -0
  41. data/lib/to_source/emitter/execute_string.rb +22 -0
  42. data/lib/to_source/emitter/formal_arguments.rb +212 -0
  43. data/lib/to_source/emitter/if.rb +96 -0
  44. data/lib/to_source/emitter/iter.rb +27 -0
  45. data/lib/to_source/emitter/keyword_value.rb +67 -0
  46. data/lib/to_source/emitter/literal/dynamic.rb +178 -0
  47. data/lib/to_source/emitter/literal.rb +232 -0
  48. data/lib/to_source/emitter/loop.rb +40 -0
  49. data/lib/to_source/emitter/match3.rb +25 -0
  50. data/lib/to_source/emitter/module.rb +28 -0
  51. data/lib/to_source/emitter/multiple_assignment.rb +49 -0
  52. data/lib/to_source/emitter/nth_ref.rb +22 -0
  53. data/lib/to_source/emitter/op_assign1.rb +27 -0
  54. data/lib/to_source/emitter/op_assign2.rb +27 -0
  55. data/lib/to_source/emitter/pattern_arguments.rb +24 -0
  56. data/lib/to_source/emitter/rescue.rb +28 -0
  57. data/lib/to_source/emitter/rescue_condition.rb +93 -0
  58. data/lib/to_source/emitter/scope.rb +24 -0
  59. data/lib/to_source/emitter/scope_name.rb +23 -0
  60. data/lib/to_source/emitter/scoped_name.rb +28 -0
  61. data/lib/to_source/emitter/send.rb +133 -0
  62. data/lib/to_source/emitter/send_with_arguments.rb +103 -0
  63. data/lib/to_source/emitter/singleton_class.rb +38 -0
  64. data/lib/to_source/emitter/splat.rb +24 -0
  65. data/lib/to_source/emitter/splat_when.rb +23 -0
  66. data/lib/to_source/emitter/static.rb +52 -0
  67. data/lib/to_source/emitter/super.rb +92 -0
  68. data/lib/to_source/emitter/to_array.rb +22 -0
  69. data/lib/to_source/emitter/to_string.rb +24 -0
  70. data/lib/to_source/emitter/toplevel.rb +24 -0
  71. data/lib/to_source/emitter/unary_operator_method.rb +27 -0
  72. data/lib/to_source/emitter/unless.rb +45 -0
  73. data/lib/to_source/emitter/util.rb +28 -0
  74. data/lib/to_source/emitter/when.rb +63 -0
  75. data/lib/to_source/emitter/yield.rb +28 -0
  76. data/lib/to_source/emitter/z_super.rb +24 -0
  77. data/lib/to_source/emitter.rb +278 -0
  78. data/lib/to_source/state.rb +144 -0
  79. data/lib/to_source.rb +78 -11
  80. data/spec/spec_helper.rb +11 -0
  81. data/spec/unit/to_source/class_methods/run_spec.rb +1254 -0
  82. data/to_source.gemspec +16 -14
  83. metadata +160 -20
  84. data/.rvmrc +0 -1
  85. data/Readme.md +0 -38
  86. data/lib/to_source/core_ext/node.rb +0 -22
  87. data/lib/to_source/version.rb +0 -3
  88. data/lib/to_source/visitor.rb +0 -377
  89. data/test/to_source/visitor_test.rb +0 -202
@@ -0,0 +1,89 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for arguments node
4
+ class ActualArguments < self
5
+
6
+ handle(Rubinius::AST::ActualArguments)
7
+
8
+ # Test if any arguments are present
9
+ #
10
+ # @return [true]
11
+ # if any argument is present
12
+ #
13
+ # @return [false]
14
+ # otherwise
15
+ #
16
+ # @api private
17
+ #
18
+ def any?
19
+ normal? || splat?
20
+ end
21
+
22
+ private
23
+
24
+ # Perform dispatch
25
+ #
26
+ # @return [self]
27
+ #
28
+ # @api private
29
+ #
30
+ def dispatch
31
+ emit_normal
32
+ emit_splat
33
+ end
34
+
35
+ delegate :array, :splat
36
+
37
+ # Test for splat argument
38
+ #
39
+ # @return [true]
40
+ # if splate argument is present
41
+ #
42
+ # @return [false]
43
+ # otherwise
44
+ #
45
+ # @api private
46
+ #
47
+ def splat?
48
+ !!splat
49
+ end
50
+
51
+ # Test if normal arguments are present
52
+ #
53
+ # @return [true]
54
+ # if normal arguments are present
55
+ #
56
+ # @return [false]
57
+ # otherwise
58
+ #
59
+ # @api private
60
+ #
61
+ def normal?
62
+ !array.empty?
63
+ end
64
+
65
+ # Emit normal arguments
66
+ #
67
+ # @return [undefined]
68
+ #
69
+ # @api private
70
+ #
71
+ def emit_normal
72
+ run(Util::DelimitedBody, array)
73
+ end
74
+
75
+ # Emit splat argument
76
+ #
77
+ # @return [undefined]
78
+ #
79
+ # @api private
80
+ #
81
+ def emit_splat
82
+ return unless splat?
83
+ emit(', ') if normal?
84
+ visit(splat)
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,27 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emiter for alias node
4
+ class Alias < self
5
+
6
+ handle(Rubinius::AST::Alias)
7
+
8
+ private
9
+
10
+ delegate(:to, :from)
11
+
12
+ # Perform dispatch
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ emit('alias ')
20
+ emit(to.value)
21
+ space
22
+ emit(from.value)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,119 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Base class for various assignment nodes
4
+ class Assignment < self
5
+
6
+ private
7
+
8
+ delegate :value
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit_target
18
+ val = value
19
+
20
+ if val
21
+ emit(' = ')
22
+ visit(val)
23
+ end
24
+ end
25
+
26
+ # Emitter for constant assignments
27
+ class Constant < self
28
+
29
+ handle(Rubinius::AST::ConstantAssignment)
30
+
31
+ private
32
+
33
+ # Emit name
34
+ #
35
+ # @return [undefined]
36
+ #
37
+ # @api private
38
+ #
39
+ def emit_target
40
+ visit(node.constant)
41
+ end
42
+
43
+ end
44
+
45
+ # Emitter for various variabe assignments
46
+ class Variable < self
47
+
48
+ handle(Rubinius::AST::LocalVariableAssignment)
49
+ handle(Rubinius::AST::InstanceVariableAssignment)
50
+ handle(Rubinius::AST::GlobalVariableAssignment)
51
+ handle(Rubinius::AST::ClassVariableAssignment)
52
+
53
+ private
54
+
55
+ # Emit target
56
+ #
57
+ # @return [undefined]
58
+ #
59
+ # @api private
60
+ #
61
+ def emit_target
62
+ emit(node.name)
63
+ end
64
+
65
+ end
66
+ end
67
+
68
+ # Base class for assignment operators
69
+ class AssignmentOperator < self
70
+
71
+ private
72
+
73
+ delegate(:left, :right)
74
+
75
+ # Perform dispatch
76
+ #
77
+ # @return [undefined]
78
+ #
79
+ # @api private
80
+ #
81
+ def dispatch
82
+ parantheses do
83
+ visit(left)
84
+ emit(" #{self.class::SYMBOL} ")
85
+ emit_right
86
+ end
87
+ end
88
+
89
+ # Emit right
90
+ #
91
+ # @return [undefined]
92
+ #
93
+ # @api private
94
+ #
95
+ def emit_right
96
+ parantheses do
97
+ visit(right.value)
98
+ end
99
+ end
100
+
101
+ # Emitter for or assigmnent operator
102
+ class Or < self
103
+
104
+ handle(Rubinius::AST::OpAssignOr19)
105
+ SYMBOL = :'||='
106
+
107
+ end
108
+
109
+ # Emitter for and assigmnent operator
110
+ class And < self
111
+
112
+ handle(Rubinius::AST::OpAssignAnd)
113
+ SYMBOL = :'&&='
114
+
115
+ end
116
+
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,28 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for attribute assignments
4
+ class AttributeAssignment < self
5
+
6
+ handle(Rubinius::AST::AttributeAssignment)
7
+
8
+ private
9
+
10
+ delegate(:receiver, :name)
11
+
12
+ # Perform dispatch
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ visit(receiver)
20
+ emit('.')
21
+ emit(name)
22
+ space
23
+ visit(node.arguments.array.first)
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,71 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for begin constructs
4
+ class Begin < self
5
+
6
+ handle(Rubinius::AST::Begin)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit('begin')
18
+ emit_body
19
+ emit_end
20
+ end
21
+
22
+ # Emit body
23
+ #
24
+ # @return [undefined]
25
+ #
26
+ # @api private
27
+ #
28
+ def emit_body
29
+ indent
30
+ body = node.rescue
31
+ case body
32
+ when Rubinius::AST::Rescue
33
+ emit_rescue(body)
34
+ when Rubinius::AST::Ensure
35
+ emit_ensure(body)
36
+ else
37
+ visit(body)
38
+ unindent
39
+ end
40
+ end
41
+
42
+ # Emit ensure
43
+ #
44
+ # @return [undefined]
45
+ #
46
+ # @api private
47
+ #
48
+ def emit_ensure(node)
49
+ visit(node.body)
50
+ unindent
51
+ emit(:ensure)
52
+ indented do
53
+ visit(node.ensure)
54
+ end
55
+ end
56
+
57
+ # Emit rescue
58
+ #
59
+ # @return [undefined]
60
+ #
61
+ # @api private
62
+ #
63
+ def emit_rescue(node)
64
+ visit(node.body)
65
+ unindent
66
+ visit(node.rescue)
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,63 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Base class for binary operator emitters
4
+ class BinaryOperator < self
5
+
6
+ private
7
+
8
+ # Perform dispatch
9
+ #
10
+ # @return [undefined]
11
+ #
12
+ # @api private
13
+ #
14
+ def dispatch
15
+ parantheses do
16
+ emit_left
17
+ emit(" #{self.class::SYMBOL} ")
18
+ emit_right
19
+ end
20
+ end
21
+
22
+ # Emit left
23
+ #
24
+ # @return [undefined]
25
+ #
26
+ # @api private
27
+ #
28
+ def emit_left
29
+ parantheses do
30
+ visit(node.left)
31
+ end
32
+ end
33
+
34
+ # Emit right
35
+ #
36
+ # @return [undefined]
37
+ #
38
+ # @api private
39
+ #
40
+ def emit_right
41
+ parantheses do
42
+ visit(node.right)
43
+ end
44
+ end
45
+
46
+ # Emitter for binary or operator
47
+ class Or < self
48
+
49
+ handle(Rubinius::AST::Or)
50
+ SYMBOL = :'||'
51
+
52
+ end
53
+
54
+ # Emitter for binary and operator
55
+ class And < self
56
+
57
+ handle(Rubinius::AST::And)
58
+ SYMBOL = :'&&'
59
+
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,58 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for binary operator methods
4
+ class BinaryOperatorMethod < self
5
+
6
+ private
7
+
8
+ # Perform dispatch
9
+ #
10
+ # @return [undefined]
11
+ #
12
+ # @api private
13
+ #
14
+ def dispatch
15
+ parantheses do
16
+ emit_left
17
+ emit(" #{node.name} ")
18
+ emit_right
19
+ end
20
+ end
21
+
22
+ # Emit right
23
+ #
24
+ # @return [undefined]
25
+ #
26
+ # @api private
27
+ #
28
+ def emit_right
29
+ parantheses do
30
+ visit(right)
31
+ end
32
+ end
33
+
34
+ # Emit left
35
+ #
36
+ # @return [undefined]
37
+ #
38
+ # @api private
39
+ #
40
+ def emit_left
41
+ parantheses do
42
+ visit(node.receiver)
43
+ end
44
+ end
45
+
46
+ # Return right
47
+ #
48
+ # @return [Rubinius::AST::Node]
49
+ #
50
+ # @api private
51
+ #
52
+ def right
53
+ node.arguments.array.first
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,29 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emiter for blocks
4
+ class Block < self
5
+
6
+ handle(Rubinius::AST::Block)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ array = node.array
18
+ max = array.length-1
19
+ array.each_with_index do |node, index|
20
+ visit(node)
21
+ if index < max
22
+ new_line
23
+ end
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for block argument
4
+ class BlockArgument < self
5
+
6
+ handle(Rubinius::AST::BlockArgument)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit('&')
18
+ emit(node.name)
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for block pass
4
+ class BlockPass < self
5
+
6
+ handle(Rubinius::AST::BlockPass19)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit('&')
18
+ visit(node.body)
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,85 @@
1
+ module ToSource
2
+ class Emitter
3
+
4
+ # Emitter for case statment nodes
5
+ class Case < self
6
+
7
+ handle(Rubinius::AST::Case)
8
+
9
+ private
10
+
11
+ # Perform dispatch
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ emit('case ')
19
+ emit_receiver
20
+ emit_whens
21
+ emit_else
22
+ emit_end
23
+ end
24
+
25
+ # Emit receiver
26
+ #
27
+ # @return [undefined]
28
+ #
29
+ # @api private
30
+ #
31
+ def emit_receiver
32
+ end
33
+
34
+ # Emit else
35
+ #
36
+ # @return [undefined]
37
+ #
38
+ # @api private
39
+ #
40
+ def emit_else
41
+ body = node.else
42
+ return if body.kind_of?(Rubinius::AST::NilLiteral)
43
+ emit('else')
44
+ indented do
45
+ visit(body)
46
+ end
47
+ end
48
+
49
+ # Emit whens
50
+ #
51
+ # @return [undefined]
52
+ #
53
+ # @api private
54
+ #
55
+ def emit_whens
56
+ first = true
57
+ node.whens.each do |member|
58
+ new_line if first
59
+ first = false
60
+ visit(member)
61
+ end
62
+ end
63
+
64
+ # Emitter for receiver case nodes
65
+ class ReceiverCase < self
66
+
67
+ handle(Rubinius::AST::ReceiverCase)
68
+
69
+ private
70
+
71
+ # Emit receiver
72
+ #
73
+ # @return [undefined]
74
+ #
75
+ # @api private
76
+ #
77
+ def emit_receiver
78
+ visit(node.receiver)
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,44 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for class nodes
4
+ class Class < self
5
+
6
+ handle(Rubinius::AST::Class)
7
+
8
+ private
9
+
10
+ delegate(:name, :body)
11
+
12
+ # Perform dispatch
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ emit(:class)
20
+ space
21
+ visit(name)
22
+ emit_superclass
23
+ indented do
24
+ visit(body)
25
+ end
26
+ emit_end
27
+ end
28
+
29
+ # Emit superclass
30
+ #
31
+ # @return [undefined]
32
+ #
33
+ # @api private
34
+ #
35
+ def emit_superclass
36
+ superclass = node.superclass
37
+ return if superclass.kind_of?(Rubinius::AST::NilLiteral)
38
+ emit(' < ')
39
+ visit(superclass)
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,28 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for concat arguments
4
+ class ConcatArguments < self
5
+
6
+ handle(Rubinius::AST::ConcatArgs)
7
+
8
+ private
9
+
10
+ delegate(:rest)
11
+
12
+ # Perform dispatch
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ emit('[')
20
+ run(Util::DelimitedBody, node.array.body)
21
+ emit(', *')
22
+ visit(rest)
23
+ emit(']')
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ module ToSource
2
+ class Emitter
3
+ # Emitter for default arguments
4
+ class DefaultArguments < self
5
+
6
+ handle(Rubinius::AST::DefaultArguments)
7
+
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ run(Util::DelimitedBody, node.arguments)
18
+ end
19
+
20
+ end
21
+ end
22
+ end