// 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);
}

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

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

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

  @pragma('dart2js:noInline')
  instanceNamed1(a, {b = 42, c = 87, d = 735}) {
    print('instanceNamed1($a,b:$b,c:$c,d:$d)');
    /*5:Class.instanceNamed1*/
    instanceNamed2(1, b: 2);
  }

  @pragma('dart2js:noInline')
  instanceNamed2(a, {b = 42, c = 87, d = 735}) {
    print('instanceNamed2($a,b:$b,c:$c,d:$d)');
    /*6:Class.instanceNamed2*/
    instanceNamed3(3, c: 123);
  }

  @pragma('dart2js:noInline')
  instanceNamed3(a, {b = 42, c = 87, d = 735}) {
    print('instanceNamed3($a,b:$b,c:$c,d:$d)');
    /*7:Class.instanceNamed3*/
    instanceNamed4(4, c: 45, b: 76);
  }

  @pragma('dart2js:noInline')
  instanceNamed4(a, {b = 42, c = 87, d = 735}) {
    print('instanceNamed4($a,b:$b,c:$c,d:$d)');
    /*8: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)');
    /*12:Class.instanceNamed5[function-entry$0].local*/
    local([e = 42]) {
      print('instanceNamed5.local($e)');
      /*13:Class.instanceNamed5.local*/
      throw '>ExceptionMarker<';
    }

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