prettier 1.2.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/package.json +1 -1
- data/src/nodes/assign.js +1 -5
- data/src/nodes/case.js +53 -49
- data/src/nodes/methods.js +20 -4
- data/src/nodes/patterns.js +22 -11
- data/src/parser.rb +22 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3abef3acea4e49130ba81afdb9bc00e73277c69e0254a1087b2c5e47feb5b104
|
4
|
+
data.tar.gz: e851f061fc14352b7797ac0e2aca10c43f052b8bd19aa817473cfb6b75bde44c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6fd8aba1071ff34709e7f3ad3ddd256cfbdc890ffb02fdef3d3567331a53d9b1974d02fd943ce03cab565822d750288bbe5582bc3c4a2d26bf0f170d2c3d15c6
|
7
|
+
data.tar.gz: 8e66f396c113f162fb6c8c747a60d45dd38a554c13cab3ac1ae12456ff15fc49d2945ce69c1db53d89f1f82a69d0b30017ebfdcd99fbb2cb2fbbc29c4dbf398b
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,16 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [1.2.1] - 2020-12-27
|
10
|
+
|
11
|
+
### Changed
|
12
|
+
|
13
|
+
- [@kddeisz] - Handle single-line method definitions with parameters.
|
14
|
+
- [@kddeisz] - Handle hash and array patterns nested within find patterns.
|
15
|
+
- [@kddeisz] - Handle rightward assignment.
|
16
|
+
- [@kddeisz] - Handle find patterns with named boundaries.
|
17
|
+
- [@kddeisz] - Handle rightward assignment in conditionals.
|
18
|
+
|
9
19
|
## [1.2.0] - 2020-12-26
|
10
20
|
|
11
21
|
### Added
|
data/package.json
CHANGED
data/src/nodes/assign.js
CHANGED
@@ -32,11 +32,7 @@ function printOpAssign(path, opts, print) {
|
|
32
32
|
}
|
33
33
|
|
34
34
|
function printVarField(path, opts, print) {
|
35
|
-
|
36
|
-
return path.call(print, "body", 0);
|
37
|
-
}
|
38
|
-
|
39
|
-
return "*";
|
35
|
+
return path.getValue().body ? path.call(print, "body", 0) : "";
|
40
36
|
}
|
41
37
|
|
42
38
|
module.exports = {
|
data/src/nodes/case.js
CHANGED
@@ -8,54 +8,58 @@ const {
|
|
8
8
|
line
|
9
9
|
} = require("../prettier");
|
10
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
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
}
|
58
|
-
|
59
|
-
return group(concat(parts));
|
11
|
+
function printCase(path, opts, print) {
|
12
|
+
const statement = ["case"];
|
13
|
+
|
14
|
+
// You don't need to explicitly have something to test against in a case
|
15
|
+
// statement (without it it effectively becomes an if/elsif chain).
|
16
|
+
if (path.getValue().body[0]) {
|
17
|
+
statement.push(" ", path.call(print, "body", 0));
|
18
|
+
}
|
19
|
+
|
20
|
+
return concat(
|
21
|
+
statement.concat([hardline, path.call(print, "body", 1), hardline, "end"])
|
22
|
+
);
|
23
|
+
}
|
24
|
+
|
25
|
+
function printWhen(path, opts, print) {
|
26
|
+
const [_preds, _stmts, addition] = path.getValue().body;
|
27
|
+
|
28
|
+
// The `fill` builder command expects an array of docs alternating with
|
29
|
+
// line breaks. This is so it can loop through and determine where to break.
|
30
|
+
const preds = fill(
|
31
|
+
path.call(print, "body", 0).reduce((accum, pred, index) => {
|
32
|
+
if (index === 0) {
|
33
|
+
return [pred];
|
34
|
+
}
|
35
|
+
|
36
|
+
// Pull off the last element and make it concat with a comma so that
|
37
|
+
// we can maintain alternating lines and docs.
|
38
|
+
return accum
|
39
|
+
.slice(0, -1)
|
40
|
+
.concat([concat([accum[accum.length - 1], ","]), line, pred]);
|
41
|
+
}, null)
|
42
|
+
);
|
43
|
+
|
44
|
+
const stmts = path.call(print, "body", 1);
|
45
|
+
const parts = [concat(["when ", align("when ".length, preds)])];
|
46
|
+
|
47
|
+
// It's possible in a when to just have empty void statements, in which case
|
48
|
+
// we would skip adding the body.
|
49
|
+
if (!stmts.parts.every((part) => !part)) {
|
50
|
+
parts.push(indent(concat([hardline, stmts])));
|
51
|
+
}
|
52
|
+
|
53
|
+
// This is the next clause on the case statement, either another `when` or
|
54
|
+
// an `else` clause.
|
55
|
+
if (addition) {
|
56
|
+
parts.push(hardline, path.call(print, "body", 2));
|
60
57
|
}
|
58
|
+
|
59
|
+
return group(concat(parts));
|
60
|
+
}
|
61
|
+
|
62
|
+
module.exports = {
|
63
|
+
case: printCase,
|
64
|
+
when: printWhen
|
61
65
|
};
|
data/src/nodes/methods.js
CHANGED
@@ -16,8 +16,7 @@ function printMethod(offset) {
|
|
16
16
|
}
|
17
17
|
|
18
18
|
// In case there are no parens but there are arguments
|
19
|
-
const parens =
|
20
|
-
params.type === "params" && params.body.some((paramType) => paramType);
|
19
|
+
const parens = params.type === "params" && params.body.some((type) => type);
|
21
20
|
|
22
21
|
declaration.push(
|
23
22
|
path.call(print, "body", offset),
|
@@ -49,10 +48,27 @@ function printMethod(offset) {
|
|
49
48
|
}
|
50
49
|
|
51
50
|
function printSingleLineMethod(path, opts, print) {
|
52
|
-
|
51
|
+
let paramsNode = path.getValue().body[1];
|
52
|
+
let paramsDoc = "";
|
53
|
+
|
54
|
+
if (paramsNode) {
|
55
|
+
if (paramsNode.body[0].type === "params") {
|
56
|
+
paramsNode = paramsNode.body[0];
|
57
|
+
}
|
58
|
+
|
59
|
+
if (paramsNode.type === "params" && paramsNode.body.some((type) => type)) {
|
60
|
+
paramsDoc = path.call(print, "body", 1);
|
61
|
+
}
|
62
|
+
}
|
53
63
|
|
54
64
|
return group(
|
55
|
-
concat([
|
65
|
+
concat([
|
66
|
+
"def ",
|
67
|
+
path.call(print, "body", 0),
|
68
|
+
paramsDoc,
|
69
|
+
" =",
|
70
|
+
indent(group(concat([line, path.call(print, "body", 2)])))
|
71
|
+
])
|
56
72
|
);
|
57
73
|
}
|
58
74
|
|
data/src/nodes/patterns.js
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
const { concat, group, hardline, indent, join, line } = require("../prettier");
|
2
2
|
|
3
|
+
const patterns = ["aryptn", "binary", "fndptn", "hshptn", "rassign"];
|
4
|
+
|
3
5
|
function printPatternArg(path, opts, print) {
|
4
6
|
// Pinning is a really special syntax in pattern matching that's not really
|
5
7
|
// all that well supported in ripper. Here we're just going to the original
|
@@ -34,10 +36,7 @@ function printAryPtn(path, opts, print) {
|
|
34
36
|
|
35
37
|
args = group(join(concat([",", line]), args));
|
36
38
|
|
37
|
-
if (
|
38
|
-
constant ||
|
39
|
-
["aryptn", "binary", "hshptn"].includes(path.getParentNode().type)
|
40
|
-
) {
|
39
|
+
if (constant || patterns.includes(path.getParentNode().type)) {
|
41
40
|
args = concat(["[", args, "]"]);
|
42
41
|
}
|
43
42
|
|
@@ -51,9 +50,9 @@ function printAryPtn(path, opts, print) {
|
|
51
50
|
function printFndPtn(path, opts, print) {
|
52
51
|
const [constant] = path.getValue().body;
|
53
52
|
|
54
|
-
let args = [path.call(print, "body", 1)]
|
53
|
+
let args = [concat(["*", path.call(print, "body", 1)])]
|
55
54
|
.concat(path.map(print, "body", 2))
|
56
|
-
.concat(path.call(print, "body", 3));
|
55
|
+
.concat(concat(["*", path.call(print, "body", 3)]));
|
57
56
|
|
58
57
|
args = concat(["[", group(join(concat([",", line]), args)), "]"]);
|
59
58
|
|
@@ -96,10 +95,8 @@ function printHshPtn(path, opts, print) {
|
|
96
95
|
|
97
96
|
if (constant) {
|
98
97
|
args = concat(["[", args, "]"]);
|
99
|
-
} else if (
|
100
|
-
["
|
101
|
-
) {
|
102
|
-
args = concat(["{", args, "}"]);
|
98
|
+
} else if (patterns.includes(path.getParentNode().type)) {
|
99
|
+
args = concat(["{ ", args, " }"]);
|
103
100
|
}
|
104
101
|
|
105
102
|
if (constant) {
|
@@ -127,9 +124,23 @@ function printIn(path, opts, print) {
|
|
127
124
|
return group(concat(parts));
|
128
125
|
}
|
129
126
|
|
127
|
+
function printRAssign(path, opts, print) {
|
128
|
+
const { keyword } = path.getValue();
|
129
|
+
const [leftDoc, rightDoc] = path.map(print, "body");
|
130
|
+
|
131
|
+
return group(
|
132
|
+
concat([
|
133
|
+
leftDoc,
|
134
|
+
keyword ? " in" : " =>",
|
135
|
+
group(indent(concat([line, rightDoc])))
|
136
|
+
])
|
137
|
+
);
|
138
|
+
}
|
139
|
+
|
130
140
|
module.exports = {
|
131
141
|
aryptn: printAryPtn,
|
132
142
|
fndptn: printFndPtn,
|
133
143
|
hshptn: printHshPtn,
|
134
|
-
in: printIn
|
144
|
+
in: printIn,
|
145
|
+
rassign: printRAssign
|
135
146
|
};
|
data/src/parser.rb
CHANGED
@@ -63,14 +63,14 @@ class Prettier::Parser < Ripper
|
|
63
63
|
# would happen to be the innermost keyword). Then the outer one would only be
|
64
64
|
# able to grab the first one. In this way all of the scanner events act as
|
65
65
|
# their own stack.
|
66
|
-
def find_scanner_event(type, body = :any)
|
66
|
+
def find_scanner_event(type, body = :any, consume: true)
|
67
67
|
index =
|
68
68
|
scanner_events.rindex do |scanner_event|
|
69
69
|
scanner_event[:type] == type &&
|
70
70
|
(body == :any || (scanner_event[:body] == body))
|
71
71
|
end
|
72
72
|
|
73
|
-
scanner_events.delete_at(index)
|
73
|
+
consume ? scanner_events.delete_at(index) : (index && scanner_events[index])
|
74
74
|
end
|
75
75
|
|
76
76
|
# Scanner events occur when the lexer hits a new token, like a keyword or an
|
@@ -675,8 +675,15 @@ class Prettier::Parser < Ripper
|
|
675
675
|
# It accepts as arguments the switch of the case and the consequent
|
676
676
|
# clause.
|
677
677
|
def on_case(switch, consequent)
|
678
|
-
|
679
|
-
|
678
|
+
beging =
|
679
|
+
if event = find_scanner_event(:@kw, 'case', consume: false)
|
680
|
+
scanner_events.delete(event).merge!(type: :case)
|
681
|
+
else
|
682
|
+
keyword = find_scanner_event(:@kw, 'in', consume: false)
|
683
|
+
switch.merge(type: :rassign, keyword: keyword)
|
684
|
+
end
|
685
|
+
|
686
|
+
beging.merge!(
|
680
687
|
body: [switch, consequent],
|
681
688
|
end: consequent[:end],
|
682
689
|
char_end: consequent[:char_end]
|
@@ -832,12 +839,12 @@ class Prettier::Parser < Ripper
|
|
832
839
|
# and normal method definitions.
|
833
840
|
beging = find_scanner_event(:@kw, 'def')
|
834
841
|
|
835
|
-
# If
|
836
|
-
|
842
|
+
# If we don't have a bodystmt node, then we have a single-line method
|
843
|
+
if bodystmt[:type] != :bodystmt
|
837
844
|
return(
|
838
845
|
{
|
839
846
|
type: :defsl,
|
840
|
-
body: [ident, bodystmt],
|
847
|
+
body: [ident, params, bodystmt],
|
841
848
|
start: beging[:start],
|
842
849
|
char_start: beging[:char_start],
|
843
850
|
end: bodystmt[:end],
|
@@ -1006,7 +1013,7 @@ class Prettier::Parser < Ripper
|
|
1006
1013
|
#
|
1007
1014
|
# which would be the same symbol as above.
|
1008
1015
|
def on_dyna_symbol(string)
|
1009
|
-
if
|
1016
|
+
if find_scanner_event(:@symbeg, consume: false)
|
1010
1017
|
# A normal dynamic symbol
|
1011
1018
|
beging = find_scanner_event(:@symbeg)
|
1012
1019
|
ending = find_scanner_event(:@tstring_end)
|
@@ -1345,8 +1352,12 @@ class Prettier::Parser < Ripper
|
|
1345
1352
|
end
|
1346
1353
|
|
1347
1354
|
# in is a parser event that represents using the in keyword within the
|
1348
|
-
# Ruby 2.7+ pattern matching syntax.
|
1355
|
+
# Ruby 2.7+ pattern matching syntax. Alternatively in Ruby 3+ it is also used
|
1356
|
+
# to handle rightward assignment for pattern matching.
|
1349
1357
|
def on_in(pattern, stmts, consequent)
|
1358
|
+
# Here we have a rightward assignment
|
1359
|
+
return pattern unless stmts
|
1360
|
+
|
1350
1361
|
beging = find_scanner_event(:@kw, 'in')
|
1351
1362
|
ending = consequent || find_scanner_event(:@kw, 'end')
|
1352
1363
|
|
@@ -1384,8 +1395,8 @@ class Prettier::Parser < Ripper
|
|
1384
1395
|
def on_lambda(params, stmts)
|
1385
1396
|
beging = find_scanner_event(:@tlambda)
|
1386
1397
|
|
1387
|
-
if
|
1388
|
-
opening =
|
1398
|
+
if event = find_scanner_event(:@tlambeg, consume: false)
|
1399
|
+
opening = scanner_events.delete(event)
|
1389
1400
|
closing = find_scanner_event(:@rbrace)
|
1390
1401
|
else
|
1391
1402
|
opening = find_scanner_event(:@kw, 'do')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prettier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Deisz
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-12-
|
11
|
+
date: 2020-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|