Suggest path separator for single-colon typos
This commit adds guidance for when a user means to type a path, but ends up typing a single colon, such as `<<Impl as T>:Ty>`. This change seemed pertinent as the current error message is particularly misleading, emitting `error: unmatched angle bracket`, despite the angle bracket being matched later on, leaving the user to track down the typo'd colon.
This commit is contained in:
parent
212b2c7da8
commit
3c91bdca1d
4 changed files with 63 additions and 1 deletions
|
@ -71,7 +71,23 @@ impl<'a> Parser<'a> {
|
||||||
debug!("parse_qpath: (decrement) count={:?}", self.unmatched_angle_bracket_count);
|
debug!("parse_qpath: (decrement) count={:?}", self.unmatched_angle_bracket_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let lo_colon = self.token.span;
|
||||||
|
if self.eat(&token::Colon) {
|
||||||
|
// <Bar as Baz<T>>:Qux
|
||||||
|
// ^
|
||||||
|
let span = lo_colon.to(self.prev_span);
|
||||||
|
self.diagnostic()
|
||||||
|
.struct_span_err(span, "found single colon where type path was expected")
|
||||||
|
.span_suggestion(
|
||||||
|
span,
|
||||||
|
"use double colon",
|
||||||
|
"::".to_string(),
|
||||||
|
Applicability::MachineApplicable,
|
||||||
|
)
|
||||||
|
.emit();
|
||||||
|
} else {
|
||||||
self.expect(&token::ModSep)?;
|
self.expect(&token::ModSep)?;
|
||||||
|
}
|
||||||
|
|
||||||
let qself = QSelf { ty, path_span, position: path.segments.len() };
|
let qself = QSelf { ty, path_span, position: path.segments.len() };
|
||||||
self.parse_path_segments(&mut path.segments, style)?;
|
self.parse_path_segments(&mut path.segments, style)?;
|
||||||
|
|
19
src/test/ui/parser/qualified-path-in-turbofish.fixed
Normal file
19
src/test/ui/parser/qualified-path-in-turbofish.fixed
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// run-rustfix
|
||||||
|
trait T {
|
||||||
|
type Ty;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Impl;
|
||||||
|
|
||||||
|
impl T for Impl {
|
||||||
|
type Ty = u32;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn template<T>() -> i64 {
|
||||||
|
3
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
template::<<Impl as T>::Ty>();
|
||||||
|
//~^ ERROR found single colon where type path was expected
|
||||||
|
}
|
19
src/test/ui/parser/qualified-path-in-turbofish.rs
Normal file
19
src/test/ui/parser/qualified-path-in-turbofish.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// run-rustfix
|
||||||
|
trait T {
|
||||||
|
type Ty;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Impl;
|
||||||
|
|
||||||
|
impl T for Impl {
|
||||||
|
type Ty = u32;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn template<T>() -> i64 {
|
||||||
|
3
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
template::<<Impl as T>:Ty>();
|
||||||
|
//~^ ERROR found single colon where type path was expected
|
||||||
|
}
|
8
src/test/ui/parser/qualified-path-in-turbofish.stderr
Normal file
8
src/test/ui/parser/qualified-path-in-turbofish.stderr
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
error: found single colon where type path was expected
|
||||||
|
--> $DIR/qualified-path-in-turbofish.rs:17:27
|
||||||
|
|
|
||||||
|
LL | template::<<Impl as T>:Ty>();
|
||||||
|
| ^ help: use double colon: `::`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue