library;
import self as self;
import "dart:core" as core;

class A extends core::Object {
  field dynamic field = null;
  default constructor •() → void
    : super core::Object::•()
    ;
}
class B extends core::Object {
  field dynamic field = null;
  default constructor •() → void
    : super core::Object::•()
    ;
}
class C extends core::Object {
  default constructor •() → void
    : super core::Object::•()
    ;
  operator ==(dynamic x) → dynamic
    return false;
}
class X extends core::Object implements self::A, self::B {
  field dynamic field = null;
  default constructor •() → void
    : super core::Object::•()
    ;
}
static method useAsA(self::A object) → void {
  dynamic _ = object.field;
}
static method useAsB(self::B object) → void {
  dynamic _ = object.field;
  self::escape(object);
}
static method escape(dynamic x) → void {
  x.==(null) ? x = "" : null;
  x.==(null) ? x = 45 : null;
  if(!(x is core::int) && !(x is core::String)) {
    x.field = 45;
  }
}
static method main() → dynamic {
  dynamic object = new self::X::•();
  self::useAsA(new self::A::•());
  self::useAsA(object);
  self::useAsB(new self::B::•());
  self::useAsB(object);
}
