===
Module methods
===

fn example {}
fn example() {}
fn example(a: A) {}
fn example(a: A, b: B) {}
fn example(a: A[A]) {}
fn example(a: A[A, B]) {}
fn example(a: Never) {}
fn example(a: ref A) {}
fn example(a: mut A) {}
fn example(a: uni A) {}
fn example(a: fn) {}
fn example(a: fn -> C) {}
fn example(a: fn (A, B) -> C) {}
fn example(a: ref fn) {}
fn example(a: mut fn) {}
fn example(a: uni fn) {}
fn example(a: move A) {}
fn example -> A {}
fn example[A] {}
fn example[A, B] {}
fn example[A: B + C + mut + D[A]] {}
fn example[A](a: A) -> A {}
fn pub example {}
fn example -> (A, B) {}
fn example= -> A {}
fn 0 {}
fn foo? {}
fn + {}
fn - {}
fn / {}
fn * {}
fn ** {}
fn % {}
fn < {}
fn > {}
fn <= {}
fn >= {}
fn << {}
fn >> {}
fn >>> {}
fn & {}
fn | {}
fn ^ {}
fn == {}
fn != {}
fn a$b {}

---

(source_file
  (method name: (identifier) body: (block))
  (method name: (identifier) arguments: (arguments) body: (block))
  (method
    name: (identifier)
    arguments: (arguments (argument name: (identifier) type: (type)))
    body: (block))
  (method
    name: (identifier)
    arguments: (arguments
      (argument name: (identifier) type: (type))
      (argument name: (identifier) type: (type)))
    body: (block))
  (method
    name: (identifier)
    arguments: (arguments
      (argument
        name: (identifier)
        type: (generic_type
          name: (constant)
          arguments: (type_arguments (type)))))
    body: (block))
  (method
    name: (identifier)
    arguments: (arguments
      (argument
        name: (identifier)
        type: (generic_type
          name: (constant)
          arguments: (type_arguments (type) (type)))))
    body: (block))
  (method
    name: (identifier)
    arguments: (arguments (argument name: (identifier) type: (type)))
    body: (block))
  (method
    name: (identifier)
    arguments: (arguments
      (argument name: (identifier) type: (ref_type type: (type))))
    body: (block))
  (method
    name: (identifier)
    arguments:
      (arguments (argument name: (identifier) type: (mut_type type: (type))))
    body: (block))
  (method
    name: (identifier)
    arguments:
      (arguments (argument name: (identifier) type: (uni_type type: (type))))
    body: (block))
  (method
    name: (identifier)
    arguments:
      (arguments (argument name: (identifier) type: (fn_type)))
    body: (block))
  (method
    name: (identifier)
    arguments:
      (arguments (argument name: (identifier) type: (fn_type returns: (type))))
    body: (block))
  (method
    name: (identifier)
    arguments:
      (arguments
        (argument
          name: (identifier)
          type: (fn_type arguments: (arguments (type) (type)) returns: (type))))
    body: (block))
  (method
    name: (identifier)
    arguments:
      (arguments (argument name: (identifier) type: (ref_type type: (fn_type))))
    body: (block))
  (method
    name: (identifier)
    arguments:
      (arguments (argument name: (identifier) type: (mut_type type: (fn_type))))
    body: (block))
  (method
    name: (identifier)
    arguments:
      (arguments (argument name: (identifier) type: (uni_type type: (fn_type))))
    body: (block))
  (method
    name: (identifier)
    arguments: (arguments
      (argument name: (identifier) type: (move_type type: (type))))
    body: (block))
  (method name: (identifier) returns: (type) body: (block))
  (method
    name: (identifier)
    type_parameters: (type_parameters (type_parameter name: (constant)))
    body: (block))
  (method
    name: (identifier)
    type_parameters: (type_parameters
      (type_parameter name: (constant)) (type_parameter name: (constant)))
    body: (block))
  (method
    name: (identifier)
    type_parameters: (type_parameters
      (type_parameter
        name: (constant)
        requirements: (requirements
          (type)
          (type)
          (mutable)
          (generic_type name: (constant) arguments: (type_arguments (type))))))
    body: (block))
  (method
    name: (identifier)
    type_parameters: (type_parameters (type_parameter name: (constant)))
    arguments: (arguments (argument name: (identifier) type: (type)))
    returns: (type)
    body: (block))
  (method visibility: (visibility) name: (identifier) body: (block))
  (method name: (identifier) returns: (tuple_type (type) (type)) body: (block))
  (method name: (identifier) returns: (type) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block))
  (method name: (identifier) body: (block)))

===
External functions
===

fn extern example
fn pub extern example
fn extern example(a: A) -> A
fn extern example(a: A) -> A {}
fn extern example(a: A, ...)
fn extern example(a: A, ...,)

---

(source_file
  (external_function name: (identifier))
  (external_function visibility: (visibility) name: (identifier))
  (external_function
    name: (identifier)
    arguments: (arguments (argument name: (identifier) type: (type)))
    returns: (type))
  (external_function
    name: (identifier)
    arguments: (arguments (argument name: (identifier) type: (type)))
    returns: (type)
    body: (block))
  (external_function
    name: (identifier)
    arguments: (arguments
      (argument name: (identifier) type: (type))
      (rest_argument)))
  (external_function
    name: (identifier)
    arguments: (arguments
      (argument name: (identifier) type: (type))
      (rest_argument))))
