library;
import self as self;
import "infer_type_regardless_of_declaration_order_or_cycles.dart" as test;

import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";

class B extends test::A {
  synthetic constructor •() → self::B*
    ;
}
static method main() → dynamic
  ;

library test;
import self as test;
import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
import "dart:core" as core;

import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";

class C extends self::B {
  synthetic constructor •() → test::C*
    ;
  get x() → core::int*
    ;
}
class A extends core::Object {
  synthetic constructor •() → test::A*
    ;
  get x() → core::int*
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
static method foo() → dynamic
  ;
static method main() → dynamic
  ;
