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*/  {
  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 _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)
