Rules / Style / avoid-positional-fields-in-records

avoid-positional-fields-in-records

lint/style/avoid-positional-fields-in-records
recommended
Same as avoid_positional_fields_in_records · Pyramid Lint

Flags positional fields in record types.

Positional record fields are accessed as $1, $2, and so on, which convey nothing about what each field means and break silently when fields are reordered. Named fields (({int x, int y})) document intent at both the declaration and every use site. The check recurses through type arguments and nested record and function types, so a positional field buried inside a generic is still reported.

Invalid

example.dartdart
class RecordExamples {
  /// Positional fields in record literal
  void example1() {
    final record = (1, 'hello');
    print(record);
  }

  /// Positional fields in record type return
  (int, String) getInfo() {
    return (42, 'answer');
  }

  /// Positional fields in record type parameter
  void processRecord((int, String) data) {
    print(data);
  }

  /// Positional fields in record type variable
  void example2() {
    (String, bool, int) tuple = ('test', true, 5);
    print(tuple);
  }

  /// Positional fields in record literal with multiple
  void example3() {
    final result = (1, 2, 3, 'four');
    print(result);
  }
}
Avoid positional fields in records. Use named fields instead.
3 void example1() {
4 final record = (1, 'hello');
Avoid positional fields in records. Use named fields instead.
8 /// Positional fields in record type return
9 (int, String) getInfo() {
Avoid positional fields in records. Use named fields instead.
13 /// Positional fields in record type parameter
14 void processRecord((int, String) data) {
Avoid positional fields in records. Use named fields instead.
19 void example2() {
20 (String, bool, int) tuple = ('test', true, 5);
Avoid positional fields in records. Use named fields instead.
25 void example3() {
26 final result = (1, 2, 3, 'four');

Valid

example.dartdart
class RecordExamples {
  /// Named fields in record literal
  void example1() {
    final record = (id: 1, name: 'hello');
    print(record);
  }

  /// Named fields in record type return
  ({int id, String name}) getInfo() {
    return (id: 42, name: 'answer');
  }

  /// Named fields in record type parameter
  void processRecord(({int id, String name}) data) {
    print(data);
  }

  /// Named fields in record type variable
  void example2() {
    ({String name, bool active, int count}) tuple = (name: 'test', active: true, count: 5);
    print(tuple);
  }

  /// Named fields in record literal with multiple
  void example3() {
    final result = (a: 1, b: 2, c: 3, d: 'four');
    print(result);
  }

  /// Record with mixed named fields
  void example4() {
    final data = (userId: 100, isActive: true);
    print(data.userId);
    print(data.isActive);
  }
}

How to configure

Set the severity of avoid-positional-fields-in-records in your falcon.json:

falcon.jsonjson
{
  "linter": {
    "rules": {
      "style": {
        "avoid-positional-fields-in-records": "error"
      }
    }
  }
}