library #lib /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class _AttributeName extends core::Object implements core::Enum /*isEnum*/  {
[@vm.inferred-type.metadata=dart.core::_Smi] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  final field core::int index;
[@vm.inferred-type.metadata=dart.core::_OneByteString] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2]  final field core::String _name;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method toString() → core::String
    return [@vm.direct-call.metadata=#lib::_AttributeName._name] [@vm.inferred-type.metadata=dart.core::_OneByteString] this.{self::_AttributeName::_name}{core::String};
}
class _Attribute extends core::Object {
  constructor _() → self::_Attribute
    : super core::Object::•()
    ;
  static method fromReader() → self::_Attribute {
    final core::bool name = [@vm.direct-call.metadata=dart.collection::_CompactImmutableLinkedHashSet.contains] [@vm.inferred-type.metadata=!? (skip check)](#C3).{core::Set::contains}(#C2){(core::Object?) → core::bool};
    return let final self::_AttributeName #t1 = (#C8).{core::List::[]}(#C2){(core::int) → self::_AttributeName} in new self::_Attribute::_();
  }
}
static method main() → void {
  final self::_Attribute result = [@vm.inferred-type.metadata=#lib::_Attribute] self::_Attribute::fromReader();
  core::print(result);
}
constants  {
  #C1 = 0
  #C2 = 1
  #C3 = <core::int*>{#C1, #C2}
  #C4 = "_AttributeName.name"
  #C5 = self::_AttributeName {index:#C1, _name:#C4}
  #C6 = "_AttributeName.sibling"
  #C7 = self::_AttributeName {index:#C2, _name:#C6}
  #C8 = <self::_AttributeName*>[#C5, #C7]
}
