in src/language/providers/utils.ts [153:232]
export function nearestTag(
document: vscode.TextDocument,
position: vscode.Position,
nsPrefix: string,
startLine: number,
startPos: number
): [string, number, number] {
const triggerLine = position.line
let lineNum = startLine
const triggerText = document.lineAt(triggerLine).text
const itemsOnLine = getItemsOnLineCount(document.lineAt(lineNum).text)
let tagPos = triggerText.indexOf('<')
let endPos = triggerText.lastIndexOf('>')
if (
itemsOnLine > 1 &&
startPos !== tagPos &&
startPos < endPos &&
endPos != startPos
) {
let textBeforeTrigger = triggerText.substring(0, startPos)
let prevTagPos = 0
while (prevTagPos > -1) {
prevTagPos = textBeforeTrigger.lastIndexOf('<')
let tag = textBeforeTrigger.substring(prevTagPos)
if (
!textBeforeTrigger.includes('</') &&
!textBeforeTrigger.includes('/>')
) {
for (let i = 0; i < items.length; ++i) {
if (tag.includes('<' + nsPrefix + items[i])) {
return [items[i], startLine, prevTagPos]
}
}
}
textBeforeTrigger = textBeforeTrigger.substring(0, prevTagPos)
}
} else {
if (
startLine === triggerLine &&
(tagPos === startPos || triggerText.trim() === '')
) {
--lineNum
}
while (lineNum > -1 && lineNum < document.lineCount) {
let currentText = document.lineAt(lineNum).text
if (getItemsOnLineCount(currentText) < 2) {
if (!currentText.includes('/>')) {
for (let i = 0; i < items.length; ++i) {
nsPrefix = getNsPrefix(document, position)
if (
!currentText.includes('</') &&
(currentText.includes('<' + nsPrefix + items[i]) ||
(lineNum === 0 && currentText.includes(items[i])))
) {
tagPos = currentText.lastIndexOf('<')
return [items[i], lineNum, tagPos]
}
if (
currentText.includes('<' + nsPrefix + items[i]) &&
currentText.includes('</' + nsPrefix + items[i]) &&
position.character > currentText.indexOf('>') &&
position.character <= currentText.indexOf('</')
) {
tagPos = currentText.lastIndexOf('<')
return [items[i], lineNum, tagPos]
}
}
}
}
--lineNum
}
}
return ['none', 0, 0]
}