// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/*member: main:[null]*/
main() {
  refineToClass();
  refineToClosure();
}

////////////////////////////////////////////////////////////////////////////////
// Refine nullability of a non-captured local variable through a sequence of
// accesses and updates.
////////////////////////////////////////////////////////////////////////////////

/*member: Class1.:[exact=Class1]*/
class Class1 {
  /*member: Class1.method0:[null]*/
  method0() {}
  /*member: Class1.method1:[null]*/
  method1() {}
  /*member: Class1.field0:[null|exact=JSUInt31]*/
  var field0;
  /*member: Class1.field1:[null|exact=JSUInt31]*/
  var field1;
}

/*member: Class2.:[exact=Class2]*/
class Class2 {
  /*member: Class2.method0:[null]*/
  method0() {}
  /*member: Class2.method2:[null]*/
  method2() {}
  /*member: Class2.field0:[null]*/
  var field0;
  /*member: Class2.field2:[null]*/
  var field2;
}

/*member: _refineUnion:Union([exact=Class1], [exact=Class2])*/
_refineUnion(/*Union([null|exact=Class1], [null|exact=Class2])*/ o) {
  o. /*invoke: Union([null|exact=Class1], [null|exact=Class2])*/ method0();
  o. /*invoke: Union([exact=Class1], [exact=Class2])*/ method1();
  o. /*invoke: Union([exact=Class1], [exact=Class2])*/ method2();
  return o;
}

/*member: _refineFromMethod:[exact=Class1]*/
_refineFromMethod(/*[null|exact=Class1]*/ o) {
  o. /*invoke: [null|exact=Class1]*/ method0();
  o. /*invoke: [exact=Class1]*/ method1();
  return o;
}

/*member: _refineFromGetter:[exact=Class2]*/
_refineFromGetter(/*[null|exact=Class2]*/ o) {
  o. /*[null|exact=Class2]*/ field0;
  o. /*[exact=Class2]*/ field2;
  return o;
}

/*member: _refineFromSetter:[exact=Class1]*/
_refineFromSetter(/*[null|exact=Class1]*/ o) {
  o. /*update: [null|exact=Class1]*/ field0 = 0;
  o. /*update: [exact=Class1]*/ field1 = 0;
  return o;
}

/*member: _noRefinementNullAware:[null|exact=Class1]*/
_noRefinementNullAware(/*[null|exact=Class1]*/ o) {
  o
      ?.
      /*invoke: [exact=Class1]*/
      method1();
  return o;
}

/*member: _noRefinementNullSelectors:[exact=Class2]*/
_noRefinementNullSelectors(/*[null|exact=Class2]*/ o) {
  o /*invoke: [null|exact=Class2]*/ == 2;
  o. /*[null|exact=Class2]*/ hashCode;
  o. /*[null|exact=Class2]*/ runtimeType;
  o. /*[null|exact=Class2]*/ toString;
  o. /*[null|exact=Class2]*/ noSuchMethod;
  o. /*invoke: [null|exact=Class2]*/ toString();
  o. /*invoke: [null|exact=Class2]*/ noSuchMethod(null); // assumed to throw.
  o. /*[exact=Class2]*/ toString;
  return o;
}

/*member: _noRefinementUpdatedVariable:[null|exact=Class1]*/
_noRefinementUpdatedVariable(/*[null|exact=Class1]*/ o) {
  (o = o). /*invoke: [null|exact=Class1]*/ method1();
  (o = o). /*invoke: [null|exact=Class1]*/ method0();
  return o;
}

/*member: _condition:Value([exact=JSBool], value: false)*/
@pragma('dart2js:assumeDynamic')
get _condition => false;

/*member: refineToClass:[null]*/
refineToClass() {
  var nullOrClass1 = _condition ? null : new Class1();
  var nullOrClass2 = _condition ? null : new Class2();
  _refineUnion(nullOrClass1);
  _refineUnion(nullOrClass2);

  _refineFromMethod(nullOrClass1);
  _refineFromGetter(nullOrClass2);
  _refineFromSetter(nullOrClass1);
  _noRefinementNullAware(nullOrClass1);
  _noRefinementNullSelectors(nullOrClass2);
  _noRefinementUpdatedVariable(nullOrClass1);
}

////////////////////////////////////////////////////////////////////////////////
// Refine the type of a local variable through a sequence of invocations.
////////////////////////////////////////////////////////////////////////////////

/*member: _refineToClosureLocal:[subclass=Closure]*/
_refineToClosureLocal() {
  var f = /*[null]*/ ({/*[exact=JSUInt31]*/ a}) {};
  f(a: 0);
  return f;
}

/*member: _refineToClosureLocalCall:[subclass=Closure]*/
_refineToClosureLocalCall() {
  var f = /*[null]*/ ({/*[exact=JSUInt31]*/ b}) {};
  f.call(b: 0);
  return f;
}

/*member: refineToClosure:[null]*/
refineToClosure() {
  _refineToClosureLocal();
  _refineToClosureLocalCall();
}
