7. Types

Syntax

Type ::=
    | EqualityType
    | UnionType
    | SingleType

SingleType ::=
    NamedType
    | ReferenceType
    | TupleType
    | FunctionType
    | TokenMacroInvocation
    | NeverType
    | AccessType
    | ArrayType
    | ParenthesisedType
    | ImplicitFunctionType
    | ImplicitFunctionCall
    | ExpressionInType
    | TypeMacroInvocation

7.1. Named Types

Syntax

NamedType ::=
    Name

Examples

i32
Data
Foo

7.2. Reference Types

Warning

This is a work in progress.

Syntax

ReferenceType ::=
    & ReferenceModifier? mut? Type

Examples

&raw mut i32
&rc User
&mut i32

7.3. Access Types

Syntax

AccessType ::=
    Type :: Name

Examples

llvm::AttributeKind

7.4. Tuple Types

Syntax

TupleType ::=
    ( TupleTypeBody? )

TupleTypeBody ::=
    SimpleTypeParameter , SimpleTypeParameterList?

Examples

(i32, char, str)
(count: i32, lookup: char, message: str)

7.5. Function Types

Syntax

FunctionType ::=
    (SimpleTypeParameterList?) -> Type

Examples

(i32, str) -> i32
(offset: i32, message: str) -> i32

7.6. Never Types

Syntax

NeverType ::=
    !

Examples

panic := (message: str) -> ! {
}

7.7. Array Types

Syntax

ArrayType ::=
    [ Type LengthSpecifier? ]

LengthSpecifier ::=
    ; Expression

Examples

[i32]
[i32; 3]
[i32; 3 + 4]

7.8. Parenthesised Types

Syntax

ParenthesisedType ::=
    ( Type )

Examples

(i32 | i64)

7.9. Equality Types

Warning

This is a work in progress.

Syntax

EqualityType ::=
    SingleType (~ SingleType)*

Examples

Lhs ~ Rhs

7.10. Union of Types

Warning

This is not implemented yet.

Syntax

UnionType ::=
    SingleType (| SingleType)*

Examples

i8 | i16 | i32 | i64

7.11. Implicit Function Types

Syntax

ImplicitFunctionType ::=
    < TypeParameterList? > -> Type

Examples

<T> -> T
<T := i32, U> -> (T, U)

7.11.1. Type Parameters

Syntax

SimpleTypeParameterList ::=
    SimpleTypeParameter (, SimpleTypeParameter)? ,?

SimpleTypeParameter ::=
    Name (: Type)
    | Type

TypeParameterList ::=
    TypeParameter (, TypeParameter)? ,?

TypeParameter ::=
    MacroInvocationHeader? TypeParameterContent

TypeParameterContent ::=
    Name : Type? = Type
    | Name : Type
    | Name

7.12. Implicit Function Call

Syntax

ImplicitFunctionCall ::=
    ImplicitFunctionCallSubject < TypeArgumentList? >

ImplicitFunctionCallSubject ::=
    Type
    | NonDeclarativeExpression

Examples

Data := struct<T>(
    id: i32,
    data: T,
)

foo := <T> => (data: Data<T>) -> i32 => {
    data.get_id()
}

7.12.1. Type Arguments

Syntax

TypeArgumentList ::=
    TypeArgument (, TypeArgument)? ,?

TypeArgument ::=
    MacroInvocationHeader? Name (= Type)?

7.13. Expressions in Types

Syntax

ExpressionInType ::=
    { NonDeclarativeExpression }
    | Literal

Examples

bar := (arg: { foo() }) => {
    ...
}

foo := () -> 1 => {
    1
}

7.14. Macro Invocations as Types

syntax

TypeMacroInvocation ::=
    MacroInvocationHeader SingleType

Examples

Foo := struct<#constrain T>(

)

Foo := type #c_union f32 | i32 | i64