@@ -5,14 +5,15 @@ use std::fmt;
55use arrayvec:: ArrayVec ;
66use either:: Either ;
77use 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 ,
1010} ;
1111use ide_db:: {
1212 FileId , FileRange , RootDatabase , SymbolKind ,
13- base_db:: salsa,
14- defs:: Definition ,
13+ base_db:: { CrateOrigin , LangCrateOrigin , RootQueryDb , salsa} ,
14+ defs:: { Definition , find_std_module } ,
1515 documentation:: { Documentation , HasDocs } ,
16+ famous_defs:: FamousDefs ,
1617} ;
1718use span:: Edition ;
1819use stdx:: never;
@@ -262,8 +263,8 @@ impl TryToNav for Definition {
262263 Definition :: TypeAlias ( it) => it. try_to_nav ( db) ,
263264 Definition :: ExternCrateDecl ( it) => it. try_to_nav ( db) ,
264265 Definition :: InlineAsmOperand ( it) => it. try_to_nav ( db) ,
266+ Definition :: BuiltinType ( it) => it. try_to_nav ( db) ,
265267 Definition :: BuiltinLifetime ( _)
266- | Definition :: BuiltinType ( _)
267268 | Definition :: TupleField ( _)
268269 | Definition :: ToolModule ( _)
269270 | Definition :: InlineAsmRegOrRegClass ( _)
@@ -746,6 +747,26 @@ impl TryToNav for hir::InlineAsmOperand {
746747 }
747748}
748749
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+
749770#[ derive( Debug ) ]
750771pub struct UpmappingResult < T > {
751772 /// The macro call site.
0 commit comments