export function getElementCompletionProvider()

in src/language/providers/elementCompletion.ts [37:113]


export function getElementCompletionProvider(dfdlFormatString: string) {
  return vscode.languages.registerCompletionItemProvider(
    'dfdl',
    {
      provideCompletionItems(
        document: vscode.TextDocument,
        position: vscode.Position,
        token: vscode.CancellationToken,
        context: vscode.CompletionContext
      ) {
        const triggerChar = context.triggerCharacter
        if (
          !checkBraceOpen(document, position) &&
          !cursorWithinBraces(document, position) &&
          !cursorWithinQuotes(document, position) &&
          !cursorAfterEquals(document, position) &&
          !isInXPath(document, position) &&
          !isTagEndTrigger(triggerChar)
        ) {
          let nsPrefix = getNsPrefix(document, position)
          let [triggerLine, triggerPos] = [position.line, position.character]
          let triggerText = document.lineAt(triggerLine).text
          let itemsOnLine = getItemsOnLineCount(triggerText)
          let nearestOpenItem = nearestOpen(document, position)
          if (nearestOpenItem.itemNS != 'none') {
            nsPrefix = nearestOpenItem.itemNS
          }
          let lastCloseSymbol = triggerText.lastIndexOf('>')
          let firstOpenSymbol = triggerText.indexOf('<')

          let missingCloseTag = checkMissingCloseTag(
            document,
            position,
            nsPrefix
          )

          if (
            !nearestOpenItem.itemName.includes('none') &&
            missingCloseTag == 'none'
          ) {
            return undefined
          }
          if (
            missingCloseTag === 'none' &&
            itemsOnLine > 1 &&
            (triggerPos === lastCloseSymbol + 1 ||
              triggerPos === firstOpenSymbol)
          ) {
            return undefined
          }

          let definedVariables = getDefinedVariables(document)

          let [tagNearestTrigger, tagPosition] = getTagNearestTrigger(
            document,
            position,
            triggerText,
            triggerLine,
            triggerPos,
            itemsOnLine,
            nsPrefix
          )

          return nearestOpenTagChildElements(
            document,
            position,
            tagNearestTrigger,
            tagPosition,
            definedVariables,
            nsPrefix
          )
        }
      },
    },
    '\n'
  )
}