avoid-missing-completer-stack-trace

Path
lint/correctness/avoid-missing-completer-stack-trace
Default
Off, opt in
Origin
Falcon
Rule
84 of 512

Preserve error origins when calling SDK Completer.completeError. Pass the caught stack trace, or StackTrace.current, as the second argument.

Checks ordinary, null-aware, and cascade calls using resolved receiver types. Explicit null is missing too. Custom same-named methods and dynamic receivers are ignored; inherited methods are checked only when their SDK owner resolves and library/import lookup does not select a different completeError function.

Reference: https://dcm.dev/docs/rules/common/avoid-missing-completer-stack-trace/

Invalid

example.dartdart
import 'dart:async';
import 'dart:async' as async;

void errors(Completer<int> completer, Completer<void>? nullable, async.Completer<String> prefixed) {
  completer.completeError('first');
  completer.completeError('second', null);
  nullable?.completeError('third');
  prefixed.completeError('fourth');
  completer..completeError('fifth');
}
Pass a stack trace as the second argument to `Completer.completeError`.
4void errors(Completer<int> completer, Completer<void>? nullable, async.Completer<String> prefixed) {
5 completer.completeError('first');
Pass a stack trace as the second argument to `Completer.completeError`.
5 completer.completeError('first');
6 completer.completeError('second', null);
Pass a stack trace as the second argument to `Completer.completeError`.
6 completer.completeError('second', null);
7 nullable?.completeError('third');
Pass a stack trace as the second argument to `Completer.completeError`.
7 nullable?.completeError('third');
8 prefixed.completeError('fourth');
Pass a stack trace as the second argument to `Completer.completeError`.
8 prefixed.completeError('fourth');
9 completer..completeError('fifth');

Valid

example.dartdart
import 'dart:async';

class Custom {
  void completeError(Object error) {}
}

void errors(Completer<int> completer, Completer<void>? nullable, dynamic unknown, StackTrace trace) {
  completer.completeError('first', trace);
  completer.completeError('second', StackTrace.current);
  nullable?.completeError('third', trace);
  completer..completeError('fourth', trace);
  Custom().completeError('custom');
  unknown.completeError('unknown');
  completer.complete(1);
}

abstract class Overriding<T> implements Completer<T> {
  void completeError(Object error, [StackTrace? stackTrace]) {}
  void fail(Object error) {
    completeError(error);
  }
}

extension CustomCompleterErrors<T> on Completer<T> {
  void completeError(Object error) {}
  void failWithCustomHandler(Object error) {
    completeError(error);
  }
}

Configure avoid-missing-completer-stack-trace

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "correctness": {
        "avoid-missing-completer-stack-trace": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/correctness/avoid-missing-completer-stack-trace: <reason>