// 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: boxedLoopVariableExample:*/
boxedLoopVariableExample() {
  var input = [1, 2, 3];
  var fs = [];
  for (var /*boxed*/ x in input) {
    fs.add(/*fields=[box0],free=[box0,x]*/ () {
      return x;
    });
    x++;
  }
  return fs;
}

/*element: readParameterInAnonymousClosure:*/
readParameterInAnonymousClosure(/**/ parameter) {
  return /*fields=[parameter],free=[parameter]*/ () => parameter;
}

/*element: readParameterInClosure:*/
readParameterInClosure(/**/ parameter) {
  /*fields=[parameter],free=[parameter]*/ func() => parameter;
  return func;
}

/*element: writeParameterInAnonymousClosure:box=(box0 which holds [parameter])*/
writeParameterInAnonymousClosure(/*boxed*/ parameter) {
  return /*fields=[box0],free=[box0,parameter]*/ () {
    parameter = 42;
  };
}

/*element: writeParameterInClosure:box=(box0 which holds [parameter])*/
writeParameterInClosure(/*boxed*/ parameter) {
  /*fields=[box0],free=[box0,parameter]*/ func() {
    parameter = 43;
  }

  return func;
}

/*element: readLocalInAnonymousClosure:*/
readLocalInAnonymousClosure(/**/ parameter) {
  var /**/ local = parameter;
  return /*fields=[local],free=[local]*/ () => local;
}

/*element: readLocalInClosure:*/
readLocalInClosure(/**/ parameter) {
  var /**/ local = parameter;
  /*fields=[local],free=[local]*/ func() => local;
  return func;
}

/*element: writeLocalInAnonymousClosure:box=(box0 which holds [local])*/
writeLocalInAnonymousClosure(/**/ parameter) {
  // ignore: UNUSED_LOCAL_VARIABLE
  var /*boxed*/ local = parameter;
  return /*fields=[box0],free=[box0,local]*/ () {
    local = 44;
  };
}

/*element: writeLocalInClosure:box=(box0 which holds [local])*/
writeLocalInClosure(/**/ parameter) {
  // ignore: UNUSED_LOCAL_VARIABLE
  var /*boxed*/ local = parameter;
  /*fields=[box0],free=[box0,local]*/ func() {
    local = 45;
  }

  return func;
}

/*element: Foo.:hasThis*/
class Foo {
  int /*element: Foo.bar:hasThis*/ bar = 4;

  /*element: Foo.baz:hasThis*/ baz() {
    /*fields=[this],free=[this],hasThis*/ func() => bar;
    return func;
  }
}

/*element: Repro.:hasThis*/
class Repro {
  /*element: Repro.qux:hasThis*/ qux() {
    /*fields=[this],free=[this],hasThis*/ threeNested(foo) =>
        /*fields=[this],free=[this],hasThis*/ (bar) => someFunction();
    return threeNested;
  }

  /*element: Repro.someFunction:hasThis*/ someFunction() => 3;
}

main() {
  boxedLoopVariableExample();
  readParameterInAnonymousClosure(null);
  readParameterInClosure(null);
  writeParameterInAnonymousClosure(null);
  writeParameterInClosure(null);
  readLocalInAnonymousClosure(null);
  readLocalInClosure(null);
  writeLocalInAnonymousClosure(null);
  writeLocalInClosure(null);
  new Foo().baz();
  new Repro().qux();
}
