================================================================================
Using declarations
================================================================================

using
  c: int
  n: int
  counter: int

using c: int

--------------------------------------------------------------------------------

(source_file
  (using_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier)))
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier)))
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier))))
  (using_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier)))))

================================================================================
Constant declarations
================================================================================

const Foo = 0
coNs_T Bar: int = 10

const
  A = 10
  B: uint32 = 42

const (X, Y) = (1, 2)

const
  Z = 10
  (D, E, F) = (3, 4, 5)

const (X,
  Y*) = (1,
  2)

const
  foo,
    bar*,
    whatever = 10

const Test* {.importc: "TEST".}: int

--------------------------------------------------------------------------------

(source_file
  (const_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      value: (integer_literal)))
  (const_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier))
      value: (integer_literal)))
  (const_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      value: (integer_literal))
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier))
      value: (integer_literal)))
  (const_section
    (variable_declaration
      (symbol_declaration_list
        (tuple_deconstruct_declaration
          (symbol_declaration
            name: (identifier))
          (symbol_declaration
            name: (identifier))))
      value: (tuple_construction
        (integer_literal)
        (integer_literal))))
  (const_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      value: (integer_literal))
    (variable_declaration
      (symbol_declaration_list
        (tuple_deconstruct_declaration
          (symbol_declaration
            name: (identifier))
          (symbol_declaration
            name: (identifier))
          (symbol_declaration
            name: (identifier))))
      value: (tuple_construction
        (integer_literal)
        (integer_literal)
        (integer_literal))))
  (const_section
    (variable_declaration
      (symbol_declaration_list
        (tuple_deconstruct_declaration
          (symbol_declaration
            name: (identifier))
          (symbol_declaration
            name: (exported_symbol
              (identifier)))))
      value: (tuple_construction
        (integer_literal)
        (integer_literal))))
  (const_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier))
        (symbol_declaration
          name: (exported_symbol
            (identifier)))
        (symbol_declaration
          name: (identifier)))
      value: (integer_literal)))
  (const_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (exported_symbol
            (identifier))
          (pragma_list
            (colon_expression
              left: (identifier)
              right: (interpreted_string_literal
                (string_content))))))
      type: (type_expression
        (identifier)))))

================================================================================
Let declarations
================================================================================

let foo, dar = 0d
lET bar: float = 10f32

l_e_t
  a, c, d = 10
  b: uint32 = 42
  (e, f) = (1, 2)

let 😂 = fun

--------------------------------------------------------------------------------

(source_file
  (let_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier))
        (symbol_declaration
          name: (identifier)))
      value: (float_literal)))
  (let_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier))
      value: (float_literal)))
  (let_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier))
        (symbol_declaration
          name: (identifier))
        (symbol_declaration
          name: (identifier)))
      value: (integer_literal))
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier))
      value: (integer_literal))
    (variable_declaration
      (symbol_declaration_list
        (tuple_deconstruct_declaration
          (symbol_declaration
            name: (identifier))
          (symbol_declaration
            name: (identifier))))
      value: (tuple_construction
        (integer_literal)
        (integer_literal))))
  (let_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      value: (identifier))))

================================================================================
Var declarations
================================================================================

var foo = 0d
vaR bar: float = 10f32

v_a_r
  a = 10
  b: uint32 = 42

var x, y: int
var z, w: float

var (c, d) = (2, 3)
var (x, ) = (1, )

var x*:int
var y *: float

--------------------------------------------------------------------------------

(source_file
  (var_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      value: (float_literal)))
  (var_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier))
      value: (float_literal)))
  (var_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      value: (integer_literal))
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier))
      value: (integer_literal)))
  (var_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier))
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier))))
  (var_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (identifier))
        (symbol_declaration
          name: (identifier)))
      type: (type_expression
        (identifier))))
  (var_section
    (variable_declaration
      (symbol_declaration_list
        (tuple_deconstruct_declaration
          (symbol_declaration
            name: (identifier))
          (symbol_declaration
            name: (identifier))))
      value: (tuple_construction
        (integer_literal)
        (integer_literal))))
  (var_section
    (variable_declaration
      (symbol_declaration_list
        (tuple_deconstruct_declaration
          (symbol_declaration
            name: (identifier))))
      value: (tuple_construction
        (integer_literal))))
  (var_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (exported_symbol
            (identifier))))
      type: (type_expression
        (identifier))))
  (var_section
    (variable_declaration
      (symbol_declaration_list
        (symbol_declaration
          name: (exported_symbol
            (identifier))))
      type: (type_expression
        (identifier)))))

