Skip to content

Commit

Permalink
Don't report disambiguator error if link would have been ignored
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
camelid committed Apr 4, 2021
1 parent 8ad6a44 commit 45ccd50
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 4 deletions.
28 changes: 24 additions & 4 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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 {
Expand Down
6 changes: 6 additions & 0 deletions src/test/rustdoc-ui/intra-doc/email-address-localhost.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#![deny(warnings)]

//! Email me at <hello@localhost>.
//~^ ERROR unknown disambiguator `hello`

//! This should *not* warn: <hello@example.com>.
15 changes: 15 additions & 0 deletions src/test/rustdoc-ui/intra-doc/email-address-localhost.stderr
Original file line number Diff line number Diff line change
@@ -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 changes: 6 additions & 0 deletions src/test/rustdoc/intra-doc/email-address.rs
Original file line number Diff line number Diff line change
@@ -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'

0 comments on commit 45ccd50

Please sign in to comment.