Skip to content

Enhancement for dartanalyzer: Emit hints for special case of function type compatibility checking #57146

@mkustermann

Description

@mkustermann

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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3A lower priority bug or feature requestarea-devexpFor issues related to the analysis server, IDE support, linter, `dart fix`, and diagnostic messages.devexp-linterIssues with the analyzer's support for the linter packagelinter-lint-proposaltype-enhancementA request for a change that isn't a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions