-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Description
The following code does not emit a dartanalyzer error/warning/hint
import 'dart:async';
typedef void VoidReturnType(String msg);
bar(VoidReturnType function, String msg) {
function(msg);
}
main() {
Future fun(String m) {
print(m);
// The future returned here could come from other parts of the program.
return new Future.error('unexpected error');
}
bar(fun, 'hello world');
}
Reading the dart specification, this seems correct behavior:
A function type (T1, ..., Tk, ...) → T is a subtype of the function type (S1, ..., Sk+j, ...) → S, if all of the following conditions are met:
Either
S is void,
or T ⇔ S.
But it can cause easily programming errors, where
- programmer A assumes that the caller will handle the returned Future
- programmer B who does something with the function, assumes it is void
I think this is a case where type systems usually helps users, but not in the case of the dart type system.
It would be very beneficial for our users to get at least a hint in this specific case.
More broadly speaking, it would be beneficial to get hints if a user doesn't act upon a future object it gets from somewhere (neither handles it's value nor it's errors).