| // 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. |
| |
| Null nil = null; |
| |
| Never never = throw "Never"; |
| |
| void takesAny(Object? n) {} |
| |
| void takesObject(Object n) { |
| // In weak mode, we may get null. Throw AssertionError so that this |
| // can be distinguished from a dynamic call failure. |
| if (n == null) throw AssertionError("Not an Object"); |
| } |
| |
| void takesInt(int n) { |
| // In weak mode, we may get null. Throw AssertionError so that this |
| // can be distinguished from a dynamic call failure. |
| if (n == null) throw AssertionError("Not an int"); |
| } |
| |
| void takesNull(Null n) { |
| if (n != null) throw AssertionError("Not null"); |
| } |
| |
| void takesNever(Never n) { |
| // In weak mode, we may get null. However, we can't observe it (because |
| // evaluating an expression of type `Never` causes an exception to be |
| // thrown). So do nothing. |
| } |
| |
| void applyTakesNull(void Function(Null) fn, dynamic arg) { |
| // Make the cast explicit for clarity. |
| fn(arg as Null); |
| } |
| |
| void applyTakesNever(void Function(Never) fn, dynamic arg) { |
| // We can't make the cast explicit, because `arg as Never` has static type |
| // `Never`, which would cause an exception to be thrown. |
| fn(arg); |
| } |
| |
| void applyTakesNullDynamically(void Function(Null) fn, dynamic arg) { |
| (fn as dynamic)(arg); |
| } |
| |
| void applyTakesNeverDynamically(void Function(Never) fn, dynamic arg) { |
| (fn as dynamic)(arg); |
| } |