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]
}
