// Copyright (c) 2019, 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: method1:params=0*/
@pragma('dart2js:noInline')
method1([a]) => /*access=[a],params=0*/ () => a;

class Class {
  /*member: Class.f:emitted*/
  @pragma('dart2js:noElision')
  var f;

  /*member: Class.capture:params=0*/
  @pragma('dart2js:noInline')
  Class.capture([a]) : f = ( /*access=[a],params=0*/ () => a);

  // TODO(johnniwinther): Remove the redundant assignment of elided boxed
  // parameters.
  /*member: Class.box:assign=[a,a],params=0*/
  @pragma('dart2js:noInline')
  Class.box([a])
    : f = ( /*access=[_box_0],assign=[a],params=0*/ () {
        a = 42;
      });

  Class.internal(this.f);
}

class Subclass extends Class {
  /*member: Subclass.capture:params=0*/
  @pragma('dart2js:noInline')
  Subclass.capture([a]) : super.internal(/*access=[a],params=0*/ () => a);

  /*member: Subclass.box:assign=[a,a],params=0*/
  @pragma('dart2js:noInline')
  Subclass.box([a])
    : super.internal(/*access=[_box_0],assign=[a],params=0*/ () {
        a = 42;
      });
}

/*member: main:calls=*,params=0*/
main() {
  method1();
  Class.capture();
  Class.box();
  Subclass.capture();
  Subclass.box();
}
