Skip to content

Commit

Permalink
Rollup merge of rust-lang#83865 - camelid:disamb-err-fix, r=jyn514
Browse files Browse the repository at this point in the history
Don't report disambiguator error if link would have been ignored

Fixes rust-lang#83859.

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.

r? ```@jyn514```
  • Loading branch information
Joshua Nelson authored Apr 5, 2021
2 parents 3880665 + 45ccd50 commit baaa85a
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 @@ -945,14 +945,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 @@ -1482,6 +1486,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 baaa85a

Please sign in to comment.