3
3
//! This module uses a bit of static metadata to provide completions
4
4
//! for built-in attributes.
5
5
6
+ use itertools:: Itertools ;
6
7
use rustc_hash:: FxHashSet ;
7
8
use syntax:: { ast, AstNode , SyntaxKind } ;
8
9
@@ -162,19 +163,20 @@ const ATTRIBUTES: &[AttrCompletion] = &[
162
163
fn complete_derive ( acc : & mut Completions , ctx : & CompletionContext , derive_input : ast:: TokenTree ) {
163
164
if let Ok ( existing_derives) = parse_comma_sep_input ( derive_input) {
164
165
for derive_completion in DEFAULT_DERIVE_COMPLETIONS
165
- . into_iter ( )
166
+ . iter ( )
166
167
. filter ( |completion| !existing_derives. contains ( completion. label ) )
167
168
{
168
- let mut label = derive_completion. label . to_owned ( ) ;
169
- for dependency in derive_completion
170
- . dependencies
171
- . into_iter ( )
172
- . filter ( | & & dependency| !existing_derives . contains ( dependency ) )
173
- {
174
- label . push_str ( ", " ) ;
175
- label . push_str ( dependency ) ;
176
- }
169
+ let mut components = vec ! [ derive_completion. label] ;
170
+ components . extend (
171
+ derive_completion
172
+ . dependencies
173
+ . iter ( )
174
+ . filter ( | & & dependency| !existing_derives . contains ( dependency ) ) ,
175
+ ) ;
176
+ let lookup = components . join ( ", " ) ;
177
+ let label = components . iter ( ) . rev ( ) . join ( ", " ) ;
177
178
CompletionItem :: new ( CompletionKind :: Attribute , ctx. source_range ( ) , label)
179
+ . lookup_by ( lookup)
178
180
. kind ( CompletionItemKind :: Attribute )
179
181
. add_to ( acc)
180
182
}
@@ -264,7 +266,6 @@ struct DeriveCompletion {
264
266
265
267
/// Standard Rust derives and the information about their dependencies
266
268
/// (the dependencies are needed so that the main derive don't break the compilation when added)
267
- #[ rustfmt:: skip]
268
269
const DEFAULT_DERIVE_COMPLETIONS : & [ DeriveCompletion ] = & [
269
270
DeriveCompletion { label : "Clone" , dependencies : & [ ] } ,
270
271
DeriveCompletion { label : "Copy" , dependencies : & [ "Clone" ] } ,
@@ -421,14 +422,14 @@ struct Test {}
421
422
"# ,
422
423
expect ! [ [ r#"
423
424
at Clone
424
- at Copy, Clone
425
+ at Clone, Copy
425
426
at Debug
426
427
at Default
427
- at Eq, PartialEq
428
428
at Hash
429
- at Ord, PartialOrd, Eq, PartialEq
430
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
455
expect ! [ [ r#"
455
456
at Clone
456
- at Copy, Clone
457
+ at Clone, Copy
457
458
at Debug
458
459
at Default
459
460
at Eq
461
+ at Eq, PartialOrd, Ord
460
462
at Hash
461
- at Ord, PartialOrd, Eq
462
463
at PartialOrd
463
464
"# ] ] ,
464
465
)
0 commit comments