library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
//   Operators(c) == c;
//   ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
//   Operators(c) != c;
//   ^^^^^^^^^
//
import self as self;
import "dart:core" as core;

class Complex extends core::Object /*hasConstConstructor*/  {
  final field core::double real;
  final field core::double imaginary;
  const constructor •(core::double real, core::double imaginary) → self::Complex
    : self::Complex::real = real, self::Complex::imaginary = imaginary, super core::Object::•()
    ;
  method add(self::Complex other) → self::Complex {
    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::+}(other.{self::Complex::real}{core::double}){(core::num) → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::+}(other.{self::Complex::imaginary}{core::double}){(core::num) → core::double});
  }
  method sub(self::Complex other) → self::Complex {
    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::-}(other.{self::Complex::real}{core::double}){(core::num) → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::-}(other.{self::Complex::imaginary}{core::double}){(core::num) → core::double});
  }
  method negate() → self::Complex {
    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::unary-}(){() → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::unary-}(){() → core::double});
  }
  get hashCode() → core::int
    return this.{self::Complex::real}{core::double}.{core::num::hashCode}{core::int}.{core::num::*}(13){(core::num) → core::int}.{core::num::+}(this.{self::Complex::imaginary}{core::double}.{core::num::hashCode}{core::int}.{core::num::*}(19){(core::num) → core::int}){(core::num) → core::int};
  operator ==(core::Object other) → core::bool {
    if(core::identical(this, other))
      return true;
    return other is{ForNonNullableByDefault} self::Complex && this.{self::Complex::real}{core::double} =={core::num::==}{(core::Object) → core::bool} other{self::Complex}.{self::Complex::real}{core::double} && this.{self::Complex::imaginary}{core::double} =={core::num::==}{(core::Object) → core::bool} other{self::Complex}.{self::Complex::imaginary}{core::double};
  }
  method toString() → core::String
    return "Complex(${this.{self::Complex::real}{core::double}},${this.{self::Complex::imaginary}{core::double}})";
}
extension Operators on self::Complex {
  operator + = self::Operators|+;
  operator - = self::Operators|-;
  operator unary- = self::Operators|unary-;
}
static method Operators|+(lowered final self::Complex #this, self::Complex other) → self::Complex
  return #this.{self::Complex::add}(other){(self::Complex) → self::Complex};
static method Operators|-(lowered final self::Complex #this, self::Complex other) → self::Complex
  return #this.{self::Complex::sub}(other){(self::Complex) → self::Complex};
static method Operators|unary-(lowered final self::Complex #this) → self::Complex
  return #this.{self::Complex::negate}(){() → self::Complex};
static method main() → dynamic {
  self::implicit();
  self::explicit();
}
static method implicit() → dynamic {
  self::Complex c_m2 = new self::Complex::•(-2.0, 2.0);
  self::Complex c_m1 = new self::Complex::•(-1.0, 1.0);
  self::Complex c0 = new self::Complex::•(0.0, 0.0);
  self::Complex c1 = new self::Complex::•(1.0, -1.0);
  self::Complex c2 = new self::Complex::•(2.0, -2.0);
  self::expect(c_m2, self::Operators|+(c0, c_m2));
  self::expect(c_m2, self::Operators|+(c_m2, c0));
  self::expect(c_m2, self::Operators|+(c_m1, c_m1));
  self::expect(c_m1, self::Operators|+(c0, c_m1));
  self::expect(c_m1, self::Operators|+(c_m1, c0));
  self::expect(c0, self::Operators|+(c_m2, c2));
  self::expect(c0, self::Operators|+(c2, c_m2));
  self::expect(c0, self::Operators|+(c_m1, c1));
  self::expect(c0, self::Operators|+(c1, c_m1));
  self::expect(c0, self::Operators|+(c0, c0));
  self::expect(c1, self::Operators|+(c0, c1));
  self::expect(c1, self::Operators|+(c1, c0));
  self::expect(c2, self::Operators|+(c0, c2));
  self::expect(c2, self::Operators|+(c2, c0));
  self::expect(c2, self::Operators|+(c1, c1));
  self::expect(c_m2, self::Operators|-(c0, c2));
  self::expect(c2, self::Operators|-(c2, c0));
  self::expect(c_m2, self::Operators|unary-(c2));
  self::expect(c_m1, self::Operators|-(c1, c2));
  self::expect(c1, self::Operators|-(c2, c1));
  self::expect(c_m1, self::Operators|-(c0, c1));
  self::expect(c1, self::Operators|-(c1, c0));
  self::expect(c_m1, self::Operators|unary-(c1));
  self::expect(c0, self::Operators|-(c2, c2));
  self::expect(c0, self::Operators|-(c1, c1));
  self::expect(c0, self::Operators|-(c0, c0));
  self::expect(c0, self::Operators|-(c_m1, c_m1));
  self::expect(c0, self::Operators|-(c_m2, c_m2));
  self::expect(c0, self::Operators|unary-(c0));
}
static method explicit() → dynamic {
  self::Complex c_m2 = new self::Complex::•(-2.0, 2.0);
  self::Complex c_m1 = new self::Complex::•(-1.0, 1.0);
  self::Complex c0 = new self::Complex::•(0.0, 0.0);
  self::Complex c1 = new self::Complex::•(1.0, -1.0);
  self::Complex c2 = new self::Complex::•(2.0, -2.0);
  self::expect(c_m2, self::Operators|+(c0, c_m2));
  self::expect(c_m2, self::Operators|+(c_m2, c0));
  self::expect(c_m2, self::Operators|+(c_m1, c_m1));
  self::expect(c_m1, self::Operators|+(c0, c_m1));
  self::expect(c_m1, self::Operators|+(c_m1, c0));
  self::expect(c0, self::Operators|+(c_m2, c2));
  self::expect(c0, self::Operators|+(c2, c_m2));
  self::expect(c0, self::Operators|+(c_m1, c1));
  self::expect(c0, self::Operators|+(c1, c_m1));
  self::expect(c0, self::Operators|+(c0, c0));
  self::expect(c1, self::Operators|+(c0, c1));
  self::expect(c1, self::Operators|+(c1, c0));
  self::expect(c2, self::Operators|+(c0, c2));
  self::expect(c2, self::Operators|+(c2, c0));
  self::expect(c2, self::Operators|+(c1, c1));
  self::expect(c_m2, self::Operators|-(c0, c2));
  self::expect(c2, self::Operators|-(c2, c0));
  self::expect(c_m2, self::Operators|unary-(c2));
  self::expect(c_m1, self::Operators|-(c1, c2));
  self::expect(c1, self::Operators|-(c2, c1));
  self::expect(c_m1, self::Operators|-(c0, c1));
  self::expect(c1, self::Operators|-(c1, c0));
  self::expect(c_m1, self::Operators|unary-(c1));
  self::expect(c0, self::Operators|-(c2, c2));
  self::expect(c0, self::Operators|-(c1, c1));
  self::expect(c0, self::Operators|-(c0, c0));
  self::expect(c0, self::Operators|-(c_m1, c_m1));
  self::expect(c0, self::Operators|-(c_m2, c_m2));
  self::expect(c0, self::Operators|unary-(c0));
}
static method errors(self::Complex c) → void {
  invalid-expression "pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
  Operators(c) == c;
  ^^^^^^^^^" =={core::Object::==}{(core::Object) → core::bool} c;
  !(invalid-expression "pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
  Operators(c) != c;
  ^^^^^^^^^" =={core::Object::==}{(core::Object) → core::bool} c);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
    throw "Mismatch: expected=${expected}, actual=${actual}";
  }
}
