add-equatable-props

Path
lint/correctness/add-equatable-props
Default
On (recommended)
Origin
Falcon
Domain
equatable
Rule
2 of 512
recommendedequatable

Flags concrete Equatable subclasses that do not declare an instance props property.

A concrete subclass must explicitly define which values participate in equality, even when a parent already supplies props. An instance getter, field or declaring constructor parameter named props satisfies the rule. Abstract/sealed bases are exempt. Only resolved transitive package:equatable subtypes inheriting Equatable's concrete equality are checked; interface-only implementations, classes replacing equality, unrelated same-named types and unknown types are ignored.

Invalid

example.dartdart
import 'support.dart' as fixtures;
import 'support.dart';
class Direct extends Parent {}
class MixedValue extends Mixed {}
class Indirect extends Parent { final int child = 1; }
class Transitive extends Middle { final int child = 1; }
class PrefixedChild extends fixtures.Parent { final int value = 1; }
class MixedChild extends Mixed { final int first = 1; final int second = 2; }
This Equatable subclass is missing a `props` getter. Override it to define equality.
2import 'support.dart';
3class Direct extends Parent {}
This Equatable subclass is missing a `props` getter. Override it to define equality.
3class Direct extends Parent {}
4class MixedValue extends Mixed {}
This Equatable subclass is missing a `props` getter. Override it to define equality.
4class MixedValue extends Mixed {}
5class Indirect extends Parent { final int child = 1; }
This Equatable subclass is missing a `props` getter. Override it to define equality.
5class Indirect extends Parent { final int child = 1; }
6class Transitive extends Middle { final int child = 1; }
This Equatable subclass is missing a `props` getter. Override it to define equality.
6class Transitive extends Middle { final int child = 1; }
7class PrefixedChild extends fixtures.Parent { final int value = 1; }
This Equatable subclass is missing a `props` getter. Override it to define equality.
7class PrefixedChild extends fixtures.Parent { final int value = 1; }
8class MixedChild extends Mixed { final int first = 1; final int second = 2; }

Valid

example.dartdart
import 'package:equatable/equatable.dart';
import 'package:equatable/equatable.dart' as eq;
import 'support.dart';
class Direct extends Equatable { List<Object?> get props => []; }
class MixedValue with EquatableMixin { List<Object?> get props => []; }
class Indirect extends Parent { List<Object?> get props => super.props; }
class Transitive extends Middle { List<Object?> get props => []; }
class Prefixed extends eq.Equatable { List<Object?> get props => []; }
class MixedChild extends Mixed { List<Object?> get props { return []; } }
class Unrelated { final int value = 1; }

Configure add-equatable-props

Set its severity in falcon.json. See the configuration guide.

falcon.jsonjson
{
  "linter": {
    "rules": {
      "correctness": {
        "add-equatable-props": "error"
      }
    }
  }
}

Or silence one occurrence with a suppression comment; the reason is required.

example.dartdart
// falcon-ignore lint/correctness/add-equatable-props: <reason>