to_source 0.2.15 → 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.
- data/.gitignore +6 -6
- data/Changelog.md +4 -0
- data/README.md +1 -1
- data/bin/to_source +1 -0
- data/config/flay.yml +1 -1
- data/config/flog.yml +1 -1
- data/config/roodi.yml +4 -4
- data/config/site.reek +5 -2
- data/config/yardstick.yml +1 -1
- data/lib/to_source.rb +1 -1
- data/lib/to_source/command.rb +63 -1
- data/lib/to_source/emitter.rb +221 -32
- data/lib/to_source/emitter/access.rb +8 -0
- data/lib/to_source/emitter/actual_arguments.rb +51 -8
- data/lib/to_source/emitter/alias.rb +11 -2
- data/lib/to_source/emitter/assignment.rb +62 -22
- data/lib/to_source/emitter/attribute_assignment.rb +11 -2
- data/lib/to_source/emitter/begin.rb +34 -14
- data/lib/to_source/emitter/binary_operator.rb +34 -17
- data/lib/to_source/emitter/binary_operator_method.rb +36 -17
- data/lib/to_source/emitter/block.rb +7 -0
- data/lib/to_source/emitter/block_argument.rb +7 -0
- data/lib/to_source/emitter/block_pass.rb +7 -0
- data/lib/to_source/emitter/case.rb +85 -0
- data/lib/to_source/emitter/class.rb +21 -6
- data/lib/to_source/emitter/concat_arguments.rb +11 -3
- data/lib/to_source/emitter/default_arguments.rb +7 -0
- data/lib/to_source/emitter/define.rb +46 -8
- data/lib/to_source/emitter/defined.rb +7 -0
- data/lib/to_source/emitter/element_assignment.rb +10 -1
- data/lib/to_source/emitter/element_reference.rb +10 -1
- data/lib/to_source/emitter/empty_body.rb +9 -0
- data/lib/to_source/emitter/ensure.rb +34 -7
- data/lib/to_source/emitter/ensure_body.rb +14 -5
- data/lib/to_source/emitter/execute_string.rb +9 -0
- data/lib/to_source/emitter/formal_arguments.rb +131 -39
- data/lib/to_source/emitter/if.rb +59 -14
- data/lib/to_source/emitter/iter.rb +10 -3
- data/lib/to_source/emitter/keyword_value.rb +28 -4
- data/lib/to_source/emitter/literal.rb +99 -14
- data/lib/to_source/emitter/literal/dynamic.rb +88 -13
- data/lib/to_source/emitter/loop.rb +14 -11
- data/lib/to_source/emitter/match3.rb +7 -0
- data/lib/to_source/emitter/module.rb +10 -3
- data/lib/to_source/emitter/multiple_assignment.rb +19 -0
- data/lib/to_source/emitter/nth_ref.rb +7 -0
- data/lib/to_source/emitter/op_assign1.rb +7 -0
- data/lib/to_source/emitter/op_assign2.rb +7 -0
- data/lib/to_source/emitter/pattern_arguments.rb +7 -0
- data/lib/to_source/emitter/rescue.rb +10 -4
- data/lib/to_source/emitter/rescue_condition.rb +40 -3
- data/lib/to_source/emitter/scope.rb +7 -0
- data/lib/to_source/emitter/scope_name.rb +7 -0
- data/lib/to_source/emitter/scoped_name.rb +7 -0
- data/lib/to_source/emitter/send.rb +71 -5
- data/lib/to_source/emitter/send_with_arguments.rb +53 -7
- data/lib/to_source/emitter/singleton_class.rb +17 -5
- data/lib/to_source/emitter/splat.rb +7 -0
- data/lib/to_source/emitter/splat_when.rb +7 -0
- data/lib/to_source/emitter/static.rb +19 -0
- data/lib/to_source/emitter/super.rb +49 -4
- data/lib/to_source/emitter/to_array.rb +7 -0
- data/lib/to_source/emitter/to_string.rb +7 -0
- data/lib/to_source/emitter/toplevel.rb +9 -0
- data/lib/to_source/emitter/unary_operator_method.rb +7 -0
- data/lib/to_source/emitter/unless.rb +23 -4
- data/lib/to_source/emitter/util.rb +8 -0
- data/lib/to_source/emitter/when.rb +28 -3
- data/lib/to_source/emitter/yield.rb +9 -0
- data/lib/to_source/emitter/z_super.rb +7 -0
- data/lib/to_source/state.rb +95 -11
- data/spec/unit/to_source/class_methods/run_spec.rb +13 -0
- data/to_source.gemspec +1 -1
- metadata +3 -4
- data/lib/to_source/buffer.rb +0 -40
- 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
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
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(
|
58
|
+
emit(self.class::TOKEN)
|
35
59
|
visit(util.finish)
|
36
60
|
end
|
37
61
|
|
38
|
-
|
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
|
-
|
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.
|
41
|
-
emit_segment(segment
|
93
|
+
array.each do |segment|
|
94
|
+
emit_segment(segment)
|
42
95
|
end
|
43
96
|
end
|
44
97
|
|
45
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|