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>[self::Settings::•]/*isLegacy*/;
  static factory •({@#C2 self::Sidebar sidebar = #C3}) → self::Settings
    return self::_SSettings::•(sidebar: sidebar);
}
class Sidebar extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::Sidebar::•]/*isLegacy*/;
  static factory •() → self::Sidebar
    return self::_SSidebar::•();
}
abstract class _SSettings extends core::Object implements self::Settings {
  static final field dynamic _redirecting# = <dynamic>[self::_SSettings::•]/*isLegacy*/;
  static factory •({self::Sidebar sidebar = #C3}) → 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 = #C1}) → self::_$_SSettings
    : self::_$_SSettings::sidebar = sidebar, super core::Object::•()
    ;
}
abstract class _SSidebar extends core::Object implements self::Sidebar {
  static final field dynamic _redirecting# = <dynamic>[self::_SSidebar::•]/*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 = self::_$_SSidebar {}
  #C2 = self::Default {defaultValue:#C1}
  #C3 = null
}


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)
