Fix opening module documentation opening parent documentation instead

The whole path/URL joining code is kind of ugly which is what led to
this, but at the same time I don't really want to rewrite it right
now...
This commit is contained in:
Zac Pullar-Strecker 2020-10-22 17:31:25 +13:00
parent 9eb6cbb80b
commit 68c67efa68

View file

@ -132,7 +132,8 @@ fn get_doc_link(db: &RootDatabase, definition: Definition) -> Option<String> {
let import_map = db.import_map(krate.into()); let import_map = db.import_map(krate.into());
let base = once(krate.display_name(db)?.to_string()) let base = once(krate.display_name(db)?.to_string())
.chain(import_map.path_of(ns)?.segments.iter().map(|name| name.to_string())) .chain(import_map.path_of(ns)?.segments.iter().map(|name| name.to_string()))
.join("/"); .join("/")
+ "/";
let filename = get_symbol_filename(db, &target_def); let filename = get_symbol_filename(db, &target_def);
let fragment = match definition { let fragment = match definition {
@ -152,9 +153,16 @@ fn get_doc_link(db: &RootDatabase, definition: Definition) -> Option<String> {
_ => None, _ => None,
}; };
get_doc_url(db, &krate) get_doc_url(db, &krate)?
.and_then(|url| url.join(&base).ok()) .join(&base)
.and_then(|url| filename.as_deref().and_then(|f| url.join(f).ok())) .ok()
.and_then(|mut url| {
if !matches!(definition, Definition::ModuleDef(ModuleDef::Module(..))) {
url.path_segments_mut().ok()?.pop();
};
Some(url)
})
.and_then(|url| url.join(filename.as_deref()?).ok())
.and_then( .and_then(
|url| if let Some(fragment) = fragment { url.join(&fragment).ok() } else { Some(url) }, |url| if let Some(fragment) = fragment { url.join(&fragment).ok() } else { Some(url) },
) )
@ -522,6 +530,18 @@ pub struct Foo {
); );
} }
#[test]
fn test_module() {
check(
r#"
pub mod foo {
pub mod ba<|>r {}
}
"#,
expect![[r#"https://docs.rs/test/*/test/foo/bar/index.html"#]],
)
}
// FIXME: ImportMap will return re-export paths instead of public module // FIXME: ImportMap will return re-export paths instead of public module
// paths. The correct path to documentation will never be a re-export. // paths. The correct path to documentation will never be a re-export.
// This problem stops us from resolving stdlib items included in the prelude // This problem stops us from resolving stdlib items included in the prelude