============================================
Empty statements
============================================

;

---

(source_file (empty_statement))

============================================
Assigments statements
============================================

const a = 10;
var b = 1.1;

const a: u32 = 10;
var b: f128 = x;
var c: MyType = y;

var d: ?u64 = null;

threadlocal var a = 10;
threadlocal var a: ?u32 = 10;

comptime var a = 10;

var a: ?[4]?u8 = undefined;

const a: []u8 = undefined;
const b: [*]u8 = undefined;

const a: *u8 = undefined;
const b: *?u8 = undefined;
const c: *[*]u64 = undefined;

---

(source_file
  (assignment_statement
    name: (identifier)
    expression: (integer_literal))
  (assignment_statement
    name: (identifier)
    expression: (float_literal))
  (assignment_statement
    name: (identifier)
    type: (primitive_type)
    expression: (integer_literal))
  (assignment_statement
    name: (identifier)
    type: (primitive_type)
    expression: (identifier))
  (assignment_statement
    name: (identifier)
    type: (type_identifier)
    expression: (identifier))
  (assignment_statement
    name: (identifier)
    type: (optional_type
      (primitive_type))
    expression: (null_literal))
  (assignment_statement
    (assignment_modifier)
    name: (identifier)
    expression: (integer_literal))
  (assignment_statement
    (assignment_modifier)
    name: (identifier)
    type: (optional_type
      (primitive_type))
    expression: (integer_literal))
  (assignment_statement
    (assignment_modifier)
    name: (identifier)
    expression: (integer_literal))
  (assignment_statement
    name: (identifier)
    type: (optional_type
      (array_type
        size: (integer_literal)
        (optional_type
          (primitive_type))))
    expression: (undefined_literal))
  (assignment_statement
    name: (identifier)
    type: (array_type
      (primitive_type))
    expression: (undefined_literal))
  (assignment_statement
    name: (identifier)
    type: (array_type
      size: (pointer)
      (primitive_type))
    expression: (undefined_literal))
  (assignment_statement
    name: (identifier)
    type: (pointer_type
      (primitive_type))
    expression: (undefined_literal))
  (assignment_statement
    name: (identifier)
    type: (pointer_type
      (optional_type
        (primitive_type)))
    expression: (undefined_literal))
  (assignment_statement
    name: (identifier)
    type: (pointer_type
      (array_type
        size: (pointer)
        (primitive_type)))
    expression: (undefined_literal)))

============================================
Function declaration statements
============================================

fn name() {}
fn name(a: u8) {}
fn name(a: u8, b: u8) {}
fn name() u8 {}
fn name() @some(a) {}

pub fn name() {}
export fn name() {}
stdcallcc fn name() {}
nakedcc fn name() {}
inline fn name() {}

---

(source_file
  (function_declaration
    name: (identifier)
    parameters: (parameters)
    body: (block))
  (function_declaration
    name: (identifier)
    parameters: (parameters
      (parameter
        name: (identifier)
        type: (primitive_type)))
    body: (block))
  (function_declaration
    name: (identifier)
    parameters: (parameters
      (parameter
        name: (identifier)
        type: (primitive_type))
      (parameter
        name: (identifier)
        type: (primitive_type)))
    body: (block))
  (function_declaration
    name: (identifier)
    parameters: (parameters)
    return: (primitive_type)
    body: (block))
  (function_declaration
    name: (identifier)
    parameters: (parameters)
    return: (build_in_call_expr
      function: (identifier)
      arguments: (arguments
        (identifier)))
    body: (block))
  (function_declaration
    (visibility_modifier)
    name: (identifier)
    parameters: (parameters)
    body: (block))
  (function_declaration
    (function_modifiers)
    name: (identifier)
    parameters: (parameters)
    body: (block))
  (function_declaration
    (function_modifiers)
    name: (identifier)
    parameters: (parameters)
    body: (block))
  (function_declaration
    (function_modifiers)
    name: (identifier)
    parameters: (parameters)
    body: (block))
  (function_declaration
    (function_modifiers)
    name: (identifier)
    parameters: (parameters)
    body: (block)))

============================================
Function signature statements
============================================

fn name();
fn name(a: u8);
fn name(a: u8) u8;
fn name(a: u8) @some(a);

extern fn name();
extern "C" fn name();

---

(source_file
  (function_signature
    name: (identifier)
    parameters: (parameters))
  (function_signature
    name: (identifier)
    parameters: (parameters
      (parameter
        name: (identifier)
        type: (primitive_type))))
  (function_signature
    name: (identifier)
    parameters: (parameters
      (parameter
        name: (identifier)
        type: (primitive_type)))
    return: (primitive_type))
  (function_signature
    name: (identifier)
    parameters: (parameters
      (parameter
        name: (identifier)
        type: (primitive_type)))
    return: (build_in_call_expr
      function: (identifier)
      arguments: (arguments
        (identifier))))
  (function_signature
    (function_modifiers
      (extern_modifier))
    name: (identifier)
    parameters: (parameters))
  (function_signature
    (function_modifiers
      (extern_modifier
        (string_literal)))
    name: (identifier)
    parameters: (parameters)))
