=======
aliases
=======

stock float operator++(float oper)
{
	return oper+1.0;
}

stock float operator--(float oper)
{
	return oper-1.0;
}

stock Foo operator--(Foo oper)
{
	return oper-1.0;
}

---

(source_file
  (alias_declaration
    (visibility)
    (type
      (builtin_type)
    )
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
    )
    (block
      (return_statement
        (binary_expression
          (identifier)
          (float_literal)
        )
      )
    )
  )
  (alias_declaration
    (visibility)
    (type
      (builtin_type)
    )
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
    )
    (block
      (return_statement
        (binary_expression
          (identifier)
          (float_literal)
        )
      )
    )
  )
  (alias_declaration
    (visibility)
    (type
      (identifier)
    )
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (type
          (identifier)
        )
        (identifier)
      )
    )
    (block
      (return_statement
        (binary_expression
          (identifier)
          (float_literal)
        )
      )
    )
  )
)


===================
aliases assignments
===================

native float __FLOAT_MUL__(float a, float b) = FloatMul;
native float __FLOAT_DIV__(float a, float b) = FloatDiv;
native float operator*(float oper1, float oper2) = FloatMul;
native float operator-(float oper1, float oper2) = FloatSub;

---

(source_file
  (function_declaration
    (function_declaration_kind)
    (type
      (builtin_type)
    )
    (identifier)
    (parameter_declarations
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
    )
    (identifier)
  )
  (function_declaration
    (function_declaration_kind)
    (type
      (builtin_type)
    )
    (identifier)
    (parameter_declarations
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
    )
    (identifier)
  )
  (alias_assignment
    (function_declaration_kind)
    (builtin_type)
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
    )
    (identifier)
  )
  (alias_assignment
    (function_declaration_kind)
    (builtin_type)
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
    )
    (identifier)
  )
)


===================
forbidden operators
===================

forward operator%(float oper1, float oper2);

---

(source_file
  (alias_declaration
    (function_declaration_kind)
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
      (parameter_declaration
        (type
          (builtin_type)
        )
        (identifier)
      )
    )
  )
)


=============
old - aliases
=============

stock Float:operator++(Float:oper)
{
	return oper+1.0;
}

stock Float:operator*(Float:oper1, oper2)
{
	return FloatMul(oper1, float(oper2));
}

stock Foo:operator*(Foo:oper1, oper2)
{
	return FloatMul(oper1, Foo(oper2));
}

---

(source_file
  (alias_declaration
    (visibility)
    (old_type
      (old_builtin_type)
    )
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (old_type
          (old_builtin_type)
        )
        (identifier)
      )
    )
    (block
      (return_statement
        (binary_expression
          (identifier)
          (float_literal)
        )
      )
    )
  )
  (alias_declaration
    (visibility)
    (old_type
      (old_builtin_type)
    )
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (old_type
          (old_builtin_type)
        )
        (identifier)
      )
      (parameter_declaration
        (identifier)
      )
    )
    (block
      (return_statement
        (call_expression
          (identifier)
          (call_arguments
            (identifier)
            (call_expression
              (identifier)
              (call_arguments
                (identifier)
              )
            )
          )
        )
      )
    )
  )
  (alias_declaration
    (visibility)
    (old_type
      (identifier)
    )
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (old_type
          (identifier)
        )
        (identifier)
      )
      (parameter_declaration
        (identifier)
      )
    )
    (block
      (return_statement
        (call_expression
          (identifier)
          (call_arguments
            (identifier)
            (call_expression
              (identifier)
              (call_arguments
                (identifier)
              )
            )
          )
        )
      )
    )
  )
)


======================
old - alias_assignment
======================

native Float:operator*(Float:oper1, Float:oper2) = FloatMul;

---

(source_file
  (alias_assignment
    (function_declaration_kind)
    (old_builtin_type)
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (old_type
          (old_builtin_type)
        )
        (identifier)
      )
      (parameter_declaration
        (old_type
          (old_builtin_type)
        )
        (identifier)
      )
    )
    (identifier)
  )
)


=========================
old - forbidden operators
=========================

forward operator%(Float:oper1, Float:oper2);

---

(source_file
  (alias_declaration
    (function_declaration_kind)
    (alias_operator)
    (parameter_declarations
      (parameter_declaration
        (old_type
          (old_builtin_type)
        )
        (identifier)
      )
      (parameter_declaration
        (old_type
          (old_builtin_type)
        )
        (identifier)
      )
    )
  )
)
