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