Skip to content

Commit a35687f

Browse files
committed
Minor cleanups
1 parent cb7b4a5 commit a35687f

File tree

1 file changed

+50
-54
lines changed

1 file changed

+50
-54
lines changed

crates/ide/src/doc_links.rs

Lines changed: 50 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -255,35 +255,21 @@ fn get_doc_link(db: &RootDatabase, definition: Definition) -> Option<String> {
255255
};
256256
(def, Some(format!("structfield.{}", field.name(db))))
257257
}
258-
Definition::Macro(_) => todo!(),
259-
Definition::SelfType(_) => todo!(),
258+
// FIXME macros
259+
Definition::Macro(_) => return None,
260+
// FIXME impls
261+
Definition::SelfType(_) => return None,
260262
Definition::Local(_) | Definition::GenericParam(_) | Definition::Label(_) => return None,
261263
};
262264

263-
let krate = match definition {
264-
// Definition::module gives back the parent module, we don't want that as it fails for root modules
265-
Definition::ModuleDef(ModuleDef::Module(module)) => module.krate(),
266-
_ => definition.module(db)?.krate(),
267-
};
265+
let krate = crate_of_def(db, target)?;
266+
let mut url = get_doc_base_url(db, &krate)?;
268267

269-
let mut base = krate.display_name(db)?.to_string();
270-
let is_non_root_module = !matches!(
271-
definition,
272-
Definition::ModuleDef(ModuleDef::Module(module)) if krate.root_module(db) == module
273-
);
274-
if is_non_root_module {
275-
target
276-
.canonical_module_path(db)?
277-
.flat_map(|it| it.name(db))
278-
.for_each(|name| format_to!(base, "/{}", name));
268+
if let Some(path) = mod_path_of_def(db, target) {
269+
url = url.join(&path).ok()?;
279270
}
280-
base += "/";
281271

282-
let mut url = get_doc_base_url(db, &krate)?
283-
.join(&base)
284-
.ok()?
285-
.join(&get_symbol_filename(db, &target)?)
286-
.ok()?;
272+
url = url.join(&get_symbol_filename(db, &target)?).ok()?;
287273
url.set_fragment(frag.as_deref());
288274

289275
Some(url.into())
@@ -296,31 +282,29 @@ fn rewrite_intra_doc_link(
296282
title: &str,
297283
) -> Option<(String, String)> {
298284
let (link, ns) = parse_intra_doc_link(target);
285+
299286
let resolved = resolve_doc_path_for_def(db, def, link, ns)?;
300-
let krate = resolved.module(db)?.krate();
301-
let mut mod_path = String::new();
302-
resolved
303-
.canonical_module_path(db)?
304-
.flat_map(|it| it.name(db))
305-
.for_each(|name| format_to!(mod_path, "{}/", name));
306-
let mut new_url = get_doc_base_url(db, &krate)?
307-
.join(&format!("{}/", krate.display_name(db)?))
308-
.ok()?
309-
.join(&mod_path)
310-
.ok()?;
311-
if let Some(assoc_item) = resolved.as_assoc_item(db) {
287+
let krate = crate_of_def(db, resolved)?;
288+
let mut url = get_doc_base_url(db, &krate)?;
289+
290+
if let Some(path) = mod_path_of_def(db, resolved) {
291+
url = url.join(&path).ok()?;
292+
}
293+
294+
let (resolved, frag) = if let Some(assoc_item) = resolved.as_assoc_item(db) {
312295
let resolved = match assoc_item.container(db) {
313296
AssocItemContainer::Trait(t) => t.into(),
314297
AssocItemContainer::Impl(i) => i.self_ty(db).as_adt()?.into(),
315298
};
316-
new_url = new_url.join(&get_symbol_filename(db, &resolved)?).ok()?;
317299
let frag = get_assoc_item_fragment(db, assoc_item)?;
318-
new_url.set_fragment(Some(&frag));
300+
(resolved, Some(frag))
319301
} else {
320-
new_url = new_url.join(&get_symbol_filename(db, &resolved)?).ok()?;
302+
(resolved, None)
321303
};
304+
url = url.join(&get_symbol_filename(db, &resolved)?).ok()?;
305+
url.set_fragment(frag.as_deref());
322306

323-
Some((new_url.into(), strip_prefixes_suffixes(title).to_string()))
307+
Some((url.into(), strip_prefixes_suffixes(title).to_string()))
324308
}
325309

326310
/// Try to resolve path to local documentation via path-based links (i.e. `../gateway/struct.Shard.html`).
@@ -329,21 +313,32 @@ fn rewrite_url_link(db: &RootDatabase, def: ModuleDef, target: &str) -> Option<S
329313
return None;
330314
}
331315

332-
let module = def.module(db)?;
333-
let krate = module.krate();
334-
let mut base = krate.display_name(db)?.to_string();
335-
let is_non_root_module = !matches!(
336-
def,
337-
ModuleDef::Module(module) if krate.root_module(db) == module
338-
);
339-
if is_non_root_module {
340-
def.canonical_module_path(db)?
341-
.flat_map(|it| it.name(db))
342-
.for_each(|name| format_to!(base, "/{}", name));
316+
let krate = crate_of_def(db, def)?;
317+
let mut url = get_doc_base_url(db, &krate)?;
318+
319+
if let Some(path) = mod_path_of_def(db, def) {
320+
url = url.join(&path).ok()?;
343321
}
344-
base += "/";
345322

346-
get_doc_base_url(db, &krate)?.join(&base).ok()?.join(target).ok().map(Into::into)
323+
url = url.join(&get_symbol_filename(db, &def)?).ok()?;
324+
url.join(target).ok().map(Into::into)
325+
}
326+
327+
fn crate_of_def(db: &RootDatabase, def: ModuleDef) -> Option<Crate> {
328+
let krate = match def {
329+
// Definition::module gives back the parent module, we don't want that as it fails for root modules
330+
ModuleDef::Module(module) => module.krate(),
331+
_ => def.module(db)?.krate(),
332+
};
333+
Some(krate)
334+
}
335+
336+
fn mod_path_of_def(db: &RootDatabase, def: ModuleDef) -> Option<String> {
337+
def.canonical_module_path(db).map(|it| {
338+
let mut path = String::new();
339+
it.flat_map(|it| it.name(db)).for_each(|name| format_to!(path, "{}/", name));
340+
path
341+
})
347342
}
348343

349344
/// Rewrites a markdown document, applying 'callback' to each link.
@@ -389,6 +384,7 @@ fn map_links<'e>(
389384
/// ^^^^^^^^^^^^^^^^^^^^^^^^^^
390385
/// ```
391386
fn get_doc_base_url(db: &RootDatabase, krate: &Crate) -> Option<Url> {
387+
let display_name = krate.display_name(db)?;
392388
krate
393389
.get_html_root_url(db)
394390
.or_else(|| {
@@ -397,9 +393,9 @@ fn get_doc_base_url(db: &RootDatabase, krate: &Crate) -> Option<Url> {
397393
//
398394
// FIXME: clicking on the link should just open the file in the editor,
399395
// instead of falling back to external urls.
400-
Some(format!("https://docs.rs/{}/*/", krate.display_name(db)?))
396+
Some(format!("https://docs.rs/{krate}/*/", krate = display_name))
401397
})
402-
.and_then(|s| Url::parse(&s).ok())
398+
.and_then(|s| Url::parse(&s).ok()?.join(&format!("{}/", display_name)).ok())
403399
}
404400

405401
/// Get the filename and extension generated for a symbol by rustdoc.

0 commit comments

Comments
 (0)