library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/crashes/crash_03/main.dart:7:57: Error: Type 'MouseTrackerAnnotation' not found.
// mixin _PlatformViewGestureMixin on RenderBox implements MouseTrackerAnnotation {
//                                                         ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/crashes/crash_03/main.dart:9:7: Error: The getter '_hitTestBehavior' isn't defined for the class '_PlatformViewGestureMixin'.
//  - '_PlatformViewGestureMixin' is from 'pkg/front_end/testcases/general/crashes/crash_03/main.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named '_hitTestBehavior'.
//       _hitTestBehavior != PlatformViewHitTestBehavior.transparent;
//       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/crashes/crash_03/main.dart:9:27: Error: The getter 'PlatformViewHitTestBehavior' isn't defined for the class '_PlatformViewGestureMixin'.
//  - '_PlatformViewGestureMixin' is from 'pkg/front_end/testcases/general/crashes/crash_03/main.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'PlatformViewHitTestBehavior'.
//       _hitTestBehavior != PlatformViewHitTestBehavior.transparent;
//                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
import "main_lib.dart" as mai;

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

class Offset extends core::Object {
  synthetic constructor •() → self::Offset
    : super core::Object::•()
    ;
}
abstract class _PlatformViewRenderBox&RenderBox&_PlatformViewGestureMixin = mai::RenderBox with self::_PlatformViewGestureMixin /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_PlatformViewRenderBox&RenderBox&_PlatformViewGestureMixin
    : super mai::RenderBox::•()
    ;
  mixin-super-stub method hitTestSelf(self::Offset position) → core::bool
    return super.{self::_PlatformViewGestureMixin::hitTestSelf}(position);
}
class PlatformViewRenderBox extends self::_PlatformViewRenderBox&RenderBox&_PlatformViewGestureMixin {
  synthetic constructor •() → self::PlatformViewRenderBox
    : super self::_PlatformViewRenderBox&RenderBox&_PlatformViewGestureMixin::•()
    ;
}
abstract class _PlatformViewGestureMixin extends mai::RenderBox /*isMixinDeclaration*/  {
  method hitTestSelf(self::Offset position) → core::bool
    return !(invalid-expression "pkg/front_end/testcases/general/crashes/crash_03/main.dart:9:7: Error: The getter '_hitTestBehavior' isn't defined for the class '_PlatformViewGestureMixin'.
 - '_PlatformViewGestureMixin' is from 'pkg/front_end/testcases/general/crashes/crash_03/main.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named '_hitTestBehavior'.
      _hitTestBehavior != PlatformViewHitTestBehavior.transparent;
      ^^^^^^^^^^^^^^^^" in this{<unresolved>}._hitTestBehavior =={core::Object::==}{(core::Object) → core::bool} invalid-expression "pkg/front_end/testcases/general/crashes/crash_03/main.dart:9:27: Error: The getter 'PlatformViewHitTestBehavior' isn't defined for the class '_PlatformViewGestureMixin'.
 - '_PlatformViewGestureMixin' is from 'pkg/front_end/testcases/general/crashes/crash_03/main.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'PlatformViewHitTestBehavior'.
      _hitTestBehavior != PlatformViewHitTestBehavior.transparent;
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^" in this{<unresolved>}.PlatformViewHitTestBehavior{dynamic}.transparent);
}
static method main() → dynamic {}

library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/crashes/crash_03/main_lib.dart:2:20: Error: Type 'Offset' not found.
//   bool hitTestSelf(Offset position) => false;
//                    ^^^^^^
//
// pkg/front_end/testcases/general/crashes/crash_03/main_lib.dart:2:20: Error: 'Offset' isn't a type.
//   bool hitTestSelf(Offset position) => false;
//                    ^^^^^^
//
import self as mai;
import "dart:core" as core;

abstract class RenderBox extends core::Object {
  synthetic constructor •() → mai::RenderBox
    : super core::Object::•()
    ;
  method hitTestSelf(invalid-type position) → core::bool
    return false;
}
