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.
- data/.rspec +1 -0
- data/Changelog.md +34 -1
- data/bin/to_source +2 -8
- data/config/flay.yml +1 -1
- data/config/site.reek +5 -0
- data/lib/to_source.rb +17 -3
- data/lib/to_source/emitter.rb +5 -1
- data/lib/to_source/emitter/alias.rb +23 -0
- data/lib/to_source/emitter/assignment.rb +23 -84
- data/lib/to_source/emitter/assignment/attribute.rb +52 -0
- data/lib/to_source/emitter/assignment/constant.rb +26 -0
- data/lib/to_source/emitter/assignment/element.rb +124 -0
- data/lib/to_source/emitter/assignment/variable.rb +29 -0
- data/lib/to_source/emitter/assignment_operator.rb +54 -0
- data/lib/to_source/emitter/back_ref.rb +23 -0
- data/lib/to_source/emitter/binary_operator_method.rb +38 -2
- data/lib/to_source/emitter/collect_splat.rb +50 -0
- data/lib/to_source/emitter/concat_arguments.rb +16 -1
- data/lib/to_source/emitter/element_reference.rb +1 -1
- data/lib/to_source/emitter/flip.rb +61 -0
- data/lib/to_source/emitter/for.rb +98 -0
- data/lib/to_source/emitter/iter.rb +23 -1
- data/lib/to_source/emitter/literal.rb +1 -18
- data/lib/to_source/emitter/literal/dynamic.rb +0 -23
- data/lib/to_source/emitter/literal/dynamic/regexp.rb +69 -0
- data/lib/to_source/emitter/literal/regexp.rb +27 -0
- data/lib/to_source/emitter/literal/regexp/options.rb +71 -0
- data/lib/to_source/emitter/match.rb +21 -0
- data/lib/to_source/emitter/match2.rb +25 -0
- data/lib/to_source/emitter/multiple_assignment.rb +43 -4
- data/lib/to_source/emitter/op_assign1.rb +37 -5
- data/lib/to_source/emitter/push_args.rb +42 -0
- data/lib/to_source/emitter/send.rb +21 -16
- data/lib/to_source/emitter/splat.rb +40 -1
- data/lib/to_source/emitter/static.rb +32 -0
- data/lib/to_source/emitter/toplevel.rb +2 -1
- data/lib/to_source/emitter/undef.rb +26 -0
- data/spec/unit/to_source/class_methods/run_spec.rb +245 -20
- data/to_source.gemspec +1 -1
- metadata +18 -4
- data/lib/to_source/emitter/attribute_assignment.rb +0 -28
- 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
|
-
|
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
|
-
|
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
|
-
|
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
|
@@ -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
|
-
|
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
|
|