prettier 2.0.0.pre.rc3 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +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
|
]);
|