Enum rustc_ast::ast::ExprKind[−][src]

pub enum ExprKind {
Show 42 variants Box(P<Expr>), Array(Vec<P<Expr>>), ConstBlock(AnonConst), Call(P<Expr>, Vec<P<Expr>>), MethodCall(PathSegment, Vec<P<Expr>>, Span), Tup(Vec<P<Expr>>), Binary(BinOp, P<Expr>, P<Expr>), Unary(UnOp, P<Expr>), Lit(Lit), Cast(P<Expr>, P<Ty>), Type(P<Expr>, P<Ty>), Let(P<Pat>, P<Expr>, Span), If(P<Expr>, P<Block>, Option<P<Expr>>), While(P<Expr>, P<Block>, Option<Label>), ForLoop(P<Pat>, P<Expr>, P<Block>, Option<Label>), Loop(P<Block>, Option<Label>), Match(P<Expr>, Vec<Arm>), Closure(CaptureBy, Async, Movability, P<FnDecl>, P<Expr>, Span), Block(P<Block>, Option<Label>), Async(CaptureBy, NodeId, P<Block>), Await(P<Expr>), TryBlock(P<Block>), Assign(P<Expr>, P<Expr>, Span), AssignOp(BinOp, P<Expr>, P<Expr>), Field(P<Expr>, Ident), Index(P<Expr>, P<Expr>), Range(Option<P<Expr>>, Option<P<Expr>>, RangeLimits), Underscore, Path(Option<QSelf>, Path), AddrOf(BorrowKind, Mutability, P<Expr>), Break(Option<Label>, Option<P<Expr>>), Continue(Option<Label>), Ret(Option<P<Expr>>), InlineAsm(P<InlineAsm>), LlvmInlineAsm(P<LlvmInlineAsm>), MacCall(MacCall), Struct(P<StructExpr>), Repeat(P<Expr>, AnonConst), Paren(P<Expr>), Try(P<Expr>), Yield(Option<P<Expr>>), Err,
}

Variants

Box(P<Expr>)

Tuple Fields

0: P<Expr>

A box x expression.

Array(Vec<P<Expr>>)

Tuple Fields

0: Vec<P<Expr>>

An array ([a, b, c, d])

ConstBlock(AnonConst)

Tuple Fields

Allow anonymous constants from an inline const block

Call(P<Expr>, Vec<P<Expr>>)

Tuple Fields

0: P<Expr>
1: Vec<P<Expr>>

A function call

The first field resolves to the function itself, and the second field is the list of arguments. This also represents calling the constructor of tuple-like ADTs such as tuple structs and enum variants.

MethodCall(PathSegment, Vec<P<Expr>>, Span)

Tuple Fields

1: Vec<P<Expr>>
2: Span

