hir::ExprKind::Call(f, args.iter().map(|x| self.lower_expr(x)).collect())
}
ExprKind::MethodCall(ref seg, ref args) => {
- let hir_seg = self.lower_path_segment(
+ let hir_seg = P(self.lower_path_segment(
e.span,
seg,
ParamMode::Optional,
ParenthesizedGenericArgs::Err,
ImplTraitContext::disallowed(),
None,
- );
+ ));
let args = args.iter().map(|x| self.lower_expr(x)).collect();
hir::ExprKind::MethodCall(hir_seg, seg.ident.span, args)
}
node: if is_unit {
hir::ExprKind::Path(struct_path)
} else {
- hir::ExprKind::Struct(struct_path, fields, None)
+ hir::ExprKind::Struct(P(struct_path), fields, None)
},
span: e.span,
attrs: e.attrs.clone(),
hir::ExprKind::InlineAsm(P(hir_asm), outputs, inputs)
}
ExprKind::Struct(ref path, ref fields, ref maybe_expr) => hir::ExprKind::Struct(
- self.lower_qpath(
+ P(self.lower_qpath(
e.id,
&None,
path,
ParamMode::Optional,
ImplTraitContext::disallowed(),
- ),
+ )),
fields.iter().map(|x| self.lower_field(x)).collect(),
maybe_expr.as_ref().map(|x| P(self.lower_expr(x))),
),
pub hir_id: HirId,
}
+// `Expr` is used a lot. Make sure it doesn't unintentionally get bigger.
+#[cfg(target_arch = "x86_64")]
+static_assert!(MEM_SIZE_OF_EXPR: std::mem::size_of::<Expr>() == 72);
+
impl Expr {
pub fn precedence(&self) -> ExprPrecedence {
match self.node {
/// and the remaining elements are the rest of the arguments.
/// Thus, `x.foo::<Bar, Baz>(a, b, c, d)` is represented as
/// `ExprKind::MethodCall(PathSegment { foo, [Bar, Baz] }, [x, a, b, c, d])`.
- MethodCall(PathSegment, Span, HirVec<Expr>),
+ MethodCall(P<PathSegment>, Span, HirVec<Expr>),
/// A tuple (e.g., `(a, b, c ,d)`).
Tup(HirVec<Expr>),
/// A binary operation (e.g., `a + b`, `a * b`).
///
/// For example, `Foo {x: 1, y: 2}`, or
/// `Foo {x: 1, .. base}`, where `base` is the `Option<Expr>`.
- Struct(QPath, HirVec<Field>, Option<P<Expr>>),
+ Struct(P<QPath>, HirVec<Field>, Option<P<Expr>>),
/// An array literal constructed from one repeated element.
///
Some(def) if def != HirDef::Err => def,
_ => self.get_path_def(self.tcx.hir().get_parent_node(id)),
}
- },
+ }
+
Node::Expr(&hir::Expr {
node: hir::ExprKind::Struct(ref qpath, ..),
..
- }) |
+ }) => {
+ let hir_id = self.tcx.hir().node_to_hir_id(id);
+ self.tables.qpath_def(qpath, hir_id)
+ }
+
Node::Expr(&hir::Expr {
node: hir::ExprKind::Path(ref qpath),
..
match expr.node {
// All built-in range literals but `..=` and `..` desugar to Structs
- ExprKind::Struct(QPath::Resolved(None, ref path), _, _) |
+ ExprKind::Struct(ref qpath, _, _) => {
+ if let QPath::Resolved(None, ref path) = **qpath {
+ return is_range_path(&path) && span_is_range_literal(&expr.span);
+ }
+ }
// `..` desugars to its struct path
ExprKind::Path(QPath::Resolved(None, ref path)) => {
return is_range_path(&path) && span_is_range_literal(&expr.span);