prettier 2.0.0.pre.rc3 → 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 +46 -4
- data/dist/haml/parser.rb +6 -0
- data/dist/parser/getInfo.js +9 -2
- data/dist/parser/parseSync.js +53 -16
- 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 +52 -42
- data/dist/ruby/nodes/regexp.js +6 -6
- data/dist/ruby/nodes/rescue.js +28 -24
- 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/exe/rbprettier +1 -2
- data/lib/prettier.rb +37 -5
- 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 +8 -8
- data/rubocop.yml +9 -3
- metadata +9 -5
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,14 +6,53 @@ 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.
|
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
|
+
|
30
|
+
## [2.0.0] - 2021-10-28
|
31
|
+
|
32
|
+
### Changed
|
33
|
+
|
34
|
+
- [#1018](https://github.com/prettier/plugin-ruby/issues/1018) - rindek, kddnewton - Ensure brackets are used when matching an array pattern with a single element.
|
35
|
+
- [#906](https://github.com/prettier/plugin-ruby/issues/906) - Hansenq, kddnewton - Turn off the `Style/MultilineBlockChain` rubocop rule in our shipped configuration because multiple chained method calls with blocks can potentially conflict with rubocop's desired output.
|
36
|
+
|
37
|
+
## [2.0.0-rc4] - 2021-10-18
|
38
|
+
|
39
|
+
### Added
|
40
|
+
|
41
|
+
- [#993](https://github.com/prettier/plugin-ruby/pull/993) - kddnewton - Nicer error message if you don't have the necessary JavaScript files to run prettier.
|
42
|
+
- [#996](https://github.com/prettier/plugin-ruby/pull/996) - nbudin - Allow `@prettier/plugin-ruby` to run in yarn's plug'n'play mode.
|
43
|
+
|
44
|
+
### Changed
|
45
|
+
|
46
|
+
- [#1000](https://github.com/prettier/plugin-ruby/pull/1000) - nbudin, kddnewton - Fix for rescuing single top-level exceptions in `rescue` clauses.
|
47
|
+
|
48
|
+
## [2.0.0-rc3] - 2021-10-01
|
10
49
|
|
11
50
|
### Changed
|
12
51
|
|
13
52
|
- [#987](https://github.com/prettier/plugin-ruby/pull/9870) - valscion - Ignore stderr when checking for node <-> ruby connection clients, restoring the behavior of v1.x
|
14
53
|
- [#989](https://github.com/prettier/plugin-ruby/issues/989) - hubertjakubiak, kddnewton - Make sure comments after the keyword/lbrace are not moved inside the body of the statements of do and brace blocks.
|
15
54
|
|
16
|
-
## [2.0.0-rc2]
|
55
|
+
## [2.0.0-rc2] - 2021-09-30
|
17
56
|
|
18
57
|
### Added
|
19
58
|
|
@@ -24,7 +63,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
|
|
24
63
|
|
25
64
|
- [#943](https://github.com/prettier/plugin-ruby/issues/943) - valscion, kddnewton - Trailing call operators that are followed by comments should stay on the first line.
|
26
65
|
|
27
|
-
## [2.0.0-rc1]
|
66
|
+
## [2.0.0-rc1] - 2021-09-30
|
28
67
|
|
29
68
|
### Added
|
30
69
|
|
@@ -1169,7 +1208,10 @@ would previously result in `array[]`, but now prints properly.
|
|
1169
1208
|
|
1170
1209
|
- Initial release 🎉
|
1171
1210
|
|
1172
|
-
[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
|
1213
|
+
[2.0.0]: https://github.com/prettier/plugin-ruby/compare/v2.0.0-rc4...v2.0.0
|
1214
|
+
[2.0.0-rc4]: https://github.com/prettier/plugin-ruby/compare/v2.0.0-rc3...v2.0.0-rc4
|
1173
1215
|
[2.0.0-rc3]: https://github.com/prettier/plugin-ruby/compare/v2.0.0-rc2...v2.0.0-rc3
|
1174
1216
|
[2.0.0-rc2]: https://github.com/prettier/plugin-ruby/compare/v2.0.0-rc1...v2.0.0-rc2
|
1175
1217
|
[2.0.0-rc1]: https://github.com/prettier/plugin-ruby/compare/v1.6.1...v2.0.0-rc1
|
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/parseSync.js
CHANGED
@@ -58,8 +58,53 @@ exports.getInfoFilepath = getInfoFilepath;
|
|
58
58
|
// will read that information in order to enable us to connect to it in the
|
59
59
|
// spawnSync function.
|
60
60
|
function spawnServer() {
|
61
|
+
const tempDir = (0, fs_1.mkdtempSync)(path_1.default.join(os_1.default.tmpdir(), "prettier-plugin-ruby-"));
|
61
62
|
const filepath = getInfoFilepath();
|
62
|
-
|
63
|
+
let serverRbPath = path_1.default.join(__dirname, "./server.rb");
|
64
|
+
let getInfoJsPath = path_1.default.join(__dirname, "./getInfo.js");
|
65
|
+
let cleanupTempFiles;
|
66
|
+
if (runningInPnPZip()) {
|
67
|
+
// If we're running in a Yarn PnP environment inside a ZIP file, it's not possible to run
|
68
|
+
// the Ruby server or the getInfo.js script directly. Instead, we need to copy them and all
|
69
|
+
// the files they depend on to a temporary directory.
|
70
|
+
const sourceFiles = [
|
71
|
+
"parser/server.rb",
|
72
|
+
"parser/getInfo.js",
|
73
|
+
"parser/netcat.js",
|
74
|
+
"ruby/parser.rb",
|
75
|
+
"rbs/parser.rb",
|
76
|
+
"haml/parser.rb"
|
77
|
+
];
|
78
|
+
serverRbPath = path_1.default.join(tempDir, "parser", "server.rb");
|
79
|
+
getInfoJsPath = path_1.default.join(tempDir, "parser", "getInfo.js");
|
80
|
+
sourceFiles.forEach((rubyFile) => {
|
81
|
+
const destDir = path_1.default.join(tempDir, path_1.default.dirname(rubyFile));
|
82
|
+
if (!(0, fs_1.existsSync)(destDir)) {
|
83
|
+
(0, fs_1.mkdirSync)(destDir);
|
84
|
+
}
|
85
|
+
(0, fs_1.copyFileSync)(path_1.default.join(__dirname, "..", rubyFile), path_1.default.join(tempDir, rubyFile));
|
86
|
+
});
|
87
|
+
cleanupTempFiles = () => {
|
88
|
+
[
|
89
|
+
getInfoJsPath,
|
90
|
+
...sourceFiles.map((rubyFile) => path_1.default.join(tempDir, rubyFile))
|
91
|
+
].forEach((tmpFilePath) => {
|
92
|
+
if ((0, fs_1.existsSync)(tmpFilePath)) {
|
93
|
+
(0, fs_1.unlinkSync)(tmpFilePath);
|
94
|
+
}
|
95
|
+
});
|
96
|
+
sourceFiles.forEach((rubyFile) => {
|
97
|
+
const tempSubdir = path_1.default.join(tempDir, path_1.default.dirname(rubyFile));
|
98
|
+
if ((0, fs_1.existsSync)(tempSubdir)) {
|
99
|
+
(0, fs_1.rmdirSync)(tempSubdir);
|
100
|
+
}
|
101
|
+
});
|
102
|
+
if ((0, fs_1.existsSync)(tempDir)) {
|
103
|
+
(0, fs_1.rmdirSync)(tempDir);
|
104
|
+
}
|
105
|
+
};
|
106
|
+
}
|
107
|
+
const server = (0, child_process_1.spawn)("ruby", [serverRbPath, filepath], {
|
63
108
|
env: Object.assign({}, process_1.default.env, { LANG: getLang() }),
|
64
109
|
detached: true,
|
65
110
|
stdio: "inherit"
|
@@ -69,6 +114,9 @@ function spawnServer() {
|
|
69
114
|
if ((0, fs_1.existsSync)(filepath)) {
|
70
115
|
(0, fs_1.unlinkSync)(filepath);
|
71
116
|
}
|
117
|
+
if (cleanupTempFiles != null) {
|
118
|
+
cleanupTempFiles();
|
119
|
+
}
|
72
120
|
try {
|
73
121
|
if (server.pid) {
|
74
122
|
process_1.default.kill(-server.pid);
|
@@ -80,10 +128,7 @@ function spawnServer() {
|
|
80
128
|
}
|
81
129
|
}
|
82
130
|
});
|
83
|
-
const info = (0, child_process_1.spawnSync)("node", [
|
84
|
-
path_1.default.join(__dirname, "./getInfo.js"),
|
85
|
-
filepath
|
86
|
-
]);
|
131
|
+
const info = (0, child_process_1.spawnSync)("node", [getInfoJsPath, filepath]);
|
87
132
|
if (info.status !== 0) {
|
88
133
|
throw new Error(`
|
89
134
|
We failed to spawn our parser server. Please report this error on GitHub
|
@@ -97,16 +142,9 @@ function spawnServer() {
|
|
97
142
|
}
|
98
143
|
// If we're in a yarn Plug'n'Play environment, then the relative paths being
|
99
144
|
// used by the parser server and the various scripts used to communicate
|
100
|
-
// therein are not going to work with its virtual file system.
|
101
|
-
|
102
|
-
|
103
|
-
if (process_1.default.versions.pnp) {
|
104
|
-
throw new Error(`
|
105
|
-
@prettier/plugin-ruby does not current work within the yarn Plug'n'Play
|
106
|
-
virtual file system. If you would like to help support the effort to fix
|
107
|
-
this, please see https://github.com/prettier/plugin-ruby/issues/894.
|
108
|
-
`);
|
109
|
-
}
|
145
|
+
// therein are not going to work with its virtual file system.
|
146
|
+
function runningInPnPZip() {
|
147
|
+
return process_1.default.versions.pnp && __dirname.includes(".zip");
|
110
148
|
}
|
111
149
|
// Formats and sends a request to the parser server. We use netcat (or something
|
112
150
|
// like it) here since Prettier requires the results of `parse` to be
|
@@ -114,7 +152,6 @@ function checkPnP() {
|
|
114
152
|
// requests.
|
115
153
|
function parseSync(parser, source) {
|
116
154
|
if (!parserArgs) {
|
117
|
-
checkPnP();
|
118
155
|
parserArgs = spawnServer();
|
119
156
|
}
|
120
157
|
const response = (0, child_process_1.spawnSync)(parserArgs.cmd, parserArgs.args, {
|
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
|
]);
|