A method call (x.foo::<'static, Bar, Baz>(a, b, c, d))

The PathSegment represents the method name and its generic arguments (within the angle brackets). The first element of the vector of an Expr is the expression that evaluates to the object on which the method is being called on (the receiver), 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]). This Span is the span of the function, without the dot and receiver (e.g. foo(a, b) in x.foo(a, b)

Tup(Vec<P<Expr>>)

Tuple Fields

0: Vec<P<Expr>>

A tuple (e.g., (a, b, c, d)).

Binary(BinOp, P<Expr>, P<Expr>)

Tuple Fields

0: BinOp
1: P<Expr>
2: P<Expr>

A binary operation (e.g., a + b, a * b).

Unary(UnOp, P<Expr>)

Tuple Fields

0: UnOp
1: P<Expr>

A unary operation (e.g., !x, *x).

Lit(Lit)

Tuple Fields

0: Lit

A literal (e.g., 1, "foo").

Cast(P<Expr>, P<Ty>)

Tuple Fields

0: P<Expr>
1: P<Ty>

A cast (e.g., foo as f64).

Type(P<Expr>, P<Ty>)

Tuple Fields

0: P<Expr>
1: P<Ty>

A type ascription (e.g., 42: usize).

Let(P<Pat>, P<Expr>, Span)

Tuple Fields

0: P<Pat>
1: P<Expr>
2: Span

A let pat = expr expression that is only semantically allowed in the condition of if / while expressions. (e.g., if let 0 = x { .. }).

Span represents the whole let pat = expr statement.

If(P<Expr>, P<Block>, Option<P<Expr>>)

Tuple Fields

0: P<Expr>
1: P<Block>
2: Option<P<Expr>>

An if block, with an optional else block.

if expr { block } else { expr }

While(P<Expr>, P<Block>, Option<Label>)

Tuple Fields

0: P<Expr>
1: P<Block>

A while loop, with an optional label.

'label: while expr { block }

ForLoop(P<Pat>, P<Expr>, P<Block>, Option<Label>)

Tuple Fields

0: P<Pat>
1: P<Expr>
2: P<Block>

A for loop, with an optional label.

'label: for pat in expr { block }

This is desugared to a combination of loop and match expressions.

Loop(P<Block>, Option<Label>)

Tuple Fields

0: P<Block>

Conditionless loop (can be exited with break, continue, or return).

'label: loop { block }

Match(P<Expr>, Vec<Arm>)

Tuple Fields

0: P<Expr>
1: Vec<Arm>

A match block.

Closure(CaptureBy, Async, Movability, P<FnDecl>, P<Expr>, Span)

Tuple Fields

1: Async
3: P<FnDecl>
4: P<Expr>
5: Span

A closure (e.g., move |a, b, c| a + b + c).

The final span is the span of the argument block |...|.

Block(P<Block>, Option<Label>)

Tuple Fields

0: P<Block>

A block ('label: { ... }).

Async(CaptureBy, NodeId, P<Block>)

Tuple Fields

1: NodeId
2: P<Block>

An async block (async move { ... }).

The NodeId is the NodeId for the closure that results from desugaring an async block, just like the NodeId field in the Async::Yes variant. This is necessary in order to create a def for the closure which can be used as a parent of any child defs. Defs created during lowering cannot be made the parent of any other preexisting defs.

Await(P<Expr>)

Tuple Fields

0: P<Expr>

An await expression (my_future.await).

TryBlock(P<Block>)

Tuple Fields

0: P<Block>

A try block (try { ... }).

Assign(P<Expr>, P<Expr>, Span)

Tuple Fields

0: P<Expr>
1: P<Expr>
2: Span

An assignment (a = foo()). The Span argument is the span of the = token.

AssignOp(BinOp, P<Expr>, P<Expr>)

Tuple Fields

0: BinOp
1: P<Expr>
2: P<Expr>

An assignment with an operator.

E.g., a += 1.

Field(P<Expr>, Ident)

Tuple Fields

0: P<Expr>
1: Ident

Access of a named (e.g., obj.foo) or unnamed (e.g., obj.0) struct field.

Index(P<Expr>, P<Expr>)

Tuple Fields

0: P<Expr>
1: P<Expr>

An indexing operation (e.g., foo[2]).

Range(Option<P<Expr>>, Option<P<Expr>>, RangeLimits)

Tuple Fields

0: Option<P<Expr>>
1: Option<P<Expr>>

A range (e.g., 1..2, 1.., ..2, 1..=2, ..=2; and .. in destructuring assignment).

Underscore

An underscore, used in destructuring assignment to ignore a value.

Path(Option<QSelf>, Path)

Tuple Fields

1: Path

Variable reference, possibly containing :: and/or type parameters (e.g., foo::bar::<baz>).

Optionally “qualified” (e.g., <Vec<T> as SomeTrait>::SomeType).

AddrOf(BorrowKind, Mutability, P<Expr>)

Tuple Fields

2: P<Expr>

A referencing operation (&a, &mut a, &raw const a or &raw mut a).

Break(Option<Label>, Option<P<Expr>>)

Tuple Fields

1: Option<P<Expr>>

A break, with an optional label to break, and an optional expression.

Continue(Option<Label>)

Tuple Fields

A continue, with an optional label.

Ret(Option<P<Expr>>)

Tuple Fields

0: Option<P<Expr>>

A return, with an optional value to be returned.

InlineAsm(P<InlineAsm>)

Tuple Fields

Output of the asm!() macro.

LlvmInlineAsm(P<LlvmInlineAsm>)

Tuple Fields

Output of the llvm_asm!() macro.

MacCall(MacCall)

Tuple Fields

A macro invocation; pre-expansion.

Struct(P<StructExpr>)

Tuple Fields

A struct literal expression.

E.g., Foo {x: 1, y: 2}, or Foo {x: 1, .. rest}.

Repeat(P<Expr>, AnonConst)

Tuple Fields

0: P<Expr>

An array literal constructed from one repeated element.

E.g., [1; 5]. The expression is the element to be repeated; the constant is the number of times to repeat it.

Paren(P<Expr>)

Tuple Fields

0: P<Expr>

No-op: used solely so we can pretty-print faithfully.

Try(P<Expr>)

Tuple Fields

0: P<Expr>

A try expression (expr?).

Yield(Option<P<Expr>>)

Tuple Fields

0: Option<P<Expr>>

A yield, with an optional value to be yielded.

Err

Placeholder for an expression that wasn’t syntactically well formed in some way.

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Layout

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference’s “Type Layout” chapter for details on type layout guarantees.

Size: 72 bytes

Size for each variant:

  • Box: 15 bytes
  • Array: 31 bytes
  • ConstBlock: 23 bytes
  • Call: 39 bytes
  • MethodCall: 63 bytes
  • Tup: 31 bytes
  • Binary: 31 bytes
  • Unary: 15 bytes
  • Lit: 55 bytes
  • Cast: 23 bytes
  • Type: 23 bytes
  • Let: 31 bytes
  • If: 31 bytes
  • While: 31 bytes
  • ForLoop: 39 bytes
  • Loop: 23 bytes
  • Match: 39 bytes
  • Closure: 47 bytes
  • Block: 23 bytes
  • Async: 15 bytes
  • Await: 15 bytes
  • TryBlock: 15 bytes
  • Assign: 31 bytes
  • AssignOp: 31 bytes
  • Field: 23 bytes
  • Index: 23 bytes
  • Range: 23 bytes
  • Underscore: 0 bytes
  • Path: 71 bytes
  • AddrOf: 15 bytes
  • Break: 23 bytes
  • Continue: 15 bytes
  • Ret: 15 bytes
  • InlineAsm: 15 bytes
  • LlvmInlineAsm: 15 bytes
  • MacCall: 71 bytes
  • Struct: 15 bytes
  • Repeat: 31 bytes
  • Paren: 15 bytes
  • Try: 15 bytes
  • Yield: 15 bytes
  • Err: 0 bytes