Skip to main content

Expr

Enum Expr 

Source
pub enum Expr {
Show 20 variants Unit, Literal(Literal), FunctionOrValue { module_name: ModuleName, name: Ident, }, PrefixOperator(Ident), OperatorApplication { operator: Ident, direction: InfixDirection, left: Box<Spanned<Expr>>, right: Box<Spanned<Expr>>, }, BinOps { operands_and_operators: Vec<(Spanned<Expr>, Spanned<Ident>)>, final_operand: Box<Spanned<Expr>>, }, Application(Vec<Spanned<Expr>>), IfElse { branches: Vec<IfBranch>, else_branch: Box<Spanned<Expr>>, }, Negation(Box<Spanned<Expr>>), Tuple(Vec<Spanned<Expr>>), Parenthesized { expr: Box<Spanned<Expr>>, trailing_comments: Vec<Spanned<Comment>>, }, LetIn { declarations: Vec<Spanned<LetDeclaration>>, body: Box<Spanned<Expr>>, trailing_comments: Vec<Spanned<Comment>>, }, CaseOf { expr: Box<Spanned<Expr>>, branches: Vec<CaseBranch>, }, Lambda { args: Vec<Spanned<Pattern>>, body: Box<Spanned<Expr>>, }, Record(Vec<Spanned<RecordSetter>>), RecordUpdate { base: Spanned<Ident>, updates: Vec<Spanned<RecordSetter>>, }, RecordAccess { record: Box<Spanned<Expr>>, field: Spanned<Ident>, }, RecordAccessFunction(Ident), List { elements: Vec<Spanned<Expr>>, element_inline_comments: Vec<Option<Spanned<Comment>>>, trailing_comments: Vec<Spanned<Comment>>, }, GLSLExpression(String),
}
Expand description

An expression in Elm source code.

This covers every expression form in Elm 0.19.1.

Variants§

§

Unit

Unit expression: ()

§

Literal(Literal)

A literal value: 42, "hello", 'c', 3.14

§

FunctionOrValue

A reference to a value or constructor, possibly qualified.

Examples:

  • fooFunctionOrValue { module_name: [], name: "foo" }
  • JustFunctionOrValue { module_name: [], name: "Just" }
  • Maybe.JustFunctionOrValue { module_name: ["Maybe"], name: "Just" }

Fields

§module_name: ModuleName
§name: Ident
§

PrefixOperator(Ident)

An operator used as a prefix (in parentheses): (+), (::)

§

OperatorApplication

Operator application with resolved precedence and associativity: a + bOperatorApplication { operator: "+", direction: Left, left, right }

Note: in the source AST from elm/compiler this is Binops, a flat list. We use the resolved form from elm-syntax for ergonomics, but also provide BinOps below for representing the raw unresolved form.

Fields

§operator: Ident
§direction: InfixDirection
§right: Box<Spanned<Expr>>
§

BinOps

Raw unresolved binary operator chain, as in the source AST.

a + b * cBinOps { operands_and_operators: [(a, +), (b, *)], final_operand: c }

This is the form directly from parsing, before operator precedence resolution. Corresponds to Binops in AST/Source.hs.

Fields

§operands_and_operators: Vec<(Spanned<Expr>, Spanned<Ident>)>
§final_operand: Box<Spanned<Expr>>
§

Application(Vec<Spanned<Expr>>)

Function application: f x yApplication [f, x, y]

§

IfElse

If-then-else expression: if a then b else c

Chained if-else: if a then b else if c then d else e is represented as IfElse { branches: [IfBranch(a, b), IfBranch(c, d)], else_branch: e }

Fields

§branches: Vec<IfBranch>
§else_branch: Box<Spanned<Expr>>
§

Negation(Box<Spanned<Expr>>)

Negation: -expr

§

Tuple(Vec<Spanned<Expr>>)

Tuple expression: ( a, b ) or ( a, b, c )

§

Parenthesized

Parenthesized expression: ( expr ).

trailing_comments captures comments that appear between the inner expression and the closing ), e.g.

( expr
  -- trailing
)

Fields

§trailing_comments: Vec<Spanned<Comment>>
§

LetIn

Let-in expression:

let
    x = 1
    y = 2
in
    x + y

trailing_comments captures any comments that appear between the last declaration and the in keyword. elm-format preserves them as a dangling block at the end of the let body.

Fields

§declarations: Vec<Spanned<LetDeclaration>>
§trailing_comments: Vec<Spanned<Comment>>
§

CaseOf

Case-of expression:

case msg of
    Increment -> model + 1
    Decrement -> model - 1

Fields

§branches: Vec<CaseBranch>
§

Lambda

Lambda expression: \x y -> x + y

Fields

§

Record(Vec<Spanned<RecordSetter>>)

Record expression: { name = "Alice", age = 30 }

§

RecordUpdate

Record update expression: { model | count = model.count + 1 }

Fields

§

RecordAccess

Record field access: model.count

Fields

§record: Box<Spanned<Expr>>
§

RecordAccessFunction(Ident)

Record access function: .name

§

List

List expression: [ 1, 2, 3 ].

trailing_comments captures any comments that appear between the last element and the closing ], e.g.

[ a
, b
-- dangling
]

Fields

§elements: Vec<Spanned<Expr>>
§element_inline_comments: Vec<Option<Spanned<Comment>>>

Inline -- comment that follows each element on the same source line, e.g. [ a -- foo\n, b -- bar\n]. Empty, or parallel to elements with None for elements lacking a comment.

§trailing_comments: Vec<Spanned<Comment>>
§

GLSLExpression(String)

GLSL shader block: [glsl| ... |]

Trait Implementations§

Source§

impl Clone for Expr

Source§

fn clone(&self) -> Expr

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Expr

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Expr

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Expr

Source§

fn eq(&self, other: &Expr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for Expr

Source§

impl StructuralPartialEq for Expr

Auto Trait Implementations§

§

impl Freeze for Expr

§

impl RefUnwindSafe for Expr

§

impl Send for Expr

§

impl Sync for Expr

§

impl Unpin for Expr

§

impl UnsafeUnpin for Expr

§

impl UnwindSafe for Expr

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

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

fn clone_into(&self, target: &mut T)

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

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.