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

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

  @#C1
  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";

  @#C1
  class Bar extends dart.core::Object {
    @#C1
    constructor •(@#C1 dart.core::int x) → main::Bar
      : super dart.core::Object::•() {}
  }
  @#C1
  class Foo extends main::Bar {
    @#C1
    final field dynamic message;
    @#C1
    constructor •(@#C1 dynamic message) → main::Foo
      : main::Foo::message = message, super main::Bar::•(42)
      ;
    @#C2
    method toString() → dart.core::String {
      return "${this.{main::Foo::message}{dynamic}}";
    }
  }
  @#C1
  class CompilationStrategy extends dart.core::_Enum /*isEnum*/  {
    static const field dart.core::List<main::CompilationStrategy> values = #C15;
    @#C1
    static const field main::CompilationStrategy direct = #C5;
    @#C1
    static const field main::CompilationStrategy toKernel = #C8;
    @#C1
    static const field main::CompilationStrategy toData = #C11;
    @#C1
    static const field main::CompilationStrategy fromData = #C14;
    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}}";
  }
  static const field dart.core::String useMeAsAnnotation = #C1;
  @#C1
  static method main() → dynamic {
    @#C1 main::Foo foo = new main::Foo::•("hello");
    libA::whatever(foo);
    @#C1 main::CompilationStrategy compilationStrategy = #C5;
    dart.core::print(compilationStrategy);
  }
}
constants  {
  #C1 = "hello"
  #C2 = dart.core::_Override {}
  #C3 = 0
  #C4 = "direct"
  #C5 = main::CompilationStrategy {index:#C3, _name:#C4}
  #C6 = 1
  #C7 = "toKernel"
  #C8 = main::CompilationStrategy {index:#C6, _name:#C7}
  #C9 = 2
  #C10 = "toData"
  #C11 = main::CompilationStrategy {index:#C9, _name:#C10}
  #C12 = 3
  #C13 = "fromData"
  #C14 = main::CompilationStrategy {index:#C12, _name:#C13}
  #C15 = <main::CompilationStrategy*>[#C5, #C8, #C11, #C14]
}


Constructor coverage from constants:
org-dartlang-test:///main.dart:
- CompilationStrategy. (from org-dartlang-test:///main.dart:32:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)

