Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/doc_links.rs')
-rw-r--r--crates/ide/src/doc_links.rs31
1 files changed, 26 insertions, 5 deletions
diff --git a/crates/ide/src/doc_links.rs b/crates/ide/src/doc_links.rs
index fae25f3102..8d86c615d4 100644
--- a/crates/ide/src/doc_links.rs
+++ b/crates/ide/src/doc_links.rs
@@ -12,7 +12,7 @@ use url::Url;
use hir::{db::HirDatabase, Adt, AsAssocItem, AssocItem, AssocItemContainer, HasAttrs};
use ide_db::{
- base_db::{CrateOrigin, LangCrateOrigin, SourceDatabase},
+ base_db::{CrateOrigin, LangCrateOrigin, ReleaseChannel, SourceDatabase},
defs::{Definition, NameClass, NameRefClass},
helpers::pick_best_token,
RootDatabase,
@@ -436,8 +436,9 @@ fn get_doc_base_url(db: &RootDatabase, def: Definition) -> Option<Url> {
let krate = def.krate(db)?;
let display_name = krate.display_name(db)?;
-
- let base = match db.crate_graph()[krate.into()].origin {
+ let crate_data = &db.crate_graph()[krate.into()];
+ let channel = crate_data.channel.map_or("nightly", ReleaseChannel::as_str);
+ let base = match &crate_data.origin {
// std and co do not specify `html_root_url` any longer so we gotta handwrite this ourself.
// FIXME: Use the toolchains channel instead of nightly
CrateOrigin::Lang(
@@ -447,9 +448,14 @@ fn get_doc_base_url(db: &RootDatabase, def: Definition) -> Option<Url> {
| LangCrateOrigin::Std
| LangCrateOrigin::Test),
) => {
- format!("https://doc.rust-lang.org/nightly/{origin}")
+ format!("https://doc.rust-lang.org/{channel}/{origin}")
+ }
+ CrateOrigin::Lang(_) => return None,
+ CrateOrigin::Rustc { name: _ } => {
+ format!("https://doc.rust-lang.org/{channel}/nightly-rustc/")
}
- _ => {
+ CrateOrigin::Local { repo: _, name: _ } => {
+ // FIXME: These should not attempt to link to docs.rs!
krate.get_html_root_url(db).or_else(|| {
let version = krate.version(db);
// Fallback to docs.rs. This uses `display_name` and can never be
@@ -464,6 +470,21 @@ fn get_doc_base_url(db: &RootDatabase, def: Definition) -> Option<Url> {
))
})?
}
+ CrateOrigin::Library { repo: _, name } => {
+ krate.get_html_root_url(db).or_else(|| {
+ let version = krate.version(db);
+ // Fallback to docs.rs. This uses `display_name` and can never be
+ // correct, but that's what fallbacks are about.
+ //
+ // FIXME: clicking on the link should just open the file in the editor,
+ // instead of falling back to external urls.
+ Some(format!(
+ "https://docs.rs/{krate}/{version}/",
+ krate = name,
+ version = version.as_deref().unwrap_or("*")
+ ))
+ })?
+ }
};
Url::parse(&base).ok()?.join(&format!("{display_name}/")).ok()
}