Unnamed repository; edit this file 'description' to name the repository.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
//! Generated by `cargo xtask codegen feature-docs`, do not edit by hand.

### Annotations
**Source:**  [annotations.rs](crates/ide/src/annotations.rs#19) 

Provides user with annotations above items for looking up references or impl blocks
and running/debugging binaries.

![Annotations](https://user-images.githubusercontent.com/48062697/113020672-b7c34f00-917a-11eb-8f6e-858735660a0e.png)


### Auto Import
**Source:**  [auto_import.rs](crates/ide-assists/src/handlers/auto_import.rs#15) 

Using the `auto-import` assist it is possible to insert missing imports for unresolved items.
When inserting an import it will do so in a structured manner by keeping imports grouped,
separated by a newline in the following order:

- `std` and `core`
- External Crates
- Current Crate, paths prefixed by `crate`
- Current Module, paths prefixed by `self`
- Super Module, paths prefixed by `super`

Example:
```rust
use std::fs::File;

use itertools::Itertools;
use syntax::ast;

use crate::utils::insert_use;

use self::auto_import;

use super::AssistContext;
```

#### Import Granularity

It is possible to configure how use-trees are merged with the `imports.granularity.group` setting.
It has the following configurations:

- `crate`: Merge imports from the same crate into a single use statement. This kind of
 nesting is only supported in Rust versions later than 1.24.
- `module`: Merge imports from the same module into a single use statement.
- `item`: Don't merge imports at all, creating one import per item.
- `preserve`: Do not change the granularity of any imports. For auto-import this has the same
 effect as `item`.
- `one`: Merge all imports into a single use statement as long as they have the same visibility
 and attributes.

In `VS Code` the configuration for this is `rust-analyzer.imports.granularity.group`.

#### Import Prefix

The style of imports in the same crate is configurable through the `imports.prefix` setting.
It has the following configurations:

- `crate`: This setting will force paths to be always absolute, starting with the `crate`
 prefix, unless the item is defined outside of the current crate.
- `self`: This setting will force paths that are relative to the current module to always
 start with `self`. This will result in paths that always start with either `crate`, `self`,
 `super` or an extern crate identifier.
- `plain`: This setting does not impose any restrictions in imports.

In `VS Code` the configuration for this is `rust-analyzer.imports.prefix`.

![Auto Import](https://user-images.githubusercontent.com/48062697/113020673-b85be580-917a-11eb-9022-59585f35d4f8.gif)


### Completion With Autoimport
**Source:**  [flyimport.rs](crates/ide-completion/src/completions/flyimport.rs#20) 

When completing names in the current scope, proposes additional imports from other modules or crates,
if they can be qualified in the scope, and their name contains all symbols from the completion input.

To be considered applicable, the name must contain all input symbols in the given order, not necessarily adjacent.
If any input symbol is not lowercased, the name must contain all symbols in exact case; otherwise the containing is checked case-insensitively.

```
fn main() {
    pda$0
}
# pub mod std { pub mod marker { pub struct PhantomData { } } }
```
->
```
use std::marker::PhantomData;

fn main() {
    PhantomData
}
# pub mod std { pub mod marker { pub struct PhantomData { } } }
```

Also completes associated items, that require trait imports.
If any unresolved and/or partially-qualified path precedes the input, it will be taken into account.
Currently, only the imports with their import path ending with the whole qualifier will be proposed
(no fuzzy matching for qualifier).

```
mod foo {
    pub mod bar {
        pub struct Item;

        impl Item {
            pub const TEST_ASSOC: usize = 3;
        }
    }
}

fn main() {
    bar::Item::TEST_A$0
}
```
->
```
use foo::bar;

mod foo {
    pub mod bar {
        pub struct Item;

        impl Item {
            pub const TEST_ASSOC: usize = 3;
        }
    }
}

fn main() {
    bar::Item::TEST_ASSOC
}
```

NOTE: currently, if an assoc item comes from a trait that's not currently imported, and it also has an unresolved and/or partially-qualified path,
no imports will be proposed.

#### Fuzzy search details

To avoid an excessive amount of the results returned, completion input is checked for inclusion in the names only
(i.e. in `HashMap` in the `std::collections::HashMap` path).
For the same reasons, avoids searching for any path imports for inputs with their length less than 2 symbols
(but shows all associated items for any input length).

#### Import configuration

It is possible to configure how use-trees are merged with the `imports.granularity.group` setting.
Mimics the corresponding behavior of the `Auto Import` feature.

#### LSP and performance implications

The feature is enabled only if the LSP client supports LSP protocol version 3.16+ and reports the `additionalTextEdits`
(case-sensitive) resolve client capability in its client capabilities.
This way the server is able to defer the costly computations, doing them for a selected completion item only.
For clients with no such support, all edits have to be calculated on the completion request, including the fuzzy search completion ones,
which might be slow ergo the feature is automatically disabled.

#### Feature toggle

The feature can be forcefully turned off in the settings with the `rust-analyzer.completion.autoimport.enable` flag.
Note that having this flag set to `true` does not guarantee that the feature is enabled: your client needs to have the corresponding
capability enabled.


### Debug ItemTree
**Source:**  [view_item_tree.rs](crates/ide/src/view_item_tree.rs#5) 

Displays the ItemTree of the currently open file, for debugging.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Debug ItemTree** |


### Expand Macro Recursively
**Source:**  [expand_macro.rs](crates/ide/src/expand_macro.rs#18) 

Shows the full macro expansion of the macro at the current caret position.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Expand macro recursively at caret** |

![Expand Macro Recursively](https://user-images.githubusercontent.com/48062697/113020648-b3973180-917a-11eb-84a9-ecb921293dc5.gif)


### Expand and Shrink Selection
**Source:**  [extend_selection.rs](crates/ide/src/extend_selection.rs#15) 

Extends or shrinks the current selection to the encompassing syntactic construct
(expression, statement, item, module, etc). It works with multiple cursors.

| Editor  | Shortcut |
|---------|----------|
| VS Code | <kbd>Alt+Shift+→</kbd>, <kbd>Alt+Shift+←</kbd> |

![Expand and Shrink Selection](https://user-images.githubusercontent.com/48062697/113020651-b42fc800-917a-11eb-8a4f-cf1a07859fac.gif)


### File Structure
**Source:**  [file_structure.rs](crates/ide/src/file_structure.rs#26) 

Provides a tree of the symbols defined in the file. Can be used to

* fuzzy search symbol in a file (super useful)
* draw breadcrumbs to describe the context around the cursor
* draw outline of the file

| Editor  | Shortcut |
|---------|----------|
| VS Code | <kbd>Ctrl+Shift+O</kbd> |

![File Structure](https://user-images.githubusercontent.com/48062697/113020654-b42fc800-917a-11eb-8388-e7dc4d92b02e.gif)


### Find All References
**Source:**  [references.rs](crates/ide/src/references.rs#42) 

Shows all references of the item at the cursor location

| Editor  | Shortcut |
|---------|----------|
| VS Code | <kbd>Shift+Alt+F12</kbd> |

![Find All References](https://user-images.githubusercontent.com/48062697/113020670-b7c34f00-917a-11eb-8003-370ac5f2b3cb.gif)


### Folding
**Source:**  [folding_ranges.rs](crates/ide/src/folding_ranges.rs#36) 

Defines folding regions for curly braced blocks, runs of consecutive use, mod, const or static
items, and `region` / `endregion` comment markers.


### Format String Completion
**Source:**  [format_like.rs](crates/ide-completion/src/completions/postfix/format_like.rs#0) 

`"Result {result} is {2 + 2}"` is expanded to the `"Result {} is {}", result, 2 + 2`.

The following postfix snippets are available:

* `format` -> `format!(...)`
* `panic` -> `panic!(...)`
* `println` -> `println!(...)`
* `log`:
** `logd` -> `log::debug!(...)`
** `logt` -> `log::trace!(...)`
** `logi` -> `log::info!(...)`
** `logw` -> `log::warn!(...)`
** `loge` -> `log::error!(...)`

![Format String Completion](https://user-images.githubusercontent.com/48062697/113020656-b560f500-917a-11eb-87de-02991f61beb8.gif)


### Go to Declaration
**Source:**  [goto_declaration.rs](crates/ide/src/goto_declaration.rs#13) 

Navigates to the declaration of an identifier.

This is the same as `Go to Definition` with the following exceptions:
- outline modules will navigate to the `mod name;` item declaration
- trait assoc items will navigate to the assoc item of the trait declaration as opposed to the trait impl
- fields in patterns will navigate to the field declaration of the struct, union or variant


### Go to Definition
**Source:**  [goto_definition.rs](crates/ide/src/goto_definition.rs#28) 

Navigates to the definition of an identifier.

For outline modules, this will navigate to the source file of the module.

| Editor  | Shortcut |
|---------|----------|
| VS Code | <kbd>F12</kbd> |

![Go to Definition](https://user-images.githubusercontent.com/48062697/113065563-025fbe00-91b1-11eb-83e4-a5a703610b23.gif)


### Go to Implementation
**Source:**  [goto_implementation.rs](crates/ide/src/goto_implementation.rs#11) 

Navigates to the impl items of types.

| Editor  | Shortcut |
|---------|----------|
| VS Code | <kbd>Ctrl+F12</kbd>

![Go to Implementation](https://user-images.githubusercontent.com/48062697/113065566-02f85480-91b1-11eb-9288-aaad8abd8841.gif)


### Go to Type Definition
**Source:**  [goto_type_definition.rs](crates/ide/src/goto_type_definition.rs#7) 

Navigates to the type of an identifier.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **Go to Type Definition** |

![Go to Type Definition](https://user-images.githubusercontent.com/48062697/113020657-b560f500-917a-11eb-9007-0f809733a338.gif)


### Highlight Related
**Source:**  [highlight_related.rs](crates/ide/src/highlight_related.rs#42) 

Highlights constructs related to the thing under the cursor:

1. if on an identifier, highlights all references to that identifier in the current file
     * additionally, if the identifier is a trait in a where clause, type parameter trait bound or use item, highlights all references to that trait's assoc items in the corresponding scope
1. if on an `async` or `await` token, highlights all yield points for that async context
1. if on a `return` or `fn` keyword, `?` character or `->` return type arrow, highlights all exit points for that context
1. if on a `break`, `loop`, `while` or `for` token, highlights all break points for that loop or block context
1. if on a `move` or `|` token that belongs to a closure, highlights all captures of the closure.

Note: `?`, `|` and `->` do not currently trigger this behavior in the VSCode editor.


### Hover
**Source:**  [hover.rs](crates/ide/src/hover.rs#116) 

Shows additional information, like the type of an expression or the documentation for a definition when "focusing" code.
Focusing is usually hovering with a mouse, but can also be triggered with a shortcut.

![Hover](https://user-images.githubusercontent.com/48062697/113020658-b5f98b80-917a-11eb-9f88-3dbc27320c95.gif)


### Inlay Hints
**Source:**  [inlay_hints.rs](crates/ide/src/inlay_hints.rs#41) 

rust-analyzer shows additional information inline with the source code.
Editors usually render this using read-only virtual text snippets interspersed with code.

rust-analyzer by default shows hints for

* types of local variables
* names of function arguments
* names of const generic parameters
* types of chained expressions

Optionally, one can enable additional hints for

* return types of closure expressions
* elided lifetimes
* compiler inserted reborrows
* names of generic type and lifetime parameters

Note: inlay hints for function argument names are heuristically omitted to reduce noise and will not appear if
any of the
[following criteria](https://github.com/rust-lang/rust-analyzer/blob/6b8b8ff4c56118ddee6c531cde06add1aad4a6af/crates/ide/src/inlay_hints/param_name.rs#L92-L99)
are met:

* the parameter name is a suffix of the function's name
* the argument is a qualified constructing or call expression where the qualifier is an ADT
* exact argument<->parameter match(ignoring leading underscore) or parameter is a prefix/suffix
  of argument with _ splitting it off
* the parameter name starts with `ra_fixture`
* the parameter name is a
[well known name](https://github.com/rust-lang/rust-analyzer/blob/6b8b8ff4c56118ddee6c531cde06add1aad4a6af/crates/ide/src/inlay_hints/param_name.rs#L200)
in a unary function
* the parameter name is a
[single character](https://github.com/rust-lang/rust-analyzer/blob/6b8b8ff4c56118ddee6c531cde06add1aad4a6af/crates/ide/src/inlay_hints/param_name.rs#L201)
in a unary function

![Inlay hints](https://user-images.githubusercontent.com/48062697/113020660-b5f98b80-917a-11eb-8d70-3be3fd558cdd.png)


### Interpret A Function, Static Or Const.
**Source:**  [interpret.rs](crates/ide/src/interpret.rs#8) 

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Interpret** |


### Join Lines
**Source:**  [join_lines.rs](crates/ide/src/join_lines.rs#20) 

Join selected lines into one, smartly fixing up whitespace, trailing commas, and braces.

See [this gif](https://user-images.githubusercontent.com/1711539/124515923-4504e800-dde9-11eb-8d58-d97945a1a785.gif) for the cases handled specially by joined lines.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Join lines** |

![Join Lines](https://user-images.githubusercontent.com/48062697/113020661-b6922200-917a-11eb-87c4-b75acc028f11.gif)


### Magic Completions
**Source:**  [lib.rs](crates/ide-completion/src/lib.rs#78) 

In addition to usual reference completion, rust-analyzer provides some ✨magic✨
completions as well:

Keywords like `if`, `else` `while`, `loop` are completed with braces, and cursor
is placed at the appropriate position. Even though `if` is easy to type, you
still want to complete it, to get ` { }` for free! `return` is inserted with a
space or `;` depending on the return type of the function.

When completing a function call, `()` are automatically inserted. If a function
takes arguments, the cursor is positioned inside the parenthesis.

There are postfix completions, which can be triggered by typing something like
`foo().if`. The word after `.` determines postfix completion. Possible variants are:

- `expr.if` -> `if expr {}` or `if let ... {}` for `Option` or `Result`
- `expr.match` -> `match expr {}`
- `expr.while` -> `while expr {}` or `while let ... {}` for `Option` or `Result`
- `expr.ref` -> `&expr`
- `expr.refm` -> `&mut expr`
- `expr.let` -> `let $0 = expr;`
- `expr.lete` -> `let $1 = expr else { $0 };`
- `expr.letm` -> `let mut $0 = expr;`
- `expr.not` -> `!expr`
- `expr.dbg` -> `dbg!(expr)`
- `expr.dbgr` -> `dbg!(&expr)`
- `expr.call` -> `(expr)`

There also snippet completions:

#### Expressions

- `pd` -> `eprintln!(" = {:?}", );`
- `ppd` -> `eprintln!(" = {:#?}", );`

#### Items

- `tfn` -> `#[test] fn feature(){}`
- `tmod` ->
```rust
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_name() {}
}
```

And the auto import completions, enabled with the `rust-analyzer.completion.autoimport.enable` setting and the corresponding LSP client capabilities.
Those are the additional completion options with automatic `use` import and options from all project importable items,
fuzzy matched against the completion input.

![Magic Completions](https://user-images.githubusercontent.com/48062697/113020667-b72ab880-917a-11eb-8778-716cf26a0eb3.gif)


### Matching Brace
**Source:**  [matching_brace.rs](crates/ide/src/matching_brace.rs#6) 

If the cursor is on any brace (`<>(){}[]||`) which is a part of a brace-pair,
moves cursor to the matching brace. It uses the actual parser to determine
braces, so it won't confuse generics with comparisons.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Find matching brace** |

![Matching Brace](https://user-images.githubusercontent.com/48062697/113065573-04298180-91b1-11eb-8dec-d4e2a202f304.gif)


### Memory Usage
**Source:**  [apply_change.rs](crates/ide-db/src/apply_change.rs#43) 

Clears rust-analyzer's internal database and prints memory usage statistics.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Memory Usage (Clears Database)**


### Move Item
**Source:**  [move_item.rs](crates/ide/src/move_item.rs#16) 

Move item under cursor or selection up and down.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Move item up**
| VS Code | **rust-analyzer: Move item down**

![Move Item](https://user-images.githubusercontent.com/48062697/113065576-04298180-91b1-11eb-91ce-4505e99ed598.gif)


### On Enter
**Source:**  [on_enter.rs](crates/ide/src/typing/on_enter.rs#17) 

rust-analyzer can override <kbd>Enter</kbd> key to make it smarter:

- <kbd>Enter</kbd> inside triple-slash comments automatically inserts `///`
- <kbd>Enter</kbd> in the middle or after a trailing space in `//` inserts `//`
- <kbd>Enter</kbd> inside `//!` doc comments automatically inserts `//!`
- <kbd>Enter</kbd> after `{` indents contents and closing `}` of single-line block

This action needs to be assigned to shortcut explicitly.

Note that, depending on the other installed extensions, this feature can visibly slow down typing.
Similarly, if rust-analyzer crashes or stops responding, `Enter` might not work.
In that case, you can still press `Shift-Enter` to insert a newline.

#### VS Code

Add the following to `keybindings.json`:
```json
{
  "key": "Enter",
  "command": "rust-analyzer.onEnter",
  "when": "editorTextFocus && !suggestWidgetVisible && editorLangId == rust"
}
````

When using the Vim plugin:
```json
{
  "key": "Enter",
  "command": "rust-analyzer.onEnter",
  "when": "editorTextFocus && !suggestWidgetVisible && editorLangId == rust && vim.mode == 'Insert'"
}
````

![On Enter](https://user-images.githubusercontent.com/48062697/113065578-04c21800-91b1-11eb-82b8-22b8c481e645.gif)


### On Typing Assists
**Source:**  [typing.rs](crates/ide/src/typing.rs#42) 

Some features trigger on typing certain characters:

- typing `let =` tries to smartly add `;` if `=` is followed by an existing expression
- typing `=` between two expressions adds `;` when in statement position
- typing `=` to turn an assignment into an equality comparison removes `;` when in expression position
- typing `.` in a chain method call auto-indents
- typing `{` or `(` in front of an expression inserts a closing `}` or `)` after the expression
- typing `{` in a use item adds a closing `}` in the right place
- typing `>` to complete a return type `->` will insert a whitespace after it

#### VS Code

Add the following to `settings.json`:
```json
"editor.formatOnType": true,
```

![On Typing Assists](https://user-images.githubusercontent.com/48062697/113166163-69758500-923a-11eb-81ee-eb33ec380399.gif)
![On Typing Assists](https://user-images.githubusercontent.com/48062697/113171066-105c2000-923f-11eb-87ab-f4a263346567.gif)


### Open Docs
**Source:**  [doc_links.rs](crates/ide/src/doc_links.rs#118) 

Retrieve a links to documentation for the given symbol.

The simplest way to use this feature is via the context menu. Right-click on
the selected item. The context menu opens. Select **Open Docs**.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Open Docs** |


### Parent Module
**Source:**  [parent_module.rs](crates/ide/src/parent_module.rs#14) 

Navigates to the parent module of the current module.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Locate parent module** |

![Parent Module](https://user-images.githubusercontent.com/48062697/113065580-04c21800-91b1-11eb-9a32-00086161c0bd.gif)


### Related Tests
**Source:**  [runnables.rs](crates/ide/src/runnables.rs#202) 

Provides a sneak peek of all tests where the current item is used.

The simplest way to use this feature is via the context menu. Right-click on
the selected item. The context menu opens. Select **Peek Related Tests**.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Peek Related Tests** |


### Rename
**Source:**  [rename.rs](crates/ide/src/rename.rs#70) 

Renames the item below the cursor and all of its references

| Editor  | Shortcut |
|---------|----------|
| VS Code | <kbd>F2</kbd> |

![Rename](https://user-images.githubusercontent.com/48062697/113065582-055aae80-91b1-11eb-8ade-2b58e6d81883.gif)


### Run
**Source:**  [runnables.rs](crates/ide/src/runnables.rs#116) 

Shows a popup suggesting to run a test/benchmark/binary **at the current cursor
location**. Super useful for repeatedly running just a single test. Do bind this
to a shortcut!

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Run** |

![Run](https://user-images.githubusercontent.com/48062697/113065583-055aae80-91b1-11eb-958f-d67efcaf6a2f.gif)


### Semantic Syntax Highlighting
**Source:**  [syntax_highlighting.rs](crates/ide/src/syntax_highlighting.rs#68) 

rust-analyzer highlights the code semantically.
For example, `Bar` in `foo::Bar` might be colored differently depending on whether `Bar` is an enum or a trait.
rust-analyzer does not specify colors directly, instead it assigns a tag (like `struct`) and a set of modifiers (like `declaration`) to each token.
It's up to the client to map those to specific colors.

The general rule is that a reference to an entity gets colored the same way as the entity itself.
We also give special modifier for `mut` and `&mut` local variables.


#### Token Tags

Rust-analyzer currently emits the following token tags:

- For items:

|           |                                |
|-----------|--------------------------------|
| attribute |  Emitted for attribute macros. |
|enum| Emitted for enums. |
|function| Emitted for free-standing functions. |
|derive| Emitted for derive macros. |
|macro| Emitted for function-like macros. |
|method| Emitted for associated functions, also knowns as methods. |
|namespace| Emitted for modules. |
|struct| Emitted for structs.|
|trait| Emitted for traits.|
|typeAlias| Emitted for type aliases and `Self` in `impl`s.|
|union| Emitted for unions.|

- For literals:

|           |                                |
|-----------|--------------------------------|
| boolean|  Emitted for the boolean literals `true` and `false`.|
| character| Emitted for character literals.|
| number| Emitted for numeric literals.|
| string| Emitted for string literals.|
| escapeSequence| Emitted for escaped sequences inside strings like `\n`.|
| formatSpecifier| Emitted for format specifiers `{:?}` in `format!`-like macros.|

- For operators:

|           |                                |
|-----------|--------------------------------|
|operator| Emitted for general operators.|
|arithmetic| Emitted for the arithmetic operators `+`, `-`, `*`, `/`, `+=`, `-=`, `*=`, `/=`.|
|bitwise| Emitted for the bitwise operators `|`, `&`, `!`, `^`, `|=`, `&=`, `^=`.|
|comparison| Emitted for the comparison oerators `>`, `<`, `==`, `>=`, `<=`, `!=`.|
|logical| Emitted for the logical operatos `||`, `&&`, `!`.|

- For punctuation:

|           |                                |
|-----------|--------------------------------|
|punctuation| Emitted for general punctuation.|
|attributeBracket| Emitted for attribute invocation brackets, that is the `#[` and `]` tokens.|
|angle| Emitted for `<>` angle brackets.|
|brace| Emitted for `{}` braces.|
|bracket| Emitted for `[]` brackets.|
|parenthesis| Emitted for `()` parentheses.|
|colon| Emitted for the `:` token.|
|comma| Emitted for the `,` token.|
|dot| Emitted for the `.` token.|
|semi| Emitted for the `;` token.|
|macroBang| Emitted for the `!` token in macro calls.|

-

|           |                                |
|-----------|--------------------------------|
|builtinAttribute| Emitted for names to builtin attributes in attribute path, the `repr` in `#[repr(u8)]` for example.|
|builtinType| Emitted for builtin types like `u32`, `str` and `f32`.|
|comment| Emitted for comments.|
|constParameter| Emitted for const parameters.|
|deriveHelper| Emitted for derive helper attributes.|
|enumMember| Emitted for enum variants.|
|generic| Emitted for generic tokens that have no mapping.|
|keyword| Emitted for keywords.|
|label| Emitted for labels.|
|lifetime| Emitted for lifetimes.|
|parameter| Emitted for non-self function parameters.|
|property| Emitted for struct and union fields.|
|selfKeyword| Emitted for the self function parameter and self path-specifier.|
|selfTypeKeyword| Emitted for the Self type parameter.|
|toolModule| Emitted for tool modules.|
|typeParameter| Emitted for type parameters.|
|unresolvedReference| Emitted for unresolved references, names that rust-analyzer can't find the definition of.|
|variable| Emitted for locals, constants and statics.|


#### Token Modifiers

Token modifiers allow to style some elements in the source code more precisely.

Rust-analyzer currently emits the following token modifiers:

|           |                                |
|-----------|--------------------------------|
|async| Emitted for async functions and the `async` and `await` keywords.|
|attribute| Emitted for tokens inside attributes.|
|callable| Emitted for locals whose types implements one of the `Fn*` traits.|
|constant| Emitted for const.|
|consuming| Emitted for locals that are being consumed when use in a function call.|
|controlFlow| Emitted for control-flow related tokens, this includes th `?` operator.|
|crateRoot| Emitted for crate names, like `serde` and `crate.|
|declaration| Emitted for names of definitions, like `foo` in `fn foo(){}`.|
|defaultLibrary| Emitted for items from built-in crates (std, core, allc, test and proc_macro).|
|documentation| Emitted for documentation comment.|
|injected| Emitted for doc-string injected highlighting like rust source blocks in documentation.|
|intraDocLink| Emitted for intra doc links in doc-string.|
|library| Emitted for items that are defined outside of the current crae.|
|macro|  Emitted for tokens inside macro call.|
|mutable| Emitted for mutable locals and statics as well as functions taking `&mut self`.|
|public| Emitted for items that are from the current crate and are `pub.|
|reference| Emitted for locals behind a reference and functions taking self` by reference.|
|static| Emitted for "static" functions, also known as functions that d not take a `self` param, as well as statics and consts.|
|trait| Emitted for associated trait item.|
|unsafe| Emitted for unsafe operations, like unsafe function calls, as ell as the `unsafe` token.|

![Semantic Syntax Highlighting](https://user-images.githubusercontent.com/48062697/113164457-06cfb980-9239-11eb-819b-0f93e646acf8.png)
![Semantic Syntax Highlighting](https://user-images.githubusercontent.com/48062697/113187625-f7f50100-9250-11eb-825e-91c58f236071.png)


### Show Dependency Tree
**Source:**  [fetch_crates.rs](crates/ide/src/fetch_crates.rs#13) 

Shows a view tree with all the dependencies of this project

| Editor  | Panel Name |
|---------|------------|
| VS Code | **Rust Dependencies** |

![Show Dependency Tree](https://user-images.githubusercontent.com/5748995/229394139-2625beab-f4c9-484b-84ed-ad5dee0b1e1a.png)


### Show Syntax Tree
**Source:**  [view_syntax_tree.rs](crates/ide/src/view_syntax_tree.rs#14) 

Shows a tree view with the syntax tree of the current file

| Editor  | Panel Name |
|---------|-------------|
| VS Code | **Rust Syntax Tree** |


### Status
**Source:**  [status.rs](crates/ide/src/status.rs#28) 

Shows internal statistic about memory usage of rust-analyzer.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: Status** |

![Status](https://user-images.githubusercontent.com/48062697/113065584-05f34500-91b1-11eb-98cc-5c196f76be7f.gif)


### Structural Search and Replace
**Source:**  [lib.rs](crates/ide-ssr/src/lib.rs#6) 

Search and replace with named wildcards that will match any expression, type, path, pattern or item.
The syntax for a structural search replace command is `<search_pattern> ==>> <replace_pattern>`.
A `$<name>` placeholder in the search pattern will match any AST node and `$<name>` will reference it in the replacement.
Within a macro call, a placeholder will match up until whatever token follows the placeholder.

All paths in both the search pattern and the replacement template must resolve in the context
in which this command is invoked. Paths in the search pattern will then match the code if they
resolve to the same item, even if they're written differently. For example if we invoke the
command in the module `foo` with a pattern of `Bar`, then code in the parent module that refers
to `foo::Bar` will match.

Paths in the replacement template will be rendered appropriately for the context in which the
replacement occurs. For example if our replacement template is `foo::Bar` and we match some
code in the `foo` module, we'll insert just `Bar`.

Inherent method calls should generally be written in UFCS form. e.g. `foo::Bar::baz($s, $a)` will
match `$s.baz($a)`, provided the method call `baz` resolves to the method `foo::Bar::baz`. When a
placeholder is the receiver of a method call in the search pattern (e.g. `$s.foo()`), but not in
the replacement template (e.g. `bar($s)`), then *, & and &mut will be added as needed to mirror
whatever autoderef and autoref was happening implicitly in the matched code.

The scope of the search / replace will be restricted to the current selection if any, otherwise
it will apply to the whole workspace.

Placeholders may be given constraints by writing them as `${<name>:<constraint1>:<constraint2>...}`.

Supported constraints:

| Constraint    | Restricts placeholder |
|---------------|------------------------|
| kind(literal) | Is a literal (e.g. `42` or `"forty two"`) |
| not(a)        | Negates the constraint `a` |

Available via the command `rust-analyzer.ssr`.

```rust
// Using structural search replace command [foo($a, $b) ==>> ($a).foo($b)]

// BEFORE
String::from(foo(y + 5, z))

// AFTER
String::from((y + 5).foo(z))
```

| Editor  | Action Name |
|---------|--------------|
| VS Code | **rust-analyzer: Structural Search Replace** |

Also available as an assist, by writing a comment containing the structural
search and replace rule. You will only see the assist if the comment can
be parsed as a valid structural search and replace rule.

```rust
// Place the cursor on the line below to see the assist 💡.
// foo($a, $b) ==>> ($a).foo($b)
```


### User Snippet Completions
**Source:**  [snippet.rs](crates/ide-completion/src/snippet.rs#5) 

rust-analyzer allows the user to define custom (postfix)-snippets that may depend on items to be accessible for the current scope to be applicable.

A custom snippet can be defined by adding it to the `rust-analyzer.completion.snippets.custom` object respectively.

```json
{
  "rust-analyzer.completion.snippets.custom": {
    "thread spawn": {
      "prefix": ["spawn", "tspawn"],
      "body": [
        "thread::spawn(move || {",
        "\t$0",
        "});",
      ],
      "description": "Insert a thread::spawn call",
      "requires": "std::thread",
      "scope": "expr",
    }
  }
}
```

In the example above:

* `"thread spawn"` is the name of the snippet.

* `prefix` defines one or more trigger words that will trigger the snippets completion.
Using `postfix` will instead create a postfix snippet.

* `body` is one or more lines of content joined via newlines for the final output.

* `description` is an optional description of the snippet, if unset the snippet name will be used.

* `requires` is an optional list of item paths that have to be resolvable in the current crate where the completion is rendered.


### View Crate Graph
**Source:**  [view_crate_graph.rs](crates/ide/src/view_crate_graph.rs#8) 

Renders the currently loaded crate graph as an SVG graphic. Requires the `dot` tool, which
is part of graphviz, to be installed.

Only workspace crates are included, no crates.io dependencies or sysroot crates.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: View Crate Graph** |


### View Hir
**Source:**  [view_hir.rs](crates/ide/src/view_hir.rs#5) 

| Editor  | Action Name |
|---------|--------------|
| VS Code | **rust-analyzer: View Hir**

![View Hir](https://user-images.githubusercontent.com/48062697/113065588-068bdb80-91b1-11eb-9a78-0b4ef1e972fb.gif)


### View Memory Layout
**Source:**  [view_memory_layout.rs](crates/ide/src/view_memory_layout.rs#74) 

Displays the recursive memory layout of a datatype.

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: View Memory Layout** |


### View Mir
**Source:**  [view_mir.rs](crates/ide/src/view_mir.rs#5) 

| Editor  | Action Name |
|---------|-------------|
| VS Code | **rust-analyzer: View Mir**


### Workspace Symbol
**Source:**  [symbol_index.rs](crates/ide-db/src/symbol_index.rs#174) 

Uses fuzzy-search to find types, modules and functions by name across your
project and dependencies. This is **the** most useful feature, which improves code
navigation tremendously. It mostly works on top of the built-in LSP
functionality, however `#` and `*` symbols can be used to narrow down the
search. Specifically,

- `Foo` searches for `Foo` type in the current workspace
- `foo#` searches for `foo` function in the current workspace
- `Foo*` searches for `Foo` type among dependencies, including `stdlib`
- `foo#*` searches for `foo` function among dependencies

That is, `#` switches from "types" to all symbols, `*` switches from the current
workspace to dependencies.

Note that filtering does not currently work in VSCode due to the editor never
sending the special symbols to the language server. Instead, you can configure
the filtering via the `rust-analyzer.workspace.symbol.search.scope` and
`rust-analyzer.workspace.symbol.search.kind` settings. Symbols prefixed
with `__` are hidden from the search results unless configured otherwise.

| Editor  | Shortcut |
|---------|-----------|
| VS Code | <kbd>Ctrl+T</kbd>