================================================================================
Nullable pointer type
================================================================================

var x ?*int

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

(source_file
  (var_declaration
    (var_spec
      name: (identifier)
      type: (nullable_type
        (pointer_type
          (type_identifier))))))

================================================================================
Enum type declaration
================================================================================

type Option[T any] enum {
  Some T
  None
}

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

(source_file
  (type_declaration
    (type_spec
      name: (type_identifier)
      type_parameters: (type_parameter_list
        (type_parameter_declaration
          name: (identifier)
          type: (type_constraint
            (type_identifier))))
      type: (enum_type
        (enum_variant
          name: (identifier)
          type: (type_identifier))
        (enum_variant
          name: (identifier))))))

================================================================================
Enum with struct variant
================================================================================

type Shape enum {
  Circle struct { radius float64 }
  Rectangle struct {
    width float64
    height float64
  }
}

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

(source_file
  (type_declaration
    (type_spec
      name: (type_identifier)
      type: (enum_type
        (enum_variant
          name: (identifier)
          type: (struct_type
            (field_declaration_list
              (field_declaration
                name: (field_identifier)
                type: (type_identifier)))))
        (enum_variant
          name: (identifier)
          type: (struct_type
            (field_declaration_list
              (field_declaration
                name: (field_identifier)
                type: (type_identifier))
              (field_declaration
                name: (field_identifier)
                type: (type_identifier)))))))))

================================================================================
Match statement with qualified patterns
================================================================================

match opt {
case Option.Some(value):
  println(value)
case Option.None:
  println("none")
}

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

(source_file
  (match_statement
    value: (identifier)
    (match_case
      pattern: (pattern
        (variant_pattern
          type: (qualified_pattern
            qualifier: (identifier)
            name: (identifier))
          binding: (identifier)))
      (statement_list
        (expression_statement
          (call_expression
            function: (identifier)
            arguments: (argument_list
              (identifier))))))
    (match_case
      pattern: (pattern
        (qualified_pattern
          qualifier: (identifier)
          name: (identifier)))
      (statement_list
        (expression_statement
          (call_expression
            function: (identifier)
            arguments: (argument_list
              (interpreted_string_literal
                (interpreted_string_literal_content)))))))))

================================================================================
Try expression
================================================================================

func foo() error {
  x := bar() ?
  return nil
}

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

(source_file
  (function_declaration
    name: (identifier)
    parameters: (parameter_list)
    result: (type_identifier)
    body: (block
      (statement_list
        (short_var_declaration
          left: (expression_list
            (identifier))
          right: (expression_list
            (try_expression
              operand: (call_expression
                function: (identifier)
                arguments: (argument_list)))))
        (return_statement
          (expression_list
            (nil)))))))

================================================================================
Try expression with error handler
================================================================================

func foo() error {
  x := bar() ? err {
    return err
  }
  return nil
}

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

(source_file
  (function_declaration
    name: (identifier)
    parameters: (parameter_list)
    result: (type_identifier)
    body: (block
      (statement_list
        (short_var_declaration
          left: (expression_list
            (identifier))
          right: (expression_list
            (try_expression
              operand: (call_expression
                function: (identifier)
                arguments: (argument_list))
              error_name: (identifier)
              handler: (block
                (statement_list
                  (return_statement
                    (expression_list
                      (identifier))))))))
        (return_statement
          (expression_list
            (nil)))))))

================================================================================
Try expression with empty error handler
================================================================================

func foo() error {
  x := bar() ? err {}
  return nil
}

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

(source_file
  (function_declaration
    name: (identifier)
    parameters: (parameter_list)
    result: (type_identifier)
    body: (block
      (statement_list
        (short_var_declaration
          left: (expression_list
            (identifier))
          right: (expression_list
            (try_expression
              operand: (call_expression
                function: (identifier)
                arguments: (argument_list))
              error_name: (identifier)
              handler: (block))))
        (return_statement
          (expression_list
            (nil)))))))

================================================================================
Try expression with anonymous error handler
================================================================================

func foo() error {
  x := bar() ? {
    return nil
  }
  return nil
}

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

(source_file
  (function_declaration
    name: (identifier)
    parameters: (parameter_list)
    result: (type_identifier)
    body: (block
      (statement_list
        (short_var_declaration
          left: (expression_list
            (identifier))
          right: (expression_list
            (try_expression
              operand: (call_expression
                function: (identifier)
                arguments: (argument_list))
              handler: (block
                (statement_list
                  (return_statement
                    (expression_list
                      (nil))))))))
        (return_statement
          (expression_list
            (nil)))))))

================================================================================
Nil assertion expression
================================================================================

x.(!nil).field

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

(source_file
  (expression_statement
    (selector_expression
      operand: (nil_assertion_expression
        operand: (identifier))
      field: (field_identifier))))

================================================================================
String interpolation with expression
================================================================================

x := "Hello, {name}!"

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

(source_file
  (short_var_declaration
    left: (expression_list
      (identifier))
    right: (expression_list
      (interpreted_string_literal
        (interpreted_string_literal_content)
        (string_interpolation
          (identifier))
        (interpreted_string_literal_content)))))

================================================================================
String interpolation with function call
================================================================================

msg := "Count: {len(items)}"

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

(source_file
  (short_var_declaration
    left: (expression_list
      (identifier))
    right: (expression_list
      (interpreted_string_literal
        (interpreted_string_literal_content)
        (string_interpolation
          (call_expression
            function: (identifier)
            arguments: (argument_list
              (identifier))))))))

================================================================================
String with escaped braces
================================================================================

x := "Use {{name}} for interpolation"

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

(source_file
  (short_var_declaration
    left: (expression_list
      (identifier))
    right: (expression_list
      (interpreted_string_literal
        (interpreted_string_literal_content)
        (interpreted_string_literal_content)
        (interpreted_string_literal_content)
        (interpreted_string_literal_content)
        (interpreted_string_literal_content)))))

================================================================================
String with mixed interpolation and escaped braces
================================================================================

x := "Value: {x}, literal: {{y}}"

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

(source_file
  (short_var_declaration
    left: (expression_list
      (identifier))
    right: (expression_list
      (interpreted_string_literal
        (interpreted_string_literal_content)
        (string_interpolation
          (identifier))
        (interpreted_string_literal_content)
        (interpreted_string_literal_content)
        (interpreted_string_literal_content)
        (interpreted_string_literal_content)))))
