// Copyright (c) 2016, 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.
// @dart=2.9
foo({fisk}) {
  print(fisk);
}

caller(f) {
  f();
}

main() {
  int i = 0;
  print(i == 1 ? "bad" : "good");
  print("$i");
  print("'$i'");
  print(" '${i}' ");
  print(" '${i}' '${i}'");
  print(" '$i' '${i}'");
  print("foo" "bar");
  print(" '${i}' '${i}'" " '$i' '${i}'");
  try {
    throw "fisk";
  } on String catch (e, s) {
    print(e);
    if (s != null) print(s);
  }
  for (; false;) {}
  var list = ["Hello, World!"];
  print(list[i]);
  list[i] = "Hello, Brave New World!";
  print(list[i]);
  i = 87;
  print(-i);
  print(~i);
  print(!(i == 42));
  print(--i);
  print(++i);
  print(i--);
  print(i++);
  print(new Object());
  print(const Object());
  print((new List<String>.filled(2, null)).runtimeType);
  foo(fisk: "Blorp gulp");
  f() {
    print("f was called");
  }

  caller(f);
  caller(() {
    print("<anon> was called");
  });
  g([message]) {
    print(message);
  }

  g("Hello, World");
  caller(([x]) {
    print("<anon> was called with $x");
  });
  h({message}) {
    print(message);
  }

  h(message: "Hello, World");
  caller(({x}) {
    print("<anon> was called with $x");
  });
  print((int).toString());
  print(int);
  print(int..toString());
  try {
    print(int?.toString());
    throw "Shouldn't work";
  } on NoSuchMethodError catch (e) {
    print("As expected: $e");
  }
  print(int.parse("42"));
}
