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

void constantFoldInt() {
  var x = 100;
  var y = 24;
  print(x + y);
  print(x - y);
  print(x * y);
  print(x ~/ y);
  print(x % y);
  print(x.remainder(y));
  print(x / y);
  print(x | y);
  print(x & y);
  print(x ^ y);
  print(x == y);
  print(x > y);
  print(x >= y);
  print(x < y);
  print(x <= y);
  print(x << y);
  print(x >> y);
  print((-x) >>> y);
  print(-x);
  print(~x);
  print(x.toDouble());
  print((-x).abs());
  print(x.sign);
}

void constantFoldDouble() {
  var x = 4.0;
  var y = 0.5;
  var z = double.nan;
  print(x + y);
  print(x + z);
  print(x - y);
  print(x * y);
  print(x ~/ y);
  print(x % y);
  print(x.remainder(y));
  print(x / y);
  print(x == y);
  print(x == z);
  print(x > y);
  print(x > z);
  print(x >= y);
  print(x < y);
  print(x <= y);
  print(-x);
  print(x.ceil());
  print(y.ceilToDouble());
  print(y.round());
  print(x.roundToDouble());
  print((-x).truncate());
  print((-y).truncateToDouble());
}

void moveConstantToRight(int x, double y, Object? obj) {
  print(2 + x);
  print(3 * x);
  print(4 == x);
  print(5 > x);
  print(6 >= x);
  print(7 < x);
  print(8 <= x);
  print(2 + y);
  print(3 * y);
  print(4 == y);
  print(5 > y);
  print(6 >= y);
  print(7 < y);
  print(8 <= y);
  print(null == obj);
}

void arithmeticPatterns(int x, double y) {
  print(0 + x);
  print(0 - x);
  print(1 * x);
  print(x * 0);
  print(x * 16);
  print(x ~/ 32);
  print(x * (-1));
  print(x << 65);
  print(x >> 65);
  print(x >>> 65);
  print(x | 0);
  print(x | (-1));
  print(x | x);
  print(x & 0);
  print(x & (-1));
  print(x & x);
  print(x ^ 0);
  print(x ^ (-1));
  print(x ^ x);
  print(y * 1.0);
  print(y * y);
}

void redundantPhi(int x) {
  if (x > 0) {
    x = x + 0;
  }
  print(x);
}

void stringInterpolation(int x) {
  final empty = '';
  final s = 'string';
  final i = 42;
  final d = 3.14;
  final b = true;
  final n = null;
  print('$empty');
  print('Hey, $s! i=$i, d=$d, b=$b, n=$n');
  print('enclosing start... ${'some nested $s, x=$x'} ...end');
}

void closureCall() {
  final x = (int arg) {
    print(arg);
  };
  x(42);
}

void main() {}
