// Copyright (c) 2018, 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.

main() {
  var c = Class();
  c. /*1:main*/ instancePositional1(0);

  // Use all optional parameters to ensure that they are not elided.
  var d = Class();
  d.instancePositional1(null, null, null);
  d.instancePositional2(null, null, null);
  d.instanceNamed1(null, b: null, c: null, d: null);
  d.instanceNamed2(null, b: null, c: null, d: null);
  d.instanceNamed3(null, b: null, c: null, d: null);
  d.instanceNamed4(null, b: null, c: null, d: null);
}

class Class {
  @pragma('dart2js:noInline')
  /*2:Class.instancePositional1[function-entry$1]*/
  instancePositional1(a, [b = 42, c = 87]) {
    print('instancePositional1($a,$b,$c)');
    /*3:Class.instancePositional1*/
    instancePositional2(1, 2);
  }

  @pragma('dart2js:noInline')
  /*4:Class.instancePositional2[function-entry$2]*/
  instancePositional2(a, [b = 42, c = 87]) {
    print('instancePositional2($a,$b,$c)');
    /*5:Class.instancePositional2*/
    instancePositional3(3, 4, 5);
  }

  @pragma('dart2js:noInline')
  instancePositional3(a, [b = 42, c = 87]) {
    print('instancePositional3($a,$b,$c)');
    /*6:Class.instancePositional3*/
    instanceNamed1(0);
  }

  @pragma('dart2js:noInline')
  /*7:Class.instanceNamed1[function-entry$1]*/
  instanceNamed1(a, {b = 42, c = 87, d = 735}) {
    print('instanceNamed1($a,b:$b,c:$c,d:$d)');
    /*8:Class.instanceNamed1*/
    instanceNamed2(1, b: 2);
  }

  @pragma('dart2js:noInline')
  /*9:Class.instanceNamed2[function-entry$1$b]*/
  instanceNamed2(a, {b = 42, c = 87, d = 735}) {
    print('instanceNamed2($a,b:$b,c:$c,d:$d)');
    /*10:Class.instanceNamed2*/
    instanceNamed3(3, c: 123);
  }

  @pragma('dart2js:noInline')
  /*11:Class.instanceNamed3[function-entry$1$c]*/
  instanceNamed3(a, {b = 42, c = 87, d = 735}) {
    print('instanceNamed3($a,b:$b,c:$c,d:$d)');
    /*12:Class.instanceNamed3*/
    instanceNamed4(4, c: 45, b: 76);
  }

  @pragma('dart2js:noInline')
  /*13:Class.instanceNamed4[function-entry$1$b$c]*/
  instanceNamed4(a, {b = 42, c = 87, d = 735}) {
    print('instanceNamed4($a,b:$b,c:$c,d:$d)');
    /*14:Class.instanceNamed4*/
    instanceNamed5(5, c: 6, b: 7, d: 8);
  }

  @pragma('dart2js:noInline')
  instanceNamed5(a, {b = 42, c = 87, d = 735}) {
    print('instanceNamed5($a,b:$b,c:$c,d:$d)');
    /*18:Class.instanceNamed5[function-entry$0].local*/
    local([e = 42]) {
      print('instanceNamed5.local($e)');
      /*19:Class.instanceNamed5.local*/
      throw '>ExceptionMarker<';
    }

    var anonymous = /*16:Class.instanceNamed5[function-entry$0].<anonymous function>*/
        ({f = 87}) {
          print('instanceNamed5.<anonymous(f:$f)');
          /*17:Class.instanceNamed5.<anonymous function>*/
          local();
        };
    anonymous. /*15:Class.instanceNamed5*/ call();
  }
}
