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

final bool kTrue = int.parse('1') == 1 ? true : false;
final bool kFalse = int.parse('1') == 2 ? true : false;
int get mint => 0xaabbccddaabbccdd;
int get smiOrMint => kTrue ? 1 : mint;

abstract class BI1 {
  int get value;
}

class BI1A implements BI1 {
  final int value;
  BI1A(this.value);
}

class BI1B implements BI1 {
  int get value => null;
}

abstract class BI2 {
  int get value;
}

class BI2A implements BI2 {
  final int value;
  BI2A(this.value);
}

class BI2B implements BI2 {
  int get value => smiOrMint;
}

abstract class BI3 {
  int get value;
  set value(int value);
}

class BI3A implements BI3 {
  int value;
  BI3A(this.value);
}

class BI3B implements BI3 {
  int get value => smiOrMint;
  set value(int v) {}
}

abstract class UBI {
  int value;
}

class UBIA implements UBI {
  int value;
  UBIA(this.value);
}

class UBIB implements UBI {
  int get value => smiOrMint;
  set value(int v) {}
}

main() {
  // Getter return value needs to be boxed due to BI1B.value returning `null`.
  final bi1a = BI1A(smiOrMint);
  final bi1b = BI1B(); // getter returns null
  use((kTrue ? bi1a : bi1b).value);

  // Getter return value needs to be boxed due to BI2A.value returning `null`.
  final bi2a = BI2A(null);
  final bi2b = BI2B(); // getter returns smiOrMint
  use((kTrue ? bi2a : bi2b).value);

  // Getter return value needs to be boxed due to setter being called with
  // `null` value.
  final bi3a = BI3A(smiOrMint);
  final bi3b = BI3B(); // getter returns smiOrMint
  (kTrue ? bi3a : bi3b).value = null;
  use((kTrue ? bi3a : bi3b).value);

  // Getter return value can be unboxed, both UBIA.value / UBIB.value return
  // non-nullable int.
  final ubia = UBIA(smiOrMint);
  final ubib = UBIB(); // getter returns smiOrMint
  use((kTrue ? ubia : ubib).value);
}

void use(dynamic object) {}
