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

abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
    ;
}
class DiagnosticPropertiesBuilder extends core::Object {
  synthetic constructor •() → self::DiagnosticPropertiesBuilder
    ;
}
abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
    : super core::Object::•()
    ;
  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
    return super.{self::Diagnosticable::debugFillProperties}(properties);
}
abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
  synthetic constructor •() → self::PointerEvent
    ;
}
abstract class PointerSignalEvent extends self::PointerEvent {
  synthetic constructor •() → self::PointerSignalEvent
    ;
}
abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
  @core::override
  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
    ;
}
abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
    : super self::PointerSignalEvent::•()
    ;
  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
    ;
}
class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
  synthetic constructor •() → self::PointerScrollEvent
    ;
  @core::override
  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
    ;
}
static method main() → dynamic
  ;


Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:16:4 -> InstanceConstant(const _Override{})
Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:25:4 -> InstanceConstant(const _Override{})
Extra constant evaluation: evaluated: 6, effectively constant: 2
