prettyrb 0.2.0 → 0.3.0
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.ruby-version +1 -0
- data/Gemfile.lock +7 -1
- data/lib/prettyrb/formatter.rb +2 -5
- data/lib/prettyrb/version.rb +1 -1
- data/lib/prettyrb/visitor.rb +400 -119
- data/prettyrb.gemspec +1 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cdbfca887166eb0de5bb781abd2203f4b888459a49a7248462898cb002a368c
|
4
|
+
data.tar.gz: 57e3b5eb278aeb405f19a4aa77ac2eec0cd6f3fc824fcb7da0780b9403b500bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83d80892f95ed1b7c081a2325f36aa5462bd065e4b8d6e636b65bf0cd77a2b7566da1c7f1d119995281da6dbaa33897ae76b41e0429a2d71276ac25ad5e1a2bc
|
7
|
+
data.tar.gz: 61a4e582bd7eb20f409b96fbb69f559d645bb9563d22cf07cd4b2a69e54664814e256cf8241a6fe7d8ab10f1e07bb81d7fb08d3239c726fcf2441bf25d9ca1d2
|
data/.gitignore
CHANGED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.0
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
prettyrb (0.
|
4
|
+
prettyrb (0.2.0)
|
5
5
|
parser (~> 2.7.0.5)
|
6
6
|
thor
|
7
7
|
|
@@ -10,10 +10,15 @@ GEM
|
|
10
10
|
specs:
|
11
11
|
ast (2.4.0)
|
12
12
|
byebug (11.1.1)
|
13
|
+
docile (1.3.2)
|
13
14
|
minitest (5.14.0)
|
14
15
|
parser (2.7.0.5)
|
15
16
|
ast (~> 2.4.0)
|
16
17
|
rake (12.3.3)
|
18
|
+
simplecov (0.18.5)
|
19
|
+
docile (~> 1.1)
|
20
|
+
simplecov-html (~> 0.11)
|
21
|
+
simplecov-html (0.12.2)
|
17
22
|
thor (1.0.1)
|
18
23
|
|
19
24
|
PLATFORMS
|
@@ -25,6 +30,7 @@ DEPENDENCIES
|
|
25
30
|
minitest (~> 5.0)
|
26
31
|
prettyrb!
|
27
32
|
rake (~> 12.3.3)
|
33
|
+
simplecov (~> 0.18)
|
28
34
|
|
29
35
|
BUNDLED WITH
|
30
36
|
1.17.2
|
data/lib/prettyrb/formatter.rb
CHANGED
@@ -2,18 +2,15 @@ module Prettyrb
|
|
2
2
|
MAX_LINE_LENGTH = 100
|
3
3
|
|
4
4
|
class Formatter
|
5
|
-
def self.for(node)
|
6
|
-
end
|
7
|
-
|
8
5
|
def initialize(code)
|
9
6
|
@code = code
|
10
7
|
end
|
11
8
|
|
12
9
|
def format
|
13
|
-
root_node,
|
10
|
+
root_node, _comments = Parser::CurrentRuby.parse_with_comments(@code)
|
14
11
|
|
15
12
|
visitor = Visitor.new
|
16
|
-
visitor.visit(root_node)
|
13
|
+
visitor.visit(root_node, nil)
|
17
14
|
|
18
15
|
visitor.output
|
19
16
|
end
|
data/lib/prettyrb/version.rb
CHANGED
data/lib/prettyrb/visitor.rb
CHANGED
@@ -1,6 +1,37 @@
|
|
1
1
|
module Prettyrb
|
2
2
|
class Visitor
|
3
3
|
MAX_LENGTH = 100
|
4
|
+
SINGLE_LINE = "single_line"
|
5
|
+
MULTI_LINE = "multi_line"
|
6
|
+
|
7
|
+
FNAMES = [
|
8
|
+
"..",
|
9
|
+
"|",
|
10
|
+
"ˆ",
|
11
|
+
"&",
|
12
|
+
"<=>",
|
13
|
+
"==",
|
14
|
+
"===",
|
15
|
+
"=˜",
|
16
|
+
">",
|
17
|
+
">=",
|
18
|
+
"<",
|
19
|
+
"<=",
|
20
|
+
"+",
|
21
|
+
"-",
|
22
|
+
"*",
|
23
|
+
"/",
|
24
|
+
"%",
|
25
|
+
"**",
|
26
|
+
"<<",
|
27
|
+
">>",
|
28
|
+
"~",
|
29
|
+
"+@",
|
30
|
+
"-@",
|
31
|
+
"[]",
|
32
|
+
"[]="
|
33
|
+
]
|
34
|
+
VALID_SYMBOLS = FNAMES + ["!", "!="]
|
4
35
|
|
5
36
|
attr_reader :output
|
6
37
|
|
@@ -10,7 +41,8 @@ module Prettyrb
|
|
10
41
|
|
11
42
|
@newline = true
|
12
43
|
@multiline_conditional_level = 0
|
13
|
-
@
|
44
|
+
@previous_node = nil
|
45
|
+
@current_line = ''
|
14
46
|
end
|
15
47
|
|
16
48
|
def indents
|
@@ -27,10 +59,14 @@ module Prettyrb
|
|
27
59
|
|
28
60
|
def indent(&block)
|
29
61
|
old_indent_level = @indent_level
|
62
|
+
old_previous_node = @previous_node
|
30
63
|
|
64
|
+
@previous_node = nil
|
31
65
|
@indent_level += 1
|
32
|
-
yield
|
66
|
+
value = yield
|
33
67
|
@indent_level = old_indent_level
|
68
|
+
@previous_node = old_previous_node
|
69
|
+
value
|
34
70
|
end
|
35
71
|
|
36
72
|
def multiline_conditional_level
|
@@ -48,7 +84,9 @@ module Prettyrb
|
|
48
84
|
def capture(&block)
|
49
85
|
old_newline = @newline
|
50
86
|
old_output = @output
|
87
|
+
old_current_line = @current_line
|
51
88
|
|
89
|
+
@current_line = ""
|
52
90
|
@output = ""
|
53
91
|
|
54
92
|
yield
|
@@ -56,109 +94,115 @@ module Prettyrb
|
|
56
94
|
@output.tap do |output|
|
57
95
|
@output = old_output
|
58
96
|
@newline = old_newline
|
97
|
+
@current_line = old_current_line
|
59
98
|
end
|
60
99
|
end
|
61
100
|
|
62
101
|
def newline
|
63
102
|
@output << "\n"
|
64
103
|
@newline = true
|
104
|
+
@current_line = ''
|
65
105
|
end
|
66
106
|
|
67
107
|
def write(input)
|
68
108
|
if @newline
|
69
109
|
@output << indents
|
110
|
+
@current_line << indents
|
70
111
|
end
|
71
112
|
@newline = false
|
72
113
|
@output << input
|
114
|
+
@current_line << input
|
73
115
|
end
|
74
116
|
|
75
|
-
def visit(node)
|
76
|
-
@previous_node = @__current_node
|
77
|
-
@__current_node = node
|
78
|
-
|
117
|
+
def visit(node, parent_node)
|
79
118
|
case node.type
|
80
119
|
when :module
|
81
120
|
write "module "
|
82
|
-
visit node.children[0]
|
121
|
+
visit node.children[0], node
|
83
122
|
newline
|
84
123
|
|
85
124
|
indent do
|
86
|
-
visit node.children[1]
|
125
|
+
visit node.children[1], node
|
87
126
|
end
|
88
127
|
|
89
128
|
write "end"
|
90
129
|
newline
|
91
130
|
when :class
|
131
|
+
newline unless @previous_node.nil?
|
92
132
|
write "class "
|
93
|
-
visit node.children[0]
|
133
|
+
visit node.children[0], node
|
94
134
|
newline
|
95
135
|
# TODO handle children[1] which is inheritance
|
96
136
|
|
97
137
|
indent do
|
98
|
-
visit node.children[2]
|
138
|
+
visit node.children[2], node
|
99
139
|
end
|
100
140
|
|
101
141
|
newline unless @output.end_with?("\n")
|
102
142
|
write "end"
|
103
143
|
newline
|
104
144
|
when :const
|
145
|
+
visit node.children[0] if node.children[0]
|
105
146
|
write node.children[1].to_s
|
106
147
|
when :casgn
|
107
148
|
write node.children[1].to_s
|
108
149
|
write " = "
|
109
|
-
visit node.children[2]
|
150
|
+
visit node.children[2], node
|
110
151
|
when :block
|
111
|
-
|
152
|
+
newline unless @previous_node.nil?
|
153
|
+
visit node.children[0], node
|
112
154
|
write " do"
|
113
155
|
|
114
156
|
if node.children[1].children.length > 0
|
115
157
|
write " |"
|
116
|
-
visit node.children[1]
|
158
|
+
visit node.children[1], node
|
117
159
|
write "|"
|
118
160
|
end
|
119
161
|
|
120
162
|
newline
|
121
163
|
|
122
164
|
indent do
|
123
|
-
visit node.children[2]
|
165
|
+
visit node.children[2], node
|
124
166
|
end
|
125
167
|
|
126
168
|
newline
|
127
169
|
|
128
170
|
write "end"
|
129
|
-
newline
|
130
171
|
when :send
|
131
|
-
if
|
132
|
-
|
133
|
-
write " "
|
134
|
-
write node.children[1].to_s
|
135
|
-
write " "
|
136
|
-
visit node.children[2]
|
137
|
-
elsif node.children[1] == :[]
|
138
|
-
visit node.children[0]
|
139
|
-
write "["
|
140
|
-
visit node.children[2]
|
141
|
-
write "]"
|
142
|
-
elsif node.children[1] == :!
|
143
|
-
write "!"
|
144
|
-
visit node.children[0]
|
145
|
-
elsif node.children[0] == nil
|
172
|
+
newline if parent_node&.type == :begin && @previous_node && @previous_node&.type != :send
|
173
|
+
if node.children[0] == nil
|
146
174
|
write node.children[1].to_s
|
147
175
|
|
148
176
|
# TODO possible > MAX via `capture`
|
149
177
|
arguments = node.children[2..-1]
|
150
178
|
if arguments.length > 0
|
151
179
|
write "("
|
152
|
-
|
153
|
-
|
154
|
-
|
180
|
+
indent do
|
181
|
+
if splittable_separated_map(node, arguments) == MULTI_LINE
|
182
|
+
newline
|
183
|
+
end
|
155
184
|
end
|
156
185
|
write ")"
|
157
186
|
end
|
158
187
|
|
159
|
-
newline if @previous_node
|
188
|
+
newline if @previous_node&.type == :class
|
189
|
+
elsif node.children[1] == :[]
|
190
|
+
visit node.children[0], node
|
191
|
+
write "["
|
192
|
+
visit node.children[2], node
|
193
|
+
write "]"
|
194
|
+
elsif node.children[1] == :!
|
195
|
+
write "!"
|
196
|
+
visit node.children[0], node
|
197
|
+
elsif !node.children[1].to_s.match?(/[a-zA-Z]/)
|
198
|
+
# if [:!=, :==, :+, :-, :*, :/, :<<, :<].include?(node.children[1])
|
199
|
+
visit node.children[0], node
|
200
|
+
write " "
|
201
|
+
write node.children[1].to_s
|
202
|
+
write " "
|
203
|
+
visit node.children[2], node
|
160
204
|
else
|
161
|
-
visit node.children[0]
|
205
|
+
visit node.children[0], node
|
162
206
|
write "."
|
163
207
|
write node.children[1].to_s
|
164
208
|
|
@@ -166,123 +210,166 @@ module Prettyrb
|
|
166
210
|
arguments = node.children[2..-1]
|
167
211
|
if arguments.length > 0
|
168
212
|
write "("
|
169
|
-
arguments.each_with_index do |
|
170
|
-
visit node
|
213
|
+
arguments.each_with_index do |child_node, index|
|
214
|
+
visit child_node, node
|
171
215
|
write ", " unless index == arguments.length - 1
|
172
216
|
end
|
173
217
|
write ")"
|
174
218
|
end
|
175
219
|
end
|
176
220
|
when :if
|
177
|
-
|
178
|
-
|
221
|
+
newline if @previous_node && parent_node&.type != :if
|
222
|
+
|
223
|
+
if parent_node&.type == :if
|
224
|
+
conditions_node = node.children[0]
|
225
|
+
body_node = node.children[1]
|
226
|
+
else_body_node = node.children[2]
|
227
|
+
|
228
|
+
write "elsif"
|
229
|
+
|
179
230
|
conditions = capture do
|
180
|
-
visit node
|
231
|
+
visit conditions_node, node
|
181
232
|
end
|
182
233
|
|
183
234
|
if !conditions.start_with?("\n")
|
184
235
|
write(" ")
|
185
236
|
end
|
237
|
+
|
186
238
|
write conditions
|
239
|
+
newline
|
240
|
+
|
241
|
+
if body_node.type == :if
|
242
|
+
visit body_node, node
|
243
|
+
else
|
244
|
+
indent do
|
245
|
+
visit body_node, node
|
246
|
+
end
|
247
|
+
end
|
187
248
|
|
188
249
|
newline
|
189
250
|
|
190
|
-
if
|
191
|
-
visit node
|
251
|
+
if else_body_node&.type == :if
|
252
|
+
visit else_body_node, node
|
253
|
+
elsif else_body_node
|
254
|
+
write "else"
|
192
255
|
newline
|
256
|
+
indent do
|
257
|
+
visit else_body_node, node
|
258
|
+
end
|
193
259
|
end
|
194
|
-
|
260
|
+
else
|
261
|
+
is_unless = node.children[1].nil? && node.children[2]&.type != :if
|
262
|
+
conditions = node.children[0]
|
195
263
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
264
|
+
if is_unless
|
265
|
+
write "unless"
|
266
|
+
body_node = node.children[2]
|
267
|
+
else_body_node = nil
|
200
268
|
else
|
201
|
-
write "
|
269
|
+
write "if" unless parent_node&.type == :if
|
270
|
+
body_node = node.children[1]
|
271
|
+
else_body_node = node.children[2]
|
272
|
+
end
|
273
|
+
|
274
|
+
indent do
|
275
|
+
conditions = capture do
|
276
|
+
visit node.children[0], node
|
277
|
+
end
|
278
|
+
|
279
|
+
if !conditions.start_with?("\n")
|
280
|
+
write(" ")
|
281
|
+
end
|
282
|
+
|
283
|
+
write conditions
|
202
284
|
newline
|
203
285
|
|
204
|
-
|
205
|
-
visit node
|
286
|
+
if body_node
|
287
|
+
visit body_node, node
|
288
|
+
newline
|
206
289
|
end
|
207
290
|
end
|
208
|
-
newline
|
209
|
-
end
|
210
291
|
|
211
|
-
|
292
|
+
if else_body_node
|
293
|
+
if else_body_node.type == :if
|
294
|
+
visit else_body_node, node
|
295
|
+
else
|
296
|
+
write "else"
|
297
|
+
newline
|
298
|
+
|
299
|
+
indent do
|
300
|
+
visit else_body_node, node
|
301
|
+
end
|
302
|
+
end
|
303
|
+
newline
|
304
|
+
end
|
305
|
+
|
306
|
+
write "end" unless parent_node&.type == :if
|
307
|
+
end
|
212
308
|
when :true
|
213
309
|
write "true"
|
214
310
|
when :false
|
215
311
|
write "false"
|
216
312
|
when :nil
|
217
313
|
write "nil"
|
218
|
-
when :int
|
314
|
+
when :int, :float
|
219
315
|
write node.children[0].to_s
|
220
316
|
when :array
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
visit(child)
|
225
|
-
write ", " unless index == node.children.length - 1
|
226
|
-
end
|
227
|
-
write "]"
|
228
|
-
end
|
229
|
-
|
230
|
-
if possible_output.length > MAX_LENGTH
|
317
|
+
if node.children[0].type == :splat
|
318
|
+
visit node.children[0], node
|
319
|
+
else
|
231
320
|
write "["
|
232
|
-
newline
|
233
|
-
|
234
321
|
indent do
|
235
|
-
node.children
|
236
|
-
|
237
|
-
write ","
|
238
|
-
newline
|
239
|
-
end
|
322
|
+
result = splittable_separated_map(node, node.children)
|
323
|
+
newline if result == MULTI_LINE
|
240
324
|
end
|
241
|
-
|
242
325
|
write "]"
|
243
|
-
else
|
244
|
-
write possible_output.lstrip
|
245
326
|
end
|
246
327
|
when :str
|
247
328
|
write '"'
|
248
|
-
write node
|
329
|
+
write format_string(node)
|
249
330
|
write '"'
|
250
331
|
when :dstr
|
251
332
|
write "\""
|
252
333
|
node.children.map do |child|
|
253
334
|
if child.type == :str
|
254
|
-
write child.children[0]
|
255
|
-
write child.children[0].gsub("\n", "\\n")
|
335
|
+
write child.children[0] # TODO better handling
|
256
336
|
else
|
257
337
|
write '#{'
|
258
|
-
visit child
|
338
|
+
visit child, node
|
259
339
|
write '}'
|
260
340
|
end
|
261
341
|
end
|
262
342
|
write "\""
|
263
343
|
when :begin
|
264
|
-
if @previous_node
|
344
|
+
if @previous_node&.type == :or || @previous_node&.type == :and
|
265
345
|
write "("
|
266
|
-
|
346
|
+
@previous_node = nil
|
347
|
+
node.children.map do |child|
|
348
|
+
visit child, node
|
349
|
+
@previous_node = child
|
350
|
+
end
|
351
|
+
@previous_node = nil
|
267
352
|
write ")"
|
268
353
|
else
|
354
|
+
@previous_node = nil
|
269
355
|
node.children.each_with_index do |child, index|
|
270
|
-
visit child
|
356
|
+
visit child, node
|
271
357
|
newline unless index == node.children.length - 1
|
358
|
+
@previous_node = child
|
272
359
|
end
|
360
|
+
@previous_node = nil
|
273
361
|
end
|
274
362
|
when :or, :and
|
363
|
+
write "(" if parent_node&.type == :begin
|
275
364
|
possible_output = capture do
|
276
|
-
visit node.children[0]
|
365
|
+
visit node.children[0], node
|
277
366
|
if node.type == :or
|
278
367
|
write " || "
|
279
368
|
elsif node.type == :and
|
280
369
|
write " && "
|
281
370
|
end
|
282
|
-
visit node.children[1]
|
371
|
+
visit node.children[1], node
|
283
372
|
end
|
284
|
-
|
285
|
-
|
286
373
|
if @multiline_conditional_level > 0 # TODO track and check currently level
|
287
374
|
write_multiline_conditional(node)
|
288
375
|
elsif possible_output.length > MAX_LENGTH
|
@@ -298,41 +385,72 @@ module Prettyrb
|
|
298
385
|
else
|
299
386
|
write possible_output
|
300
387
|
end
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
if node.
|
388
|
+
write ")" if parent_node&.type == :begin
|
389
|
+
when :def, :defs
|
390
|
+
newline unless @previous_node&.type.nil?
|
391
|
+
if node.type == :defs
|
392
|
+
write "def self."
|
393
|
+
method_name_node = node.children[1]
|
394
|
+
arguments_node = node.children[2]
|
395
|
+
body_node = node.children[3]
|
396
|
+
else
|
397
|
+
write "def "
|
398
|
+
method_name_node = node.children[0]
|
399
|
+
arguments_node = node.children[1]
|
400
|
+
body_node = node.children[2]
|
401
|
+
end
|
402
|
+
|
403
|
+
write method_name_node.to_s
|
404
|
+
|
405
|
+
if arguments_node.children.length > 0 || arguments_node.type != :args
|
305
406
|
write "("
|
306
|
-
visit node
|
407
|
+
visit arguments_node, node
|
307
408
|
write ")"
|
308
409
|
end
|
309
410
|
newline
|
310
411
|
|
311
|
-
|
312
|
-
|
412
|
+
if body_node
|
413
|
+
indent do
|
414
|
+
visit body_node, node
|
415
|
+
end
|
416
|
+
|
417
|
+
newline
|
313
418
|
end
|
314
419
|
|
315
|
-
newline
|
316
420
|
write "end"
|
317
421
|
when :args
|
318
422
|
node.children.each_with_index do |child, index|
|
319
|
-
visit child
|
423
|
+
visit child, node
|
320
424
|
write ", " unless index == node.children.length - 1
|
321
425
|
end
|
322
426
|
when :arg
|
323
427
|
write node.children[0].to_s
|
324
|
-
when :lvar
|
428
|
+
when :lvar, :gvar
|
325
429
|
write node.children[0].to_s
|
326
430
|
when :self
|
327
431
|
"self"
|
328
432
|
when :sym
|
329
|
-
|
330
|
-
|
433
|
+
content = node.children[0].to_s
|
434
|
+
|
435
|
+
# TODO handle already quoted symbols
|
436
|
+
if !VALID_SYMBOLS.include?(content) && !content.match?(/\A[a-zA-Z_]{1}[a-zA-Z0-9_!?]*\z/)
|
437
|
+
content = "'#{content}'"
|
438
|
+
write ":"
|
439
|
+
write content
|
440
|
+
else
|
441
|
+
if parent_node&.type == :pair
|
442
|
+
write content
|
443
|
+
write ": "
|
444
|
+
else
|
445
|
+
write ":"
|
446
|
+
write content
|
447
|
+
end
|
448
|
+
end
|
331
449
|
when :return
|
332
450
|
write "return"
|
333
451
|
|
334
452
|
possible_output = capture do
|
335
|
-
visit node.children[0]
|
453
|
+
visit node.children[0], node
|
336
454
|
end
|
337
455
|
|
338
456
|
if !possible_output.start_with?("\n")
|
@@ -340,63 +458,193 @@ module Prettyrb
|
|
340
458
|
end
|
341
459
|
when :case
|
342
460
|
write "case "
|
343
|
-
visit node.children[0]
|
461
|
+
visit node.children[0], node
|
344
462
|
newline
|
345
463
|
node.children[1..-1].each do |child|
|
346
|
-
if child.type != :when
|
464
|
+
if child && child.type != :when
|
347
465
|
write "else"
|
348
466
|
newline
|
349
467
|
|
350
468
|
indent do
|
351
|
-
visit child
|
469
|
+
visit child, node
|
352
470
|
end
|
353
471
|
else
|
354
|
-
|
355
|
-
|
472
|
+
if child
|
473
|
+
visit child, node
|
474
|
+
newline
|
475
|
+
end
|
356
476
|
end
|
357
477
|
end
|
358
478
|
write "end"
|
479
|
+
when :regexp
|
480
|
+
write '/'
|
481
|
+
node.children[0...-1].map do |child_node|
|
482
|
+
if child_node.type == :str
|
483
|
+
write child_node.children[0].to_s
|
484
|
+
else
|
485
|
+
visit child_node, node
|
486
|
+
end
|
487
|
+
end
|
488
|
+
write '/'
|
489
|
+
visit node.children[-1], node
|
490
|
+
when :regopt
|
491
|
+
node.children.map { |child| child.to_s }.join('')
|
359
492
|
when :when
|
360
|
-
write "when
|
361
|
-
|
493
|
+
write "when"
|
494
|
+
|
495
|
+
indent do
|
496
|
+
splittable_separated_map(node, node.children[0..-2], skip_last_multiline_separator: true, write_space_if_single_line: true)
|
497
|
+
end
|
498
|
+
|
362
499
|
newline
|
363
500
|
indent do
|
364
|
-
visit node.children[1]
|
501
|
+
visit node.children[-1], node
|
502
|
+
end
|
503
|
+
when :or_asgn, :and_asgn
|
504
|
+
newline if @previous_node && ![:ivasgn, :or_asgn, :lvasgn, :op_asgn].include?(@previous_node.type)
|
505
|
+
visit node.children[0], node
|
506
|
+
if node.type == :or_asgn
|
507
|
+
write " ||= " # TODO handle long lines here too
|
508
|
+
elsif node.type == :and_asgn
|
509
|
+
write " &&= " # TODO handle long lines here too
|
365
510
|
end
|
366
|
-
|
367
|
-
visit node.children[0]
|
368
|
-
write " ||= " # TODO handle long lines here too
|
369
|
-
visit node.children[1]
|
511
|
+
visit node.children[1], node
|
370
512
|
when :ivasgn
|
513
|
+
newline if @previous_node && ![:ivasgn, :or_asgn, :lvasgn, :op_asgn].include?(@previous_node.type)
|
371
514
|
write node.children[0].to_s
|
515
|
+
|
516
|
+
if node.children[1]
|
517
|
+
write " = "
|
518
|
+
visit node.children[1], node
|
519
|
+
end
|
520
|
+
when :csend
|
521
|
+
visit node.children[0], node
|
522
|
+
write "&."
|
523
|
+
write node.children[1].to_s
|
372
524
|
when :ivar
|
373
525
|
write node.children[0].to_s
|
374
526
|
when :blockarg
|
527
|
+
write '&'
|
375
528
|
write node.children[0].to_s
|
376
529
|
when :yield
|
530
|
+
newline unless @previous_node.nil? || [:op_asgn, :lvasgn, :or_asgn, :and_asgn].include?(@previous_node.type)
|
377
531
|
write "yield"
|
378
532
|
when :op_asgn
|
379
|
-
|
533
|
+
newline if @previous_node && ![:ivasgn, :or_asgn, :lvasgn, :op_asgn].include?(@previous_node.type)
|
534
|
+
visit node.children[0], node
|
380
535
|
write " "
|
381
536
|
write node.children[1].to_s
|
537
|
+
write "="
|
382
538
|
write " "
|
383
|
-
visit node.children[2]
|
539
|
+
visit node.children[2], node
|
384
540
|
when :lvasgn
|
541
|
+
newline if @previous_node && ![:ivasgn, :or_asgn, :lvasgn, :op_asgn].include?(@previous_node.type)
|
385
542
|
write node.children[0].to_s
|
386
|
-
|
387
|
-
|
388
|
-
|
543
|
+
if node.children[1]
|
544
|
+
write " = "
|
545
|
+
visit node.children[1], node
|
546
|
+
end
|
389
547
|
when :irange
|
390
|
-
visit node.children[0]
|
548
|
+
visit node.children[0], node unless node.children[0].nil?
|
391
549
|
write ".."
|
392
|
-
visit node.children[1]
|
550
|
+
visit node.children[1], node unless node.children[1].nil?
|
551
|
+
when :erange
|
552
|
+
visit node.children[0], node unless node.children[0].nil?
|
553
|
+
write "..."
|
554
|
+
visit node.children[1], node unless node.children[1].nil?
|
555
|
+
when :hash
|
556
|
+
if node.children.length == 0
|
557
|
+
write "{}"
|
558
|
+
else
|
559
|
+
write "{"
|
560
|
+
|
561
|
+
result = indent do
|
562
|
+
splittable_separated_map(node, node.children, write_space_if_single_line: true)
|
563
|
+
end
|
564
|
+
|
565
|
+
if result == MULTI_LINE
|
566
|
+
newline
|
567
|
+
write "}"
|
568
|
+
else
|
569
|
+
write " }"
|
570
|
+
end
|
571
|
+
end
|
572
|
+
when :pair
|
573
|
+
visit node.children[0], node
|
574
|
+
if node.children[0].type != :sym
|
575
|
+
write " => "
|
576
|
+
end
|
577
|
+
visit node.children[1], node
|
578
|
+
when :splat
|
579
|
+
write "*"
|
580
|
+
visit node.children[0], node
|
581
|
+
when :defined?
|
582
|
+
write "defined?("
|
583
|
+
visit node.children[0], node
|
584
|
+
write ")"
|
585
|
+
when :complex,
|
586
|
+
:dsym,
|
587
|
+
:xstr,
|
588
|
+
:'nth-ref',
|
589
|
+
:'back-ref',
|
590
|
+
:gvasgn,
|
591
|
+
:mlhs,
|
592
|
+
:procarg0,
|
593
|
+
:shadowarg
|
594
|
+
raise "implement me, #{node.inspect}"
|
595
|
+
when :sclass
|
596
|
+
write "class << "
|
597
|
+
visit node.children[0], node
|
598
|
+
newline
|
599
|
+
|
600
|
+
indent do
|
601
|
+
visit node.children[1], node if node.children[1]
|
602
|
+
end
|
603
|
+
|
604
|
+
newline if node.children[1]
|
605
|
+
write "end"
|
606
|
+
when :undef
|
607
|
+
write "undef "
|
608
|
+
node.children.each_with_index do |child_node, index|
|
609
|
+
visit child_node, node
|
610
|
+
write ", " unless index == node.children.length - 1
|
611
|
+
end
|
612
|
+
when :alias
|
613
|
+
write 'alias '
|
614
|
+
visit node.children[0], node
|
615
|
+
write ' '
|
616
|
+
visit node.children[1], node
|
617
|
+
when :restarg
|
618
|
+
write "*"
|
619
|
+
write node.children[0].to_s
|
620
|
+
when :optarg
|
621
|
+
write node.children[0].to_s
|
622
|
+
write " = "
|
623
|
+
visit node.children[1], node
|
624
|
+
when :kwsplat
|
625
|
+
write "**"
|
626
|
+
visit node.children[0], node
|
627
|
+
when :kwarg
|
628
|
+
write node.children[0].to_s
|
629
|
+
write ":"
|
630
|
+
when :forward_args, :forwarded_args
|
631
|
+
write "..."
|
632
|
+
when :kwoptarg
|
633
|
+
write node.children[0].to_s
|
634
|
+
write ": "
|
635
|
+
visit node.children[1], node
|
636
|
+
when :kwrestarg
|
637
|
+
write "**"
|
638
|
+
write node.children[0].to_s if node.children[0]
|
639
|
+
when :kwnilarg
|
640
|
+
write "**nil"
|
393
641
|
else
|
394
642
|
raise "unhandled node type `#{node.type}`\nnode: #{node}"
|
395
643
|
end
|
396
644
|
end
|
397
645
|
|
398
646
|
def write_multiline_conditional(node)
|
399
|
-
visit node.children[0]
|
647
|
+
visit node.children[0], node
|
400
648
|
|
401
649
|
if node.type == :or
|
402
650
|
write " ||"
|
@@ -406,7 +654,40 @@ module Prettyrb
|
|
406
654
|
|
407
655
|
newline
|
408
656
|
|
409
|
-
visit node.children[1]
|
657
|
+
visit node.children[1], node
|
658
|
+
end
|
659
|
+
|
660
|
+
def format_string(string)
|
661
|
+
raw_content = string.loc.expression.source
|
662
|
+
content = raw_content[1...-1]
|
663
|
+
|
664
|
+
if raw_content[0] == "'"
|
665
|
+
content.gsub('"', '\\"').gsub('#{', '\\#{')
|
666
|
+
else
|
667
|
+
content.gsub("\\", "\\\\")
|
668
|
+
end
|
669
|
+
end
|
670
|
+
|
671
|
+
def splittable_separated_map(current_node, mappable, separator: ", ", skip_last_multiline_separator: false, write_space_if_single_line: false)
|
672
|
+
one_line = capture do
|
673
|
+
mappable.each_with_index do |child_node, index|
|
674
|
+
visit child_node, current_node
|
675
|
+
write separator unless index == mappable.length - 1
|
676
|
+
end
|
677
|
+
end
|
678
|
+
|
679
|
+
if @current_line.length + one_line.length > MAX_LENGTH
|
680
|
+
mappable.each_with_index do |child_node, index|
|
681
|
+
newline
|
682
|
+
visit child_node, current_node
|
683
|
+
write separator.rstrip unless skip_last_multiline_separator && index == mappable.length - 1
|
684
|
+
end
|
685
|
+
MULTI_LINE
|
686
|
+
else
|
687
|
+
write ' ' if write_space_if_single_line
|
688
|
+
write one_line
|
689
|
+
SINGLE_LINE
|
690
|
+
end
|
410
691
|
end
|
411
692
|
end
|
412
693
|
end
|
data/prettyrb.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prettyrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '11.1'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.18'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.18'
|
97
111
|
description: Ruby source code formatter
|
98
112
|
email:
|
99
113
|
- blake@blakewilliams.me
|
@@ -104,6 +118,7 @@ extra_rdoc_files: []
|
|
104
118
|
files:
|
105
119
|
- ".github/workflows/ruby.yml"
|
106
120
|
- ".gitignore"
|
121
|
+
- ".ruby-version"
|
107
122
|
- ".travis.yml"
|
108
123
|
- Gemfile
|
109
124
|
- Gemfile.lock
|
@@ -139,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
154
|
- !ruby/object:Gem::Version
|
140
155
|
version: '0'
|
141
156
|
requirements: []
|
142
|
-
rubygems_version: 3.
|
157
|
+
rubygems_version: 3.1.2
|
143
158
|
signing_key:
|
144
159
|
specification_version: 4
|
145
160
|
summary: Ruby source code formatter
|