// 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.

enum Enum {
  a,
  b,
  c,
}

/*member: tester1:params=0*/
@pragma('dart2js:noInline')
tester1() {}

/*member: tester2:params=0*/
@pragma('dart2js:noInline')
tester2() {}

/*member: tester3:params=0*/
@pragma('dart2js:noInline')
tester3() {}

class Class {
  /*member: Class.state1:elided*/
  final int state1;

  /*member: Class.state2:elided*/
  final Enum state2;

  Class({this.state1: 1, this.state2: Enum.c});

  /*member: Class.method1a:calls=[tester2(0)],params=0*/
  @pragma('dart2js:noInline')
  method1a() {
    if (state1 == 0) {
      return tester1();
    } else if (state1 == 1) {
      return tester2();
    } else if (state1 == 2) {
      return tester3();
    }
  }

  // TODO(johnniwinther): Inline switch cases with constant expressions.
  /*member: Class.method1b:calls=[tester2(0)],params=0,switch*/
  @pragma('dart2js:noInline')
  method1b() {
    switch (state1) {
      case 0:
        return tester1();
      case 1:
        return tester2();
      case 2:
        return tester3();
    }
  }

  /*member: Class.method2a:calls=[tester3(0)],params=0*/
  @pragma('dart2js:noInline')
  method2a() {
    if (state2 == Enum.a) {
      return tester1();
    } else if (state2 == Enum.b) {
      return tester2();
    } else if (state2 == Enum.c) {
      return tester3();
    }
  }

  /*member: Class.method2b:calls=[tester1(0),tester2(0),tester3(0)],params=0,switch*/
  @pragma('dart2js:noInline')
  method2b() {
    // TODO(johnniwinther): Eliminate dead code in enum switch.
    switch (state2) {
      case Enum.a:
        return tester1();
      case Enum.b:
        return tester2();
      case Enum.c:
        return tester3();
    }
  }
}

/*member: main:calls=*,params=0*/
main() {
  var c = new Class();
  c.method1a();
  c.method1b();
  c.method2a();
  c.method2b();
}
