prettier 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -1
- data/dist/haml/parser.rb +6 -0
- data/dist/parser/getInfo.js +9 -2
- data/dist/parser/server.rb +6 -2
- data/dist/rbs/parser.rb +59 -2
- data/dist/rbs/printer.js +14 -6
- data/dist/ruby/embed.js +10 -5
- data/dist/ruby/location.js +19 -0
- data/dist/ruby/nodes/alias.js +6 -5
- data/dist/ruby/nodes/aref.js +4 -6
- data/dist/ruby/nodes/args.js +29 -56
- data/dist/ruby/nodes/arrays.js +31 -35
- data/dist/ruby/nodes/assign.js +19 -23
- data/dist/ruby/nodes/blocks.js +18 -15
- data/dist/ruby/nodes/calls.js +33 -30
- data/dist/ruby/nodes/case.js +8 -8
- data/dist/ruby/nodes/class.js +13 -13
- data/dist/ruby/nodes/commands.js +36 -22
- data/dist/ruby/nodes/conditionals.js +56 -52
- data/dist/ruby/nodes/constants.js +10 -13
- data/dist/ruby/nodes/flow.js +39 -46
- data/dist/ruby/nodes/hashes.js +26 -30
- data/dist/ruby/nodes/heredocs.js +9 -9
- data/dist/ruby/nodes/hooks.js +2 -2
- data/dist/ruby/nodes/ints.js +5 -5
- data/dist/ruby/nodes/lambdas.js +7 -6
- data/dist/ruby/nodes/loops.js +26 -24
- data/dist/ruby/nodes/massign.js +22 -35
- data/dist/ruby/nodes/methods.js +20 -40
- data/dist/ruby/nodes/operators.js +26 -28
- data/dist/ruby/nodes/params.js +31 -25
- data/dist/ruby/nodes/patterns.js +34 -37
- data/dist/ruby/nodes/regexp.js +6 -6
- data/dist/ruby/nodes/rescue.js +23 -22
- data/dist/ruby/nodes/return.js +61 -36
- data/dist/ruby/nodes/statements.js +24 -25
- data/dist/ruby/nodes/strings.js +36 -34
- data/dist/ruby/nodes/super.js +6 -10
- data/dist/ruby/nodes/undef.js +19 -14
- data/dist/ruby/nodes.js +47 -21
- data/dist/ruby/parser.js +3 -2
- data/dist/ruby/parser.rb +8470 -2972
- data/dist/ruby/printer.js +9 -71
- data/dist/ruby/toProc.js +33 -35
- data/dist/types.js +5 -1
- data/dist/utils/containsAssignment.js +5 -2
- data/dist/utils/getChildNodes.js +305 -0
- data/dist/utils/inlineEnsureParens.js +1 -1
- data/dist/utils/isEmptyBodyStmt.js +1 -1
- data/dist/utils/isEmptyParams.js +12 -0
- data/dist/utils/isEmptyStmts.js +1 -1
- data/dist/utils/makeCall.js +5 -4
- data/dist/utils/printEmptyCollection.js +3 -1
- data/dist/utils/skipAssignIndent.js +6 -2
- data/dist/utils.js +5 -3
- data/lib/prettier.rb +2 -1
- data/node_modules/prettier/bin-prettier.js +48 -18924
- data/node_modules/prettier/cli.js +12335 -0
- data/node_modules/prettier/doc.js +1306 -4755
- data/node_modules/prettier/index.js +37468 -57614
- data/node_modules/prettier/package.json +3 -2
- data/node_modules/prettier/parser-angular.js +2 -66
- data/node_modules/prettier/parser-babel.js +27 -22
- data/node_modules/prettier/parser-espree.js +26 -22
- data/node_modules/prettier/parser-flow.js +26 -22
- data/node_modules/prettier/parser-glimmer.js +27 -1
- data/node_modules/prettier/parser-graphql.js +15 -1
- data/node_modules/prettier/parser-html.js +21 -117
- data/node_modules/prettier/parser-markdown.js +61 -19
- data/node_modules/prettier/parser-meriyah.js +19 -22
- data/node_modules/prettier/parser-postcss.js +76 -22
- data/node_modules/prettier/parser-typescript.js +280 -22
- data/node_modules/prettier/parser-yaml.js +150 -15
- data/node_modules/prettier/third-party.js +8660 -11030
- data/package.json +7 -7
- metadata +7 -3
data/dist/ruby/nodes/commands.js
CHANGED
@@ -10,11 +10,19 @@ const { align, group, ifBreak, indent, join, line, softline } = prettier_1.defau
|
|
10
10
|
function throwBadDoc(doc) {
|
11
11
|
throw new Error(`Unknown doc ${doc}`);
|
12
12
|
}
|
13
|
+
function reduceDocLength(sum, doc) {
|
14
|
+
// If we've hit a line, then we're going to start the counting back at 0 since
|
15
|
+
// it will be starting from the beginning of a line.
|
16
|
+
if (typeof doc === "object" && !Array.isArray(doc) && doc.type === "line") {
|
17
|
+
return 0;
|
18
|
+
}
|
19
|
+
return sum + docBreakLength(doc);
|
20
|
+
}
|
13
21
|
// Loop through the already created doc nodes and determine the overall length
|
14
22
|
// so that we can properly align the command arguments.
|
15
|
-
function
|
23
|
+
function docBreakLength(doc) {
|
16
24
|
if (Array.isArray(doc)) {
|
17
|
-
return doc.reduce(
|
25
|
+
return doc.reduce(reduceDocLength, 0);
|
18
26
|
}
|
19
27
|
if (typeof doc === "string") {
|
20
28
|
return doc.length;
|
@@ -22,16 +30,16 @@ function docLength(doc) {
|
|
22
30
|
switch (doc.type) {
|
23
31
|
case "concat":
|
24
32
|
case "fill":
|
25
|
-
return doc.parts.reduce(
|
33
|
+
return doc.parts.reduce(reduceDocLength, 0);
|
26
34
|
case "align":
|
27
35
|
case "group":
|
28
36
|
case "indent":
|
29
37
|
case "line-suffix":
|
30
|
-
return
|
38
|
+
return docBreakLength(doc.contents);
|
31
39
|
case "if-break":
|
32
|
-
return
|
40
|
+
return docBreakLength(doc.breakContents);
|
33
41
|
case "line":
|
34
|
-
return
|
42
|
+
return 0;
|
35
43
|
case "break-parent":
|
36
44
|
case "cursor":
|
37
45
|
case "indent-if-break":
|
@@ -44,10 +52,10 @@ function docLength(doc) {
|
|
44
52
|
}
|
45
53
|
}
|
46
54
|
function hasDef(node) {
|
47
|
-
return (node.
|
48
|
-
node.
|
49
|
-
node.
|
50
|
-
["def", "defs"].includes(node.
|
55
|
+
return (node.args.type === "args_add_block" &&
|
56
|
+
node.args.args.type === "args" &&
|
57
|
+
node.args.args.parts[0] &&
|
58
|
+
["def", "defs"].includes(node.args.args.parts[0].type));
|
51
59
|
}
|
52
60
|
// Very special handling case for rspec matchers. In general with rspec matchers
|
53
61
|
// you expect to see something like:
|
@@ -63,19 +71,25 @@ function hasDef(node) {
|
|
63
71
|
// In this case the arguments are aligned to the left side as opposed to being
|
64
72
|
// aligned with the `receive` call.
|
65
73
|
function skipArgsAlign(node) {
|
66
|
-
return ["to", "not_to", "to_not"].includes(node.
|
74
|
+
return ["to", "not_to", "to_not"].includes(node.message.value);
|
67
75
|
}
|
68
76
|
// If there is a ternary argument to a command and it's going to get broken
|
69
77
|
// into multiple lines, then we're going to have to use parentheses around the
|
70
78
|
// command in order to make sure operator precedence doesn't get messed up.
|
71
79
|
function hasTernaryArg(node) {
|
72
|
-
|
80
|
+
var _a;
|
81
|
+
switch (node.type) {
|
82
|
+
case "args":
|
83
|
+
return node.parts.some((child) => child.type === "ifop");
|
84
|
+
case "args_add_block":
|
85
|
+
return hasTernaryArg(node.args) || ((_a = node.block) === null || _a === void 0 ? void 0 : _a.type) === "ifop";
|
86
|
+
}
|
73
87
|
}
|
74
88
|
const printCommand = (path, opts, print) => {
|
75
89
|
const node = path.getValue();
|
76
|
-
const command = path.call(print, "
|
77
|
-
const joinedArgs = join([",", line], path.call(print, "
|
78
|
-
const hasTernary = hasTernaryArg(node.
|
90
|
+
const command = path.call(print, "message");
|
91
|
+
const joinedArgs = join([",", line], path.call(print, "args"));
|
92
|
+
const hasTernary = hasTernaryArg(node.args);
|
79
93
|
let breakArgs;
|
80
94
|
if (hasTernary) {
|
81
95
|
breakArgs = indent([softline, joinedArgs]);
|
@@ -84,7 +98,7 @@ const printCommand = (path, opts, print) => {
|
|
84
98
|
breakArgs = joinedArgs;
|
85
99
|
}
|
86
100
|
else {
|
87
|
-
breakArgs = align(
|
101
|
+
breakArgs = align(docBreakLength(command) + 1, joinedArgs);
|
88
102
|
}
|
89
103
|
return group(ifBreak([
|
90
104
|
command,
|
@@ -97,16 +111,16 @@ exports.printCommand = printCommand;
|
|
97
111
|
const printCommandCall = (path, opts, print) => {
|
98
112
|
const node = path.getValue();
|
99
113
|
const parts = [
|
100
|
-
path.call(print, "
|
114
|
+
path.call(print, "receiver"),
|
101
115
|
(0, utils_1.makeCall)(path, opts, print),
|
102
|
-
path.call(print, "
|
116
|
+
path.call(print, "message")
|
103
117
|
];
|
104
|
-
if (!node.
|
118
|
+
if (!node.args) {
|
105
119
|
return parts;
|
106
120
|
}
|
107
|
-
const argDocs = join([",", line], path.call(print, "
|
121
|
+
const argDocs = join([",", line], path.call(print, "args"));
|
108
122
|
let breakDoc;
|
109
|
-
if (hasTernaryArg(node.
|
123
|
+
if (hasTernaryArg(node.args)) {
|
110
124
|
breakDoc = parts.concat("(", indent([softline, argDocs]), softline, ")");
|
111
125
|
parts.push(" ");
|
112
126
|
}
|
@@ -116,7 +130,7 @@ const printCommandCall = (path, opts, print) => {
|
|
116
130
|
}
|
117
131
|
else {
|
118
132
|
parts.push(" ");
|
119
|
-
breakDoc = parts.concat(align(
|
133
|
+
breakDoc = parts.concat(align(docBreakLength(parts), argDocs));
|
120
134
|
}
|
121
135
|
const joinedDoc = parts.concat(argDocs);
|
122
136
|
return group(ifBreak(breakDoc, joinedDoc));
|
@@ -16,9 +16,9 @@ function containsSingleConditional(stmts) {
|
|
16
16
|
function printWithAddition(keyword, path, print, breaking) {
|
17
17
|
return [
|
18
18
|
`${keyword} `,
|
19
|
-
align(keyword.length + 1, path.call(print, "
|
20
|
-
indent([softline, path.call(print, "
|
21
|
-
[softline, path.call(print, "
|
19
|
+
align(keyword.length + 1, path.call(print, "pred")),
|
20
|
+
indent([softline, path.call(print, "stmts")]),
|
21
|
+
[softline, path.call(print, "cons")],
|
22
22
|
[softline, "end"],
|
23
23
|
breaking ? breakParent : ""
|
24
24
|
];
|
@@ -54,26 +54,30 @@ function printTernaryClauses(keyword, truthyClause, falsyClause) {
|
|
54
54
|
// Handles ternary nodes. If it does not fit on one line, then we break out into
|
55
55
|
// an if/else statement. Otherwise we remain as a ternary.
|
56
56
|
const printTernary = (path, _opts, print) => {
|
57
|
-
const
|
58
|
-
const
|
57
|
+
const predicateDoc = path.call(print, "pred");
|
58
|
+
const truthyDoc = path.call(print, "tthy");
|
59
|
+
const falsyDoc = path.call(print, "flsy");
|
59
60
|
return group(ifBreak([
|
60
61
|
"if ",
|
61
|
-
align(3,
|
62
|
-
indent([softline,
|
62
|
+
align(3, predicateDoc),
|
63
|
+
indent([softline, truthyDoc]),
|
63
64
|
[softline, "else"],
|
64
|
-
indent([softline,
|
65
|
+
indent([softline, falsyDoc]),
|
65
66
|
[softline, "end"]
|
66
|
-
], [
|
67
|
+
], [predicateDoc, " ? ", ...printTernaryClauses("if", truthyDoc, falsyDoc)]));
|
67
68
|
};
|
68
69
|
exports.printTernary = printTernary;
|
70
|
+
function isModifier(node) {
|
71
|
+
return node.type === "if_mod" || node.type === "unless_mod";
|
72
|
+
}
|
69
73
|
// Prints an `if_mod` or `unless_mod` node. Because it was previously in the
|
70
74
|
// modifier form, we're guaranteed to not have an additional node, so we can
|
71
75
|
// just work with the predicate and the body.
|
72
|
-
function printSingle(keyword
|
76
|
+
function printSingle(keyword) {
|
73
77
|
return function printSingleWithKeyword(path, { rubyModifier }, print) {
|
74
|
-
const
|
75
|
-
const predicateDoc = path.call(print, "
|
76
|
-
const statementsDoc = path.call(print, "
|
78
|
+
const node = path.getValue();
|
79
|
+
const predicateDoc = path.call(print, "pred");
|
80
|
+
const statementsDoc = path.call(print, isModifier(node) ? "stmt" : "stmts");
|
77
81
|
const multilineParts = [
|
78
82
|
`${keyword} `,
|
79
83
|
align(keyword.length + 1, predicateDoc),
|
@@ -84,22 +88,21 @@ function printSingle(keyword, modifier = false) {
|
|
84
88
|
// If we do not allow modifier form conditionals or there are comments
|
85
89
|
// inside of the body of the conditional, then we must print in the
|
86
90
|
// multiline form.
|
87
|
-
if (!rubyModifier ||
|
88
|
-
(!modifier && statementsNode.body[0].comments)) {
|
91
|
+
if (!rubyModifier || (!isModifier(node) && node.stmts.body[0].comments)) {
|
89
92
|
return [multilineParts, breakParent];
|
90
93
|
}
|
91
94
|
const inline = (0, utils_1.inlineEnsureParens)(path, [
|
92
|
-
|
95
|
+
statementsDoc,
|
93
96
|
` ${keyword} `,
|
94
|
-
|
97
|
+
predicateDoc
|
95
98
|
]);
|
96
|
-
//
|
99
|
+
// With an expression with a conditional modifier (expression if true), the
|
97
100
|
// conditional body is parsed before the predicate expression, meaning that
|
98
101
|
// if the parser encountered a variable declaration, it would initialize
|
99
102
|
// that variable first before evaluating the predicate expression. That
|
100
103
|
// parse order means the difference between a NameError or not. #591
|
101
104
|
// https://docs.ruby-lang.org/en/2.0.0/syntax/control_expressions_rdoc.html#label-Modifier+if+and+unless
|
102
|
-
if (
|
105
|
+
if (isModifier(node) && (0, utils_1.containsAssignment)(node.stmt)) {
|
103
106
|
return inline;
|
104
107
|
}
|
105
108
|
return group(ifBreak(multilineParts, inline));
|
@@ -144,7 +147,7 @@ function canTernaryStmts(stmts) {
|
|
144
147
|
const stmt = stmts.body[0];
|
145
148
|
// If the user is using one of the lower precedence "and" or "or" operators,
|
146
149
|
// then we can't use a ternary expression as it would break the flow control.
|
147
|
-
if (stmt.type === "binary" && ["and", "or"].includes(stmt.
|
150
|
+
if (stmt.type === "binary" && ["and", "or"].includes(stmt.op)) {
|
148
151
|
return false;
|
149
152
|
}
|
150
153
|
// Check against the blocklist of statement types that are not allowed to be
|
@@ -157,55 +160,56 @@ function canTernaryStmts(stmts) {
|
|
157
160
|
// additional node must have only one statement, and that statement list must
|
158
161
|
// pass the `canTernaryStmts` check.
|
159
162
|
function canTernary(path) {
|
160
|
-
const
|
161
|
-
return (!["assign", "opassign", "command_call", "command"].includes(
|
162
|
-
|
163
|
-
|
164
|
-
|
163
|
+
const node = path.getValue();
|
164
|
+
return (!["assign", "opassign", "command_call", "command"].includes(node.pred.type) &&
|
165
|
+
node.cons &&
|
166
|
+
node.cons.type === "else" &&
|
167
|
+
canTernaryStmts(node.stmts) &&
|
168
|
+
canTernaryStmts(node.cons.stmts));
|
165
169
|
}
|
166
170
|
// A normalized print function for both `if` and `unless` nodes.
|
167
171
|
function printConditional(keyword) {
|
168
|
-
return (path, opts, print)
|
172
|
+
return function printConditionalWithKeyword(path, opts, print) {
|
169
173
|
if (canTernary(path)) {
|
170
174
|
let ternaryParts = [
|
171
|
-
path.call(print, "
|
175
|
+
path.call(print, "pred"),
|
172
176
|
" ? ",
|
173
|
-
...printTernaryClauses(keyword, path.call(print, "
|
177
|
+
...printTernaryClauses(keyword, path.call(print, "stmts"), path.call(print, "cons", "stmts"))
|
174
178
|
];
|
175
179
|
if (["binary", "call"].includes(path.getParentNode().type)) {
|
176
180
|
ternaryParts = ["(", ...ternaryParts, ")"];
|
177
181
|
}
|
178
182
|
return group(ifBreak(printWithAddition(keyword, path, print, false), ternaryParts));
|
179
183
|
}
|
180
|
-
const
|
184
|
+
const node = path.getValue();
|
181
185
|
// If there's an additional clause that wasn't matched earlier, we know we
|
182
186
|
// can't go for the inline option.
|
183
|
-
if (
|
187
|
+
if (node.cons) {
|
184
188
|
return group(printWithAddition(keyword, path, print, true));
|
185
189
|
}
|
186
|
-
// If the body of the conditional is empty, then we explicitly have to use
|
187
|
-
// block form.
|
188
|
-
if ((0, utils_1.isEmptyStmts)(
|
190
|
+
// If the body of the conditional is empty, then we explicitly have to use
|
191
|
+
// the block form.
|
192
|
+
if ((0, utils_1.isEmptyStmts)(node.stmts)) {
|
189
193
|
return [
|
190
194
|
`${keyword} `,
|
191
|
-
align(keyword.length + 1, path.call(print, "
|
195
|
+
align(keyword.length + 1, path.call(print, "pred")),
|
192
196
|
hardline,
|
193
197
|
"end"
|
194
198
|
];
|
195
199
|
}
|
196
200
|
// Two situations in which we need to use the block form:
|
197
201
|
//
|
198
|
-
// 1. If the predicate of the conditional contains an assignment, then we
|
199
|
-
// know for sure that it doesn't impact the body of the conditional.
|
202
|
+
// 1. If the predicate of the conditional contains an assignment, then we
|
203
|
+
// can't know for sure that it doesn't impact the body of the conditional.
|
200
204
|
//
|
201
|
-
// 2. If the conditional contains just another conditional, then collapsing
|
202
|
-
// would result in double modifiers on the same line.
|
203
|
-
if ((0, utils_1.containsAssignment)(
|
204
|
-
containsSingleConditional(
|
205
|
+
// 2. If the conditional contains just another conditional, then collapsing
|
206
|
+
// it would result in double modifiers on the same line.
|
207
|
+
if ((0, utils_1.containsAssignment)(node.pred) ||
|
208
|
+
containsSingleConditional(node.stmts)) {
|
205
209
|
return [
|
206
210
|
`${keyword} `,
|
207
|
-
align(keyword.length + 1, path.call(print, "
|
208
|
-
indent([hardline, path.call(print, "
|
211
|
+
align(keyword.length + 1, path.call(print, "pred")),
|
212
|
+
indent([hardline, path.call(print, "stmts")]),
|
209
213
|
hardline,
|
210
214
|
"end"
|
211
215
|
];
|
@@ -214,29 +218,29 @@ function printConditional(keyword) {
|
|
214
218
|
};
|
215
219
|
}
|
216
220
|
const printElse = (path, opts, print) => {
|
217
|
-
const
|
221
|
+
const node = path.getValue();
|
218
222
|
return [
|
219
|
-
stmts.body.length === 1 && stmts.body[0].type === "command"
|
223
|
+
node.stmts.body.length === 1 && node.stmts.body[0].type === "command"
|
220
224
|
? breakParent
|
221
225
|
: "",
|
222
226
|
"else",
|
223
|
-
indent([softline, path.call(print, "
|
227
|
+
indent([softline, path.call(print, "stmts")])
|
224
228
|
];
|
225
229
|
};
|
226
230
|
exports.printElse = printElse;
|
227
231
|
const printElsif = (path, opts, print) => {
|
228
|
-
const
|
232
|
+
const node = path.getValue();
|
229
233
|
const parts = [
|
230
|
-
group(["elsif ", align("elsif".length - 1, path.call(print, "
|
231
|
-
indent([hardline, path.call(print, "
|
234
|
+
group(["elsif ", align("elsif".length - 1, path.call(print, "pred"))]),
|
235
|
+
indent([hardline, path.call(print, "stmts")])
|
232
236
|
];
|
233
|
-
if (
|
234
|
-
parts.push(group([hardline, path.call(print, "
|
237
|
+
if (node.cons) {
|
238
|
+
parts.push(group([hardline, path.call(print, "cons")]));
|
235
239
|
}
|
236
240
|
return group(parts);
|
237
241
|
};
|
238
242
|
exports.printElsif = printElsif;
|
239
243
|
exports.printIf = printConditional("if");
|
240
|
-
exports.printIfModifier = printSingle("if"
|
244
|
+
exports.printIfModifier = printSingle("if");
|
241
245
|
exports.printUnless = printConditional("unless");
|
242
|
-
exports.printUnlessModifier = printSingle("unless"
|
246
|
+
exports.printUnlessModifier = printSingle("unless");
|
@@ -6,19 +6,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.printTopConst = exports.printField = exports.printDefined = exports.printConstRef = exports.printConstPath = void 0;
|
7
7
|
const prettier_1 = __importDefault(require("../../prettier"));
|
8
8
|
const utils_1 = require("../../utils");
|
9
|
-
const { group, indent,
|
10
|
-
const printConstPath = (path, opts, print) =>
|
11
|
-
return join("::", path.map(print, "body"));
|
12
|
-
};
|
9
|
+
const { group, indent, softline } = prettier_1.default;
|
10
|
+
const printConstPath = (path, opts, print) => [path.call(print, "parent"), "::", path.call(print, "constant")];
|
13
11
|
exports.printConstPath = printConstPath;
|
14
|
-
const printConstRef = (path, opts, print) =>
|
15
|
-
return path.call(print, "body", 0);
|
16
|
-
};
|
12
|
+
const printConstRef = (path, opts, print) => path.call(print, "constant");
|
17
13
|
exports.printConstRef = printConstRef;
|
18
14
|
const printDefined = (path, opts, print) => {
|
19
15
|
return group([
|
20
16
|
"defined?(",
|
21
|
-
indent([softline, path.call(print, "
|
17
|
+
indent([softline, path.call(print, "value")]),
|
22
18
|
softline,
|
23
19
|
")"
|
24
20
|
]);
|
@@ -26,13 +22,14 @@ const printDefined = (path, opts, print) => {
|
|
26
22
|
exports.printDefined = printDefined;
|
27
23
|
const printField = (path, opts, print) => {
|
28
24
|
return group([
|
29
|
-
path.call(print, "
|
25
|
+
path.call(print, "parent"),
|
30
26
|
(0, utils_1.makeCall)(path, opts, print),
|
31
|
-
path.call(print, "
|
27
|
+
path.call(print, "name")
|
32
28
|
]);
|
33
29
|
};
|
34
30
|
exports.printField = printField;
|
35
|
-
const printTopConst = (path, opts, print) =>
|
36
|
-
|
37
|
-
|
31
|
+
const printTopConst = (path, opts, print) => [
|
32
|
+
"::",
|
33
|
+
path.call(print, "constant")
|
34
|
+
];
|
38
35
|
exports.printTopConst = printTopConst;
|
data/dist/ruby/nodes/flow.js
CHANGED
@@ -5,15 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
exports.printYield0 = exports.printYield = exports.printNext = exports.printBreak = void 0;
|
7
7
|
const prettier_1 = __importDefault(require("../../prettier"));
|
8
|
-
const utils_1 = require("../../utils");
|
9
8
|
const { join } = prettier_1.default;
|
10
|
-
|
11
|
-
|
12
|
-
steps.forEach((step) => {
|
13
|
-
current = current[step];
|
14
|
-
});
|
15
|
-
return current;
|
16
|
-
}
|
9
|
+
// If there are parentheses around these nodes, then we can't skip printing them
|
10
|
+
// without changing the semantic meaning of the statement.
|
17
11
|
const unskippableParens = [
|
18
12
|
"if_mod",
|
19
13
|
"rescue_mod",
|
@@ -21,46 +15,45 @@ const unskippableParens = [
|
|
21
15
|
"until_mod",
|
22
16
|
"while_mod"
|
23
17
|
];
|
24
|
-
function
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
18
|
+
function printFlowControl(keyword) {
|
19
|
+
return function printFlowControlWithKeyword(path, opts, print) {
|
20
|
+
const node = path.getValue();
|
21
|
+
// If we don't have any arguments to the keyword, then it's always going to
|
22
|
+
// come in as an args node, in which case we can just print the keyword.
|
23
|
+
if (node.args.type === "args") {
|
24
|
+
return keyword;
|
25
|
+
}
|
26
|
+
// Special handling if we've got parentheses on this call to the keyword. If
|
27
|
+
// we do and we can skip them, then we will. If we don't, then we'll print
|
28
|
+
// them right after the keyword with no space.
|
29
|
+
const paren = node.args.args.type === "args" && node.args.args.parts[0];
|
30
|
+
if (paren && paren.type === "paren") {
|
31
|
+
const stmts = paren.cnts.body;
|
32
|
+
// Here we're checking if we can skip past the parentheses entirely.
|
33
|
+
if (stmts.length === 1 && !unskippableParens.includes(stmts[0].type)) {
|
34
|
+
return [
|
35
|
+
`${keyword} `,
|
36
|
+
path.call(print, "args", "args", "parts", 0, "cnts")
|
37
|
+
];
|
38
|
+
}
|
39
|
+
// Here we know we can't, so just printing out the parentheses as normal.
|
40
|
+
return [keyword, path.call(print, "args", "args", "parts", 0)];
|
41
|
+
}
|
42
|
+
// If we didn't hit the super special handling, then we're just going to
|
43
|
+
// print out the arguments to the keyword like normal.
|
44
|
+
return [`${keyword} `, join(", ", path.call(print, "args"))];
|
45
|
+
};
|
34
46
|
}
|
35
|
-
|
36
|
-
|
37
|
-
if (content.body.length === 0) {
|
38
|
-
return "break";
|
39
|
-
}
|
40
|
-
const steps = ["body", 0, "body", 0, "body", 0];
|
41
|
-
return (maybeHandleParens(path, print, "break", steps) || [
|
42
|
-
"break ",
|
43
|
-
join(", ", path.call(print, "body", 0))
|
44
|
-
]);
|
45
|
-
};
|
46
|
-
exports.printBreak = printBreak;
|
47
|
-
const printNext = (path, opts, print) => {
|
48
|
-
const args = path.getValue().body[0].body[0];
|
49
|
-
if (!args) {
|
50
|
-
return "next";
|
51
|
-
}
|
52
|
-
const steps = ["body", 0, "body", 0, "body", 0];
|
53
|
-
return (maybeHandleParens(path, print, "next", steps) || [
|
54
|
-
"next ",
|
55
|
-
join(", ", path.call(print, "body", 0))
|
56
|
-
]);
|
57
|
-
};
|
58
|
-
exports.printNext = printNext;
|
47
|
+
exports.printBreak = printFlowControl("break");
|
48
|
+
exports.printNext = printFlowControl("next");
|
59
49
|
const printYield = (path, opts, print) => {
|
60
|
-
|
61
|
-
|
50
|
+
const node = path.getValue();
|
51
|
+
const argsDoc = path.call(print, "args");
|
52
|
+
if (node.args.type === "paren") {
|
53
|
+
return ["yield", argsDoc];
|
62
54
|
}
|
63
|
-
return ["yield ", join(", ",
|
55
|
+
return ["yield ", join(", ", argsDoc)];
|
64
56
|
};
|
65
57
|
exports.printYield = printYield;
|
66
|
-
|
58
|
+
const printYield0 = (path) => path.getValue().value;
|
59
|
+
exports.printYield0 = printYield0;
|
data/dist/ruby/nodes/hashes.js
CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.printHash = exports.printHashContents = exports.printAssocSplat = exports.
|
6
|
+
exports.printHash = exports.printHashContents = exports.printAssocSplat = exports.printAssoc = void 0;
|
7
7
|
const prettier_1 = __importDefault(require("../../prettier"));
|
8
8
|
const utils_1 = require("../../utils");
|
9
9
|
const { group, ifBreak, indent, join, line } = prettier_1.default;
|
@@ -18,19 +18,19 @@ const { group, ifBreak, indent, join, line } = prettier_1.default;
|
|
18
18
|
// This function represents that check, as it determines if it can convert the
|
19
19
|
// symbol node into a hash label.
|
20
20
|
function isValidHashLabel(symbolLiteral) {
|
21
|
-
const label = symbolLiteral.
|
21
|
+
const label = symbolLiteral.value.value;
|
22
22
|
return label.match(/^[_A-Za-z]/) && !label.endsWith("=");
|
23
23
|
}
|
24
24
|
function canUseHashLabels(contentsNode) {
|
25
|
-
return contentsNode.
|
25
|
+
return contentsNode.assocs.every((assocNode) => {
|
26
26
|
if (assocNode.type === "assoc_splat") {
|
27
27
|
return true;
|
28
28
|
}
|
29
|
-
switch (assocNode.
|
30
|
-
case "
|
29
|
+
switch (assocNode.key.type) {
|
30
|
+
case "label":
|
31
31
|
return true;
|
32
32
|
case "symbol_literal":
|
33
|
-
return isValidHashLabel(assocNode.
|
33
|
+
return isValidHashLabel(assocNode.key);
|
34
34
|
case "dyna_symbol":
|
35
35
|
return true;
|
36
36
|
default:
|
@@ -41,12 +41,10 @@ function canUseHashLabels(contentsNode) {
|
|
41
41
|
const printHashKeyLabel = (path, print) => {
|
42
42
|
const node = path.getValue();
|
43
43
|
switch (node.type) {
|
44
|
-
case "
|
44
|
+
case "label":
|
45
45
|
return print(path);
|
46
|
-
case "symbol_literal":
|
47
|
-
|
48
|
-
return [nodePath.call(print, "body", 0), ":"];
|
49
|
-
}
|
46
|
+
case "symbol_literal":
|
47
|
+
return [path.call(print, "value"), ":"];
|
50
48
|
case "dyna_symbol":
|
51
49
|
return [print(path), ":"];
|
52
50
|
default:
|
@@ -58,7 +56,7 @@ const printHashKeyLabel = (path, print) => {
|
|
58
56
|
const printHashKeyRocket = (path, print) => {
|
59
57
|
const node = path.getValue();
|
60
58
|
let doc = print(path);
|
61
|
-
if (node.type === "
|
59
|
+
if (node.type === "label") {
|
62
60
|
const sDoc = doc; // since we know this is a label
|
63
61
|
doc = [":", sDoc.slice(0, sDoc.length - 1)];
|
64
62
|
}
|
@@ -67,18 +65,18 @@ const printHashKeyRocket = (path, print) => {
|
|
67
65
|
}
|
68
66
|
return [doc, " =>"];
|
69
67
|
};
|
70
|
-
const
|
71
|
-
const
|
68
|
+
const printAssoc = (path, opts, print) => {
|
69
|
+
const node = path.getValue();
|
72
70
|
const { keyPrinter } = path.getParentNode();
|
73
|
-
const parts = [path.call((keyPath) => keyPrinter(keyPath, print), "
|
74
|
-
const valueDoc = path.call(print, "
|
71
|
+
const parts = [path.call((keyPath) => keyPrinter(keyPath, print), "key")];
|
72
|
+
const valueDoc = path.call(print, "value");
|
75
73
|
// If we're printing a child hash then we want it to break along with its
|
76
74
|
// parent hash, so we don't group the parts.
|
77
|
-
if (
|
75
|
+
if (node.value.type === "hash") {
|
78
76
|
parts.push(" ", valueDoc);
|
79
77
|
return parts;
|
80
78
|
}
|
81
|
-
if (!(0, utils_1.skipAssignIndent)(
|
79
|
+
if (!(0, utils_1.skipAssignIndent)(node.value) || node.key.comments) {
|
82
80
|
parts.push(indent([line, valueDoc]));
|
83
81
|
}
|
84
82
|
else {
|
@@ -86,10 +84,8 @@ const printAssocNew = (path, opts, print) => {
|
|
86
84
|
}
|
87
85
|
return group(parts);
|
88
86
|
};
|
89
|
-
exports.
|
90
|
-
const printAssocSplat = (path, opts, print) =>
|
91
|
-
return ["**", path.call(print, "body", 0)];
|
92
|
-
};
|
87
|
+
exports.printAssoc = printAssoc;
|
88
|
+
const printAssocSplat = (path, opts, print) => ["**", path.call(print, "value")];
|
93
89
|
exports.printAssocSplat = printAssocSplat;
|
94
90
|
const printHashContents = (path, opts, print) => {
|
95
91
|
const node = path.getValue();
|
@@ -99,22 +95,22 @@ const printHashContents = (path, opts, print) => {
|
|
99
95
|
opts.rubyHashLabel && canUseHashLabels(path.getValue())
|
100
96
|
? printHashKeyLabel
|
101
97
|
: printHashKeyRocket;
|
102
|
-
return join([",", line], path.map(print, "
|
98
|
+
return join([",", line], path.map(print, "assocs"));
|
103
99
|
};
|
104
100
|
exports.printHashContents = printHashContents;
|
105
101
|
const printHash = (path, opts, print) => {
|
106
|
-
const
|
102
|
+
const node = path.getValue();
|
107
103
|
// Hashes normally have a single assoclist_from_args child node. If it's
|
108
104
|
// missing, then it means we're dealing with an empty hash, so we can just
|
109
105
|
// exit here and print.
|
110
|
-
if (
|
106
|
+
if (node.cnts === null) {
|
111
107
|
return (0, utils_1.printEmptyCollection)(path, opts, "{", "}");
|
112
108
|
}
|
113
|
-
const
|
109
|
+
const doc = [
|
114
110
|
"{",
|
115
111
|
indent([
|
116
112
|
line,
|
117
|
-
path.call(print, "
|
113
|
+
path.call(print, "cnts"),
|
118
114
|
(0, utils_1.getTrailingComma)(opts) ? ifBreak(",", "") : ""
|
119
115
|
]),
|
120
116
|
line,
|
@@ -122,9 +118,9 @@ const printHash = (path, opts, print) => {
|
|
122
118
|
];
|
123
119
|
// If we're inside another hash, then we don't want to group our contents
|
124
120
|
// because we want this hash to break along with its parent hash.
|
125
|
-
if (path.getParentNode().type === "
|
126
|
-
return
|
121
|
+
if (path.getParentNode().type === "assoc") {
|
122
|
+
return doc;
|
127
123
|
}
|
128
|
-
return group(
|
124
|
+
return group(doc);
|
129
125
|
};
|
130
126
|
exports.printHash = printHash;
|
data/dist/ruby/nodes/heredocs.js
CHANGED
@@ -8,15 +8,15 @@ const prettier_1 = __importDefault(require("../../prettier"));
|
|
8
8
|
const utils_1 = require("../../utils");
|
9
9
|
const { group, lineSuffix, join } = prettier_1.default;
|
10
10
|
const printHeredoc = (path, opts, print) => {
|
11
|
-
const
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
const node = path.getValue();
|
12
|
+
// Print out each part of the heredoc to its own doc node.
|
13
|
+
const parts = path.map((partPath) => {
|
14
|
+
const part = partPath.getValue();
|
15
|
+
if (part.type !== "tstring_content") {
|
16
|
+
return print(partPath);
|
16
17
|
}
|
17
|
-
|
18
|
-
|
19
|
-
});
|
18
|
+
return join(utils_1.literallineWithoutBreakParent, part.value.split(/\r?\n/));
|
19
|
+
}, "parts");
|
20
20
|
// We use a literalline break because matching indentation is required
|
21
21
|
// for the heredoc contents and ending. If the line suffix contains a
|
22
22
|
// break-parent, all ancestral groups are broken, and heredocs automatically
|
@@ -24,7 +24,7 @@ const printHeredoc = (path, opts, print) => {
|
|
24
24
|
// possible, so we use a literalline without the break-parent.
|
25
25
|
return group([
|
26
26
|
path.call(print, "beging"),
|
27
|
-
lineSuffix(group([utils_1.literallineWithoutBreakParent, ...parts, ending]))
|
27
|
+
lineSuffix(group([utils_1.literallineWithoutBreakParent, ...parts, node.ending]))
|
28
28
|
]);
|
29
29
|
};
|
30
30
|
exports.printHeredoc = printHeredoc;
|