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(
|
||||
&self,
|
||||
call_expr: &'tcx hir::Expr<'tcx>,
|
||||
|
@ -422,7 +452,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
_ => Res::Err,
|
||||
};
|
||||
|
||||
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) {
|
||||
let callee_ty = callee_ty.to_string();
|
||||
|
|
|
@ -60,9 +60,7 @@ error[E0618]: expected function, found `(char, char)`
|
|||
--> $DIR/issue-5100.rs:48:14
|
||||
|
|
||||
LL | let v = [('a', 'b')
|
||||
| ______________-^^^^^^^^^
|
||||
LL | | ('c', 'd'),
|
||||
| |_______________________- call expression requires function
|
||||
| ^^^^^^^^^^- help: consider separating array elements with a comma: `,`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $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