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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34ffeeada2b06900ec6759f31a42ca387c8748a6a22843a1792fd906bfb4ffda
|
4
|
+
data.tar.gz: ddbceb38e8263f881fd12f66560615db880cf7870f0cb926671c2da656aad6f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 300acaf432b28f15d5b7690effbe7ca8fff778af699c5f79d0872c15f3241ec9be2e8fd83f86a9e65e6807cd152504b78d79760b30926c418bc7358d5d9f7524
|
7
|
+
data.tar.gz: a7d658200446e7dde838d07b502303fa30e168e800f3053e48e6cf05940fbb92892d0eaca9c48304a48b13d6c94dce09019bb7a2c18acc18c48b3c241d4d4637
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,27 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [2.1.0] - 2022-04-04
|
10
|
+
|
11
|
+
### Added
|
12
|
+
|
13
|
+
- [#1065](https://github.com/prettier/plugin-ruby/issues/1065) - langalex, kddnewton - The ability to set the `PRETTIER_RUBY_TIMEOUT_MS` environment variable to control how long to wait for the parser server to spin up.
|
14
|
+
- [#1173](https://github.com/prettier/plugin-ruby/pull/1173) - dleavitt - Support for RBS 2.x on Ruby 3.1.
|
15
|
+
|
16
|
+
### Changed
|
17
|
+
|
18
|
+
- [#1028](https://github.com/prettier/plugin-ruby/issues/1028) - levymetal, kddnewton - Fix up some nested formatting with very complicated RSpec assertions.
|
19
|
+
- [#1035](https://github.com/prettier/plugin-ruby/issues/1035) - qcn, kddnewton - Ensure we don't try to print `return` incorrectly when multiple statements are contained within parentheses.
|
20
|
+
- [#1048](https://github.com/prettier/plugin-ruby/pull/1048) - kddnewton - Completely refactor the Ruby parser to use classes instead of hashes. Also remove a lot of the `body` keys are replace them with actual names.
|
21
|
+
- [#1042](https://github.com/prettier/plugin-ruby/issues/1042) - JoshuaKGoldberg, kddnewton - Ensure blocks are printed correctly when there are trailing comments on the `do` keyword.
|
22
|
+
- [#1134](https://github.com/prettier/plugin-ruby/pull/1134) - mhssmnn - Fix piping for STDIN to the gem process.
|
23
|
+
- [#1167](https://github.com/prettier/plugin-ruby/pull/1167) - dleavitt - More consistent assignment indentation.
|
24
|
+
- [#1074](https://github.com/prettier/plugin-ruby/issues/1074) - wagenet, kddnewton - Fix up `return` when nodes return arrays of docs.
|
25
|
+
|
26
|
+
### Removed
|
27
|
+
|
28
|
+
- [#1048](https://github.com/prettier/plugin-ruby/pull/1048) - kddnewton - Drop support for Ruby 2.5.
|
29
|
+
|
9
30
|
## [2.0.0] - 2021-10-28
|
10
31
|
|
11
32
|
### Changed
|
@@ -1187,7 +1208,8 @@ would previously result in `array[]`, but now prints properly.
|
|
1187
1208
|
|
1188
1209
|
- Initial release 🎉
|
1189
1210
|
|
1190
|
-
[unreleased]: https://github.com/prettier/plugin-ruby/compare/v2.
|
1211
|
+
[unreleased]: https://github.com/prettier/plugin-ruby/compare/v2.1.0...HEAD
|
1212
|
+
[2.1.0]: https://github.com/prettier/plugin-ruby/compare/v2.0.0...v2.1.0
|
1191
1213
|
[2.0.0]: https://github.com/prettier/plugin-ruby/compare/v2.0.0-rc4...v2.0.0
|
1192
1214
|
[2.0.0-rc4]: https://github.com/prettier/plugin-ruby/compare/v2.0.0-rc3...v2.0.0-rc4
|
1193
1215
|
[2.0.0-rc3]: https://github.com/prettier/plugin-ruby/compare/v2.0.0-rc2...v2.0.0-rc3
|
data/dist/haml/parser.rb
CHANGED
@@ -44,6 +44,12 @@ class Haml::Parser::ParseNode
|
|
44
44
|
if hash
|
45
45
|
# Explicitly not using Enumerable#to_h here to support Ruby 2.5
|
46
46
|
hash.each_with_object({}) do |(key, value), response|
|
47
|
+
# For attributes that starts with @, wrap the attribute in quotes
|
48
|
+
# For other attributes, remove the quotes
|
49
|
+
# AlpineJS uses @-attributes
|
50
|
+
# {'type': 'submit'} => {type: 'submit'}
|
51
|
+
# {'@click': 'open'} => {'@click': 'open'}
|
52
|
+
key = "\'#{key}\'" if key.start_with?('@')
|
47
53
|
response[key] = parse_value(value, level + 1)
|
48
54
|
end
|
49
55
|
else
|
data/dist/parser/getInfo.js
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
2
2
|
const { existsSync, readFileSync } = require("fs");
|
3
3
|
|
4
|
+
// This is how long to wait for the parser to spin up. For the most part, 5
|
5
|
+
// seconds is plenty of time. But in some environments, it may be necessary to
|
6
|
+
// increase this value.
|
7
|
+
const timeoutMs = parseInt(process.env.PRETTIER_RUBY_TIMEOUT_MS || "5000", 10);
|
8
|
+
|
4
9
|
const filepath = process.argv[process.argv.length - 1];
|
5
10
|
|
6
11
|
const timeout = setTimeout(() => {
|
7
12
|
clearInterval(interval);
|
8
|
-
throw new Error(
|
9
|
-
|
13
|
+
throw new Error(`Failed to get information from parse server in time. If this
|
14
|
+
happens repeatedly, try increasing the PRETTIER_RUBY_TIMEOUT_MS environment
|
15
|
+
variable beyond 5000.`);
|
16
|
+
}, timeoutMs);
|
10
17
|
|
11
18
|
const interval = setInterval(() => {
|
12
19
|
if (existsSync(filepath)) {
|
data/dist/parser/server.rb
CHANGED
@@ -6,6 +6,10 @@ require 'json'
|
|
6
6
|
require 'fileutils'
|
7
7
|
require 'open3'
|
8
8
|
|
9
|
+
# Ensure the parent module is defined before requiring the parsers.
|
10
|
+
module Prettier
|
11
|
+
end
|
12
|
+
|
9
13
|
require_relative '../ruby/parser'
|
10
14
|
require_relative '../rbs/parser'
|
11
15
|
require_relative '../haml/parser'
|
@@ -72,7 +76,7 @@ listener =
|
|
72
76
|
when 'ping'
|
73
77
|
'pong'
|
74
78
|
when 'ruby'
|
75
|
-
|
79
|
+
SyntaxTree.parse(source)
|
76
80
|
when 'rbs'
|
77
81
|
Prettier::RBSParser.parse(source)
|
78
82
|
when 'haml'
|
@@ -84,7 +88,7 @@ listener =
|
|
84
88
|
else
|
85
89
|
socket.write('{ "error": true }')
|
86
90
|
end
|
87
|
-
rescue
|
91
|
+
rescue SyntaxTree::ParseError => error
|
88
92
|
loc = { start: { line: error.lineno, column: error.column } }
|
89
93
|
socket.write(JSON.fast_generate(error: error.message, loc: loc))
|
90
94
|
rescue StandardError => error
|
data/dist/rbs/parser.rb
CHANGED
@@ -19,6 +19,17 @@ rescue LoadError
|
|
19
19
|
return
|
20
20
|
end
|
21
21
|
|
22
|
+
# This was removed at some point, so we need to support both versions.
|
23
|
+
RBS::KEYWORD_RAW =
|
24
|
+
if RBS::Parser.const_defined?(:KEYWORDS_RE)
|
25
|
+
RBS::Parser::KEYWORDS_RE
|
26
|
+
else
|
27
|
+
RBS::Parser::KEYWORDS.keys.join('|')
|
28
|
+
end
|
29
|
+
|
30
|
+
# This enforces that the full matched string is a keyword.
|
31
|
+
RBS::KEYWORD_FULL = /\A#{RBS::KEYWORD_RAW}\z/
|
32
|
+
|
22
33
|
# Monkey-patch this so that we can get the character positions.
|
23
34
|
class RBS::Location
|
24
35
|
def to_json(*args)
|
@@ -40,7 +51,12 @@ end
|
|
40
51
|
# Monkey-patch this so that we get whether or not it needs to be escaped.
|
41
52
|
class RBS::Types::Function::Param
|
42
53
|
def to_json(*a)
|
43
|
-
escaped = name &&
|
54
|
+
escaped = name && RBS::KEYWORD_FULL.match?(name)
|
55
|
+
|
56
|
+
# More modern versions of RBS just include the ` in the name so there's no
|
57
|
+
# need to escape it further.
|
58
|
+
escaped = false if name.to_s.start_with?('`')
|
59
|
+
|
44
60
|
{ type: type, name: name, escaped: escaped }.to_json(*a)
|
45
61
|
end
|
46
62
|
end
|
@@ -71,7 +87,7 @@ class RBS::Types::Record
|
|
71
87
|
# Explicitly not using Enumerable#to_h here to support Ruby 2.5
|
72
88
|
fields.each do |key, type|
|
73
89
|
if key.is_a?(Symbol) && key.match?(/\A[A-Za-z_][A-Za-z_]*\z/) &&
|
74
|
-
!key.match?(RBS::
|
90
|
+
!key.match?(RBS::KEYWORD_RAW)
|
75
91
|
fields_extra[key] = { type: type, joiner: :label }
|
76
92
|
else
|
77
93
|
fields_extra[key.inspect] = { type: type, joiner: :rocket }
|
@@ -82,6 +98,47 @@ class RBS::Types::Record
|
|
82
98
|
end
|
83
99
|
end
|
84
100
|
|
101
|
+
if defined?(RBS::AST::Declarations::ModuleTypeParams)
|
102
|
+
# This class was removed in rbs 2.0. Monkeypatch < 2.0 to give the same json
|
103
|
+
# output
|
104
|
+
class RBS::AST::Declarations::ModuleTypeParams
|
105
|
+
def to_json(*a)
|
106
|
+
params.to_json(*a)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# make this look like the new AST::TypeParam json
|
111
|
+
class RBS::AST::Declarations::ModuleTypeParams::TypeParam
|
112
|
+
def to_json(*a)
|
113
|
+
{ name: name, variance: variance, unchecked: skip_validation }.to_json(*a)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# https://github.com/ruby/rbs/commit/3ccdcb1f3ac5dcb866280f745866a852658195e6
|
118
|
+
class RBS::MethodType
|
119
|
+
# promote the array of symbols into TypeParam looking-things
|
120
|
+
def to_json(*a)
|
121
|
+
type_param_objects =
|
122
|
+
type_params.map do |name|
|
123
|
+
{
|
124
|
+
name: name,
|
125
|
+
variance: 'invariant',
|
126
|
+
unchecked: 'false',
|
127
|
+
upper_bound: nil
|
128
|
+
# location - harder to get this but not needed
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
{
|
133
|
+
type_params: type_param_objects,
|
134
|
+
type: type,
|
135
|
+
block: block,
|
136
|
+
location: location
|
137
|
+
}.to_json(*a)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
85
142
|
# The main parser interface.
|
86
143
|
module Prettier
|
87
144
|
class RBSParser
|
data/dist/rbs/printer.js
CHANGED
@@ -228,7 +228,7 @@ const printer = {
|
|
228
228
|
const preferredQuote = opts.rubySingleQuote ? "'" : '"';
|
229
229
|
// Determine if we're allowed to change the quote based on whether or not
|
230
230
|
// there is an escape sequence in the source string.
|
231
|
-
const quote =
|
231
|
+
const quote = value.match(new RegExp(`\\\\[^${originalQuote}]`))
|
232
232
|
? originalQuote
|
233
233
|
: preferredQuote;
|
234
234
|
return makeString(value.slice(1, -1), quote, false);
|
@@ -367,13 +367,13 @@ const printer = {
|
|
367
367
|
// Additionally loops through each type parameter if there are any and print
|
368
368
|
// them out joined by commas. Checks for validation and variance.
|
369
369
|
function printNameAndTypeParams(path, node) {
|
370
|
-
if (node.type_params.
|
370
|
+
if (node.type_params.length === 0) {
|
371
371
|
return node.name;
|
372
372
|
}
|
373
373
|
const docs = path.map((paramPath) => {
|
374
374
|
const node = paramPath.getValue();
|
375
375
|
const parts = [];
|
376
|
-
if (node.
|
376
|
+
if (node.unchecked) {
|
377
377
|
parts.push("unchecked");
|
378
378
|
}
|
379
379
|
if (node.variance === "covariant") {
|
@@ -382,8 +382,15 @@ const printer = {
|
|
382
382
|
else if (node.variance === "contravariant") {
|
383
383
|
parts.push("in");
|
384
384
|
}
|
385
|
-
|
386
|
-
|
385
|
+
if (node.upper_bound) {
|
386
|
+
const path = paramPath;
|
387
|
+
const upperBound = path.call(printType, "upper_bound");
|
388
|
+
return join(" ", [...parts, node.name, "<", upperBound]);
|
389
|
+
}
|
390
|
+
else {
|
391
|
+
return join(" ", [...parts, node.name]);
|
392
|
+
}
|
393
|
+
}, "type_params");
|
387
394
|
return [node.name, "[", join(", ", docs), "]"];
|
388
395
|
}
|
389
396
|
// Returns an array of printed parameters so that the calling function can
|
@@ -455,7 +462,8 @@ const printer = {
|
|
455
462
|
const parts = [];
|
456
463
|
// We won't have a type_params key if we're printing a block
|
457
464
|
if (node.type_params && node.type_params.length > 0) {
|
458
|
-
|
465
|
+
const typeParamNames = node.type_params.map((tp) => tp.name);
|
466
|
+
parts.push("[", join(", ", typeParamNames), "] ");
|
459
467
|
}
|
460
468
|
const params = path.call(printMethodParams, "type");
|
461
469
|
if (params.length > 0) {
|
data/dist/ruby/embed.js
CHANGED
@@ -57,6 +57,11 @@ function stripCommonLeadingWhitespace(content) {
|
|
57
57
|
const minimum = getCommonLeadingWhitespace(content);
|
58
58
|
return lines.map((line) => line.slice(minimum)).join("\n");
|
59
59
|
}
|
60
|
+
// A type assertion so that TypeScript knows we're working with an array of
|
61
|
+
// exclusively plain string content.
|
62
|
+
function isTStringContentArray(body) {
|
63
|
+
return body.every((part) => part.type === "tstring_content");
|
64
|
+
}
|
60
65
|
const embed = (path, print, textToDoc) => {
|
61
66
|
const node = path.getValue();
|
62
67
|
// Currently we only support embedded formatting on heredoc nodes
|
@@ -64,19 +69,19 @@ const embed = (path, print, textToDoc) => {
|
|
64
69
|
return null;
|
65
70
|
}
|
66
71
|
// First, ensure that we don't have any interpolation
|
67
|
-
const { beging,
|
68
|
-
const isSquiggly = beging.
|
69
|
-
if (
|
72
|
+
const { beging, parts, ending } = node;
|
73
|
+
const isSquiggly = beging.value[2] === "~";
|
74
|
+
if (!isTStringContentArray(parts)) {
|
70
75
|
return null;
|
71
76
|
}
|
72
77
|
// Next, find the parser associated with this heredoc (if there is one). For
|
73
78
|
// example, if you use <<~CSS, we'd hook it up to the css parser.
|
74
|
-
const parser = parsers[beging.
|
79
|
+
const parser = parsers[beging.value.slice(3).toLowerCase()];
|
75
80
|
if (!parser) {
|
76
81
|
return null;
|
77
82
|
}
|
78
83
|
// Get the content as if it were a source string.
|
79
|
-
let content =
|
84
|
+
let content = parts.map((part) => part.value).join("");
|
80
85
|
// If we're using a squiggly heredoc, then we're going to manually strip off
|
81
86
|
// the leading whitespace of each line up to the minimum leading whitespace so
|
82
87
|
// that the embedded parser can handle that for us.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getEndChar = exports.getEndLine = exports.getStartChar = exports.getStartLine = void 0;
|
4
|
+
function getStartLine(location) {
|
5
|
+
return location[0];
|
6
|
+
}
|
7
|
+
exports.getStartLine = getStartLine;
|
8
|
+
function getStartChar(location) {
|
9
|
+
return location[1];
|
10
|
+
}
|
11
|
+
exports.getStartChar = getStartChar;
|
12
|
+
function getEndLine(location) {
|
13
|
+
return location[2];
|
14
|
+
}
|
15
|
+
exports.getEndLine = getEndLine;
|
16
|
+
function getEndChar(location) {
|
17
|
+
return location[3];
|
18
|
+
}
|
19
|
+
exports.getEndChar = getEndChar;
|
data/dist/ruby/nodes/alias.js
CHANGED
@@ -27,6 +27,7 @@ const { addTrailingComment, align, group, hardline, line } = prettier_1.default;
|
|
27
27
|
// the symbol literal `bar` and the right could be the symbol literal `foo`.
|
28
28
|
const printAlias = (path, opts, print) => {
|
29
29
|
const keyword = "alias ";
|
30
|
+
const node = path.getValue();
|
30
31
|
// In general, return the printed doc of the argument at the provided index.
|
31
32
|
// Special handling is given for symbol literals that are not bare words, as
|
32
33
|
// we convert those into bare words by just pulling out the ident node.
|
@@ -38,21 +39,21 @@ const printAlias = (path, opts, print) => {
|
|
38
39
|
// otherwise we could accidentally skip printing them.
|
39
40
|
if (argNode.comments) {
|
40
41
|
argNode.comments.forEach((comment) => {
|
41
|
-
addTrailingComment(argNode.
|
42
|
+
addTrailingComment(argNode.value, comment);
|
42
43
|
});
|
43
44
|
}
|
44
|
-
return argPath.call(print, "
|
45
|
+
return argPath.call(print, "value");
|
45
46
|
}
|
46
47
|
return print(argPath);
|
47
48
|
};
|
48
49
|
return group([
|
49
50
|
keyword,
|
50
|
-
path.call(printAliasArg, "
|
51
|
+
path.call(printAliasArg, "left"),
|
51
52
|
group(align(keyword.length, [
|
52
53
|
// If the left child has any comments, then we need to explicitly break
|
53
54
|
// this into two lines
|
54
|
-
|
55
|
-
path.call(printAliasArg, "
|
55
|
+
node.left.comments ? hardline : line,
|
56
|
+
path.call(printAliasArg, "right")
|
56
57
|
]))
|
57
58
|
]);
|
58
59
|
};
|
data/dist/ruby/nodes/aref.js
CHANGED
@@ -19,9 +19,8 @@ const { group, indent, join, line, softline } = prettier_1.default;
|
|
19
19
|
// foo[]
|
20
20
|
//
|
21
21
|
const printAref = (path, opts, print) => {
|
22
|
-
|
23
|
-
|
24
|
-
return [path.call(print, "body", 0), "[]"];
|
22
|
+
if (!path.getValue().index) {
|
23
|
+
return [path.call(print, "collection"), "[]"];
|
25
24
|
}
|
26
25
|
return (0, exports.printArefField)(path, opts, print);
|
27
26
|
};
|
@@ -41,11 +40,10 @@ exports.printAref = printAref;
|
|
41
40
|
// foo[bar] = baz
|
42
41
|
//
|
43
42
|
const printArefField = (path, opts, print) => {
|
44
|
-
const [printedArray, printedIndex] = path.map(print, "body");
|
45
43
|
return group([
|
46
|
-
|
44
|
+
path.call(print, "collection"),
|
47
45
|
"[",
|
48
|
-
indent([softline, join([",", line],
|
46
|
+
indent([softline, join([",", line], path.call(print, "index"))]),
|
49
47
|
softline,
|
50
48
|
"]"
|
51
49
|
]);
|
data/dist/ruby/nodes/args.js
CHANGED
@@ -3,27 +3,38 @@ 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.
|
6
|
+
exports.printArgStar = exports.printBlockArg = exports.printArgsAddBlock = exports.printArgs = exports.printArgParen = void 0;
|
7
7
|
const prettier_1 = __importDefault(require("../../prettier"));
|
8
8
|
const utils_1 = require("../../utils");
|
9
9
|
const toProc_1 = __importDefault(require("../toProc"));
|
10
10
|
const { group, ifBreak, indent, join, line, softline } = prettier_1.default;
|
11
11
|
const noTrailingComma = ["command", "command_call"];
|
12
|
+
function getArgs(node) {
|
13
|
+
switch (node.type) {
|
14
|
+
case "args":
|
15
|
+
return node.parts;
|
16
|
+
case "args_add_block": {
|
17
|
+
const args = getArgs(node.args);
|
18
|
+
return node.block ? [...args, node.block] : args;
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
12
22
|
function getArgParenTrailingComma(node) {
|
13
23
|
// If we have a block, then we don't want to add a trailing comma.
|
14
|
-
if (node.type === "args_add_block" && node.
|
24
|
+
if (node.type === "args_add_block" && node.block) {
|
15
25
|
return "";
|
16
26
|
}
|
17
27
|
// If we only have one argument and that first argument necessitates that we
|
18
28
|
// skip putting a comma (because it would interfere with parsing the argument)
|
19
29
|
// then we don't want to add a trailing comma.
|
20
|
-
|
30
|
+
const args = getArgs(node);
|
31
|
+
if (args.length === 1 && noTrailingComma.includes(args[0].type)) {
|
21
32
|
return "";
|
22
33
|
}
|
23
34
|
return ifBreak(",", "");
|
24
35
|
}
|
25
36
|
const printArgParen = (path, opts, print) => {
|
26
|
-
const argsNode = path.getValue().
|
37
|
+
const argsNode = path.getValue().args;
|
27
38
|
if (argsNode === null) {
|
28
39
|
return "";
|
29
40
|
}
|
@@ -33,7 +44,7 @@ const printArgParen = (path, opts, print) => {
|
|
33
44
|
if (argsNode.type === "args_forward") {
|
34
45
|
return group([
|
35
46
|
"(",
|
36
|
-
indent([softline, path.call(print, "
|
47
|
+
indent([softline, path.call(print, "args")]),
|
37
48
|
softline,
|
38
49
|
")"
|
39
50
|
]);
|
@@ -44,7 +55,7 @@ const printArgParen = (path, opts, print) => {
|
|
44
55
|
"(",
|
45
56
|
indent([
|
46
57
|
softline,
|
47
|
-
join([",", line], path.call(print, "
|
58
|
+
join([",", line], path.call(print, "args")),
|
48
59
|
(0, utils_1.getTrailingComma)(opts) ? getArgParenTrailingComma(argsNode) : ""
|
49
60
|
]),
|
50
61
|
softline,
|
@@ -53,7 +64,7 @@ const printArgParen = (path, opts, print) => {
|
|
53
64
|
};
|
54
65
|
exports.printArgParen = printArgParen;
|
55
66
|
const printArgs = (path, { rubyToProc }, print) => {
|
56
|
-
const args = path.map(print, "
|
67
|
+
const args = path.map(print, "parts");
|
57
68
|
// Don't bother trying to do any kind of fancy toProc transform if the
|
58
69
|
// option is disabled.
|
59
70
|
if (rubyToProc) {
|
@@ -67,7 +78,7 @@ const printArgs = (path, { rubyToProc }, print) => {
|
|
67
78
|
blockNode =
|
68
79
|
parentNode &&
|
69
80
|
parentNode.type === "method_add_block" &&
|
70
|
-
parentNode.
|
81
|
+
parentNode.block;
|
71
82
|
return blockNode;
|
72
83
|
});
|
73
84
|
const proc = blockNode && (0, toProc_1.default)(path, blockNode);
|
@@ -87,11 +98,10 @@ const printArgs = (path, { rubyToProc }, print) => {
|
|
87
98
|
exports.printArgs = printArgs;
|
88
99
|
const printArgsAddBlock = (path, opts, print) => {
|
89
100
|
const node = path.getValue();
|
90
|
-
const
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
if (!(blockNode.comments || []).some(({ leading }) => leading)) {
|
101
|
+
const parts = path.call(print, "args");
|
102
|
+
if (node.block) {
|
103
|
+
let blockDoc = path.call(print, "block");
|
104
|
+
if (!(node.block.comments || []).some(({ leading }) => leading)) {
|
95
105
|
// If we don't have any leading comments, we can just prepend the
|
96
106
|
// operator.
|
97
107
|
blockDoc = ["&", blockDoc];
|
@@ -117,49 +127,12 @@ const printArgsAddBlock = (path, opts, print) => {
|
|
117
127
|
return parts;
|
118
128
|
};
|
119
129
|
exports.printArgsAddBlock = printArgsAddBlock;
|
120
|
-
const printArgsAddStar = (path, opts, print) => {
|
121
|
-
let docs = [];
|
122
|
-
path.each((argPath, argIndex) => {
|
123
|
-
const doc = print(argPath);
|
124
|
-
// If it's the first child, then it's an array of args, so we're going to
|
125
|
-
// concat that onto the existing docs if there are any.
|
126
|
-
if (argIndex === 0) {
|
127
|
-
if (doc.length > 0) {
|
128
|
-
docs = docs.concat(doc);
|
129
|
-
}
|
130
|
-
return;
|
131
|
-
}
|
132
|
-
// If it's after the splat, then it's an individual arg, so we're just going
|
133
|
-
// to push it onto the array.
|
134
|
-
if (argIndex !== 1) {
|
135
|
-
docs.push(doc);
|
136
|
-
return;
|
137
|
-
}
|
138
|
-
// If we don't have any leading comments, we can just prepend the operator.
|
139
|
-
const argsNode = argPath.getValue();
|
140
|
-
if (!(argsNode.comments || []).some(({ leading }) => leading)) {
|
141
|
-
docs.push(["*", doc]);
|
142
|
-
return;
|
143
|
-
}
|
144
|
-
// If we have an array like:
|
145
|
-
//
|
146
|
-
// [
|
147
|
-
// # comment
|
148
|
-
// *values
|
149
|
-
// ]
|
150
|
-
//
|
151
|
-
// then we need to make sure we don't accidentally prepend the operator
|
152
|
-
// before the comment(s).
|
153
|
-
//
|
154
|
-
// In prettier >= 2.3.0, the comments are printed as an array before the
|
155
|
-
// content. I don't love this kind of reflection, but it's the simplest way
|
156
|
-
// at the moment to get this right.
|
157
|
-
docs.push(doc[0].concat(["*", doc[1]], doc.slice(2)));
|
158
|
-
}, "body");
|
159
|
-
return docs;
|
160
|
-
};
|
161
|
-
exports.printArgsAddStar = printArgsAddStar;
|
162
130
|
const printBlockArg = (path, opts, print) => {
|
163
|
-
return ["&", path.call(print, "
|
131
|
+
return ["&", path.call(print, "name")];
|
164
132
|
};
|
165
133
|
exports.printBlockArg = printBlockArg;
|
134
|
+
const printArgStar = (path, opts, print) => {
|
135
|
+
const node = path.getValue();
|
136
|
+
return node.value ? ["*", path.call(print, "value")] : "*";
|
137
|
+
};
|
138
|
+
exports.printArgStar = printArgStar;
|