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 (inner is FunctionExpression) {
        reporter.atNode(inner, code);
        continue;
      }
      if (inner is Identifier) {
        final element = inner.element;
        // Allowed strong references:
        //  * VariableElement     — `final f = ...; pass(f);`
        //  * GetterElement        — `pass(obj.f);` (stored callable read)
        //  * TopLevelFunctionElement — program-lifetime, by definition.
        //  * MethodElement on a static context — class-lifetime.
        final isAllowedReference = element is VariableElement ||
            element is GetterElement ||
            element is TopLevelFunctionElement ||
            (element is MethodElement && element.isStatic);
        if (!isAllowedReference) {
          reporter.atNode(inner, code);
        }
      }
    }
  });
}