================================================================================
Type aliases
================================================================================

type X = int
type
  Y = distinct int
  A[T] = ref T

--------------------------------------------------------------------------------

(source_file
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (type_expression
        (identifier))))
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (distinct_type
        (type_expression
          (identifier))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier)
        (generic_parameter_list
          (parameter_declaration
            (symbol_declaration_list
              (symbol_declaration
                name: (identifier))))))
      (ref_type
        (type_expression
          (identifier))))))

================================================================================
Object declarations
================================================================================

type
  SeqData[T] = object
    capacity: int
    buffer: UncheckedArray[T]

  NimNodeObj = object
    case kind: NimNodeKind
    of nnkError:
      discard
    of nnkNone, nnkEmpty, nnkNilLit:
      nil
    of nnkCharLit..nnkUInt64Lit:
      intVal: BiggestInt
    of nnkFloatLit..nnkFloat64Lit:
      floatVal: BiggestFloat
    of nnkStrLit..nnkTripleStrLit, nnkCommentStmt, nnkIdent, nnkSym:
      strVal: string
    else:
      sons: seq[NimNode]

  ObjWithIndentedCase = object
    case sad: bool:
      of true: nil

type ValueError = object of Exception

type
  B = ref object
    a*, c*, d: string
    b,
      e,
      f: string

  Person* {.ro, tableName: "PERSON".} = ref object of Model
    name* {.unique.}: string
    pet* {.onDelete: "CASCADE".}: Option[Pet]

type
  C = object
  D = ref object
  E = object
    when foo: x: int

type
  Unfinished = object
    when x:

    case foo: bar
    of a: string

--------------------------------------------------------------------------------

(source_file
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier)
        (generic_parameter_list
          (parameter_declaration
            (symbol_declaration_list
              (symbol_declaration
                name: (identifier))))))
      (object_declaration
        (field_declaration_list
          (field_declaration
            (symbol_declaration_list
              (symbol_declaration
                name: (identifier)))
            type: (type_expression
              (identifier)))
          (field_declaration
            (symbol_declaration_list
              (symbol_declaration
                name: (identifier)))
            type: (type_expression
              (bracket_expression
                left: (identifier)
                right: (argument_list
                  (identifier))))))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (object_declaration
        (field_declaration_list
          (variant_declaration
            (variant_discriminator_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (identifier)))
              type: (type_expression
                (identifier)))
            alternative: (of_branch
              values: (expression_list
                (identifier))
              consequence: (field_declaration_list
                (discard_statement)))
            alternative: (of_branch
              values: (expression_list
                (identifier)
                (identifier)
                (identifier))
              consequence: (field_declaration_list
                (nil_literal)))
            alternative: (of_branch
              values: (expression_list
                (infix_expression
                  left: (identifier)
                  operator: (operator)
                  right: (identifier)))
              consequence: (field_declaration_list
                (field_declaration
                  (symbol_declaration_list
                    (symbol_declaration
                      name: (identifier)))
                  type: (type_expression
                    (identifier)))))
            alternative: (of_branch
              values: (expression_list
                (infix_expression
                  left: (identifier)
                  operator: (operator)
                  right: (identifier)))
              consequence: (field_declaration_list
                (field_declaration
                  (symbol_declaration_list
                    (symbol_declaration
                      name: (identifier)))
                  type: (type_expression
                    (identifier)))))
            alternative: (of_branch
              values: (expression_list
                (infix_expression
                  left: (identifier)
                  operator: (operator)
                  right: (identifier))
                (identifier)
                (identifier)
                (identifier))
              consequence: (field_declaration_list
                (field_declaration
                  (symbol_declaration_list
                    (symbol_declaration
                      name: (identifier)))
                  type: (type_expression
                    (identifier)))))
            alternative: (else_branch
              consequence: (field_declaration_list
                (field_declaration
                  (symbol_declaration_list
                    (symbol_declaration
                      name: (identifier)))
                  type: (type_expression
                    (bracket_expression
                      left: (identifier)
                      right: (argument_list
                        (identifier)))))))))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (object_declaration
        (field_declaration_list
          (variant_declaration
            (variant_discriminator_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (identifier)))
              type: (type_expression
                (identifier)))
            alternative: (of_branch
              values: (expression_list
                (identifier))
              consequence: (field_declaration_list
                (nil_literal))))))))
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (object_declaration
        inherits: (type_expression
          (identifier)))))
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (ref_type
        (object_declaration
          (field_declaration_list
            (field_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (exported_symbol
                    (identifier)))
                (symbol_declaration
                  name: (exported_symbol
                    (identifier)))
                (symbol_declaration
                  name: (identifier)))
              type: (type_expression
                (identifier)))
            (field_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (identifier))
                (symbol_declaration
                  name: (identifier))
                (symbol_declaration
                  name: (identifier)))
              type: (type_expression
                (identifier)))))))
    (type_declaration
      (type_symbol_declaration
        name: (exported_symbol
          (identifier))
        pragma: (pragma_list
          (identifier)
          (colon_expression
            left: (identifier)
            right: (interpreted_string_literal
              (string_content)))))
      (ref_type
        (object_declaration
          inherits: (type_expression
            (identifier))
          (field_declaration_list
            (field_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (exported_symbol
                    (identifier))
                  (pragma_list
                    (identifier))))
              type: (type_expression
                (identifier)))
            (field_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (exported_symbol
                    (identifier))
                  (pragma_list
                    (colon_expression
                      left: (identifier)
                      right: (interpreted_string_literal
                        (string_content))))))
              type: (type_expression
                (bracket_expression
                  left: (identifier)
                  right: (argument_list
                    (identifier))))))))))
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (object_declaration))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (ref_type
        (object_declaration)))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (object_declaration
        (field_declaration_list
          (conditional_declaration
            condition: (identifier)
            consequence: (field_declaration_list
              (field_declaration
                (symbol_declaration_list
                  (symbol_declaration
                    name: (identifier)))
                type: (type_expression
                  (identifier)))))))))
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (object_declaration
        (field_declaration_list
          (conditional_declaration
            condition: (identifier)
            consequence: (field_declaration_list))
          (variant_declaration
            (variant_discriminator_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (identifier)))
              type: (type_expression
                (identifier)))
            alternative: (of_branch
              values: (expression_list
                (identifier))
              consequence: (field_declaration_list
                (field_declaration
                  (symbol_declaration_list
                    (symbol_declaration
                      name: (identifier))))))))))))

