main = main::main;
library from "org-dartlang-test:///libA.dart" as libA {

  import "org-dartlang-test:///main.dart";

  static method whatever(main::Foo* foo) → dynamic {
    dart.core::print(foo);
  }
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///libA.dart";

  class Foo extends dart.core::Object {
    final field dynamic message;
    constructor •(dynamic message) → main::Foo*
      : main::Foo::message = message, super dart.core::Object::•()
      ;
    @#C1
    method toString() → dart.core::String* {
      return "${this.{main::Foo::message}{dynamic}}!";
    }
    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
  }
  class CompilationStrategy extends dart.core::_Enum /*isEnum*/  {
    static const field dart.core::List<main::CompilationStrategy*>* values = #C14;
    static const field main::CompilationStrategy* direct = #C4;
    static const field main::CompilationStrategy* toKernel = #C7;
    static const field main::CompilationStrategy* toData = #C10;
    static const field main::CompilationStrategy* fromData = #C13;
    const constructor •(dart.core::int* index, dart.core::String* name) → main::CompilationStrategy*
      : super dart.core::_Enum::•(index, name)
      ;
    method toString() → dart.core::String*
      return "CompilationStrategy.${this.{dart.core::_Enum::_name}{dart.core::String}}";
    abstract member-signature get index() → dart.core::int*; -> dart.core::_Enum::index
    abstract member-signature get _name() → dart.core::String*; -> dart.core::_Enum::_name
    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
  }
  static method main() → dynamic {
    main::Foo* foo = new main::Foo::•("hello");
    libA::whatever(foo);
    main::CompilationStrategy* compilationStrategy = #C4;
    dart.core::print(compilationStrategy);
  }
}
constants  {
  #C1 = dart.core::_Override {}
  #C2 = 0
  #C3 = "direct"
  #C4 = main::CompilationStrategy {index:#C2, _name:#C3}
  #C5 = 1
  #C6 = "toKernel"
  #C7 = main::CompilationStrategy {index:#C5, _name:#C6}
  #C8 = 2
  #C9 = "toData"
  #C10 = main::CompilationStrategy {index:#C8, _name:#C9}
  #C11 = 3
  #C12 = "fromData"
  #C13 = main::CompilationStrategy {index:#C11, _name:#C12}
  #C14 = <main::CompilationStrategy*>[#C4, #C7, #C10, #C13]
}
