aboutsummaryrefslogtreecommitdiff
path: root/editors/code
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code')
-rw-r--r--editors/code/.vscodeignore2
-rw-r--r--editors/code/package-lock.json768
-rw-r--r--editors/code/package.json30
-rw-r--r--editors/code/rollup.config.js4
-rw-r--r--editors/code/rust.tmGrammar.json7
-rw-r--r--editors/code/src/cargo.ts57
-rw-r--r--editors/code/src/client.ts41
-rw-r--r--editors/code/src/commands/index.ts89
-rw-r--r--editors/code/src/commands/join_lines.ts12
-rw-r--r--editors/code/src/commands/on_enter.ts5
-rw-r--r--editors/code/src/commands/ssr.ts6
-rw-r--r--editors/code/src/main.ts53
-rw-r--r--editors/code/src/rust-analyzer-api.ts8
-rw-r--r--editors/code/tests/runTests.ts43
-rw-r--r--editors/code/tests/unit/index.ts38
-rw-r--r--editors/code/tests/unit/launch_config.test.ts52
-rw-r--r--editors/code/tsconfig.json9
17 files changed, 1130 insertions, 94 deletions
diff --git a/editors/code/.vscodeignore b/editors/code/.vscodeignore
index 257b744bf..7149ab799 100644
--- a/editors/code/.vscodeignore
+++ b/editors/code/.vscodeignore
@@ -1,5 +1,5 @@
1** 1**
2!out/main.js 2!out/src/main.js
3!package.json 3!package.json
4!package-lock.json 4!package-lock.json
5!ra_syntax_tree.tmGrammar.json 5!ra_syntax_tree.tmGrammar.json
diff --git a/editors/code/package-lock.json b/editors/code/package-lock.json
index 06178990f..c322b02c8 100644
--- a/editors/code/package-lock.json
+++ b/editors/code/package-lock.json
@@ -81,12 +81,41 @@
81 "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 81 "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
82 "dev": true 82 "dev": true
83 }, 83 },
84 "@types/events": {
85 "version": "3.0.0",
86 "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
87 "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
88 "dev": true
89 },
90 "@types/glob": {
91 "version": "7.1.1",
92 "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
93 "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
94 "dev": true,
95 "requires": {
96 "@types/events": "*",
97 "@types/minimatch": "*",
98 "@types/node": "*"
99 }
100 },
84 "@types/json-schema": { 101 "@types/json-schema": {
85 "version": "7.0.4", 102 "version": "7.0.4",
86 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", 103 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz",
87 "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", 104 "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==",
88 "dev": true 105 "dev": true
89 }, 106 },
107 "@types/minimatch": {
108 "version": "3.0.3",
109 "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
110 "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
111 "dev": true
112 },
113 "@types/mocha": {
114 "version": "7.0.2",
115 "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz",
116 "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==",
117 "dev": true
118 },
90 "@types/node": { 119 "@types/node": {
91 "version": "12.12.39", 120 "version": "12.12.39",
92 "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.39.tgz", 121 "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.39.tgz",
@@ -200,6 +229,15 @@
200 "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 229 "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
201 "dev": true 230 "dev": true
202 }, 231 },
232 "agent-base": {
233 "version": "4.3.0",
234 "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
235 "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
236 "dev": true,
237 "requires": {
238 "es6-promisify": "^5.0.0"
239 }
240 },
203 "ajv": { 241 "ajv": {
204 "version": "6.12.0", 242 "version": "6.12.0",
205 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", 243 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
@@ -212,6 +250,12 @@
212 "uri-js": "^4.2.2" 250 "uri-js": "^4.2.2"
213 } 251 }
214 }, 252 },
253 "ansi-colors": {
254 "version": "3.2.3",
255 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
256 "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
257 "dev": true
258 },
215 "ansi-escapes": { 259 "ansi-escapes": {
216 "version": "4.3.1", 260 "version": "4.3.1",
217 "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 261 "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
@@ -244,6 +288,16 @@
244 "color-convert": "^1.9.0" 288 "color-convert": "^1.9.0"
245 } 289 }
246 }, 290 },
291 "anymatch": {
292 "version": "3.1.1",
293 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
294 "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
295 "dev": true,
296 "requires": {
297 "normalize-path": "^3.0.0",
298 "picomatch": "^2.0.4"
299 }
300 },
247 "argparse": { 301 "argparse": {
248 "version": "1.0.10", 302 "version": "1.0.10",
249 "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 303 "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -283,6 +337,12 @@
283 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 337 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
284 "dev": true 338 "dev": true
285 }, 339 },
340 "binary-extensions": {
341 "version": "2.0.0",
342 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
343 "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
344 "dev": true
345 },
286 "boolbase": { 346 "boolbase": {
287 "version": "1.0.0", 347 "version": "1.0.0",
288 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 348 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@@ -308,6 +368,12 @@
308 "fill-range": "^7.0.1" 368 "fill-range": "^7.0.1"
309 } 369 }
310 }, 370 },
371 "browser-stdout": {
372 "version": "1.3.1",
373 "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
374 "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
375 "dev": true
376 },
311 "buffer-crc32": { 377 "buffer-crc32": {
312 "version": "0.2.13", 378 "version": "0.2.13",
313 "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 379 "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
@@ -326,6 +392,12 @@
326 "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 392 "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
327 "dev": true 393 "dev": true
328 }, 394 },
395 "camelcase": {
396 "version": "5.3.1",
397 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
398 "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
399 "dev": true
400 },
329 "chalk": { 401 "chalk": {
330 "version": "2.4.2", 402 "version": "2.4.2",
331 "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 403 "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -357,6 +429,22 @@
357 "parse5": "^3.0.1" 429 "parse5": "^3.0.1"
358 } 430 }
359 }, 431 },
432 "chokidar": {
433 "version": "3.3.0",
434 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
435 "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
436 "dev": true,
437 "requires": {
438 "anymatch": "~3.1.1",
439 "braces": "~3.0.2",
440 "fsevents": "~2.1.1",
441 "glob-parent": "~5.1.0",
442 "is-binary-path": "~2.1.0",
443 "is-glob": "~4.0.1",
444 "normalize-path": "~3.0.0",
445 "readdirp": "~3.2.0"
446 }
447 },
360 "cli-cursor": { 448 "cli-cursor": {
361 "version": "3.1.0", 449 "version": "3.1.0",
362 "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 450 "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -372,6 +460,42 @@
372 "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 460 "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
373 "dev": true 461 "dev": true
374 }, 462 },
463 "cliui": {
464 "version": "5.0.0",
465 "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
466 "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
467 "dev": true,
468 "requires": {
469 "string-width": "^3.1.0",
470 "strip-ansi": "^5.2.0",
471 "wrap-ansi": "^5.1.0"
472 },
473 "dependencies": {
474 "emoji-regex": {
475 "version": "7.0.3",
476 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
477 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
478 "dev": true
479 },
480 "is-fullwidth-code-point": {
481 "version": "2.0.0",
482 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
483 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
484 "dev": true
485 },
486 "string-width": {
487 "version": "3.1.0",
488 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
489 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
490 "dev": true,
491 "requires": {
492 "emoji-regex": "^7.0.1",
493 "is-fullwidth-code-point": "^2.0.0",
494 "strip-ansi": "^5.1.0"
495 }
496 }
497 }
498 },
375 "color-convert": { 499 "color-convert": {
376 "version": "1.9.3", 500 "version": "1.9.3",
377 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 501 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -468,12 +592,27 @@
468 "ms": "^2.1.1" 592 "ms": "^2.1.1"
469 } 593 }
470 }, 594 },
595 "decamelize": {
596 "version": "1.2.0",
597 "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
598 "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
599 "dev": true
600 },
471 "deep-is": { 601 "deep-is": {
472 "version": "0.1.3", 602 "version": "0.1.3",
473 "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 603 "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
474 "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 604 "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
475 "dev": true 605 "dev": true
476 }, 606 },
607 "define-properties": {
608 "version": "1.1.3",
609 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
610 "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
611 "dev": true,
612 "requires": {
613 "object-keys": "^1.0.12"
614 }
615 },
477 "delayed-stream": { 616 "delayed-stream": {
478 "version": "1.0.0", 617 "version": "1.0.0",
479 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 618 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -486,6 +625,12 @@
486 "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", 625 "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
487 "dev": true 626 "dev": true
488 }, 627 },
628 "diff": {
629 "version": "3.5.0",
630 "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
631 "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
632 "dev": true
633 },
489 "doctrine": { 634 "doctrine": {
490 "version": "3.0.0", 635 "version": "3.0.0",
491 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 636 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -562,6 +707,51 @@
562 "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", 707 "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
563 "dev": true 708 "dev": true
564 }, 709 },
710 "es-abstract": {
711 "version": "1.17.5",
712 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
713 "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
714 "dev": true,
715 "requires": {
716 "es-to-primitive": "^1.2.1",
717 "function-bind": "^1.1.1",
718 "has": "^1.0.3",
719 "has-symbols": "^1.0.1",
720 "is-callable": "^1.1.5",
721 "is-regex": "^1.0.5",
722 "object-inspect": "^1.7.0",
723 "object-keys": "^1.1.1",
724 "object.assign": "^4.1.0",
725 "string.prototype.trimleft": "^2.1.1",
726 "string.prototype.trimright": "^2.1.1"
727 }
728 },
729 "es-to-primitive": {
730 "version": "1.2.1",
731 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
732 "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
733 "dev": true,
734 "requires": {
735 "is-callable": "^1.1.4",
736 "is-date-object": "^1.0.1",
737 "is-symbol": "^1.0.2"
738 }
739 },
740 "es6-promise": {
741 "version": "4.2.8",
742 "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
743 "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
744 "dev": true
745 },
746 "es6-promisify": {
747 "version": "5.0.0",
748 "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
749 "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
750 "dev": true,
751 "requires": {
752 "es6-promise": "^4.0.3"
753 }
754 },
565 "escape-string-regexp": { 755 "escape-string-regexp": {
566 "version": "1.0.5", 756 "version": "1.0.5",
567 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 757 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -764,6 +954,24 @@
764 "to-regex-range": "^5.0.1" 954 "to-regex-range": "^5.0.1"
765 } 955 }
766 }, 956 },
957 "find-up": {
958 "version": "3.0.0",
959 "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
960 "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
961 "dev": true,
962 "requires": {
963 "locate-path": "^3.0.0"
964 }
965 },
966 "flat": {
967 "version": "4.1.0",
968 "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
969 "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
970 "dev": true,
971 "requires": {
972 "is-buffer": "~2.0.3"
973 }
974 },
767 "flat-cache": { 975 "flat-cache": {
768 "version": "2.0.1", 976 "version": "2.0.1",
769 "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 977 "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
@@ -805,12 +1013,24 @@
805 "dev": true, 1013 "dev": true,
806 "optional": true 1014 "optional": true
807 }, 1015 },
1016 "function-bind": {
1017 "version": "1.1.1",
1018 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1019 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1020 "dev": true
1021 },
808 "functional-red-black-tree": { 1022 "functional-red-black-tree": {
809 "version": "1.0.1", 1023 "version": "1.0.1",
810 "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1024 "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
811 "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1025 "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
812 "dev": true 1026 "dev": true
813 }, 1027 },
1028 "get-caller-file": {
1029 "version": "2.0.5",
1030 "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1031 "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1032 "dev": true
1033 },
814 "glob": { 1034 "glob": {
815 "version": "7.1.6", 1035 "version": "7.1.6",
816 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1036 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
@@ -843,12 +1063,39 @@
843 "type-fest": "^0.8.1" 1063 "type-fest": "^0.8.1"
844 } 1064 }
845 }, 1065 },
1066 "growl": {
1067 "version": "1.10.5",
1068 "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
1069 "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
1070 "dev": true
1071 },
1072 "has": {
1073 "version": "1.0.3",
1074 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1075 "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1076 "dev": true,
1077 "requires": {
1078 "function-bind": "^1.1.1"
1079 }
1080 },
846 "has-flag": { 1081 "has-flag": {
847 "version": "3.0.0", 1082 "version": "3.0.0",
848 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1083 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
849 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1084 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
850 "dev": true 1085 "dev": true
851 }, 1086 },
1087 "has-symbols": {
1088 "version": "1.0.1",
1089 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
1090 "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
1091 "dev": true
1092 },
1093 "he": {
1094 "version": "1.2.0",
1095 "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1096 "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
1097 "dev": true
1098 },
852 "htmlparser2": { 1099 "htmlparser2": {
853 "version": "3.10.1", 1100 "version": "3.10.1",
854 "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", 1101 "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
@@ -863,6 +1110,54 @@
863 "readable-stream": "^3.1.1" 1110 "readable-stream": "^3.1.1"
864 } 1111 }
865 }, 1112 },
1113 "http-proxy-agent": {
1114 "version": "2.1.0",
1115 "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
1116 "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
1117 "dev": true,
1118 "requires": {
1119 "agent-base": "4",
1120 "debug": "3.1.0"
1121 },
1122 "dependencies": {
1123 "debug": {
1124 "version": "3.1.0",
1125 "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1126 "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1127 "dev": true,
1128 "requires": {
1129 "ms": "2.0.0"
1130 }
1131 },
1132 "ms": {
1133 "version": "2.0.0",
1134 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1135 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1136 "dev": true
1137 }
1138 }
1139 },
1140 "https-proxy-agent": {
1141 "version": "2.2.4",
1142 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
1143 "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
1144 "dev": true,
1145 "requires": {
1146 "agent-base": "^4.3.0",
1147 "debug": "^3.1.0"
1148 },
1149 "dependencies": {
1150 "debug": {
1151 "version": "3.2.6",
1152 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1153 "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1154 "dev": true,
1155 "requires": {
1156 "ms": "^2.1.1"
1157 }
1158 }
1159 }
1160 },
866 "iconv-lite": { 1161 "iconv-lite": {
867 "version": "0.4.24", 1162 "version": "0.4.24",
868 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1163 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -992,6 +1287,33 @@
992 } 1287 }
993 } 1288 }
994 }, 1289 },
1290 "is-binary-path": {
1291 "version": "2.1.0",
1292 "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1293 "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1294 "dev": true,
1295 "requires": {
1296 "binary-extensions": "^2.0.0"
1297 }
1298 },
1299 "is-buffer": {
1300 "version": "2.0.4",
1301 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
1302 "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
1303 "dev": true
1304 },
1305 "is-callable": {
1306 "version": "1.1.5",
1307 "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
1308 "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
1309 "dev": true
1310 },
1311 "is-date-object": {
1312 "version": "1.0.2",
1313 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
1314 "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
1315 "dev": true
1316 },
995 "is-extglob": { 1317 "is-extglob": {
996 "version": "2.1.1", 1318 "version": "2.1.1",
997 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1319 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -1040,6 +1362,24 @@
1040 "@types/estree": "0.0.39" 1362 "@types/estree": "0.0.39"
1041 } 1363 }
1042 }, 1364 },
1365 "is-regex": {
1366 "version": "1.0.5",
1367 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
1368 "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
1369 "dev": true,
1370 "requires": {
1371 "has": "^1.0.3"
1372 }
1373 },
1374 "is-symbol": {
1375 "version": "1.0.3",
1376 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
1377 "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
1378 "dev": true,
1379 "requires": {
1380 "has-symbols": "^1.0.1"
1381 }
1382 },
1043 "isexe": { 1383 "isexe": {
1044 "version": "2.0.0", 1384 "version": "2.0.0",
1045 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1385 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -1099,12 +1439,31 @@
1099 "uc.micro": "^1.0.1" 1439 "uc.micro": "^1.0.1"
1100 } 1440 }
1101 }, 1441 },
1442 "locate-path": {
1443 "version": "3.0.0",
1444 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
1445 "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
1446 "dev": true,
1447 "requires": {
1448 "p-locate": "^3.0.0",
1449 "path-exists": "^3.0.0"
1450 }
1451 },
1102 "lodash": { 1452 "lodash": {
1103 "version": "4.17.15", 1453 "version": "4.17.15",
1104 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1454 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1105 "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1455 "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
1106 "dev": true 1456 "dev": true
1107 }, 1457 },
1458 "log-symbols": {
1459 "version": "3.0.0",
1460 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
1461 "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
1462 "dev": true,
1463 "requires": {
1464 "chalk": "^2.4.2"
1465 }
1466 },
1108 "lru-cache": { 1467 "lru-cache": {
1109 "version": "4.1.5", 1468 "version": "4.1.5",
1110 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1469 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
@@ -1212,6 +1571,93 @@
1212 "minimist": "^1.2.5" 1571 "minimist": "^1.2.5"
1213 } 1572 }
1214 }, 1573 },
1574 "mocha": {
1575 "version": "7.1.2",
1576 "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz",
1577 "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==",
1578 "dev": true,
1579 "requires": {
1580 "ansi-colors": "3.2.3",
1581 "browser-stdout": "1.3.1",
1582 "chokidar": "3.3.0",
1583 "debug": "3.2.6",
1584 "diff": "3.5.0",
1585 "escape-string-regexp": "1.0.5",
1586 "find-up": "3.0.0",
1587 "glob": "7.1.3",
1588 "growl": "1.10.5",
1589 "he": "1.2.0",
1590 "js-yaml": "3.13.1",
1591 "log-symbols": "3.0.0",
1592 "minimatch": "3.0.4",
1593 "mkdirp": "0.5.5",
1594 "ms": "2.1.1",
1595 "node-environment-flags": "1.0.6",
1596 "object.assign": "4.1.0",
1597 "strip-json-comments": "2.0.1",
1598 "supports-color": "6.0.0",
1599 "which": "1.3.1",
1600 "wide-align": "1.1.3",
1601 "yargs": "13.3.2",
1602 "yargs-parser": "13.1.2",
1603 "yargs-unparser": "1.6.0"
1604 },
1605 "dependencies": {
1606 "debug": {
1607 "version": "3.2.6",
1608 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1609 "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1610 "dev": true,
1611 "requires": {
1612 "ms": "^2.1.1"
1613 }
1614 },
1615 "glob": {
1616 "version": "7.1.3",
1617 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
1618 "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
1619 "dev": true,
1620 "requires": {
1621 "fs.realpath": "^1.0.0",
1622 "inflight": "^1.0.4",
1623 "inherits": "2",
1624 "minimatch": "^3.0.4",
1625 "once": "^1.3.0",
1626 "path-is-absolute": "^1.0.0"
1627 }
1628 },
1629 "mkdirp": {
1630 "version": "0.5.5",
1631 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1632 "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1633 "dev": true,
1634 "requires": {
1635 "minimist": "^1.2.5"
1636 }
1637 },
1638 "ms": {
1639 "version": "2.1.1",
1640 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1641 "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1642 "dev": true
1643 },
1644 "strip-json-comments": {
1645 "version": "2.0.1",
1646 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1647 "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1648 "dev": true
1649 },
1650 "supports-color": {
1651 "version": "6.0.0",
1652 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
1653 "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
1654 "dev": true,
1655 "requires": {
1656 "has-flag": "^3.0.0"
1657 }
1658 }
1659 }
1660 },
1215 "ms": { 1661 "ms": {
1216 "version": "2.1.2", 1662 "version": "2.1.2",
1217 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1663 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -1236,11 +1682,35 @@
1236 "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1682 "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
1237 "dev": true 1683 "dev": true
1238 }, 1684 },
1685 "node-environment-flags": {
1686 "version": "1.0.6",
1687 "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
1688 "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
1689 "dev": true,
1690 "requires": {
1691 "object.getownpropertydescriptors": "^2.0.3",
1692 "semver": "^5.7.0"
1693 },
1694 "dependencies": {
1695 "semver": {
1696 "version": "5.7.1",
1697 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1698 "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1699 "dev": true
1700 }
1701 }
1702 },
1239 "node-fetch": { 1703 "node-fetch": {
1240 "version": "2.6.0", 1704 "version": "2.6.0",
1241 "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 1705 "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
1242 "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 1706 "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
1243 }, 1707 },
1708 "normalize-path": {
1709 "version": "3.0.0",
1710 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1711 "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1712 "dev": true
1713 },
1244 "nth-check": { 1714 "nth-check": {
1245 "version": "1.0.2", 1715 "version": "1.0.2",
1246 "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", 1716 "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
@@ -1250,6 +1720,40 @@
1250 "boolbase": "~1.0.0" 1720 "boolbase": "~1.0.0"
1251 } 1721 }
1252 }, 1722 },
1723 "object-inspect": {
1724 "version": "1.7.0",
1725 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
1726 "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
1727 "dev": true
1728 },
1729 "object-keys": {
1730 "version": "1.1.1",
1731 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1732 "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1733 "dev": true
1734 },
1735 "object.assign": {
1736 "version": "4.1.0",
1737 "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1738 "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1739 "dev": true,
1740 "requires": {
1741 "define-properties": "^1.1.2",
1742 "function-bind": "^1.1.1",
1743 "has-symbols": "^1.0.0",
1744 "object-keys": "^1.0.11"
1745 }
1746 },
1747 "object.getownpropertydescriptors": {
1748 "version": "2.1.0",
1749 "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
1750 "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
1751 "dev": true,
1752 "requires": {
1753 "define-properties": "^1.1.3",
1754 "es-abstract": "^1.17.0-next.1"
1755 }
1756 },
1253 "once": { 1757 "once": {
1254 "version": "1.4.0", 1758 "version": "1.4.0",
1255 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1759 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1310,6 +1814,30 @@
1310 "os-tmpdir": "^1.0.0" 1814 "os-tmpdir": "^1.0.0"
1311 } 1815 }
1312 }, 1816 },
1817 "p-limit": {
1818 "version": "2.3.0",
1819 "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
1820 "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
1821 "dev": true,
1822 "requires": {
1823 "p-try": "^2.0.0"
1824 }
1825 },
1826 "p-locate": {
1827 "version": "3.0.0",
1828 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
1829 "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
1830 "dev": true,
1831 "requires": {
1832 "p-limit": "^2.0.0"
1833 }
1834 },
1835 "p-try": {
1836 "version": "2.2.0",
1837 "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1838 "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1839 "dev": true
1840 },
1313 "parent-module": { 1841 "parent-module": {
1314 "version": "1.0.1", 1842 "version": "1.0.1",
1315 "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1843 "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -1345,6 +1873,12 @@
1345 "@types/node": "*" 1873 "@types/node": "*"
1346 } 1874 }
1347 }, 1875 },
1876 "path-exists": {
1877 "version": "3.0.0",
1878 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1879 "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1880 "dev": true
1881 },
1348 "path-is-absolute": { 1882 "path-is-absolute": {
1349 "version": "1.0.1", 1883 "version": "1.0.1",
1350 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1884 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -1419,12 +1953,33 @@
1419 "util-deprecate": "^1.0.1" 1953 "util-deprecate": "^1.0.1"
1420 } 1954 }
1421 }, 1955 },
1956 "readdirp": {
1957 "version": "3.2.0",
1958 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
1959 "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
1960 "dev": true,
1961 "requires": {
1962 "picomatch": "^2.0.4"
1963 }
1964 },
1422 "regexpp": { 1965 "regexpp": {
1423 "version": "3.1.0", 1966 "version": "3.1.0",
1424 "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 1967 "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
1425 "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 1968 "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
1426 "dev": true 1969 "dev": true
1427 }, 1970 },
1971 "require-directory": {
1972 "version": "2.1.1",
1973 "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1974 "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
1975 "dev": true
1976 },
1977 "require-main-filename": {
1978 "version": "2.0.0",
1979 "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
1980 "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
1981 "dev": true
1982 },
1428 "resolve": { 1983 "resolve": {
1429 "version": "1.16.1", 1984 "version": "1.16.1",
1430 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", 1985 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz",
@@ -1503,6 +2058,12 @@
1503 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2058 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1504 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 2059 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
1505 }, 2060 },
2061 "set-blocking": {
2062 "version": "2.0.0",
2063 "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
2064 "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
2065 "dev": true
2066 },
1506 "shebang-command": { 2067 "shebang-command": {
1507 "version": "1.2.0", 2068 "version": "1.2.0",
1508 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2069 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -1583,6 +2144,48 @@
1583 } 2144 }
1584 } 2145 }
1585 }, 2146 },
2147 "string.prototype.trimend": {
2148 "version": "1.0.1",
2149 "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
2150 "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
2151 "dev": true,
2152 "requires": {
2153 "define-properties": "^1.1.3",
2154 "es-abstract": "^1.17.5"
2155 }
2156 },
2157 "string.prototype.trimleft": {
2158 "version": "2.1.2",
2159 "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
2160 "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
2161 "dev": true,
2162 "requires": {
2163 "define-properties": "^1.1.3",
2164 "es-abstract": "^1.17.5",
2165 "string.prototype.trimstart": "^1.0.0"
2166 }
2167 },
2168 "string.prototype.trimright": {
2169 "version": "2.1.2",
2170 "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
2171 "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
2172 "dev": true,
2173 "requires": {
2174 "define-properties": "^1.1.3",
2175 "es-abstract": "^1.17.5",
2176 "string.prototype.trimend": "^1.0.0"
2177 }
2178 },
2179 "string.prototype.trimstart": {
2180 "version": "1.0.1",
2181 "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
2182 "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
2183 "dev": true,
2184 "requires": {
2185 "define-properties": "^1.1.3",
2186 "es-abstract": "^1.17.5"
2187 }
2188 },
1586 "string_decoder": { 2189 "string_decoder": {
1587 "version": "1.3.0", 2190 "version": "1.3.0",
1588 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2191 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -1865,6 +2468,17 @@
1865 "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.1.tgz", 2468 "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.1.tgz",
1866 "integrity": "sha512-tZFUSbyjUcrh+qQf13ALX4QDdOfDX0cVaBFgy7ktJ0VwS7AW/yRKgGPSxVqqP9OCMNPdqP57O5q47w2pEwfaUg==" 2469 "integrity": "sha512-tZFUSbyjUcrh+qQf13ALX4QDdOfDX0cVaBFgy7ktJ0VwS7AW/yRKgGPSxVqqP9OCMNPdqP57O5q47w2pEwfaUg=="
1867 }, 2470 },
2471 "vscode-test": {
2472 "version": "1.3.0",
2473 "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.3.0.tgz",
2474 "integrity": "sha512-LddukcBiSU2FVTDr3c1D8lwkiOvwlJdDL2hqVbn6gIz+rpTqUCkMZSKYm94Y1v0WXlHSDQBsXyY+tchWQgGVsw==",
2475 "dev": true,
2476 "requires": {
2477 "http-proxy-agent": "^2.1.0",
2478 "https-proxy-agent": "^2.2.4",
2479 "rimraf": "^2.6.3"
2480 }
2481 },
1868 "which": { 2482 "which": {
1869 "version": "1.3.1", 2483 "version": "1.3.1",
1870 "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2484 "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@@ -1874,12 +2488,96 @@
1874 "isexe": "^2.0.0" 2488 "isexe": "^2.0.0"
1875 } 2489 }
1876 }, 2490 },
2491 "which-module": {
2492 "version": "2.0.0",
2493 "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
2494 "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
2495 "dev": true
2496 },
2497 "wide-align": {
2498 "version": "1.1.3",
2499 "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
2500 "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
2501 "dev": true,
2502 "requires": {
2503 "string-width": "^1.0.2 || 2"
2504 },
2505 "dependencies": {
2506 "ansi-regex": {
2507 "version": "3.0.0",
2508 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
2509 "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
2510 "dev": true
2511 },
2512 "is-fullwidth-code-point": {
2513 "version": "2.0.0",
2514 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2515 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2516 "dev": true
2517 },
2518 "string-width": {
2519 "version": "2.1.1",
2520 "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
2521 "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
2522 "dev": true,
2523 "requires": {
2524 "is-fullwidth-code-point": "^2.0.0",
2525 "strip-ansi": "^4.0.0"
2526 }
2527 },
2528 "strip-ansi": {
2529 "version": "4.0.0",
2530 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
2531 "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
2532 "dev": true,
2533 "requires": {
2534 "ansi-regex": "^3.0.0"
2535 }
2536 }
2537 }
2538 },
1877 "word-wrap": { 2539 "word-wrap": {
1878 "version": "1.2.3", 2540 "version": "1.2.3",
1879 "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2541 "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
1880 "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2542 "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
1881 "dev": true 2543 "dev": true
1882 }, 2544 },
2545 "wrap-ansi": {
2546 "version": "5.1.0",
2547 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
2548 "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
2549 "dev": true,
2550 "requires": {
2551 "ansi-styles": "^3.2.0",
2552 "string-width": "^3.0.0",
2553 "strip-ansi": "^5.0.0"
2554 },
2555 "dependencies": {
2556 "emoji-regex": {
2557 "version": "7.0.3",
2558 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
2559 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
2560 "dev": true
2561 },
2562 "is-fullwidth-code-point": {
2563 "version": "2.0.0",
2564 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2565 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2566 "dev": true
2567 },
2568 "string-width": {
2569 "version": "3.1.0",
2570 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2571 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2572 "dev": true,
2573 "requires": {
2574 "emoji-regex": "^7.0.1",
2575 "is-fullwidth-code-point": "^2.0.0",
2576 "strip-ansi": "^5.1.0"
2577 }
2578 }
2579 }
2580 },
1883 "wrappy": { 2581 "wrappy": {
1884 "version": "1.0.2", 2582 "version": "1.0.2",
1885 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2583 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -1895,12 +2593,82 @@
1895 "mkdirp": "^0.5.1" 2593 "mkdirp": "^0.5.1"
1896 } 2594 }
1897 }, 2595 },
2596 "y18n": {
2597 "version": "4.0.0",
2598 "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
2599 "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
2600 "dev": true
2601 },
1898 "yallist": { 2602 "yallist": {
1899 "version": "2.1.2", 2603 "version": "2.1.2",
1900 "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2604 "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
1901 "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 2605 "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
1902 "dev": true 2606 "dev": true
1903 }, 2607 },
2608 "yargs": {
2609 "version": "13.3.2",
2610 "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
2611 "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
2612 "dev": true,
2613 "requires": {
2614 "cliui": "^5.0.0",
2615 "find-up": "^3.0.0",
2616 "get-caller-file": "^2.0.1",
2617 "require-directory": "^2.1.1",
2618 "require-main-filename": "^2.0.0",
2619 "set-blocking": "^2.0.0",
2620 "string-width": "^3.0.0",
2621 "which-module": "^2.0.0",
2622 "y18n": "^4.0.0",
2623 "yargs-parser": "^13.1.2"
2624 },
2625 "dependencies": {
2626 "emoji-regex": {
2627 "version": "7.0.3",
2628 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
2629 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
2630 "dev": true
2631 },
2632 "is-fullwidth-code-point": {
2633 "version": "2.0.0",
2634 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2635 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2636 "dev": true
2637 },
2638 "string-width": {
2639 "version": "3.1.0",
2640 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2641 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2642 "dev": true,
2643 "requires": {
2644 "emoji-regex": "^7.0.1",
2645 "is-fullwidth-code-point": "^2.0.0",
2646 "strip-ansi": "^5.1.0"
2647 }
2648 }
2649 }
2650 },
2651 "yargs-parser": {
2652 "version": "13.1.2",
2653 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
2654 "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
2655 "dev": true,
2656 "requires": {
2657 "camelcase": "^5.0.0",
2658 "decamelize": "^1.2.0"
2659 }
2660 },
2661 "yargs-unparser": {
2662 "version": "1.6.0",
2663 "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
2664 "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
2665 "dev": true,
2666 "requires": {
2667 "flat": "^4.1.0",
2668 "lodash": "^4.17.15",
2669 "yargs": "^13.3.0"
2670 }
2671 },
1904 "yauzl": { 2672 "yauzl": {
1905 "version": "2.10.0", 2673 "version": "2.10.0",
1906 "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 2674 "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
diff --git a/editors/code/package.json b/editors/code/package.json
index d899f60e3..3aa90cd66 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -29,8 +29,10 @@
29 "package": "vsce package -o rust-analyzer.vsix", 29 "package": "vsce package -o rust-analyzer.vsix",
30 "build": "tsc", 30 "build": "tsc",
31 "watch": "tsc --watch", 31 "watch": "tsc --watch",
32 "lint": "tsfmt --verify && eslint -c .eslintrc.js --ext ts ./src", 32 "lint": "tsfmt --verify && eslint -c .eslintrc.js --ext ts ./src ./tests",
33 "fix": " tsfmt -r && eslint -c .eslintrc.js --ext ts ./src --fix" 33 "fix": " tsfmt -r && eslint -c .eslintrc.js --ext ts ./src ./tests --fix",
34 "pretest": "npm run build",
35 "test": "node ./out/tests/runTests.js"
34 }, 36 },
35 "dependencies": { 37 "dependencies": {
36 "node-fetch": "^2.6.0", 38 "node-fetch": "^2.6.0",
@@ -39,17 +41,22 @@
39 "devDependencies": { 41 "devDependencies": {
40 "@rollup/plugin-commonjs": "^11.1.0", 42 "@rollup/plugin-commonjs": "^11.1.0",
41 "@rollup/plugin-node-resolve": "^7.1.3", 43 "@rollup/plugin-node-resolve": "^7.1.3",
44 "@types/glob": "^7.1.1",
45 "@types/mocha": "^7.0.2",
42 "@types/node": "^12.12.39", 46 "@types/node": "^12.12.39",
43 "@types/node-fetch": "^2.5.7", 47 "@types/node-fetch": "^2.5.7",
44 "@types/vscode": "^1.44.0", 48 "@types/vscode": "^1.44.0",
45 "@typescript-eslint/eslint-plugin": "^2.33.0", 49 "@typescript-eslint/eslint-plugin": "^2.33.0",
46 "@typescript-eslint/parser": "^2.33.0", 50 "@typescript-eslint/parser": "^2.33.0",
47 "eslint": "^6.8.0", 51 "eslint": "^6.8.0",
52 "glob": "^7.1.6",
53 "mocha": "^7.1.2",
48 "rollup": "^2.10.0", 54 "rollup": "^2.10.0",
49 "tslib": "^1.12.0", 55 "tslib": "^1.12.0",
50 "typescript": "^3.9.2", 56 "typescript": "^3.9.2",
51 "typescript-formatter": "^7.2.2", 57 "typescript-formatter": "^7.2.2",
52 "vsce": "^1.75.0" 58 "vsce": "^1.75.0",
59 "vscode-test": "^1.3.0"
53 }, 60 },
54 "activationEvents": [ 61 "activationEvents": [
55 "onLanguage:rust", 62 "onLanguage:rust",
@@ -57,7 +64,7 @@
57 "onCommand:rust-analyzer.collectGarbage", 64 "onCommand:rust-analyzer.collectGarbage",
58 "workspaceContains:**/Cargo.toml" 65 "workspaceContains:**/Cargo.toml"
59 ], 66 ],
60 "main": "./out/main", 67 "main": "./out/src/main",
61 "contributes": { 68 "contributes": {
62 "taskDefinitions": [ 69 "taskDefinitions": [
63 { 70 {
@@ -313,22 +320,22 @@
313 "rust-analyzer.inlayHints.enable": { 320 "rust-analyzer.inlayHints.enable": {
314 "type": "boolean", 321 "type": "boolean",
315 "default": true, 322 "default": true,
316 "description": "Disable all inlay hints" 323 "description": "Whether to show inlay hints"
317 }, 324 },
318 "rust-analyzer.inlayHints.typeHints": { 325 "rust-analyzer.inlayHints.typeHints": {
319 "type": "boolean", 326 "type": "boolean",
320 "default": true, 327 "default": true,
321 "description": "Whether to show inlay type hints" 328 "description": "Whether to show inlay type hints for variables."
322 }, 329 },
323 "rust-analyzer.inlayHints.chainingHints": { 330 "rust-analyzer.inlayHints.chainingHints": {
324 "type": "boolean", 331 "type": "boolean",
325 "default": true, 332 "default": true,
326 "description": "Whether to show inlay type hints for method chains" 333 "description": "Whether to show inlay type hints for method chains."
327 }, 334 },
328 "rust-analyzer.inlayHints.parameterHints": { 335 "rust-analyzer.inlayHints.parameterHints": {
329 "type": "boolean", 336 "type": "boolean",
330 "default": true, 337 "default": true,
331 "description": "Whether to show function parameter name inlay hints at the call site" 338 "description": "Whether to show function parameter name inlay hints at the call site."
332 }, 339 },
333 "rust-analyzer.inlayHints.maxLength": { 340 "rust-analyzer.inlayHints.maxLength": {
334 "type": [ 341 "type": [
@@ -604,6 +611,10 @@
604 ], 611 ],
605 "semanticTokenModifiers": [ 612 "semanticTokenModifiers": [
606 { 613 {
614 "id": "attribute",
615 "description": "Style for elements within attributes"
616 },
617 {
607 "id": "constant", 618 "id": "constant",
608 "description": "Style for compile-time constants" 619 "description": "Style for compile-time constants"
609 }, 620 },
@@ -630,6 +641,9 @@
630 "attribute": [ 641 "attribute": [
631 "meta.attribute.rust" 642 "meta.attribute.rust"
632 ], 643 ],
644 "function.attribute": [
645 "entity.name.function.attribute.rust"
646 ],
633 "builtinType": [ 647 "builtinType": [
634 "support.type.primitive.rust" 648 "support.type.primitive.rust"
635 ], 649 ],
diff --git a/editors/code/rollup.config.js b/editors/code/rollup.config.js
index 2ca27694d..58360eabb 100644
--- a/editors/code/rollup.config.js
+++ b/editors/code/rollup.config.js
@@ -6,7 +6,7 @@ import nodeBuiltins from 'builtin-modules';
6 6
7/** @type { import('rollup').RollupOptions } */ 7/** @type { import('rollup').RollupOptions } */
8export default { 8export default {
9 input: 'out/main.js', 9 input: 'out/src/main.js',
10 plugins: [ 10 plugins: [
11 resolve({ 11 resolve({
12 preferBuiltins: true 12 preferBuiltins: true
@@ -20,7 +20,7 @@ export default {
20 ], 20 ],
21 external: [...nodeBuiltins, 'vscode'], 21 external: [...nodeBuiltins, 'vscode'],
22 output: { 22 output: {
23 file: './out/main.js', 23 file: './out/src/main.js',
24 format: 'cjs', 24 format: 'cjs',
25 exports: 'named' 25 exports: 'named'
26 } 26 }
diff --git a/editors/code/rust.tmGrammar.json b/editors/code/rust.tmGrammar.json
index aa0811326..cdcd557dc 100644
--- a/editors/code/rust.tmGrammar.json
+++ b/editors/code/rust.tmGrammar.json
@@ -75,8 +75,13 @@
75 { 75 {
76 "comment": "Attribute", 76 "comment": "Attribute",
77 "name": "meta.attribute.rust", 77 "name": "meta.attribute.rust",
78 "begin": "#\\!?\\[", 78 "begin": "#\\!?\\[(\\w*)",
79 "end": "\\]", 79 "end": "\\]",
80 "captures": {
81 "1": {
82 "name": "entity.name.function.attribute.rust"
83 }
84 },
80 "patterns": [ 85 "patterns": [
81 { 86 {
82 "include": "#string_literal" 87 "include": "#string_literal"
diff --git a/editors/code/src/cargo.ts b/editors/code/src/cargo.ts
index 6a41873d0..a55b2f860 100644
--- a/editors/code/src/cargo.ts
+++ b/editors/code/src/cargo.ts
@@ -12,14 +12,44 @@ interface CompilationArtifact {
12 isTest: boolean; 12 isTest: boolean;
13} 13}
14 14
15export interface ArtifactSpec {
16 cargoArgs: string[];
17 filter?: (artifacts: CompilationArtifact[]) => CompilationArtifact[];
18}
19
20export function artifactSpec(args: readonly string[]): ArtifactSpec {
21 const cargoArgs = [...args, "--message-format=json"];
22
23 // arguments for a runnable from the quick pick should be updated.
24 // see crates\rust-analyzer\src\main_loop\handlers.rs, handle_code_lens
25 switch (cargoArgs[0]) {
26 case "run": cargoArgs[0] = "build"; break;
27 case "test": {
28 if (!cargoArgs.includes("--no-run")) {
29 cargoArgs.push("--no-run");
30 }
31 break;
32 }
33 }
34
35 const result: ArtifactSpec = { cargoArgs: cargoArgs };
36 if (cargoArgs[0] === "test") {
37 // for instance, `crates\rust-analyzer\tests\heavy_tests\main.rs` tests
38 // produce 2 artifacts: {"kind": "bin"} and {"kind": "test"}
39 result.filter = (artifacts) => artifacts.filter(it => it.isTest);
40 }
41
42 return result;
43}
44
15export class Cargo { 45export class Cargo {
16 constructor(readonly rootFolder: string, readonly output: OutputChannel) { } 46 constructor(readonly rootFolder: string, readonly output: OutputChannel) { }
17 47
18 private async artifactsFromArgs(cargoArgs: string[]): Promise<CompilationArtifact[]> { 48 private async getArtifacts(spec: ArtifactSpec): Promise<CompilationArtifact[]> {
19 const artifacts: CompilationArtifact[] = []; 49 const artifacts: CompilationArtifact[] = [];
20 50
21 try { 51 try {
22 await this.runCargo(cargoArgs, 52 await this.runCargo(spec.cargoArgs,
23 message => { 53 message => {
24 if (message.reason === 'compiler-artifact' && message.executable) { 54 if (message.reason === 'compiler-artifact' && message.executable) {
25 const isBinary = message.target.crate_types.includes('bin'); 55 const isBinary = message.target.crate_types.includes('bin');
@@ -43,30 +73,11 @@ export class Cargo {
43 throw new Error(`Cargo invocation has failed: ${err}`); 73 throw new Error(`Cargo invocation has failed: ${err}`);
44 } 74 }
45 75
46 return artifacts; 76 return spec.filter?.(artifacts) ?? artifacts;
47 } 77 }
48 78
49 async executableFromArgs(args: readonly string[]): Promise<string> { 79 async executableFromArgs(args: readonly string[]): Promise<string> {
50 const cargoArgs = [...args, "--message-format=json"]; 80 const artifacts = await this.getArtifacts(artifactSpec(args));
51
52 // arguments for a runnable from the quick pick should be updated.
53 // see crates\rust-analyzer\src\main_loop\handlers.rs, handle_code_lens
54 switch (cargoArgs[0]) {
55 case "run": cargoArgs[0] = "build"; break;
56 case "test": {
57 if (cargoArgs.indexOf("--no-run") === -1) {
58 cargoArgs.push("--no-run");
59 }
60 break;
61 }
62 }
63
64 let artifacts = await this.artifactsFromArgs(cargoArgs);
65 if (cargoArgs[0] === "test") {
66 // for instance, `crates\rust-analyzer\tests\heavy_tests\main.rs` tests
67 // produce 2 artifacts: {"kind": "bin"} and {"kind": "test"}
68 artifacts = artifacts.filter(a => a.isTest);
69 }
70 81
71 if (artifacts.length === 0) { 82 if (artifacts.length === 0) {
72 throw new Error('No compilation artifacts'); 83 throw new Error('No compilation artifacts');
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts
index fac1a0be3..d64f9a3f9 100644
--- a/editors/code/src/client.ts
+++ b/editors/code/src/client.ts
@@ -41,10 +41,12 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
41 return client.sendRequest(lc.CodeActionRequest.type, params, token).then((values) => { 41 return client.sendRequest(lc.CodeActionRequest.type, params, token).then((values) => {
42 if (values === null) return undefined; 42 if (values === null) return undefined;
43 const result: (vscode.CodeAction | vscode.Command)[] = []; 43 const result: (vscode.CodeAction | vscode.Command)[] = [];
44 const groups = new Map<string, { index: number; items: vscode.CodeAction[] }>();
44 for (const item of values) { 45 for (const item of values) {
45 if (lc.CodeAction.is(item)) { 46 if (lc.CodeAction.is(item)) {
46 const action = client.protocol2CodeConverter.asCodeAction(item); 47 const action = client.protocol2CodeConverter.asCodeAction(item);
47 if (isSnippetEdit(item)) { 48 const group = actionGroup(item);
49 if (isSnippetEdit(item) || group) {
48 action.command = { 50 action.command = {
49 command: "rust-analyzer.applySnippetWorkspaceEdit", 51 command: "rust-analyzer.applySnippetWorkspaceEdit",
50 title: "", 52 title: "",
@@ -52,12 +54,38 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
52 }; 54 };
53 action.edit = undefined; 55 action.edit = undefined;
54 } 56 }
55 result.push(action); 57
58 if (group) {
59 let entry = groups.get(group);
60 if (!entry) {
61 entry = { index: result.length, items: [] };
62 groups.set(group, entry);
63 result.push(action);
64 }
65 entry.items.push(action);
66 } else {
67 result.push(action);
68 }
56 } else { 69 } else {
57 const command = client.protocol2CodeConverter.asCommand(item); 70 const command = client.protocol2CodeConverter.asCommand(item);
58 result.push(command); 71 result.push(command);
59 } 72 }
60 } 73 }
74 for (const [group, { index, items }] of groups) {
75 if (items.length === 1) {
76 result[index] = items[0];
77 } else {
78 const action = new vscode.CodeAction(group);
79 action.command = {
80 command: "rust-analyzer.applyActionGroup",
81 title: "",
82 arguments: [items.map((item) => {
83 return { label: item.title, edit: item.command!!.arguments!![0] };
84 })],
85 };
86 result[index] = action;
87 }
88 }
61 return result; 89 return result;
62 }, 90 },
63 (_error) => undefined 91 (_error) => undefined
@@ -81,15 +109,16 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
81 // implementations are still in the "proposed" category for 3.16. 109 // implementations are still in the "proposed" category for 3.16.
82 client.registerFeature(new CallHierarchyFeature(client)); 110 client.registerFeature(new CallHierarchyFeature(client));
83 client.registerFeature(new SemanticTokensFeature(client)); 111 client.registerFeature(new SemanticTokensFeature(client));
84 client.registerFeature(new SnippetTextEditFeature()); 112 client.registerFeature(new ExperimentalFeatures());
85 113
86 return client; 114 return client;
87} 115}
88 116
89class SnippetTextEditFeature implements lc.StaticFeature { 117class ExperimentalFeatures implements lc.StaticFeature {
90 fillClientCapabilities(capabilities: lc.ClientCapabilities): void { 118 fillClientCapabilities(capabilities: lc.ClientCapabilities): void {
91 const caps: any = capabilities.experimental ?? {}; 119 const caps: any = capabilities.experimental ?? {};
92 caps.snippetTextEdit = true; 120 caps.snippetTextEdit = true;
121 caps.codeActionGroup = true;
93 capabilities.experimental = caps; 122 capabilities.experimental = caps;
94 } 123 }
95 initialize(_capabilities: lc.ServerCapabilities<any>, _documentSelector: lc.DocumentSelector | undefined): void { 124 initialize(_capabilities: lc.ServerCapabilities<any>, _documentSelector: lc.DocumentSelector | undefined): void {
@@ -107,3 +136,7 @@ function isSnippetEdit(action: lc.CodeAction): boolean {
107 } 136 }
108 return false; 137 return false;
109} 138}
139
140function actionGroup(action: lc.CodeAction): string | undefined {
141 return (action as any).group;
142}
diff --git a/editors/code/src/commands/index.ts b/editors/code/src/commands/index.ts
index 0937b495c..abb53a248 100644
--- a/editors/code/src/commands/index.ts
+++ b/editors/code/src/commands/index.ts
@@ -41,48 +41,65 @@ export function applySourceChange(ctx: Ctx): Cmd {
41 }; 41 };
42} 42}
43 43
44export function selectAndApplySourceChange(ctx: Ctx): Cmd { 44export function applyActionGroup(_ctx: Ctx): Cmd {
45 return async (changes: ra.SourceChange[]) => { 45 return async (actions: { label: string; edit: vscode.WorkspaceEdit }[]) => {
46 if (changes.length === 1) { 46 const selectedAction = await vscode.window.showQuickPick(actions);
47 await sourceChange.applySourceChange(ctx, changes[0]); 47 if (!selectedAction) return;
48 } else if (changes.length > 0) { 48 await applySnippetWorkspaceEdit(selectedAction.edit);
49 const selectedChange = await vscode.window.showQuickPick(changes);
50 if (!selectedChange) return;
51 await sourceChange.applySourceChange(ctx, selectedChange);
52 }
53 }; 49 };
54} 50}
55 51
56export function applySnippetWorkspaceEdit(_ctx: Ctx): Cmd { 52export function applySnippetWorkspaceEditCommand(_ctx: Ctx): Cmd {
57 return async (edit: vscode.WorkspaceEdit) => { 53 return async (edit: vscode.WorkspaceEdit) => {
58 assert(edit.entries().length === 1, `bad ws edit: ${JSON.stringify(edit)}`); 54 await applySnippetWorkspaceEdit(edit);
59 const [uri, edits] = edit.entries()[0]; 55 };
56}
60 57
61 const editor = vscode.window.visibleTextEditors.find((it) => it.document.uri.toString() === uri.toString()); 58export async function applySnippetWorkspaceEdit(edit: vscode.WorkspaceEdit) {
62 if (!editor) return; 59 assert(edit.entries().length === 1, `bad ws edit: ${JSON.stringify(edit)}`);
60 const [uri, edits] = edit.entries()[0];
63 61
64 let editWithSnippet: vscode.TextEdit | undefined = undefined; 62 const editor = vscode.window.visibleTextEditors.find((it) => it.document.uri.toString() === uri.toString());
65 let lineDelta = 0; 63 if (!editor) return;
66 await editor.edit((builder) => { 64
67 for (const indel of edits) { 65 let selection: vscode.Selection | undefined = undefined;
68 const isSnippet = indel.newText.indexOf('$0') !== -1 || indel.newText.indexOf('${') !== -1; 66 let lineDelta = 0;
69 if (isSnippet) { 67 await editor.edit((builder) => {
70 editWithSnippet = indel; 68 for (const indel of edits) {
71 } else { 69 const parsed = parseSnippet(indel.newText);
72 if (!editWithSnippet) { 70 if (parsed) {
73 lineDelta = (indel.newText.match(/\n/g) || []).length - (indel.range.end.line - indel.range.start.line); 71 const [newText, [placeholderStart, placeholderLength]] = parsed;
74 } 72 const prefix = newText.substr(0, placeholderStart);
75 builder.replace(indel.range, indel.newText); 73 const lastNewline = prefix.lastIndexOf('\n');
76 } 74
75 const startLine = indel.range.start.line + lineDelta + countLines(prefix);
76 const startColumn = lastNewline === -1 ?
77 indel.range.start.character + placeholderStart
78 : prefix.length - lastNewline - 1;
79 const endColumn = startColumn + placeholderLength;
80 selection = new vscode.Selection(
81 new vscode.Position(startLine, startColumn),
82 new vscode.Position(startLine, endColumn),
83 );
84 builder.replace(indel.range, newText);
85 } else {
86 lineDelta = countLines(indel.newText) - (indel.range.end.line - indel.range.start.line);
87 builder.replace(indel.range, indel.newText);
77 } 88 }
78 });
79 if (editWithSnippet) {
80 const snip = editWithSnippet as vscode.TextEdit;
81 const range = snip.range.with(
82 snip.range.start.with(snip.range.start.line + lineDelta),
83 snip.range.end.with(snip.range.end.line + lineDelta),
84 );
85 await editor.insertSnippet(new vscode.SnippetString(snip.newText), range);
86 } 89 }
87 }; 90 });
91 if (selection) editor.selection = selection;
92}
93
94function parseSnippet(snip: string): [string, [number, number]] | undefined {
95 const m = snip.match(/\$(0|\{0:([^}]*)\})/);
96 if (!m) return undefined;
97 const placeholder = m[2] ?? "";
98 const range: [number, number] = [m.index!!, placeholder.length];
99 const insert = snip.replace(m[0], placeholder);
100 return [insert, range];
101}
102
103function countLines(text: string): number {
104 return (text.match(/\n/g) || []).length;
88} 105}
diff --git a/editors/code/src/commands/join_lines.ts b/editors/code/src/commands/join_lines.ts
index de0614653..0bf1ee6e6 100644
--- a/editors/code/src/commands/join_lines.ts
+++ b/editors/code/src/commands/join_lines.ts
@@ -1,7 +1,7 @@
1import * as ra from '../rust-analyzer-api'; 1import * as ra from '../rust-analyzer-api';
2import * as lc from 'vscode-languageclient';
2 3
3import { Ctx, Cmd } from '../ctx'; 4import { Ctx, Cmd } from '../ctx';
4import { applySourceChange } from '../source_change';
5 5
6export function joinLines(ctx: Ctx): Cmd { 6export function joinLines(ctx: Ctx): Cmd {
7 return async () => { 7 return async () => {
@@ -9,10 +9,14 @@ export function joinLines(ctx: Ctx): Cmd {
9 const client = ctx.client; 9 const client = ctx.client;
10 if (!editor || !client) return; 10 if (!editor || !client) return;
11 11
12 const change = await client.sendRequest(ra.joinLines, { 12 const items: lc.TextEdit[] = await client.sendRequest(ra.joinLines, {
13 range: client.code2ProtocolConverter.asRange(editor.selection), 13 ranges: editor.selections.map((it) => client.code2ProtocolConverter.asRange(it)),
14 textDocument: { uri: editor.document.uri.toString() }, 14 textDocument: { uri: editor.document.uri.toString() },
15 }); 15 });
16 await applySourceChange(ctx, change); 16 editor.edit((builder) => {
17 client.protocol2CodeConverter.asTextEdits(items).forEach((edit) => {
18 builder.replace(edit.range, edit.newText);
19 });
20 });
17 }; 21 };
18} 22}
diff --git a/editors/code/src/commands/on_enter.ts b/editors/code/src/commands/on_enter.ts
index 285849db7..a7871c31e 100644
--- a/editors/code/src/commands/on_enter.ts
+++ b/editors/code/src/commands/on_enter.ts
@@ -1,8 +1,8 @@
1import * as vscode from 'vscode'; 1import * as vscode from 'vscode';
2import * as ra from '../rust-analyzer-api'; 2import * as ra from '../rust-analyzer-api';
3 3
4import { applySourceChange } from '../source_change';
5import { Cmd, Ctx } from '../ctx'; 4import { Cmd, Ctx } from '../ctx';
5import { applySnippetWorkspaceEdit } from '.';
6 6
7async function handleKeypress(ctx: Ctx) { 7async function handleKeypress(ctx: Ctx) {
8 const editor = ctx.activeRustEditor; 8 const editor = ctx.activeRustEditor;
@@ -21,7 +21,8 @@ async function handleKeypress(ctx: Ctx) {
21 }); 21 });
22 if (!change) return false; 22 if (!change) return false;
23 23
24 await applySourceChange(ctx, change); 24 const workspaceEdit = client.protocol2CodeConverter.asWorkspaceEdit(change);
25 await applySnippetWorkspaceEdit(workspaceEdit);
25 return true; 26 return true;
26} 27}
27 28
diff --git a/editors/code/src/commands/ssr.ts b/editors/code/src/commands/ssr.ts
index 4ef8cdf04..5d40a64d2 100644
--- a/editors/code/src/commands/ssr.ts
+++ b/editors/code/src/commands/ssr.ts
@@ -2,7 +2,6 @@ import * as vscode from 'vscode';
2import * as ra from "../rust-analyzer-api"; 2import * as ra from "../rust-analyzer-api";
3 3
4import { Ctx, Cmd } from '../ctx'; 4import { Ctx, Cmd } from '../ctx';
5import { applySourceChange } from '../source_change';
6 5
7export function ssr(ctx: Ctx): Cmd { 6export function ssr(ctx: Ctx): Cmd {
8 return async () => { 7 return async () => {
@@ -22,11 +21,10 @@ export function ssr(ctx: Ctx): Cmd {
22 } 21 }
23 }; 22 };
24 const request = await vscode.window.showInputBox(options); 23 const request = await vscode.window.showInputBox(options);
25
26 if (!request) return; 24 if (!request) return;
27 25
28 const change = await client.sendRequest(ra.ssr, { query: request, parseOnly: false }); 26 const edit = await client.sendRequest(ra.ssr, { query: request, parseOnly: false });
29 27
30 await applySourceChange(ctx, change); 28 await vscode.workspace.applyEdit(client.protocol2CodeConverter.asWorkspaceEdit(edit));
31 }; 29 };
32} 30}
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index ac3bb365e..3405634f3 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -1,7 +1,7 @@
1import * as vscode from 'vscode'; 1import * as vscode from 'vscode';
2import * as path from "path"; 2import * as path from "path";
3import * as os from "os"; 3import * as os from "os";
4import { promises as fs } from "fs"; 4import { promises as fs, PathLike } from "fs";
5 5
6import * as commands from './commands'; 6import * as commands from './commands';
7import { activateInlayHints } from './inlay_hints'; 7import { activateInlayHints } from './inlay_hints';
@@ -12,6 +12,7 @@ import { log, assert, isValidExecutable } from './util';
12import { PersistentState } from './persistent_state'; 12import { PersistentState } from './persistent_state';
13import { fetchRelease, download } from './net'; 13import { fetchRelease, download } from './net';
14import { activateTaskProvider } from './tasks'; 14import { activateTaskProvider } from './tasks';
15import { exec } from 'child_process';
15 16
16let ctx: Ctx | undefined; 17let ctx: Ctx | undefined;
17 18
@@ -91,8 +92,8 @@ export async function activate(context: vscode.ExtensionContext) {
91 ctx.registerCommand('debugSingle', commands.debugSingle); 92 ctx.registerCommand('debugSingle', commands.debugSingle);
92 ctx.registerCommand('showReferences', commands.showReferences); 93 ctx.registerCommand('showReferences', commands.showReferences);
93 ctx.registerCommand('applySourceChange', commands.applySourceChange); 94 ctx.registerCommand('applySourceChange', commands.applySourceChange);
94 ctx.registerCommand('applySnippetWorkspaceEdit', commands.applySnippetWorkspaceEdit); 95 ctx.registerCommand('applySnippetWorkspaceEdit', commands.applySnippetWorkspaceEditCommand);
95 ctx.registerCommand('selectAndApplySourceChange', commands.selectAndApplySourceChange); 96 ctx.registerCommand('applyActionGroup', commands.applyActionGroup);
96 97
97 ctx.pushCleanup(activateTaskProvider(workspaceFolder)); 98 ctx.pushCleanup(activateTaskProvider(workspaceFolder));
98 99
@@ -188,6 +189,46 @@ async function bootstrapServer(config: Config, state: PersistentState): Promise<
188 return path; 189 return path;
189} 190}
190 191
192async function patchelf(dest: PathLike): Promise<void> {
193 await vscode.window.withProgress(
194 {
195 location: vscode.ProgressLocation.Notification,
196 title: "Patching rust-analyzer for NixOS"
197 },
198 async (progress, _) => {
199 const expression = `
200 {src, pkgs ? import <nixpkgs> {}}:
201 pkgs.stdenv.mkDerivation {
202 name = "rust-analyzer";
203 inherit src;
204 phases = [ "installPhase" "fixupPhase" ];
205 installPhase = "cp $src $out";
206 fixupPhase = ''
207 chmod 755 $out
208 patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $out
209 '';
210 }
211 `;
212 const origFile = dest + "-orig";
213 await fs.rename(dest, origFile);
214 progress.report({ message: "Patching executable", increment: 20 });
215 await new Promise((resolve, reject) => {
216 const handle = exec(`nix-build -E - --arg src '${origFile}' -o ${dest}`,
217 (err, stdout, stderr) => {
218 if (err != null) {
219 reject(Error(stderr));
220 } else {
221 resolve(stdout);
222 }
223 });
224 handle.stdin?.write(expression);
225 handle.stdin?.end();
226 });
227 await fs.unlink(origFile);
228 }
229 );
230}
231
191async function getServer(config: Config, state: PersistentState): Promise<string | undefined> { 232async function getServer(config: Config, state: PersistentState): Promise<string | undefined> {
192 const explicitPath = process.env.__RA_LSP_SERVER_DEBUG ?? config.serverPath; 233 const explicitPath = process.env.__RA_LSP_SERVER_DEBUG ?? config.serverPath;
193 if (explicitPath) { 234 if (explicitPath) {
@@ -237,6 +278,12 @@ async function getServer(config: Config, state: PersistentState): Promise<string
237 assert(!!artifact, `Bad release: ${JSON.stringify(release)}`); 278 assert(!!artifact, `Bad release: ${JSON.stringify(release)}`);
238 279
239 await download(artifact.browser_download_url, dest, "Downloading rust-analyzer server", { mode: 0o755 }); 280 await download(artifact.browser_download_url, dest, "Downloading rust-analyzer server", { mode: 0o755 });
281
282 // Patching executable if that's NixOS.
283 if (await fs.stat("/etc/nixos").then(_ => true).catch(_ => false)) {
284 await patchelf(dest);
285 }
286
240 await state.updateServerVersion(config.package.version); 287 await state.updateServerVersion(config.package.version);
241 return dest; 288 return dest;
242} 289}
diff --git a/editors/code/src/rust-analyzer-api.ts b/editors/code/src/rust-analyzer-api.ts
index 400ac3714..73f36432f 100644
--- a/editors/code/src/rust-analyzer-api.ts
+++ b/editors/code/src/rust-analyzer-api.ts
@@ -64,12 +64,12 @@ export const parentModule = request<lc.TextDocumentPositionParams, Vec<lc.Locati
64 64
65export interface JoinLinesParams { 65export interface JoinLinesParams {
66 textDocument: lc.TextDocumentIdentifier; 66 textDocument: lc.TextDocumentIdentifier;
67 range: lc.Range; 67 ranges: lc.Range[];
68} 68}
69export const joinLines = request<JoinLinesParams, SourceChange>("joinLines"); 69export const joinLines = new lc.RequestType<JoinLinesParams, lc.TextEdit[], unknown>('experimental/joinLines');
70 70
71 71
72export const onEnter = request<lc.TextDocumentPositionParams, Option<SourceChange>>("onEnter"); 72export const onEnter = request<lc.TextDocumentPositionParams, Option<lc.WorkspaceEdit>>("onEnter");
73 73
74export interface RunnablesParams { 74export interface RunnablesParams {
75 textDocument: lc.TextDocumentIdentifier; 75 textDocument: lc.TextDocumentIdentifier;
@@ -112,7 +112,7 @@ export interface SsrParams {
112 query: string; 112 query: string;
113 parseOnly: boolean; 113 parseOnly: boolean;
114} 114}
115export const ssr = request<SsrParams, SourceChange>("ssr"); 115export const ssr = new lc.RequestType<SsrParams, lc.WorkspaceEdit, unknown>('experimental/ssr');
116 116
117 117
118export const publishDecorations = notification<PublishDecorationsParams>("publishDecorations"); 118export const publishDecorations = notification<PublishDecorationsParams>("publishDecorations");
diff --git a/editors/code/tests/runTests.ts b/editors/code/tests/runTests.ts
new file mode 100644
index 000000000..22df80ad3
--- /dev/null
+++ b/editors/code/tests/runTests.ts
@@ -0,0 +1,43 @@
1import * as path from 'path';
2import * as fs from 'fs';
3
4import { runTests } from 'vscode-test';
5
6async function main() {
7 // The folder containing the Extension Manifest package.json
8 // Passed to `--extensionDevelopmentPath`
9 const extensionDevelopmentPath = path.resolve(__dirname, '../../');
10
11 // Minimum supported version.
12 const jsonData = fs.readFileSync(path.join(extensionDevelopmentPath, 'package.json'));
13 const json = JSON.parse(jsonData.toString());
14 let minimalVersion: string = json.engines.vscode;
15 if (minimalVersion.startsWith('^')) minimalVersion = minimalVersion.slice(1);
16
17 const launchArgs = ["--disable-extensions"];
18
19 // All test suites (either unit tests or integration tests) should be in subfolders.
20 const extensionTestsPath = path.resolve(__dirname, './unit/index');
21
22 // Run tests using the minimal supported version.
23 await runTests({
24 version: minimalVersion,
25 launchArgs,
26 extensionDevelopmentPath,
27 extensionTestsPath
28 });
29
30 // and the latest one
31 await runTests({
32 version: 'stable',
33 launchArgs,
34 extensionDevelopmentPath,
35 extensionTestsPath
36 });
37}
38
39main().catch(err => {
40 // eslint-disable-next-line no-console
41 console.error('Failed to run tests', err);
42 process.exit(1);
43});
diff --git a/editors/code/tests/unit/index.ts b/editors/code/tests/unit/index.ts
new file mode 100644
index 000000000..5165720b4
--- /dev/null
+++ b/editors/code/tests/unit/index.ts
@@ -0,0 +1,38 @@
1import * as path from 'path';
2import Mocha from 'mocha';
3import glob from 'glob';
4
5export function run(): Promise<void> {
6 // Create the mocha test
7 const mocha = new Mocha({
8 ui: 'tdd',
9 color: true
10 });
11
12 const testsRoot = __dirname;
13
14 return new Promise((resolve, reject) => {
15 glob('**/**.test.js', { cwd: testsRoot }, (err, files) => {
16 if (err) {
17 return reject(err);
18 }
19
20 // Add files to the test suite
21 files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));
22
23 try {
24 // Run the mocha test
25 mocha.timeout(100000);
26 mocha.run(failures => {
27 if (failures > 0) {
28 reject(new Error(`${failures} tests failed.`));
29 } else {
30 resolve();
31 }
32 });
33 } catch (err) {
34 reject(err);
35 }
36 });
37 });
38}
diff --git a/editors/code/tests/unit/launch_config.test.ts b/editors/code/tests/unit/launch_config.test.ts
new file mode 100644
index 000000000..d5cf1b74e
--- /dev/null
+++ b/editors/code/tests/unit/launch_config.test.ts
@@ -0,0 +1,52 @@
1import * as assert from 'assert';
2import * as cargo from '../../src/cargo';
3
4suite('Launch configuration', () => {
5
6 suite('Lens', () => {
7 test('A binary', async () => {
8 const args = cargo.artifactSpec(["build", "--package", "pkg_name", "--bin", "pkg_name"]);
9
10 assert.deepEqual(args.cargoArgs, ["build", "--package", "pkg_name", "--bin", "pkg_name", "--message-format=json"]);
11 assert.deepEqual(args.filter, undefined);
12 });
13
14 test('One of Multiple Binaries', async () => {
15 const args = cargo.artifactSpec(["build", "--package", "pkg_name", "--bin", "bin1"]);
16
17 assert.deepEqual(args.cargoArgs, ["build", "--package", "pkg_name", "--bin", "bin1", "--message-format=json"]);
18 assert.deepEqual(args.filter, undefined);
19 });
20
21 test('A test', async () => {
22 const args = cargo.artifactSpec(["test", "--package", "pkg_name", "--lib", "--no-run"]);
23
24 assert.deepEqual(args.cargoArgs, ["test", "--package", "pkg_name", "--lib", "--no-run", "--message-format=json"]);
25 assert.notDeepEqual(args.filter, undefined);
26 });
27 });
28
29 suite('QuickPick', () => {
30 test('A binary', async () => {
31 const args = cargo.artifactSpec(["run", "--package", "pkg_name", "--bin", "pkg_name"]);
32
33 assert.deepEqual(args.cargoArgs, ["build", "--package", "pkg_name", "--bin", "pkg_name", "--message-format=json"]);
34 assert.deepEqual(args.filter, undefined);
35 });
36
37
38 test('One of Multiple Binaries', async () => {
39 const args = cargo.artifactSpec(["run", "--package", "pkg_name", "--bin", "bin2"]);
40
41 assert.deepEqual(args.cargoArgs, ["build", "--package", "pkg_name", "--bin", "bin2", "--message-format=json"]);
42 assert.deepEqual(args.filter, undefined);
43 });
44
45 test('A test', async () => {
46 const args = cargo.artifactSpec(["test", "--package", "pkg_name", "--lib"]);
47
48 assert.deepEqual(args.cargoArgs, ["test", "--package", "pkg_name", "--lib", "--message-format=json", "--no-run"]);
49 assert.notDeepEqual(args.filter, undefined);
50 });
51 });
52});
diff --git a/editors/code/tsconfig.json b/editors/code/tsconfig.json
index ad134865a..32d1a865f 100644
--- a/editors/code/tsconfig.json
+++ b/editors/code/tsconfig.json
@@ -9,7 +9,7 @@
9 "esModuleInterop": true, 9 "esModuleInterop": true,
10 "allowSyntheticDefaultImports": true, 10 "allowSyntheticDefaultImports": true,
11 "sourceMap": true, 11 "sourceMap": true,
12 "rootDir": "src", 12 "rootDir": ".",
13 "strict": true, 13 "strict": true,
14 "noUnusedLocals": true, 14 "noUnusedLocals": true,
15 "noUnusedParameters": true, 15 "noUnusedParameters": true,
@@ -18,6 +18,11 @@
18 "newLine": "LF" 18 "newLine": "LF"
19 }, 19 },
20 "exclude": [ 20 "exclude": [
21 "node_modules" 21 "node_modules",
22 ".vscode-test"
23 ],
24 "include": [
25 "src",
26 "tests"
22 ] 27 ]
23} 28}