parse static method

expression as a node comparison, if it is one.

Implementation

static CompareToNodeExpression? parse(XPathExpression expression) {
  final (XPathExpression? a, XPathExpression? b) = switch (expression) {
    XPathCmpExpr(:final a, :final b) ||
    XPathEqExpr(:final a, :final b) => (a, b),
    XPathFuncExpr(:final args)
        when expression.isIdempotent && args.length == 2 =>
      (args[0], args[1]),
    _ => (null, null),
  };
  XPathPathExpr? node;
  XPathExpression? context;
  for (final sub in [a, b]) {
    if (sub is XPathPathExpr) {
      if (sub.start == PathStart.relative) {
        node = sub;
      } else {
        context = sub;
      }
    } else if (sub is XPathNumericLiteral || sub is XPathStringLiteral) {
      context = sub;
    }
  }
  return node != null && context != null
      ? CompareToNodeExpression._(node, context, expression)
      : null;
}