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 (typeName != 'ChangeNotifierProvider' &&
        typeName != 'Provider' &&
        typeName != 'StateNotifierProvider') {
      return;
    }
    if (node.constructorName.name?.name != 'value') return;

    final valueArg = node.argumentList.arguments
        .whereType<NamedExpression>()
        .where((a) => a.name.label.name == 'value')
        .firstOrNull;
    if (valueArg != null &&
        valueArg.expression is InstanceCreationExpression) {
      pendingNodes.add(node.constructorName);
    }
  });

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