library;
import self as self;
import "dart:core" as core;

class ExpansionTile extends core::Object /*hasConstConstructor*/  {
  final field self::CrossAxisAlignment? expandedCrossAxisAlignment;
  const constructor •({initializing-formal self::CrossAxisAlignment? expandedCrossAxisAlignment = #C1}) → self::ExpansionTile
    : self::ExpansionTile::expandedCrossAxisAlignment = expandedCrossAxisAlignment, assert(!(expandedCrossAxisAlignment =={core::Object::==}{(core::Object) → core::bool} #C4)), super core::Object::•()
    ;
}
class CrossAxisAlignment extends core::_Enum /*isEnum*/  {
  enum-element static const field self::CrossAxisAlignment start = #C7;
  enum-element static const field self::CrossAxisAlignment end = #C10;
  enum-element static const field self::CrossAxisAlignment center = #C13;
  enum-element static const field self::CrossAxisAlignment stretch = #C16;
  enum-element static const field self::CrossAxisAlignment baseline = #C4;
  static const field core::List<self::CrossAxisAlignment> values = #C17;
  const synthetic constructor •(core::int #index, core::String #name) → self::CrossAxisAlignment
    : super core::_Enum::•(#index, #name)
    ;
  method core::_enumToString() → core::String
    return "CrossAxisAlignment.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → void {
  core::print(#C18);
}

constants  {
  #C1 = null
  #C2 = 4
  #C3 = "baseline"
  #C4 = self::CrossAxisAlignment {index:#C2, _name:#C3}
  #C5 = 0
  #C6 = "start"
  #C7 = self::CrossAxisAlignment {index:#C5, _name:#C6}
  #C8 = 1
  #C9 = "end"
  #C10 = self::CrossAxisAlignment {index:#C8, _name:#C9}
  #C11 = 2
  #C12 = "center"
  #C13 = self::CrossAxisAlignment {index:#C11, _name:#C12}
  #C14 = 3
  #C15 = "stretch"
  #C16 = self::CrossAxisAlignment {index:#C14, _name:#C15}
  #C17 = <self::CrossAxisAlignment>[#C7, #C10, #C13, #C16, #C4]
  #C18 = self::ExpansionTile {expandedCrossAxisAlignment:#C7}
}


Constructor coverage from constants:
org-dartlang-testcase:///issue51800.dart:
- CrossAxisAlignment. (from org-dartlang-testcase:///issue51800.dart:13:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- ExpansionTile. (from org-dartlang-testcase:///issue51800.dart:6:9)
