Implement tuple array diagnostic
Co-authored-by: David Wood <Q0KPU0H1YOEPHRY1R2SN5B5RL@david.davidtw.co>
This commit is contained in:
parent
86f7f78f05
commit
ef46e38c2b
4 changed files with 51 additions and 5 deletions
|
@ -307,6 +307,36 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Give appropriate suggestion when encountering `[("a", 0) ("b", 1)]`, where the
|
||||||
|
/// likely intention is to create an array containing tuples.
|
||||||
|
fn maybe_suggest_bad_array_definition(
|
||||||
|
&self,
|
||||||
|
err: &mut DiagnosticBuilder<'a>,
|
||||||
|
call_expr: &'tcx hir::Expr<'tcx>,
|
||||||
|
callee_expr: &'tcx hir::Expr<'tcx>,
|
||||||
|
) -> bool {
|
||||||
|
let hir_id = self.tcx.hir().get_parent_node(call_expr.hir_id);
|
||||||
|
let parent_node = self.tcx.hir().get(hir_id);
|
||||||
|
if let (
|
||||||
|
hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Array(_), .. }),
|
||||||
|
hir::ExprKind::Tup(exp),
|
||||||
|
hir::ExprKind::Call(_, args),
|
||||||
|
) = (parent_node, &callee_expr.kind, &call_expr.kind)
|
||||||
|
{
|
||||||
|
if args.len() == exp.len() {
|
||||||
|
let start = callee_expr.span.shrink_to_hi();
|
||||||
|
err.span_suggestion(
|
||||||
|
start,
|
||||||
|
"consider separating array elements with a comma",
|
||||||
|
",".to_string(),
|
||||||
|
Applicability::MaybeIncorrect,
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
fn confirm_builtin_call(
|
fn confirm_builtin_call(
|
||||||
&self,
|
&self,
|
||||||
call_expr: &'tcx hir::Expr<'tcx>,
|
call_expr: &'tcx hir::Expr<'tcx>,
|
||||||
|
@ -422,7 +452,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
_ => Res::Err,
|
_ => Res::Err,
|
||||||
};
|
};
|
||||||
|
|
||||||
err.span_label(call_expr.span, "call expression requires function");
|
if !self.maybe_suggest_bad_array_definition(&mut err, call_expr, callee_expr) {
|
||||||
|
err.span_label(call_expr.span, "call expression requires function");
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(span) = self.tcx.hir().res_span(def) {
|
if let Some(span) = self.tcx.hir().res_span(def) {
|
||||||
let callee_ty = callee_ty.to_string();
|
let callee_ty = callee_ty.to_string();
|
||||||
|
|
|
@ -59,10 +59,8 @@ LL | &(true, false) => ()
|
||||||
error[E0618]: expected function, found `(char, char)`
|
error[E0618]: expected function, found `(char, char)`
|
||||||
--> $DIR/issue-5100.rs:48:14
|
--> $DIR/issue-5100.rs:48:14
|
||||||
|
|
|
|
||||||
LL | let v = [('a', 'b')
|
LL | let v = [('a', 'b')
|
||||||
| ______________-^^^^^^^^^
|
| ^^^^^^^^^^- help: consider separating array elements with a comma: `,`
|
||||||
LL | | ('c', 'd'),
|
|
||||||
| |_______________________- call expression requires function
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/issue-5100.rs:55:19
|
--> $DIR/issue-5100.rs:55:19
|
||||||
|
|
7
src/test/ui/tuple/array-diagnostics.rs
Normal file
7
src/test/ui/tuple/array-diagnostics.rs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
fn main() {
|
||||||
|
let _tmp = [
|
||||||
|
("C200B40A82", 3),
|
||||||
|
("C200B40A83", 4) //~ ERROR: expected function, found `(&'static str, {integer})` [E0618]
|
||||||
|
("C200B40A8537", 5),
|
||||||
|
];
|
||||||
|
}
|
9
src/test/ui/tuple/array-diagnostics.stderr
Normal file
9
src/test/ui/tuple/array-diagnostics.stderr
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0618]: expected function, found `(&'static str, {integer})`
|
||||||
|
--> $DIR/array-diagnostics.rs:4:9
|
||||||
|
|
|
||||||
|
LL | ("C200B40A83", 4)
|
||||||
|
| ^^^^^^^^^^^^^^^^^- help: consider separating array elements with a comma: `,`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0618`.
|
Loading…
Add table
Add a link
Reference in a new issue