main = <No Member>;
library from "package:flutter/object.dart" as obj {

  class RenderFoo extends obj::RenderObject {
    synthetic constructor •() → obj::RenderFoo
      : super obj::RenderObject::•()
      ;
    get constraints() → obj::FooConstraints
      return super.{obj::RenderObject::constraints} as{ForNonNullableByDefault} obj::FooConstraints;
  }
  class FooConstraints extends obj::Constraints {
    synthetic constructor •() → obj::FooConstraints
      : super obj::Constraints::•()
      ;
    get axis() → dart.core::String
      return "hello";
  }
  class Constraints extends dart.core::Object {
    synthetic constructor •() → obj::Constraints
      : super dart.core::Object::•()
      ;
  }
  class RenderObject extends dart.core::Object {
    synthetic constructor •() → obj::RenderObject
      : super dart.core::Object::•()
      ;
    get constraints() → obj::Constraints
      return new obj::Constraints::•();
    get renderObject() → obj::RenderObject
      return this;
  }
}
library from "org-dartlang-test:///lib.dart" as lib {

  import "package:flutter/object.dart";

  abstract class LibMixin extends obj::RenderObject /*isMixinDeclaration*/  {
  }
}
library from "org-dartlang-test:///main.dart" as main {

  import "package:flutter/object.dart";
  import "org-dartlang-test:///lib.dart";

  abstract class _Adaptor&RenderFoo&LibMixin extends obj::RenderFoo implements lib::LibMixin /*isAnonymousMixin,isEliminatedMixin*/  {
    synthetic constructor •() → main::_Adaptor&RenderFoo&LibMixin
      : super obj::RenderFoo::•()
      ;
  }
  class Adaptor extends main::_Adaptor&RenderFoo&LibMixin {
    synthetic constructor •() → main::Adaptor
      : super main::_Adaptor&RenderFoo&LibMixin::•()
      ;
  }
  class AdaptorElement extends obj::RenderObject {
    synthetic constructor •() → main::AdaptorElement
      : super obj::RenderObject::•()
      ;
    get renderObject() → main::Adaptor
      return super.{obj::RenderObject::renderObject} as{ForNonNullableByDefault} main::Adaptor;
    method foo() → void {
      dart.core::print(this.{main::AdaptorElement::renderObject}{main::Adaptor}.{obj::RenderFoo::constraints}{obj::FooConstraints}.{obj::FooConstraints::axis}{dart.core::String});
    }
  }
}
