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