// 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.

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

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

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

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

/*element: _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;
}

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

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

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

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

/*element: _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;
}

/*element: _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;
}

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

/*element: 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.
////////////////////////////////////////////////////////////////////////////////

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

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

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