================================================================================
Tuple declarations
================================================================================

type
  Z = tuple[x, y: int]
  W = tuple
    x: int
    y: int

  V = tuple

--------------------------------------------------------------------------------

(source_file
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (type_expression
        (tuple_type
          (field_declaration_list
            (field_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (identifier))
                (symbol_declaration
                  name: (identifier)))
              type: (type_expression
                (identifier)))))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (tuple_type
        (field_declaration
          (symbol_declaration_list
            (symbol_declaration
              name: (identifier)))
          type: (type_expression
            (identifier)))
        (field_declaration
          (symbol_declaration_list
            (symbol_declaration
              name: (identifier)))
          type: (type_expression
            (identifier)))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (type_expression
        (tuple_type)))))

================================================================================
Concept declarations
================================================================================

type
  OutputStream = concept var s
    s.write(string)

  AdditiveMonoid* = concept x, y, type T
    x + y is T
    T.zero is T

  Graph = concept g, type G of EquallyComparable, Copyable
    type
      VertexType = G.VertexType
      EdgeType = G.EdgeType

    VertexType is Copyable
    EdgeType is Copyable

    var
      v: VertexType
      e: EdgeType

  IncidendeGraph = concept of Graph
    # symbols such as variables and types from the refined
    # concept are automatically in scope:

    g.source(e) is VertexType
    g.target(e) is VertexType

    g.outgoingEdges(v) is Enumerable[EdgeType]

  Empty = concept

--------------------------------------------------------------------------------

