run method

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

Emits lints for a given file.

run will only be invoked with files respecting filesToAnalyze

Implementation

@override
void run(
  CustomLintResolver resolver,
  DiagnosticReporter reporter,
  CustomLintContext context,
) {
  context.registry.addClassDeclaration((node) {
    final element = node.declaredFragment?.element;
    if (element == null) return;

    final hasConstructorWithParameters = node.members.any(
      (e) =>
          e is ConstructorDeclaration && e.parameters.parameters.isNotEmpty,
    );
    if (!hasConstructorWithParameters) return;

    final isImmutable = [
      ...node.metadata.map((e) => e.name.name),
      ...element.allSupertypes
          .expand((e) => e.element.metadata.annotations)
          .map((e) => e.element?.displayName)
          .whereType<String>(),
    ].any((e) => e == 'immutable');
    if (isImmutable) return;

    final hasOnlyGetters =
        node.members.whereType<FieldDeclaration>().every(
          (e) => !e.isStatic && e.fields.isFinal,
        ) &&
        element.allSupertypes.every((e) => e.setters.isEmpty);
    if (!hasOnlyGetters) return;

    reporter.atToken(node.name, _code);
  });
}