Fix handling of disambiguator suffixes for intra-doc links
This commit is contained in:
parent
6a5b97adb4
commit
4cd5affcf2
1 changed files with 10 additions and 27 deletions
|
@ -951,9 +951,9 @@ fn preprocess_link<'a>(
|
|||
}
|
||||
|
||||
// Parse and strip the disambiguator from the link, if present.
|
||||
let (path_str, disambiguator) = match Disambiguator::from_str(&link) {
|
||||
Ok(Some((d, path))) => (path.trim(), Some(d)),
|
||||
Ok(None) => (link.trim(), None),
|
||||
let (link_text, path_str, disambiguator) = match Disambiguator::from_str(&link) {
|
||||
Ok(Some((d, path, link_text))) => (link_text.trim(), path.trim(), Some(d)),
|
||||
Ok(None) => (link.trim(), link.trim(), None),
|
||||
Err((err_msg, relative_range)) => {
|
||||
// Only report error if we would not have ignored this link. See issue #83859.
|
||||
if !should_ignore_link_with_disambiguators(link) {
|
||||
|
@ -971,11 +971,6 @@ fn preprocess_link<'a>(
|
|||
return None;
|
||||
}
|
||||
|
||||
// We stripped `()` and `!` when parsing the disambiguator.
|
||||
// Add them back to be displayed, but not prefix disambiguators.
|
||||
let link_text =
|
||||
disambiguator.map(|d| d.display_for(path_str)).unwrap_or_else(|| path_str.to_owned());
|
||||
|
||||
// Strip generics from the path.
|
||||
let path_str = if path_str.contains(['<', '>'].as_slice()) {
|
||||
match strip_generics_from_path(&path_str) {
|
||||
|
@ -1005,7 +1000,7 @@ fn preprocess_link<'a>(
|
|||
path_str,
|
||||
disambiguator,
|
||||
extra_fragment: extra_fragment.map(String::from),
|
||||
link_text,
|
||||
link_text: link_text.to_owned(),
|
||||
}))
|
||||
}
|
||||
|
||||
|
@ -1513,24 +1508,12 @@ enum Disambiguator {
|
|||
}
|
||||
|
||||
impl Disambiguator {
|
||||
/// The text that should be displayed when the path is rendered as HTML.
|
||||
///
|
||||
/// NOTE: `path` is not the original link given by the user, but a name suitable for passing to `resolve`.
|
||||
fn display_for(&self, path: &str) -> String {
|
||||
match self {
|
||||
// FIXME: this will have different output if the user had `m!()` originally.
|
||||
Self::Kind(DefKind::Macro(MacroKind::Bang)) => format!("{}!", path),
|
||||
Self::Kind(DefKind::Fn) => format!("{}()", path),
|
||||
_ => path.to_owned(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Given a link, parse and return `(disambiguator, path_str)`.
|
||||
/// Given a link, parse and return `(disambiguator, path_str, link_text)`.
|
||||
///
|
||||
/// This returns `Ok(Some(...))` if a disambiguator was found,
|
||||
/// `Ok(None)` if no disambiguator was found, or `Err(...)`
|
||||
/// if there was a problem with the disambiguator.
|
||||
fn from_str(link: &str) -> Result<Option<(Self, &str)>, (String, Range<usize>)> {
|
||||
fn from_str(link: &str) -> Result<Option<(Self, &str, &str)>, (String, Range<usize>)> {
|
||||
use Disambiguator::{Kind, Namespace as NS, Primitive};
|
||||
|
||||
if let Some(idx) = link.find('@') {
|
||||
|
@ -1551,7 +1534,7 @@ impl Disambiguator {
|
|||
"prim" | "primitive" => Primitive,
|
||||
_ => return Err((format!("unknown disambiguator `{}`", prefix), 0..idx)),
|
||||
};
|
||||
Ok(Some((d, &rest[1..])))
|
||||
Ok(Some((d, &rest[1..], &rest[1..])))
|
||||
} else {
|
||||
let suffixes = [
|
||||
("!()", DefKind::Macro(MacroKind::Bang)),
|
||||
|
@ -1559,10 +1542,10 @@ impl Disambiguator {
|
|||
("!", DefKind::Macro(MacroKind::Bang)),
|
||||
];
|
||||
for (suffix, kind) in suffixes {
|
||||
if let Some(link) = link.strip_suffix(suffix) {
|
||||
if let Some(path_str) = link.strip_suffix(suffix) {
|
||||
// Avoid turning `!` or `()` into an empty string
|
||||
if !link.is_empty() {
|
||||
return Ok(Some((Kind(kind), link)));
|
||||
if !path_str.is_empty() {
|
||||
return Ok(Some((Kind(kind), path_str, link)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue