// 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() {
  returnInClosure();
  accessInClosure();
  invokeInClosure();
  operatorInClosure();
  assignInClosure();
  assignInTwoClosures();
  accessAssignInClosure();
  accessBeforeAssignInClosure();
  accessAfterAssignInClosure();
  compoundInClosure();
  postfixInClosure();
}

/*member: returnInClosure:[exact=JSUInt31]*/
returnInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[exact=JSUInt31]*/ () {
    return lines;
  });
  return lines;
}

/*member: accessInClosure:[exact=JSUInt31]*/
accessInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[exact=JSBool]*/ () {
    return lines. /*[exact=JSUInt31]*/ isEven;
  });
  return lines;
}

/*member: invokeInClosure:[exact=JSUInt31]*/
invokeInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[subclass=JSNumber]*/ () {
    return lines. /*invoke: [exact=JSUInt31]*/ ceilToDouble();
  });
  return lines;
}

/*member: operatorInClosure:[exact=JSUInt31]*/
operatorInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[subclass=JSInt]*/ () {
    return lines /*invoke: [exact=JSUInt31]*/ - 42;
  });
  return lines;
}

/*member: assignInClosure:[subclass=JSInt]*/
assignInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[null]*/ () {
    lines = -42;
  });
  return lines;
}

/*member: assignInTwoClosures:[subclass=JSInt]*/
assignInTwoClosures() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[null]*/ () {
    lines = -42;
  });
  local(/*[null]*/ () {
    lines = -87;
  });
  return lines;
}

/*member: accessAssignInClosure:[subclass=JSInt]*/
accessAssignInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[null]*/ () {
    lines = lines /*invoke: [subclass=JSInt]*/ - 42;
  });
  return lines;
}

/*member: accessBeforeAssignInClosure:[exact=JSUInt31]*/
accessBeforeAssignInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[null]*/ () {
    lines /*invoke: [exact=JSUInt31]*/ - 42;
    lines = 42;
  });
  return lines;
}

/*member: accessAfterAssignInClosure:[exact=JSUInt31]*/
accessAfterAssignInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[subclass=JSInt]*/ () {
    lines = 42;
    return lines /*invoke: [exact=JSUInt31]*/ - 42;
  });
  return lines;
}

/*member: compoundInClosure:[subclass=JSInt]*/
compoundInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[null]*/ () {
    lines /*invoke: [subclass=JSInt]*/ -= 42;
  });
  return lines;
}

/*member: postfixInClosure:[subclass=JSPositiveInt]*/
postfixInClosure() {
  /*[null|subclass=Object]*/ local(/*[subclass=Closure]*/ f) => f();

  int lines = 0;
  local(/*[null]*/ () {
    lines /*invoke: [subclass=JSPositiveInt]*/ ++;
  });
  return lines;
}
