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