check method

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

Implementation

@override
void check(
  DcqRegistry registry,
) {
  registry.addMethodDeclaration((node) {
    if (!node.metadata.any((a) => a.name.name == 'override')) return;

    final params = node.parameters;
    if (params == null) return;

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

    final extendsClause = classNode.extendsClause;
    if (extendsClause == null) return;

    final superType = extendsClause.superclass.type;
    if (superType is! InterfaceType) return;

    final superMethodType = _findMethodType(superType, node.name.lexeme);
    if (superMethodType == null) return;

    for (final param in params.parameters) {
      if (param is! DefaultFormalParameter) continue;
      final defaultValue = param.defaultValue;
      if (defaultValue == null) continue;

      final superParam = _findParam(
        superMethodType.formalParameters,
        param.name?.lexeme,
      );
      if (superParam == null) continue;

      final superDefault = superParam.defaultValueCode;
      if (superDefault == null) continue;

      if (defaultValue.toSource() != superDefault) {
        reportAtNode(defaultValue);
      }
    }
  });
}