library /*isNonNullableByDefault*/;
import self as self;
import "main_lib.dart" as mai;
import "dart:core" as core;

import "org-dartlang-testcase:///main_lib.dart";

abstract class RenderAnimatedOpacityMixin<T extends mai::RenderObject> extends mai::RenderObjectWithChildMixin<self::RenderAnimatedOpacityMixin::T> /*isMixinDeclaration*/  {
}
abstract class _RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin = mai::RenderProxyBox with mai::RenderProxyBoxMixin<mai::RenderBox> /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin
    : super mai::RenderProxyBox::•()
    ;
  mixin-super-stub method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool
    return super.{mai::RenderProxyBoxMixin::hitTestChildren}(result, position: position);
}
abstract class _RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin = self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin with self::RenderAnimatedOpacityMixin<mai::RenderBox> /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin
    : super self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin::•()
    ;
}
class RenderAnimatedOpacity extends self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin {
  synthetic constructor •() → self::RenderAnimatedOpacity
    : super self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin::•()
    ;
}
static method main() → dynamic {
  new self::RenderAnimatedOpacity::•();
}

library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;

class Offset extends core::Object {
  synthetic constructor •() → mai::Offset
    : super core::Object::•()
    ;
}
class AbstractNode extends core::Object {
  synthetic constructor •() → mai::AbstractNode
    : super core::Object::•()
    ;
}
abstract class DiagnosticableTreeMixin extends core::Object /*isMixinDeclaration*/  {
}
abstract class HitTestTarget extends core::Object {
  synthetic constructor •() → mai::HitTestTarget
    : super core::Object::•()
    ;
}
class HitTestResult extends core::Object {
  synthetic constructor •() → mai::HitTestResult
    : super core::Object::•()
    ;
}
class BoxHitTestResult extends mai::HitTestResult {
  synthetic constructor •() → mai::BoxHitTestResult
    : super mai::HitTestResult::•()
    ;
}
abstract class _RenderObject&AbstractNode&DiagnosticableTreeMixin extends mai::AbstractNode implements mai::DiagnosticableTreeMixin /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → mai::_RenderObject&AbstractNode&DiagnosticableTreeMixin
    : super mai::AbstractNode::•()
    ;
}
abstract class RenderObject extends mai::_RenderObject&AbstractNode&DiagnosticableTreeMixin implements mai::HitTestTarget {
  synthetic constructor •() → mai::RenderObject
    : super mai::_RenderObject&AbstractNode&DiagnosticableTreeMixin::•()
    ;
}
abstract class RenderBox extends mai::RenderObject {
  synthetic constructor •() → mai::RenderBox
    : super mai::RenderObject::•()
    ;
  method hitTest(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool
    return false;
  method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool
    return false;
}
abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
  covariant-by-class field mai::RenderObjectWithChildMixin::ChildType? _child = null;
  get child() → mai::RenderObjectWithChildMixin::ChildType?
    return this.{mai::RenderObjectWithChildMixin::_child}{mai::RenderObjectWithChildMixin::ChildType?};
}
abstract class _RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<T extends mai::RenderBox> extends core::Object implements mai::RenderBox, mai::RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T> /*isAnonymousMixin*/  {
  synthetic constructor •() → mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T>
    : super core::Object::•()
    ;
}
abstract class RenderProxyBoxMixin<T extends mai::RenderBox> extends mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::RenderProxyBoxMixin::T> /*isMixinDeclaration*/  {
  @#C2
  method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool {
    return let final core::bool? #t1 = let final mai::RenderProxyBoxMixin::T? #t2 = this.{mai::RenderObjectWithChildMixin::child}{mai::RenderProxyBoxMixin::T?} in #t2 == null ?{core::bool?} null : #t2{mai::RenderProxyBoxMixin::T}.{mai::RenderBox::hitTest}(result, position: position){(mai::BoxHitTestResult, {required position: mai::Offset}) → core::bool} in #t1 == null ?{core::bool} false : #t1{core::bool};
  }
}
abstract class _RenderProxyBox&RenderBox&RenderObjectWithChildMixin extends mai::RenderBox implements mai::RenderObjectWithChildMixin<mai::RenderBox> /*isAnonymousMixin,isEliminatedMixin*/  {
  covariant-by-class field mai::RenderBox? _child = null;
  synthetic constructor •() → mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin
    : super mai::RenderBox::•()
    ;
  get child() → mai::RenderBox?
    return this.{mai::RenderObjectWithChildMixin::_child}{mai::RenderBox?};
}
abstract class _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin extends mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin implements mai::RenderProxyBoxMixin<mai::RenderBox> /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin
    : super mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin::•()
    ;
  @#C2
  method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool {
    return let final core::bool? #t3 = let final mai::RenderBox? #t4 = this.{mai::RenderObjectWithChildMixin::child}{mai::RenderBox?} in #t4 == null ?{core::bool?} null : #t4{mai::RenderBox}.{mai::RenderBox::hitTest}(result, position: position){(mai::BoxHitTestResult, {required position: mai::Offset}) → core::bool} in #t3 == null ?{core::bool} false : #t3{core::bool};
  }
}
class RenderProxyBox extends mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin {
  synthetic constructor •() → mai::RenderProxyBox
    : super mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin::•()
    ;
}

constants  {
  #C1 = null
  #C2 = core::_Override {}
}