(source_file
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (concept_declaration
        parameters: (parameter_list
          (var_parameter
            (identifier)))
        body: (statement_list
          (call
            function: (dot_expression
              left: (identifier)
              right: (identifier))
            (argument_list
              (identifier))))))
    (type_declaration
      (type_symbol_declaration
        name: (exported_symbol
          (identifier)))
      (concept_declaration
        parameters: (parameter_list
          (identifier)
          (identifier)
          (type_parameter
            (identifier)))
        body: (statement_list
          (infix_expression
            left: (infix_expression
              left: (identifier)
              operator: (operator)
              right: (identifier))
            right: (identifier))
          (infix_expression
            left: (dot_expression
              left: (identifier)
              right: (identifier))
            right: (identifier)))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (concept_declaration
        parameters: (parameter_list
          (identifier)
          (type_parameter
            (identifier)))
        refines: (refinement_list
          (type_expression
            (identifier))
          (type_expression
            (identifier)))
        body: (statement_list
          (type_section
            (type_declaration
              (type_symbol_declaration
                name: (identifier))
              (type_expression
                (dot_expression
                  left: (identifier)
                  right: (identifier))))
            (type_declaration
              (type_symbol_declaration
                name: (identifier))
              (type_expression
                (dot_expression
                  left: (identifier)
                  right: (identifier)))))
          (infix_expression
            left: (identifier)
            right: (identifier))
          (infix_expression
            left: (identifier)
            right: (identifier))
          (var_section
            (variable_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (identifier)))
              type: (type_expression
                (identifier)))
            (variable_declaration
              (symbol_declaration_list
                (symbol_declaration
                  name: (identifier)))
              type: (type_expression
                (identifier)))))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (concept_declaration
        refines: (refinement_list
          (type_expression
            (identifier)))
        (comment
          (comment_content))
        (comment
          (comment_content))
        body: (statement_list
          (infix_expression
            left: (call
              function: (dot_expression
                left: (identifier)
                right: (identifier))
              (argument_list
                (identifier)))
            right: (identifier))
          (infix_expression
            left: (call
              function: (dot_expression
                left: (identifier)
                right: (identifier))
              (argument_list
                (identifier)))
            right: (identifier))
          (infix_expression
            left: (call
              function: (dot_expression
                left: (identifier)
                right: (identifier))
              (argument_list
                (identifier)))
            right: (bracket_expression
              left: (identifier)
              right: (argument_list
                (identifier)))))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (concept_declaration))))

================================================================================
Routine declarations
================================================================================

proc foo(): int =
  discard

proc imported() {.importc.}

template optMul{`*`(a, 2)}(a: int): int = a+a

macro that(this): untyped = discard

method exists(x: RootObj) {.base.} = echo "doesn't"

iterator items(x: seq[int]): (int, int) =
  for i in x:
    yield (0, i)

converter toInt(x: Natural): int =
  int(x)

proc bar

proc bar =
  ## comment

proc foo =
  ## comment

proc trailing(x,)

proc trailing_fun(x, y,: float)

proc generic[]() = discard

template foo{x; y += 10}() = discard

template foo{
  var x = 100;
  x * x + 100
}() = discard

--------------------------------------------------------------------------------

