@@ -5,14 +5,15 @@ use std::fmt;
5
5
use arrayvec:: ArrayVec ;
6
6
use either:: Either ;
7
7
use hir:: {
8
- AssocItem , FieldSource , HasContainer , HasCrate , HasSource , HirDisplay , HirFileId , InFile ,
9
- LocalSource , ModuleSource , db:: ExpandDatabase , symbols:: FileSymbol ,
8
+ AssocItem , Crate , FieldSource , HasContainer , HasCrate , HasSource , HirDisplay , HirFileId ,
9
+ InFile , LocalSource , ModuleSource , Semantics , db:: ExpandDatabase , symbols:: FileSymbol ,
10
10
} ;
11
11
use ide_db:: {
12
12
FileId , FileRange , RootDatabase , SymbolKind ,
13
- base_db:: salsa,
14
- defs:: Definition ,
13
+ base_db:: { CrateOrigin , LangCrateOrigin , RootQueryDb , salsa} ,
14
+ defs:: { Definition , find_std_module } ,
15
15
documentation:: { Documentation , HasDocs } ,
16
+ famous_defs:: FamousDefs ,
16
17
} ;
17
18
use span:: Edition ;
18
19
use stdx:: never;
@@ -262,8 +263,8 @@ impl TryToNav for Definition {
262
263
Definition :: TypeAlias ( it) => it. try_to_nav ( db) ,
263
264
Definition :: ExternCrateDecl ( it) => it. try_to_nav ( db) ,
264
265
Definition :: InlineAsmOperand ( it) => it. try_to_nav ( db) ,
266
+ Definition :: BuiltinType ( it) => it. try_to_nav ( db) ,
265
267
Definition :: BuiltinLifetime ( _)
266
- | Definition :: BuiltinType ( _)
267
268
| Definition :: TupleField ( _)
268
269
| Definition :: ToolModule ( _)
269
270
| Definition :: InlineAsmRegOrRegClass ( _)
@@ -746,6 +747,26 @@ impl TryToNav for hir::InlineAsmOperand {
746
747
}
747
748
}
748
749
750
+ impl TryToNav for hir:: BuiltinType {
751
+ fn try_to_nav ( & self , db : & RootDatabase ) -> Option < UpmappingResult < NavigationTarget > > {
752
+ let sema = Semantics :: new ( db) ;
753
+
754
+ let krate = db
755
+ . all_crates ( )
756
+ . iter ( )
757
+ . copied ( )
758
+ . find ( |& krate| matches ! ( krate. data( db) . origin, CrateOrigin :: Lang ( LangCrateOrigin :: Std ) ) )
759
+ . map ( Crate :: from) ?;
760
+ let edition = krate. edition ( db) ;
761
+
762
+ let fd = FamousDefs ( & sema, krate) ;
763
+ let primitive_mod = format ! ( "prim_{}" , self . name( ) . display( fd. 0 . db, edition) ) ;
764
+ let doc_owner = find_std_module ( & fd, & primitive_mod, edition) ?;
765
+
766
+ Some ( doc_owner. to_nav ( db) )
767
+ }
768
+ }
769
+
749
770
#[ derive( Debug ) ]
750
771
pub struct UpmappingResult < T > {
751
772
/// The macro call site.
0 commit comments