Rollup merge of #74188 - estebank:tweak-ascription-typo-heuristic, r=petrochenkov
Tweak `::` -> `:` typo heuristic and reduce verbosity Do not trigger on correct type ascription expressions with trailing operators and _do_ trigger on likely path typos where a turbofish is used. On likely path typos, remove note explaining type ascription. Clean up indentation. r? @petrochenkov
This commit is contained in:
commit
9353e21bfd
@ -346,13 +346,16 @@ impl<'a> Parser<'a> {
|
||||
if allow_unstable {
|
||||
// Give extra information about type ascription only if it's a nightly compiler.
|
||||
err.note(
|
||||
"`#![feature(type_ascription)]` lets you annotate an expression with a \
|
||||
type: `<expr>: <type>`",
|
||||
);
|
||||
err.note(
|
||||
"see issue #23416 <https://github.com/rust-lang/rust/issues/23416> \
|
||||
for more information",
|
||||
"`#![feature(type_ascription)]` lets you annotate an expression with a type: \
|
||||
`<expr>: <type>`",
|
||||
);
|
||||
if !likely_path {
|
||||
// Avoid giving too much info when it was likely an unrelated typo.
|
||||
err.note(
|
||||
"see issue #23416 <https://github.com/rust-lang/rust/issues/23416> \
|
||||
for more information",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1161,8 +1164,10 @@ impl<'a> Parser<'a> {
|
||||
} &&
|
||||
!self.token.is_reserved_ident() && // v `foo:bar(baz)`
|
||||
self.look_ahead(1, |t| t == &token::OpenDelim(token::Paren))
|
||||
|| self.look_ahead(1, |t| t == &token::Lt) && // `foo:bar<baz`
|
||||
self.look_ahead(2, |t| t.is_ident())
|
||||
|| self.look_ahead(1, |t| t == &token::OpenDelim(token::Brace)) // `foo:bar {`
|
||||
|| self.look_ahead(1, |t| t == &token::Colon) && // `foo:bar::<baz`
|
||||
self.look_ahead(2, |t| t == &token::Lt) &&
|
||||
self.look_ahead(3, |t| t.is_ident())
|
||||
|| self.look_ahead(1, |t| t == &token::Colon) && // `foo:bar:baz`
|
||||
self.look_ahead(2, |t| t.is_ident())
|
||||
|| self.look_ahead(1, |t| t == &token::ModSep)
|
||||
|
@ -898,44 +898,42 @@ impl<'a> Resolver<'a> {
|
||||
suggestion: Option<TypoSuggestion>,
|
||||
span: Span,
|
||||
) -> bool {
|
||||
if let Some(suggestion) = suggestion {
|
||||
let suggestion = match suggestion {
|
||||
None => return false,
|
||||
// We shouldn't suggest underscore.
|
||||
if suggestion.candidate == kw::Underscore {
|
||||
return false;
|
||||
}
|
||||
|
||||
let msg = format!(
|
||||
"{} {} with a similar name exists",
|
||||
suggestion.res.article(),
|
||||
suggestion.res.descr()
|
||||
);
|
||||
err.span_suggestion(
|
||||
span,
|
||||
&msg,
|
||||
suggestion.candidate.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
let def_span = suggestion.res.opt_def_id().and_then(|def_id| match def_id.krate {
|
||||
LOCAL_CRATE => self.opt_span(def_id),
|
||||
_ => Some(
|
||||
self.session
|
||||
.source_map()
|
||||
.guess_head_span(self.cstore().get_span_untracked(def_id, self.session)),
|
||||
Some(suggestion) if suggestion.candidate == kw::Underscore => return false,
|
||||
Some(suggestion) => suggestion,
|
||||
};
|
||||
let msg = format!(
|
||||
"{} {} with a similar name exists",
|
||||
suggestion.res.article(),
|
||||
suggestion.res.descr()
|
||||
);
|
||||
err.span_suggestion(
|
||||
span,
|
||||
&msg,
|
||||
suggestion.candidate.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
let def_span = suggestion.res.opt_def_id().and_then(|def_id| match def_id.krate {
|
||||
LOCAL_CRATE => self.opt_span(def_id),
|
||||
_ => Some(
|
||||
self.session
|
||||
.source_map()
|
||||
.guess_head_span(self.cstore().get_span_untracked(def_id, self.session)),
|
||||
),
|
||||
});
|
||||
if let Some(span) = def_span {
|
||||
err.span_label(
|
||||
self.session.source_map().guess_head_span(span),
|
||||
&format!(
|
||||
"similarly named {} `{}` defined here",
|
||||
suggestion.res.descr(),
|
||||
suggestion.candidate.as_str(),
|
||||
),
|
||||
});
|
||||
if let Some(span) = def_span {
|
||||
err.span_label(
|
||||
self.session.source_map().guess_head_span(span),
|
||||
&format!(
|
||||
"similarly named {} `{}` defined here",
|
||||
suggestion.res.descr(),
|
||||
suggestion.candidate.as_str(),
|
||||
),
|
||||
);
|
||||
}
|
||||
return true;
|
||||
);
|
||||
}
|
||||
false
|
||||
true
|
||||
}
|
||||
|
||||
fn binding_description(&self, b: &NameBinding<'_>, ident: Ident, from_prelude: bool) -> String {
|
||||
|
@ -15,10 +15,9 @@ error: expected type, found keyword `loop`
|
||||
LL | loop { break 'label: loop { break 'label 42; }; }
|
||||
| - ^^^^ expected type
|
||||
| |
|
||||
| tried to parse a type due to this type ascription
|
||||
| help: maybe write a path separator here: `::`
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -280,12 +280,12 @@ error: casts cannot be followed by ?
|
||||
--> $DIR/issue-35813-postfix-after-cast.rs:121:5
|
||||
|
|
||||
LL | Err(0u64): Result<u64,u64>?;
|
||||
| ^^^^^^^^^-^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| help: maybe write a path separator here: `::`
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
|
||||
help: try surrounding the expression in parentheses
|
||||
|
|
||||
LL | (Err(0u64): Result<u64,u64>)?;
|
||||
| ^ ^
|
||||
|
||||
error: casts cannot be followed by a function call
|
||||
--> $DIR/issue-35813-postfix-after-cast.rs:145:5
|
||||
@ -324,12 +324,12 @@ error: casts cannot be followed by `.await`
|
||||
--> $DIR/issue-35813-postfix-after-cast.rs:155:5
|
||||
|
|
||||
LL | Box::pin(noop()): Pin<Box<_>>.await;
|
||||
| ^^^^^^^^^^^^^^^^-^^^^^^^^^^^^
|
||||
| |
|
||||
| help: maybe write a path separator here: `::`
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
|
||||
help: try surrounding the expression in parentheses
|
||||
|
|
||||
LL | (Box::pin(noop()): Pin<Box<_>>).await;
|
||||
| ^ ^
|
||||
|
||||
error: casts cannot be followed by a field access
|
||||
--> $DIR/issue-35813-postfix-after-cast.rs:167:5
|
||||
|
@ -7,7 +7,6 @@ LL | Box:new("foo".to_string())
|
||||
| help: maybe write a path separator here: `::`
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -7,7 +7,6 @@ LL | vec![Ok(2)].into_iter().collect:<Result<Vec<_>,_>>()?;
|
||||
| help: maybe write a path separator here: `::`
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -7,7 +7,6 @@ LL | let _ = Option:Some("");
|
||||
| help: maybe write a path separator here: `::`
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -10,7 +10,6 @@ LL | let _ = Option:Some(vec![0, 1]);
|
||||
| help: maybe write a path separator here: `::`
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0423]: expected value, found enum `Option`
|
||||
|
@ -7,7 +7,6 @@ LL | println!("{}", std::mem:size_of::<BTreeMap<u32, u32>>());
|
||||
| help: maybe write a path separator here: `::`
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
|
||||
|
||||
error[E0423]: expected value, found module `std::mem`
|
||||
--> $DIR/issue-54516.rs:4:20
|
||||
|
@ -7,7 +7,6 @@ LL | let u: usize = std::mem:size_of::<u32>();
|
||||
| help: maybe write a path separator here: `::`
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
|
||||
|
||||
error[E0423]: expected value, found module `std::mem`
|
||||
--> $DIR/issue-60933.rs:2:20
|
||||
|
Loading…
x
Reference in New Issue
Block a user