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

import 'dart:core';

void throwString() {
  throw 'hello world!'; // LINT
}

void throwNull() {
  throw null; // LINT
}

void throwNumber() {
  throw 7; // LINT
}

void throwObject() {
  throw new Object(); // LINT
}

void throwError() {
  throw new Error(); // OK
}

void throwDynamicPrebuiltError() {
  var error = new Error();
  throw error; // OK
}

void throwStaticPrebuiltError() {
  Error error = new Error();
  throw error; // OK
}

void throwArgumentError() {
  Error error = new ArgumentError('oh!');
  throw error; // OK
}

void throwException() {
  Exception exception = new Exception('oh!');
  throw exception; // OK
}

void throwStringFromFunction() {
  throw returnString(); // LINT
}

String returnString() => 'string!';

void throwExceptionFromFunction() {
  throw returnException();
}

Exception returnException() => new Exception('oh!');

// TODO: Even though in the test this does not get linted, it does while
// analyzing the SDK code. Find out why.
dynamic noSuchMethod(Invocation invocation) {
  throw new NoSuchMethodError(
      new Object(),
      invocation.memberName,
      invocation.positionalArguments,
      invocation.namedArguments);
}

class E extends Object with Exception {
  static throws() {
    throw new E(); // OK
  }
}
