@@ -3,7 +3,7 @@ use std::{env, mem, ops::Not};
3
3
4
4
use either:: Either ;
5
5
use hir:: {
6
- db:: ExpandDatabase , Adt , AsAssocItem , AsExternAssocItem , AssocItemContainer , CaptureKind ,
6
+ db:: ExpandDatabase , Adt , AsAssocItem , AsExternAssocItem , CaptureKind ,
7
7
DynCompatibilityViolation , HasCrate , HasSource , HirDisplay , Layout , LayoutError ,
8
8
MethodViolationCode , Name , Semantics , Symbol , Trait , Type , TypeInfo , VariantDef ,
9
9
} ;
@@ -376,7 +376,7 @@ pub(super) fn process_markup(
376
376
Markup :: from ( markup)
377
377
}
378
378
379
- fn definition_owner_name ( db : & RootDatabase , def : & Definition , edition : Edition ) -> Option < String > {
379
+ fn definition_owner_name ( db : & RootDatabase , def : Definition , edition : Edition ) -> Option < String > {
380
380
match def {
381
381
Definition :: Field ( f) => {
382
382
let parent = f. parent_def ( db) ;
@@ -390,9 +390,52 @@ fn definition_owner_name(db: &RootDatabase, def: &Definition, edition: Edition)
390
390
_ => Some ( parent_name) ,
391
391
} ;
392
392
}
393
- Definition :: Local ( l) => l. parent ( db) . name ( db) ,
394
393
Definition :: Variant ( e) => Some ( e. parent_enum ( db) . name ( db) ) ,
395
-
394
+ Definition :: GenericParam ( generic_param) => match generic_param. parent ( ) {
395
+ hir:: GenericDef :: Adt ( it) => Some ( it. name ( db) ) ,
396
+ hir:: GenericDef :: Trait ( it) => Some ( it. name ( db) ) ,
397
+ hir:: GenericDef :: TraitAlias ( it) => Some ( it. name ( db) ) ,
398
+ hir:: GenericDef :: TypeAlias ( it) => Some ( it. name ( db) ) ,
399
+
400
+ hir:: GenericDef :: Impl ( i) => i. self_ty ( db) . as_adt ( ) . map ( |adt| adt. name ( db) ) ,
401
+ hir:: GenericDef :: Function ( it) => {
402
+ let container = it. as_assoc_item ( db) . and_then ( |assoc| match assoc. container ( db) {
403
+ hir:: AssocItemContainer :: Trait ( t) => Some ( t. name ( db) ) ,
404
+ hir:: AssocItemContainer :: Impl ( i) => {
405
+ i. self_ty ( db) . as_adt ( ) . map ( |adt| adt. name ( db) )
406
+ }
407
+ } ) ;
408
+ match container {
409
+ Some ( name) => {
410
+ return Some ( format ! (
411
+ "{}::{}" ,
412
+ name. display( db, edition) ,
413
+ it. name( db) . display( db, edition)
414
+ ) )
415
+ }
416
+ None => Some ( it. name ( db) ) ,
417
+ }
418
+ }
419
+ hir:: GenericDef :: Const ( it) => {
420
+ let container = it. as_assoc_item ( db) . and_then ( |assoc| match assoc. container ( db) {
421
+ hir:: AssocItemContainer :: Trait ( t) => Some ( t. name ( db) ) ,
422
+ hir:: AssocItemContainer :: Impl ( i) => {
423
+ i. self_ty ( db) . as_adt ( ) . map ( |adt| adt. name ( db) )
424
+ }
425
+ } ) ;
426
+ match container {
427
+ Some ( name) => {
428
+ return Some ( format ! (
429
+ "{}::{}" ,
430
+ name. display( db, edition) ,
431
+ it. name( db) ?. display( db, edition)
432
+ ) )
433
+ }
434
+ None => it. name ( db) ,
435
+ }
436
+ }
437
+ } ,
438
+ Definition :: DeriveHelper ( derive_helper) => Some ( derive_helper. derive ( ) . name ( db) ) ,
396
439
d => {
397
440
if let Some ( assoc_item) = d. as_assoc_item ( db) {
398
441
match assoc_item. container ( db) {
@@ -436,7 +479,7 @@ pub(super) fn definition(
436
479
config : & HoverConfig ,
437
480
edition : Edition ,
438
481
) -> Markup {
439
- let mod_path = definition_mod_path ( db, & def, edition) ;
482
+ let mod_path = definition_path ( db, & def, edition) ;
440
483
let label = match def {
441
484
Definition :: Trait ( trait_) => {
442
485
trait_. display_limited ( db, config. max_trait_assoc_items_count , edition) . to_string ( )
@@ -915,19 +958,22 @@ fn closure_ty(
915
958
Some ( res)
916
959
}
917
960
918
- fn definition_mod_path ( db : & RootDatabase , def : & Definition , edition : Edition ) -> Option < String > {
919
- if matches ! ( def, Definition :: GenericParam ( _) | Definition :: Local ( _) | Definition :: Label ( _) ) {
961
+ fn definition_path ( db : & RootDatabase , & def: & Definition , edition : Edition ) -> Option < String > {
962
+ if matches ! (
963
+ def,
964
+ Definition :: TupleField ( _)
965
+ | Definition :: Label ( _)
966
+ | Definition :: Local ( _)
967
+ | Definition :: BuiltinAttr ( _)
968
+ | Definition :: BuiltinLifetime ( _)
969
+ | Definition :: BuiltinType ( _)
970
+ | Definition :: InlineAsmRegOrRegClass ( _)
971
+ | Definition :: InlineAsmOperand ( _)
972
+ ) {
920
973
return None ;
921
974
}
922
- let container: Option < Definition > =
923
- def. as_assoc_item ( db) . and_then ( |assoc| match assoc. container ( db) {
924
- AssocItemContainer :: Trait ( trait_) => Some ( trait_. into ( ) ) ,
925
- AssocItemContainer :: Impl ( impl_) => impl_. self_ty ( db) . as_adt ( ) . map ( |adt| adt. into ( ) ) ,
926
- } ) ;
927
- container
928
- . unwrap_or ( * def)
929
- . module ( db)
930
- . map ( |module| path ( db, module, definition_owner_name ( db, def, edition) , edition) )
975
+ let rendered_parent = definition_owner_name ( db, def, edition) ;
976
+ def. module ( db) . map ( |module| path ( db, module, rendered_parent, edition) )
931
977
}
932
978
933
979
fn markup (
0 commit comments