public static isValidFunctionName()

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