function getFunctionCompletions()

in src/completion/completeJSONata.ts [151:206]


function getFunctionCompletions({
  jsonataNodeLength,
  jsonataFunctions,
  properties,
}: {
  jsonataNodeLength: number
  jsonataFunctions: JsonataFunctionsMap
  properties: FunctionCompletionProperties
}): CompletionList | undefined {
  const { jsonataNode, node, asl, nodePosition, endPosition } = properties

  const range = Range.create(Position.create(nodePosition.line, endPosition.character - jsonataNodeLength), endPosition)

  const functions = jsonataNode.node.type === 'variable' ? Array.from(jsonataFunctions.keys()) : []

  const functionCompletionItems = functions.map((name) => {
    const item = CompletionItem.create(name)
    item.commitCharacters = ['(']

    item.kind = CompletionItemKind.Function
    const completeVal = name
    const functionProps = jsonataFunctions.get(name)

    item.textEdit = TextEdit.replace(range, completeVal)
    item.filterText = completeVal
    item.label = name

    item.detail = `${name}(${getFunctionArguments(functionProps?.params || [])})`

    item.documentation = functionProps?.description && {
      kind: 'markdown',
      value: functionProps?.description,
    }

    return item
  })

  const variableCompletionItems = getVariablesCompletionList({
    node,
    value: jsonataNode.node.value,
    asl,
    replaceRange: range,
  }).map(
    (item) =>
      ({
        ...item,
        // Place variables at the top of the list
        sortText: `!${item.label}`,
      }) as CompletionItem,
  )

  return {
    isIncomplete: false,
    items: variableCompletionItems.concat(functionCompletionItems),
  }
}