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
data/.gitignore
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Gemfile.lock
|
4
|
-
pkg/*
|
5
|
-
|
6
|
-
|
1
|
+
/*.gem
|
2
|
+
/.bundle
|
3
|
+
/Gemfile.lock
|
4
|
+
/pkg/*
|
5
|
+
/.rbx
|
6
|
+
/tmp
|
data/Changelog.md
CHANGED
data/README.md
CHANGED
data/bin/to_source
CHANGED
data/config/flay.yml
CHANGED
data/config/flog.yml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
---
|
2
|
-
threshold:
|
2
|
+
threshold: 21.4
|
data/config/roodi.yml
CHANGED
@@ -5,17 +5,17 @@ AssignmentInConditionalCheck: {}
|
|
5
5
|
CaseMissingElseCheck: {}
|
6
6
|
ClassLineCountCheck:
|
7
7
|
line_count: 324
|
8
|
-
ClassNameCheck:
|
9
|
-
pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/
|
8
|
+
#ClassNameCheck:
|
9
|
+
# pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/
|
10
10
|
ClassVariableCheck: {}
|
11
11
|
CyclomaticComplexityBlockCheck:
|
12
12
|
complexity: 2
|
13
13
|
CyclomaticComplexityMethodCheck:
|
14
|
-
complexity:
|
14
|
+
complexity: 5
|
15
15
|
EmptyRescueBodyCheck: {}
|
16
16
|
ForLoopCheck: {}
|
17
17
|
MethodLineCountCheck:
|
18
|
-
line_count:
|
18
|
+
line_count: 11
|
19
19
|
MethodNameCheck:
|
20
20
|
pattern: !ruby/regexp /\A(?:[a-z\d](?:_?[a-z\d])+[?!=]?|\[\]=?|==|<=>|<<|[+*&|-])\z/
|
21
21
|
ModuleLineCountCheck:
|
data/config/site.reek
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
---
|
2
|
+
UnusedParameters:
|
3
|
+
exclude:
|
4
|
+
- ToSource::Command#run
|
2
5
|
UncommunicativeParameterName:
|
3
6
|
accept: []
|
4
7
|
exclude: []
|
@@ -8,7 +11,7 @@ UncommunicativeParameterName:
|
|
8
11
|
- !ruby/regexp /[0-9]$/
|
9
12
|
- !ruby/regexp /[A-Z]/
|
10
13
|
LargeClass:
|
11
|
-
max_methods:
|
14
|
+
max_methods: 14 # TODO move down to 10
|
12
15
|
exclude: []
|
13
16
|
enabled: true
|
14
17
|
max_instance_variables: 3
|
@@ -53,7 +56,7 @@ NestedIterators:
|
|
53
56
|
enabled: true
|
54
57
|
max_allowed_nesting: 1
|
55
58
|
LongMethod:
|
56
|
-
max_statements:
|
59
|
+
max_statements: 8 # TODO bring down to 5-6
|
57
60
|
exclude: []
|
58
61
|
enabled: true
|
59
62
|
Duplication:
|
data/config/yardstick.yml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
---
|
2
|
-
threshold:
|
2
|
+
threshold: 100
|
data/lib/to_source.rb
CHANGED
@@ -45,7 +45,7 @@ require 'to_source/emitter/element_assignment'
|
|
45
45
|
require 'to_source/emitter/if'
|
46
46
|
require 'to_source/emitter/loop'
|
47
47
|
require 'to_source/emitter/ensure'
|
48
|
-
require 'to_source/emitter/
|
48
|
+
require 'to_source/emitter/case'
|
49
49
|
require 'to_source/emitter/when'
|
50
50
|
require 'to_source/emitter/splat_when'
|
51
51
|
require 'to_source/emitter/unless'
|
data/lib/to_source/command.rb
CHANGED
@@ -1,44 +1,106 @@
|
|
1
1
|
module ToSource
|
2
|
+
# Abstract base class for emitter command
|
2
3
|
class Command
|
3
4
|
include Adamantium::Flat
|
4
5
|
|
6
|
+
# A null command
|
5
7
|
NULL = Class.new(self) do
|
8
|
+
|
9
|
+
# Run command
|
10
|
+
#
|
11
|
+
# @param [State] _state
|
12
|
+
#
|
13
|
+
# @return [self]
|
14
|
+
#
|
15
|
+
# @api private
|
16
|
+
#
|
6
17
|
def run(_state)
|
18
|
+
self
|
7
19
|
end
|
8
20
|
end.new.freeze
|
9
21
|
|
22
|
+
# Command that emits token
|
10
23
|
class Token < self
|
24
|
+
|
25
|
+
# Return token content
|
26
|
+
#
|
27
|
+
# @return [String]
|
28
|
+
#
|
29
|
+
# @api private
|
30
|
+
#
|
11
31
|
attr_reader :content
|
12
32
|
|
33
|
+
# Run command
|
34
|
+
#
|
35
|
+
# @param [State] state
|
36
|
+
#
|
37
|
+
# @return [self]
|
38
|
+
#
|
39
|
+
# @api private
|
40
|
+
#
|
13
41
|
def run(state)
|
14
42
|
state.push(self)
|
43
|
+
self
|
15
44
|
end
|
16
45
|
|
17
46
|
private
|
18
47
|
|
48
|
+
# Initialize object
|
49
|
+
#
|
50
|
+
# @param [String] content
|
51
|
+
#
|
52
|
+
# @return [undefined]
|
53
|
+
#
|
54
|
+
# @api private
|
55
|
+
#
|
19
56
|
def initialize(content)
|
20
57
|
@content = content
|
21
58
|
end
|
59
|
+
|
22
60
|
end
|
23
61
|
|
62
|
+
# Command that does a shift
|
24
63
|
class Shift < self
|
25
64
|
include Equalizer.new(:width)
|
26
65
|
|
66
|
+
# Return shift width
|
67
|
+
#
|
68
|
+
# @return [Fixnum]
|
69
|
+
#
|
70
|
+
# @api private
|
71
|
+
#
|
27
72
|
attr_reader :width
|
28
73
|
|
74
|
+
# Run command
|
75
|
+
#
|
76
|
+
# @param [State] state
|
77
|
+
#
|
78
|
+
# @return [self]
|
79
|
+
#
|
80
|
+
# @api private
|
81
|
+
#
|
29
82
|
def run(state)
|
30
83
|
state.shift(width)
|
84
|
+
self
|
31
85
|
end
|
32
86
|
|
33
87
|
private
|
34
88
|
|
89
|
+
# Initialize command
|
90
|
+
#
|
91
|
+
# @param [Fixnum] width
|
92
|
+
#
|
93
|
+
# @return [undefined]
|
94
|
+
#
|
95
|
+
# @api private
|
96
|
+
#
|
35
97
|
def initialize(width)
|
36
98
|
@width = width
|
37
99
|
end
|
38
100
|
|
39
101
|
INDENT = Shift.new( 2)
|
40
102
|
UNINDENT = Shift.new(-2)
|
41
|
-
|
42
103
|
end
|
104
|
+
|
43
105
|
end
|
44
106
|
end
|
data/lib/to_source/emitter.rb
CHANGED
@@ -1,89 +1,278 @@
|
|
1
1
|
module ToSource
|
2
|
+
# Abstract base class for emitter
|
2
3
|
class Emitter
|
3
4
|
include Adamantium::Flat, Equalizer.new(:node)
|
4
5
|
|
6
|
+
# The emitter registry
|
5
7
|
REGISTRY = {}
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
# Build emitter for node
|
10
|
+
#
|
11
|
+
# @param [Rubinius::AST::Node] node
|
12
|
+
# @param [Array] buffer
|
13
|
+
#
|
14
|
+
# @return [Emitter]
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
#
|
11
18
|
def self.build(node, buffer = [])
|
12
19
|
REGISTRY.fetch(node.class).new(node, buffer)
|
13
20
|
end
|
14
21
|
|
22
|
+
# Run emitter for node
|
23
|
+
#
|
24
|
+
# @param [Rubinius::AST::Node] node
|
25
|
+
#
|
26
|
+
# @return [String]
|
27
|
+
#
|
28
|
+
# @api private
|
29
|
+
#
|
15
30
|
def self.run(node)
|
16
31
|
build(node).source
|
17
32
|
end
|
18
33
|
|
34
|
+
# Declare predicates
|
35
|
+
#
|
36
|
+
# @return [undefined]
|
37
|
+
#
|
38
|
+
# @api private
|
39
|
+
#
|
40
|
+
def self.predicate(*names)
|
41
|
+
names.each do |name|
|
42
|
+
define_predicate(name)
|
43
|
+
end
|
44
|
+
end
|
19
45
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
46
|
+
private_class_method :predicate
|
47
|
+
|
48
|
+
# Declare node delegators
|
49
|
+
#
|
50
|
+
# @return [undefined]
|
51
|
+
#
|
52
|
+
# @api private
|
53
|
+
#
|
54
|
+
def self.delegate(*names)
|
55
|
+
names.each do |name|
|
56
|
+
define_delegator(name)
|
24
57
|
end
|
25
|
-
state.source
|
26
58
|
end
|
27
59
|
|
60
|
+
private_class_method :delegate
|
61
|
+
|
62
|
+
# Register emitter for node class
|
63
|
+
#
|
64
|
+
# @param [Class:Rubinius::AST::Node] node_class
|
65
|
+
#
|
66
|
+
# @return [undefined]
|
67
|
+
#
|
68
|
+
# @api private
|
69
|
+
#
|
70
|
+
def self.handle(node_class)
|
71
|
+
REGISTRY[node_class]=self
|
72
|
+
end
|
73
|
+
|
74
|
+
private_class_method :handle
|
75
|
+
|
76
|
+
# Define node delegator
|
77
|
+
#
|
78
|
+
# @param [Symbol] name
|
79
|
+
#
|
80
|
+
# @return [undefined]
|
81
|
+
#
|
82
|
+
# @api private
|
83
|
+
#
|
84
|
+
def self.define_delegator(name)
|
85
|
+
define_method(name) do
|
86
|
+
node.public_send(name)
|
87
|
+
end
|
88
|
+
private(name)
|
89
|
+
end
|
90
|
+
|
91
|
+
private_class_method :define_delegator
|
92
|
+
|
93
|
+
# Define predicate
|
94
|
+
#
|
95
|
+
# @param [Symbol] name
|
96
|
+
#
|
97
|
+
# @return [undefined]
|
98
|
+
#
|
99
|
+
# @api private
|
100
|
+
#
|
101
|
+
def self.define_predicate(name)
|
102
|
+
predicate = :"#{name}?"
|
103
|
+
define_method(predicate) do
|
104
|
+
!!send(name)
|
105
|
+
end
|
106
|
+
private(predicate)
|
107
|
+
end
|
108
|
+
|
109
|
+
private_class_method :define_delegator
|
110
|
+
|
111
|
+
# Return buffer
|
112
|
+
#
|
113
|
+
# @return [Array<Command>]
|
114
|
+
#
|
115
|
+
# @api private
|
116
|
+
#
|
117
|
+
attr_reader :buffer
|
118
|
+
|
119
|
+
# Return node
|
120
|
+
#
|
121
|
+
# @return [Rubinius::AST::Node]
|
122
|
+
#
|
123
|
+
# @api private
|
124
|
+
#
|
28
125
|
attr_reader :node
|
29
126
|
|
127
|
+
# Initialize object
|
128
|
+
#
|
129
|
+
# @param [Rubinius::AST::Node] node
|
130
|
+
# @param [Array<Command>] buffer
|
131
|
+
#
|
132
|
+
# @return [undefined]
|
133
|
+
#
|
134
|
+
# @api private
|
135
|
+
#
|
136
|
+
def initialize(node, buffer)
|
137
|
+
@node, @buffer = node, buffer
|
138
|
+
dispatch
|
139
|
+
end
|
140
|
+
|
141
|
+
# Return source
|
142
|
+
#
|
143
|
+
# @return [String]
|
144
|
+
#
|
145
|
+
# @api private
|
146
|
+
#
|
147
|
+
def source
|
148
|
+
buffer.each_with_object(State.new) do |command, state|
|
149
|
+
state.execute(command)
|
150
|
+
end.source
|
151
|
+
end
|
152
|
+
|
30
153
|
private
|
31
154
|
|
155
|
+
# Push command
|
156
|
+
#
|
157
|
+
# @param [Command] command
|
158
|
+
#
|
159
|
+
# @return [undefined]
|
160
|
+
#
|
161
|
+
# @api private
|
162
|
+
#
|
32
163
|
def push(command)
|
33
164
|
buffer.push(command)
|
34
165
|
end
|
35
166
|
|
167
|
+
# Emit new line
|
168
|
+
#
|
169
|
+
# @return [undefined]
|
170
|
+
#
|
171
|
+
# @api private
|
172
|
+
#
|
36
173
|
def new_line
|
37
174
|
emit("\n")
|
38
175
|
end
|
39
176
|
|
177
|
+
# Emit single whitespace
|
178
|
+
#
|
179
|
+
# @return [undefined]
|
180
|
+
#
|
181
|
+
# @api private
|
182
|
+
#
|
40
183
|
def space
|
41
184
|
emit(' ')
|
42
185
|
end
|
43
186
|
|
187
|
+
# Emit end keyword
|
188
|
+
#
|
189
|
+
# @return [undefined]
|
190
|
+
#
|
191
|
+
# @api private
|
192
|
+
#
|
44
193
|
def emit_end
|
45
194
|
emit(:end)
|
46
195
|
end
|
47
196
|
|
197
|
+
# Push indent command
|
198
|
+
#
|
199
|
+
# @return [undefined]
|
200
|
+
#
|
201
|
+
# @api private
|
202
|
+
#
|
48
203
|
def indent
|
49
204
|
push(Command::Shift::INDENT)
|
50
205
|
end
|
51
206
|
|
207
|
+
# Push unindent command
|
208
|
+
#
|
209
|
+
# @return [undefined]
|
210
|
+
#
|
211
|
+
# @api private
|
212
|
+
#
|
52
213
|
def unindent
|
53
214
|
push(Command::Shift::UNINDENT)
|
54
215
|
end
|
55
216
|
|
56
|
-
|
57
|
-
|
217
|
+
# Push token with content
|
218
|
+
#
|
219
|
+
# @param [String] content
|
220
|
+
#
|
221
|
+
# @return [undefined]
|
222
|
+
#
|
223
|
+
# @api private
|
224
|
+
#
|
225
|
+
def emit(content)
|
226
|
+
push(Command::Token.new(content))
|
58
227
|
end
|
59
228
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
229
|
+
# Run block indented
|
230
|
+
#
|
231
|
+
# @return [undefined]
|
232
|
+
#
|
233
|
+
# @api private
|
234
|
+
#
|
235
|
+
def indented
|
236
|
+
indent
|
237
|
+
yield
|
238
|
+
unindent
|
66
239
|
end
|
67
240
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
241
|
+
# Run block in parantheses
|
242
|
+
#
|
243
|
+
# @return [undefined]
|
244
|
+
#
|
245
|
+
# @api private
|
246
|
+
#
|
247
|
+
def parantheses
|
248
|
+
emit('(')
|
249
|
+
yield
|
250
|
+
emit(')')
|
72
251
|
end
|
73
252
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
253
|
+
# Visit descendant node
|
254
|
+
#
|
255
|
+
# @param [Rubinius::AST::Node] node
|
256
|
+
#
|
257
|
+
# @return [undefined]
|
258
|
+
#
|
259
|
+
# @api private
|
260
|
+
#
|
261
|
+
def visit(node)
|
262
|
+
self.class.build(node, buffer)
|
79
263
|
end
|
80
264
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
265
|
+
# Run emitter on buffer
|
266
|
+
#
|
267
|
+
# @param [Class:Emitter] emitter
|
268
|
+
# @param [Rubinius::AST::Node] node
|
269
|
+
#
|
270
|
+
# @return [undefined]
|
271
|
+
#
|
272
|
+
# @api private
|
273
|
+
#
|
274
|
+
def run(emitter, node = self.node)
|
275
|
+
emitter.new(node, buffer)
|
86
276
|
end
|
87
|
-
|
88
277
|
end
|
89
278
|
end
|