run method

  1. @override
void run(
  1. CustomLintResolver resolver,
  2. ErrorReporter reporter,
  3. CustomLintContext context
)
override

Emits lints for a given file.

run will only be invoked with files respecting filesToAnalyze

Implementation

@override
void run(
  CustomLintResolver resolver,
  ErrorReporter reporter,
  CustomLintContext context,
) {
  context.registry.addArgumentList((node) {
    for (final argument in node.arguments) {
      final parameter = argument.correspondingParameter;
      if (parameter == null) continue;
      if (!_checker.hasAnnotationOf(parameter)) continue;

      final inner =
          argument is NamedExpression ? argument.expression : argument;

      if (!_isFunctionTyped(parameter.type)) continue;

      if (inner is FunctionExpression) {
        reporter.atNode(inner, code);
        continue;
      }

      if (inner is Identifier) {
        final element = inner.element;
        final isSendableFn = element is TopLevelFunctionElement ||
            (element is MethodElement && element.isStatic);
        if (!isSendableFn) {
          reporter.atNode(inner, code);
        }
        continue;
      }

      // PropertyAccess (e.g. `Foo.bar` where `bar` is a static method) is
      // already an Identifier after resolution in most analyzer versions;
      // anything else is conservatively rejected.
      reporter.atNode(inner, code);
    }
  });
}