=======
typedef
=======

typedef SrvCmd = function Action (int args);
typedef SrvCmd = function Action[MAXPLAYERS+1][](int args, const char[] args, int &foo);

---

(source_file
  (typedef
    name: (identifier)
    (typedef_expression
      returnType: (type
        (identifier)
      )
      parameters: (parameter_declarations
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
        )
      )
    )
  )
  (typedef
    name: (identifier)
    (typedef_expression
      returnType: (type
        (identifier)
      )
      returnType: (fixed_dimension
        (binary_expression
          left: (identifier)
          right: (int_literal)
        )
      )
      returnType: (dimension)
      parameters: (parameter_declarations
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
        )
        (parameter_declaration
          storage_class: (variable_storage_class)
          type: (array_type
            (type
              (builtin_type)
            )
            (dimension)
          )
          name: (identifier)
        )
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
        )
      )
    )
  )
)


=================================
typedef with wrapping parenthesis
=================================

typedef SrvCmd = (function Action (int args));

---

(source_file
  (typedef
    name: (identifier)
    (typedef_expression
      returnType: (type
        (identifier)
      )
      parameters: (parameter_declarations
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
        )
      )
    )
  )
)


======================
typedef with semicolon
======================

typedef SrvCmd = function Action (int args);

---

(source_file
  (typedef
    name: (identifier)
    (typedef_expression
      returnType: (type
        (identifier)
      )
      parameters: (parameter_declarations
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
        )
      )
    )
  )
)


===============================
typedef with multiple arguments
===============================

typedef CustomHandler =
    function void (
        Handle handle,
        int &flag, 
        int client,
        const char[] name,
        float health,
        bool visible,
        float position[3],
        any data);

---

(source_file
  (typedef
    name: (identifier)
    (typedef_expression
      returnType: (type
        (builtin_type)
      )
      parameters: (parameter_declarations
        (parameter_declaration
          type: (type
            (identifier)
          )
          name: (identifier)
        )
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
        )
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
        )
        (parameter_declaration
          storage_class: (variable_storage_class)
          type: (array_type
            (type
              (builtin_type)
            )
            (dimension)
          )
          name: (identifier)
        )
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
        )
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
        )
        (parameter_declaration
          type: (type
            (builtin_type)
          )
          name: (identifier)
          (fixed_dimension
            (int_literal)
          )
        )
        (parameter_declaration
          type: (type
            (any_type)
          )
          name: (identifier)
        )
      )
    )
  )
)


=======
functag
=======

functag public Action:SrvCmd(args, &Handle:datapack)

---

(source_file
  (functag
    returnType: (old_type
      (identifier)
    )
    name: (identifier)
    parameters: (parameter_declarations
      (parameter_declaration
        name: (identifier)
      )
      (parameter_declaration
        type: (old_type
          (identifier)
        )
        name: (identifier)
      )
    )
  )
)


======================
functag with semicolon
======================

functag public Action:SrvCmd(args, &Handle:datapack);

---

(source_file
  (functag
    returnType: (old_type
      (identifier)
    )
    name: (identifier)
    parameters: (parameter_declarations
      (parameter_declaration
        name: (identifier)
      )
      (parameter_declaration
        type: (old_type
          (identifier)
        )
        name: (identifier)
      )
    )
  )
)


======================
functag no return type
======================

functag SrvCmd public(args, &Handle:datapack)

---

(source_file
  (functag
    name: (identifier)
    parameters: (parameter_declarations
      (parameter_declaration
        name: (identifier)
      )
      (parameter_declaration
        type: (old_type
          (identifier)
        )
        name: (identifier)
      )
    )
  )
)


=====================================
functag no return type with semicolon
=====================================

functag SrvCmd public(args, &Handle:datapack);

---

(source_file
  (functag
    name: (identifier)
    parameters: (parameter_declarations
      (parameter_declaration
        name: (identifier)
      )
      (parameter_declaration
        type: (old_type
          (identifier)
        )
        name: (identifier)
      )
    )
  )
)


===============================
functag alternative declaration
===============================

functag Entity_ChangeOverTimeCallback bool:public(&entity, &Float:interval, &currentCall);

---

(source_file
  (functag
    name: (identifier)
    returnType: (old_type
      (old_builtin_type)
    )
    parameters: (parameter_declarations
      (parameter_declaration
        name: (identifier)
      )
      (parameter_declaration
        type: (old_type
          (old_builtin_type)
        )
        name: (identifier)
      )
      (parameter_declaration
        name: (identifier)
      )
    )
  )
)
