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;
}