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

class ExpansionTile extends core::Object /*hasConstConstructor*/  {
  final field self::CrossAxisAlignment? expandedCrossAxisAlignment;
  const constructor •({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*/  {
  static const field core::List<self::CrossAxisAlignment> values = #C17;
  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;
  const synthetic constructor •(core::int #index, core::String #name) → self::CrossAxisAlignment
    : super core::_Enum::•(#index, #name)
    ;
  method _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)
