prettier 1.2.3 → 1.5.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/CHANGELOG.md +349 -358
- data/README.md +21 -93
- data/node_modules/prettier/index.js +54 -54
- data/package.json +1 -2
- data/rubocop.yml +26 -0
- data/src/haml/embed.js +87 -0
- data/src/haml/nodes/comment.js +27 -0
- data/src/haml/nodes/doctype.js +34 -0
- data/src/haml/nodes/filter.js +16 -0
- data/src/haml/nodes/hamlComment.js +21 -0
- data/src/haml/nodes/plain.js +6 -0
- data/src/haml/nodes/root.js +8 -0
- data/src/haml/nodes/script.js +33 -0
- data/src/haml/nodes/silentScript.js +59 -0
- data/src/haml/nodes/tag.js +193 -0
- data/src/haml/parser.js +22 -0
- data/src/haml/parser.rb +138 -0
- data/src/haml/printer.js +28 -0
- data/src/parser/getLang.js +32 -0
- data/src/parser/getNetcat.js +50 -0
- data/src/parser/netcat.js +15 -0
- data/src/parser/parseSync.js +33 -0
- data/src/parser/requestParse.js +74 -0
- data/src/parser/server.rb +61 -0
- data/src/plugin.js +26 -4
- data/src/prettier.js +1 -0
- data/src/rbs/parser.js +39 -0
- data/src/rbs/parser.rb +94 -0
- data/src/rbs/printer.js +605 -0
- data/src/ruby/embed.js +58 -8
- data/src/ruby/nodes/args.js +20 -6
- data/src/ruby/nodes/blocks.js +64 -59
- data/src/ruby/nodes/calls.js +12 -43
- data/src/ruby/nodes/class.js +17 -27
- data/src/ruby/nodes/commands.js +7 -2
- data/src/ruby/nodes/conditionals.js +1 -1
- data/src/ruby/nodes/hashes.js +28 -14
- data/src/ruby/nodes/hooks.js +9 -19
- data/src/ruby/nodes/loops.js +4 -10
- data/src/ruby/nodes/methods.js +8 -17
- data/src/ruby/nodes/params.js +22 -14
- data/src/ruby/nodes/patterns.js +9 -5
- data/src/ruby/nodes/rescue.js +32 -25
- data/src/ruby/nodes/return.js +0 -4
- data/src/ruby/nodes/statements.js +11 -13
- data/src/ruby/nodes/strings.js +27 -35
- data/src/ruby/parser.js +2 -49
- data/src/ruby/parser.rb +256 -232
- data/src/ruby/printer.js +0 -2
- data/src/ruby/toProc.js +4 -8
- data/src/utils.js +1 -0
- data/src/utils/isEmptyBodyStmt.js +7 -0
- data/src/utils/isEmptyStmts.js +9 -5
- data/src/utils/makeCall.js +3 -0
- data/src/utils/noIndent.js +1 -0
- data/src/utils/printEmptyCollection.js +9 -2
- metadata +26 -2
data/src/ruby/nodes/commands.js
CHANGED
@@ -105,8 +105,13 @@ function printCommandCall(path, opts, print) {
|
|
105
105
|
let breakDoc;
|
106
106
|
|
107
107
|
if (hasTernaryArg(node.body[3])) {
|
108
|
-
parts.
|
109
|
-
|
108
|
+
breakDoc = parts.concat(
|
109
|
+
"(",
|
110
|
+
indent(concat([softline, argDocs])),
|
111
|
+
softline,
|
112
|
+
")"
|
113
|
+
);
|
114
|
+
parts.push(" ");
|
110
115
|
} else if (skipArgsAlign(path)) {
|
111
116
|
parts.push(" ");
|
112
117
|
breakDoc = parts.concat(argDocs);
|
@@ -219,7 +219,7 @@ const printConditional = (keyword) => (path, { rubyModifier }, print) => {
|
|
219
219
|
|
220
220
|
// If the body of the conditional is empty, then we explicitly have to use the
|
221
221
|
// block form.
|
222
|
-
if (isEmptyStmts(statements)
|
222
|
+
if (isEmptyStmts(statements)) {
|
223
223
|
return concat([
|
224
224
|
`${keyword} `,
|
225
225
|
align(keyword.length + 1, path.call(print, "body", 0)),
|
data/src/ruby/nodes/hashes.js
CHANGED
@@ -6,6 +6,7 @@ const {
|
|
6
6
|
join,
|
7
7
|
line
|
8
8
|
} = require("../../prettier");
|
9
|
+
|
9
10
|
const {
|
10
11
|
getTrailingComma,
|
11
12
|
printEmptyCollection,
|
@@ -89,6 +90,13 @@ function printAssocNew(path, opts, print) {
|
|
89
90
|
const parts = [path.call((keyPath) => keyPrinter(keyPath, print), "body", 0)];
|
90
91
|
const valueDoc = path.call(print, "body", 1);
|
91
92
|
|
93
|
+
// If we're printing a child hash then we want it to break along with its
|
94
|
+
// parent hash, so we don't group the parts.
|
95
|
+
if (valueNode.type === "hash") {
|
96
|
+
parts.push(" ", valueDoc);
|
97
|
+
return concat(parts);
|
98
|
+
}
|
99
|
+
|
92
100
|
if (!skipAssignIndent(valueNode) || keyNode.comments) {
|
93
101
|
parts.push(indent(concat([line, valueDoc])));
|
94
102
|
} else {
|
@@ -125,20 +133,26 @@ function printHash(path, opts, print) {
|
|
125
133
|
return printEmptyCollection(path, opts, "{", "}");
|
126
134
|
}
|
127
135
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
136
|
+
let hashDoc = concat([
|
137
|
+
"{",
|
138
|
+
indent(
|
139
|
+
concat([
|
140
|
+
line,
|
141
|
+
path.call(print, "body", 0),
|
142
|
+
getTrailingComma(opts) ? ifBreak(",", "") : ""
|
143
|
+
])
|
144
|
+
),
|
145
|
+
line,
|
146
|
+
"}"
|
147
|
+
]);
|
148
|
+
|
149
|
+
// If we're inside another hash, then we don't want to group our contents
|
150
|
+
// because we want this hash to break along with its parent hash.
|
151
|
+
if (path.getParentNode().type === "assoc_new") {
|
152
|
+
return hashDoc;
|
153
|
+
}
|
154
|
+
|
155
|
+
return group(hashDoc);
|
142
156
|
}
|
143
157
|
|
144
158
|
module.exports = {
|
data/src/ruby/nodes/hooks.js
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
const { concat, group, indent, line } = require("../../prettier");
|
2
|
-
const { isEmptyStmts } = require("../../utils");
|
3
2
|
|
4
3
|
// The `BEGIN` and `END` keywords are used to hook into the Ruby process. Any
|
5
4
|
// `BEGIN` blocks are executed right when the process starts up, and the `END`
|
@@ -17,24 +16,15 @@ const { isEmptyStmts } = require("../../utils");
|
|
17
16
|
// nodes contain one child which is a `stmts` node.
|
18
17
|
function printHook(name) {
|
19
18
|
return function printHookWithName(path, opts, print) {
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
];
|
30
|
-
|
31
|
-
// If there are no statements but there are comments, then we want to skip
|
32
|
-
// printing the newline so that we don't end up with multiple spaces.
|
33
|
-
if (isEmptyStmts(stmtsNode) && stmtsNode.comments) {
|
34
|
-
parts[1] = indent(printedStmts);
|
35
|
-
}
|
36
|
-
|
37
|
-
return group(concat(parts));
|
19
|
+
return group(
|
20
|
+
concat([
|
21
|
+
name,
|
22
|
+
" ",
|
23
|
+
path.call(print, "body", 0),
|
24
|
+
indent(concat([line, path.call(print, "body", 1)])),
|
25
|
+
concat([line, "}"])
|
26
|
+
])
|
27
|
+
);
|
38
28
|
};
|
39
29
|
}
|
40
30
|
|
data/src/ruby/nodes/loops.js
CHANGED
@@ -10,7 +10,7 @@ const {
|
|
10
10
|
softline
|
11
11
|
} = require("../../prettier");
|
12
12
|
|
13
|
-
const { containsAssignment } = require("../../utils");
|
13
|
+
const { containsAssignment, isEmptyStmts } = require("../../utils");
|
14
14
|
const inlineEnsureParens = require("../../utils/inlineEnsureParens");
|
15
15
|
|
16
16
|
function printLoop(keyword, modifier) {
|
@@ -19,17 +19,11 @@ function printLoop(keyword, modifier) {
|
|
19
19
|
|
20
20
|
// If the only statement inside this while loop is a void statement, then we
|
21
21
|
// can shorten to just displaying the predicate and then a semicolon.
|
22
|
-
if (
|
23
|
-
stmts.body.length === 1 &&
|
24
|
-
stmts.body[0].type === "void_stmt" &&
|
25
|
-
!stmts.body[0].comments
|
26
|
-
) {
|
22
|
+
if (isEmptyStmts(stmts)) {
|
27
23
|
return group(
|
28
24
|
concat([
|
29
|
-
keyword,
|
30
|
-
|
31
|
-
path.call(print, "body", 0),
|
32
|
-
ifBreak(softline, "; "),
|
25
|
+
group(concat([keyword, " ", path.call(print, "body", 0)])),
|
26
|
+
hardline,
|
33
27
|
"end"
|
34
28
|
])
|
35
29
|
);
|
data/src/ruby/nodes/methods.js
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
const { concat, group, hardline, indent, line } = require("../../prettier");
|
2
|
+
const { isEmptyBodyStmt } = require("../../utils");
|
2
3
|
|
3
4
|
function printMethod(offset) {
|
4
5
|
return function printMethodWithOffset(path, opts, print) {
|
5
|
-
const [_name, params,
|
6
|
+
const [_name, params, bodystmt] = path.getValue().body.slice(offset);
|
6
7
|
const declaration = ["def "];
|
7
8
|
|
8
9
|
// In this case, we're printing a method that's defined as a singleton, so
|
@@ -24,16 +25,8 @@ function printMethod(offset) {
|
|
24
25
|
parens ? ")" : ""
|
25
26
|
);
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
if (
|
31
|
-
!body.body.slice(1).some((node) => node) &&
|
32
|
-
stmts.length === 1 &&
|
33
|
-
stmts[0].type === "void_stmt" &&
|
34
|
-
!stmts[0].comments
|
35
|
-
) {
|
36
|
-
return group(concat(declaration.concat(["; end"])));
|
28
|
+
if (isEmptyBodyStmt(bodystmt)) {
|
29
|
+
return group(concat(declaration.concat("; end")));
|
37
30
|
}
|
38
31
|
|
39
32
|
return group(
|
@@ -47,15 +40,13 @@ function printMethod(offset) {
|
|
47
40
|
}
|
48
41
|
|
49
42
|
function printSingleLineMethod(path, opts, print) {
|
50
|
-
let
|
43
|
+
let parensNode = path.getValue().body[1];
|
51
44
|
let paramsDoc = "";
|
52
45
|
|
53
|
-
if (
|
54
|
-
|
55
|
-
paramsNode = paramsNode.body[0];
|
56
|
-
}
|
46
|
+
if (parensNode) {
|
47
|
+
const paramsNode = parensNode.body[0];
|
57
48
|
|
58
|
-
if (paramsNode.
|
49
|
+
if (paramsNode.body.some((type) => type)) {
|
59
50
|
paramsDoc = path.call(print, "body", 1);
|
60
51
|
}
|
61
52
|
}
|
data/src/ruby/nodes/params.js
CHANGED
@@ -29,18 +29,22 @@ function printParams(path, opts, print) {
|
|
29
29
|
let parts = [];
|
30
30
|
|
31
31
|
if (reqs) {
|
32
|
-
|
32
|
+
path.each(
|
33
|
+
(reqPath) => {
|
34
|
+
// For some very strange reason, if you have a comment attached to a
|
35
|
+
// rest_param, it shows up here in the list of required params.
|
36
|
+
if (reqPath.getValue().type !== "rest_param") {
|
37
|
+
parts.push(print(reqPath));
|
38
|
+
}
|
39
|
+
},
|
40
|
+
"body",
|
41
|
+
0
|
42
|
+
);
|
33
43
|
}
|
34
44
|
|
35
45
|
if (optls) {
|
36
46
|
parts = parts.concat(
|
37
|
-
|
38
|
-
concat([
|
39
|
-
path.call(print, "body", 1, index, 0),
|
40
|
-
" = ",
|
41
|
-
path.call(print, "body", 1, index, 1)
|
42
|
-
])
|
43
|
-
)
|
47
|
+
path.map((optlPath) => join(" = ", optlPath.map(print)), "body", 1)
|
44
48
|
);
|
45
49
|
}
|
46
50
|
|
@@ -54,12 +58,16 @@ function printParams(path, opts, print) {
|
|
54
58
|
|
55
59
|
if (kwargs) {
|
56
60
|
parts = parts.concat(
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
61
|
+
path.map(
|
62
|
+
(kwargPath) => {
|
63
|
+
if (!kwargPath.getValue()[1]) {
|
64
|
+
return kwargPath.call(print, 0);
|
65
|
+
}
|
66
|
+
return group(join(" ", kwargPath.map(print)));
|
67
|
+
},
|
68
|
+
"body",
|
69
|
+
4
|
70
|
+
)
|
63
71
|
);
|
64
72
|
}
|
65
73
|
|
data/src/ruby/nodes/patterns.js
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
const {
|
2
|
+
align,
|
2
3
|
concat,
|
3
4
|
group,
|
4
5
|
hardline,
|
@@ -74,7 +75,7 @@ function printHshPtn(path, opts, print) {
|
|
74
75
|
const [constant, keyValuePairs, keyValueRest] = path.getValue().body;
|
75
76
|
let args = [];
|
76
77
|
|
77
|
-
if (keyValuePairs) {
|
78
|
+
if (keyValuePairs.length > 0) {
|
78
79
|
const printPair = (pairPath) => {
|
79
80
|
const parts = [pairPath.call(print, 0)];
|
80
81
|
|
@@ -116,10 +117,13 @@ function printHshPtn(path, opts, print) {
|
|
116
117
|
function printIn(path, opts, print) {
|
117
118
|
const parts = [
|
118
119
|
"in ",
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
120
|
+
align(
|
121
|
+
"in ".length,
|
122
|
+
path.call(
|
123
|
+
(valuePath) => printPatternArg(valuePath, opts, print),
|
124
|
+
"body",
|
125
|
+
0
|
126
|
+
)
|
123
127
|
),
|
124
128
|
indent(concat([hardline, path.call(print, "body", 1)]))
|
125
129
|
];
|
data/src/ruby/nodes/rescue.js
CHANGED
@@ -26,28 +26,10 @@ function printEnsure(path, opts, print) {
|
|
26
26
|
}
|
27
27
|
|
28
28
|
function printRescue(path, opts, print) {
|
29
|
-
const [exception, variable, _stmts, addition] = path.getValue().body;
|
30
29
|
const parts = ["rescue"];
|
31
30
|
|
32
|
-
if (
|
33
|
-
|
34
|
-
if (Array.isArray(exception)) {
|
35
|
-
// In this case, it's actually only the one exception (it's an array
|
36
|
-
// of length 1).
|
37
|
-
parts.push(" ", path.call(print, "body", 0, 0));
|
38
|
-
} else {
|
39
|
-
// Here we have multiple exceptions from which we're rescuing, so we
|
40
|
-
// need to align them and join them together.
|
41
|
-
const joiner = concat([",", line]);
|
42
|
-
const exceptions = group(join(joiner, path.call(print, "body", 0)));
|
43
|
-
|
44
|
-
parts.push(" ", align("rescue ".length, exceptions));
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
|
-
if (variable) {
|
49
|
-
parts.push(" => ", path.call(print, "body", 1));
|
50
|
-
}
|
31
|
+
if (path.getValue().body[0]) {
|
32
|
+
parts.push(align("rescue ".length, path.call(print, "body", 0)));
|
51
33
|
} else {
|
52
34
|
// If you don't specify an error to rescue in a `begin/rescue` block, then
|
53
35
|
// implicitly you're rescuing from `StandardError`. In this case, we're
|
@@ -55,16 +37,40 @@ function printRescue(path, opts, print) {
|
|
55
37
|
parts.push(" StandardError");
|
56
38
|
}
|
57
39
|
|
58
|
-
const
|
40
|
+
const bodystmt = path.call(print, "body", 1);
|
59
41
|
|
60
|
-
if (
|
61
|
-
parts.push(indent(concat([hardline,
|
42
|
+
if (bodystmt.parts.length > 0) {
|
43
|
+
parts.push(indent(concat([hardline, bodystmt])));
|
62
44
|
}
|
63
45
|
|
64
46
|
// This is the next clause on the `begin` statement, either another
|
65
47
|
// `rescue`, and `ensure`, or an `else` clause.
|
66
|
-
if (
|
67
|
-
parts.push(concat([hardline, path.call(print, "body",
|
48
|
+
if (path.getValue().body[2]) {
|
49
|
+
parts.push(concat([hardline, path.call(print, "body", 2)]));
|
50
|
+
}
|
51
|
+
|
52
|
+
return group(concat(parts));
|
53
|
+
}
|
54
|
+
|
55
|
+
// This is a container node that we're adding into the AST that isn't present in
|
56
|
+
// Ripper solely so that we have a nice place to attach inline comments.
|
57
|
+
function printRescueEx(path, opts, print) {
|
58
|
+
const [exception, variable] = path.getValue().body;
|
59
|
+
const parts = [];
|
60
|
+
|
61
|
+
if (exception) {
|
62
|
+
let exceptionDoc = path.call(print, "body", 0);
|
63
|
+
|
64
|
+
if (Array.isArray(exceptionDoc)) {
|
65
|
+
const joiner = concat([",", line]);
|
66
|
+
exceptionDoc = group(join(joiner, exceptionDoc));
|
67
|
+
}
|
68
|
+
|
69
|
+
parts.push(" ", exceptionDoc);
|
70
|
+
}
|
71
|
+
|
72
|
+
if (variable) {
|
73
|
+
parts.push(" => ", path.call(print, "body", 1));
|
68
74
|
}
|
69
75
|
|
70
76
|
return group(concat(parts));
|
@@ -89,6 +95,7 @@ module.exports = {
|
|
89
95
|
ensure: printEnsure,
|
90
96
|
redo: literal("redo"),
|
91
97
|
rescue: printRescue,
|
98
|
+
rescue_ex: printRescueEx,
|
92
99
|
rescue_mod: printRescueMod,
|
93
100
|
retry: literal("retry")
|
94
101
|
};
|
data/src/ruby/nodes/return.js
CHANGED
@@ -41,10 +41,6 @@ const printReturn = (path, opts, print) => {
|
|
41
41
|
let args = path.getValue().body[0].body[0];
|
42
42
|
let steps = ["body", 0, "body", 0];
|
43
43
|
|
44
|
-
if (!args) {
|
45
|
-
return "return";
|
46
|
-
}
|
47
|
-
|
48
44
|
if (args.body.length === 1) {
|
49
45
|
// If the body of the return contains parens, then just skip directly to the
|
50
46
|
// content of the parens so that we can skip printing parens if we don't
|
@@ -12,15 +12,13 @@ const {
|
|
12
12
|
trim
|
13
13
|
} = require("../../prettier");
|
14
14
|
|
15
|
+
const { isEmptyStmts } = require("../../utils");
|
16
|
+
|
15
17
|
function printBodyStmt(path, opts, print) {
|
16
18
|
const [stmts, rescue, elseClause, ensure] = path.getValue().body;
|
17
19
|
const parts = [];
|
18
20
|
|
19
|
-
if (
|
20
|
-
stmts.body.length > 1 ||
|
21
|
-
stmts.body[0].type != "void_stmt" ||
|
22
|
-
stmts.body[0].comments
|
23
|
-
) {
|
21
|
+
if (!isEmptyStmts(stmts)) {
|
24
22
|
parts.push(path.call(print, "body", 0));
|
25
23
|
}
|
26
24
|
|
@@ -30,6 +28,7 @@ function printBodyStmt(path, opts, print) {
|
|
30
28
|
|
31
29
|
if (elseClause) {
|
32
30
|
// Before Ruby 2.6, this piece of bodystmt was an explicit "else" node
|
31
|
+
/* istanbul ignore next */
|
33
32
|
const stmts =
|
34
33
|
elseClause.type === "else"
|
35
34
|
? path.call(print, "body", 2, "body", 0)
|
@@ -69,11 +68,7 @@ function printParen(path, opts, print) {
|
|
69
68
|
}
|
70
69
|
|
71
70
|
return group(
|
72
|
-
concat([
|
73
|
-
"(",
|
74
|
-
indent(concat([softline, contentDoc])),
|
75
|
-
concat([softline, ")"])
|
76
|
-
])
|
71
|
+
concat(["(", indent(concat([softline, contentDoc])), softline, ")"])
|
77
72
|
);
|
78
73
|
}
|
79
74
|
|
@@ -82,6 +77,9 @@ module.exports = {
|
|
82
77
|
const { body } = path.getValue();
|
83
78
|
return concat([trim, "__END__", literalline, body]);
|
84
79
|
},
|
80
|
+
"@comment"(path, opts, _print) {
|
81
|
+
return opts.printer.printComment(path);
|
82
|
+
},
|
85
83
|
bodystmt: printBodyStmt,
|
86
84
|
paren: printParen,
|
87
85
|
program: (path, opts, print) =>
|
@@ -123,12 +121,12 @@ module.exports = {
|
|
123
121
|
if (lineNo === null) {
|
124
122
|
parts.push(printed);
|
125
123
|
} else if (
|
126
|
-
stmt.
|
124
|
+
stmt.sl - lineNo > 1 ||
|
127
125
|
[stmt.type, stmts[index - 1].type].includes("access_ctrl")
|
128
126
|
) {
|
129
127
|
parts.push(hardline, hardline, printed);
|
130
128
|
} else if (
|
131
|
-
stmt.
|
129
|
+
stmt.sl !== lineNo ||
|
132
130
|
path.getParentNode().type !== "string_embexpr"
|
133
131
|
) {
|
134
132
|
parts.push(hardline, printed);
|
@@ -136,7 +134,7 @@ module.exports = {
|
|
136
134
|
parts.push("; ", printed);
|
137
135
|
}
|
138
136
|
|
139
|
-
lineNo = stmt.
|
137
|
+
lineNo = stmt.el;
|
140
138
|
});
|
141
139
|
|
142
140
|
return concat(parts);
|