// 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() {
  simpleDo();
  doNull();
  doNotNull();
  doNullFalse();
  doNotNullTrue();
  doUnion();
}

////////////////////////////////////////////////////////////////////////////////
/// Simple int based do-while loop.
////////////////////////////////////////////////////////////////////////////////

/*member: simpleDo:[null]*/
simpleDo() {
  var i = 0;
  do {
    i = i /*invoke: [subclass=JSPositiveInt]*/ + 1;
  } while (i /*invoke: [subclass=JSPositiveInt]*/ < 10);
  i. /*invoke: [subclass=JSPositiveInt]*/ abs();
}

////////////////////////////////////////////////////////////////////////////////
/// Do-while loop with null test.
////////////////////////////////////////////////////////////////////////////////

/*member: doNull:[exact=JSString]*/
doNull() {
  var o;
  do {
    o = o. /*invoke: [null|exact=JSString]*/ toString();
  } while (o == null);
  return o;
}

////////////////////////////////////////////////////////////////////////////////
/// Do-while loop with not-null test.
////////////////////////////////////////////////////////////////////////////////

/*member: doNotNull:[exact=JSString]*/
doNotNull() {
  var o = '';
  do {
    o = o. /*invoke: [exact=JSString]*/ toString();
  } while (o != null);
  return o;
}

////////////////////////////////////////////////////////////////////////////////
/// Do-while loop with null test known to be false.
////////////////////////////////////////////////////////////////////////////////

/*member: doNullFalse:[exact=JSString]*/
doNullFalse() {
  var o = '';
  do {
    o = o. /*invoke: [exact=JSString]*/ toString();
  } while (o == null);
  return o;
}

////////////////////////////////////////////////////////////////////////////////
/// Do-while loop with not-null test known to be true.
////////////////////////////////////////////////////////////////////////////////

/*member: doNotNullTrue:[exact=JSString]*/
doNotNullTrue() {
  var o = null;
  do {
    o = o. /*invoke: [null|exact=JSString]*/ toString();
  } while (o != null);
  return o;
}

////////////////////////////////////////////////////////////////////////////////
/// Do-while loop with not-null test that mixes field accesses.
////////////////////////////////////////////////////////////////////////////////

/*member: Class1.:[exact=Class1]*/
class Class1 {
  /*member: Class1.field:[null|exact=Class2]*/
  var field;
}

/*member: Class2.:[exact=Class2]*/
class Class2 {
  /*member: Class2.field:[null|exact=Class1]*/
  var field;
}

/*member: _doUnion:Union([null|exact=Class1], [null|exact=Class2])*/
_doUnion(/*[exact=Class1]*/ o) {
  do {
    o = o. /*Union([exact=Class1], [null|exact=Class2])*/ field;
  } while (o != null);
  return o;
}

/*member: doUnion:[null]*/
doUnion() {
  var c1 = new Class1();
  var c2 = new Class2();
  c1. /*update: [exact=Class1]*/ field = c2;
  c2. /*update: [exact=Class2]*/ field = c1;
  _doUnion(c1);
}
