Skip to content

For unrelated_type_equality_checks (and other rules), how are extension types related to other things? #59299

Open
@srawlins

Description

@srawlins

Here's a very simple example:

extension type ET(int it) {}

extension type ETnum(int it) implements num {}

void m1(int? a, ET b) {
  a == b;
  b == a;
}

void m2(int? a, ETnum b) {
  a == b;
  b == a;
}

An ET can be equal to an int?, and vice versa. An ETnum can be equal to a int?, and vice versa. It seems like they should be considered "related."

Similarly an extension type should be considered "related" to other extension types that it "implements."

One other big lint rule that this affects is collection_methods_unrelated_type:

extension type ET(int it) {}

extension type ETnum(int it) implements num {}

bool m1(List<int> list, ET a) => list.contains(a);
bool m2(List<ET> list, int a) => list.contains(a);
bool m3(List<int> list, ETnum a) => list.contains(a);
bool m4(List<ETnum> list, int a) => list.contains(a);

Should all of the code here be allowed? I think so...

So more formally, given a type T and an extension type V1 declared as extension type V1(T it) implements V2, V3, ...:

  • V1 is related to T.
  • T is related to V1.
  • V1 is related to V2, etc.
  • V2, etc. are related to V1.

But there might be something more necessary, like "V1 is related to any type which T is related to." Then if V1 is an extension type on int, it is related to num.

I'll note that the algorithm for "relatedness" is not super well-defined, and is pretty ad hoc, but these are important linter rules, and the existing relatedness algorithm has gotten us very far.

CC @pq @jacob314 @eernstg @lrhn

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2A bug or feature request we're likely to work onarea-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-new-language-featurelinter-set-coretype-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