resolveSelectorChain function

SelectorResolution? resolveSelectorChain(
  1. List<SnapshotNode> nodes,
  2. SelectorChain chain, {
  3. required String platform,
  4. bool requireRect = false,
  5. bool requireUnique = true,
  6. bool disambiguateAmbiguous = false,
})

Resolve a selector chain to a single node with options.

Implementation

SelectorResolution? resolveSelectorChain(
  List<SnapshotNode> nodes,
  SelectorChain chain, {
  required String platform,
  bool requireRect = false,
  bool requireUnique = true,
  bool disambiguateAmbiguous = false,
}) {
  final diagnostics = <SelectorDiagnostics>[];
  for (var i = 0; i < chain.selectors.length; i += 1) {
    final selector = chain.selectors[i];
    final summary = _analyzeSelectorMatches(
      nodes,
      selector,
      platform,
      requireRect,
    );
    diagnostics.add(
      SelectorDiagnostics(selector: selector.raw, matches: summary.count),
    );
    if (summary.count == 0 || summary.firstNode == null) continue;
    if (requireUnique && summary.count != 1) {
      if (!disambiguateAmbiguous || summary.disambiguated == null) continue;
      return SelectorResolution(
        node: summary.disambiguated!,
        selector: selector,
        selectorIndex: i,
        matches: summary.count,
        diagnostics: diagnostics,
      );
    }
    return SelectorResolution(
      node: summary.firstNode!,
      selector: selector,
      selectorIndex: i,
      matches: summary.count,
      diagnostics: diagnostics,
    );
  }
  return null;
}