check method

  1. @override
void check(
  1. DcqRegistry registry
)

Implementation

@override
void check(
  DcqRegistry registry,
) {
  registry.addMethodDeclaration((node) {
    if (node.name.lexeme != 'copyWith') return;

    final bodyNode = node.parent;
    if (bodyNode is! BlockClassBody) return;
    final enclosingClass = bodyNode.parent;
    if (enclosingClass is! ClassDeclaration) return;

    final classBody = enclosingClass.body;
    if (classBody is! BlockClassBody) return;
    final fieldNames = <String>{};
    for (final member in classBody.members) {
      if (member is! FieldDeclaration) continue;
      if (member.isStatic) continue;
      if (!member.fields.isFinal) continue;
      for (final variable in member.fields.variables) {
        fieldNames.add(variable.name.lexeme);
      }
    }

    if (fieldNames.isEmpty) return;

    final paramNames = <String>{};
    final params = node.parameters?.parameters;
    if (params != null) {
      for (final param in params) {
        final name = param.name?.lexeme;
        if (name != null) paramNames.add(name);
      }
    }

    final missingFields = fieldNames.where(
      (name) => !paramNames.contains(name),
    );
    if (missingFields.isNotEmpty) {
      reportAtToken(node.name);
    }
  });
}