in src/language/providers/utils.ts [234:325]
export function checkTagOpen(
document: vscode.TextDocument,
position: vscode.Position,
nsPrefix: string,
tag: string
): [boolean, boolean] {
let triggerLine = position.line
let triggerText = document.lineAt(triggerLine).text
let itemsOnLine = getItemsOnLineCount(triggerText)
let isMultiLineTag = false
let isDfdlPrefix = false
let origTriggerLine = triggerLine
let compareText = triggerText
let compareLine = triggerLine
const triggerPos = position.character
const textBeforeTrigger = triggerText.substring(0, triggerPos)
while (itemsOnLine < 2 && !triggerText.trim().startsWith('<')) {
triggerText = document.lineAt(--triggerLine).text
}
if (!(triggerText.endsWith('>') && triggerText.includes('<'))) {
isMultiLineTag = true
}
let tagPos = textBeforeTrigger.lastIndexOf('<' + nsPrefix + tag)
if (tagPos < 0) {
tagPos = textBeforeTrigger.lastIndexOf('<dfdl:' + tag)
if (tagPos > 0) {
isDfdlPrefix = true
nsPrefix = 'dfdl:'
}
}
const nextTagPos = triggerText.indexOf('<', tagPos + 1)
let tagEndPos = triggerText.indexOf('>', tagPos)
if (tagPos > -1 && itemsOnLine > 1) {
if (
triggerPos > tagPos &&
((triggerPos <= tagEndPos &&
(nextTagPos > tagEndPos || nextTagPos === -1)) ||
tagEndPos === -1)
) {
return [true, isDfdlPrefix]
}
}
while (compareText.trim() === '') {
compareText = document.lineAt(--compareLine).text
}
tagPos = triggerText.indexOf('<' + nsPrefix + tag)
if (tagPos < 0) {
tagPos = textBeforeTrigger.lastIndexOf('<dfdl:' + tag)
if (tagPos > 0) {
isDfdlPrefix = true
nsPrefix = 'dfdl:'
}
}
if (itemsOnLine < 2 && tagPos > -1) {
if (triggerText !== compareText) {
tagEndPos = compareText.indexOf('>')
}
if (
(triggerPos > tagPos &&
triggerPos <= tagEndPos &&
triggerLine === position.line) ||
(compareLine == position.line &&
triggerPos <= tagEndPos &&
triggerPos > tagPos) ||
position.line < origTriggerLine
) {
return [true, isDfdlPrefix]
}
}
if (!isMultiLineTag || tagPos === -1) {
return [false, isDfdlPrefix]
}
//if this tag is part of a multi line set of annotations return true
//else this tag is not open return false
return checkMultiLineTag(
document,
position,
itemsOnLine,
nsPrefix,
tagPos,
triggerLine,
tag
)
}