Don't report disambiguator error if link would have been ignored
This prevents us from warning on links such as `<hello@example.com>`. Note that we still warn on links such as `<hello@localhost>` because they have no dots in them. However, the links will still work, even though a warning is reported.
This commit is contained in:
parent
8ad6a443cf
commit
45ccd50d0e
@ -978,14 +978,18 @@ impl LinkCollector<'_, '_> {
|
||||
Ok(Some((d, path))) => (path.trim(), Some(d)),
|
||||
Ok(None) => (link.trim(), None),
|
||||
Err((err_msg, relative_range)) => {
|
||||
let disambiguator_range = (no_backticks_range.start + relative_range.start)
|
||||
..(no_backticks_range.start + relative_range.end);
|
||||
disambiguator_error(self.cx, &item, dox, disambiguator_range, &err_msg);
|
||||
if !should_ignore_link_with_disambiguators(link) {
|
||||
// Only report error if we would not have ignored this link.
|
||||
// See issue #83859.
|
||||
let disambiguator_range = (no_backticks_range.start + relative_range.start)
|
||||
..(no_backticks_range.start + relative_range.end);
|
||||
disambiguator_error(self.cx, &item, dox, disambiguator_range, &err_msg);
|
||||
}
|
||||
return None;
|
||||
}
|
||||
};
|
||||
|
||||
if path_str.contains(|ch: char| !(ch.is_alphanumeric() || ":_<>, !*&;".contains(ch))) {
|
||||
if should_ignore_link(path_str) {
|
||||
return None;
|
||||
}
|
||||
|
||||
@ -1515,6 +1519,22 @@ fn range_between_backticks(ori_link: &MarkdownLink) -> Range<usize> {
|
||||
..(ori_link.range.start + before_second_backtick_group)
|
||||
}
|
||||
|
||||
/// Returns true if we should ignore `link` due to it being unlikely
|
||||
/// that it is an intra-doc link. `link` should still have disambiguators
|
||||
/// if there were any.
|
||||
///
|
||||
/// The difference between this and [`should_ignore_link()`] is that this
|
||||
/// check should only be used on links that still have disambiguators.
|
||||
fn should_ignore_link_with_disambiguators(link: &str) -> bool {
|
||||
link.contains(|ch: char| !(ch.is_alphanumeric() || ":_<>, !*&;@()".contains(ch)))
|
||||
}
|
||||
|
||||
/// Returns true if we should ignore `path_str` due to it being unlikely
|
||||
/// that it is an intra-doc link.
|
||||
fn should_ignore_link(path_str: &str) -> bool {
|
||||
path_str.contains(|ch: char| !(ch.is_alphanumeric() || ":_<>, !*&;".contains(ch)))
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
|
||||
/// Disambiguators for a link.
|
||||
crate enum Disambiguator {
|
||||
|
6
src/test/rustdoc-ui/intra-doc/email-address-localhost.rs
Normal file
6
src/test/rustdoc-ui/intra-doc/email-address-localhost.rs
Normal file
@ -0,0 +1,6 @@
|
||||
#![deny(warnings)]
|
||||
|
||||
//! Email me at <hello@localhost>.
|
||||
//~^ ERROR unknown disambiguator `hello`
|
||||
|
||||
//! This should *not* warn: <hello@example.com>.
|
15
src/test/rustdoc-ui/intra-doc/email-address-localhost.stderr
Normal file
15
src/test/rustdoc-ui/intra-doc/email-address-localhost.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error: unknown disambiguator `hello`
|
||||
--> $DIR/email-address-localhost.rs:3:18
|
||||
|
|
||||
LL | //! Email me at <hello@localhost>.
|
||||
| ^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/email-address-localhost.rs:1:9
|
||||
|
|
||||
LL | #![deny(warnings)]
|
||||
| ^^^^^^^^
|
||||
= note: `#[deny(rustdoc::broken_intra_doc_links)]` implied by `#[deny(warnings)]`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
6
src/test/rustdoc/intra-doc/email-address.rs
Normal file
6
src/test/rustdoc/intra-doc/email-address.rs
Normal file
@ -0,0 +1,6 @@
|
||||
//! Email me at <hello@example.com>.
|
||||
//! Email me at <hello-world@example.com>.
|
||||
//! Email me at <hello@localhost> (this warns but will still become a link).
|
||||
// @has email_address/index.html '//a[@href="mailto:hello@example.com"]' 'hello@example.com'
|
||||
// @has email_address/index.html '//a[@href="mailto:hello-world@example.com"]' 'hello-world@example.com'
|
||||
// @has email_address/index.html '//a[@href="mailto:hello@localhost"]' 'hello@localhost'
|
Loading…
x
Reference in New Issue
Block a user