check method

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

Implementation

@override
void check(DcqRegistry registry) {
  var hasProviderImport = false;
  registry.addImportDirective((node) {
    final uri = node.uri.stringValue;
    if (uri != null && uri.startsWith('package:provider/')) {
      hasProviderImport = true;
    }
  });

  final pendingNodes = <ConstructorName>[];

  registry.addInstanceCreationExpression((node) {
    final typeName = node.constructorName.type.name.lexeme;
    if (!_providerWidgets.contains(typeName)) return;

    final childArg = node.argumentList.arguments
        .whereType<NamedExpression>()
        .where((a) => a.name.label.name == 'child')
        .firstOrNull;
    if (childArg == null) return;

    final child = childArg.expression;
    if (child is InstanceCreationExpression) {
      final childType = child.constructorName.type.name.lexeme;
      if (_providerWidgets.contains(childType)) {
        pendingNodes.add(node.constructorName);
      }
    }
  });

  registry.afterLibrary(() {
    if (!hasProviderImport) return;
    for (final node in pendingNodes) {
      reportAtNode(node);
    }
  });
}