prettyrb 0.3.1 → 0.4.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/Gemfile.lock +9 -5
- data/README.md +14 -2
- data/lib/prettyrb/builder.rb +15 -0
- data/lib/prettyrb/cli.rb +13 -3
- data/lib/prettyrb/formatter.rb +13 -2
- data/lib/prettyrb/nodes/base_node.rb +30 -0
- data/lib/prettyrb/nodes/dstr_node.rb +20 -0
- data/lib/prettyrb/nodes/if_node.rb +47 -0
- data/lib/prettyrb/nodes/str_node.rb +18 -0
- data/lib/prettyrb/nodes/string_helper.rb +27 -0
- data/lib/prettyrb/version.rb +1 -1
- data/lib/prettyrb/visitor.rb +229 -161
- data/lib/prettyrb.rb +6 -0
- data/prettyrb.gemspec +2 -2
- metadata +14 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfaf933924416b3773afaed63ee03ca8c2ddaa9a3e36147c3db453f24245e375
|
4
|
+
data.tar.gz: b5fcfe41b9738e7bd628501b1aff497e7083cb7f6e061fa7e5821719c7c86bcf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de542dd1e0f5999aa4aec410a8329e387944e1ce370805c2c4aaa805f5020034287fb7db8e0bfe4d3c2627b722c6b0d3a3cfa0024dbc4255fba9e3161cea0a9f
|
7
|
+
data.tar.gz: 953349398a0107c7012336a3a69dd0ae5c700cde330fced7db07cd96876178cfe87457273fc4440b48caabd2f050b26f79b26e0ec8f2c40af279fe2c3246ab4a
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
prettyrb (0.3.
|
4
|
+
prettyrb (0.3.1)
|
5
5
|
parser (~> 2.7.0.5)
|
6
6
|
thor
|
7
7
|
|
@@ -9,11 +9,15 @@ GEM
|
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
11
|
ast (2.4.0)
|
12
|
-
|
12
|
+
coderay (1.1.2)
|
13
13
|
docile (1.3.2)
|
14
|
+
method_source (1.0.0)
|
14
15
|
minitest (5.14.0)
|
15
16
|
parser (2.7.0.5)
|
16
17
|
ast (~> 2.4.0)
|
18
|
+
pry (0.13.1)
|
19
|
+
coderay (~> 1.1)
|
20
|
+
method_source (~> 1.0)
|
17
21
|
rake (12.3.3)
|
18
22
|
simplecov (0.18.5)
|
19
23
|
docile (~> 1.1)
|
@@ -25,12 +29,12 @@ PLATFORMS
|
|
25
29
|
ruby
|
26
30
|
|
27
31
|
DEPENDENCIES
|
28
|
-
bundler (~> 1.
|
29
|
-
byebug (~> 11.1)
|
32
|
+
bundler (~> 2.1.4)
|
30
33
|
minitest (~> 5.0)
|
31
34
|
prettyrb!
|
35
|
+
pry (~> 0.13)
|
32
36
|
rake (~> 12.3.3)
|
33
37
|
simplecov (~> 0.18)
|
34
38
|
|
35
39
|
BUNDLED WITH
|
36
|
-
1.
|
40
|
+
2.1.4
|
data/README.md
CHANGED
@@ -22,12 +22,24 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
+
CLI:
|
26
|
+
|
27
|
+
```
|
28
|
+
$ prettyrb format FILE
|
29
|
+
```
|
30
|
+
|
31
|
+
or to re-write the file:
|
32
|
+
|
33
|
+
```
|
34
|
+
prettyrb format FILE --write
|
35
|
+
```
|
36
|
+
|
37
|
+
In Ruby code:
|
38
|
+
|
25
39
|
```ruby
|
26
40
|
PrettyRb.new(source_code).format
|
27
41
|
```
|
28
42
|
|
29
|
-
CLI helper coming soon™
|
30
|
-
|
31
43
|
## License
|
32
44
|
|
33
45
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Prettyrb
|
2
|
+
class Builder < Parser::Builders::Default
|
3
|
+
NODE_TYPES = {
|
4
|
+
if: Prettyrb::Nodes::IfNode,
|
5
|
+
str: Prettyrb::Nodes::StrNode,
|
6
|
+
dstr: Prettyrb::Nodes::DstrNode,
|
7
|
+
}.freeze
|
8
|
+
|
9
|
+
def n(type, children, source_map)
|
10
|
+
node_class = NODE_TYPES.fetch(type, Prettyrb::Nodes::BaseNode)
|
11
|
+
|
12
|
+
node_class.new(type, children, location: source_map)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/prettyrb/cli.rb
CHANGED
@@ -2,10 +2,20 @@ require "thor"
|
|
2
2
|
|
3
3
|
module Prettyrb
|
4
4
|
class CLI < Thor
|
5
|
-
desc "format FILE", "file to prettify"
|
6
|
-
|
5
|
+
desc "format [FILE]", "Ruby file to prettify"
|
6
|
+
option :write, type: :boolean
|
7
|
+
method_option :files, type: :array
|
8
|
+
def format(*files)
|
7
9
|
content = File.read(file)
|
8
|
-
|
10
|
+
formatted_content = Prettyrb::Formatter.new(content).format
|
11
|
+
|
12
|
+
if options[:write]
|
13
|
+
File.open(file, 'w') do |f|
|
14
|
+
f.write(formatted_content)
|
15
|
+
end
|
16
|
+
else
|
17
|
+
puts formatted_content
|
18
|
+
end
|
9
19
|
end
|
10
20
|
end
|
11
21
|
end
|
data/lib/prettyrb/formatter.rb
CHANGED
@@ -7,10 +7,21 @@ module Prettyrb
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def format
|
10
|
-
|
10
|
+
parser = Parser::CurrentRuby.new(Prettyrb::Builder.new)
|
11
|
+
|
12
|
+
parser.diagnostics.all_errors_are_fatal = true
|
13
|
+
parser.diagnostics.ignore_warnings = true
|
14
|
+
|
15
|
+
parser.diagnostics.consumer = lambda do |diagnostic|
|
16
|
+
$stderr.puts(diagnostic.render)
|
17
|
+
end
|
18
|
+
|
19
|
+
root_node, _comments = parser.parse_with_comments(
|
20
|
+
Parser::CurrentRuby.send(:setup_source_buffer, "file='(string)'", 1, @code, parser.default_encoding)
|
21
|
+
)
|
11
22
|
|
12
23
|
visitor = Visitor.new
|
13
|
-
visitor.visit(root_node
|
24
|
+
visitor.visit(root_node)
|
14
25
|
|
15
26
|
visitor.output
|
16
27
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "delegate"
|
2
|
+
|
3
|
+
module Prettyrb
|
4
|
+
module Nodes
|
5
|
+
class BaseNode < Parser::AST::Node
|
6
|
+
def initialize(type, children, properties)
|
7
|
+
@mutable = {}
|
8
|
+
|
9
|
+
super
|
10
|
+
|
11
|
+
children.each do |child|
|
12
|
+
next unless child.is_a?(BaseNode)
|
13
|
+
child.parent = self
|
14
|
+
end
|
15
|
+
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def parent
|
20
|
+
@mutable[:parent]
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def parent=(parent)
|
26
|
+
@mutable[:parent] = parent
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Prettyrb
|
2
|
+
module Nodes
|
3
|
+
class DstrNode < BaseNode
|
4
|
+
include StringHelper
|
5
|
+
|
6
|
+
HEREDOC_TYPE_REGEX = /<<(.)?/
|
7
|
+
|
8
|
+
def format
|
9
|
+
raw_content = loc.expression.source
|
10
|
+
content = raw_content[1...-1]
|
11
|
+
|
12
|
+
if raw_content[0] == "'"
|
13
|
+
content.gsub('"', '\\"').gsub('#{', '\\#{')
|
14
|
+
else
|
15
|
+
content.gsub("\\", "\\\\")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Prettyrb
|
2
|
+
module Nodes
|
3
|
+
class IfNode < BaseNode
|
4
|
+
def if_type
|
5
|
+
if is_elsif?
|
6
|
+
"elsif"
|
7
|
+
elsif unless_node?
|
8
|
+
"unless"
|
9
|
+
else
|
10
|
+
"if"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def conditions_node
|
15
|
+
children[0]
|
16
|
+
end
|
17
|
+
|
18
|
+
def body_node
|
19
|
+
if unless_node?
|
20
|
+
children[2]
|
21
|
+
else
|
22
|
+
children[1]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def else_body_node
|
27
|
+
if unless_node?
|
28
|
+
children[1]
|
29
|
+
else
|
30
|
+
children[2]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def has_elsif?
|
35
|
+
else_body_node&.type == :if && children[1]&.type != :if
|
36
|
+
end
|
37
|
+
|
38
|
+
def is_elsif?
|
39
|
+
parent&.type == :if && parent&.children[1]&.type != :if
|
40
|
+
end
|
41
|
+
|
42
|
+
def unless_node?
|
43
|
+
children[1].nil? && children[2] != :if
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Prettyrb
|
2
|
+
module Nodes
|
3
|
+
class StrNode < BaseNode
|
4
|
+
include StringHelper
|
5
|
+
|
6
|
+
def format
|
7
|
+
raw_content = loc.expression.source
|
8
|
+
content = raw_content[1...-1]
|
9
|
+
|
10
|
+
if raw_content[0] == "'"
|
11
|
+
content.gsub('"', '\\"').gsub('#{', '\\#{')
|
12
|
+
else
|
13
|
+
content.gsub("\\", "\\\\")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Prettyrb
|
2
|
+
module Nodes
|
3
|
+
module StringHelper
|
4
|
+
HEREDOC_TYPE_REGEX = /<<(.)?/
|
5
|
+
|
6
|
+
def heredoc_identifier
|
7
|
+
loc.heredoc_end.source.strip
|
8
|
+
end
|
9
|
+
|
10
|
+
def heredoc_type
|
11
|
+
# Always use indentable ending heredoc type if no type was provided
|
12
|
+
#
|
13
|
+
# eg: <<RUBY becomes <<-RUBY since <<- allows the ending identifier
|
14
|
+
# to be indented
|
15
|
+
loc.expression.source.match(HEREDOC_TYPE_REGEX)[1] || "-"
|
16
|
+
end
|
17
|
+
|
18
|
+
def heredoc_body
|
19
|
+
loc.heredoc_body.source
|
20
|
+
end
|
21
|
+
|
22
|
+
def heredoc?
|
23
|
+
!!loc.respond_to?(:heredoc_body)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/prettyrb/version.rb
CHANGED
data/lib/prettyrb/visitor.rb
CHANGED
@@ -104,25 +104,25 @@ module Prettyrb
|
|
104
104
|
@current_line = ''
|
105
105
|
end
|
106
106
|
|
107
|
-
def write(input)
|
107
|
+
def write(input, skip_indent: false)
|
108
108
|
if @newline
|
109
|
-
@output << indents
|
110
|
-
@current_line << indents
|
109
|
+
@output << indents unless skip_indent
|
110
|
+
@current_line << indents unless skip_indent
|
111
111
|
end
|
112
112
|
@newline = false
|
113
113
|
@output << input
|
114
114
|
@current_line << input
|
115
115
|
end
|
116
116
|
|
117
|
-
def visit(node
|
117
|
+
def visit(node)
|
118
118
|
case node.type
|
119
119
|
when :module
|
120
120
|
write "module "
|
121
|
-
visit node.children[0]
|
121
|
+
visit node.children[0]
|
122
122
|
newline
|
123
123
|
|
124
124
|
indent do
|
125
|
-
visit node.children[1]
|
125
|
+
visit node.children[1]
|
126
126
|
end
|
127
127
|
|
128
128
|
write "end"
|
@@ -130,46 +130,46 @@ module Prettyrb
|
|
130
130
|
when :class
|
131
131
|
newline unless @previous_node.nil?
|
132
132
|
write "class "
|
133
|
-
visit node.children[0]
|
133
|
+
visit node.children[0]
|
134
134
|
newline
|
135
135
|
# TODO handle children[1] which is inheritance
|
136
136
|
|
137
137
|
indent do
|
138
|
-
visit node.children[2]
|
138
|
+
visit node.children[2] if node.children[2]
|
139
139
|
end
|
140
140
|
|
141
141
|
newline unless @output.end_with?("\n")
|
142
142
|
write "end"
|
143
143
|
newline
|
144
144
|
when :const
|
145
|
-
visit node.children[0]
|
145
|
+
visit node.children[0] if node.children[0]
|
146
146
|
write node.children[1].to_s
|
147
147
|
when :casgn
|
148
148
|
write node.children[1].to_s
|
149
149
|
write " = "
|
150
|
-
visit node.children[2]
|
150
|
+
visit node.children[2]
|
151
151
|
when :block
|
152
152
|
newline unless @previous_node.nil?
|
153
|
-
visit node.children[0]
|
153
|
+
visit node.children[0]
|
154
154
|
write " do"
|
155
155
|
|
156
156
|
if node.children[1].children.length > 0
|
157
157
|
write " |"
|
158
|
-
visit node.children[1]
|
158
|
+
visit node.children[1]
|
159
159
|
write "|"
|
160
160
|
end
|
161
161
|
|
162
162
|
newline
|
163
163
|
|
164
164
|
indent do
|
165
|
-
visit node.children[2]
|
165
|
+
visit node.children[2]
|
166
166
|
end
|
167
167
|
|
168
168
|
newline
|
169
169
|
|
170
170
|
write "end"
|
171
171
|
when :send
|
172
|
-
newline if
|
172
|
+
newline if node.parent&.type == :begin && @previous_node && @previous_node&.type != :send
|
173
173
|
if node.children[0] == nil
|
174
174
|
write node.children[1].to_s
|
175
175
|
|
@@ -187,22 +187,24 @@ module Prettyrb
|
|
187
187
|
|
188
188
|
newline if @previous_node&.type == :class
|
189
189
|
elsif node.children[1] == :[]
|
190
|
-
visit node.children[0]
|
190
|
+
visit node.children[0]
|
191
191
|
write "["
|
192
|
-
visit node.children[2]
|
192
|
+
visit node.children[2]
|
193
193
|
write "]"
|
194
194
|
elsif node.children[1] == :!
|
195
195
|
write "!"
|
196
|
-
visit node.children[0]
|
196
|
+
visit node.children[0]
|
197
|
+
elsif node.children[1] == :-@ && node.children[2].nil?
|
198
|
+
write "-"
|
199
|
+
visit node.children[0]
|
197
200
|
elsif !node.children[1].to_s.match?(/[a-zA-Z]/)
|
198
|
-
|
199
|
-
visit node.children[0], node
|
201
|
+
visit node.children[0]
|
200
202
|
write " "
|
201
203
|
write node.children[1].to_s
|
202
204
|
write " "
|
203
|
-
visit node.children[2]
|
205
|
+
visit node.children[2]
|
204
206
|
else
|
205
|
-
visit node.children[0]
|
207
|
+
visit node.children[0]
|
206
208
|
write "."
|
207
209
|
write node.children[1].to_s
|
208
210
|
|
@@ -211,99 +213,58 @@ module Prettyrb
|
|
211
213
|
if arguments.length > 0
|
212
214
|
write "("
|
213
215
|
arguments.each_with_index do |child_node, index|
|
214
|
-
visit child_node
|
216
|
+
visit child_node
|
215
217
|
write ", " unless index == arguments.length - 1
|
216
218
|
end
|
217
219
|
write ")"
|
218
220
|
end
|
219
221
|
end
|
220
222
|
when :if
|
221
|
-
newline if @previous_node &&
|
223
|
+
newline if @previous_node && node.parent&.type != :if
|
224
|
+
conditions = node.conditions_node
|
222
225
|
|
223
|
-
|
224
|
-
conditions_node = node.children[0]
|
225
|
-
body_node = node.children[1]
|
226
|
-
else_body_node = node.children[2]
|
226
|
+
write node.if_type
|
227
227
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
visit conditions_node, node
|
232
|
-
end
|
228
|
+
conditions = capture do
|
229
|
+
visit node.children[0]
|
230
|
+
end
|
233
231
|
|
232
|
+
indent do
|
234
233
|
if !conditions.start_with?("\n")
|
235
234
|
write(" ")
|
236
|
-
|
237
|
-
|
238
|
-
write conditions
|
239
|
-
newline
|
240
|
-
|
241
|
-
if body_node.type == :if
|
242
|
-
visit body_node, node
|
235
|
+
write conditions
|
243
236
|
else
|
244
|
-
|
245
|
-
|
237
|
+
visit node.conditions_node
|
238
|
+
|
239
|
+
dedent do
|
240
|
+
newline
|
241
|
+
write "then"
|
246
242
|
end
|
247
243
|
end
|
248
244
|
|
249
245
|
newline
|
246
|
+
visit node.body_node
|
247
|
+
end
|
250
248
|
|
251
|
-
|
252
|
-
visit else_body_node, node
|
253
|
-
elsif else_body_node
|
254
|
-
write "else"
|
255
|
-
newline
|
256
|
-
indent do
|
257
|
-
visit else_body_node, node
|
258
|
-
end
|
259
|
-
end
|
260
|
-
else
|
261
|
-
is_unless = node.children[1].nil? && node.children[2]&.type != :if
|
262
|
-
conditions = node.children[0]
|
249
|
+
newline
|
263
250
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
else_body_node = nil
|
251
|
+
if node.else_body_node
|
252
|
+
if node.has_elsif?
|
253
|
+
visit node.else_body_node
|
268
254
|
else
|
269
|
-
write "
|
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
|
255
|
+
write "else"
|
284
256
|
newline
|
285
257
|
|
286
|
-
|
287
|
-
visit
|
288
|
-
newline
|
258
|
+
indent do
|
259
|
+
visit node.else_body_node
|
289
260
|
end
|
290
|
-
end
|
291
261
|
|
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
262
|
newline
|
304
263
|
end
|
264
|
+
end
|
305
265
|
|
306
|
-
|
266
|
+
if !node.is_elsif?
|
267
|
+
write "end"
|
307
268
|
end
|
308
269
|
when :true
|
309
270
|
write "true"
|
@@ -313,39 +274,84 @@ module Prettyrb
|
|
313
274
|
write "nil"
|
314
275
|
when :int, :float
|
315
276
|
write node.children[0].to_s
|
277
|
+
when :next
|
278
|
+
write "next"
|
279
|
+
|
280
|
+
if node.children[0]
|
281
|
+
write " "
|
282
|
+
visit node.children[0]
|
283
|
+
end
|
316
284
|
when :array
|
317
|
-
if node.children[0]
|
318
|
-
visit node.children[0]
|
285
|
+
if node.children[0]&.type == :splat
|
286
|
+
visit node.children[0]
|
319
287
|
else
|
320
|
-
write "["
|
321
|
-
|
322
|
-
|
323
|
-
|
288
|
+
write "[" unless node.parent&.type == :resbody
|
289
|
+
if node.children.length > 0
|
290
|
+
indent do
|
291
|
+
result = splittable_separated_map(node, node.children)
|
292
|
+
newline if result == MULTI_LINE
|
293
|
+
end
|
324
294
|
end
|
325
|
-
write "]"
|
295
|
+
write "]" unless node.parent&.type == :resbody
|
326
296
|
end
|
327
297
|
when :str
|
328
|
-
|
329
|
-
|
330
|
-
|
298
|
+
if node.heredoc?
|
299
|
+
if node&.parent&.type == :send
|
300
|
+
write "("
|
301
|
+
end
|
302
|
+
write "<<"
|
303
|
+
write node.heredoc_type if node.heredoc_type
|
304
|
+
write node.heredoc_identifier
|
305
|
+
newline
|
306
|
+
write node.heredoc_body, skip_indent: true
|
307
|
+
@newline = true
|
308
|
+
write node.heredoc_identifier
|
309
|
+
|
310
|
+
if node&.parent&.type == :send
|
311
|
+
newline
|
312
|
+
write ")"
|
313
|
+
end
|
314
|
+
else
|
315
|
+
write '"'
|
316
|
+
write node.format
|
317
|
+
write '"'
|
318
|
+
end
|
331
319
|
when :dstr
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
320
|
+
if node.heredoc?
|
321
|
+
if node&.parent&.type == :send
|
322
|
+
write "("
|
323
|
+
end
|
324
|
+
write "<<"
|
325
|
+
write node.heredoc_type if node.heredoc_type
|
326
|
+
write node.heredoc_identifier
|
327
|
+
newline
|
328
|
+
write node.heredoc_body, skip_indent: true
|
329
|
+
@newline = true
|
330
|
+
write node.heredoc_identifier
|
331
|
+
|
332
|
+
if node&.parent&.type == :send
|
333
|
+
newline
|
334
|
+
write ")"
|
335
|
+
end
|
336
|
+
else
|
337
|
+
write "\""
|
338
|
+
node.children.map do |child|
|
339
|
+
if child.type == :str
|
340
|
+
write child.format
|
341
|
+
else
|
342
|
+
write '#{'
|
343
|
+
visit child
|
344
|
+
write '}'
|
345
|
+
end
|
340
346
|
end
|
347
|
+
write "\""
|
341
348
|
end
|
342
|
-
write "\""
|
343
349
|
when :begin
|
344
350
|
if @previous_node&.type == :or || @previous_node&.type == :and
|
345
351
|
write "("
|
346
352
|
@previous_node = nil
|
347
353
|
node.children.map do |child|
|
348
|
-
visit child
|
354
|
+
visit child
|
349
355
|
@previous_node = child
|
350
356
|
end
|
351
357
|
@previous_node = nil
|
@@ -353,22 +359,22 @@ module Prettyrb
|
|
353
359
|
else
|
354
360
|
@previous_node = nil
|
355
361
|
node.children.each_with_index do |child, index|
|
356
|
-
visit child
|
362
|
+
visit child
|
357
363
|
newline unless index == node.children.length - 1
|
358
364
|
@previous_node = child
|
359
365
|
end
|
360
366
|
@previous_node = nil
|
361
367
|
end
|
362
368
|
when :or, :and
|
363
|
-
write "(" if
|
369
|
+
write "(" if node.parent&.type == :begin
|
364
370
|
possible_output = capture do
|
365
|
-
visit node.children[0]
|
371
|
+
visit node.children[0]
|
366
372
|
if node.type == :or
|
367
373
|
write " || "
|
368
374
|
elsif node.type == :and
|
369
375
|
write " && "
|
370
376
|
end
|
371
|
-
visit node.children[1]
|
377
|
+
visit node.children[1]
|
372
378
|
end
|
373
379
|
if @multiline_conditional_level > 0 # TODO track and check currently level
|
374
380
|
write_multiline_conditional(node)
|
@@ -377,15 +383,10 @@ module Prettyrb
|
|
377
383
|
newline
|
378
384
|
write_multiline_conditional(node)
|
379
385
|
end
|
380
|
-
|
381
|
-
dedent do
|
382
|
-
newline
|
383
|
-
write "then"
|
384
|
-
end
|
385
386
|
else
|
386
387
|
write possible_output
|
387
388
|
end
|
388
|
-
write ")" if
|
389
|
+
write ")" if node.parent&.type == :begin
|
389
390
|
when :def, :defs
|
390
391
|
newline unless @previous_node&.type.nil?
|
391
392
|
if node.type == :defs
|
@@ -404,14 +405,14 @@ module Prettyrb
|
|
404
405
|
|
405
406
|
if arguments_node.children.length > 0 || arguments_node.type != :args
|
406
407
|
write "("
|
407
|
-
visit arguments_node
|
408
|
+
visit arguments_node
|
408
409
|
write ")"
|
409
410
|
end
|
410
411
|
newline
|
411
412
|
|
412
413
|
if body_node
|
413
414
|
indent do
|
414
|
-
visit body_node
|
415
|
+
visit body_node
|
415
416
|
end
|
416
417
|
|
417
418
|
newline
|
@@ -420,7 +421,7 @@ module Prettyrb
|
|
420
421
|
write "end"
|
421
422
|
when :args
|
422
423
|
node.children.each_with_index do |child, index|
|
423
|
-
visit child
|
424
|
+
visit child
|
424
425
|
write ", " unless index == node.children.length - 1
|
425
426
|
end
|
426
427
|
when :arg
|
@@ -438,7 +439,7 @@ module Prettyrb
|
|
438
439
|
write ":"
|
439
440
|
write content
|
440
441
|
else
|
441
|
-
if
|
442
|
+
if node.parent&.type == :pair
|
442
443
|
write content
|
443
444
|
write ": "
|
444
445
|
else
|
@@ -449,16 +450,18 @@ module Prettyrb
|
|
449
450
|
when :return
|
450
451
|
write "return"
|
451
452
|
|
452
|
-
|
453
|
-
|
454
|
-
|
453
|
+
if node.children[0]
|
454
|
+
possible_output = capture do
|
455
|
+
visit node.children[0]
|
456
|
+
end
|
455
457
|
|
456
|
-
|
457
|
-
|
458
|
+
if !possible_output.start_with?("\n")
|
459
|
+
write " "
|
460
|
+
end
|
458
461
|
end
|
459
462
|
when :case
|
460
463
|
write "case "
|
461
|
-
visit node.children[0]
|
464
|
+
visit node.children[0]
|
462
465
|
newline
|
463
466
|
node.children[1..-1].each do |child|
|
464
467
|
if child && child.type != :when
|
@@ -466,11 +469,11 @@ module Prettyrb
|
|
466
469
|
newline
|
467
470
|
|
468
471
|
indent do
|
469
|
-
visit child
|
472
|
+
visit child
|
470
473
|
end
|
471
474
|
else
|
472
475
|
if child
|
473
|
-
visit child
|
476
|
+
visit child
|
474
477
|
newline
|
475
478
|
end
|
476
479
|
end
|
@@ -482,11 +485,11 @@ module Prettyrb
|
|
482
485
|
if child_node.type == :str
|
483
486
|
write child_node.children[0].to_s
|
484
487
|
else
|
485
|
-
visit child_node
|
488
|
+
visit child_node
|
486
489
|
end
|
487
490
|
end
|
488
491
|
write '/'
|
489
|
-
visit node.children[-1]
|
492
|
+
visit node.children[-1]
|
490
493
|
when :regopt
|
491
494
|
node.children.map { |child| child.to_s }.join('')
|
492
495
|
when :when
|
@@ -498,27 +501,27 @@ module Prettyrb
|
|
498
501
|
|
499
502
|
newline
|
500
503
|
indent do
|
501
|
-
visit node.children[-1]
|
504
|
+
visit node.children[-1]
|
502
505
|
end
|
503
506
|
when :or_asgn, :and_asgn
|
504
507
|
newline if @previous_node && ![:ivasgn, :or_asgn, :lvasgn, :op_asgn].include?(@previous_node.type)
|
505
|
-
visit node.children[0]
|
508
|
+
visit node.children[0]
|
506
509
|
if node.type == :or_asgn
|
507
510
|
write " ||= " # TODO handle long lines here too
|
508
511
|
elsif node.type == :and_asgn
|
509
512
|
write " &&= " # TODO handle long lines here too
|
510
513
|
end
|
511
|
-
visit node.children[1]
|
514
|
+
visit node.children[1]
|
512
515
|
when :ivasgn
|
513
516
|
newline if @previous_node && ![:ivasgn, :or_asgn, :lvasgn, :op_asgn].include?(@previous_node.type)
|
514
517
|
write node.children[0].to_s
|
515
518
|
|
516
519
|
if node.children[1]
|
517
520
|
write " = "
|
518
|
-
visit node.children[1]
|
521
|
+
visit node.children[1]
|
519
522
|
end
|
520
523
|
when :csend
|
521
|
-
visit node.children[0]
|
524
|
+
visit node.children[0]
|
522
525
|
write "&."
|
523
526
|
write node.children[1].to_s
|
524
527
|
when :ivar
|
@@ -531,27 +534,27 @@ module Prettyrb
|
|
531
534
|
write "yield"
|
532
535
|
when :op_asgn
|
533
536
|
newline if @previous_node && ![:ivasgn, :or_asgn, :lvasgn, :op_asgn].include?(@previous_node.type)
|
534
|
-
visit node.children[0]
|
537
|
+
visit node.children[0]
|
535
538
|
write " "
|
536
539
|
write node.children[1].to_s
|
537
540
|
write "="
|
538
541
|
write " "
|
539
|
-
visit node.children[2]
|
542
|
+
visit node.children[2]
|
540
543
|
when :lvasgn
|
541
544
|
newline if @previous_node && ![:ivasgn, :or_asgn, :lvasgn, :op_asgn].include?(@previous_node.type)
|
542
545
|
write node.children[0].to_s
|
543
546
|
if node.children[1]
|
544
547
|
write " = "
|
545
|
-
visit node.children[1]
|
548
|
+
visit node.children[1]
|
546
549
|
end
|
547
550
|
when :irange
|
548
|
-
visit node.children[0]
|
551
|
+
visit node.children[0] unless node.children[0].nil?
|
549
552
|
write ".."
|
550
|
-
visit node.children[1]
|
553
|
+
visit node.children[1] unless node.children[1].nil?
|
551
554
|
when :erange
|
552
|
-
visit node.children[0]
|
555
|
+
visit node.children[0] unless node.children[0].nil?
|
553
556
|
write "..."
|
554
|
-
visit node.children[1]
|
557
|
+
visit node.children[1] unless node.children[1].nil?
|
555
558
|
when :hash
|
556
559
|
if node.children.length == 0
|
557
560
|
write "{}"
|
@@ -570,17 +573,17 @@ module Prettyrb
|
|
570
573
|
end
|
571
574
|
end
|
572
575
|
when :pair
|
573
|
-
visit node.children[0]
|
576
|
+
visit node.children[0]
|
574
577
|
if node.children[0].type != :sym
|
575
578
|
write " => "
|
576
579
|
end
|
577
|
-
visit node.children[1]
|
580
|
+
visit node.children[1]
|
578
581
|
when :splat
|
579
582
|
write "*"
|
580
|
-
visit node.children[0]
|
583
|
+
visit node.children[0]
|
581
584
|
when :defined?
|
582
585
|
write "defined?("
|
583
|
-
visit node.children[0]
|
586
|
+
visit node.children[0]
|
584
587
|
write ")"
|
585
588
|
when :complex,
|
586
589
|
:dsym,
|
@@ -588,17 +591,16 @@ module Prettyrb
|
|
588
591
|
:'nth-ref',
|
589
592
|
:'back-ref',
|
590
593
|
:gvasgn,
|
591
|
-
:mlhs,
|
592
594
|
:procarg0,
|
593
595
|
:shadowarg
|
594
596
|
raise "implement me, #{node.inspect}"
|
595
597
|
when :sclass
|
596
598
|
write "class << "
|
597
|
-
visit node.children[0]
|
599
|
+
visit node.children[0]
|
598
600
|
newline
|
599
601
|
|
600
602
|
indent do
|
601
|
-
visit node.children[1]
|
603
|
+
visit node.children[1] if node.children[1]
|
602
604
|
end
|
603
605
|
|
604
606
|
newline if node.children[1]
|
@@ -606,24 +608,24 @@ module Prettyrb
|
|
606
608
|
when :undef
|
607
609
|
write "undef "
|
608
610
|
node.children.each_with_index do |child_node, index|
|
609
|
-
visit child_node
|
611
|
+
visit child_node
|
610
612
|
write ", " unless index == node.children.length - 1
|
611
613
|
end
|
612
614
|
when :alias
|
613
615
|
write 'alias '
|
614
|
-
visit node.children[0]
|
616
|
+
visit node.children[0]
|
615
617
|
write ' '
|
616
|
-
visit node.children[1]
|
618
|
+
visit node.children[1]
|
617
619
|
when :restarg
|
618
620
|
write "*"
|
619
621
|
write node.children[0].to_s
|
620
622
|
when :optarg
|
621
623
|
write node.children[0].to_s
|
622
624
|
write " = "
|
623
|
-
visit node.children[1]
|
625
|
+
visit node.children[1]
|
624
626
|
when :kwsplat
|
625
627
|
write "**"
|
626
|
-
visit node.children[0]
|
628
|
+
visit node.children[0]
|
627
629
|
when :kwarg
|
628
630
|
write node.children[0].to_s
|
629
631
|
write ":"
|
@@ -632,7 +634,7 @@ module Prettyrb
|
|
632
634
|
when :kwoptarg
|
633
635
|
write node.children[0].to_s
|
634
636
|
write ": "
|
635
|
-
visit node.children[1]
|
637
|
+
visit node.children[1]
|
636
638
|
when :kwrestarg
|
637
639
|
write "**"
|
638
640
|
write node.children[0].to_s if node.children[0]
|
@@ -640,13 +642,79 @@ module Prettyrb
|
|
640
642
|
write "**nil"
|
641
643
|
when :cbase
|
642
644
|
write "::"
|
645
|
+
when :zsuper
|
646
|
+
write "super"
|
647
|
+
when :nth_ref
|
648
|
+
write "$"
|
649
|
+
write node.children[0].to_s
|
650
|
+
when :masgn
|
651
|
+
left = node.children[0...-1]
|
652
|
+
right = node.children[-1]
|
653
|
+
|
654
|
+
left.each_with_index do |child_node, index|
|
655
|
+
visit child_node
|
656
|
+
end
|
657
|
+
|
658
|
+
write " = "
|
659
|
+
visit right
|
660
|
+
when :mlhs
|
661
|
+
write "(" if node.parent&.type == :mlhs
|
662
|
+
node.children.each_with_index do |child_node, index|
|
663
|
+
visit child_node
|
664
|
+
write ", " unless index == node.children.length - 1
|
665
|
+
end
|
666
|
+
write ")" if node.parent&.type == :mlhs
|
667
|
+
when :block_pass
|
668
|
+
write "&"
|
669
|
+
visit node.children[0]
|
670
|
+
when :kwbegin
|
671
|
+
write "begin"
|
672
|
+
newline
|
673
|
+
indent do
|
674
|
+
visit node.children[0]
|
675
|
+
end
|
676
|
+
newline
|
677
|
+
write "end"
|
678
|
+
when :rescue
|
679
|
+
visit node.children[0]
|
680
|
+
newline
|
681
|
+
|
682
|
+
dedent do
|
683
|
+
write "rescue"
|
684
|
+
visit node.children[1]
|
685
|
+
end
|
686
|
+
when :resbody
|
687
|
+
if node.children[0]
|
688
|
+
write " "
|
689
|
+
visit node.children[0] if node.children[0]
|
690
|
+
end
|
691
|
+
|
692
|
+
if node.children[1]
|
693
|
+
write " => "
|
694
|
+
write node.children[1].children[0].to_s
|
695
|
+
end
|
696
|
+
newline
|
697
|
+
|
698
|
+
indent do
|
699
|
+
visit node.children[2] if node.children[2]
|
700
|
+
end
|
701
|
+
when :ensure
|
702
|
+
visit node.children[0] if node.children[0]
|
703
|
+
newline
|
704
|
+
|
705
|
+
dedent do
|
706
|
+
write "ensure"
|
707
|
+
end
|
708
|
+
|
709
|
+
newline
|
710
|
+
visit node.children[1] if node.children[1]
|
643
711
|
else
|
644
712
|
raise "unhandled node type `#{node.type}`\nnode: #{node}"
|
645
713
|
end
|
646
714
|
end
|
647
715
|
|
648
716
|
def write_multiline_conditional(node)
|
649
|
-
visit node.children[0]
|
717
|
+
visit node.children[0]
|
650
718
|
|
651
719
|
if node.type == :or
|
652
720
|
write " ||"
|
@@ -656,7 +724,7 @@ module Prettyrb
|
|
656
724
|
|
657
725
|
newline
|
658
726
|
|
659
|
-
visit node.children[1]
|
727
|
+
visit node.children[1]
|
660
728
|
end
|
661
729
|
|
662
730
|
def format_string(string)
|
@@ -673,7 +741,7 @@ module Prettyrb
|
|
673
741
|
def splittable_separated_map(current_node, mappable, separator: ", ", skip_last_multiline_separator: false, write_space_if_single_line: false)
|
674
742
|
one_line = capture do
|
675
743
|
mappable.each_with_index do |child_node, index|
|
676
|
-
visit child_node
|
744
|
+
visit child_node
|
677
745
|
write separator unless index == mappable.length - 1
|
678
746
|
end
|
679
747
|
end
|
@@ -681,7 +749,7 @@ module Prettyrb
|
|
681
749
|
if @current_line.length + one_line.length > MAX_LENGTH
|
682
750
|
mappable.each_with_index do |child_node, index|
|
683
751
|
newline
|
684
|
-
visit child_node
|
752
|
+
visit child_node
|
685
753
|
write separator.rstrip unless skip_last_multiline_separator && index == mappable.length - 1
|
686
754
|
end
|
687
755
|
MULTI_LINE
|
data/lib/prettyrb.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
require "parser/current"
|
2
2
|
require "prettyrb/version"
|
3
3
|
|
4
|
+
require "prettyrb/nodes/base_node"
|
5
|
+
require "prettyrb/nodes/if_node"
|
6
|
+
require "prettyrb/nodes/string_helper"
|
7
|
+
require "prettyrb/nodes/str_node"
|
8
|
+
require "prettyrb/nodes/dstr_node"
|
9
|
+
require "prettyrb/builder"
|
4
10
|
require "prettyrb/formatter"
|
5
11
|
require "prettyrb/visitor"
|
6
12
|
|
data/prettyrb.gemspec
CHANGED
@@ -35,9 +35,9 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.add_dependency "parser", "~> 2.7.0.5"
|
36
36
|
spec.add_dependency "thor"
|
37
37
|
|
38
|
-
spec.add_development_dependency "bundler", "~> 1.
|
38
|
+
spec.add_development_dependency "bundler", "~> 2.1.4"
|
39
39
|
spec.add_development_dependency "rake", "~> 12.3.3"
|
40
40
|
spec.add_development_dependency "minitest", "~> 5.0"
|
41
|
-
spec.add_development_dependency "
|
41
|
+
spec.add_development_dependency "pry", "~> 0.13"
|
42
42
|
spec.add_development_dependency "simplecov", "~> 0.18"
|
43
43
|
end
|
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.4.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-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 2.1.4
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 2.1.4
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,19 +81,19 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '5.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: pry
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '0.13'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '0.13'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: simplecov
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,8 +129,14 @@ files:
|
|
129
129
|
- bin/setup
|
130
130
|
- exe/prettyrb
|
131
131
|
- lib/prettyrb.rb
|
132
|
+
- lib/prettyrb/builder.rb
|
132
133
|
- lib/prettyrb/cli.rb
|
133
134
|
- lib/prettyrb/formatter.rb
|
135
|
+
- lib/prettyrb/nodes/base_node.rb
|
136
|
+
- lib/prettyrb/nodes/dstr_node.rb
|
137
|
+
- lib/prettyrb/nodes/if_node.rb
|
138
|
+
- lib/prettyrb/nodes/str_node.rb
|
139
|
+
- lib/prettyrb/nodes/string_helper.rb
|
134
140
|
- lib/prettyrb/version.rb
|
135
141
|
- lib/prettyrb/visitor.rb
|
136
142
|
- prettyrb.gemspec
|
@@ -154,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
154
160
|
- !ruby/object:Gem::Version
|
155
161
|
version: '0'
|
156
162
|
requirements: []
|
157
|
-
rubygems_version: 3.1.
|
163
|
+
rubygems_version: 3.1.3
|
158
164
|
signing_key:
|
159
165
|
specification_version: 4
|
160
166
|
summary: Ruby source code formatter
|