fontoxpath
Version:
A minimalistic XPath 3.1 engine in JavaScript
50 lines (41 loc) • 1.5 kB
JavaScript
import Selector from './Selector';
import Specificity from './Specificity';
import Sequence from './dataTypes/Sequence';
import functionRegistry from './functions/functionRegistry';
import FunctionValue from './dataTypes/FunctionValue';
/**
* @extends {Selector}
*/
class NamedFunctionRef extends Selector {
/**
* @param {{prefix:string, namespaceURI:string, name}} functionReference
* @param {number} arity
*/
constructor (functionReference, arity) {
super(new Specificity({
[Specificity.EXTERNAL_KIND]: 1
}), {
canBeStaticallyEvaluated: true
});
if (functionReference.namespaceURI) {
throw new Error('Not implemented: function references with a namespace URI.');
}
const functionName = functionReference.prefix ? `${functionReference.prefix}:${functionReference.name}` : functionReference.name;
this._arity = arity;
var functionProperties = functionRegistry.getFunctionByArity(functionName, this._arity);
if (!functionProperties) {
throw new Error(`XPST0017: Function ${functionName} with arity of ${arity} not registered. ${functionRegistry.getAlternativesAsStringFor(functionName)}`);
}
this._functionItem = new FunctionValue({
value: functionProperties.callFunction,
name: functionName,
argumentTypes: functionProperties.argumentTypes,
arity: arity,
returnType: functionProperties.returnType
});
}
evaluate (_dynamicContext) {
return Sequence.singleton(this._functionItem);
}
}
export default NamedFunctionRef;