library;
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 factory •({@#C2 self::Sidebar sidebar = #C1}) → self::Settings /* redirection-target: self::_SSettings::• */
    return self::_SSettings::•(sidebar: sidebar);
}
class Sidebar extends core::Object {
  static factory •() → self::Sidebar /* redirection-target: self::_SSidebar::• */
    return self::_SSidebar::•();
}
abstract class _SSettings extends core::Object implements self::Settings {
  static factory •({self::Sidebar sidebar = #C1}) → self::_SSettings /* redirection-target: 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 factory •() → self::_SSidebar /* redirection-target: 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}
}


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)
- Default. (from org-dartlang-testcase:///issue47036.dart:6:9)
