check method

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

Implementation

@override
void check(
  DcqRegistry registry,
) {
  registry.addInstanceCreationExpression((node) {
    final name = node.constructorName.type.name.lexeme;
    if (!_builderWidgets.contains(name)) return;

    final builderArg = node.argumentList.arguments
        .whereType<NamedExpression>()
        .where((arg) => arg.name.label.name == 'builder')
        .firstOrNull;

    if (builderArg == null) return;

    final callback = builderArg.expression;
    if (callback is! FunctionExpression) return;

    final params = callback.parameters?.parameters;
    if (params == null || params.isEmpty) return;

    final innerParam = params.first;
    final innerContextName = innerParam.name?.lexeme;
    if (innerContextName == null) return;

    final outerContextName = _findOuterBuildContextName(node);
    if (outerContextName == null) return;

    if (innerContextName == outerContextName) return;

    final body = callback.body;
    final finder = _OuterContextUsageFinder(
      outerContextName: outerContextName,
      innerContextName: innerContextName,
    );
    body.accept(finder);

    for (final usage in finder.usages) {
      reportAtNode(usage);
    }
  });
}