Skip to content

Commit ce25b7c

Browse files
committed
Silence some invalid type params in field errors
Reduce the verbosity of forgetting parentheses in methods with type parameters by keeping that AST information until HIR type-checking.
1 parent 97d47a5 commit ce25b7c

File tree

23 files changed

+57
-43
lines changed

23 files changed

+57
-43
lines changed

src/librustc_ast_lowering/expr.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
129129
self.lower_expr(el),
130130
self.lower_expr(er),
131131
),
132-
ExprKind::Field(ref el, ident) => hir::ExprKind::Field(self.lower_expr(el), ident),
132+
ExprKind::Field(ref el, ident, args) => {
133+
hir::ExprKind::Field(self.lower_expr(el), ident, args)
134+
}
133135
ExprKind::Index(ref el, ref er) => {
134136
hir::ExprKind::Index(self.lower_expr(el), self.lower_expr(er))
135137
}

src/librustc_ast_pretty/pprust.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2025,7 +2025,7 @@ impl<'a> State<'a> {
20252025
self.word_space("=");
20262026
self.print_expr_maybe_paren(rhs, prec);
20272027
}
2028-
ast::ExprKind::Field(ref expr, ident) => {
2028+
ast::ExprKind::Field(ref expr, ident, _) => {
20292029
self.print_expr_maybe_paren(expr, parser::PREC_POSTFIX);
20302030
self.s.word(".");
20312031
self.print_ident(ident);

src/librustc_hir/hir.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,7 +1396,7 @@ impl Expr<'_> {
13961396

13971397
ExprKind::Unary(UnOp::UnDeref, _) => true,
13981398

1399-
ExprKind::Field(ref base, _) | ExprKind::Index(ref base, _) => {
1399+
ExprKind::Field(ref base, ..) | ExprKind::Index(ref base, _) => {
14001400
allow_projections_from(base) || base.is_place_expr(allow_projections_from)
14011401
}
14021402

@@ -1588,7 +1588,8 @@ pub enum ExprKind<'hir> {
15881588
/// E.g., `a += 1`.
15891589
AssignOp(BinOp, &'hir Expr<'hir>, &'hir Expr<'hir>),
15901590
/// Access of a named (e.g., `obj.foo`) or unnamed (e.g., `obj.0`) struct or tuple field.
1591-
Field(&'hir Expr<'hir>, Ident),
1591+
/// The optional `Span` points at an *invalid* type parameter in the field expression.
1592+
Field(&'hir Expr<'hir>, Ident, Option<Span>),
15921593
/// An indexing operation (`foo[2]`).
15931594
Index(&'hir Expr<'hir>, &'hir Expr<'hir>),
15941595

src/librustc_hir/intravisit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1110,7 +1110,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr<'v>)
11101110
visitor.visit_expr(right_expression);
11111111
visitor.visit_expr(left_expression);
11121112
}
1113-
ExprKind::Field(ref subexpression, ident) => {
1113+
ExprKind::Field(ref subexpression, ident, _) => {
11141114
visitor.visit_expr(subexpression);
11151115
visitor.visit_ident(ident);
11161116
}

src/librustc_hir/print.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,7 +1344,7 @@ impl<'a> State<'a> {
13441344
self.word_space("=");
13451345
self.print_expr_maybe_paren(&rhs, prec);
13461346
}
1347-
hir::ExprKind::Field(ref expr, ident) => {
1347+
hir::ExprKind::Field(ref expr, ident, _) => {
13481348
self.print_expr_maybe_paren(expr, parser::PREC_POSTFIX);
13491349
self.s.word(".");
13501350
self.print_ident(ident);
@@ -2315,7 +2315,7 @@ fn contains_exterior_struct_lit(value: &hir::Expr<'_>) -> bool {
23152315
hir::ExprKind::Unary(_, ref x)
23162316
| hir::ExprKind::Cast(ref x, _)
23172317
| hir::ExprKind::Type(ref x, _)
2318-
| hir::ExprKind::Field(ref x, _)
2318+
| hir::ExprKind::Field(ref x, ..)
23192319
| hir::ExprKind::Index(ref x, _) => {
23202320
// `&X { y: 1 }, X { y: 1 }.y`
23212321
contains_exterior_struct_lit(&x)

src/librustc_parse/parser/expr.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@ impl<'a> Parser<'a> {
786786
) -> P<Expr> {
787787
let span = self.token.span;
788788
self.bump();
789-
let field = ExprKind::Field(base, Ident::new(field, span));
789+
let field = ExprKind::Field(base, Ident::new(field, span), None);
790790
self.expect_no_suffix(span, "a tuple index", suffix);
791791
self.mk_expr(lo.to(span), field, AttrVec::new())
792792
}
@@ -825,16 +825,12 @@ impl<'a> Parser<'a> {
825825
Ok(self.mk_expr(span, ExprKind::MethodCall(segment, args), AttrVec::new()))
826826
} else {
827827
// Field access `expr.f`
828-
if let Some(args) = segment.args {
829-
self.struct_span_err(
830-
args.span(),
831-
"field expressions may not have generic arguments",
832-
)
833-
.emit();
834-
}
835-
836828
let span = lo.to(self.prev_span);
837-
Ok(self.mk_expr(span, ExprKind::Field(self_arg, segment.ident), AttrVec::new()))
829+
Ok(self.mk_expr(
830+
span,
831+
ExprKind::Field(self_arg, segment.ident, segment.args.map(|args| args.span())),
832+
AttrVec::new(),
833+
))
838834
}
839835
}
840836

src/librustc_passes/liveness.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -984,7 +984,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
984984
self.access_path(expr.hir_id, path, succ, ACC_READ | ACC_USE)
985985
}
986986

987-
hir::ExprKind::Field(ref e, _) => self.propagate_through_expr(&e, succ),
987+
hir::ExprKind::Field(ref e, ..) => self.propagate_through_expr(&e, succ),
988988

989989
hir::ExprKind::Closure(..) => {
990990
debug!(
@@ -1254,7 +1254,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
12541254

12551255
match expr.kind {
12561256
hir::ExprKind::Path(_) => succ,
1257-
hir::ExprKind::Field(ref e, _) => self.propagate_through_expr(&e, succ),
1257+
hir::ExprKind::Field(ref e, ..) => self.propagate_through_expr(&e, succ),
12581258
_ => self.propagate_through_expr(expr, succ),
12591259
}
12601260
}

src/librustc_passes/region.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ fn resolve_local<'tcx>(
653653
match expr.kind {
654654
hir::ExprKind::AddrOf(_, _, ref subexpr)
655655
| hir::ExprKind::Unary(hir::UnOp::UnDeref, ref subexpr)
656-
| hir::ExprKind::Field(ref subexpr, _)
656+
| hir::ExprKind::Field(ref subexpr, ..)
657657
| hir::ExprKind::Index(ref subexpr, _) => {
658658
expr = &subexpr;
659659
}

src/librustc_resolve/late.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2004,7 +2004,7 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
20042004
ExprKind::Block(ref block, label) => self.resolve_labeled_block(label, block.id, block),
20052005

20062006
// Equivalent to `visit::walk_expr` + passing some context to children.
2007-
ExprKind::Field(ref subexpression, _) => {
2007+
ExprKind::Field(ref subexpression, ..) => {
20082008
self.resolve_expr(subexpression, Some(expr));
20092009
}
20102010
ExprKind::MethodCall(ref segment, ref arguments) => {
@@ -2055,7 +2055,7 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
20552055

20562056
fn record_candidate_traits_for_expr_if_necessary(&mut self, expr: &'ast Expr) {
20572057
match expr.kind {
2058-
ExprKind::Field(_, ident) => {
2058+
ExprKind::Field(_, ident, _) => {
20592059
// FIXME(#6890): Even though you can't treat a method like a
20602060
// field, we need to add any trait methods we find that match
20612061
// the field name so that we can do some nice error reporting

src/librustc_resolve/late/diagnostics.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ impl<'a> LateResolutionVisitor<'a, '_, '_> {
415415
let is_expected = &|res| source.is_expected(res);
416416

417417
let path_sep = |err: &mut DiagnosticBuilder<'_>, expr: &Expr| match expr.kind {
418-
ExprKind::Field(_, ident) => {
418+
ExprKind::Field(_, ident, _) => {
419419
err.span_suggestion(
420420
expr.span,
421421
"use the path separator to refer to an item",

0 commit comments

Comments
 (0)