(source_file
  (proc_declaration
    name: (identifier)
    parameters: (parameter_declaration_list)
    return_type: (type_expression
      (identifier))
    body: (statement_list
      (discard_statement)))
  (proc_declaration
    name: (identifier)
    parameters: (parameter_declaration_list)
    pragmas: (pragma_list
      (identifier)))
  (template_declaration
    name: (identifier)
    rewrite_pattern: (term_rewriting_pattern
      (statement_list
        (call
          function: (accent_quoted
            (identifier))
          (argument_list
            (identifier)
            (integer_literal)))))
    parameters: (parameter_declaration_list
      (parameter_declaration
        (symbol_declaration_list
          (symbol_declaration
            name: (identifier)))
        type: (type_expression
          (identifier))))
    return_type: (type_expression
      (identifier))
    body: (statement_list
      (infix_expression
        left: (identifier)
        operator: (operator)
        right: (identifier))))
  (macro_declaration
    name: (identifier)
    parameters: (parameter_declaration_list
      (parameter_declaration
        (symbol_declaration_list
          (symbol_declaration
            name: (identifier)))))
    return_type: (type_expression
      (identifier))
    body: (statement_list
      (discard_statement)))
  (method_declaration
    name: (identifier)
    parameters: (parameter_declaration_list
      (parameter_declaration
        (symbol_declaration_list
          (symbol_declaration
            name: (identifier)))
        type: (type_expression
          (identifier))))
    pragmas: (pragma_list
      (identifier))
    body: (statement_list
      (call
        function: (identifier)
        (argument_list
          (interpreted_string_literal
            (string_content))))))
  (iterator_declaration
    name: (identifier)
    parameters: (parameter_declaration_list
      (parameter_declaration
        (symbol_declaration_list
          (symbol_declaration
            name: (identifier)))
        type: (type_expression
          (bracket_expression
            left: (identifier)
            right: (argument_list
              (identifier))))))
    return_type: (type_expression
      (tuple_construction
        (identifier)
        (identifier)))
    body: (statement_list
      (for
        left: (symbol_declaration_list
          (symbol_declaration
            name: (identifier)))
        right: (identifier)
        body: (statement_list
          (yield_statement
            (tuple_construction
              (integer_literal)
              (identifier)))))))
  (converter_declaration
    name: (identifier)
    parameters: (parameter_declaration_list
      (parameter_declaration
        (symbol_declaration_list
          (symbol_declaration
            name: (identifier)))
        type: (type_expression
          (identifier))))
    return_type: (type_expression
      (identifier))
    body: (statement_list
      (call
        function: (identifier)
        (argument_list
          (identifier)))))
  (proc_declaration
    name: (identifier))
  (proc_declaration
    name: (identifier)
    (documentation_comment
      (comment_content))
    body: (statement_list))
  (proc_declaration
    name: (identifier)
    (documentation_comment
      (comment_content))
    body: (statement_list))
  (proc_declaration
    name: (identifier)
    parameters: (parameter_declaration_list
      (parameter_declaration
        (symbol_declaration_list
          (symbol_declaration
            name: (identifier))))))
  (proc_declaration
    name: (identifier)
    parameters: (parameter_declaration_list
      (parameter_declaration
        (symbol_declaration_list
          (symbol_declaration
            name: (identifier))
          (symbol_declaration
            name: (identifier)))
        type: (type_expression
          (identifier)))))
  (proc_declaration
    name: (identifier)
    generic_parameters: (generic_parameter_list)
    parameters: (parameter_declaration_list)
    body: (statement_list
      (discard_statement)))
  (template_declaration
    name: (identifier)
    rewrite_pattern: (term_rewriting_pattern
      (statement_list
        (identifier)
        (infix_expression
          left: (identifier)
          operator: (operator)
          right: (integer_literal))))
    parameters: (parameter_declaration_list)
    body: (statement_list
      (discard_statement)))
  (template_declaration
    name: (identifier)
    rewrite_pattern: (term_rewriting_pattern
      (statement_list
        (var_section
          (variable_declaration
            (symbol_declaration_list
              (symbol_declaration
                name: (identifier)))
            value: (integer_literal)))
        (infix_expression
          left: (infix_expression
            left: (identifier)
            operator: (operator)
            right: (identifier))
          operator: (operator)
          right: (integer_literal))))
    parameters: (parameter_declaration_list)
    body: (statement_list
      (discard_statement))))

================================================================================
Enum declarations
================================================================================

type
  E = enum A, B, C, D

  Valued = enum
    X = "X"
    B = "B"

  LineAndComma = enum
    X,
    Y,
    D = "X"

  MultiLine = enum
    X, Y, Z,
    D
    E

  Complex = enum
    X = when x: y else: z

--------------------------------------------------------------------------------

(source_file
  (type_section
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (enum_declaration
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (enum_declaration
        (enum_field_declaration
          (symbol_declaration
            name: (identifier))
          value: (interpreted_string_literal
            (string_content)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier))
          value: (interpreted_string_literal
            (string_content)))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (enum_declaration
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier))
          value: (interpreted_string_literal
            (string_content)))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (enum_declaration
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))
        (enum_field_declaration
          (symbol_declaration
            name: (identifier)))))
    (type_declaration
      (type_symbol_declaration
        name: (identifier))
      (enum_declaration
        (enum_field_declaration
          (symbol_declaration
            name: (identifier))
          value: (when
            condition: (identifier)
            consequence: (statement_list
              (identifier))
            alternative: (else_branch
              consequence: (statement_list
                (identifier)))))))))

================================================================================
Empty type declarations
================================================================================

type
  X
  Y
  Z {.magic: "Int".}

--------------------------------------------------------------------------------

(source_file
  (type_section
    (type_declaration
      (type_symbol_declaration
        (identifier)))
    (type_declaration
      (type_symbol_declaration
        (identifier)))
    (type_declaration
      (type_symbol_declaration
        (identifier)
        (pragma_list
          (colon_expression
            (identifier)
            (interpreted_string_literal
              (string_content))))))))
