library;
import self as self;
import "non_nullable_from_opt_out_lib.dart" as non;
import "dart:core" as core;

import "org-dartlang-testcase:///non_nullable_from_opt_out_lib.dart";

static method main() → dynamic {
  non::topLevelField = null;
  non::finalTopLevelField = null;
  non::Class<core::int*>* c = new non::Class::•<core::int*>();
  c.{non::Class::instanceField} = null;
  c.{non::Class::finalInstanceField} = null;
  c.{non::Class::instanceTypeVariable} = null;
  c.{non::Class::finalInstanceTypeVariable} = null;
  non::Class::staticField = null;
  non::Class::staticFinalField = null;
  non::expect(null, non::topLevelField);
  non::expect(null, non::finalTopLevelField);
  non::expect(null, c.{non::Class::instanceField});
  non::expect(null, c.{non::Class::finalInstanceField});
  non::expect(null, c.{non::Class::instanceTypeVariable});
  non::expect(null, c.{non::Class::finalInstanceTypeVariable});
  non::expect(null, non::Class::staticField);
  non::expect(null, non::Class::staticFinalField);
  non::throws(() → core::Null? => non::finalTopLevelField = null);
  non::throws(() → core::Null? => c.{non::Class::finalInstanceField} = null);
  non::throws(() → core::Null? => c.{non::Class::finalInstanceTypeVariable} = null);
  non::throws(() → core::Null? => non::Class::staticFinalField = null);
  non::method<core::Null?>(true, null, null);
}

library /*isNonNullableByDefault*/;
import self as non;
import "dart:core" as core;
import "dart:_internal" as _in;

