runWithReporter method

  1. @override
void runWithReporter(
  1. SaropaDiagnosticReporter reporter,
  2. SaropaContext context
)
override

Override this method to implement your lint rule.

Use context to register callbacks for AST node types:

context.addMethodInvocation((node) {
  if (condition) {
    reporter.atNode(node);
  }
});

Implementation

@override
void runWithReporter(
  SaropaDiagnosticReporter reporter,
  SaropaContext context,
) {
  context.addClassDeclaration((ClassDeclaration node) {
    // Collect all instance fields
    final Set<String> fieldNames = <String>{};
    for (final ClassMember member in node.body.members) {
      if (member is FieldDeclaration && !member.isStatic) {
        for (final VariableDeclaration variable in member.fields.variables) {
          fieldNames.add(variable.name.lexeme);
        }
      }
    }

    if (fieldNames.isEmpty) return;

    // Find copyWith method
    for (final ClassMember member in node.body.members) {
      if (member is MethodDeclaration && member.name.lexeme == 'copyWith') {
        final FormalParameterList? params = member.parameters;
        if (params == null) continue;

        // Get parameter names
        final Set<String> paramNames = <String>{};
        for (final FormalParameter param in params.parameters) {
          final String? name = param.name?.lexeme;
          if (name != null) {
            paramNames.add(name);
          }
        }

        // Check if any fields are missing
        final Set<String> missingFields = fieldNames.difference(paramNames);
        if (missingFields.isNotEmpty) {
          reporter.atNode(member);
        }
      }
    }
  });
}