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 •({self::Sidebar sidebar = null}) → 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 = null}) → 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 = const self::_$_SSidebar::•()}) → 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
  ;


Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue47036.dart:26:44 -> InstanceConstant(const _$_SSidebar{})
Extra constant evaluation: evaluated: 9, effectively constant: 1
