in src/language/providers/utils.ts [193:270]
export function checkTagOpen(
document: vscode.TextDocument,
position: vscode.Position,
nsPrefix: string,
tag: string
) {
nsPrefix = getItemPrefix(tag, nsPrefix)
let triggerLine = position.line
let triggerText = document.lineAt(triggerLine).text
let itemsOnLine = getItemsOnLineCount(triggerText)
let isMultiLineTag = false
let origTriggerText = triggerText
let origTriggerLine = 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)
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
}
}
while (origTriggerText.trim() === '') {
origTriggerText = document.lineAt(--origTriggerLine).text
}
tagPos = triggerText.indexOf('<' + nsPrefix + tag)
if (itemsOnLine < 2 && tagPos > -1) {
if (triggerText !== origTriggerText) {
tagEndPos = origTriggerText.indexOf('>')
}
if (
(triggerPos > tagPos &&
triggerPos <= tagEndPos &&
triggerLine === position.line) ||
(origTriggerLine == position.line &&
triggerPos <= tagEndPos &&
triggerPos > tagPos) ||
position.line < origTriggerLine
) {
return true
}
}
if (!isMultiLineTag || tagPos === -1) {
return false
}
//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
)
}