in src/language/semantics/xsltTokenDiagnostics.ts [1518:1593]
public static isValidFunctionName(
xmlnsPrefixes: string[],
xmlnsData: Map<string, XSLTnamespaces>,
token: BaseToken,
checkedGlobalFnNames: string[],
arity?: number
) {
let tokenValue
if (arity === undefined) {
let parts = token.value.split('#')
arity = Number.parseInt(parts[1])
tokenValue = parts[0]
} else {
tokenValue = token.value
}
let qFunctionName = tokenValue + '#' + arity
let fNameParts = qFunctionName.split(':')
let isValid = false
let fErrorType = ErrorType.XPathFunction
if (fNameParts.length === 1) {
if (tokenValue === 'concat' || tokenValue === 'codepoints-to-string') {
isValid = arity > 0
} else {
isValid = FunctionData.xpath.indexOf(fNameParts[0]) > -1
}
} else {
let xsltType = xmlnsData.get(fNameParts[0])
if (xmlnsPrefixes.indexOf(fNameParts[0]) < 0) {
// prefix is not declared
fErrorType = ErrorType.XPathFunctionNamespace
isValid = false
} else if (
xsltType === XSLTnamespaces.NotDefined ||
xsltType === undefined
) {
isValid = checkedGlobalFnNames.indexOf(qFunctionName) > -1
} else {
switch (xsltType) {
case XSLTnamespaces.XPath:
isValid = FunctionData.xpath.indexOf(fNameParts[1]) > -1
break
case XSLTnamespaces.Array:
isValid = FunctionData.array.indexOf(fNameParts[1]) > -1
break
case XSLTnamespaces.Map:
isValid = FunctionData.map.indexOf(fNameParts[1]) > -1
break
case XSLTnamespaces.Math:
isValid = FunctionData.math.indexOf(fNameParts[1]) > -1
break
case XSLTnamespaces.XMLSchema:
isValid = FunctionData.schema.indexOf(fNameParts[1]) > -1
break
case XSLTnamespaces.IXSL:
isValid = FunctionData.ixsl.indexOf(fNameParts[1]) > -1
break
case XSLTnamespaces.Saxon:
case XSLTnamespaces.ExpathArchive:
case XSLTnamespaces.ExpathBinary:
case XSLTnamespaces.ExpathFile:
case XSLTnamespaces.Exslt:
case XSLTnamespaces.ExsltMath:
case XSLTnamespaces.ExsltRegex:
case XSLTnamespaces.ExsltSets:
case XSLTnamespaces.ExsltStrings:
isValid = true
break
case XSLTnamespaces.dfdl:
isValid = true
break
}
}
}
fErrorType = isValid ? ErrorType.None : fErrorType
return { isValid, qFunctionName, fErrorType }
}