main = <No Member>;
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}}!";
    }
  }
  class CompilationStrategy extends dart.core::Object /*isEnum*/  {
    final field dart.core::int* index;
    final field dart.core::String* _name;
    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*
      : main::CompilationStrategy::index = index, main::CompilationStrategy::_name = _name, super dart.core::Object::•()
      ;
    method toString() → dart.core::String*
      return this.{=main::CompilationStrategy::_name};
  }
  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 = "CompilationStrategy.direct"
  #C4 = main::CompilationStrategy {index:#C2, _name:#C3}
  #C5 = 1
  #C6 = "CompilationStrategy.toKernel"
  #C7 = main::CompilationStrategy {index:#C5, _name:#C6}
  #C8 = 2
  #C9 = "CompilationStrategy.toData"
  #C10 = main::CompilationStrategy {index:#C8, _name:#C9}
  #C11 = 3
  #C12 = "CompilationStrategy.fromData"
  #C13 = main::CompilationStrategy {index:#C11, _name:#C12}
  #C14 = <main::CompilationStrategy*>[#C4, #C7, #C10, #C13]
}
