library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

class Class1 extends core::Object {
  field asy::FutureOr<dynamic> instanceField1 = null;
  field asy::FutureOr<core::int?> instanceField2 = null;
  field asy::FutureOr<asy::FutureOr<dynamic>> instanceField3 = null;
  static field asy::FutureOr<dynamic> staticField1 = null;
  static field asy::FutureOr<core::int?> staticField2 = null;
  static field asy::FutureOr<asy::FutureOr<dynamic>> staticField3 = null;
  synthetic constructor •() → self::Class1
    : super core::Object::•()
    ;
  method instanceMethod1([asy::FutureOr<dynamic> parameter1 = #C1, asy::FutureOr<core::int?> parameter2 = #C1, asy::FutureOr<asy::FutureOr<dynamic>> parameter3 = #C1]) → void {}
  method instanceMethod2({asy::FutureOr<dynamic> parameter1 = #C1, asy::FutureOr<core::int?> parameter2 = #C1, asy::FutureOr<asy::FutureOr<dynamic>> parameter3 = #C1}) → void {}
  static method staticMethod1([asy::FutureOr<dynamic> parameter1 = #C1, asy::FutureOr<core::int?> parameter2 = #C1, asy::FutureOr<asy::FutureOr<dynamic>> parameter3 = #C1]) → void {}
  static method staticMethod2({asy::FutureOr<dynamic> parameter1 = #C1, asy::FutureOr<core::int?> parameter2 = #C1, asy::FutureOr<asy::FutureOr<dynamic>> parameter3 = #C1}) → void {}
}
class Class2 extends core::Object {
  field asy::FutureOr<dynamic> instanceField1;
  field asy::FutureOr<core::int?> instanceField2;
  field asy::FutureOr<asy::FutureOr<dynamic>> instanceField3;
  constructor constructor1(asy::FutureOr<dynamic> instanceField1, asy::FutureOr<core::int?> instanceField2, asy::FutureOr<asy::FutureOr<dynamic>> instanceField3) → self::Class2
    : self::Class2::instanceField1 = instanceField1, self::Class2::instanceField2 = instanceField2, self::Class2::instanceField3 = instanceField3, super core::Object::•()
    ;
  constructor constructor2() → self::Class2
    : self::Class2::instanceField3 = null, self::Class2::instanceField2 = null, self::Class2::instanceField1 = null, super core::Object::•()
    ;
}
static field asy::FutureOr<dynamic> topLevelField1;
static field asy::FutureOr<core::int?> topLevelField2;
static field asy::FutureOr<asy::FutureOr<dynamic>> topLevelField3;
static method toplevelMethod1([asy::FutureOr<dynamic> parameter1 = #C1, asy::FutureOr<core::int?> parameter2 = #C1, asy::FutureOr<asy::FutureOr<dynamic>> parameter3 = #C1]) → void {}
static method toplevelMethod2({asy::FutureOr<dynamic> parameter1 = #C1, asy::FutureOr<core::int?> parameter2 = #C1, asy::FutureOr<asy::FutureOr<dynamic>> parameter3 = #C1}) → void {}
static method main() → dynamic {
  asy::FutureOr<dynamic> local1;
  asy::FutureOr<core::int?> local2;
  asy::FutureOr<asy::FutureOr<dynamic>> local3;
  core::print(local1);
  core::print(local2);
  core::print(local3);
  function localFunction1([asy::FutureOr<dynamic> parameter1 = #C1, asy::FutureOr<core::int?> parameter2 = #C1, asy::FutureOr<asy::FutureOr<dynamic>> parameter3 = #C1]) → void {}
  function localFunction2({asy::FutureOr<dynamic> parameter1 = #C1, asy::FutureOr<core::int?> parameter2 = #C1, asy::FutureOr<asy::FutureOr<dynamic>> parameter3 = #C1}) → void {}
}

constants  {
  #C1 = null
}
