@@ -19,6 +19,7 @@ use crate::{
19
19
20
20
pub ( super ) fn element (
21
21
sema : & Semantics < RootDatabase > ,
22
+ krate : Option < hir:: Crate > ,
22
23
bindings_shadow_count : & mut FxHashMap < hir:: Name , u32 > ,
23
24
syntactic_name_ref_highlighting : bool ,
24
25
element : SyntaxElement ,
@@ -46,8 +47,10 @@ pub(super) fn element(
46
47
47
48
match name_kind {
48
49
Some ( NameClass :: ExternCrate ( _) ) => SymbolKind :: Module . into ( ) ,
49
- Some ( NameClass :: Definition ( def) ) => highlight_def ( db, def) | HlMod :: Definition ,
50
- Some ( NameClass :: ConstReference ( def) ) => highlight_def ( db, def) ,
50
+ Some ( NameClass :: Definition ( def) ) => {
51
+ highlight_def ( db, krate, def) | HlMod :: Definition
52
+ }
53
+ Some ( NameClass :: ConstReference ( def) ) => highlight_def ( db, krate, def) ,
51
54
Some ( NameClass :: PatFieldShorthand { field_ref, .. } ) => {
52
55
let mut h = HlTag :: Symbol ( SymbolKind :: Field ) . into ( ) ;
53
56
if let Definition :: Field ( field) = field_ref {
@@ -82,7 +85,7 @@ pub(super) fn element(
82
85
}
83
86
} ;
84
87
85
- let mut h = highlight_def ( db, def) ;
88
+ let mut h = highlight_def ( db, krate , def) ;
86
89
87
90
if let Definition :: Local ( local) = & def {
88
91
if is_consumed_lvalue ( name_ref. syntax ( ) . clone ( ) . into ( ) , local, db) {
@@ -136,9 +139,11 @@ pub(super) fn element(
136
139
let lifetime = element. into_node ( ) . and_then ( ast:: Lifetime :: cast) . unwrap ( ) ;
137
140
138
141
match NameClass :: classify_lifetime ( sema, & lifetime) {
139
- Some ( NameClass :: Definition ( def) ) => highlight_def ( db, def) | HlMod :: Definition ,
142
+ Some ( NameClass :: Definition ( def) ) => {
143
+ highlight_def ( db, krate, def) | HlMod :: Definition
144
+ }
140
145
None => match NameRefClass :: classify_lifetime ( sema, & lifetime) {
141
- Some ( NameRefClass :: Definition ( def) ) => highlight_def ( db, def) ,
146
+ Some ( NameRefClass :: Definition ( def) ) => highlight_def ( db, krate , def) ,
142
147
_ => SymbolKind :: LifetimeParam . into ( ) ,
143
148
} ,
144
149
_ => Highlight :: from ( SymbolKind :: LifetimeParam ) | HlMod :: Definition ,
@@ -277,12 +282,12 @@ pub(super) fn element(
277
282
hash ( ( name, shadow_count) )
278
283
}
279
284
}
280
- fn highlight_def ( db : & RootDatabase , def : Definition ) -> Highlight {
281
- match def {
282
- Definition :: Macro ( _) => HlTag :: Symbol ( SymbolKind :: Macro ) ,
283
- Definition :: Field ( _) => HlTag :: Symbol ( SymbolKind :: Field ) ,
285
+ fn highlight_def ( db : & RootDatabase , krate : Option < hir :: Crate > , def : Definition ) -> Highlight {
286
+ let mut h = match def {
287
+ Definition :: Macro ( _) => Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Macro ) ) ,
288
+ Definition :: Field ( _) => Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Field ) ) ,
284
289
Definition :: ModuleDef ( def) => match def {
285
- hir:: ModuleDef :: Module ( _) => HlTag :: Symbol ( SymbolKind :: Module ) ,
290
+ hir:: ModuleDef :: Module ( _) => Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Module ) ) ,
286
291
hir:: ModuleDef :: Function ( func) => {
287
292
let mut h = Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Function ) ) ;
288
293
if let Some ( item) = func. as_assoc_item ( db) {
@@ -314,14 +319,22 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
314
319
if func. is_async ( db) {
315
320
h |= HlMod :: Async ;
316
321
}
317
- return h;
322
+
323
+ h
318
324
}
319
- hir:: ModuleDef :: Adt ( hir:: Adt :: Struct ( _) ) => HlTag :: Symbol ( SymbolKind :: Struct ) ,
320
- hir:: ModuleDef :: Adt ( hir:: Adt :: Enum ( _) ) => HlTag :: Symbol ( SymbolKind :: Enum ) ,
321
- hir:: ModuleDef :: Adt ( hir:: Adt :: Union ( _) ) => HlTag :: Symbol ( SymbolKind :: Union ) ,
322
- hir:: ModuleDef :: Variant ( _) => HlTag :: Symbol ( SymbolKind :: Variant ) ,
325
+ hir:: ModuleDef :: Adt ( adt) => {
326
+ let h = match adt {
327
+ hir:: Adt :: Struct ( _) => HlTag :: Symbol ( SymbolKind :: Struct ) ,
328
+ hir:: Adt :: Enum ( _) => HlTag :: Symbol ( SymbolKind :: Enum ) ,
329
+ hir:: Adt :: Union ( _) => HlTag :: Symbol ( SymbolKind :: Union ) ,
330
+ } ;
331
+
332
+ Highlight :: new ( h)
333
+ }
334
+ hir:: ModuleDef :: Variant ( _) => Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Variant ) ) ,
323
335
hir:: ModuleDef :: Const ( konst) => {
324
336
let mut h = Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Const ) ) ;
337
+
325
338
if let Some ( item) = konst. as_assoc_item ( db) {
326
339
h |= HlMod :: Associated ;
327
340
match item. container ( db) {
@@ -336,18 +349,20 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
336
349
}
337
350
}
338
351
339
- return h ;
352
+ h
340
353
}
341
354
hir:: ModuleDef :: Trait ( trait_) => {
342
355
let mut h = Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Trait ) ) ;
343
356
344
357
if trait_. is_unsafe ( db) {
345
358
h |= HlMod :: Unsafe ;
346
359
}
347
- return h;
360
+
361
+ h
348
362
}
349
363
hir:: ModuleDef :: TypeAlias ( type_) => {
350
364
let mut h = Highlight :: new ( HlTag :: Symbol ( SymbolKind :: TypeAlias ) ) ;
365
+
351
366
if let Some ( item) = type_. as_assoc_item ( db) {
352
367
h |= HlMod :: Associated ;
353
368
match item. container ( db) {
@@ -361,23 +376,30 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
361
376
}
362
377
}
363
378
}
364
- return h;
379
+
380
+ h
365
381
}
366
- hir:: ModuleDef :: BuiltinType ( _) => HlTag :: BuiltinType ,
382
+ hir:: ModuleDef :: BuiltinType ( _) => Highlight :: new ( HlTag :: BuiltinType ) ,
367
383
hir:: ModuleDef :: Static ( s) => {
368
384
let mut h = Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Static ) ) ;
385
+
369
386
if s. is_mut ( db) {
370
387
h |= HlMod :: Mutable ;
371
388
h |= HlMod :: Unsafe ;
372
389
}
373
- return h;
390
+
391
+ h
374
392
}
375
393
} ,
376
- Definition :: SelfType ( _) => HlTag :: Symbol ( SymbolKind :: Impl ) ,
394
+ Definition :: SelfType ( _) => Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Impl ) ) ,
377
395
Definition :: GenericParam ( it) => match it {
378
- hir:: GenericParam :: TypeParam ( _) => HlTag :: Symbol ( SymbolKind :: TypeParam ) ,
379
- hir:: GenericParam :: ConstParam ( _) => HlTag :: Symbol ( SymbolKind :: ConstParam ) ,
380
- hir:: GenericParam :: LifetimeParam ( _) => HlTag :: Symbol ( SymbolKind :: LifetimeParam ) ,
396
+ hir:: GenericParam :: TypeParam ( _) => Highlight :: new ( HlTag :: Symbol ( SymbolKind :: TypeParam ) ) ,
397
+ hir:: GenericParam :: ConstParam ( _) => {
398
+ Highlight :: new ( HlTag :: Symbol ( SymbolKind :: ConstParam ) )
399
+ }
400
+ hir:: GenericParam :: LifetimeParam ( _) => {
401
+ Highlight :: new ( HlTag :: Symbol ( SymbolKind :: LifetimeParam ) )
402
+ }
381
403
} ,
382
404
Definition :: Local ( local) => {
383
405
let tag = if local. is_self ( db) {
@@ -395,11 +417,19 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
395
417
if ty. as_callable ( db) . is_some ( ) || ty. impls_fnonce ( db) {
396
418
h |= HlMod :: Callable ;
397
419
}
398
- return h ;
420
+ h
399
421
}
400
- Definition :: Label ( _) => HlTag :: Symbol ( SymbolKind :: Label ) ,
422
+ Definition :: Label ( _) => Highlight :: new ( HlTag :: Symbol ( SymbolKind :: Label ) ) ,
423
+ } ;
424
+
425
+ let is_from_other_crate = def. module ( db) . map ( hir:: Module :: krate) != krate;
426
+ let is_builtin_type = matches ! ( def, Definition :: ModuleDef ( hir:: ModuleDef :: BuiltinType ( _) ) ) ;
427
+
428
+ if is_from_other_crate && !is_builtin_type {
429
+ h |= HlMod :: Library ;
401
430
}
402
- . into ( )
431
+
432
+ h
403
433
}
404
434
405
435
fn highlight_func_by_name_ref (
0 commit comments