Rollup merge of #54308 - dsciarra:issue-22692, r=estebank
Better user experience when attempting to call associated functions with dot notation Closes #22692
This commit is contained in:
commit
a1f3b0fe74
@ -3147,11 +3147,11 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
|
||||
// parser issue where a struct literal is being used on an expression
|
||||
// where a brace being opened means a block is being started. Look
|
||||
// ahead for the next text to see if `span` is followed by a `{`.
|
||||
let cm = this.session.source_map();
|
||||
let sm = this.session.source_map();
|
||||
let mut sp = span;
|
||||
loop {
|
||||
sp = cm.next_point(sp);
|
||||
match cm.span_to_snippet(sp) {
|
||||
sp = sm.next_point(sp);
|
||||
match sm.span_to_snippet(sp) {
|
||||
Ok(ref snippet) => {
|
||||
if snippet.chars().any(|c| { !c.is_whitespace() }) {
|
||||
break;
|
||||
@ -3160,20 +3160,51 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
|
||||
_ => break,
|
||||
}
|
||||
}
|
||||
let followed_by_brace = match cm.span_to_snippet(sp) {
|
||||
let followed_by_brace = match sm.span_to_snippet(sp) {
|
||||
Ok(ref snippet) if snippet == "{" => true,
|
||||
_ => false,
|
||||
};
|
||||
if let (PathSource::Expr(None), true) = (source, followed_by_brace) {
|
||||
err.span_label(
|
||||
span,
|
||||
format!("did you mean `({} {{ /* fields */ }})`?", path_str),
|
||||
);
|
||||
} else {
|
||||
err.span_label(
|
||||
span,
|
||||
format!("did you mean `{} {{ /* fields */ }}`?", path_str),
|
||||
);
|
||||
match source {
|
||||
PathSource::Expr(Some(parent)) => {
|
||||
match parent.node {
|
||||
ExprKind::MethodCall(ref path_assignment, _) => {
|
||||
err.span_suggestion_with_applicability(
|
||||
sm.start_point(parent.span)
|
||||
.to(path_assignment.ident.span),
|
||||
"use `::` to access an associated function",
|
||||
format!("{}::{}",
|
||||
path_str,
|
||||
path_assignment.ident),
|
||||
Applicability::MaybeIncorrect
|
||||
);
|
||||
return (err, candidates);
|
||||
},
|
||||
_ => {
|
||||
err.span_label(
|
||||
span,
|
||||
format!("did you mean `{} {{ /* fields */ }}`?",
|
||||
path_str),
|
||||
);
|
||||
return (err, candidates);
|
||||
},
|
||||
}
|
||||
},
|
||||
PathSource::Expr(None) if followed_by_brace == true => {
|
||||
err.span_label(
|
||||
span,
|
||||
format!("did you mean `({} {{ /* fields */ }})`?",
|
||||
path_str),
|
||||
);
|
||||
return (err, candidates);
|
||||
},
|
||||
_ => {
|
||||
err.span_label(
|
||||
span,
|
||||
format!("did you mean `{} {{ /* fields */ }}`?",
|
||||
path_str),
|
||||
);
|
||||
return (err, candidates);
|
||||
},
|
||||
}
|
||||
}
|
||||
return (err, candidates);
|
||||
|
13
src/test/ui/resolve/issue-22692.rs
Normal file
13
src/test/ui/resolve/issue-22692.rs
Normal file
@ -0,0 +1,13 @@
|
||||
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
fn main() {
|
||||
let _ = String.new();
|
||||
}
|
11
src/test/ui/resolve/issue-22692.stderr
Normal file
11
src/test/ui/resolve/issue-22692.stderr
Normal file
@ -0,0 +1,11 @@
|
||||
error[E0423]: expected value, found struct `String`
|
||||
--> $DIR/issue-22692.rs:12:13
|
||||
|
|
||||
LL | let _ = String.new();
|
||||
| ^^^^^^----
|
||||
| |
|
||||
| help: use `::` to access an associated function: `String::new`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0423`.
|
Loading…
x
Reference in New Issue
Block a user