]> git.lizzy.rs Git - rust.git/commitdiff
Use natural trait ordering in derive completion
authorAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 11 Dec 2020 12:41:53 +0000 (15:41 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 11 Dec 2020 12:45:53 +0000 (15:45 +0300)
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.

crates/completion/src/completions/attribute.rs
docs/user/generated_diagnostic.adoc [deleted file]

index 5404145d5568d94807473bed72d56048d3868c45..acce2e7e7a5d09c935f45426e130f52bab7c0c37 100644 (file)
@@ -3,6 +3,7 @@
 //! This module uses a bit of static metadata to provide completions
 //! for built-in attributes.
 
+use itertools::Itertools;
 use rustc_hash::FxHashSet;
 use syntax::{ast, AstNode, SyntaxKind};
 
@@ -162,19 +163,20 @@ const fn attr(
 fn complete_derive(acc: &mut Completions, ctx: &CompletionContext, derive_input: ast::TokenTree) {
     if let Ok(existing_derives) = parse_comma_sep_input(derive_input) {
         for derive_completion in DEFAULT_DERIVE_COMPLETIONS
-            .into_iter()
+            .iter()
             .filter(|completion| !existing_derives.contains(completion.label))
         {
-            let mut label = derive_completion.label.to_owned();
-            for dependency in derive_completion
-                .dependencies
-                .into_iter()
-                .filter(|&&dependency| !existing_derives.contains(dependency))
-            {
-                label.push_str(", ");
-                label.push_str(dependency);
-            }
+            let mut components = vec![derive_completion.label];
+            components.extend(
+                derive_completion
+                    .dependencies
+                    .iter()
+                    .filter(|&&dependency| !existing_derives.contains(dependency)),
+            );
+            let lookup = components.join(", ");
+            let label = components.iter().rev().join(", ");
             CompletionItem::new(CompletionKind::Attribute, ctx.source_range(), label)
+                .lookup_by(lookup)
                 .kind(CompletionItemKind::Attribute)
                 .add_to(acc)
         }
@@ -264,7 +266,6 @@ struct DeriveCompletion {
 
 /// Standard Rust derives and the information about their dependencies
 /// (the dependencies are needed so that the main derive don't break the compilation when added)
-#[rustfmt::skip]
 const DEFAULT_DERIVE_COMPLETIONS: &[DeriveCompletion] = &[
     DeriveCompletion { label: "Clone", dependencies: &[] },
     DeriveCompletion { label: "Copy", dependencies: &["Clone"] },
@@ -421,14 +422,14 @@ struct Test {}
         "#,
             expect![[r#"
                 at Clone
-                at Copy, Clone
+                at Clone, Copy
                 at Debug
                 at Default
-                at Eq, PartialEq
                 at Hash
-                at Ord, PartialOrd, Eq, PartialEq
                 at PartialEq
-                at PartialOrd, PartialEq
+                at PartialEq, Eq
+                at PartialEq, Eq, PartialOrd, Ord
+                at PartialEq, PartialOrd
             "#]],
         );
     }
@@ -453,12 +454,12 @@ struct Test {}
 "#,
             expect![[r#"
                 at Clone
-                at Copy, Clone
+                at Clone, Copy
                 at Debug
                 at Default
                 at Eq
+                at Eq, PartialOrd, Ord
                 at Hash
-                at Ord, PartialOrd, Eq
                 at PartialOrd
             "#]],
         )
diff --git a/docs/user/generated_diagnostic.adoc b/docs/user/generated_diagnostic.adoc
deleted file mode 100644 (file)
index ec8581a..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-//Generated file, do not edit by hand, see `xtask/src/codegen`
-=== break-outside-of-loop
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L219[diagnostics.rs]
-
-This diagnostic is triggered if `break` keyword is used outside of a loop.
-
-
-=== inactive-code
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L98[diagnostics.rs]
-
-This diagnostic is shown for code with inactive `#[cfg]` attributes.
-
-
-=== incorrect-ident-case
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L319[diagnostics.rs]
-
-This 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].
-
-
-=== macro-error
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L167[diagnostics.rs]
-
-This diagnostic is shown for macro expansion errors.
-
-
-=== mismatched-arg-count
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L267[diagnostics.rs]
-
-This diagnostic is triggered if function is invoked with an incorrect amount of arguments.
-
-
-=== missing-match-arm
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L162[diagnostics.rs]
-
-This diagnostic is triggered if `match` block is missing one or more match arms.
-
-
-=== missing-ok-in-tail-expr
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L187[diagnostics.rs]
-
-This diagnostic is triggered if block that should return `Result` returns a value not wrapped in `Ok`.
-
-Example:
-
-```rust
-fn foo() -> Result<u8, ()> {
-    10
-}
-```
-
-
-=== missing-pat-fields
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L113[diagnostics.rs]
-
-This diagnostic is triggered if pattern lacks some fields that exist in the corresponding structure.
-
-Example:
-
-```rust
-struct A { a: u8, b: u8 }
-
-let a = A { a: 10, b: 20 };
-
-if let A { a } = a {
-    // ...
-}
-```
-
-
-=== missing-structure-fields
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L66[diagnostics.rs]
-
-This diagnostic is triggered if record lacks some fields that exist in the corresponding structure.
-
-Example:
-
-```rust
-struct A { a: u8, b: u8 }
-
-let a = A { a: 10 };
-```
-
-
-=== missing-unsafe
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L243[diagnostics.rs]
-
-This diagnostic is triggered if operation marked as `unsafe` is used outside of `unsafe` function or block.
-
-
-=== no-such-field
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L39[diagnostics.rs]
-
-This diagnostic is triggered if created structure does not have field provided in record.
-
-
-=== unresolved-extern-crate
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L43[diagnostics.rs]
-
-This diagnostic is triggered if rust-analyzer is unable to discover referred extern crate.
-
-
-=== unresolved-import
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L67[diagnostics.rs]
-
-This diagnostic is triggered if rust-analyzer is unable to discover imported module.
-
-
-=== unresolved-module
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L18[diagnostics.rs]
-
-This diagnostic is triggered if rust-analyzer is unable to discover referred module.
-
-
-=== unresolved-proc-macro
-**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L131[diagnostics.rs]
-
-This diagnostic is shown when a procedural macro can not be found. This usually means that
-procedural macro support is simply disabled (and hence is only a weak hint instead of an error),
-but can also indicate project setup problems.