aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-12-11 12:41:53 +0000
committerAleksey Kladov <[email protected]>2020-12-11 12:45:53 +0000
commite179ed6f532e976d50c286c3349f2dddd7de6928 (patch)
tree92894ee2330fe3112f224b7f41d73147cf31c9b1
parent41321d96789ed918eebda02ada76758765d19d16 (diff)
Use natural trait ordering in derive completion
derive(Clone, Copy) reads better than derive(Copy, Clone). However, we preserve the reverse ordering in the lookup text for sorting purposes. That way, it's convenient to type just `Ord` to derive everything.
-rw-r--r--crates/completion/src/completions/attribute.rs35
-rw-r--r--docs/user/generated_diagnostic.adoc119
2 files changed, 18 insertions, 136 deletions
diff --git a/crates/completion/src/completions/attribute.rs b/crates/completion/src/completions/attribute.rs
index 5404145d5..acce2e7e7 100644
--- a/crates/completion/src/completions/attribute.rs
+++ b/crates/completion/src/completions/attribute.rs
@@ -3,6 +3,7 @@
3//! This module uses a bit of static metadata to provide completions 3//! This module uses a bit of static metadata to provide completions
4//! for built-in attributes. 4//! for built-in attributes.
5 5
6use itertools::Itertools;
6use rustc_hash::FxHashSet; 7use rustc_hash::FxHashSet;
7use syntax::{ast, AstNode, SyntaxKind}; 8use syntax::{ast, AstNode, SyntaxKind};
8 9
@@ -162,19 +163,20 @@ const ATTRIBUTES: &[AttrCompletion] = &[
162fn complete_derive(acc: &mut Completions, ctx: &CompletionContext, derive_input: ast::TokenTree) { 163fn complete_derive(acc: &mut Completions, ctx: &CompletionContext, derive_input: ast::TokenTree) {
163 if let Ok(existing_derives) = parse_comma_sep_input(derive_input) { 164 if let Ok(existing_derives) = parse_comma_sep_input(derive_input) {
164 for derive_completion in DEFAULT_DERIVE_COMPLETIONS 165 for derive_completion in DEFAULT_DERIVE_COMPLETIONS
165 .into_iter() 166 .iter()
166 .filter(|completion| !existing_derives.contains(completion.label)) 167 .filter(|completion| !existing_derives.contains(completion.label))
167 { 168 {
168 let mut label = derive_completion.label.to_owned(); 169 let mut components = vec![derive_completion.label];
169 for dependency in derive_completion 170 components.extend(
170 .dependencies 171 derive_completion
171 .into_iter() 172 .dependencies
172 .filter(|&&dependency| !existing_derives.contains(dependency)) 173 .iter()
173 { 174 .filter(|&&dependency| !existing_derives.contains(dependency)),
174 label.push_str(", "); 175 );
175 label.push_str(dependency); 176 let lookup = components.join(", ");
176 } 177 let label = components.iter().rev().join(", ");
177 CompletionItem::new(CompletionKind::Attribute, ctx.source_range(), label) 178 CompletionItem::new(CompletionKind::Attribute, ctx.source_range(), label)
179 .lookup_by(lookup)
178 .kind(CompletionItemKind::Attribute) 180 .kind(CompletionItemKind::Attribute)
179 .add_to(acc) 181 .add_to(acc)
180 } 182 }
@@ -264,7 +266,6 @@ struct DeriveCompletion {
264 266
265/// Standard Rust derives and the information about their dependencies 267/// Standard Rust derives and the information about their dependencies
266/// (the dependencies are needed so that the main derive don't break the compilation when added) 268/// (the dependencies are needed so that the main derive don't break the compilation when added)
267#[rustfmt::skip]
268const DEFAULT_DERIVE_COMPLETIONS: &[DeriveCompletion] = &[ 269const DEFAULT_DERIVE_COMPLETIONS: &[DeriveCompletion] = &[
269 DeriveCompletion { label: "Clone", dependencies: &[] }, 270 DeriveCompletion { label: "Clone", dependencies: &[] },
270 DeriveCompletion { label: "Copy", dependencies: &["Clone"] }, 271 DeriveCompletion { label: "Copy", dependencies: &["Clone"] },
@@ -421,14 +422,14 @@ struct Test {}
421 "#, 422 "#,
422 expect![[r#" 423 expect![[r#"
423 at Clone 424 at Clone
424 at Copy, Clone 425 at Clone, Copy
425 at Debug 426 at Debug
426 at Default 427 at Default
427 at Eq, PartialEq
428 at Hash 428 at Hash
429 at Ord, PartialOrd, Eq, PartialEq
430 at PartialEq 429 at PartialEq
431 at PartialOrd, PartialEq 430 at PartialEq, Eq
431 at PartialEq, Eq, PartialOrd, Ord
432 at PartialEq, PartialOrd
432 "#]], 433 "#]],
433 ); 434 );
434 } 435 }
@@ -453,12 +454,12 @@ struct Test {}
453"#, 454"#,
454 expect![[r#" 455 expect![[r#"
455 at Clone 456 at Clone
456 at Copy, Clone 457 at Clone, Copy
457 at Debug 458 at Debug
458 at Default 459 at Default
459 at Eq 460 at Eq
461 at Eq, PartialOrd, Ord
460 at Hash 462 at Hash
461 at Ord, PartialOrd, Eq
462 at PartialOrd 463 at PartialOrd
463 "#]], 464 "#]],
464 ) 465 )
diff --git a/docs/user/generated_diagnostic.adoc b/docs/user/generated_diagnostic.adoc
deleted file mode 100644
index ec8581a03..000000000
--- a/docs/user/generated_diagnostic.adoc
+++ /dev/null
@@ -1,119 +0,0 @@
1//Generated file, do not edit by hand, see `xtask/src/codegen`
2=== break-outside-of-loop
3**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L219[diagnostics.rs]
4
5This diagnostic is triggered if `break` keyword is used outside of a loop.
6
7
8=== inactive-code
9**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L98[diagnostics.rs]
10
11This diagnostic is shown for code with inactive `#[cfg]` attributes.
12
13
14=== incorrect-ident-case
15**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L319[diagnostics.rs]
16
17This diagnostic is triggered if item name doesn't follow https://doc.rust-lang.org/1.0.0/style/style/naming/README.html[Rust naming convention].
18
19
20=== macro-error
21**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L167[diagnostics.rs]
22
23This diagnostic is shown for macro expansion errors.
24
25
26=== mismatched-arg-count
27**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L267[diagnostics.rs]
28
29This diagnostic is triggered if function is invoked with an incorrect amount of arguments.
30
31
32=== missing-match-arm
33**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L162[diagnostics.rs]
34
35This diagnostic is triggered if `match` block is missing one or more match arms.
36
37
38=== missing-ok-in-tail-expr
39**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L187[diagnostics.rs]
40
41This diagnostic is triggered if block that should return `Result` returns a value not wrapped in `Ok`.
42
43Example:
44
45```rust
46fn foo() -> Result<u8, ()> {
47 10
48}
49```
50
51
52=== missing-pat-fields
53**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L113[diagnostics.rs]
54
55This diagnostic is triggered if pattern lacks some fields that exist in the corresponding structure.
56
57Example:
58
59```rust
60struct A { a: u8, b: u8 }
61
62let a = A { a: 10, b: 20 };
63
64if let A { a } = a {
65 // ...
66}
67```
68
69
70=== missing-structure-fields
71**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L66[diagnostics.rs]
72
73This diagnostic is triggered if record lacks some fields that exist in the corresponding structure.
74
75Example:
76
77```rust
78struct A { a: u8, b: u8 }
79
80let a = A { a: 10 };
81```
82
83
84=== missing-unsafe
85**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L243[diagnostics.rs]
86
87This diagnostic is triggered if operation marked as `unsafe` is used outside of `unsafe` function or block.
88
89
90=== no-such-field
91**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L39[diagnostics.rs]
92
93This diagnostic is triggered if created structure does not have field provided in record.
94
95
96=== unresolved-extern-crate
97**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L43[diagnostics.rs]
98
99This diagnostic is triggered if rust-analyzer is unable to discover referred extern crate.
100
101
102=== unresolved-import
103**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L67[diagnostics.rs]
104
105This diagnostic is triggered if rust-analyzer is unable to discover imported module.
106
107
108=== unresolved-module
109**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L18[diagnostics.rs]
110
111This diagnostic is triggered if rust-analyzer is unable to discover referred module.
112
113
114=== unresolved-proc-macro
115**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L131[diagnostics.rs]
116
117This diagnostic is shown when a procedural macro can not be found. This usually means that
118procedural macro support is simply disabled (and hence is only a weak hint instead of an error),
119but can also indicate project setup problems.