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

class Default extends core::Object /*hasConstConstructor*/  {
  final field core::Object? defaultValue;
  const constructor •(core::Object? defaultValue) → self::Default
    : self::Default::defaultValue = defaultValue, super core::Object::•()
    ;
}
class Settings extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
    return self::_SSettings::•(sidebar: sidebar);
}
class Sidebar extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
  static factory •() → self::Sidebar
    return self::_SSidebar::•();
}
abstract class _SSettings extends core::Object implements self::Settings {
  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
    return new self::_$_SSettings::•(sidebar: sidebar);
}
class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
  final field self::Sidebar sidebar;
  const constructor •({self::Sidebar sidebar = #C2}) → self::_$_SSettings
    : self::_$_SSettings::sidebar = sidebar, super core::Object::•()
    ;
}
abstract class _SSidebar extends core::Object implements self::Sidebar {
  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
  static factory •() → self::_SSidebar
    return new self::_$_SSidebar::•();
}
class _$_SSidebar extends core::Object implements self::_SSidebar /*hasConstConstructor*/  {
  const constructor •() → self::_$_SSidebar
    : super core::Object::•()
    ;
}
static method main() → void {}

constants  {
  #C1 = constructor-tearoff self::Settings::•
  #C2 = self::_$_SSidebar {}
  #C3 = self::Default {defaultValue:#C2}
  #C4 = null
  #C5 = constructor-tearoff self::Sidebar::•
  #C6 = constructor-tearoff self::_SSettings::•
  #C7 = constructor-tearoff self::_SSidebar::•
}


Constructor coverage from constants:
org-dartlang-testcase:///issue47036.dart:
- _$_SSidebar. (from org-dartlang-testcase:///issue47036.dart:36:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- Default. (from org-dartlang-testcase:///issue47036.dart:6:9)
