aboutsummaryrefslogtreecommitdiff
path: root/editors
diff options
context:
space:
mode:
Diffstat (limited to 'editors')
-rw-r--r--editors/code/.vscodeignore1
-rw-r--r--editors/code/package.json55
-rw-r--r--editors/code/rust.tmGrammar.json1140
-rw-r--r--editors/code/src/commands.ts2
-rw-r--r--editors/code/src/main.ts50
5 files changed, 62 insertions, 1186 deletions
diff --git a/editors/code/.vscodeignore b/editors/code/.vscodeignore
index 5096ce4da..c1cf00fa0 100644
--- a/editors/code/.vscodeignore
+++ b/editors/code/.vscodeignore
@@ -4,6 +4,5 @@
4!package.json 4!package.json
5!package-lock.json 5!package-lock.json
6!ra_syntax_tree.tmGrammar.json 6!ra_syntax_tree.tmGrammar.json
7!rust.tmGrammar.json
8!icon.png 7!icon.png
9!README.md 8!README.md
diff --git a/editors/code/package.json b/editors/code/package.json
index ad01fea7b..13749a084 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -250,12 +250,12 @@
250 } 250 }
251 ], 251 ],
252 "default": null, 252 "default": null,
253 "description": "Environment variables passed to the runnable launched using `Test ` or `Debug` lens or `rust-analyzer.run` command." 253 "markdownDescription": "Environment variables passed to the runnable launched using `Test` or `Debug` lens or `rust-analyzer.run` command."
254 }, 254 },
255 "rust-analyzer.inlayHints.enable": { 255 "rust-analyzer.inlayHints.enable": {
256 "type": "boolean", 256 "type": "boolean",
257 "default": true, 257 "default": true,
258 "description": "Whether to show inlay hints" 258 "description": "Whether to show inlay hints."
259 }, 259 },
260 "rust-analyzer.updates.channel": { 260 "rust-analyzer.updates.channel": {
261 "type": "string", 261 "type": "string",
@@ -265,15 +265,15 @@
265 ], 265 ],
266 "default": "stable", 266 "default": "stable",
267 "markdownEnumDescriptions": [ 267 "markdownEnumDescriptions": [
268 "`\"stable\"` updates are shipped weekly, they don't contain cutting-edge features from VSCode proposed APIs but have less bugs in general", 268 "`stable` updates are shipped weekly, they don't contain cutting-edge features from VSCode proposed APIs but have less bugs in general.",
269 "`\"nightly\"` updates are shipped daily (extension updates automatically by downloading artifacts directly from GitHub), they contain cutting-edge features and latest bug fixes. These releases help us get your feedback very quickly and speed up rust-analyzer development **drastically**" 269 "`nightly` updates are shipped daily (extension updates automatically by downloading artifacts directly from GitHub), they contain cutting-edge features and latest bug fixes. These releases help us get your feedback very quickly and speed up rust-analyzer development **drastically**."
270 ], 270 ],
271 "markdownDescription": "Choose `\"nightly\"` updates to get the latest features and bug fixes every day. While `\"stable\"` releases occur weekly and don't contain cutting-edge features from VSCode proposed APIs" 271 "markdownDescription": "Choose `nightly` updates to get the latest features and bug fixes every day. While `stable` releases occur weekly and don't contain cutting-edge features from VSCode proposed APIs."
272 }, 272 },
273 "rust-analyzer.updates.askBeforeDownload": { 273 "rust-analyzer.updates.askBeforeDownload": {
274 "type": "boolean", 274 "type": "boolean",
275 "default": true, 275 "default": true,
276 "description": "Whether to ask for permission before downloading any files from the Internet" 276 "description": "Whether to ask for permission before downloading any files from the Internet."
277 }, 277 },
278 "rust-analyzer.serverPath": { 278 "rust-analyzer.serverPath": {
279 "type": [ 279 "type": [
@@ -281,7 +281,7 @@
281 "string" 281 "string"
282 ], 282 ],
283 "default": null, 283 "default": null,
284 "description": "Path to rust-analyzer executable (points to bundled binary by default). If this is set, then \"rust-analyzer.updates.channel\" setting is not used" 284 "markdownDescription": "Path to rust-analyzer executable (points to bundled binary by default). If this is set, then `#rust-analyzer.updates.channel#` setting is not used"
285 }, 285 },
286 "rust-analyzer.trace.server": { 286 "rust-analyzer.trace.server": {
287 "type": "string", 287 "type": "string",
@@ -297,10 +297,10 @@
297 "Full log" 297 "Full log"
298 ], 298 ],
299 "default": "off", 299 "default": "off",
300 "description": "Trace requests to the rust-analyzer (this is usually overly verbose and not recommended for regular users)" 300 "description": "Trace requests to the rust-analyzer (this is usually overly verbose and not recommended for regular users)."
301 }, 301 },
302 "rust-analyzer.trace.extension": { 302 "rust-analyzer.trace.extension": {
303 "description": "Enable logging of VS Code extensions itself", 303 "description": "Enable logging of VS Code extensions itself.",
304 "type": "boolean", 304 "type": "boolean",
305 "default": false 305 "default": false
306 }, 306 },
@@ -327,14 +327,14 @@
327 } 327 }
328 }, 328 },
329 "rust-analyzer.debug.openDebugPane": { 329 "rust-analyzer.debug.openDebugPane": {
330 "description": "Whether to open up the Debug Pane on debugging start.", 330 "markdownDescription": "Whether to open up the `Debug Panel` on debugging start.",
331 "type": "boolean", 331 "type": "boolean",
332 "default": false 332 "default": false
333 }, 333 },
334 "rust-analyzer.debug.engineSettings": { 334 "rust-analyzer.debug.engineSettings": {
335 "type": "object", 335 "type": "object",
336 "default": {}, 336 "default": {},
337 "description": "Optional settings passed to the debug engine. Example:\n{ \"lldb\": { \"terminal\":\"external\"} }" 337 "markdownDescription": "Optional settings passed to the debug engine. Example: `{ \"lldb\": { \"terminal\":\"external\"} }`"
338 }, 338 },
339 "rust-analyzer.assist.importMergeBehaviour": { 339 "rust-analyzer.assist.importMergeBehaviour": {
340 "markdownDescription": "The strategy to use when inserting new imports or merging imports.", 340 "markdownDescription": "The strategy to use when inserting new imports or merging imports.",
@@ -362,7 +362,7 @@
362 ], 362 ],
363 "enumDescriptions": [ 363 "enumDescriptions": [
364 "Insert import paths relative to the current module, using up to one `super` prefix if the parent module contains the requested item.", 364 "Insert import paths relative to the current module, using up to one `super` prefix if the parent module contains the requested item.",
365 "Prefix all import paths with `self` if they don't begin with `self`, `super`, `crate` or a crate name", 365 "Prefix all import paths with `self` if they don't begin with `self`, `super`, `crate` or a crate name.",
366 "Force import paths to be absolute by always starting them with `crate` or the crate name they refer to." 366 "Force import paths to be absolute by always starting them with `crate` or the crate name they refer to."
367 ] 367 ]
368 }, 368 },
@@ -372,7 +372,7 @@
372 "type": "boolean" 372 "type": "boolean"
373 }, 373 },
374 "rust-analyzer.cargo.autoreload": { 374 "rust-analyzer.cargo.autoreload": {
375 "markdownDescription": "Automatically refresh project info via `cargo metadata` on Cargo.toml changes.", 375 "markdownDescription": "Automatically refresh project info via `cargo metadata` on `Cargo.toml` changes.",
376 "default": true, 376 "default": true,
377 "type": "boolean" 377 "type": "boolean"
378 }, 378 },
@@ -418,7 +418,7 @@
418 "type": "boolean" 418 "type": "boolean"
419 }, 419 },
420 "rust-analyzer.checkOnSave.allFeatures": { 420 "rust-analyzer.checkOnSave.allFeatures": {
421 "markdownDescription": "Check with all features (will be passed as `--all-features`). Defaults to `rust-analyzer.cargo.allFeatures`.", 421 "markdownDescription": "Check with all features (will be passed as `--all-features`). Defaults to `#rust-analyzer.cargo.allFeatures#`.",
422 "default": null, 422 "default": null,
423 "type": [ 423 "type": [
424 "null", 424 "null",
@@ -444,7 +444,7 @@
444 ] 444 ]
445 }, 445 },
446 "rust-analyzer.checkOnSave.target": { 446 "rust-analyzer.checkOnSave.target": {
447 "markdownDescription": "Check for a specific target. Defaults to `rust-analyzer.cargo.target`.", 447 "markdownDescription": "Check for a specific target. Defaults to `#rust-analyzer.cargo.target#`.",
448 "default": null, 448 "default": null,
449 "type": [ 449 "type": [
450 "null", 450 "null",
@@ -460,7 +460,7 @@
460 } 460 }
461 }, 461 },
462 "rust-analyzer.checkOnSave.features": { 462 "rust-analyzer.checkOnSave.features": {
463 "markdownDescription": "List of features to activate. Defaults to `rust-analyzer.cargo.features`.", 463 "markdownDescription": "List of features to activate. Defaults to `#rust-analyzer.cargo.features#`.",
464 "default": null, 464 "default": null,
465 "type": [ 465 "type": [
466 "null", 466 "null",
@@ -497,7 +497,7 @@
497 "type": "boolean" 497 "type": "boolean"
498 }, 498 },
499 "rust-analyzer.completion.autoimport.enable": { 499 "rust-analyzer.completion.autoimport.enable": {
500 "markdownDescription": "Toggles the additional completions that automatically add imports when completed. Note that your client have to specify the `additionalTextEdits` LSP client capability to truly have this feature enabled.", 500 "markdownDescription": "Toggles the additional completions that automatically add imports when completed. Note that your client must specify the `additionalTextEdits` LSP client capability to truly have this feature enabled.",
501 "default": true, 501 "default": true,
502 "type": "boolean" 502 "type": "boolean"
503 }, 503 },
@@ -521,7 +521,7 @@
521 "uniqueItems": true 521 "uniqueItems": true
522 }, 522 },
523 "rust-analyzer.diagnostics.warningsAsHint": { 523 "rust-analyzer.diagnostics.warningsAsHint": {
524 "markdownDescription": "List of warnings that should be displayed with info severity.\\nThe warnings will be indicated by a blue squiggly underline in code and a blue icon in the problems panel.", 524 "markdownDescription": "List of warnings that should be displayed with info severity.\\n\\nThe warnings will be indicated by a blue squiggly underline in code and a blue icon in the `Problems Panel`.",
525 "default": [], 525 "default": [],
526 "type": "array", 526 "type": "array",
527 "items": { 527 "items": {
@@ -529,7 +529,7 @@
529 } 529 }
530 }, 530 },
531 "rust-analyzer.diagnostics.warningsAsInfo": { 531 "rust-analyzer.diagnostics.warningsAsInfo": {
532 "markdownDescription": "List of warnings that should be displayed with hint severity.\\nThe warnings will be indicated by faded text or three dots in code and will not show up in the problems panel.", 532 "markdownDescription": "List of warnings that should be displayed with hint severity.\\n\\nThe warnings will be indicated by faded text or three dots in code and will not show up in the `Problems Panel`.",
533 "default": [], 533 "default": [],
534 "type": "array", 534 "type": "array",
535 "items": { 535 "items": {
@@ -577,7 +577,7 @@
577 "type": "boolean" 577 "type": "boolean"
578 }, 578 },
579 "rust-analyzer.inlayHints.maxLength": { 579 "rust-analyzer.inlayHints.maxLength": {
580 "markdownDescription": "Maximum length for inlay hints.", 580 "markdownDescription": "Maximum length for inlay hints. Default is unlimited.",
581 "default": null, 581 "default": null,
582 "type": [ 582 "type": [
583 "null", 583 "null",
@@ -621,7 +621,7 @@
621 "type": "boolean" 621 "type": "boolean"
622 }, 622 },
623 "rust-analyzer.linkedProjects": { 623 "rust-analyzer.linkedProjects": {
624 "markdownDescription": "Disable project auto-discovery in favor of explicitly specified set of projects. \\nElements must be paths pointing to Cargo.toml, rust-project.json, or JSON objects in rust-project.json format.", 624 "markdownDescription": "Disable project auto-discovery in favor of explicitly specified set of projects.\\n\\nElements must be paths pointing to `Cargo.toml`, `rust-project.json`, or JSON objects in `rust-project.json` format.",
625 "default": [], 625 "default": [],
626 "type": "array", 626 "type": "array",
627 "items": { 627 "items": {
@@ -632,7 +632,7 @@
632 } 632 }
633 }, 633 },
634 "rust-analyzer.lruCapacity": { 634 "rust-analyzer.lruCapacity": {
635 "markdownDescription": "Number of syntax trees rust-analyzer keeps in memory.", 635 "markdownDescription": "Number of syntax trees rust-analyzer keeps in memory. Defaults to 128.",
636 "default": null, 636 "default": null,
637 "type": [ 637 "type": [
638 "null", 638 "null",
@@ -646,7 +646,7 @@
646 "type": "boolean" 646 "type": "boolean"
647 }, 647 },
648 "rust-analyzer.procMacro.enable": { 648 "rust-analyzer.procMacro.enable": {
649 "markdownDescription": "Enable Proc macro support, cargo.loadOutDirsFromCheck must be enabled.", 649 "markdownDescription": "Enable Proc macro support, `#rust-analyzer.cargo.loadOutDirsFromCheck#` must be enabled.",
650 "default": false, 650 "default": false,
651 "type": "boolean" 651 "type": "boolean"
652 }, 652 },
@@ -659,7 +659,7 @@
659 ] 659 ]
660 }, 660 },
661 "rust-analyzer.runnables.cargoExtraArgs": { 661 "rust-analyzer.runnables.cargoExtraArgs": {
662 "markdownDescription": "Additional arguments to be passed to cargo for runnables such as tests or binaries.\\nFor example, it may be '--release'.", 662 "markdownDescription": "Additional arguments to be passed to cargo for runnables such as tests or binaries.\\nFor example, it may be `--release`.",
663 "default": [], 663 "default": [],
664 "type": "array", 664 "type": "array",
665 "items": { 665 "items": {
@@ -675,7 +675,7 @@
675 ] 675 ]
676 }, 676 },
677 "rust-analyzer.rustfmt.extraArgs": { 677 "rust-analyzer.rustfmt.extraArgs": {
678 "markdownDescription": "Additional arguments to rustfmt.", 678 "markdownDescription": "Additional arguments to `rustfmt`.",
679 "default": [], 679 "default": [],
680 "type": "array", 680 "type": "array",
681 "items": { 681 "items": {
@@ -749,11 +749,6 @@
749 ], 749 ],
750 "grammars": [ 750 "grammars": [
751 { 751 {
752 "language": "rust",
753 "scopeName": "source.rust",
754 "path": "rust.tmGrammar.json"
755 },
756 {
757 "language": "ra_syntax_tree", 752 "language": "ra_syntax_tree",
758 "scopeName": "source.ra_syntax_tree", 753 "scopeName": "source.ra_syntax_tree",
759 "path": "ra_syntax_tree.tmGrammar.json" 754 "path": "ra_syntax_tree.tmGrammar.json"
diff --git a/editors/code/rust.tmGrammar.json b/editors/code/rust.tmGrammar.json
deleted file mode 100644
index 4759bb116..000000000
--- a/editors/code/rust.tmGrammar.json
+++ /dev/null
@@ -1,1140 +0,0 @@
1{
2 "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
3 "name": "Rust",
4 "fileTypes": [
5 "rs"
6 ],
7 "scopeName": "source.rust",
8 "patterns": [
9 {
10 "comment": "boxed slice literal",
11 "begin": "(<)(\\[)",
12 "beginCaptures": {
13 "1": {
14 "name": "punctuation.brackets.angle.rust"
15 },
16 "2": {
17 "name": "punctuation.brackets.square.rust"
18 }
19 },
20 "end": ">",
21 "endCaptures": {
22 "0": {
23 "name": "punctuation.brackets.angle.rust"
24 }
25 },
26 "patterns": [
27 {
28 "include": "#block-comments"
29 },
30 {
31 "include": "#comments"
32 },
33 {
34 "include": "#gtypes"
35 },
36 {
37 "include": "#lvariables"
38 },
39 {
40 "include": "#lifetimes"
41 },
42 {
43 "include": "#punctuation"
44 },
45 {
46 "include": "#types"
47 }
48 ]
49 },
50 {
51 "comment": "macro type metavariables",
52 "name": "meta.macro.metavariable.type.rust",
53 "match": "(\\$)((crate)|([A-Z][A-Za-z0-9_]*))((:)(block|expr|ident|item|lifetime|literal|meta|path?|stmt|tt|ty|vis))?",
54 "captures": {
55 "1": {
56 "name": "keyword.operator.macro.dollar.rust"
57 },
58 "3": {
59 "name": "keyword.other.crate.rust"
60 },
61 "4": {
62 "name": "entity.name.type.metavariable.rust"
63 },
64 "6": {
65 "name": "keyword.operator.key-value.rust"
66 },
67 "7": {
68 "name": "variable.other.metavariable.specifier.rust"
69 }
70 },
71 "patterns": [
72 {
73 "include": "#keywords"
74 }
75 ]
76 },
77 {
78 "comment": "macro metavariables",
79 "name": "meta.macro.metavariable.rust",
80 "match": "(\\$)([a-z][A-Za-z0-9_]*)((:)(block|expr|ident|item|lifetime|literal|meta|path?|stmt|tt|ty|vis))?",
81 "captures": {
82 "1": {
83 "name": "keyword.operator.macro.dollar.rust"
84 },
85 "2": {
86 "name": "variable.other.metavariable.name.rust"
87 },
88 "4": {
89 "name": "keyword.operator.key-value.rust"
90 },
91 "5": {
92 "name": "variable.other.metavariable.specifier.rust"
93 }
94 },
95 "patterns": [
96 {
97 "include": "#keywords"
98 }
99 ]
100 },
101 {
102 "comment": "macro rules",
103 "name": "meta.macro.rules.rust",
104 "match": "\\b(macro_rules!)\\s+(([a-z0-9_]+)|([A-Z][a-z0-9_]*))\\s+(\\{)",
105 "captures": {
106 "1": {
107 "name": "entity.name.function.macro.rules.rust"
108 },
109 "3": {
110 "name": "entity.name.function.macro.rust"
111 },
112 "4": {
113 "name": "entity.name.type.macro.rust"
114 },
115 "5": {
116 "name": "punctuation.brackets.curly.rust"
117 }
118 }
119 },
120 {
121 "comment": "attributes",
122 "name": "meta.attribute.rust",
123 "begin": "(#)(\\!?)(\\[)",
124 "beginCaptures": {
125 "1": {
126 "name": "punctuation.definition.attribute.rust"
127 },
128 "2": {
129 "name": "keyword.operator.attribute.inner.rust"
130 },
131 "3": {
132 "name": "punctuation.brackets.attribute.rust"
133 }
134 },
135 "end": "\\]",
136 "endCaptures": {
137 "0": {
138 "name": "punctuation.brackets.attribute.rust"
139 }
140 },
141 "patterns": [
142 {
143 "include": "#block-comments"
144 },
145 {
146 "include": "#comments"
147 },
148 {
149 "include": "#keywords"
150 },
151 {
152 "include": "#punctuation"
153 },
154 {
155 "include": "#strings"
156 },
157 {
158 "include": "#gtypes"
159 },
160 {
161 "include": "#types"
162 }
163 ]
164 },
165 {
166 "comment": "modules",
167 "match": "(mod)\\s+((?:r#(?!crate|[Ss]elf|super))?[a-z][A-Za-z0-9_]*)",
168 "captures": {
169 "1": {
170 "name": "storage.type.rust"
171 },
172 "2": {
173 "name": "entity.name.module.rust"
174 }
175 }
176 },
177 {
178 "comment": "external crate imports",
179 "name": "meta.import.rust",
180 "begin": "\\b(extern)\\s+(crate)",
181 "beginCaptures": {
182 "1": {
183 "name": "storage.type.rust"
184 },
185 "2": {
186 "name": "keyword.other.crate.rust"
187 }
188 },
189 "end": ";",
190 "endCaptures": {
191 "0": {
192 "name": "punctuation.semi.rust"
193 }
194 },
195 "patterns": [
196 {
197 "include": "#block-comments"
198 },
199 {
200 "include": "#comments"
201 },
202 {
203 "include": "#keywords"
204 },
205 {
206 "include": "#punctuation"
207 }
208 ]
209 },
210 {
211 "comment": "use statements",
212 "name": "meta.use.rust",
213 "begin": "\\b(use)\\s",
214 "beginCaptures": {
215 "1": {
216 "name": "keyword.other.rust"
217 }
218 },
219 "end": ";",
220 "endCaptures": {
221 "0": {
222 "name": "punctuation.semi.rust"
223 }
224 },
225 "patterns": [
226 {
227 "include": "#block-comments"
228 },
229 {
230 "include": "#comments"
231 },
232 {
233 "include": "#keywords"
234 },
235 {
236 "include": "#namespaces"
237 },
238 {
239 "include": "#punctuation"
240 },
241 {
242 "include": "#types"
243 },
244 {
245 "include": "#lvariables"
246 }
247 ]
248 },
249 {
250 "include": "#block-comments"
251 },
252 {
253 "include": "#comments"
254 },
255 {
256 "include": "#lvariables"
257 },
258 {
259 "include": "#constants"
260 },
261 {
262 "include": "#gtypes"
263 },
264 {
265 "include": "#functions"
266 },
267 {
268 "include": "#types"
269 },
270 {
271 "include": "#keywords"
272 },
273 {
274 "include": "#lifetimes"
275 },
276 {
277 "include": "#macros"
278 },
279 {
280 "include": "#namespaces"
281 },
282 {
283 "include": "#punctuation"
284 },
285 {
286 "include": "#strings"
287 },
288 {
289 "include": "#variables"
290 }
291 ],
292 "repository": {
293 "comments": {
294 "patterns": [
295 {
296 "comment": "documentation comments",
297 "name": "comment.line.documentation.rust",
298 "match": "^\\s*///.*"
299 },
300 {
301 "comment": "line comments",
302 "name": "comment.line.double-slash.rust",
303 "match": "\\s*//.*"
304 }
305 ]
306 },
307 "block-comments": {
308 "patterns": [
309 {
310 "comment": "empty block comments",
311 "name": "comment.block.rust",
312 "match": "/\\*\\*/"
313 },
314 {
315 "comment": "block documentation comments",
316 "name": "comment.block.documentation.rust",
317 "begin": "/\\*\\*",
318 "end": "\\*/",
319 "patterns": [
320 {
321 "include": "#block-comments"
322 }
323 ]
324 },
325 {
326 "comment": "block comments",
327 "name": "comment.block.rust",
328 "begin": "/\\*(?!\\*)",
329 "end": "\\*/",
330 "patterns": [
331 {
332 "include": "#block-comments"
333 }
334 ]
335 }
336 ]
337 },
338 "constants": {
339 "patterns": [
340 {
341 "comment": "ALL CAPS constants",
342 "name": "constant.other.caps.rust",
343 "match": "\\b[A-Z]{2}[A-Z0-9_]*\\b"
344 },
345 {
346 "comment": "constant declarations",
347 "match": "\\b(const)\\s+([A-Z][A-Za-z0-9_]*)\\b",
348 "captures": {
349 "1": {
350 "name": "storage.type.rust"
351 },
352 "2": {
353 "name": "constant.other.caps.rust"
354 }
355 }
356 },
357 {
358 "comment": "decimal integers and floats",
359 "name": "constant.numeric.decimal.rust",
360 "match": "\\b\\d[\\d_]*(\\.?)[\\d_]*(?:(E)([+-])([\\d_]+))?(f32|f64|i128|i16|i32|i64|i8|isize|u128|u16|u32|u64|u8|usize)?\\b",
361 "captures": {
362 "1": {
363 "name": "punctuation.separator.dot.decimal.rust"
364 },
365 "2": {
366 "name": "keyword.operator.exponent.rust"
367 },
368 "3": {
369 "name": "keyword.operator.exponent.sign.rust"
370 },
371 "4": {
372 "name": "constant.numeric.decimal.exponent.mantissa.rust"
373 },
374 "5": {
375 "name": "entity.name.type.numeric.rust"
376 }
377 }
378 },
379 {
380 "comment": "hexadecimal integers",
381 "name": "constant.numeric.hex.rust",
382 "match": "\\b0x[\\da-fA-F_]+(i128|i16|i32|i64|i8|isize|u128|u16|u32|u64|u8|usize)?\\b",
383 "captures": {
384 "1": {
385 "name": "entity.name.type.numeric.rust"
386 }
387 }
388 },
389 {
390 "comment": "octal integers",
391 "name": "constant.numeric.oct.rust",
392 "match": "\\b0o[0-7_]+(i128|i16|i32|i64|i8|isize|u128|u16|u32|u64|u8|usize)?\\b",
393 "captures": {
394 "1": {
395 "name": "entity.name.type.numeric.rust"
396 }
397 }
398 },
399 {
400 "comment": "binary integers",
401 "name": "constant.numeric.bin.rust",
402 "match": "\\b0b[01_]+(i128|i16|i32|i64|i8|isize|u128|u16|u32|u64|u8|usize)?\\b",
403 "captures": {
404 "1": {
405 "name": "entity.name.type.numeric.rust"
406 }
407 }
408 },
409 {
410 "comment": "booleans",
411 "name": "constant.language.bool.rust",
412 "match": "\\b(true|false)\\b"
413 }
414 ]
415 },
416 "escapes": {
417 "comment": "escapes: ASCII, byte, Unicode, quote, regex",
418 "name": "constant.character.escape.rust",
419 "match": "(\\\\)(?:(?:(x[0-7][0-7a-fA-F])|(u(\\{)[\\da-fA-F]{4,6}(\\}))|.))",
420 "captures": {
421 "1": {
422 "name": "constant.character.escape.backslash.rust"
423 },
424 "2": {
425 "name": "constant.character.escape.bit.rust"
426 },
427 "3": {
428 "name": "constant.character.escape.unicode.rust"
429 },
430 "4": {
431 "name": "constant.character.escape.unicode.punctuation.rust"
432 },
433 "5": {
434 "name": "constant.character.escape.unicode.punctuation.rust"
435 }
436 }
437 },
438 "functions": {
439 "patterns": [
440 {
441 "comment": "pub as a function",
442 "match": "\\b(pub)(\\()",
443 "captures": {
444 "1": {
445 "name": "keyword.other.rust"
446 },
447 "2": {
448 "name": "punctuation.brackets.round.rust"
449 }
450 }
451 },
452 {
453 "comment": "function definition",
454 "name": "meta.function.definition.rust",
455 "begin": "\\b(fn)\\s+((?:r#(?!crate|[Ss]elf|super))?[A-Za-z0-9_]+)((\\()|(<))",
456 "beginCaptures": {
457 "1": {
458 "name": "keyword.other.fn.rust"
459 },
460 "2": {
461 "name": "entity.name.function.rust"
462 },
463 "4": {
464 "name": "punctuation.brackets.round.rust"
465 },
466 "5": {
467 "name": "punctuation.brackets.angle.rust"
468 }
469 },
470 "end": "\\{|;",
471 "endCaptures": {
472 "0": {
473 "name": "punctuation.brackets.curly.rust"
474 }
475 },
476 "patterns": [
477 {
478 "include": "#block-comments"
479 },
480 {
481 "include": "#comments"
482 },
483 {
484 "include": "#keywords"
485 },
486 {
487 "include": "#lvariables"
488 },
489 {
490 "include": "#constants"
491 },
492 {
493 "include": "#gtypes"
494 },
495 {
496 "include": "#functions"
497 },
498 {
499 "include": "#lifetimes"
500 },
501 {
502 "include": "#macros"
503 },
504 {
505 "include": "#namespaces"
506 },
507 {
508 "include": "#punctuation"
509 },
510 {
511 "include": "#strings"
512 },
513 {
514 "include": "#types"
515 },
516 {
517 "include": "#variables"
518 }
519 ]
520 },
521 {
522 "comment": "function/method calls, chaining",
523 "name": "meta.function.call.rust",
524 "begin": "((?:r#(?!crate|[Ss]elf|super))?[A-Za-z0-9_]+)(\\()",
525 "beginCaptures": {
526 "1": {
527 "name": "entity.name.function.rust"
528 },
529 "2": {
530 "name": "punctuation.brackets.round.rust"
531 }
532 },
533 "end": "\\)",
534 "endCaptures": {
535 "0": {
536 "name": "punctuation.brackets.round.rust"
537 }
538 },
539 "patterns": [
540 {
541 "include": "#block-comments"
542 },
543 {
544 "include": "#comments"
545 },
546 {
547 "include": "#keywords"
548 },
549 {
550 "include": "#lvariables"
551 },
552 {
553 "include": "#constants"
554 },
555 {
556 "include": "#gtypes"
557 },
558 {
559 "include": "#functions"
560 },
561 {
562 "include": "#lifetimes"
563 },
564 {
565 "include": "#macros"
566 },
567 {
568 "include": "#namespaces"
569 },
570 {
571 "include": "#punctuation"
572 },
573 {
574 "include": "#strings"
575 },
576 {
577 "include": "#types"
578 },
579 {
580 "include": "#variables"
581 }
582 ]
583 },
584 {
585 "comment": "function/method calls with turbofish",
586 "name": "meta.function.call.rust",
587 "begin": "((?:r#(?!crate|[Ss]elf|super))?[A-Za-z0-9_]+)(?=::<.*>\\()",
588 "beginCaptures": {
589 "1": {
590 "name": "entity.name.function.rust"
591 }
592 },
593 "end": "\\)",
594 "endCaptures": {
595 "0": {
596 "name": "punctuation.brackets.round.rust"
597 }
598 },
599 "patterns": [
600 {
601 "include": "#block-comments"
602 },
603 {
604 "include": "#comments"
605 },
606 {
607 "include": "#keywords"
608 },
609 {
610 "include": "#lvariables"
611 },
612 {
613 "include": "#constants"
614 },
615 {
616 "include": "#gtypes"
617 },
618 {
619 "include": "#functions"
620 },
621 {
622 "include": "#lifetimes"
623 },
624 {
625 "include": "#macros"
626 },
627 {
628 "include": "#namespaces"
629 },
630 {
631 "include": "#punctuation"
632 },
633 {
634 "include": "#strings"
635 },
636 {
637 "include": "#types"
638 },
639 {
640 "include": "#variables"
641 }
642 ]
643 }
644 ]
645 },
646 "keywords": {
647 "patterns": [
648 {
649 "comment": "control flow keywords",
650 "name": "keyword.control.rust",
651 "match": "\\b(await|break|continue|do|else|for|if|loop|match|return|try|while|yield)\\b"
652 },
653 {
654 "comment": "storage keywords",
655 "name": "storage.type.rust",
656 "match": "\\b(const|enum|extern|let|macro|mod|struct|trait|type)\\b"
657 },
658 {
659 "comment": "storage modifiers",
660 "name": "storage.modifier.rust",
661 "match": "\\b(abstract|static)\\b"
662 },
663 {
664 "comment": "other keywords",
665 "name": "keyword.other.rust",
666 "match": "\\b(as|async|become|box|dyn|move|final|impl|in|override|priv|pub|ref|typeof|union|unsafe|unsized|use|virtual|where)\\b"
667 },
668 {
669 "comment": "fn",
670 "name": "keyword.other.fn.rust",
671 "match": "\\bfn\\b"
672 },
673 {
674 "comment": "crate",
675 "name": "keyword.other.crate.rust",
676 "match": "\\bcrate\\b"
677 },
678 {
679 "comment": "mut",
680 "name": "storage.modifier.mut.rust",
681 "match": "\\bmut\\b"
682 },
683 {
684 "comment": "logical operators",
685 "name": "keyword.operator.logical.rust",
686 "match": "(\\^|\\||\\|\\||&&|<<|>>|!)(?!=)"
687 },
688 {
689 "comment": "logical AND, borrow references",
690 "name": "keyword.operator.borrow.and.rust",
691 "match": "&(?![&=])"
692 },
693 {
694 "comment": "assignment operators",
695 "name": "keyword.operator.assignment.rust",
696 "match": "(\\+=|-=|\\*=|/=|%=|\\^=|&=|\\|=|<<=|>>=)"
697 },
698 {
699 "comment": "single equal",
700 "name": "keyword.operator.assignment.equal.rust",
701 "match": "(?<![<>])=(?!=|>)"
702 },
703 {
704 "comment": "comparison operators",
705 "name": "keyword.operator.comparison.rust",
706 "match": "(=(=)?(?!>)|!=|<=|(?<!=)>=)"
707 },
708 {
709 "comment": "math operators",
710 "name": "keyword.operator.math.rust",
711 "match": "(([+%]|(\\*(?!\\w)))(?!=))|(-(?!>))|(/(?!/))"
712 },
713 {
714 "comment": "less than, greater than (special case)",
715 "match": "(?:\\b|(?:(\\))|(\\])|(\\})))[ \\t]+([<>])[ \\t]+(?:\\b|(?:(\\()|(\\[)|(\\{)))",
716 "captures": {
717 "1": {
718 "name": "punctuation.brackets.round.rust"
719 },
720 "2": {
721 "name": "punctuation.brackets.square.rust"
722 },
723 "3": {
724 "name": "punctuation.brackets.curly.rust"
725 },
726 "4": {
727 "name": "keyword.operator.comparison.rust"
728 },
729 "5": {
730 "name": "punctuation.brackets.round.rust"
731 },
732 "6": {
733 "name": "punctuation.brackets.square.rust"
734 },
735 "7": {
736 "name": "punctuation.brackets.curly.rust"
737 }
738 }
739 },
740 {
741 "comment": "namespace operator",
742 "name": "keyword.operator.namespace.rust",
743 "match": "::"
744 },
745 {
746 "comment": "dereference asterisk",
747 "match": "(\\*)(?=\\w+)",
748 "captures": {
749 "1": {
750 "name": "keyword.operator.dereference.rust"
751 }
752 }
753 },
754 {
755 "comment": "subpattern binding",
756 "name": "keyword.operator.subpattern.rust",
757 "match": "@"
758 },
759 {
760 "comment": "dot access",
761 "name": "keyword.operator.access.dot.rust",
762 "match": "\\.(?!\\.)"
763 },
764 {
765 "comment": "ranges, range patterns",
766 "name": "keyword.operator.range.rust",
767 "match": "\\.{2}(=|\\.)?"
768 },
769 {
770 "comment": "colon",
771 "name": "keyword.operator.key-value.rust",
772 "match": ":(?!:)"
773 },
774 {
775 "comment": "dashrocket, skinny arrow",
776 "name": "keyword.operator.arrow.skinny.rust",
777 "match": "->"
778 },
779 {
780 "comment": "hashrocket, fat arrow",
781 "name": "keyword.operator.arrow.fat.rust",
782 "match": "=>"
783 },
784 {
785 "comment": "dollar macros",
786 "name": "keyword.operator.macro.dollar.rust",
787 "match": "\\$"
788 },
789 {
790 "comment": "question mark operator, questionably sized, macro kleene matcher",
791 "name": "keyword.operator.question.rust",
792 "match": "\\?"
793 }
794 ]
795 },
796 "interpolations": {
797 "comment": "curly brace interpolations",
798 "name": "meta.interpolation.rust",
799 "match": "({)[^\"{}]*(})",
800 "captures": {
801 "1": {
802 "name": "punctuation.definition.interpolation.rust"
803 },
804 "2": {
805 "name": "punctuation.definition.interpolation.rust"
806 }
807 }
808 },
809 "lifetimes": {
810 "patterns": [
811 {
812 "comment": "named lifetime parameters",
813 "match": "(['])([a-zA-Z_][0-9a-zA-Z_]*)(?!['])\\b",
814 "captures": {
815 "1": {
816 "name": "punctuation.definition.lifetime.rust"
817 },
818 "2": {
819 "name": "entity.name.type.lifetime.rust"
820 }
821 }
822 },
823 {
824 "comment": "borrowing references to named lifetimes",
825 "match": "(\\&)(['])([a-zA-Z_][0-9a-zA-Z_]*)(?!['])\\b",
826 "captures": {
827 "1": {
828 "name": "keyword.operator.borrow.rust"
829 },
830 "2": {
831 "name": "punctuation.definition.lifetime.rust"
832 },
833 "3": {
834 "name": "entity.name.type.lifetime.rust"
835 }
836 }
837 }
838 ]
839 },
840 "macros": {
841 "patterns": [
842 {
843 "comment": "macros",
844 "name": "meta.macro.rust",
845 "match": "(([a-z_][A-Za-z0-9_]*!)|([A-Z_][A-Za-z0-9_]*!))",
846 "captures": {
847 "2": {
848 "name": "entity.name.function.macro.rust"
849 },
850 "3": {
851 "name": "entity.name.type.macro.rust"
852 }
853 }
854 }
855 ]
856 },
857 "namespaces": {
858 "patterns": [
859 {
860 "comment": "namespace (non-type, non-function path segment)",
861 "match": "(?<![A-Za-z0-9_])([a-z0-9_]+)((?<!super|self)::)",
862 "captures": {
863 "1": {
864 "name": "entity.name.namespace.rust"
865 },
866 "2": {
867 "name": "keyword.operator.namespace.rust"
868 }
869 }
870 }
871 ]
872 },
873 "types": {
874 "patterns": [
875 {
876 "comment": "numeric types",
877 "match": "(?<![A-Za-z])(f32|f64|i128|i16|i32|i64|i8|isize|u128|u16|u32|u64|u8|usize)\\b",
878 "captures": {
879 "1": {
880 "name": "entity.name.type.numeric.rust"
881 }
882 }
883 },
884 {
885 "comment": "parameterized types",
886 "begin": "\\b([A-Z][A-Za-z0-9]*)(<)",
887 "beginCaptures": {
888 "1": {
889 "name": "entity.name.type.rust"
890 },
891 "2": {
892 "name": "punctuation.brackets.angle.rust"
893 }
894 },
895 "end": ">",
896 "endCaptures": {
897 "0": {
898 "name": "punctuation.brackets.angle.rust"
899 }
900 },
901 "patterns": [
902 {
903 "include": "#block-comments"
904 },
905 {
906 "include": "#comments"
907 },
908 {
909 "include": "#keywords"
910 },
911 {
912 "include": "#lvariables"
913 },
914 {
915 "include": "#lifetimes"
916 },
917 {
918 "include": "#punctuation"
919 },
920 {
921 "include": "#types"
922 },
923 {
924 "include": "#variables"
925 }
926 ]
927 },
928 {
929 "comment": "primitive types",
930 "name": "entity.name.type.primitive.rust",
931 "match": "\\b(bool|char|str)\\b"
932 },
933 {
934 "comment": "trait declarations",
935 "match": "\\b(trait)\\s+([A-Z][A-Za-z0-9]*)\\b",
936 "captures": {
937 "1": {
938 "name": "storage.type.rust"
939 },
940 "2": {
941 "name": "entity.name.type.trait.rust"
942 }
943 }
944 },
945 {
946 "comment": "struct declarations",
947 "match": "\\b(struct)\\s+([A-Z][A-Za-z0-9]*)\\b",
948 "captures": {
949 "1": {
950 "name": "storage.type.rust"
951 },
952 "2": {
953 "name": "entity.name.type.struct.rust"
954 }
955 }
956 },
957 {
958 "comment": "enum declarations",
959 "match": "\\b(enum)\\s+([A-Z][A-Za-z0-9_]*)\\b",
960 "captures": {
961 "1": {
962 "name": "storage.type.rust"
963 },
964 "2": {
965 "name": "entity.name.type.enum.rust"
966 }
967 }
968 },
969 {
970 "comment": "type declarations",
971 "match": "\\b(type)\\s+([A-Z][A-Za-z0-9_]*)\\b",
972 "captures": {
973 "1": {
974 "name": "storage.type.rust"
975 },
976 "2": {
977 "name": "entity.name.type.declaration.rust"
978 }
979 }
980 },
981 {
982 "comment": "types",
983 "name": "entity.name.type.rust",
984 "match": "\\b[A-Z][A-Za-z0-9]*\\b(?!!)"
985 }
986 ]
987 },
988 "gtypes": {
989 "patterns": [
990 {
991 "comment": "option types",
992 "name": "entity.name.type.option.rust",
993 "match": "\\b(Some|None)\\b"
994 },
995 {
996 "comment": "result types",
997 "name": "entity.name.type.result.rust",
998 "match": "\\b(Ok|Err)\\b"
999 }
1000 ]
1001 },
1002 "punctuation": {
1003 "patterns": [
1004 {
1005 "comment": "comma",
1006 "name": "punctuation.comma.rust",
1007 "match": ","
1008 },
1009 {
1010 "comment": "curly braces",
1011 "name": "punctuation.brackets.curly.rust",
1012 "match": "[{}]"
1013 },
1014 {
1015 "comment": "parentheses, round brackets",
1016 "name": "punctuation.brackets.round.rust",
1017 "match": "[()]"
1018 },
1019 {
1020 "comment": "semicolon",
1021 "name": "punctuation.semi.rust",
1022 "match": ";"
1023 },
1024 {
1025 "comment": "square brackets",
1026 "name": "punctuation.brackets.square.rust",
1027 "match": "[\\[\\]]"
1028 },
1029 {
1030 "comment": "angle brackets",
1031 "name": "punctuation.brackets.angle.rust",
1032 "match": "(?<!=)[<>]"
1033 }
1034 ]
1035 },
1036 "strings": {
1037 "patterns": [
1038 {
1039 "comment": "double-quoted strings and byte strings",
1040 "name": "string.quoted.double.rust",
1041 "begin": "(b?)(\")",
1042 "beginCaptures": {
1043 "1": {
1044 "name": "string.quoted.byte.raw.rust"
1045 },
1046 "2": {
1047 "name": "punctuation.definition.string.rust"
1048 }
1049 },
1050 "end": "\"",
1051 "endCaptures": {
1052 "0": {
1053 "name": "punctuation.definition.string.rust"
1054 }
1055 },
1056 "patterns": [
1057 {
1058 "include": "#escapes"
1059 },
1060 {
1061 "include": "#interpolations"
1062 }
1063 ]
1064 },
1065 {
1066 "comment": "double-quoted raw strings and raw byte strings",
1067 "name": "string.quoted.double.rust",
1068 "begin": "(b?r)(#*)(\")",
1069 "beginCaptures": {
1070 "1": {
1071 "name": "string.quoted.byte.raw.rust"
1072 },
1073 "2": {
1074 "name": "punctuation.definition.string.raw.rust"
1075 },
1076 "3": {
1077 "name": "punctuation.definition.string.rust"
1078 }
1079 },
1080 "end": "(\")(\\2)",
1081 "endCaptures": {
1082 "1": {
1083 "name": "punctuation.definition.string.rust"
1084 },
1085 "2": {
1086 "name": "punctuation.definition.string.raw.rust"
1087 }
1088 }
1089 },
1090 {
1091 "comment": "characters and bytes",
1092 "name": "string.quoted.single.char.rust",
1093 "begin": "(b)?(')",
1094 "beginCaptures": {
1095 "1": {
1096 "name": "string.quoted.byte.raw.rust"
1097 },
1098 "2": {
1099 "name": "punctuation.definition.char.rust"
1100 }
1101 },
1102 "end": "'",
1103 "endCaptures": {
1104 "0": {
1105 "name": "punctuation.definition.char.rust"
1106 }
1107 },
1108 "patterns": [
1109 {
1110 "include": "#escapes"
1111 }
1112 ]
1113 }
1114 ]
1115 },
1116 "lvariables": {
1117 "patterns": [
1118 {
1119 "comment": "self",
1120 "name": "variable.language.self.rust",
1121 "match": "\\b[Ss]elf\\b"
1122 },
1123 {
1124 "comment": "super",
1125 "name": "variable.language.super.rust",
1126 "match": "\\bsuper\\b"
1127 }
1128 ]
1129 },
1130 "variables": {
1131 "patterns": [
1132 {
1133 "comment": "variables",
1134 "name": "variable.other.rust",
1135 "match": "\\b(?<!(?<!\\.)\\.)(?:r#(?!(crate|[Ss]elf|super)))?[a-z0-9_]+\\b"
1136 }
1137 ]
1138 }
1139 }
1140}
diff --git a/editors/code/src/commands.ts b/editors/code/src/commands.ts
index 92bc4d7f7..9d4823a34 100644
--- a/editors/code/src/commands.ts
+++ b/editors/code/src/commands.ts
@@ -470,7 +470,7 @@ export function resolveCodeAction(ctx: Ctx): Cmd {
470 return; 470 return;
471 } 471 }
472 const edit = client.protocol2CodeConverter.asWorkspaceEdit(item.edit); 472 const edit = client.protocol2CodeConverter.asWorkspaceEdit(item.edit);
473 await applySnippetWorkspaceEdit(edit); 473 await vscode.workspace.applyEdit(edit);
474 }; 474 };
475} 475}
476 476
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 191960960..282240d84 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -19,9 +19,8 @@ let ctx: Ctx | undefined;
19const RUST_PROJECT_CONTEXT_NAME = "inRustProject"; 19const RUST_PROJECT_CONTEXT_NAME = "inRustProject";
20 20
21export async function activate(context: vscode.ExtensionContext) { 21export async function activate(context: vscode.ExtensionContext) {
22 // For some reason vscode not always shows pop-up error notifications 22 // VS Code doesn't show a notification when an extension fails to activate
23 // when an extension fails to activate, so we do it explicitly by ourselves. 23 // so we do it ourselves.
24 // FIXME: remove this bit of code once vscode fixes this issue: https://github.com/microsoft/vscode/issues/101242
25 await tryActivate(context).catch(err => { 24 await tryActivate(context).catch(err => {
26 void vscode.window.showErrorMessage(`Cannot activate rust-analyzer: ${err.message}`); 25 void vscode.window.showErrorMessage(`Cannot activate rust-analyzer: ${err.message}`);
27 throw err; 26 throw err;
@@ -132,7 +131,7 @@ async function tryActivate(context: vscode.ExtensionContext) {
132 ctx.pushCleanup(activateTaskProvider(workspaceFolder, ctx.config)); 131 ctx.pushCleanup(activateTaskProvider(workspaceFolder, ctx.config));
133 132
134 activateInlayHints(ctx); 133 activateInlayHints(ctx);
135 warnAboutRustLangExtensionConflict(); 134 warnAboutExtensionConflicts();
136 135
137 vscode.workspace.onDidChangeConfiguration( 136 vscode.workspace.onDidChangeConfiguration(
138 _ => ctx?.client?.sendNotification('workspace/didChangeConfiguration', { settings: "" }), 137 _ => ctx?.client?.sendNotification('workspace/didChangeConfiguration', { settings: "" }),
@@ -288,10 +287,14 @@ async function getServer(config: Config, state: PersistentState): Promise<string
288 if (config.package.releaseTag === null) return "rust-analyzer"; 287 if (config.package.releaseTag === null) return "rust-analyzer";
289 288
290 let platform: string | undefined; 289 let platform: string | undefined;
291 if (process.arch === "x64" || process.arch === "ia32") { 290 if ((process.arch === "x64" || process.arch === "ia32") && process.platform === "win32") {
292 if (process.platform === "linux") platform = "linux"; 291 platform = "x86_64-pc-windows-msvc";
293 if (process.platform === "darwin") platform = "mac"; 292 } else if (process.arch === "x64" && process.platform === "linux") {
294 if (process.platform === "win32") platform = "windows"; 293 platform = "x86_64-unknown-linux-gnu";
294 } else if (process.arch === "x64" && process.platform === "darwin") {
295 platform = "x86_64-apple-darwin";
296 } else if (process.arch === "arm64" && process.platform === "darwin") {
297 platform = "aarch64-apple-darwin";
295 } 298 }
296 if (platform === undefined) { 299 if (platform === undefined) {
297 vscode.window.showErrorMessage( 300 vscode.window.showErrorMessage(
@@ -304,7 +307,7 @@ async function getServer(config: Config, state: PersistentState): Promise<string
304 ); 307 );
305 return undefined; 308 return undefined;
306 } 309 }
307 const ext = platform === "windows" ? ".exe" : ""; 310 const ext = platform.indexOf("-windows-") !== -1 ? ".exe" : "";
308 const dest = path.join(config.globalStoragePath, `rust-analyzer-${platform}${ext}`); 311 const dest = path.join(config.globalStoragePath, `rust-analyzer-${platform}${ext}`);
309 const exists = await fs.stat(dest).then(() => true, () => false); 312 const exists = await fs.stat(dest).then(() => true, () => false);
310 if (!exists) { 313 if (!exists) {
@@ -340,7 +343,7 @@ async function getServer(config: Config, state: PersistentState): Promise<string
340 }); 343 });
341 344
342 // Patching executable if that's NixOS. 345 // Patching executable if that's NixOS.
343 if (await fs.stat("/etc/nixos").then(_ => true).catch(_ => false)) { 346 if (await isNixOs()) {
344 await patchelf(dest); 347 await patchelf(dest);
345 } 348 }
346 349
@@ -348,6 +351,15 @@ async function getServer(config: Config, state: PersistentState): Promise<string
348 return dest; 351 return dest;
349} 352}
350 353
354async function isNixOs(): Promise<boolean> {
355 try {
356 const contents = await fs.readFile("/etc/os-release");
357 return contents.indexOf("ID=nixos") !== -1;
358 } catch (e) {
359 return false;
360 }
361}
362
351async function downloadWithRetryDialog<T>(state: PersistentState, downloadFunc: () => Promise<T>): Promise<T> { 363async function downloadWithRetryDialog<T>(state: PersistentState, downloadFunc: () => Promise<T>): Promise<T> {
352 while (true) { 364 while (true) {
353 try { 365 try {
@@ -401,11 +413,21 @@ async function queryForGithubToken(state: PersistentState): Promise<void> {
401 } 413 }
402} 414}
403 415
404function warnAboutRustLangExtensionConflict() { 416function warnAboutExtensionConflicts() {
405 const rustLangExt = vscode.extensions.getExtension("rust-lang.rust"); 417 const conflicting = [
406 if (rustLangExt !== undefined) { 418 ["rust-analyzer", "matklad.rust-analyzer"],
419 ["Rust", "rust-lang.rust"],
420 ["Rust", "kalitaalexey.vscode-rust"],
421 ];
422
423 const found = conflicting.filter(
424 nameId => vscode.extensions.getExtension(nameId[1]) !== undefined);
425
426 if (found.length > 1) {
427 const fst = found[0];
428 const sec = found[1];
407 vscode.window.showWarningMessage( 429 vscode.window.showWarningMessage(
408 "You have both rust-analyzer (matklad.rust-analyzer) and Rust (rust-lang.rust) " + 430 `You have both the ${fst[0]} (${fst[1]}) and ${sec[0]} (${sec[1]}) ` +
409 "plugins enabled. These are known to conflict and cause various functions of " + 431 "plugins enabled. These are known to conflict and cause various functions of " +
410 "both plugins to not work correctly. You should disable one of them.", "Got it"); 432 "both plugins to not work correctly. You should disable one of them.", "Got it");
411 }; 433 };