@@ -10,7 +10,7 @@ use pulldown_cmark_to_cmark::{cmark_resume_with_options, Options as CMarkOptions
1010use stdx:: format_to;
1111use url:: Url ;
1212
13- use hir:: { db:: HirDatabase , Adt , AsAssocItem , AssocItem , AssocItemContainer , Crate , HasAttrs } ;
13+ use hir:: { db:: HirDatabase , Adt , AsAssocItem , AssocItem , AssocItemContainer , HasAttrs } ;
1414use ide_db:: {
1515 base_db:: { CrateOrigin , LangCrateOrigin , SourceDatabase } ,
1616 defs:: { Definition , NameClass , NameRefClass } ,
@@ -293,8 +293,7 @@ fn broken_link_clone_cb<'a>(link: BrokenLink<'a>) -> Option<(CowStr<'a>, CowStr<
293293fn get_doc_link ( db : & RootDatabase , def : Definition ) -> Option < String > {
294294 let ( target, file, frag) = filename_and_frag_for_def ( db, def) ?;
295295
296- let krate = target. krate ( db) ?;
297- let mut url = get_doc_base_url ( db, krate) ?;
296+ let mut url = get_doc_base_url ( db, target) ?;
298297
299298 if let Some ( path) = mod_path_of_def ( db, target) {
300299 url = url. join ( & path) . ok ( ) ?;
@@ -315,8 +314,7 @@ fn rewrite_intra_doc_link(
315314 let ( link, ns) = parse_intra_doc_link ( target) ;
316315
317316 let resolved = resolve_doc_path_for_def ( db, def, link, ns) ?;
318- let krate = resolved. krate ( db) ?;
319- let mut url = get_doc_base_url ( db, krate) ?;
317+ let mut url = get_doc_base_url ( db, resolved) ?;
320318
321319 let ( _, file, frag) = filename_and_frag_for_def ( db, resolved) ?;
322320 if let Some ( path) = mod_path_of_def ( db, resolved) {
@@ -335,8 +333,7 @@ fn rewrite_url_link(db: &RootDatabase, def: Definition, target: &str) -> Option<
335333 return None ;
336334 }
337335
338- let krate = def. krate ( db) ?;
339- let mut url = get_doc_base_url ( db, krate) ?;
336+ let mut url = get_doc_base_url ( db, def) ?;
340337 let ( def, file, frag) = filename_and_frag_for_def ( db, def) ?;
341338
342339 if let Some ( path) = mod_path_of_def ( db, def) {
@@ -401,13 +398,20 @@ fn map_links<'e>(
401398 } )
402399}
403400
404- /// Get the root URL for the documentation of a crate .
401+ /// Get the root URL for the documentation of a definition .
405402///
406403/// ```ignore
407404/// https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.next
408405/// ^^^^^^^^^^^^^^^^^^^^^^^^^^
409406/// ```
410- fn get_doc_base_url ( db : & RootDatabase , krate : Crate ) -> Option < Url > {
407+ fn get_doc_base_url ( db : & RootDatabase , def : Definition ) -> Option < Url > {
408+ // special case base url of `BuiltinType` to core
409+ // https://github.com/rust-lang/rust-analyzer/issues/12250
410+ if let Definition :: BuiltinType ( ..) = def {
411+ return Url :: parse ( "https://doc.rust-lang.org/nightly/core/" ) . ok ( ) ;
412+ } ;
413+
414+ let krate = def. krate ( db) ?;
411415 let display_name = krate. display_name ( db) ?;
412416
413417 let base = match db. crate_graph ( ) [ krate. into ( ) ] . origin {
0 commit comments