matchesItem method

  1. @override
bool matchesItem(
  1. XPathItem item
)
override

Whether the item matches this type.

Implementation

@override
bool matchesItem(XPathItem item) {
  if (item is! XPathFunctionItem) return false;
  if (isAny) return true;
  if (item.arity != parameterTypes!.length) return false;

  if (item is XPathMap) {
    if (parameterTypes!.length != 1) return false;
    final argType = parameterTypes!.single;
    if (!argType.isSubtypeOf(xsAnyAtomicType) &&
        !argType.isSubtypeOf(
          const XPathSequenceType(
            itemType: xsAnyAtomicType,
            cardinality: XPathCardinality.zeroOrOne,
          ),
        )) {
      return false;
    }
    if (returnType != null) {
      if (!returnType!.matchesSequence(XPathSequence.empty)) return false;
      for (final entry in item.entries.entries) {
        if (argType.matchesItem(entry.key)) {
          if (!returnType!.matchesSequence(entry.value)) return false;
        }
      }
    }
    return true;
  }

  if (item is XPathArray) {
    if (parameterTypes!.length != 1) return false;
    final argType = parameterTypes!.single;
    if (!argType.isSubtypeOf(xsInteger) &&
        !argType.isSubtypeOf(
          const XPathSequenceType(
            itemType: xsInteger,
            cardinality: XPathCardinality.zeroOrOne,
          ),
        )) {
      return false;
    }
    if (returnType != null) {
      for (final member in item.members) {
        if (!returnType!.matchesSequence(member)) return false;
      }
    }
    return true;
  }

  if (item.parameterTypes != null) {
    if (item.parameterTypes!.length != parameterTypes!.length) return false;
    for (var i = 0; i < parameterTypes!.length; i++) {
      if (!parameterTypes![i].isSubtypeOf(item.parameterTypes![i])) {
        return false;
      }
    }
  }
  if (item.returnType != null && returnType != null) {
    if (!item.returnType!.isSubtypeOf(returnType!)) {
      return false;
    }
  }
  return true;
}