prettier 2.1.0 → 3.0.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 +24 -6
- data/README.md +16 -16
- data/exe/rbprettier +2 -2
- data/lib/prettier/rake/task.rb +5 -5
- data/lib/prettier.rb +11 -11
- data/package.json +9 -23
- data/rubocop.yml +6 -6
- data/{dist/parser → src}/getInfo.js +0 -1
- data/{dist/parser → src}/netcat.js +0 -1
- data/src/parseSync.js +212 -0
- data/src/plugin.js +161 -0
- data/{dist/parser → src}/server.rb +45 -31
- metadata +94 -78
- data/bin/console +0 -7
- data/dist/haml/embed.js +0 -53
- data/dist/haml/parser.js +0 -31
- data/dist/haml/parser.rb +0 -149
- data/dist/haml/printer.js +0 -336
- data/dist/parser/parseSync.js +0 -179
- data/dist/plugin.js +0 -143
- data/dist/prettier.js +0 -15
- data/dist/rbs/parser.js +0 -34
- data/dist/rbs/parser.rb +0 -155
- data/dist/rbs/printer.js +0 -525
- data/dist/ruby/embed.js +0 -115
- data/dist/ruby/location.js +0 -19
- data/dist/ruby/nodes/alias.js +0 -60
- data/dist/ruby/nodes/aref.js +0 -51
- data/dist/ruby/nodes/args.js +0 -138
- data/dist/ruby/nodes/arrays.js +0 -122
- data/dist/ruby/nodes/assign.js +0 -37
- data/dist/ruby/nodes/blocks.js +0 -90
- data/dist/ruby/nodes/calls.js +0 -263
- data/dist/ruby/nodes/case.js +0 -50
- data/dist/ruby/nodes/class.js +0 -54
- data/dist/ruby/nodes/commands.js +0 -138
- data/dist/ruby/nodes/conditionals.js +0 -246
- data/dist/ruby/nodes/constants.js +0 -35
- data/dist/ruby/nodes/flow.js +0 -59
- data/dist/ruby/nodes/hashes.js +0 -126
- data/dist/ruby/nodes/heredocs.js +0 -30
- data/dist/ruby/nodes/hooks.js +0 -35
- data/dist/ruby/nodes/ints.js +0 -27
- data/dist/ruby/nodes/lambdas.js +0 -70
- data/dist/ruby/nodes/loops.js +0 -75
- data/dist/ruby/nodes/massign.js +0 -60
- data/dist/ruby/nodes/methods.js +0 -50
- data/dist/ruby/nodes/operators.js +0 -68
- data/dist/ruby/nodes/params.js +0 -95
- data/dist/ruby/nodes/patterns.js +0 -119
- data/dist/ruby/nodes/regexp.js +0 -45
- data/dist/ruby/nodes/rescue.js +0 -86
- data/dist/ruby/nodes/return.js +0 -100
- data/dist/ruby/nodes/statements.js +0 -110
- data/dist/ruby/nodes/strings.js +0 -220
- data/dist/ruby/nodes/super.js +0 -26
- data/dist/ruby/nodes/undef.js +0 -31
- data/dist/ruby/nodes.js +0 -177
- data/dist/ruby/parser.js +0 -35
- data/dist/ruby/parser.rb +0 -9134
- data/dist/ruby/printer.js +0 -67
- data/dist/ruby/toProc.js +0 -91
- data/dist/types/haml.js +0 -4
- data/dist/types/plugin.js +0 -3
- data/dist/types/rbs.js +0 -4
- data/dist/types/ruby.js +0 -4
- data/dist/types/utils.js +0 -2
- data/dist/types.js +0 -34
- data/dist/utils/containsAssignment.js +0 -18
- data/dist/utils/getChildNodes.js +0 -305
- data/dist/utils/getTrailingComma.js +0 -6
- data/dist/utils/hasAncestor.js +0 -15
- data/dist/utils/inlineEnsureParens.js +0 -49
- data/dist/utils/isEmptyBodyStmt.js +0 -10
- data/dist/utils/isEmptyParams.js +0 -12
- data/dist/utils/isEmptyStmts.js +0 -10
- data/dist/utils/literal.js +0 -8
- data/dist/utils/literallineWithoutBreakParent.js +0 -8
- data/dist/utils/makeCall.js +0 -14
- data/dist/utils/noIndent.js +0 -11
- data/dist/utils/printEmptyCollection.js +0 -46
- data/dist/utils/skipAssignIndent.js +0 -19
- data/dist/utils.js +0 -32
data/dist/ruby/nodes/loops.js
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.printUntil = exports.printWhile = exports.printFor = void 0;
|
7
|
-
const prettier_1 = __importDefault(require("../../prettier"));
|
8
|
-
const utils_1 = require("../../utils");
|
9
|
-
const { align, breakParent, group, hardline, ifBreak, indent, join, softline } = prettier_1.default;
|
10
|
-
function isModifier(node) {
|
11
|
-
return node.type === "while_mod" || node.type === "until_mod";
|
12
|
-
}
|
13
|
-
function printLoop(keyword) {
|
14
|
-
return function printLoopWithOptions(path, { rubyModifier }, print) {
|
15
|
-
const node = path.getValue();
|
16
|
-
const predicateDoc = path.call(print, "pred");
|
17
|
-
// If the only statement inside this while loop is a void statement, then we
|
18
|
-
// can shorten to just displaying the predicate and then a semicolon.
|
19
|
-
if (!isModifier(node) && (0, utils_1.isEmptyStmts)(node.stmts)) {
|
20
|
-
return group([group([keyword, " ", predicateDoc]), hardline, "end"]);
|
21
|
-
}
|
22
|
-
const statementDoc = path.call(print, isModifier(node) ? "stmt" : "stmts");
|
23
|
-
const inlineLoop = (0, utils_1.inlineEnsureParens)(path, [
|
24
|
-
statementDoc,
|
25
|
-
` ${keyword} `,
|
26
|
-
predicateDoc
|
27
|
-
]);
|
28
|
-
// If we're in the modifier form and we're modifying a `begin`, then this is
|
29
|
-
// a special case where we need to explicitly use the modifier form because
|
30
|
-
// otherwise the semantic meaning changes. This looks like:
|
31
|
-
//
|
32
|
-
// begin
|
33
|
-
// foo
|
34
|
-
// end while bar
|
35
|
-
//
|
36
|
-
// The above is effectively a `do...while` loop (which we don't have in
|
37
|
-
// ruby).
|
38
|
-
if (isModifier(node) && node.stmt.type === "begin") {
|
39
|
-
return inlineLoop;
|
40
|
-
}
|
41
|
-
const blockLoop = [
|
42
|
-
[`${keyword} `, align(keyword.length + 1, predicateDoc)],
|
43
|
-
indent([softline, statementDoc]),
|
44
|
-
softline,
|
45
|
-
"end"
|
46
|
-
];
|
47
|
-
// If we're disallowing inline loops or if the predicate of the loop
|
48
|
-
// contains an assignment (in which case we can't know for certain that that
|
49
|
-
// assignment doesn't impact the statements inside the loop) then we can't
|
50
|
-
// use the modifier form and we must use the block form.
|
51
|
-
if (!rubyModifier || (0, utils_1.containsAssignment)(node.pred)) {
|
52
|
-
return [breakParent, blockLoop];
|
53
|
-
}
|
54
|
-
return group(ifBreak(blockLoop, inlineLoop));
|
55
|
-
};
|
56
|
-
}
|
57
|
-
const printFor = (path, opts, print) => {
|
58
|
-
const node = path.getValue();
|
59
|
-
let indexDoc = path.call(print, "index");
|
60
|
-
if (node.index.type === "mlhs") {
|
61
|
-
indexDoc = join(", ", indexDoc);
|
62
|
-
}
|
63
|
-
return group([
|
64
|
-
"for ",
|
65
|
-
indexDoc,
|
66
|
-
" in ",
|
67
|
-
path.call(print, "collection"),
|
68
|
-
indent([hardline, path.call(print, "stmts")]),
|
69
|
-
hardline,
|
70
|
-
"end"
|
71
|
-
]);
|
72
|
-
};
|
73
|
-
exports.printFor = printFor;
|
74
|
-
exports.printWhile = printLoop("while");
|
75
|
-
exports.printUntil = printLoop("until");
|
data/dist/ruby/nodes/massign.js
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.printMRHSNewFromArgs = exports.printMRHSAddStar = exports.printMRHS = exports.printMLHSParen = exports.printMLHS = exports.printMAssign = void 0;
|
7
|
-
const prettier_1 = __importDefault(require("../../prettier"));
|
8
|
-
const { group, indent, join, line, softline } = prettier_1.default;
|
9
|
-
const printMAssign = (path, opts, print) => {
|
10
|
-
const node = path.getValue();
|
11
|
-
let valueDoc = path.call(print, "value");
|
12
|
-
if (["mrhs", "mrhs_add_star", "mrhs_new_from_args"].includes(node.value.type)) {
|
13
|
-
valueDoc = group(join([",", line], valueDoc));
|
14
|
-
}
|
15
|
-
const targetDoc = [
|
16
|
-
join([",", line], path.call(print, "target"))
|
17
|
-
];
|
18
|
-
if (node.target.type === "mlhs" && node.target.comma) {
|
19
|
-
targetDoc.push(",");
|
20
|
-
}
|
21
|
-
return group([group(targetDoc), " =", indent([line, valueDoc])]);
|
22
|
-
};
|
23
|
-
exports.printMAssign = printMAssign;
|
24
|
-
const printMLHS = (path, opts, print) => {
|
25
|
-
return path.map(print, "parts");
|
26
|
-
};
|
27
|
-
exports.printMLHS = printMLHS;
|
28
|
-
const printMLHSParen = (path, opts, print) => {
|
29
|
-
if (["massign", "mlhs_paren"].includes(path.getParentNode().type)) {
|
30
|
-
// If we're nested in brackets as part of the left hand side of an
|
31
|
-
// assignment, i.e., (a, b, c) = 1, 2, 3
|
32
|
-
// ignore the current node and just go straight to the content
|
33
|
-
return path.call(print, "cnts");
|
34
|
-
}
|
35
|
-
const node = path.getValue();
|
36
|
-
const parts = [
|
37
|
-
softline,
|
38
|
-
join([",", line], path.call(print, "cnts"))
|
39
|
-
];
|
40
|
-
if (node.cnts.comma) {
|
41
|
-
parts.push(",");
|
42
|
-
}
|
43
|
-
return group(["(", indent(parts), [softline, ")"]]);
|
44
|
-
};
|
45
|
-
exports.printMLHSParen = printMLHSParen;
|
46
|
-
const printMRHS = (path, opts, print) => {
|
47
|
-
return path.map(print, "parts");
|
48
|
-
};
|
49
|
-
exports.printMRHS = printMRHS;
|
50
|
-
const printMRHSAddStar = (path, opts, print) => {
|
51
|
-
return [
|
52
|
-
...path.call(print, "mrhs"),
|
53
|
-
["*", path.call(print, "star")]
|
54
|
-
];
|
55
|
-
};
|
56
|
-
exports.printMRHSAddStar = printMRHSAddStar;
|
57
|
-
const printMRHSNewFromArgs = (path, opts, print) => {
|
58
|
-
return path.call(print, "args");
|
59
|
-
};
|
60
|
-
exports.printMRHSNewFromArgs = printMRHSNewFromArgs;
|
data/dist/ruby/nodes/methods.js
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.printAccessControl = exports.printDefEndless = exports.printDef = void 0;
|
7
|
-
const prettier_1 = __importDefault(require("../../prettier"));
|
8
|
-
const utils_1 = require("../../utils");
|
9
|
-
const { group, hardline, indent, line } = prettier_1.default;
|
10
|
-
const printDef = (path, opts, print) => {
|
11
|
-
const node = path.getValue();
|
12
|
-
const declaration = ["def "];
|
13
|
-
// In this case, we're printing a method that's defined as a singleton, so
|
14
|
-
// we need to include the target and the operator before the name.
|
15
|
-
if (node.type === "defs") {
|
16
|
-
declaration.push(path.call(print, "target"), path.call(print, "op"));
|
17
|
-
}
|
18
|
-
// In case there are no parens but there are parameters
|
19
|
-
const useParens = node.params.type === "params" && !(0, utils_1.isEmptyParams)(node.params);
|
20
|
-
declaration.push(path.call(print, "name"), useParens ? "(" : "", path.call(print, "params"), useParens ? ")" : "");
|
21
|
-
if ((0, utils_1.isEmptyBodyStmt)(node.bodystmt)) {
|
22
|
-
return group([...declaration, "; end"]);
|
23
|
-
}
|
24
|
-
return group([
|
25
|
-
group(declaration),
|
26
|
-
indent([hardline, path.call(print, "bodystmt")]),
|
27
|
-
hardline,
|
28
|
-
"end"
|
29
|
-
]);
|
30
|
-
};
|
31
|
-
exports.printDef = printDef;
|
32
|
-
const printDefEndless = (path, opts, print) => {
|
33
|
-
const node = path.getValue();
|
34
|
-
let paramsDoc = "";
|
35
|
-
// If we have any kind of parameters, we're going to print the whole
|
36
|
-
// parentheses. If we don't, then we're just going to skip them entirely.
|
37
|
-
if (node.paren && !(0, utils_1.isEmptyParams)(node.paren.cnts)) {
|
38
|
-
paramsDoc = path.call(print, "paren");
|
39
|
-
}
|
40
|
-
return group([
|
41
|
-
"def ",
|
42
|
-
path.call(print, "name"),
|
43
|
-
paramsDoc,
|
44
|
-
" =",
|
45
|
-
indent(group([line, path.call(print, "stmt")]))
|
46
|
-
]);
|
47
|
-
};
|
48
|
-
exports.printDefEndless = printDefEndless;
|
49
|
-
const printAccessControl = (path, opts, print) => path.call(print, "value");
|
50
|
-
exports.printAccessControl = printAccessControl;
|
@@ -1,68 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.printNot = exports.printUnary = exports.printDot3 = exports.printDot2 = exports.printBinary = void 0;
|
7
|
-
const prettier_1 = __importDefault(require("../../prettier"));
|
8
|
-
const utils_1 = require("../../utils");
|
9
|
-
const { group, indent, line, softline } = prettier_1.default;
|
10
|
-
const printBinary = (path, opts, print) => {
|
11
|
-
const node = path.getValue();
|
12
|
-
const space = node.op === "**" ? "" : " ";
|
13
|
-
if (utils_1.noIndent.includes(node.right.type)) {
|
14
|
-
return group([
|
15
|
-
group(path.call(print, "left")),
|
16
|
-
space,
|
17
|
-
node.op,
|
18
|
-
space,
|
19
|
-
group(path.call(print, "right"))
|
20
|
-
]);
|
21
|
-
}
|
22
|
-
return group([
|
23
|
-
group(path.call(print, "left")),
|
24
|
-
space,
|
25
|
-
group(indent([
|
26
|
-
node.op,
|
27
|
-
space === "" ? softline : line,
|
28
|
-
path.call(print, "right")
|
29
|
-
]))
|
30
|
-
]);
|
31
|
-
};
|
32
|
-
exports.printBinary = printBinary;
|
33
|
-
// dot2 nodes are used with ranges (or flip-flops). They can optionally drop
|
34
|
-
// their left side for beginless ranges or their right side for endless ranges.
|
35
|
-
const printDot2 = (path, opts, print) => {
|
36
|
-
const node = path.getValue();
|
37
|
-
return [
|
38
|
-
node.left ? path.call(print, "left") : "",
|
39
|
-
"..",
|
40
|
-
node.right ? path.call(print, "right") : ""
|
41
|
-
];
|
42
|
-
};
|
43
|
-
exports.printDot2 = printDot2;
|
44
|
-
// dot3 nodes are used with ranges (or flip-flops). They can optionally drop
|
45
|
-
// their left side for beginless ranges or their right side for endless ranges.
|
46
|
-
const printDot3 = (path, opts, print) => {
|
47
|
-
const node = path.getValue();
|
48
|
-
return [
|
49
|
-
node.left ? path.call(print, "left") : "",
|
50
|
-
"...",
|
51
|
-
node.right ? path.call(print, "right") : ""
|
52
|
-
];
|
53
|
-
};
|
54
|
-
exports.printDot3 = printDot3;
|
55
|
-
const printUnary = (path, opts, print) => {
|
56
|
-
const node = path.getValue();
|
57
|
-
return [node.op, path.call(print, "value")];
|
58
|
-
};
|
59
|
-
exports.printUnary = printUnary;
|
60
|
-
const printNot = (path, opts, print) => {
|
61
|
-
const node = path.getValue();
|
62
|
-
const valueDoc = path.call(print, "value");
|
63
|
-
if (node.paren) {
|
64
|
-
return ["not", "(", valueDoc, ")"];
|
65
|
-
}
|
66
|
-
return ["not", " ", valueDoc];
|
67
|
-
};
|
68
|
-
exports.printNot = printNot;
|
data/dist/ruby/nodes/params.js
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.printExcessedComma = exports.printRestParam = exports.printKeywordRestParam = exports.printArgsForward = exports.printParams = void 0;
|
7
|
-
const prettier_1 = __importDefault(require("../../prettier"));
|
8
|
-
const { group, hardline, join, indent, line, lineSuffix, softline } = prettier_1.default;
|
9
|
-
function printRestParamSymbol(symbol) {
|
10
|
-
return function printRestParamWithSymbol(path, opts, print) {
|
11
|
-
const node = path.getValue();
|
12
|
-
return node.name ? [symbol, path.call(print, "name")] : symbol;
|
13
|
-
};
|
14
|
-
}
|
15
|
-
const printParams = (path, opts, print) => {
|
16
|
-
const node = path.getValue();
|
17
|
-
let parts = [];
|
18
|
-
if (node.reqs) {
|
19
|
-
path.each((reqPath) => {
|
20
|
-
// For some very strange reason, if you have a comment attached to a
|
21
|
-
// rest_param, it shows up here in the list of required params.
|
22
|
-
if (reqPath.getValue().type !== "rest_param") {
|
23
|
-
parts.push(print(reqPath));
|
24
|
-
}
|
25
|
-
}, "reqs");
|
26
|
-
}
|
27
|
-
if (node.opts) {
|
28
|
-
parts = parts.concat(path.map((optlPath) => join(" = ", optlPath.map(print)), "opts"));
|
29
|
-
}
|
30
|
-
if (node.rest && node.rest.type !== "excessed_comma") {
|
31
|
-
parts.push(path.call(print, "rest"));
|
32
|
-
}
|
33
|
-
if (node.posts) {
|
34
|
-
parts = parts.concat(path.map(print, "posts"));
|
35
|
-
}
|
36
|
-
if (node.keywords) {
|
37
|
-
parts = parts.concat(path.map((kwargPath) => {
|
38
|
-
const kwarg = kwargPath.getValue();
|
39
|
-
const keyDoc = kwargPath.call(print, 0);
|
40
|
-
if (kwarg[1]) {
|
41
|
-
return group([keyDoc, " ", kwargPath.call(print, 1)]);
|
42
|
-
}
|
43
|
-
return keyDoc;
|
44
|
-
}, "keywords"));
|
45
|
-
}
|
46
|
-
if (node.kwrest) {
|
47
|
-
parts.push(node.kwrest === "nil" ? "**nil" : path.call(print, "kwrest"));
|
48
|
-
}
|
49
|
-
if (node.block) {
|
50
|
-
parts.push(path.call(print, "block"));
|
51
|
-
}
|
52
|
-
const contents = [join([",", line], parts)];
|
53
|
-
// You can put an extra comma at the end of block args between pipes to
|
54
|
-
// change what it does. Below is the difference:
|
55
|
-
//
|
56
|
-
// [[1, 2], [3, 4]].each { |x| p x } # prints [1, 2] then [3, 4]
|
57
|
-
// [[1, 2], [3, 4]].each { |x,| p x } # prints 1 then 3
|
58
|
-
//
|
59
|
-
// In ruby 2.5, the excessed comma is indicated by having a 0 in the rest
|
60
|
-
// param position. In ruby 2.6+ it's indicated by having an "excessed_comma"
|
61
|
-
// node in the rest position. Seems odd, but it's true.
|
62
|
-
if (node.rest === 0 ||
|
63
|
-
(node.rest && node.rest.type === "excessed_comma")) {
|
64
|
-
contents.push(",");
|
65
|
-
}
|
66
|
-
// If the parent node is a paren then we skipped printing the parentheses so
|
67
|
-
// that we could handle them here and get nicer formatting.
|
68
|
-
const parentNode = path.getParentNode();
|
69
|
-
if (["lambda", "paren"].includes(parentNode.type)) {
|
70
|
-
const parts = ["("];
|
71
|
-
// If the parent node is a paren and the paren has comments that are
|
72
|
-
// attached to the left paren, then we need to print those out explicitly
|
73
|
-
// here.
|
74
|
-
if (parentNode.type === "paren" && parentNode.lparen.comments) {
|
75
|
-
const comments = [];
|
76
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
77
|
-
parentNode.lparen.comments.forEach((comment, index) => {
|
78
|
-
comment.printed = true;
|
79
|
-
comments.push(lineSuffix(`${index === 0 ? " " : ""}#${comment.value}`));
|
80
|
-
});
|
81
|
-
parts.push(join(hardline, comments));
|
82
|
-
}
|
83
|
-
return group([...parts, indent([softline, ...contents]), softline, ")"]);
|
84
|
-
}
|
85
|
-
return group(contents);
|
86
|
-
};
|
87
|
-
exports.printParams = printParams;
|
88
|
-
const printArgsForward = (path) => path.getValue().value;
|
89
|
-
exports.printArgsForward = printArgsForward;
|
90
|
-
exports.printKeywordRestParam = printRestParamSymbol("**");
|
91
|
-
exports.printRestParam = printRestParamSymbol("*");
|
92
|
-
const printExcessedComma = (path, opts, print) => {
|
93
|
-
return path.call(print, "value");
|
94
|
-
};
|
95
|
-
exports.printExcessedComma = printExcessedComma;
|
data/dist/ruby/nodes/patterns.js
DELETED
@@ -1,119 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.printRAssign = exports.printIn = exports.printHshPtn = exports.printFndPtn = exports.printAryPtn = void 0;
|
7
|
-
const prettier_1 = __importDefault(require("../../prettier"));
|
8
|
-
const { align, group, hardline, indent, join, line } = prettier_1.default;
|
9
|
-
const patterns = ["aryptn", "binary", "fndptn", "hshptn", "rassign"];
|
10
|
-
const printPatternArg = (path, opts, print) => {
|
11
|
-
// Pinning is a really special syntax in pattern matching that's not really
|
12
|
-
// all that well supported in ripper. Here we're just going to the original
|
13
|
-
// source to see if the variable is pinned.
|
14
|
-
if (opts.originalText &&
|
15
|
-
opts.originalText[opts.locStart(path.getValue()) - 1] === "^") {
|
16
|
-
return ["^", path.call(print)];
|
17
|
-
}
|
18
|
-
return path.call(print);
|
19
|
-
};
|
20
|
-
const printAryPtn = (path, opts, print) => {
|
21
|
-
const node = path.getValue();
|
22
|
-
let argDocs = [];
|
23
|
-
if (node.reqs.length > 0) {
|
24
|
-
argDocs = argDocs.concat(path.map((argPath) => printPatternArg(argPath, opts, print), "reqs"));
|
25
|
-
}
|
26
|
-
if (node.rest) {
|
27
|
-
argDocs.push(["*", path.call(print, "rest")]);
|
28
|
-
}
|
29
|
-
if (node.posts.length > 0) {
|
30
|
-
argDocs = argDocs.concat(path.map(print, "posts"));
|
31
|
-
}
|
32
|
-
let argDoc = group(join([",", line], argDocs));
|
33
|
-
// There are a couple of cases where we _must_ use brackets. They include:
|
34
|
-
//
|
35
|
-
// * When the number of arguments inside the array pattern is one 1, then we
|
36
|
-
// have to include them, otherwise it matches the whole array. Consider the
|
37
|
-
// difference between `in [elem]` and `in elem`.
|
38
|
-
// * If we have a wrapping constant, then we definitely need the brackets.
|
39
|
-
// Consider the difference between `in Const[elem]` and `in Const elem`
|
40
|
-
// * If we're nested inside a parent pattern, then we have to have brackets.
|
41
|
-
// Consider the difference between `in key: first, second` and
|
42
|
-
// `in key: [first, second]`.
|
43
|
-
if (argDocs.length === 1 ||
|
44
|
-
node.constant ||
|
45
|
-
patterns.includes(path.getParentNode().type)) {
|
46
|
-
argDoc = ["[", argDoc, "]"];
|
47
|
-
}
|
48
|
-
if (node.constant) {
|
49
|
-
return [path.call(print, "constant"), argDoc];
|
50
|
-
}
|
51
|
-
return argDoc;
|
52
|
-
};
|
53
|
-
exports.printAryPtn = printAryPtn;
|
54
|
-
const printFndPtn = (path, opts, print) => {
|
55
|
-
const node = path.getValue();
|
56
|
-
const docs = [
|
57
|
-
"[",
|
58
|
-
group(join([",", line], [
|
59
|
-
["*", path.call(print, "left")],
|
60
|
-
...path.map(print, "values"),
|
61
|
-
["*", path.call(print, "right")]
|
62
|
-
])),
|
63
|
-
"]"
|
64
|
-
];
|
65
|
-
if (node.constant) {
|
66
|
-
return [path.call(print, "constant"), docs];
|
67
|
-
}
|
68
|
-
return docs;
|
69
|
-
};
|
70
|
-
exports.printFndPtn = printFndPtn;
|
71
|
-
const printHshPtn = (path, opts, print) => {
|
72
|
-
const node = path.getValue();
|
73
|
-
let args = [];
|
74
|
-
if (node.keywords.length > 0) {
|
75
|
-
const printPair = (pairPath) => {
|
76
|
-
const parts = [pairPath.call(print, 0)];
|
77
|
-
if (pairPath.getValue()[1]) {
|
78
|
-
parts.push(" ", pairPath.call((pairValuePath) => printPatternArg(pairValuePath, opts, print), 1));
|
79
|
-
}
|
80
|
-
return parts;
|
81
|
-
};
|
82
|
-
args = args.concat(path.map(printPair, "keywords"));
|
83
|
-
}
|
84
|
-
if (node.kwrest) {
|
85
|
-
args.push(["**", path.call(print, "kwrest")]);
|
86
|
-
}
|
87
|
-
args = group(join([",", line], args));
|
88
|
-
if (node.constant) {
|
89
|
-
args = ["[", args, "]"];
|
90
|
-
}
|
91
|
-
else if (patterns.includes(path.getParentNode().type)) {
|
92
|
-
args = ["{ ", args, " }"];
|
93
|
-
}
|
94
|
-
if (node.constant) {
|
95
|
-
return [path.call(print, "constant"), args];
|
96
|
-
}
|
97
|
-
return args;
|
98
|
-
};
|
99
|
-
exports.printHshPtn = printHshPtn;
|
100
|
-
const printIn = (path, opts, print) => {
|
101
|
-
const keyword = "in ";
|
102
|
-
const parts = [
|
103
|
-
keyword,
|
104
|
-
align(keyword.length, path.call((valuePath) => printPatternArg(valuePath, opts, print), "pattern")),
|
105
|
-
indent([hardline, path.call(print, "stmts")])
|
106
|
-
];
|
107
|
-
if (path.getValue().cons) {
|
108
|
-
parts.push(hardline, path.call(print, "cons"));
|
109
|
-
}
|
110
|
-
return group(parts);
|
111
|
-
};
|
112
|
-
exports.printIn = printIn;
|
113
|
-
const printRAssign = (path, opts, print) => group([
|
114
|
-
path.call(print, "value"),
|
115
|
-
" ",
|
116
|
-
path.call(print, "op"),
|
117
|
-
group(indent([line, path.call(print, "pattern")]))
|
118
|
-
]);
|
119
|
-
exports.printRAssign = printRAssign;
|
data/dist/ruby/nodes/regexp.js
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.printRegexpLiteral = void 0;
|
4
|
-
const utils_1 = require("../../utils");
|
5
|
-
function hasContent(node, pattern) {
|
6
|
-
return node.parts.some((part) => part.type === "tstring_content" && pattern.test(part.value));
|
7
|
-
}
|
8
|
-
// If the first part of this regex is plain string content, we have a space
|
9
|
-
// or an =, and we're contained within a command or command_call node, then we
|
10
|
-
// want to use braces because otherwise we could end up with an ambiguous
|
11
|
-
// operator, e.g. foo / bar/ or foo /=bar/
|
12
|
-
function forwardSlashIsAmbiguous(path) {
|
13
|
-
const node = path.getValue();
|
14
|
-
const firstPart = node.parts[0];
|
15
|
-
return (firstPart &&
|
16
|
-
firstPart.type === "tstring_content" &&
|
17
|
-
[" ", "="].includes(firstPart.value[0]) &&
|
18
|
-
(0, utils_1.hasAncestor)(path, ["command", "command_call"]));
|
19
|
-
}
|
20
|
-
// This function is responsible for printing out regexp_literal nodes. They can
|
21
|
-
// either use the special %r literal syntax or they can use forward slashes. At
|
22
|
-
// the end of either of those they can have modifiers like m or x that have
|
23
|
-
// special meaning for the regex engine.
|
24
|
-
//
|
25
|
-
// We favor the use of forward slashes unless the regex contains a forward slash
|
26
|
-
// itself. In that case we switch over to using %r with braces.
|
27
|
-
const printRegexpLiteral = (path, opts, print) => {
|
28
|
-
const node = path.getValue();
|
29
|
-
const docs = path.map(print, "parts");
|
30
|
-
// We should use braces if using a forward slash would be ambiguous in the
|
31
|
-
// current context or if there's a forward slash in the content of the regexp.
|
32
|
-
const useBraces = forwardSlashIsAmbiguous(path) || hasContent(node, /\//);
|
33
|
-
// If we should be using braces but we have braces in the body of the regexp,
|
34
|
-
// then we're just going to resort to using whatever the original content was.
|
35
|
-
if (useBraces && hasContent(node, /[{}]/)) {
|
36
|
-
return [node.beging, ...docs, node.ending];
|
37
|
-
}
|
38
|
-
return [
|
39
|
-
useBraces ? "%r{" : "/",
|
40
|
-
...docs,
|
41
|
-
useBraces ? "}" : "/",
|
42
|
-
node.ending.slice(1)
|
43
|
-
];
|
44
|
-
};
|
45
|
-
exports.printRegexpLiteral = printRegexpLiteral;
|
data/dist/ruby/nodes/rescue.js
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.printRetry = exports.printRedo = exports.printRescueMod = exports.printRescueEx = exports.printRescue = exports.printEnsure = exports.printBegin = void 0;
|
7
|
-
const prettier_1 = __importDefault(require("../../prettier"));
|
8
|
-
const { align, group, hardline, indent, join, line } = prettier_1.default;
|
9
|
-
const printBegin = (path, opts, print) => {
|
10
|
-
return [
|
11
|
-
"begin",
|
12
|
-
indent([hardline, path.call(print, "bodystmt")]),
|
13
|
-
hardline,
|
14
|
-
"end"
|
15
|
-
];
|
16
|
-
};
|
17
|
-
exports.printBegin = printBegin;
|
18
|
-
const printEnsure = (path, opts, print) => {
|
19
|
-
return [
|
20
|
-
path.call(print, "keyword"),
|
21
|
-
indent([hardline, path.call(print, "stmts")])
|
22
|
-
];
|
23
|
-
};
|
24
|
-
exports.printEnsure = printEnsure;
|
25
|
-
const printRescue = (path, opts, print) => {
|
26
|
-
const node = path.getValue();
|
27
|
-
const parts = ["rescue"];
|
28
|
-
if (node.extn) {
|
29
|
-
parts.push(align("rescue ".length, path.call(print, "extn")));
|
30
|
-
}
|
31
|
-
else {
|
32
|
-
// If you don't specify an error to rescue in a `begin/rescue` block, then
|
33
|
-
// implicitly you're rescuing from `StandardError`. In this case, we're
|
34
|
-
// just going to explicitly add it.
|
35
|
-
parts.push(" StandardError");
|
36
|
-
}
|
37
|
-
const stmtsDoc = path.call(print, "stmts");
|
38
|
-
if (stmtsDoc.length > 0) {
|
39
|
-
parts.push(indent([hardline, stmtsDoc]));
|
40
|
-
}
|
41
|
-
// This is the next clause on the `begin` statement, either another
|
42
|
-
// `rescue`, and `ensure`, or an `else` clause.
|
43
|
-
if (node.cons) {
|
44
|
-
parts.push([hardline, path.call(print, "cons")]);
|
45
|
-
}
|
46
|
-
return group(parts);
|
47
|
-
};
|
48
|
-
exports.printRescue = printRescue;
|
49
|
-
// This is a container node that we're adding into the AST that isn't present in
|
50
|
-
// Ripper solely so that we have a nice place to attach inline comments.
|
51
|
-
const printRescueEx = (path, opts, print) => {
|
52
|
-
const node = path.getValue();
|
53
|
-
const parts = [];
|
54
|
-
if (node.extns) {
|
55
|
-
// If there's just one exception being rescued, then it's just going to be a
|
56
|
-
// single doc node.
|
57
|
-
let exceptionDoc = path.call(print, "extns");
|
58
|
-
// If there are multiple exceptions being rescued, then we're going to have
|
59
|
-
// multiple doc nodes returned as an array that we need to join together.
|
60
|
-
if (["mrhs", "mrhs_add_star", "mrhs_new_from_args"].includes(node.extns.type)) {
|
61
|
-
exceptionDoc = group(join([",", line], exceptionDoc));
|
62
|
-
}
|
63
|
-
parts.push(" ", exceptionDoc);
|
64
|
-
}
|
65
|
-
if (node.var) {
|
66
|
-
parts.push(" => ", path.call(print, "var"));
|
67
|
-
}
|
68
|
-
return group(parts);
|
69
|
-
};
|
70
|
-
exports.printRescueEx = printRescueEx;
|
71
|
-
const printRescueMod = (path, opts, print) => {
|
72
|
-
return [
|
73
|
-
"begin",
|
74
|
-
indent([hardline, path.call(print, "stmt")]),
|
75
|
-
hardline,
|
76
|
-
"rescue StandardError",
|
77
|
-
indent([hardline, path.call(print, "value")]),
|
78
|
-
hardline,
|
79
|
-
"end"
|
80
|
-
];
|
81
|
-
};
|
82
|
-
exports.printRescueMod = printRescueMod;
|
83
|
-
const printRedo = (path) => path.getValue().value;
|
84
|
-
exports.printRedo = printRedo;
|
85
|
-
const printRetry = (path) => path.getValue().value;
|
86
|
-
exports.printRetry = printRetry;
|