class Class<T extends core::Object = core::Object> extends core::Object {
  field core::int? _#Class#instanceField = null;
  field core::bool _#Class#instanceField#isSet = false;
  field dynamic _#Class#finalInstanceField = null;
  field core::bool _#Class#finalInstanceField#isSet = false;
  generic-covariant-impl field non::Class::T? _#Class#instanceTypeVariable = null;
  field core::bool _#Class#instanceTypeVariable#isSet = false;
  field non::Class::T? _#Class#finalInstanceTypeVariable = null;
  field core::bool _#Class#finalInstanceTypeVariable#isSet = false;
  static field core::int? _#staticField = null;
  static field core::bool _#staticField#isSet = false;
  static field dynamic _#staticFinalField = null;
  static field core::bool _#staticFinalField#isSet = false;
  synthetic constructor •() → non::Class<non::Class::T>
    : super core::Object::•()
    ;
  get instanceField() → core::int
    return this.{non::Class::_#Class#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{non::Class::_#Class#instanceField} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.");
  set instanceField(core::int #t2) → void {
    this.{non::Class::_#Class#instanceField#isSet} = true;
    this.{non::Class::_#Class#instanceField} = #t2;
  }
  get finalInstanceField() → dynamic
    return this.{non::Class::_#Class#finalInstanceField#isSet} ?{dynamic} this.{non::Class::_#Class#finalInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
  set finalInstanceField(dynamic #t3) → void
    if(this.{non::Class::_#Class#finalInstanceField#isSet})
      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
    else {
      this.{non::Class::_#Class#finalInstanceField#isSet} = true;
      this.{non::Class::_#Class#finalInstanceField} = #t3;
    }
  get instanceTypeVariable() → non::Class::T
    return this.{non::Class::_#Class#instanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable} in #t4{non::Class::T} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceTypeVariable' has not been initialized.");
  set instanceTypeVariable(generic-covariant-impl non::Class::T #t5) → void {
    this.{non::Class::_#Class#instanceTypeVariable#isSet} = true;
    this.{non::Class::_#Class#instanceTypeVariable} = #t5;
  }
  get finalInstanceTypeVariable() → non::Class::T
    return this.{non::Class::_#Class#finalInstanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable} in #t6{non::Class::T} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has not been initialized.");
  set finalInstanceTypeVariable(non::Class::T #t7) → void
    if(this.{non::Class::_#Class#finalInstanceTypeVariable#isSet})
      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has already been initialized.");
    else {
      this.{non::Class::_#Class#finalInstanceTypeVariable#isSet} = true;
      this.{non::Class::_#Class#finalInstanceTypeVariable} = #t7;
    }
  static get staticField() → core::int
    return non::Class::_#staticField#isSet ?{core::int} let final core::int? #t8 = non::Class::_#staticField in #t8{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.");
  static set staticField(core::int #t9) → void {
    non::Class::_#staticField#isSet = true;
    non::Class::_#staticField = #t9;
  }
  static get staticFinalField() → dynamic
    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has not been initialized.");
  static set staticFinalField(dynamic #t10) → void
    if(non::Class::_#staticFinalField#isSet)
      throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has already been initialized.");
    else {
      non::Class::_#staticFinalField#isSet = true;
      non::Class::_#staticFinalField = #t10;
    }
}
static field core::int? _#topLevelField = null;
static field core::bool _#topLevelField#isSet = false;
static field dynamic _#finalTopLevelField = null;
static field core::bool _#finalTopLevelField#isSet = false;
static get topLevelField() → core::int
  return non::_#topLevelField#isSet ?{core::int} let final core::int? #t11 = non::_#topLevelField in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.");
static set topLevelField(core::int #t12) → void {
  non::_#topLevelField#isSet = true;
  non::_#topLevelField = #t12;
}
static get finalTopLevelField() → dynamic
  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.");
static set finalTopLevelField(dynamic #t13) → void
  if(non::_#finalTopLevelField#isSet)
    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
  else {
    non::_#finalTopLevelField#isSet = true;
    non::_#finalTopLevelField = #t13;
  }
static method method<T extends core::Object = core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
  core::int? local;
  core::bool #local#isSet = false;
  function #local#get() → core::int
    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.");
  function #local#set(core::int #t14) → dynamic {
    #local#isSet = true;
    return local = #t14;
  }
  final dynamic finalLocal;
  core::bool #finalLocal#isSet = false;
  function #finalLocal#get() → dynamic
    return #finalLocal#isSet ?{dynamic} finalLocal : throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has not been initialized.");
  function #finalLocal#set(dynamic #t15) → dynamic
    if(#finalLocal#isSet)
      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has already been initialized.");
    else {
      #finalLocal#isSet = true;
      return finalLocal = #t15;
    }
  non::method::T? localTypeVariable;
  core::bool #localTypeVariable#isSet = false;
  function #localTypeVariable#get() → non::method::T
    return #localTypeVariable#isSet ?{non::method::T} localTypeVariable{non::method::T} : throw new _in::LateInitializationErrorImpl::•("Local 'localTypeVariable' has not been initialized.");
  function #localTypeVariable#set(non::method::T #t16) → dynamic {
    #localTypeVariable#isSet = true;
    return localTypeVariable = #t16;
  }
  final non::method::T? finalLocalTypeVariable;
  core::bool #finalLocalTypeVariable#isSet = false;
  function #finalLocalTypeVariable#get() → non::method::T
    return #finalLocalTypeVariable#isSet ?{non::method::T} finalLocalTypeVariable{non::method::T} : throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has not been initialized.");
  function #finalLocalTypeVariable#set(non::method::T #t17) → dynamic
    if(#finalLocalTypeVariable#isSet)
      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has already been initialized.");
    else {
      #finalLocalTypeVariable#isSet = true;
      return finalLocalTypeVariable = #t17;
    }
  if(b) {
    #local#set.call(i);
    #finalLocal#set.call(i);
    #localTypeVariable#set.call(t);
    #finalLocalTypeVariable#set.call(t);
    non::expect(i, #local#get.call());
    non::expect(i, #finalLocal#get.call());
    non::expect(t, #localTypeVariable#get.call());
    non::expect(t, #finalLocalTypeVariable#get.call());
  }
  non::throws(() → core::int => #finalLocal#set.call(i));
  non::throws(() → non::method::T => #finalLocalTypeVariable#set.call(t));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → void f) → dynamic {
  try {
    f.call();
  }
  on core::Object catch(final core::Object _) {
    return;
  }
  throw "Missing exception";
}
